首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >缺少使用libmodbus函数的示例

缺少使用libmodbus函数的示例
EN

Stack Overflow用户
提问于 2016-10-25 03:30:44
回答 2查看 3.9K关注 0票数 1

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

代码语言:javascript
运行
复制
#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,并显示端口已超时的错误消息。我的想法已经用完了,感觉就像是在通过糖浆导航!

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2016-11-16 13:10:40

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

票数 1
EN

Stack Overflow用户

发布于 2018-08-03 02:17:59

我知道这是一个非常古老的问题,但希望这个答案能帮助任何通过谷歌搜索登陆这里的人。

我可以看到一些需要帮助的观点。

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

我认为欺骗你的是,只要你提供的串口是有效的,你也会得到一个合适的“连接”。这不是到任何特定设备的连接,而是到Modbus网络端口的连接。您将获得超时,因为libmodbus需要响应,但网络上没有接收到响应。

代码中还有其他几个小麻烦,但考虑到这篇文章的年龄,我几乎觉得我是在吹毛求疵,这可能是OP已经解决的问题。大问题是无法工作的从ID。其他小问题包括:不必要地使用modbus_mapping (在服务器/从上使用的结构),可能的modbus_mapping错误分配(没有为输入寄存器分配空间)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40226089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档