一、实例化一个TCP连接
TCP连接只需要IP地址和端口号。我用的是easymodbus这个通讯库
ModbusClient client = new ModbusClient(ip, port);
client.Connect();
二、线圈读取
这边我整理了一下easymodbus线圈用到的几个方法。
ReadCoils
功能码:0x01 (读线圈寄存器)
功能:读取输出线圈状态
发送数据 startIndex(开始位), endIndex(停止位)
WriteSingleCoil
功能码:0x05 (写单个线圈寄存器)
功能:写入单个输入线圈状态
发送数据类型 startIndex(开始位), value(布尔值 0关 1开)
ReadDiscreteInputs
功能码:0x02 (读离散输入寄存器)
功能:读取输入线圈状态
发送数据类型 startIndex(开始位), endIndex(停止位)
WriteMultipleCoils
功能码:0x0F (写多个线圈寄存器)
功能:写入多个输入线圈状态
发送数据类型 startIndex(开始位), bool[] value(布尔值 0关 1开)
下面是实际使用
bool[] coilss = client.ReadCoils(startIndex, endIndex);
client.WriteSingleCoil(startIndex, isOk);//void isOk true/false
bool[] coils = client.ReadDiscreteInputs(startIndex, endIndex);
client.WriteMultipleCoils(startIndex, value);//void value - bool[] value
三、断线重连
实现方法
try
{
if(oMelsecMcNetdoor.Connected)
{
statusssCur = oMelsecMcNetdoor.ReadDiscreteInputs(0, 6);
}
else
{
lst = oStationBll.GetDevInternetConfigByWorkSection();//这个是获取重连需要的参数 我是卸载数据库里面的,如果只有一个数量可以写死
foreach (var config in lst)
{
if (config.DevStatus == 1 && config.ConfigName == "door")
{
oMelsecMcNetdoor.Disconnect();
oMelsecMcNetdoor = new ModbusClient(config.IPAddress, Convert.ToInt16(config.IPPort));
oMelsecMcNetdoor.Connect();
}
}
}
}
catch( Exception ex)
{
statusssCur = null;
lst = oStationBll.GetDevInternetConfigByWorkSection();
foreach (var config in lst)
{
if (config.DevStatus == 1 && config.ConfigName == "door")
{
oMelsecMcNetdoor.Disconnect();
oMelsecMcNetdoor = new ModbusClient(config.IPAddress, Convert.ToInt16(config.IPPort));
oMelsecMcNetdoor.Connect();
}
}
}