【问题标题】:a lack of examples of using libmodbus functions缺少使用 libmodbus 函数的示例
【发布时间】:2017-03-06 16:24:22
【问题描述】:

我是 modbus 的新手。我花了几个小时阅读帮助(?)文件,这似乎从来没有给你一个例子!我在 Raspberry Pi、model3 上使用 C 并安装了 libmodbus。我正在尝试通过 FTDI USB 到 RS485 转换器与 epSolar 太阳能电池板控制器通话。 epSolar 文档说读取输入寄存器从地址 3000 开始并继续到 311D。我正在尝试阅读 3104。 我修改了下面的代码。它连接到设备但尝试读取输入寄存器 0x​​04 总是返回 -1:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <modbus.h>

enum {TCP, RTU};

int main(int argc, char *argv[])
{
 int socket;
 modbus_t *ctx;
 modbus_mapping_t *mb_mapping;
 int rc;
 int use_backend;
 int i;
 uint16_t tab_reg[64];
 use_backend = RTU;

 printf("Waiting for Serial connection\n");
 ctx = modbus_new_rtu("/dev/SOLAR", 115200, 'N', 8, 1);
 modbus_set_slave(ctx, 0);
 //modbus_connect(ctx);
 if(modbus_connect(ctx) == -1)
  {
   fprintf(stderr, "Serial connection failed: 
            %s\n", modbus_strerror(errno));
   modbus_free(ctx);
   return -1;
  }

 printf("Serial connection started!\n");

 mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0,
                                MODBUS_MAX_READ_REGISTERS, 0);
 if(mb_mapping == NULL)
  {
    fprintf(stderr, "Failed to allocate the mapping: %s\n",
              modbus_strerror(errno));
   modbus_free(ctx);
   return -1;
  }
  rc = modbus_read_input_registers(ctx, 1, 0x0A, tab_reg);
  if(rc == -1)
   {
    fprintf(stderr, "%s\n", modbus_strerror(errno));
    return -1;
   }

  for(i=0; i < rc; i++)
   printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]);
  modbus_mapping_free(mb_mapping);
  modbus_free(ctx);
  modbus_close(ctx);
  return 0;
}

它可以正常连接并分配映射,但 rc 始终为 -1,并显示端口已超时的错误消息。 我的想法已经用完了,感觉就像在糖浆中航行!

非常感谢任何帮助。

【问题讨论】:

  • modbus_set_slave(ctx, 0); modbus swlave ID 0 无效,有效 modbus slave ID 为 1-247
  • 更具体地说,modbus slave ID 0是广播ID。大多数设备不会在 RTU 线上直接响应广播消息。您需要通过正确的从设备 ID 来寻址设备,以便让它向您返回数据

标签: modbus


【解决方案1】:

我也是 Modbus 的新手。根据我目前的经验,请确保您为 tab_reg 分配了足够的内存来存储结果。还可以尝试在 modbus_set_debug(ctx, TRUE); 上设置调试模式以检查请求和响应代码。

【讨论】:

    【解决方案2】:

    我知道这是一个非常老的问题,但希望这个答案能帮助任何通过 Google 搜索到达这里的人。

    我可以看到需要帮助的几点。

    正如上面 Saad 所说,上面的 modbus 服务器 ID 不正确。 ID 0 保留用于广播消息,从站不会响应。找出目标设备的 Modbus ID 是什么,然后使用它。

    我认为欺骗您的是,只要您提供的串行端口有效,您也将始终获得正确的“连接”。这不是与任何特定设备的连接,而是与 Modbus 网络端口的连接。您遇到了超时,因为 libmodbus 需要响应,但在网络上没有收到响应。

    呈现的代码中还有其他几个小问题,但考虑到这篇文章的年代,我几乎觉得我在挑剔一些 OP 可能已经解决的问题。最大的问题是无法使用的从属 ID。其他小问题包括:不必要地使用 modbus_mapping(用于服务器/从机的结构)、可能的 modbus_mapping 分配错误(没有为输入寄存器分配空间)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多