【发布时间】:2017-03-06 16:24:22
【问题描述】:
我是 modbus 的新手。我花了几个小时阅读帮助(?)文件,这似乎从来没有给你一个例子!我在 Raspberry Pi、model3 上使用 C 并安装了 libmodbus。我正在尝试通过 FTDI USB 到 RS485 转换器与 epSolar 太阳能电池板控制器通话。 epSolar 文档说读取输入寄存器从地址 3000 开始并继续到 311D。我正在尝试阅读 3104。 我修改了下面的代码。它连接到设备但尝试读取输入寄存器 0x04 总是返回 -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