using S7.Net; using System.Net; using System.Text; using BPASmartClient.S7Net; namespace BPASmartClient.S7Net { public class SiemensHelper { 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) { myPlc = new Plc(cpuType, ip, port, rack, solt); myPlc.Open(); } /// /// 断开和PLC的连接 /// public void Disconnect() { myPlc?.Close(); } public TResult Read(string address) { if (!IsConnected) return default; var value = myPlc?.Read(address); if (typeof(TResult).Name == "Single") { var obj = ((uint)value).ConvertToFloat(); return (TResult)Convert.ChangeType(obj, typeof(TResult)); } else { return (TResult)Convert.ChangeType(value, typeof(TResult)); } } 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 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 WriteString(DataType dataType, int db, int startByteAdr, string value) { if (!IsConnected) return; var res = value.ToArrays(); if (res != null) { List bytes = new List(); bytes.Add((byte)res.Length); bytes.Add((byte)res.Length); bytes.AddRange(res); myPlc?.WriteBytes(dataType, db, startByteAdr, bytes.ToArray()); } } public string Write(string address, TValue value, int Retries = 1) { if (IsConnected) { int count = 0; if (Retries == 1 || Retries == 0) { myPlc?.Write(address, value); return $"成功,地址:{address},值:{value}"; } else { while (count < Retries) { count++; myPlc?.Write(address, value); var res = myPlc?.Read(address); if (res != null && res.ToString() == value.ToString()) { break; } } return $"成功,发送了{count}次,地址:{address},值:{value}"; } } else { return $"失败,地址:{address},值:{value},断开连接"; } } /// /// /// /// DB号 /// 字符串 /// 字节偏移地址 public void WriteString(int db, string txt, int startAddress = 0) { var temp = Encoding.ASCII.GetBytes(txt); var bytes = S7.Net.Types.S7String.ToByteArray(txt, temp.Length); myPlc.WriteBytes(DataType.DataBlock, db, startAddress, bytes); } public void WriteInt16(int db, short txt, int startAddress = 0) { var bytes = BitConverter.GetBytes(txt); myPlc.WriteBytes(DataType.DataBlock, db, startAddress, bytes); } public TResult ReadClass(int db, int startByteAdr = 0) where TResult : class, new() { TResult sourceClass = new TResult(); int num = (int)EntityClassResolution.GetClassSize(sourceClass); if (num <= 0) return sourceClass; if (IsConnected) { byte[] array = myPlc.ReadBytes(DataType.DataBlock, db, startByteAdr, num); EntityClassResolution.FromBytes(sourceClass, array); } return sourceClass; } public void WriteClass(TWriteModel sourceClass, int db, int startAddress = 0) where TWriteModel : class, new() { if (IsConnected) { byte[] array = new byte[(int)EntityClassResolution.GetClassSize(sourceClass)]; EntityClassResolution.ToBytes(sourceClass, array); myPlc.WriteBytes(DataType.DataBlock, db, startAddress, array); } } //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; //} //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 void WriteClass(object sourceClass, int db, int startAddress = 0) //{ // myPlc?.WriteClass(sourceClass, db, startAddress); //} } }