using HslCommunication;
|
using HslCommunication.ModBus;
|
using PLCHelper.Entity;
|
using System;
|
using System.Collections.Concurrent;
|
|
namespace PLCHelper
|
{
|
public class ModbusHelper
|
{
|
private static ConcurrentDictionary<string, ModbusTcpNet> cache = new ConcurrentDictionary<string, ModbusTcpNet>();
|
|
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;
|
}
|
}
|
}
|
}
|