using HslCommunication.Profinet.Siemens; using HslCommunication; using SlnMesnac.Common; using System; using System.Collections.Generic; using System.Text; using Microsoft.Extensions.Logging; namespace SlnMesnac.Plc.Impl { public class SiemensPlc : IPlc { private ILogger _logger; private StringChange _stringChange; private const SiemensPLCS type = SiemensPLCS.S200Smart; private SiemensS7Net s7 = new SiemensS7Net(type); public SiemensPlc(ILogger logger, StringChange stringChange) { this._logger = logger; _stringChange = stringChange; } public bool IsConnected { get; set; } /// /// 建立连接 /// /// /// /// /// public bool Connect(string IP, int port) { PrintLogInfo("西门子S7系列PLC连接开始"); s7.IpAddress = IP; s7.Port = 102; try { OperateResult connect = s7.ConnectServer(); if (connect.IsSuccess) { this.IsConnected = true; PrintLogInfo("西门子S7系列PLC建立连接成功!!!"); return true; } else { this.IsConnected = false; PrintLogInfo($"西门子S7系列PLC建立连接失败:{connect.Message}"); return false; } } catch (Exception ex) { this.IsConnected = false; PrintLogInfo("西门子S7系列PLC建立连接异常", ex); return false; } } /// /// 断开连接 /// /// public bool DisConnect() { return s7.ConnectClose().IsSuccess; } /// /// 通过地址和长度读取PLC数据 /// /// /// /// /// public byte[] readValueByAddress(int len, string address) { PrintLogInfo($"开始通过地址:{address},读取长度:{len};的PLC数据"); try { OperateResult read = s7.Read(address, (ushort)(len)); if (read.IsSuccess) { byte[] result = _stringChange.ConvertFloatToINt(read.Content); PrintLogInfo(String.Format("通过地址和长度读取PLC数据成功:{0}", _stringChange.bytesToHexStr(result, result.Length))); return result; } else { PrintLogInfo($"通过地址和长度读取PLC数据失败:{read.Message}"); this.IsConnected = false; return new byte[0]; } } catch (Exception ex) { PrintLogInfo("通过地址和长度读取PLC数据异常", ex); this.IsConnected = false; return new byte[0]; } } /// /// 通过PLC地址写入int类型数据 /// /// /// /// /// public bool writeValueByAddress(string address,int value) { PrintLogInfo(String.Format("开始通过PLC地址{0}写入int类型数据{1}",address,value)); try { OperateResult operateResult = s7.Write(address, Convert.ToInt32(value)); if (operateResult.IsSuccess) { PrintLogInfo(String.Format("通过PLC地址{0}写入int类型数据{1}成功", address, value)); return true; } PrintLogInfo(String.Format("通过PLC地址{0}写入int类型数据{1}失败!!!", address, value)); this.IsConnected = false; return false; } catch (Exception ex) { PrintLogInfo("通过PLC地址写入int类型数据异常", ex); this.IsConnected = false; return false; } } /// /// 通过PLC地址读取int16类型数据 /// /// /// public int readInt16ByAddress(string address) { PrintLogInfo(String.Format("开始通过PLC地址{0}读取int16类型数据",address)); try { OperateResult read = s7.ReadInt16(address); if (read.IsSuccess) { PrintLogInfo(String.Format("通过PLC地址{0}读取int16类型数据成功:{1}", address, read.Content)); return read.Content; } PrintLogInfo(String.Format("通过PLC地址{0}读取int16类型数据失败!!!", address)); this.IsConnected = false; return 0; } catch (Exception ex) { PrintLogInfo("通过PLC地址读取int16类型数据异常", ex); this.IsConnected = false; return 0; } } /// /// 通过PLC地址写入Short类型数据 /// /// /// /// /// public bool writeShortByAddress(string address, int value) { PrintLogInfo(String.Format("开始通过PLC地址{0}写入Short类型数据{1}", address, value)); try { OperateResult write = s7.Write(address, short.Parse(Convert.ToString(value))); if (write.IsSuccess) { PrintLogInfo(String.Format("通过PLC地址{0}写入Short类型数据{1}成功", address, value)); return true; } PrintLogInfo(String.Format("通过PLC地址{0}写入Short类型数据{1}失败!!!", address, value)); this.IsConnected = false; return false; } catch (Exception ex) { PrintLogInfo(String.Format("通过PLC地址{0}写入Short类型数据异常", address), ex); this.IsConnected = false; return false; } } /// /// 通过PLC地址写入String类型数据 /// /// /// /// /// public bool writeStringByAddress(string address, string value) { PrintLogInfo(String.Format("通过PLC地址{0}写入String类型数据{1}",address,value)); try { OperateResult operateResult = s7.Write(address, value); if (operateResult.IsSuccess) { PrintLogInfo(String.Format("通过PLC地址{0}写入String类型数据{1}成功", address, value)); return true; } PrintLogInfo(String.Format("通过PLC地址{0}写入String类型数据{1}失败!!!", address, value)); //this.IsConnected = false; return false; } catch (Exception ex) { PrintLogInfo(String.Format("通过PLC地址{0}写入String类型数据异常", address), ex); //this.IsConnected = false; return false; } } /// /// 通过PLC地址读取string类型数据 /// /// /// /// public string readStringByAddress(string address, ushort length) { PrintLogInfo(String.Format("开始通过PLC地址{0}读取string类型数据", address)); try { OperateResult read = s7.ReadString(address, length); if (read.IsSuccess) { PrintLogInfo(String.Format("通过PLC地址{0}读取string类型数据成功:{1}", address, read.Content)); return read.Content; } PrintLogInfo(String.Format("通过PLC地址{0}读取string类型数据失败!!!", address)); this.IsConnected = false; return ""; } catch (Exception ex) { PrintLogInfo("通过PLC地址读取string类型数据异常", ex); return ""; } } /// /// 通过PLC地址读取Bool类型数据 /// /// /// /// public bool readBoolByAddress(string address) { PrintLogInfo(String.Format("开始通过PLC地址{0}读取bool类型数据", address)); try { OperateResult read = s7.ReadBool(address); if (read.IsSuccess) { PrintLogInfo(String.Format("通过PLC地址{0}读取bool类型数据成功:{1}", address, read.Content)); return read.Content; } PrintLogInfo(String.Format("通过PLC地址{0}读取bool类型数据失败!!!", address)); this.IsConnected = false; return false; } catch (Exception ex) { PrintLogInfo("通过PLC地址读取int32类型数据异常", ex); this.IsConnected = false; return false; } } /// /// 通过PLC地址写入Bool类型数据 /// /// /// /// public bool writeBoolByAddress(string address, bool value) { PrintLogInfo(String.Format("开始通过PLC地址{0}写入bool类型数据{1}", address, value)); try { OperateResult write = s7.Write(address, short.Parse(_stringChange.ParseToInt(value ? "1" : "0").ToString())); if (write.IsSuccess) { PrintLogInfo(String.Format("通过PLC地址{0}写入bool类型数据{1}成功", address, value)); return true; } PrintLogInfo(String.Format("通过PLC地址{0}写入bool类型数据{1}失败!!!", address, value)); this.IsConnected = false; return false; } catch (Exception ex) { PrintLogInfo(String.Format("通过PLC地址{0}写入bool类型数据异常", address), ex); this.IsConnected = false; return false; } } /// /// 写入Double类型 /// /// /// /// public bool writeDoubleByAddress(string address, int value) { PrintLogInfo(String.Format("开始通过PLC地址{0}写入Double类型数据{1}", address, value)); try { OperateResult write = s7.Write(address, Convert.ToDouble(value)); if (write.IsSuccess) { PrintLogInfo(String.Format("通过PLC地址{0}写入Double类型数据{1}成功", address, value)); return true; } PrintLogInfo(String.Format("通过PLC地址{0}写入Double类型数据{1}失败!!!", address, value)); return false; } catch (Exception ex) { PrintLogInfo(String.Format("通过PLC地址{0}写入Double类型数据异常", address), ex); return false; } } private void PrintLogInfo(string message, Exception ex = null) { if (ex != null) { _logger.LogError($"{message}:{ex.Message}"); } else { _logger.LogInformation(message); } } } }