using HslCommunication; using HslCommunication.Profinet.Delta; using Sln.Iot.Serilog; using System; using System.Drawing; namespace Sln.Iot.PLC { public class PLCConnect { private static readonly Lazy lazy = new Lazy(() => new PLCConnect()); public static PLCConnect Instance { get { return lazy.Value; } } private readonly SerilogHelper _log = SerilogHelper.Instance; /// /// PLC1 192.168.1.20 烤箱 /// public DeltaTcpNet DeltaInstance0; /// /// PLC1 192.168.1.21 真空箱1 /// public DeltaTcpNet DeltaInstance1; /// /// PLC2 192.168.1.22 真空箱2 /// public DeltaTcpNet DeltaInstance2; /// /// PLC3 192.168.1.23 提升机1 /// public DeltaTcpNet DeltaInstance3; /// /// PLC4 192.168.1.24 提升机2 /// public DeltaTcpNet DeltaInstance4; /// /// 锁对象1 /// private static readonly object locker1 = new object(); public async void InitConnect() { List> tasks = new List> { CreateDeltaConnect("192.168.1.20", 502, 1), CreateDeltaConnect("192.168.1.21", 502, 1), CreateDeltaConnect("192.168.1.22", 502, 1), CreateDeltaConnect("192.168.1.23", 502, 1), CreateDeltaConnect("192.168.1.24", 502, 1) }; await Task.WhenAll(tasks); DeltaInstance0 = tasks[0].GetAwaiter().GetResult(); DeltaInstance1 = tasks[1].GetAwaiter().GetResult(); DeltaInstance2 = tasks[2].GetAwaiter().GetResult(); DeltaInstance3 = tasks[3].GetAwaiter().GetResult(); DeltaInstance4 = tasks[4].GetAwaiter().GetResult(); _log.Info("PLC连接全部成功"); } /// /// 创建台达PLC连接 /// /// /// /// /// public async Task CreateDeltaConnect(string ip, int port, byte stationNo) { DeltaTcpNet plc = new DeltaTcpNet(ip, port, stationNo); try { plc.Series = DeltaSeries.AS; OperateResult res = new OperateResult(); res.IsSuccess = true; int count = 0; do { if (res.IsSuccess == false) { count++; _log.Error($"PLC[{ip}]连接失败,正在进行第[{count}]次重连..."); } res = await plc.ConnectServerAsync(); } while (!res.IsSuccess); } catch (Exception ex) { _log.Error($"连接PLC[{ip}]失败", ex); } return plc; } /// /// PLC写入数据 /// /// 地址 /// 值 /// 数据类型 /// public OperateResult PlcWrite(DeltaTcpNet connect, string address, object value, DataTypeEnum type) { if (connect == null) return new OperateResult() { IsSuccess = false }; var result = new OperateResult() { IsSuccess = false }; lock (locker1) { switch (type) { case DataTypeEnum.Bool: result = connect.Write(address, Convert.ToBoolean(value)); break; case DataTypeEnum.Byte: result = connect.Write(address, Convert.ToByte(value)); break; case DataTypeEnum.Int16: result = connect.Write(address, Convert.ToInt16(value)); break; case DataTypeEnum.UInt16: result = connect.Write(address, Convert.ToUInt16(value)); break; case DataTypeEnum.Int32: result = connect.Write(address, Convert.ToInt32(value)); break; case DataTypeEnum.UInt32: result = connect.Write(address, Convert.ToUInt32(value)); break; case DataTypeEnum.Int64: result = connect.Write(address, Convert.ToInt64(value)); break; case DataTypeEnum.UInt64: result = connect.Write(address, Convert.ToUInt64(value)); break; case DataTypeEnum.Float: result = connect.Write(address, Convert.ToSingle(value)); break; case DataTypeEnum.Double: result = connect.Write(address, Convert.ToDouble(value)); break; case DataTypeEnum.String: result = connect.Write(address, Convert.ToString(value)); break; default: throw new ArgumentException($"Unsupported data type: {type}"); } } return result; } /// /// 写入byte数组 /// /// /// /// public OperateResult PlcWriteBytes(DeltaTcpNet connect, string address, byte[] data) { if (connect == null) return new OperateResult() { IsSuccess = false }; lock (locker1) { var res = connect.Write(address, data); return res; } } /// /// 读取int32 /// /// public OperateResult ReadInt32(DeltaTcpNet connect, string address) { if (connect == null) return new OperateResult() { IsSuccess = false }; lock (locker1) { var res = connect.ReadInt32(address); return res; } } /// /// 读取int16 /// /// public OperateResult ReadInt16(DeltaTcpNet connect, string address) { if (connect == null) return new OperateResult() { IsSuccess = false }; lock (locker1) { var res = connect.ReadInt16(address); return res; } } /// /// 读取float /// /// /// public OperateResult ReadFloat(DeltaTcpNet connect, string address) { if (connect == null) return new OperateResult() { IsSuccess = false }; lock (locker1) { var res = connect.ReadFloat(address); return res; } } /// /// 读取Bool /// /// /// public OperateResult ReadBool(DeltaTcpNet connect, string address) { if (connect == null) return new OperateResult() { IsSuccess = false }; lock (locker1) { var res = connect.ReadBool(address); return res; } } /// /// 读取字节数组 /// /// /// /// public OperateResult ReadBytes(DeltaTcpNet connect, string address, ushort length) { if (connect == null) return new OperateResult() { IsSuccess = false }; lock (locker1) { var res = connect.Read(address, length); return res; } } } }