C 获取具有未知地址的所有Modbus连接设备

C 获取具有未知地址的所有Modbus连接设备,c,linux,modbus,C,Linux,Modbus,我有一台Linux机器,在Modbus RTU(通过rs485)上,多个设备连接到此Linux机器。我不知道连接设备的地址。我想获取已连接设备的列表。有什么方法可以连接所有的设备吗 我正在使用libmodbus 下面是要读取到一个具有已知地址的设备的代码 modbus_t *modbusCtxPtr=NULL; int modbus_id=9; // Modbus address modbusCtxPtr = modbus_new_rtu(TTYDEVICE, BAUDRATE,

我有一台Linux机器,在Modbus RTU(通过rs485)上,多个设备连接到此Linux机器。我不知道连接设备的地址。我想获取已连接设备的列表。有什么方法可以连接所有的设备吗

我正在使用libmodbus

下面是要读取到一个具有已知地址的设备的代码

  modbus_t *modbusCtxPtr=NULL;
  int modbus_id=9; // Modbus address 

  modbusCtxPtr = modbus_new_rtu(TTYDEVICE, BAUDRATE, 'N', 8, STOPBITS);
  if (modbusCtxPtr == NULL) 
  {
     errorAndLogLogger(TTY_ERROR, "ERROR - Unable to create the libmodbus context.");
     return;
  }
  if (modbus_set_slave(modbusCtxPtr, modbus_id) == -1)
        errorAndLogLogger(TTY_ERROR, "ERROR - Error in setting slave id.");
  if (modbus_connect(modbusCtxPtr) == -1)
        errorAndLogLogger(TTY_ERROR, "ERROR - Modbus Connection failed.");

  /* Here, I called read register over Modbus, function. */

Modbus仅允许从机在主机首先寻址的情况下进行对话,从而避免冲突。这意味着无法像使用以太网那样广播消息或被动收听。你可以像你和@Marker所说的那样对每个地址进行投票。只需注意错误代码并将超时设置为1或2秒


最好的办法是跟踪串行链接,查看网络上的所有设备。您将知道在轮询时预期有多少从机,并且您将知道制造商和型号信息。有了这些信息,你就可以得到手册,知道每个寄存器的用途。如果设备具有键盘式界面,您可能还可以找到从机地址。

您必须进行扫描,但即使这样,也无法保证所有设备都支持任何内容。循环遍历所有地址(1-247)并发出(1)读取输入寄存器0或(2)读取设备标识。如果您知道总线上设备的“集合”,则可以更容易地选择已知的支持函数。@Marker,我也这样做,但有一个问题。如果某个特定地址没有设备,则我必须等到超时。我正在寻找一种方法来避免这种等待超时的情况。到目前为止,这似乎是不可避免的!!!!是的,我认为除了等待超时之外,没有别的办法了。