增加网络异常退出判断

main
huyizhong 12 months ago
parent 4d5d66268b
commit 03722cdf1b

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio 15
VisualStudioVersion = 17.7.34018.315 VisualStudioVersion = 15.0.34112.143
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iedModbus_mgr", "iedModbus_mgr\iedModbus_mgr.vcxproj", "{01724C4F-628B-45B7-B0FF-B147D6D9D921}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iedModbus_mgr", "iedModbus_mgr\iedModbus_mgr.vcxproj", "{01724C4F-628B-45B7-B0FF-B147D6D9D921}"
EndProject EndProject
@ -13,8 +13,8 @@ Global
Release|x86 = Release|x86 Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{01724C4F-628B-45B7-B0FF-B147D6D9D921}.Debug|x64.ActiveCfg = Debug|x64 {01724C4F-628B-45B7-B0FF-B147D6D9D921}.Debug|x64.ActiveCfg = Release|Win32
{01724C4F-628B-45B7-B0FF-B147D6D9D921}.Debug|x64.Build.0 = Debug|x64 {01724C4F-628B-45B7-B0FF-B147D6D9D921}.Debug|x64.Build.0 = Release|Win32
{01724C4F-628B-45B7-B0FF-B147D6D9D921}.Debug|x86.ActiveCfg = Debug|Win32 {01724C4F-628B-45B7-B0FF-B147D6D9D921}.Debug|x86.ActiveCfg = Debug|Win32
{01724C4F-628B-45B7-B0FF-B147D6D9D921}.Debug|x86.Build.0 = Debug|Win32 {01724C4F-628B-45B7-B0FF-B147D6D9D921}.Debug|x86.Build.0 = Debug|Win32
{01724C4F-628B-45B7-B0FF-B147D6D9D921}.Release|x64.ActiveCfg = Release|x64 {01724C4F-628B-45B7-B0FF-B147D6D9D921}.Release|x64.ActiveCfg = Release|x64

@ -29,7 +29,7 @@ int main(int argc, char** argv)
xProcess_unique(); xProcess_unique();
std::cout << "RUN YSP MONITOR APP! V1.11-x86\n"; std::cout << "RUN YSP MONITOR APP! V1.12-x86\n";
#if 1 //com_test 用来开发测试 发布时不起作用 #if 1 //com_test 用来开发测试 发布时不起作用
if (argc > 1) { if (argc > 1) {

@ -1,5 +1,5 @@
[MODBUS] [MODBUS]
SLAVE_IP_ADDR=192.168.50.154 SLAVE_IP_ADDR=192.168.50.155
SLAVE_PORT=502 SLAVE_PORT=502
[ALERT] [ALERT]
H2_THRESHOLD = 120 H2_THRESHOLD = 120
@ -18,5 +18,5 @@ C2H4_alert=1
C2H6_alert=1 C2H6_alert=1
[MONITOR] [MONITOR]
GAS_MONITOR_PERIOD = 1 GAS_MONITOR_PERIOD = 33

@ -2,6 +2,8 @@
#include "modbus_lib/modbus-tcp.h" #include "modbus_lib/modbus-tcp.h"
#include "ysp_modbus_slave.h" #include "ysp_modbus_slave.h"
#include "database/database.h" #include "database/database.h"
# include <winsock2.h>
# include <ws2tcpip.h>
using namespace std; using namespace std;
#define REG_ADDR (header_length+1) #define REG_ADDR (header_length+1)
@ -9,7 +11,7 @@ using namespace std;
#define REG_VAL (header_length+3) #define REG_VAL (header_length+3)
#define IP_LOCAL_ADDR "192.168.1.21" #define IP_LOCAL_ADDR "192.168.1.21"
#define TCP_PORT 1502 #define TCP_PORT 502
#define MODBUS_UART "COM3" //爱尔兰项目用不到 uart modbus #define MODBUS_UART "COM3" //爱尔兰项目用不到 uart modbus
#define SERVER_ID 0x00000001 //默认从机地址 #define SERVER_ID 0x00000001 //默认从机地址
#define SLAVE_REG_ADDR 0x008E //从机modbus 地址的寄存器地址 #define SLAVE_REG_ADDR 0x008E //从机modbus 地址的寄存器地址
@ -67,7 +69,7 @@ void xSet_slave_port(const char* tcp_port)
DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) { DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) {
char* com = (char*)lp; char* com = (char*)lp;
CHAR rcv_buf[1024] = { 0 }; CHAR rcv_buf[1024] = { 0 };
int s = -1; int s = -1,sockt=-1,extrasock=-1;
int i = 0; int i = 0;
int rc = 0; int rc = 0;
modbus_t* ctx = NULL; modbus_t* ctx = NULL;
@ -78,7 +80,11 @@ DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) {
uint16_t reg_addr, reg_val, reg_num; uint16_t reg_addr, reg_val, reg_num;
uint16_t tmp = 0; uint16_t tmp = 0;
modbus_mapping_t* mb_mapping; modbus_mapping_t* mb_mapping;
fd_set fdset_ro, fdset_wr, fdset_ex;
struct timeval timeout;
struct sockaddr_in addr;
socklen_t addrlen;
//struct tcp_info info;
/* /*
master master
@ -90,7 +96,7 @@ DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) {
//modbus_set_slave(ctx, SERVER_ID); //modbus_set_slave(ctx, SERVER_ID);
} }
else if (use_backend == TCP_PI) { else if (use_backend == TCP_PI) {
ctx = modbus_new_tcp_pi(slave_ip_addr, "1502"); ctx = modbus_new_tcp_pi(slave_ip_addr, "502");
} }
else { else {
ctx = modbus_new_rtu(MODBUS_UART, 115200, 'N', 8, 1); ctx = modbus_new_rtu(MODBUS_UART, 115200, 'N', 8, 1);
@ -109,7 +115,9 @@ DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) {
modbus_free(ctx); modbus_free(ctx);
return -1; return -1;
} }
for(;;){
if (use_backend == TCP) { if (use_backend == TCP) {
if (s < 0) {
std::cout << "modbus start listen\n" << std::endl; std::cout << "modbus start listen\n" << std::endl;
s = modbus_tcp_listen(ctx, 1); s = modbus_tcp_listen(ctx, 1);
if (-1 == s) { if (-1 == s) {
@ -117,39 +125,114 @@ DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) {
return -1; return -1;
} }
} }
}
else if (use_backend == TCP_PI) { else if (use_backend == TCP_PI) {
if (s < 0) {
s = modbus_tcp_pi_listen(ctx, 1); s = modbus_tcp_pi_listen(ctx, 1);
} }
else {
#if 0
rc = modbus_connect(ctx);
if (rc == -1) {
fprintf(stderr, "Unable to connect %s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
#endif
} }
for (;;) { for (;;) {
if (use_backend == TCP) { if (use_backend == TCP) {
if (s < 0)
break;
FD_ZERO(&fdset_ro);
FD_ZERO(&fdset_wr);
FD_ZERO(&fdset_ex);
FD_SET(s, &fdset_ro);
FD_SET(s, &fdset_wr);
FD_SET(s, &fdset_ex);
memset((char*)&timeout, 0, sizeof(struct timeval));
if (select(s + 1, &fdset_ro, &fdset_wr, &fdset_ex, &timeout) < 1)
{
Sleep(1);
continue;
}
if (FD_ISSET(s, &fdset_ex))
{
//printf("关闭服务器端口\n");
closesocket(s);
s = -1;
break;
}
else if (FD_ISSET(s, &fdset_ro))
{
std::cout << std::endl << "modbus accept wait connect (hold)\n" << std::endl; std::cout << std::endl << "modbus accept wait connect (hold)\n" << std::endl;
modbus_tcp_accept(ctx, &s); sockt = modbus_tcp_accept(ctx, &s);
std::cout << "modbus accept new connect\n" << std::endl; std::cout << "modbus accept new connect\n" << std::endl;
} }
}
else if (use_backend == TCP_PI) { else if (use_backend == TCP_PI) {
modbus_tcp_pi_accept(ctx, &s); modbus_tcp_pi_accept(ctx, &s);
} }
std::cout << "modbus receive loop\n" << std::endl;
for (;;) {//循环接受消息
#if 1
if (s < 0)
break;
FD_ZERO(&fdset_ro);
FD_ZERO(&fdset_wr);
FD_ZERO(&fdset_ex);
FD_SET(s, &fdset_ro);
FD_SET(s, &fdset_wr);
FD_SET(s, &fdset_ex);
memset((char*)&timeout, 0, sizeof(struct timeval));
if (select(s + 1, &fdset_ro, &fdset_wr, &fdset_ex, &timeout) < 1)
{
//Sleep(1);
//continue; /* 此时不能continue了*/
}else if (FD_ISSET(s, &fdset_ex))
{
//printf("关闭服务器端口\n");
closesocket(s);
s = -1;
break;
}
else if (FD_ISSET(s, &fdset_ro))// accept(*s, (struct sockaddr *) &addr, &addrlen);
#endif
{
//std::cout << std::endl << "second accept wait connect (hold)\n" << std::endl;
extrasock = accept(s, (struct sockaddr *) &addr, &addrlen);
//std::cout << "second accept new connect\n" << std::endl;
if (extrasock < 0)
;
else { else {
rc = modbus_connect(ctx); if (sockt < 0) {
if (rc == -1) { sockt = extrasock;
fprintf(stderr, "Unable to connect %s\n", modbus_strerror(errno)); extrasock = -1;
modbus_free(ctx);
return -1;
} }
else {
closesocket(extrasock);
extrasock = -1;
} }
std::cout << "modbus receive loop\n" << std::endl; }
for (;;) {//循环接受消息 }
if (NULL == ctx)
return 0;
if (0 > sockt)
break;
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("关闭套接字\n");
closesocket(sockt);
sockt = -1;
break;
}
if (FD_ISSET(sockt, &fdset_ro)) // 可读
{
do { do {
rc = modbus_receive(ctx, query); rc = modbus_receive(ctx, query);
/* Filtered queries return 0 */ /* Filtered queries return 0 */
@ -159,6 +242,8 @@ DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) {
bad CRC in RTU. */ bad CRC in RTU. */
if (rc == -1 && errno != EMBBADCRC) { if (rc == -1 && errno != EMBBADCRC) {
/* Quit */ /* Quit */
closesocket(sockt);
sockt = -1;
std::cout << "error once connect over 1" << std::endl; std::cout << "error once connect over 1" << std::endl;
break; break;
} }
@ -171,11 +256,31 @@ DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) {
} }
else else
{ {
closesocket(sockt);
sockt = -1;
std::cout << "parse modbus frame error: %s\n" << std::endl; std::cout << "parse modbus frame error: %s\n" << std::endl;
std::cout << "error once connect over 2" << std::endl; std::cout << "error once connect over 2" << std::endl;
break; break;
} }
} }
}
else
{
//int len = sizeof(info);
//getsockopt(sockt, IPPROTO_TCP, TCP_INFO, &info, (socklen t *)&len);if (info.tcpi state == TCP CLOSE WAIT && info.tcpi state != TCP ESTABLISHED)
rc = recv(sockt, rcv_buf, 1,0);
if (rc <= 0)
{
if (errno == ETIMEDOUT)
{
closesocket(sockt);
sockt = -1;
printf("Client TCP may unexpectedly interrupt!\n");
}
}
continue;
}
std::cout << "modbus new msg\n" << std::endl; std::cout << "modbus new msg\n" << std::endl;
switch (query[header_length]) switch (query[header_length])
{ {
@ -197,7 +302,7 @@ DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) {
{ {
printf("reg vaild\n"); printf("reg vaild\n");
//读取实时数据 //读取实时数据
if ((MODBUS_GET_INT16_FROM_INT8(query, REG_ADDR) + MODBUS_GET_INT16_FROM_INT8(query, REG_NUM)) > (sizeof(ysp_modbus_regs_t) / 2)+ (sizeof(slave_add_t) / 2)) if ((MODBUS_GET_INT16_FROM_INT8(query, REG_ADDR) + MODBUS_GET_INT16_FROM_INT8(query, REG_NUM)) > (sizeof(ysp_modbus_regs_t) / 2) + (sizeof(slave_add_t) / 2))
{ {
printf("reply to this special register address by an exception\n"); printf("reply to this special register address by an exception\n");
//否定应答 //否定应答
@ -219,7 +324,7 @@ DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) {
} }
ptr1 = (uint16_t*)&salve_addr; ptr1 = (uint16_t*)&salve_addr;
mb_mapping->tab_registers[i] = ptr1[1];//i越小越先传输 mb_mapping->tab_registers[i] = ptr1[1];//i越小越先传输
mb_mapping->tab_registers[i+1] = ptr1[0];//ptr1[0] 里存的是低地址数据 mb_mapping->tab_registers[i + 1] = ptr1[0];//ptr1[0] 里存的是低地址数据
//mb_mapping->tab_registers[i] =0x3344; //mb_mapping->tab_registers[i] =0x3344;
//mb_mapping->tab_registers[i+1] = 0x5566; //mb_mapping->tab_registers[i+1] = 0x5566;
} }
@ -235,7 +340,7 @@ DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) {
printf("function code 0x06\n"); printf("function code 0x06\n");
reg_addr = MODBUS_GET_INT16_FROM_INT8(query, REG_ADDR); reg_addr = MODBUS_GET_INT16_FROM_INT8(query, REG_ADDR);
reg_val = MODBUS_GET_INT16_FROM_INT8(query, REG_VAL); reg_val = MODBUS_GET_INT16_FROM_INT8(query, REG_VAL);
printf( "reg_addr=%d reg_val=0x%04x\n", reg_addr, reg_val); printf("reg_addr=%d reg_val=0x%04x\n", reg_addr, reg_val);
if (reg_addr == SLAVE_REG_ADDR) if (reg_addr == SLAVE_REG_ADDR)
{ {
printf("modify slave address succ\n"); printf("modify slave address succ\n");
@ -259,6 +364,7 @@ DWORD WINAPI xModbus_msg_ThreadProc(LPVOID lp) {
break; break;
} }
} }
}
} }

Loading…
Cancel
Save