libmodbus 库-Server Slave仿真程序

    技术2022-07-11  79

      为了测试4diac 的modbus 模块,编写了一个server 端的仿真程序。将代码放出了

    #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <memory.h> #include <sys/socket.h> #include "modbus.h" #include<stdlib.h> #include <iostream> /* compiller command clang++ -I /usr/local/include/modbus -L /usr/local/lib -lmodbus modbusServerSimulator.cpp -o modbusServerSimulator */ using namespace std; int main(void) { int s = -1; int i = 0; int rc = 0; modbus_t *ctx = NULL; modbus_mapping_t *mb_mapping = NULL; cout<<"modbus Slave"<<endl; //打开端口: ip, port ctx = modbus_new_tcp("127.0.0.1", 502); modbus_set_debug(ctx, TRUE); s = modbus_tcp_listen(ctx, 1); if (s==-1) { cout<<"Unable to listen TCP!"<<endl; } modbus_tcp_accept(ctx, &s); cout<<"connected"<<endl; mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, MODBUS_MAX_WRITE_BITS, MODBUS_MAX_READ_REGISTERS, MODBUS_MAX_WRITE_REGISTERS); if (mb_mapping == NULL) { fprintf(stderr, "Failed to allocate the mapping: %s\n", modbus_strerror(errno)); modbus_free(ctx); return -1; } //设置从机地址 modbus_set_slave(ctx, 1); uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH]; //初始化几个寄存器 for (int i=0;i<MODBUS_MAX_READ_REGISTERS;i++) mb_mapping->tab_input_registers[i] = i; while (1) { rc = modbus_receive(ctx, query); if (rc > 0) { modbus_reply(ctx, query, rc, mb_mapping); cout<<"input registers:"; for (int i=0;i<8;i++) cout<< mb_mapping->tab_registers[i]<<":" ; cout<<endl; } else if (rc == -1) { break; } } printf("Quit the loop: %s\n", modbus_strerror(errno)); modbus_mapping_free(mb_mapping); if (s != -1) { close(s); } modbus_close(ctx); modbus_free(ctx); }

    说明

    modbus 的相关数据都是放在 mb_mapping 中的。他是一个结构类型,在modbus.h 中定义

    typedef struct _modbus_mapping_t { int nb_bits; int start_bits; int nb_input_bits; int start_input_bits; int nb_input_registers; int start_input_registers; int nb_registers; int start_registers; uint8_t *tab_bits; uint8_t *tab_input_bits; uint16_t *tab_input_registers; uint16_t *tab_registers; } modbus_mapping_t;

    应用软件从这个结构中读取数据。

    Processed: 0.010, SQL: 9