using HslCommunication; using HslCommunication.Core.Address; using HslCommunication.Profinet.Siemens; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net.NetworkInformation; using System.Text; using System.Threading; using WIDESEA_Common; using WIDESEA_Common.CutomerModel; using WIDESEA_Core.Utilities; namespace WIDESEA_WCS.WCSClient { public class PLCClient { /// /// 西门子S7网络协议客户端 /// public SiemensS7Net SiemensS7NetClient { get; set; } /// /// PLC连接对应的地址 /// public List PLCDBItems { get; set; } /// /// 连接PLC设备名称 /// public string PLCName { get; set; } /// /// 连接PLC网络IP地址 /// public string PLCIPAddress { get; set; } /// /// 连接PLC描述说明 /// public string PLCDescription { get; set; } /// /// 连接PLC端口号(默认102) /// public int Port { get; set; } = 102; /// /// /// public byte Rack { get; set; } = 0; /// /// /// public byte Slot { get; set; } = 0; /// /// 连接PLC是否成功 /// public bool IsConnected { get; set; } = false; /// /// 连接信息 /// public string ConnectionMessage { get; set; } /// /// PLC信息设备类型 /// public string plcinfo_equiptype { get; set; } /// /// 检测PLC的心跳包 /// public bool heartFlag { get; set; } = true; /// /// 构造方法,实例化连接对象及PLC连接对应的地址 /// /// 西门子PLC系列 public PLCClient(SiemensPLCS SiemensPLCS = SiemensPLCS.S1500)//此处固定使用了S1500,预计更改为根据数据库配置灵活使用 { this.SiemensS7NetClient = new SiemensS7Net(SiemensPLCS); PLCDBItems = new List(); } /// /// PLC连接内置线程 /// Thread Thread { get; set; } /// /// 内置线程是否运行 /// bool isRun { get; set; } #region 内置线程 PING IP /// /// 内置线程 PING IP /// public void Start(Action action) { Thread = new Thread(() => { while (isRun) { Thread.Sleep(1000); OperateResult connectRead = SiemensS7NetClient.ReadInt32("DB500.436"); if (connectRead.IsSuccess) { if(!IsConnected) { Console.WriteLine($"【{SiemensS7NetClient.IpAddress}】PLC重连成功!"); } IsConnected = true; if(heartFlag) { if (WCSService.webServer.IsStarted) { Dictionary heartData = new Dictionary(); heartData.Add("IpAddress", SiemensS7NetClient.IpAddress); heartData.Add("status", "on"); heartData.Add("currentDate", DateTimeHelper.GetFormatDateString()); string heartStr = JsonConvert.SerializeObject(heartData); WCSService.webServer.PublishAllClientPayload(heartStr); } } else { if (WCSService.webServer.IsStarted) { Dictionary heartData = new Dictionary(); heartData.Add("IpAddress", SiemensS7NetClient.IpAddress); heartData.Add("status", "off"); heartData.Add("currentDate", DateTimeHelper.GetFormatDateString()); string heartStr = JsonConvert.SerializeObject(heartData); WCSService.webServer.PublishAllClientPayload(heartStr); } } heartFlag = !heartFlag; } else { IsConnected = false; // Console.WriteLine($"【{SiemensS7NetClient.IpAddress}】PLC断开连接,并且在此重连"); Connect(); if (WCSService.webServer.IsStarted) { Dictionary heartData = new Dictionary(); heartData.Add("IpAddress", SiemensS7NetClient.IpAddress); heartData.Add("status", "off"); heartData.Add("currentDate", DateTimeHelper.GetFormatDateString()); string heartStr = JsonConvert.SerializeObject(heartData); WCSService.webServer.PublishAllClientPayload(heartStr); } } } }); Thread.Start(); } #endregion #region 连接PLC,将短连接切换成长连接模式 /// /// 连接PLC /// public string Connect() { this.SiemensS7NetClient.IpAddress = PLCIPAddress; this.SiemensS7NetClient.Port = Port; this.SiemensS7NetClient.Rack = Rack; this.SiemensS7NetClient.Slot = Slot; this.SiemensS7NetClient.ConnectTimeOut = 2; this.SiemensS7NetClient?.ConnectClose(); OperateResult result = this.SiemensS7NetClient.ConnectServer(); isRun = true; if (!result.IsSuccess) { //WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{PLCName}连接失败{Environment.NewLine}错误信息:{result.Message}", PLCName); IsConnected = false; return $"连接失败,错误信息:{result.Message}"; } else { IsConnected = true; //WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{PLCName}连接成功!", PLCName); return $"连接成功"; } } #endregion #region 断开与PLC的连接,将短连接切换成长连接模式 /// /// 断开与PLC的连接 /// public void Disconnect() { this.SiemensS7NetClient?.ConnectClose(); isRun = false; this.SiemensS7NetClient?.Dispose(); WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:已断开与{PLCName}的连接!", PLCName); } #endregion #region 根据名称/描述读取PLC数据 /// /// 根据名称/描述读取PLC数据 /// /// 名称/描述(数据库中plcdetail_name列) /// public virtual object ReadValue(string itemName) { lock (this.SiemensS7NetClient) { object result = null; DBItemGroup item = this.PLCDBItems.Where(x => x.ItemName == itemName).FirstOrDefault(); if (item == null) return -1; string itemAddress = item.ItemAddress; string itemDatatype = item.ItemDataType; try { result = Read(itemAddress, itemDatatype); } catch (Exception ex) { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{item.ItemDataType},{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName); } try { //WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + result, PLCName); } catch { } return result; } } #endregion #region 根据PLCDBItem读取PLC数据 /// /// 根据PLCDBItem读取PLC数据 /// /// /// public virtual object ReadValue(DBItemGroup item) { lock (this.SiemensS7NetClient) { object result = null; if (item == null) return -1; string itemAddress = item.ItemAddress; string itemDatatype = item.ItemDataType; try { result = Read(itemAddress, itemDatatype); } catch (Exception ex) { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{item.ItemDataType},{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName); } try { //WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + result, PLCName); } catch { } return result; } } #endregion #region 根据设备编号读取PLC数据 /// /// 根据设备编号读取PLC数据 /// /// 设备编号 /// json字符串 public object ReadValues(string equipNum) { lock (this.SiemensS7NetClient) { object result = null; Dictionary keyValuePairs = new Dictionary(); List items = this.PLCDBItems.Where(x => x.EquipNum == equipNum).ToList(); for (int i = 0; i < items.Count(); i++) { keyValuePairs.Add(items[i].ItemName, ReadValue(items[i].ItemName)); } result = JsonConvert.SerializeObject(keyValuePairs); return result; } } #endregion #region 根据名称/描述读取PLC数据返回设备编号和值的JSON字符串 /// /// 根据名称/描述读取PLC数据返回设备编号和值的JSON字符串 /// /// 名称/描述(数据库中plcdetail_name列) /// json字符串 public string ReadValuesByItemName(string itemName) { lock (this.SiemensS7NetClient) { string result = null; Dictionary keyValuePairs = new Dictionary(); List items = this.PLCDBItems.Where(x => x.ItemName == itemName).ToList(); for (int i = 0; i < items.Count(); i++) { keyValuePairs.Add(items[i].EquipNum, ReadValue(items[i])); } result = JsonConvert.SerializeObject(keyValuePairs); return result; } } #endregion #region 根据名称/描述和设备编号读取PLC数据 /// /// 根据名称/描述和设备编号读取PLC数据 /// /// 名称/描述(数据库中plcdetail_name列) /// 设备编号 /// public virtual object ReadValue(string itemName, string equipNum) { lock (this.SiemensS7NetClient) { object result = null; DBItemGroup item = this.PLCDBItems.Where(x => x.ItemName == itemName && x.EquipNum == equipNum).FirstOrDefault(); if (item == null) { try { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}{Environment.NewLine}({equipNum}):未在协议找到编号{equipNum}的地址", PLCName); } catch { } throw new Exception($"未在协议找到编号{equipNum}的地址"); } string itemAddress = item.ItemAddress; string itemDatatype = item.ItemDataType; try { result = Read(itemAddress, itemDatatype); } catch (Exception ex) { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{item.ItemDataType},{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName); } try { //WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + result, PLCName); } catch { } return result; } } #endregion #region 将数据写入到PLC中 /// /// 将数据写入到PLC中 /// /// 名称/描述(数据库中plcdetail_name列) /// 写入的值 /// public virtual bool WriteValue(string itemName, object value) { lock (this.SiemensS7NetClient) { OperateResult operateResult = new OperateResult(); ; bool result = false; string writeResult = ""; DBItemGroup item = this.PLCDBItems.Where(x => x.ItemName == itemName).FirstOrDefault(); if (item == null) return false; string itemAddress = item.ItemAddress; string itemDatatype = item.ItemDataType; try { operateResult = Write(itemAddress, itemDatatype, value); result = operateResult.IsSuccess; writeResult = result ? "成功" : $"失败:{operateResult.Message}"; } catch (Exception ex) { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:时间:{DateTime.Now},{PLCName}写入数据失败{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName); } try { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:时间:{DateTime.Now},{PLCName}写入数据{writeResult}{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + value, PLCName); } catch { } return result; } } #endregion #region 将数据写入到PLC中 /// /// 将数据写入到PLC中 /// /// 名称/描述(数据库中plcdetail_name列) /// 写入的值 /// public virtual bool WriteValue(string itemName, string equipNum, object value) { lock (this.SiemensS7NetClient) { OperateResult operateResult = new OperateResult(); ; bool result = false; string writeResult = ""; DBItemGroup item = this.PLCDBItems.Where(x => x.ItemName == itemName && x.EquipNum == equipNum).FirstOrDefault(); if (item == null) return false; string itemAddress = item.ItemAddress; string itemDatatype = item.ItemDataType; try { for (int i = 0; i < 3; i++) { operateResult = Write(itemAddress, itemDatatype, value); Thread.Sleep(33); //flag = ReadValue(item).ToString(); //if (!value.ToString().Equals(flag)) //{ // WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:时间:{DateTime.Now},{PLCName}写入数据失败{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:要写入的数据与读取的数据不符,读取数据:{flag},写入数据:{value}", PLCName); // return false; //} result = operateResult.IsSuccess; if (result) break; } //writeResult = operateResult.IsSuccess ? "成功" : $"失败:{operateResult.Message}"; } catch (Exception ex) { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:时间:{DateTime.Now},{PLCName}写入数据失败{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName); } try { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:时间:{DateTime.Now},{PLCName}写入数据{writeResult}{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + value, PLCName); } catch { } return result; } } #endregion #region 批量写入数据 /// /// 批量写入数据(数据类型必须一致) /// /// DB块起始地址 /// 数据类型 /// 写入的值 /// public OperateResult WriteArray(string adress, string type, object[] value) { OperateResult result = new OperateResult(); try { switch (type.ToLower()) { case "int": ushort[] tmp = new ushort[value.Length]; for (int i = 0; i < value.Length; i++) { tmp[i] = Convert.ToUInt16(value[i]); } result = this.SiemensS7NetClient.Write(adress, tmp); break; case "dint": //result = this.SiemensS7NetClient.Write(adress, value as byte[]); break; case "char": string temp = value.ToString(); byte[] writeData = Encoding.Default.GetBytes(temp); result = this.SiemensS7NetClient.Write(adress, writeData); break; case "bool": //result = this.SiemensS7NetClient.Write(adress, value); break; } } catch (Exception ex) { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{PLCName}写入数据失败{Environment.NewLine}数据类型:{type}{Environment.NewLine}{adress}:{Environment.NewLine}错误信息:{ex.Message}", PLCName); } return result; } /// /// 按操作符类型写数组 /// /// 操作类型 /// 写入的数组 /// public bool WriteArrayByOperatorType(string itemOperatorType, object[] value) { bool result = false; try { OperateResult operateResult = new OperateResult(); ; string writeResult = ""; DBItemGroup item = this.PLCDBItems.Where(x => x.ItemOperatorType == itemOperatorType).OrderBy(x => x.EquipNum).OrderBy(r => r.ItemAddress).FirstOrDefault(); if (item == null) return false; string itemAddress = item.ItemAddress; string itemDatatype = item.ItemDataType; try { operateResult = WriteArray(itemAddress, itemDatatype, value); result = operateResult.IsSuccess; writeResult = result ? "成功" : $"失败:{operateResult.Message}"; } catch (Exception ex) { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:时间:{DateTime.Now},{PLCName}写入数据失败{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName); } } catch (Exception ex) { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:时间:{DateTime.Now},{PLCName}写入数据失败{Environment.NewLine}错误信息:{ex.Message}", PLCName); } return result; } #endregion #region 批量读取数据 /// /// 批量读取数据(数据类型必须一致) /// /// DB块起始地址 /// 数据类型 /// 读取长度 /// public object ReadArray(string adress, string type, int length) { object result = -1; ; try { switch (type.ToLower()) { case "int": result = this.SiemensS7NetClient.ReadUInt16(adress, Convert.ToUInt16(length)).Content; break; case "dint": result = this.SiemensS7NetClient.ReadUInt32(adress, Convert.ToUInt16(length)).Content; break; case "char": byte[] temps = this.SiemensS7NetClient.Read(adress, Convert.ToUInt16(length)).Content; result = Encoding.Default.GetString(temps).ToCharArray(); break; case "bool": result = this.SiemensS7NetClient.ReadBool(adress, Convert.ToUInt16(length)).Content; break; case "byte": break; } } catch (Exception ex) { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{type},{adress}:{Environment.NewLine}错误信息:{ex.Message}", PLCName); } return result; } #endregion #region 批量读取数据(改)著:曾南阳 /// /// 批量读取数据(根据数据库配置批量读取) /// /// 名称描述 /// 设备编号 /// 读取长度 /// public object ReadArrays(string itemName, string equipNum, int length) { lock (this.SiemensS7NetClient) { object result = null; DBItemGroup item = this.PLCDBItems.Where(x => x.ItemName == itemName && x.EquipNum == equipNum).FirstOrDefault(); if (item == null) { try { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}{Environment.NewLine}({equipNum}):未在协议找到编号{equipNum}的地址", PLCName); } catch { } throw new Exception($"未在协议找到编号{equipNum}的地址"); } string itemAddress = item.ItemAddress; string itemDatatype = item.ItemDataType; try { result = Read(itemAddress, itemDatatype, length); } catch (Exception ex) { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{item.ItemDataType},{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName); } try { //WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + result, PLCName); } catch { } return result; } } #endregion #region 根据名称/描述读取指定长度的bool数组 /// /// 根据名称/描述读取指定长度的bool数组 /// /// 起始地址名称/描述(数据库中plcdetail_name列) /// 读取的长度信息 /// 设备编号 /// public OperateResult ReadBool(string itemName, ushort length, string equipNum) { string address = this.PLCDBItems.Where(x => x.ItemName == itemName && x.EquipNum == equipNum).FirstOrDefault().ItemAddress; OperateResult operateResult = S7AddressData.ParseFrom(address); bool flag = !operateResult.IsSuccess; OperateResult result; if (flag) { result = OperateResult.CreateFailedResult(operateResult); } else { ushort length2 = (ushort)((operateResult.Content.AddressStart + (int)length - 1) / 8 - operateResult.Content.AddressStart / 8 + 1); int num = operateResult.Content.AddressStart % 8; operateResult.Content.AddressStart = operateResult.Content.AddressStart - num; operateResult.Content.Length = length2; OperateResult operateResult2 = this.SiemensS7NetClient.Read(new S7AddressData[] { operateResult.Content }); bool flag2 = !operateResult2.IsSuccess; if (flag2) { result = OperateResult.CreateFailedResult(operateResult2); } else { result = OperateResult.CreateFailedResult(operateResult2); //result = OperateResult.CreateSuccessResult(operateResult2.Content.ToBoolArray().SelectMiddle(num, (int)length)); //WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}数据类型:bool{Environment.NewLine}状态({address},长度:{length}):" + JsonConvert.SerializeObject(result.Content), PLCName); } } return result; } #endregion #region 根据DB地址及类型读取数据,最根本读取方法 /// /// 根据DB地址及类型读取数据 /// /// DB地址(DB块+.+偏移量) /// 数据类型(int/dint/string/bool) /// public object Read(string adress, string type) { object result = -1; ; try { switch (type.ToLower()) { case "int": result = this.SiemensS7NetClient.ReadInt16(adress).Content; break; case "dint": result = this.SiemensS7NetClient.ReadUInt32(adress).Content; break; case "string": OperateResult operateResult = this.SiemensS7NetClient.ReadString(adress); operateResult.Content = operateResult.Content?.Replace("\\", "")?.Replace("\0", "")?.Replace("\u0014", ""); result = operateResult == null ? null : operateResult; break; case "bool": result = this.SiemensS7NetClient.ReadBool(adress).Content; break; case "byte": result = this.SiemensS7NetClient.ReadByte(adress).Content; break; case "word": result = this.SiemensS7NetClient.ReadUInt16(adress).Content; break; default: throw new Exception($"未找到该数据类型:{type}"); //break; } } catch (Exception ex) { StackTrace stackTrace = new StackTrace(); StackFrame[] stackFrames = stackTrace.GetFrames(); string str = ""; foreach (var item in stackFrames) { str += "方法名:" + item.GetMethod().Name + ",行号:" + item.GetFileLineNumber() + ",文件名:" + item.GetFileName() + Environment.NewLine; } WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{type},{adress}:{Environment.NewLine}错误信息:{ex.Message},{str}", PLCName); } return result; } #endregion #region 根据DB地址及类型批量读取数据,最根本读取方法 /// /// 根据DB地址及类型批量读取数据 /// /// DB地址(DB块+.+偏移量) /// 数据类型(int/dint/string/bool) /// public object Read(string adress, string type, int length) { object result = -1; ; try { switch (type.ToLower()) { case "int": result = this.SiemensS7NetClient.ReadUInt16(adress, Convert.ToUInt16(length)).Content; break; case "dint": result = this.SiemensS7NetClient.ReadUInt32(adress, Convert.ToUInt16(length)).Content; break; case "char": byte[] temps = this.SiemensS7NetClient.Read(adress, Convert.ToUInt16(length)).Content; result = Encoding.Default.GetString(temps).ToCharArray(); break; case "bool": result = this.SiemensS7NetClient.ReadBool(adress, Convert.ToUInt16(length)).Content; break; case "word": result = this.SiemensS7NetClient.ReadUInt16(adress, Convert.ToUInt16(length)).Content; break; default: throw new Exception($"未找到该数据类型:{type}"); } } catch (Exception ex) { StackTrace stackTrace = new StackTrace(); StackFrame[] stackFrames = stackTrace.GetFrames(); string str = ""; foreach (var item in stackFrames) { str += "方法名:" + item.GetMethod().Name + ",行号:" + item.GetFileLineNumber() + ",文件名:" + item.GetFileName() + Environment.NewLine; } WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{type},{adress}:{Environment.NewLine}错误信息:{ex.Message},{str}", PLCName); } return result; } #endregion #region 根据DB地址及类型写入数据,最根本写入方法 /// /// 根据DB地址及类型写入数据 /// /// DB地址(DB块+.+偏移量) /// 数据类型(int/dint/string/bool) /// 写入的值 /// 返回成功或失败 public OperateResult Write(string adress, string type, object value) { OperateResult result = new OperateResult(); try { switch (type.ToLower()) { case "int": result = this.SiemensS7NetClient.Write(adress, Convert.ToInt16(value)); break; case "dint": result = this.SiemensS7NetClient.Write(adress, Convert.ToUInt32(value)); break; case "string": //string[] adressTmp = adress.Split('.'); result = this.SiemensS7NetClient.Write(adress, value.ToString()); break; case "bool": result = this.SiemensS7NetClient.Write(adress, Convert.ToBoolean(value)); break; case "byte": { byte[] by = { Convert.ToByte(value) }; result = this.SiemensS7NetClient.Write(adress, by); } break; default: throw new Exception($"未找到该数据类型:{type}"); } } catch (Exception ex) { WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{PLCName}写入数据失败{Environment.NewLine}数据类型:{type}{Environment.NewLine}{adress}:{Environment.NewLine}错误信息:{ex.Message}", PLCName); } return result; } #endregion } }