diff --git a/TcpSlave1.c b/TcpSlave1.c new file mode 100644 index 0000000..486d30c --- /dev/null +++ b/TcpSlave1.c @@ -0,0 +1,172 @@ +#include +#include +#include +#include +#include + +#include + +//TCP模式的Slave端程序 +int main(void) +{ + int ret = 0 ; + int sockfd = -1 ; + modbus_t* ctx = NULL ; + modbus_mapping_t* map = NULL ; + uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH] ; + int i = 0 ; + + //浮点处理 + uint16_t floatArray[2] = {0} ; + float floatting ; + + //unsigned 转 signed + uint16_t sint ; + + //1. 设置串口信息 + ctx = modbus_new_tcp("192.168.1.231", 1503) ; + if (NULL == ctx) + { + fprintf(stderr, "Error: %s\n", modbus_strerror(errno)) ; + return 1 ; + } + else + { + printf("设置TCP信息成功\n") ; + } + +#if 0 + //2. 设置调试模式 + ret = modbus_set_debug(ctx, TRUE); + if (-1 == ret) + { + printf("modbus_set_debug failed...\n") ; + modbus_free(ctx); + return 1; + } +#endif + + //3. 申请内存 存放寄存器数据 + //map = modbus_mapping_new( 0 , 0 , 30000 + 25 , 0) ; + map = modbus_mapping_new_start_address(0 , 0 , 0 , 0 , 30000 , 25 , 40000 , 135) ; + if (NULL == map) + { + fprintf(stderr, "Error: mapping %s\n", modbus_strerror(errno)) ; + modbus_free(ctx) ; + return 1 ; + } + for(i = 0 ; i < 24 ; i++) + { + map->tab_registers[i] = i + 777; + } + map->tab_registers[24] = 999 ; + //map->tab_registers[2] = 0x0020 ; + //map->tab_registers[3] = 0xF147 ; + + for(i = 0 ; i < 135 ; i++) + { + map->tab_input_registers[i] = i * 2 + 100 ; + } + + //4. 开始监听端口 + sockfd = modbus_tcp_listen(ctx, 1) ; + if (-1 == sockfd) + { + printf("modbus_tcp_listen failed...\n") ; + modbus_free(ctx) ; + return 1 ; + } + + //5. 接受客户端连接 + ret = modbus_tcp_accept(ctx, &sockfd) ; + if (-1 == ret) + { + printf("modbus_tcp_accept failedl: %s\n", modbus_strerror(errno)) ; + modbus_free(ctx) ; + return 1 ; + } + + //6. 循环接受客户端请求,并且响应客户端 + while (1) + { + memset(query, 0, sizeof(query)) ; + + //获取查询请求报文 + ret = modbus_receive(ctx, query) ; + if (ret >= 0) + { + //恢复响应报文 + modbus_reply(ctx, query, ret, map) ; + } + else + { + printf("Connection close\n") ; + + modbus_close(ctx) ; + + //等待下一个客户端连接 + modbus_tcp_accept(ctx, &sockfd) ; + } + + //尝试处理浮点数 + floatArray[0] = map->tab_registers[2] ; + floatArray[1] = map->tab_registers[3] ; + floatting = modbus_get_float_dcba(floatArray) ; + + //将unsigned转为signed + if(map->tab_registers[4] & 0x8000) + { + sint = (~(map->tab_registers[4])) + 1 ; + } + else + { + sint = map->tab_registers[4] ; + } + + //打印信息 + printf("\n======================================================================\n") ; + + printf("\n----------map->tab_registers----------\n") ; + for(i = 0 ; i < 24 ; i++) + { + printf("%d\t" , map->tab_registers[i]) ; + } + + printf("\n----------map->tab_input_registers----------\n") ; + for(i = 0 ; i < 135 ; i ++) + { + printf("%d\t" , map->tab_input_registers[i]) ; + } + + printf("\n----------float DC BA ----------\n"); + printf("%f\n" , floatting) ; + + printf("----------signed int ----------\n"); + if(map->tab_registers[4] & 0x8000) + { + sint = (~(map->tab_registers[4])) + 1 ; + printf("-%d\n" , sint) ; + } + else + { + sint = map->tab_registers[4] ; + printf("%d\n" , sint); + } + printf("======================================================================\n") ; + + map->tab_registers[0]++ ; + //sleep(1) ; + } + + printf("Quit the loop: %s\n", modbus_strerror(errno)) ; + + //6. 释放内存 + modbus_mapping_free(map) ; + + //7. 关闭设备 + modbus_close(ctx) ; + modbus_free(ctx) ; + + return 0 ; +} +