两个树莓派之间的 Modbus TCP 通信

问题描述 投票:0回答:0

我们使用 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 那里得到的错误是: 连接失败:连接被拒绝

奴隶正在等待

c tcp modbus master-slave modbus-tcp
© www.soinside.com 2019 - 2024. All rights reserved.