我正在使用“EasyModBus”与 BUS 系统进行通信。如果连接丢失或出现故障,我需要用户立即知道。另一个问题是,如果我断开网络连接,软件将由于下面提到的行上的未连接套接字而挂起:
ushort[] inputs = master1.ReadHoldingRegisters(startAddress, numInputs);
我测试了下面列出的几种方法:
- 如果(tcpClient.Connected)
- if(tcpClient.Available!=0) 以及 socket.Poll
- Ping 和检查状态
结果: Ping 没问题,但我必须将阅读时间间隔从 1000 毫秒更改为至少 2500 毫秒。然后,如果我断开套接字,我会得到异常。但我需要每 1000 毫秒读取一次脉冲。
这里有同样的问题:EasyModbus: disconnecting from network doesn't change the connection state
正如我所提到的,我尝试了 tcpclient.Available 但它不起作用。
我的代码:
private NetWork _NetWork = null;
bool PingSlave(IPAddress slaveIPB)
{
PingReply reply = _NetWork.SendPing(slaveIPB,2500);
if (reply.Status == IPStatus.Success)
return true;
else return false;
}
void Master1_Slave1_Read()
{
try
{
ipAddressTCP1 = tBxIPAdrs.Text.ToString();
tcpClient1 = new TcpClient();
tcpClient1.Connect(ipAddressTCP1, ipPortTCP1);
master1 = ModbusIpMaster.CreateIp(tcpClient1);
ushort startAddress = 0;
ushort numInputs = 10;
if (PingSlave(ipS) == true)
{
ushort[] inputs = master1.ReadHoldingRegisters(startAddress, numInputs);
for (int i = 0; i < numInputs; i++)
{
if (inputs != null)
rTBx0_IOMF.AppendText(inputs[i].ToString() + "\t");
}
rTBx0_IOMF.AppendText("\n");
}
else
rTBx1_IOMF.AppendText("\n" + "Warning:\t\t Check Your Connection!" + "\t\t" + DateTime.Now.ToString("dd-mm-yyyy:HH:mm:ss") + "\n");
}
catch (EasyModbus.Exceptions.ConnectionException ex)
{
rTBx0_IOMF.AppendText(ex.Message.ToString() + "\n");
}
catch (SocketException ex)
{
rTBx0_IOMF.AppendText(ex.Message.ToString() + "\n");
}
}
private void t0_Tick(object sender, EventArgs e)
{
Master1_Slave1_Read();
}
任何帮助表示赞赏。