C#Modbus:ReadHoldingRegisters在返回输出时不一致

问题描述

我正在尝试搜索连接到设备上串行端口的Modbus,并对它运行一些命令。但是,似乎在读取保持寄存器方面并不一致。我正在使用NModbus4库。

我有一个每秒运行的线程,用于检查可用的串行端口并尝试建立连接:

// === Check if port is open,start connecting procedure if closed
if (!(serialPort.IsOpen))
{
    List<string> portnames = new List<string>();

    foreach (string s in SerialPort.GetPortNames())
    {
        portnames.Add(s); // COM3
     }

     // === Loop through the listed ports and try to connect
     foreach (string portname in portnames)
     {
         if (!(serialPort.IsOpen))
         {
             try
             {
                 serialPort.PortName = portname;
                 serialPort.Baudrate = 57600;
                 serialPort.DataBits = 8;
                 serialPort.Parity = Parity.None;
                 serialPort.StopBits = StopBits.Two;

                 serialPort.open();
              }
              catch (Exception e)
              {
                  Console.WriteLine(e.Message);
              }
          }
      }
  }

  // === Check again after connecting procedure if the port is open
  if (serialPort.IsOpen)
  {
      // === Check number of open ports
      if (SerialPort.GetPortNames().Count() != 0)
      {
          // === Check if master is defined
          if (master == null)
          {
               // === Define master
               master = ModbusSerialMaster.CreateRtu(serialPort);
          }

          // === If master is already defined
          if (master != null)
          {
               int parameterID = this.readParameterSetID();
               if (parameterID != 0)
               {
                    if (!desk_devices.Contains(parameterID))
                    {
                          desk_devices.Add(parameterID);
                          newDevice = true;
                    }
                }
           }
       } else
       {
            // === No serial ports available,close the opened serial port                    
            serialPort.Close();
       }
   }

readParameterSetID函数如下:

private int readParameterSetID()
    {
        int parameterSetID = 0;

        if (mutex)
        {
            Console.WriteLine("---Poll overrun----");
        }

        mutex = true;
        if (serialPort.IsOpen)
        {
            if (master != null)
            {
                try
                {
                    ushort[] holding_register = master.ReadHoldingRegisters(1,107,1); // Fails here

                    for (int i = 0; i < 1; i++)
                    {
                        int tmpStart = Convert.ToInt32(107 + i);
                        String tempStart = Convert.ToString(tmpStart,16);

                        int tmpReg = Convert.ToInt32(holding_register[i]);
                        String tempReg = Convert.ToString(tmpReg,16);

                        parameterSetID = holding_register[i];
                    }
                } catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
        mutex = false;
        return parameterSetID;
    }

现在,这里发生的奇怪的事情是readParameterSetID函数在正确执行时应该返回7或0。但是有时,它在读取保持寄存器后才停止。 mutex将保持为真,并且不会返回任何内容。当我重新启动应用程序时,它要么起作用,要么再次发生相同的事情。

我不知道为什么它在50%的情况下都能正常工作,而其他50%的情况却什么也没有返回。如果函数master失败,我曾尝试重新定义readParameterSetID,但是我注意到,每隔几秒钟,主机将被重置,导致该命令无法发送。

我想知道为什么会这样,或者想办法解决这一问题,并在通信失败的情况下读取保持寄存器。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)