From 8ab3e983c0e40de311b5350dd504a93460b6d31b Mon Sep 17 00:00:00 2001 From: huyizhong Date: Mon, 8 Jul 2024 09:43:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9tcp=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E7=9A=84=E8=BF=94=E5=9B=9E=E5=80=BC=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=A5=97=E6=8E=A5=E5=AD=97=E7=9A=84=E6=9C=89=E6=95=88=E6=80=A7?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modbus/modbus_tools/modbusConnect.ini | 4 +- modbus/modbus_tools/modbus_lib/modbus-tcp.cpp | 2 +- modbus/modbus_tools/ysp_modbus_master.cpp | 95 ++++++++++++++----- 3 files changed, 73 insertions(+), 28 deletions(-) diff --git a/modbus/modbus_tools/modbusConnect.ini b/modbus/modbus_tools/modbusConnect.ini index 2547c71..83f0dcc 100644 --- a/modbus/modbus_tools/modbusConnect.ini +++ b/modbus/modbus_tools/modbusConnect.ini @@ -1,5 +1,5 @@ [MODBUS_SLAVE] -SLAVE_IP_ADDR=192.168.1.7 -SLAVE_IP_PORT=503 +SLAVE_IP_ADDR=192.168.50.155 +SLAVE_IP_PORT=502 diff --git a/modbus/modbus_tools/modbus_lib/modbus-tcp.cpp b/modbus/modbus_tools/modbus_lib/modbus-tcp.cpp index 6c305e6..6b131c2 100644 --- a/modbus/modbus_tools/modbus_lib/modbus-tcp.cpp +++ b/modbus/modbus_tools/modbus_lib/modbus-tcp.cpp @@ -371,7 +371,7 @@ static int _modbus_tcp_connect(modbus_t *ctx) return -1; } - return 0; + return ctx->s; } /* Establishes a modbus TCP PI connection with a Modbus server. */ diff --git a/modbus/modbus_tools/ysp_modbus_master.cpp b/modbus/modbus_tools/ysp_modbus_master.cpp index fc548bb..9df7994 100644 --- a/modbus/modbus_tools/ysp_modbus_master.cpp +++ b/modbus/modbus_tools/ysp_modbus_master.cpp @@ -1,6 +1,7 @@ #include #include "modbus_lib/modbus-tcp.h" #include "common.h" +#include "time.h" using namespace std; #define REG_ADDR (header_length+1) @@ -56,7 +57,7 @@ void xMaster_Set_slave_port(const char* tcp_port) DWORD WINAPI xModbus_master_Proc(LPVOID lp) { char* com = (char*)lp; CHAR rcv_buf[1024] = { 0 }; - int s = -1; + int sockt = -1; int i = 0; int rc = 0; modbus_t* ctx = NULL; @@ -69,6 +70,8 @@ DWORD WINAPI xModbus_master_Proc(LPVOID lp) { modbus_mapping_t* mb_mapping; int nb_points; uint16_t* tab_rp_registers = NULL; + fd_set fdset_ro, fdset_wr, fdset_ex; + struct timeval timeout; //Read the starting address of the holding register unsigned short start_hold_register = 0x0000;//读保持寄存器的起始地址 @@ -83,63 +86,105 @@ DWORD WINAPI xModbus_master_Proc(LPVOID lp) { } - if (use_backend == TCP) { - ctx = modbus_new_tcp(slave_ip_addr, slave_tcp_port); - //modbus_set_slave(ctx, SERVER_ID); - } + if (use_backend == TCP) { + ctx = modbus_new_tcp(slave_ip_addr, slave_tcp_port); + //modbus_set_slave(ctx, SERVER_ID); + } - modbus_set_response_timeout(ctx, 20, 0); - if (modbus_connect(ctx) == -1) { - fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); - modbus_free(ctx); + modbus_set_response_timeout(ctx, 20, 0); + sockt = modbus_connect(ctx); + if (sockt == -1) { + fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); + modbus_free(ctx); + return -1; + } + + unsigned char* src = (unsigned char*)tab_rp_registers; + while (1) + { +#if 0 + if (sockt < 0) return -1; + FD_ZERO(&fdset_ro); + FD_ZERO(&fdset_wr); + FD_ZERO(&fdset_ex); + FD_SET(sockt, &fdset_ro); + FD_SET(sockt, &fdset_wr); + FD_SET(sockt, &fdset_ex); + memset((char*)&timeout, 0, sizeof(struct timeval)); + if (select(sockt + 1, &fdset_ro, &fdset_wr, &fdset_ex, &timeout) < 1) + { + Sleep(1); + continue; + } + if (FD_ISSET(sockt, &fdset_ex)) + { + //printf("关闭tcp端口\n"); + closesocket(sockt); + sockt = -1; + break; } - - unsigned char* src = (unsigned char*)tab_rp_registers; - + if (FD_ISSET(sockt, &fdset_ro)) +#endif rc = modbus_read_registers(ctx, start_hold_register, number_regs, tab_rp_registers); +#if 0 + if (rc == -1) + { + closesocket(sockt); + sockt = -1; + printf("End Thread!\n"); + return -1; + } +#endif Sleep(3 * 1000); //xUnsigned_char_hex_out("recv", src, 0, number_regs*2); - xRead_reg_hex_out(start_hold_register,"master recv", src, 0, number_regs * 2); + xRead_reg_hex_out(start_hold_register, "master recv", src, 0, number_regs * 2); //int slave_addr = MODBUS_GET_INT32_FROM_INT16(tab_rp_registers, 0); //printf("slave_addr=%d\n", slave_addr); - + float H2 = modbus_get_float(tab_rp_registers); printf("H2=%f\n", H2); - float CO = modbus_get_float(tab_rp_registers+2); + float CO = modbus_get_float(tab_rp_registers + 2); printf("CO=%f\n", CO); - float CO2 = modbus_get_float(tab_rp_registers+4); + float CO2 = modbus_get_float(tab_rp_registers + 4); printf("CO2=%f\n", CO2); - float CH4 = modbus_get_float(tab_rp_registers+6); + float CH4 = modbus_get_float(tab_rp_registers + 6); printf("CH4=%f\n", CH4); - float C2H2 = modbus_get_float(tab_rp_registers+8); + float C2H2 = modbus_get_float(tab_rp_registers + 8); printf("C2H2=%f\n", C2H2); - float C2H4 = modbus_get_float(tab_rp_registers+10); + float C2H4 = modbus_get_float(tab_rp_registers + 10); printf("C2H4=%f\n", C2H4); - float C2H6 = modbus_get_float(tab_rp_registers+12); + float C2H6 = modbus_get_float(tab_rp_registers + 12); printf("C2H6=%f\n", C2H6); float total = modbus_get_float(tab_rp_registers + 14); printf("total=%f\n", total); - float water = modbus_get_float(tab_rp_registers+16); + float water = modbus_get_float(tab_rp_registers + 16); printf("water=%f\n", water); //xUnsigned_char_hex_out("recv", src, 36, 36+7); - int H32 = modbus_get_int(tab_rp_registers+18); + int H32 = modbus_get_int(tab_rp_registers + 18); printf("H32=%d\n", H32); - int L32 = modbus_get_int(tab_rp_registers+20); + int L32 = modbus_get_int(tab_rp_registers + 20); printf("L32=%d\n", L32); - time_t t = H32 << 32 | L32; + time_t t = H32 << 32 | L32; printf("t=%ld\n", t); + time_t now = time(NULL); + struct tm t0; + localtime_s(&t0, &now); + printf("收到数据时间是:%d年%d月%d日 %d时%d分%d秒\n", t0.tm_year + 1900, t0.tm_mon + 1, t0.tm_mday, t0.tm_hour, t0.tm_min, t0.tm_sec); + //printf("t=%d\n", (int)time(NULL)); //time_t t3 = 0x64F9 << 16 | 0x4204; //printf("t3=%ld\n", t3); //time_t t4 = 1694056964; //printf("%02x\n",t4); - while (1); + Sleep(15 * 1000); + } + //while (1); return 0;