using System; using S7.Net; using iWareCommon.Utils; using HslCommunication.Profinet.Siemens; using HslCommunication; using iWareCommon; using iWareModel; namespace iWareSda { /// /// 西么子PLC /// public class Siemens_HslCommunicationService : PLCService { private SiemensS7Net siemensTcpNet = null; private readonly SiemensPLCS _cpu; private readonly string _ip; private readonly int _port; public Siemens_HslCommunicationService(HslCommunicationParam hslcpParam) { _cpu = hslcpParam.cpu; _ip = hslcpParam.ip; _port = hslcpParam.port; _LogType = LogType.HslCommunicationService; } /// /// 打开连接 /// /// public override MessageModel OpenService() { MessageModel fre = new MessageModel(); try { //创建连接对象 siemensTcpNet = new SiemensS7Net(_cpu, _ip); siemensTcpNet.IpAddress = _ip; siemensTcpNet.Port = Convert.ToInt16(_port); //siemensTcpNet.Rack = Convert.ToInt16(tb_Rack.Text); //siemensTcpNet //不记录日志!!!!否则文件太大导致问题! //siemensTcpNet.LogNet = new HslCommunication.LogNet.LogNetSingle("Siemens_HslCommunicationService_logs.txt"); OperateResult operateResult = siemensTcpNet.ConnectServer(); if (operateResult.IsSuccess) { base.IsConnected = true; fre.result = true; return fre; } base.IsConnected = false; fre.result = false; fre.resMsg = "打开失败," + operateResult.Message; return fre; } catch (Exception ex) { base.IsConnected = false; Log4NetHelper.WriteErrorLog(_LogType, "初始化西门子PLC出现异常", ex); throw ex; } } /// /// 写入 /// /// 地址 /// 值 /// public override MessageModel WriteValuePoint(string dbNumber, string offset, object value, Object proObj) {//此方法不再使用西门子PLC if (dbNumber.IndexOf(WareSdaStruct.PLCDBADDRESS_SEPARATE.ToString()) > -1) { throw new Exception("参数不正确,不应该带" + WareSdaStruct.PLCDBADDRESS_SEPARATE.ToString()); } MessageModel fre = new MessageModel(); OperateResult operateResult = null; Type proObjType = proObj.GetType(); var address = GetAddress(dbNumber, offset, value.GetType()); try { if (proObjType == typeof(bool)) {//布尔类型 bool myData = Convert.ToBoolean(value); operateResult = siemensTcpNet.Write(address, myData); } //浮点 else if (proObjType == typeof(double) || proObjType == typeof(float)) { double MyData = Convert.ToDouble(value); operateResult = siemensTcpNet.Write(address, MyData); } //整数 else if (proObjType == typeof(Int16) || proObjType == typeof(short)) { short MyData = Convert.ToInt16(value); operateResult = siemensTcpNet.Write(address, MyData.ConvertToUshort()); } //双整数 else if (proObjType == typeof(Int32)) { int myData = Convert.ToInt32(value); operateResult = siemensTcpNet.Write(address, myData); } //Char else if (proObjType == typeof(Char)) {//char要转换成int类型,写给PLC int myData = Convert.ToInt32(value); byte b = (byte)myData; operateResult = siemensTcpNet.Write(address, b); } //String else if (proObjType == typeof(String)) { operateResult = siemensTcpNet.Write(address, value.ToString()); } else { operateResult = siemensTcpNet.Write(address, value.ToString()); } if (!operateResult.IsSuccess) { Log4NetHelper.WriteErrorLog(_LogType, String.Format("写入出现异常:" + operateResult.Message + ",地址:{0},值:{1}", address, value.ToString()), null); fre.result = false; fre.resMsg = "写入失败:" + operateResult.Message; } else { fre.result = true; Log4NetHelper.WriteInfoLog(_LogType, String.Format("写入成功,写入地址:{0},值:{1}", address, value.ToString())); } } catch (Exception ex) { Log4NetHelper.WriteErrorLog(_LogType, String.Format("写入出现异常:" + ex.Message + ",地址:{0},值:{1}", address, value.ToString()), ex); fre.result = false; fre.resMsg = "写入失败:" + ex.Message; } return fre; } //public override MessageModel WriteValuePoint(string fullAddress, object value, object proObj) //{ // if (string.IsNullOrEmpty(fullAddress)) // { // return new MessageModel() { result = false, resMsg = "地址为空" }; // } // var arr = fullAddress.Split(WareSdaStruct.PLCDBADDRESS_SEPARATE); // string dbNumber = arr[0]; // string offset = arr[1]; // return WriteValuePoint(dbNumber, offset, value, proObj); //} /// /// 写入方法(需要验证是否真正写入了) 【Editby shaocx,2025-07-16】 /// /// /// /// /// public override MessageModel WriteValuePoint(string fullAddress, object value, object proObj) { return WriteValuePointForReValidateWriteSucess(fullAddress, value, proObj); } /// /// 写入(需要验证是否真正写入了) /// /// /// /// /// public override MessageModel WriteValuePointForReValidateWriteSucess(string fullAddress, object value, object proObj) { if (string.IsNullOrEmpty(fullAddress)) return new MessageModel() { result = false, resMsg = "地址是空的" }; var arr = fullAddress.Split(WareSdaStruct.PLCDBADDRESS_SEPARATE); string dbNumber = arr[0]; string offset = arr[1]; var ret = WriteValuePoint(dbNumber, offset, value, proObj); if (ret.result == false) return ret; //需要重新读取下 var readRet = ReadValuePoint(dbNumber, offset, proObj.GetType()); if (readRet?.ToString() != value?.ToString()) { return new MessageModel() { result = false, resMsg = $"写入的值{value}跟读取的值{readRet}不符,dbNumber:{dbNumber},offset:{offset}" }; } return ret; } /// /// 读取 /// /// DB块名 /// 偏移量 /// /// public override object ReadValuePoint(string dbNumber, string offset, Type type = default(Type)) { if (dbNumber.IndexOf(WareSdaStruct.PLCDBADDRESS_SEPARATE.ToString()) > -1) { throw new Exception("参数不正确,不应该带" + WareSdaStruct.PLCDBADDRESS_SEPARATE.ToString()); } var address = GetAddress(dbNumber, offset, type); try { if (type == typeof(bool)) {//布尔要转换成1和0写入 bool MyPlcData = siemensTcpNet.ReadBool(address).Content; return MyPlcData; } //浮点 else if (type == typeof(double) || type == typeof(float)) { var MyPlcData = siemensTcpNet.ReadFloat(address).Content; return MyPlcData; } //整数 else if (type == typeof(short)) { int MyPlcData = siemensTcpNet.ReadInt16(address).Content; return MyPlcData; } //双整数 else if (type == typeof(Int32)) { long MyPlcData = siemensTcpNet.ReadInt32(address).Content; return MyPlcData; } //Char else if (type == typeof(Char)) {//char要转换成int类型,写给PLC char MyPlcData = (char)(siemensTcpNet.ReadByte(address).Content); return MyPlcData.ToString(); } //String else if (type == typeof(String)) { var MyPlcData = siemensTcpNet.ReadString(address).Content; return MyPlcData == null ? "" : MyPlcData.ToString(); } else { var MyPlcData = siemensTcpNet.ReadString(address).Content; return MyPlcData == null ? "" : MyPlcData.ToString(); } } catch (Exception ex) { Log4NetHelper.WriteErrorLog(_LogType, String.Format("读取出现异常:" + ex.Message + ",地址:{0}", address), ex); throw; } } public override object ReadValuePoint(string fullAddress, Type type = default(Type)) { var arr = fullAddress.Split(WareSdaStruct.PLCDBADDRESS_SEPARATE); string dbNumber = arr[0]; string offset = arr[1]; return ReadValuePoint(dbNumber, offset, type); } public override string GetAddress(string dbNumber, string offset, Type type = default(Type)) { return "DB" + dbNumber + "." + offset; } public override void Close() { if (siemensTcpNet != null) siemensTcpNet.ConnectClose(); } } }