c - ModbusTCP - 生成的帧中的 ID 错误

标签 c plc modbus-tcp

我有一个奇怪的问题。我尝试使用 PC 上的 libmodbus 通过 modbusTCP 与 ifm AY1020 进行通信。

我的代码如下:

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

int main()
{
  modbus_t *ctx;
  uint16_t *tab_reg;
  int rc;
  int i;

  ctx = modbus_new_tcp("192.168.1.250", 502);
  modbus_set_debug(ctx, TRUE);


  tab_reg = (uint16_t *) malloc(5 * sizeof(uint16_t));
  memset(tab_reg, 0, 5 * sizeof(uint16_t));


  if (modbus_connect(ctx) == -1)
  {
    fprintf(stderr, "Connection failed: %s\n",modbus_strerror(errno));
    modbus_free(ctx);
    return -1;
  }

  rc = modbus_read_registers(ctx, 3002, 2, 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_close(ctx);
  modbus_free(ctx);
}

感谢调试,我能够获取 modbus_read_registers 函数中生成的帧:

[00][01][00][00][00][06][FF][03][0B][BA][00][02]

我明白了

ERROR Gateway path unavailable Gateway path unavailable

分析后可以发现该帧中的设备id是FF,但是根据这个error PLC 预计为 1。

如果在调试过程中我强制将此值从 FF 更改为 01,则一切正常。看起来它分配了错误的 ID。

如果您有任何帮助、建议、解决方案,我将不胜感激。

最好,

帕维乌

最佳答案

查看the Man

您应该调用modbus_set_slave来设置特定的目标设备。

TCP

The slave number is only required in TCP if the message must reach a device on a serial network. The special value MODBUS_TCP_SLAVE (0xFF) can be used in TCP mode to restore the default value.

强调我的

你的代码应该是

modbus_set_slave(ctx, 1);
rc = modbus_read_registers(ctx, 3002, 2, tab_reg);

关于c - ModbusTCP - 生成的帧中的 ID 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43110567/

相关文章:

c - 函数在我的程序中不起作用

php - 插入缺失的日期时间行 Sql

java - 使用套接字编写 Java 程序以连接到 PLC(可编程逻辑 Controller )

python - 如何修复 PyModbus 无法通过 IME 使用 IF96015 接口(interface)解码响应错误

modbus - 为什么我们需要 Modbus 中的输入寄存器、线圈位和输入位

c - ubuntu 12.04 无法成功添加系统调用

c - 使用C代码重命名文件夹中的文件

c - 如何制作可 Bootstrap ?

plc - 如何在梯形图逻辑中设置无限定时器?

python - Pymodbus/Twisted 异步客户端重新连接