我们使用 Raspberry Pi 作为 Master,IP 地址为 192.168.100.104,另一台作为 Slave,IP 地址为 192.168.100.102,进行 Modbus TCP 通信。两者都连接到交换机。 Slave 正在等待 Master 的请求,当他收到请求时,Slave 会向 Master 发送一个随机值。主打印那个值。
这是大师的代码:
#include <stdio.h>
#include <stdlib.h>
#include <modbus.h>
#include <errno.h>
int main(int argc, char *argv[]) {
modbus_t *ctx;
uint16_t tab_reg[64];
int rc, i;
ctx = modbus_new_tcp("192.168.100.104", 502);
if (ctx == NULL) {
fprintf(stderr, "Unable to allocate libmodbus context\n");
return -1;
}
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
modbus_set_debug(ctx, TRUE);
rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == 10) {
printf("Read registers: ");
for (i=0; i<10; i++) {
printf("%d ", tab_reg[i]);
}
printf("\n");
} else {
fprintf(stderr, "Failed to read registers: %s\n", modbus_strerror(errno));
}
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
我们从 Raspbrrey 运行该脚本,IP 地址为 192.168.100.104.
这里是 Slave 的代码:
#include <stdio.h>
#include <stdlib.h>
#include <modbus.h>
#include <errno.h>
int main(int argc, char *argv[]) {
modbus_t *ctx;
modbus_mapping_t *mb_mapping;
int socket;
ctx = modbus_new_tcp("0.0.0.0", 1502);
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
modbus_set_debug(ctx, TRUE);
socket = modbus_tcp_listen(ctx, 1);
mb_mapping = modbus_mapping_new(0, 0, 100, 0);
sleep(5);
modbus_tcp_accept(ctx, &socket);
for (;;) {
uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
int rc;
rc = modbus_receive(ctx, query);
if (rc > 0) {
query[0]=52;
modbus_reply(ctx, query, rc, mb_mapping);
} else if (rc == -1) {
break;
}
}
printf("Quit the loop: %s\n", modbus_strerror(errno));
modbus_mapping_free(mb_mapping);
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
我们从 Slave 得到的错误是:Quit the loop: Invalid argument
我们从 Master 那里得到的错误是: 连接失败:连接被拒绝
奴隶正在等待