using HslCommunication; using HslCommunication.Profinet.Delta; using Microsoft.Extensions.DependencyInjection; using Serilog; using Sln.Iot.Serilog; namespace Sln.Iot.PLC { public class PLCConnect { private SerilogHelper? LogHelper; public static DeltaSerialOverTcp DeltaInstance1; /// /// 锁对象1 /// private static readonly object locker1 = new object(); public PLCConnect(SerilogHelper serilogHelper) { LogHelper = serilogHelper; DeltaInstance1 = CreateDeltaConnect("127.0.0.1", 502, 1, serilogHelper); } /// /// 创建台达PLC连接 /// /// /// /// /// /// public static DeltaSerialOverTcp CreateDeltaConnect(string ip, int port, byte stationNo, SerilogHelper log) { DeltaSerialOverTcp plc = new DeltaSerialOverTcp(ip, port, stationNo); try { var res = plc.ConnectServer(); } catch (Exception ex) { log.Error($"连接PLC[{ip}]失败", ex); } return plc; } /// /// PLC2写入数据 /// /// 地址 /// 值 /// 数据类型 /// public static OperateResult PlcWrite(string address, object value, DataTypeEnum type) { var result = new OperateResult() { IsSuccess = false }; lock (locker1) { switch (type) { case DataTypeEnum.Bool: result = DeltaInstance1.Write(address, Convert.ToBoolean(value)); break; case DataTypeEnum.Byte: result = DeltaInstance1.Write(address, Convert.ToByte(value)); break; case DataTypeEnum.Int16: result = DeltaInstance1.Write(address, Convert.ToInt16(value)); break; case DataTypeEnum.UInt16: result = DeltaInstance1.Write(address, Convert.ToUInt16(value)); break; case DataTypeEnum.Int32: result = DeltaInstance1.Write(address, Convert.ToInt32(value)); break; case DataTypeEnum.UInt32: result = DeltaInstance1.Write(address, Convert.ToUInt32(value)); break; case DataTypeEnum.Int64: result = DeltaInstance1.Write(address, Convert.ToInt64(value)); break; case DataTypeEnum.UInt64: result = DeltaInstance1.Write(address, Convert.ToUInt64(value)); break; case DataTypeEnum.Float: result = DeltaInstance1.Write(address, Convert.ToSingle(value)); break; case DataTypeEnum.Double: result = DeltaInstance1.Write(address, Convert.ToDouble(value)); break; case DataTypeEnum.String: result = DeltaInstance1.Write(address, Convert.ToString(value)); break; default: throw new ArgumentException($"Unsupported data type: {type}"); } } return result; } /// /// 写入byte数组 /// /// /// /// public static OperateResult PlcWriteBytes(string address, byte[] data) { lock (locker1) { var res = DeltaInstance1.Write(address, data); return res; } } /// /// 读取int32 /// /// public OperateResult ReadInt32(string address) { lock (locker1) { var res = DeltaInstance1.ReadInt32(address); return res; } } /// /// 读取int16 /// /// public OperateResult ReadInt16(string address) { lock (locker1) { var res = DeltaInstance1.ReadInt16(address); return res; } } /// /// 读取float /// /// /// public OperateResult ReadFloat(string address) { lock (locker1) { var res = DeltaInstance1.ReadFloat(address); return res; } } /// /// 读取Bool /// /// /// public OperateResult ReadBool(string address) { lock (locker1) { var res = DeltaInstance1.ReadBool(address); return res; } } /// /// 读取字节数组 /// /// /// /// public static OperateResult ReadByte2(string address, ushort length) { lock (locker1) { var res = DeltaInstance1.Read(address, length); return res; } } } }