diff --git a/TcpSlave.c b/TcpSlave.c index 486d30c..9f7c7d4 100644 --- a/TcpSlave.c +++ b/TcpSlave.c @@ -6,6 +6,10 @@ #include + +int dataProcessing( uint8_t* query , modbus_mapping_t* map) ; + + //TCP模式的Slave端程序 int main(void) { @@ -13,18 +17,11 @@ int main(void) 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 ; + uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH] ; //1. 设置串口信息 - ctx = modbus_new_tcp("192.168.1.231", 1503) ; + ctx = modbus_new_tcp("192.168.1.231", 1502) ; if (NULL == ctx) { fprintf(stderr, "Error: %s\n", modbus_strerror(errno)) ; @@ -34,20 +31,7 @@ int main(void) { 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) { @@ -55,17 +39,20 @@ int main(void) modbus_free(ctx) ; return 1 ; } - for(i = 0 ; i < 24 ; i++) + + for(int i = 0 ; i < 24 ; i++) { - map->tab_registers[i] = i + 777; + map->tab_registers[i] = i ; } + map->tab_registers[24] = 999 ; + //浮点测试 //map->tab_registers[2] = 0x0020 ; //map->tab_registers[3] = 0xF147 ; - for(i = 0 ; i < 135 ; i++) + for(int i = 0 ; i < 135 ; i++) { - map->tab_input_registers[i] = i * 2 + 100 ; + map->tab_input_registers[i] = i * 2 ; } //4. 开始监听端口 @@ -90,83 +77,108 @@ int main(void) while (1) { memset(query, 0, sizeof(query)) ; - //获取查询请求报文 ret = modbus_receive(ctx, query) ; if (ret >= 0) { //恢复响应报文 modbus_reply(ctx, query, ret, map) ; + dataProcessing( query , 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 ; } + +int dataProcessing( uint8_t* query , modbus_mapping_t* map ) +{ + uint16_t address ; + uint16_t address1 ; + uint16_t address2 ; + int i = 0 ; + + //浮点处理 + uint16_t floatArray[2] = {0} ; + float floatting ; + + //unsigned 转 signed + uint16_t sint ; + + + //尝试处理浮点数 + 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请求序列号:%d\n" , query[1] ) ; + if( query[7] == 4) + { + printf("读取Input Registers寄存器\n") ; + } + else if(query[7] == 3) + { + printf("读取Holding Registers寄存器\n") ; + } + address1 = query[8] << 8 ; + address2 = query[9] & 0x00ff ; + address = address1 | address2 ; + printf("本次读取的起始地址为:%d\n" , address) ; + printf("本次读取个数为:%d个\n" , query[11] ) ; + //打印信息 + 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]++ ; + + return 0 ; +}