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(); } }