ModbusTCP - 生成的帧中的 ID 错误
ModbusTCP - wrong ID in generated frame
我有一个奇怪的问题。我尝试使用来自 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
经过分析可以发现那个frame中的device id是FF,但是根据这个errorPLC期望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);
我有一个奇怪的问题。我尝试使用来自 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
经过分析可以发现那个frame中的device id是FF,但是根据这个errorPLC期望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 valueMODBUS_TCP_SLAVE (0xFF)
can be used inTCP
mode to restore the default value.
强调我的
您的代码应该是
modbus_set_slave(ctx, 1);
rc = modbus_read_registers(ctx, 3002, 2, tab_reg);