using HslCommunication.Profinet.Siemens;
using HslCommunication;
using Serilog;
namespace YZWater.Core.Services.PlcDrivers;
///
/// 西门子 S7 协议驱动
///
public class SiemensS7Driver : IPlcDriver
{
private readonly SiemensS7Net _plc;
private bool _disposed;
private bool _isConnected;
public string Name => "Siemens S7";
public bool IsConnected => _isConnected && !_disposed;
public SiemensS7Driver(SiemensPLCS plcSeries = SiemensPLCS.S200Smart)
{
_plc = new SiemensS7Net(plcSeries);
}
///
/// 设置连接参数
///
public void SetConnection(string ipAddress, int port = 102)
{
_plc.IpAddress = ipAddress;
_plc.Port = port;
}
public async Task ConnectAsync()
{
var result = await _plc.ConnectServerAsync();
_isConnected = result.IsSuccess;
return result;
}
public void Disconnect()
{
_plc.ConnectClose();
_isConnected = false;
}
public async Task> ReadBytesAsync(string address, ushort length)
{
return await _plc.ReadAsync(address, length);
}
public async Task> ReadFloatAsync(string address)
{
return await _plc.ReadFloatAsync(address);
}
public async Task> ReadBoolAsync(string address)
{
return await _plc.ReadBoolAsync(address);
}
public async Task WriteAsync(string address, byte[] value)
{
return await _plc.WriteAsync(address, value);
}
public async Task WriteFloatAsync(string address, float value)
{
return await _plc.WriteAsync(address, value);
}
public async Task WriteBoolAsync(string address, bool value)
{
return await _plc.WriteAsync(address, value);
}
public void Dispose()
{
if (_disposed) return;
_disposed = true;
Disconnect();
_plc.Dispose();
}
}