0

我正在使用“EasyModBus”与 BUS 系统进行通信。如果连接丢失或出现故障,我需要用户立即知道。另一个问题是,如果我断开网络连接,软件将由于下面提到的行上的未连接套接字而挂起:

ushort[] inputs = master1.ReadHoldingRegisters(startAddress, numInputs);

我测试了下面列出的几种方法:

  1. 如果(tcpClient.Connected)
  2. if(tcpClient.Available!=0) 以及 socket.Poll
  3. 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();
        }

任何帮助表示赞赏。

4

0 回答 0