using S7.Net; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HKControl { internal class Siemens : CommunicationBase { Plc myPlc; public bool IsConnected => myPlc is null ? false : myPlc.IsConnected; /// /// 打开连接 /// /// PLC CPU 类型 /// plc ip 地址 /// plc 端口号 /// PLC 机架号 /// PLC 插槽号 public void Connect(CpuType cpuType, string ip, int port = 102, short rack = 0, short solt = 0) { try { myPlc = new Plc(cpuType, ip, port, rack, solt); myPlc.Open(); if (myPlc.IsConnected) { ConnectOk?.Invoke(); Debug.WriteLine($"设备{ip}连接成功"); } } catch (Exception ex) { Debug.WriteLine($"设备连接出错:{ip}"); //Debug.WriteLine(ex.ToString()); } } /// /// 断开和PLC的连接 /// public void Disconnect() { myPlc?.Close(); } public TResult Read(string address) { if (!IsConnected) return default; return (TResult)myPlc?.Read(address); } public bool[] ReadBools(int address, int count) { if (!IsConnected) return default; var res = Read(DataType.Memory, 0, address, VarType.Bit, count); if (res != null && res is bool[] bools) return bools; return default; } public ushort[] ReadMW(int address, int count) { if (!IsConnected) return default; var res = Read(DataType.Memory, 0, address, VarType.Word, count); if (res != null && res is ushort[] ReturnValue) return ReturnValue; return default; } public float[] ReadMD(int address, int count) { if (!IsConnected) return default; var res = Read(DataType.Memory, 0, address, VarType.Real, count); if (res != null && res is float[] ReturnValue) return ReturnValue; return default; } private object Read(DataType dataType, int db, int address, VarType varType, int count) { if (!IsConnected) return default; return myPlc?.Read(dataType, db, address, varType, count); } public void Write(string address, TValue value) { myPlc?.Write(address, value); } public ReadT ReadStruct(int db, int startAddress = 0) { if (!IsConnected) return default; return (ReadT)myPlc.ReadStruct(typeof(ReadT), db, startAddress); } public void WriteStruct(object structValue, int db, int startAddress = 0) { myPlc?.WriteStruct(structValue, db, startAddress); } public int ReadClass(object sourceClass, int db, int startAddress = 0) { if (!IsConnected) return -1; return myPlc.ReadClass(sourceClass, db, startAddress); } public TResult ReadClass(int db, int startAddress = 0) where TResult : class { if (!IsConnected) return default; return myPlc.ReadClass(db, startAddress); } public void WriteClass(object sourceClass, int db, int startAddress = 0) { myPlc?.WriteClass(sourceClass, db, startAddress); } } }