using HslCommunication; using HslCommunication.ModBus; using PLCHelper.Entity; using System; using System.Collections.Concurrent; namespace PLCHelper { public class ModbusHelper { private static ConcurrentDictionary cache = new ConcurrentDictionary(); internal static ModbusTcpNet GetClient(string ip, int port) { string key = $"{ip}:{port};"; if (!cache.ContainsKey(key)) { var client = new ModbusTcpNet(ip, port); cache[key] = client; client.ConnectServer(); } return cache[key]; } internal static bool ParseConfig(string address, out string ip, out int port, out string index) { try { var arr = address.Split(','); ip = arr[0]; port = int.Parse(arr[1]); index = arr[2]; return true; } catch { ip = null; port = -1; index = null; return false; } } internal static void Release() { foreach (var client in cache.Values) { client.Dispose(); } cache.Clear(); } internal static bool ReadData(PLCTagData data, out object val, out string errMsg) { val = null; try { string address = data.Address; if (!ModbusHelper.ParseConfig(address, out string ip, out int port, out string index)) { errMsg = "解析配置失败"; return false; } var api = ModbusHelper.GetClient(ip, port); if (data.Type == PLCTagType.BOOL) { var res = api.ReadBool(index); val = res.Content; errMsg = res.Message; return res.IsSuccess; } else if (data.Type == PLCTagType.SHORT) { var res = api.ReadInt16(index); val = res.Content; errMsg = res.Message; return res.IsSuccess; } else if (data.Type == PLCTagType.USHORT) { var res = api.ReadUInt16(index); val = res.Content; errMsg = res.Message; return res.IsSuccess; } else if (data.Type == PLCTagType.INT) { var res = api.ReadInt32(index); val = res.Content; errMsg = res.Message; return res.IsSuccess; } else if (data.Type == PLCTagType.FLOAT) { var res = api.ReadFloat(index); val = res.Content; errMsg = res.Message; return res.IsSuccess; } errMsg = "类型不支持"; return false; } catch (Exception ex) { errMsg = ex.Message; return false; } } internal static bool WriteData(PLCTagData data, object val, out string msg) { try { string address = data.Address; if (!ParseConfig(address, out string ip, out int port, out string index)) { msg = "解析配置失败"; return false; } var api = GetClient(ip, port); OperateResult res; switch (data.Type) { case PLCTagType.BOOL: res = api.Write(index, bool.Parse(val.ToString())); break; case PLCTagType.SHORT: res = api.Write(index, short.Parse(val.ToString())); break; case PLCTagType.USHORT: res = api.Write(index, ushort.Parse(val.ToString())); break; case PLCTagType.INT: res = api.Write(index, int.Parse(val.ToString())); break; case PLCTagType.FLOAT: res = api.Write(index, float.Parse(val.ToString())); break; default: msg = "类型不支持"; return false; } msg = res.Message; return res.IsSuccess; } catch (Exception ex) { msg = ex.Message; return false; } } } }