libmodbus:无法轮询停止位为2的modbus电能表

时间:2019-02-15 09:10:12

标签: c embedded modbus

我正在尝试以不带奇偶校验的方式来轮询n施耐德电度表,并使用RS485到USB转换器将位停止为2。我收到连接超时错误。但是,当我尝试以奇偶校验而不是奇偶校验和停止位为1轮询同一仪表时,我可以接收数据。

我用来轮询电表的代码段如下

     ctx = modbus_new_rtu("/dev/ttyUSB0",9600, 'N', 8, 2);
     modbus_set_debug(ctx, TRUE);
      if (modbus_connect(ctx) == -1) {
           printf("Modbus Connection failed: %s", modbus_strerror(errno));
           modbus_free(ctx);
           return -1;
      }
      modbus_set_slave(ctx,2);
      memset(tab_rp_registers, 0, 2 * sizeof(uint16_t));
      rc = modbus_read_registers(ctx,3109,2,tab_rp_registers);
      modbus_close(ctx);
      modbus_free(ctx);
      if (rc != -1) {
      // actions performed

      }
      else {
      free(tab_rp_registers);
      printf("Error str is %s\n",modbus_strerror(errno));
       }

在转换errno时,我总是将rc设为-1,并且连接超时错误。

我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

您确定购物位应为2,且没有奇偶校验吗? Modbus规范确实声明RTU每个字符应该有11位,这意味着在不使用奇偶校验时应该有2个停止位。但是,以我的经验来看,许多供应商不遵守该规则。我从Schneider网站上找到了第一本电表手册:

http://download.schneider-electric.com/files?p_enDocType=User+guide&p_File_Name=DOCA0005EN-10.pdf&p_Doc_Ref=DOCA0005EN

在第47页上,有一条注释“停止位数= 1”似乎适用于所有奇偶校验模式。

答案 1 :(得分:0)

已解决将库更新到3.1.4的问题。