|
|
@@ -101,10 +101,10 @@ SOCKET Init_client(string IP, unsigned int Port_number) |
|
|
|
cout << "尝试连接TCP从站失败" << endl; |
|
|
|
} |
|
|
|
cout << "连接TCP从站成功" << endl; |
|
|
|
TIMEVAL timeout; |
|
|
|
timeout.tv_sec = 2000; //ms |
|
|
|
timeout.tv_usec = 0; //us |
|
|
|
setsockopt(ClientSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));//设置接收超时时间 |
|
|
|
//TIMEVAL timeout; |
|
|
|
//timeout.tv_sec = 2000; //ms |
|
|
|
//timeout.tv_usec = 0; //us |
|
|
|
//setsockopt(ClientSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));//设置接收超时时间 |
|
|
|
return ClientSocket; |
|
|
|
} |
|
|
|
|
|
|
@@ -134,33 +134,69 @@ void Clear_recv_buf(SOCKET clientSocket) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void Printf_Coil_date(UINT8 *Response_Message) |
|
|
|
void Printf_Coil_date(UINT8 *Response_Message, UINT8 *Request_Message) |
|
|
|
{ |
|
|
|
|
|
|
|
printf("从站设备ID %02X 功能码为 %02X\n", Response_Message[6], Response_Message[7]); |
|
|
|
unsigned int temp1 = ((Request_Message[8] << 8) | Request_Message[9])+1; |
|
|
|
unsigned int Number = ((Request_Message[10] << 8) | Request_Message[11]); |
|
|
|
printf("线圈起始地址为%d \n",temp1); |
|
|
|
unsigned int temp = temp1; |
|
|
|
for (int i = 0; i < Response_Message[8]; i++) |
|
|
|
{ |
|
|
|
unsigned int temp2 = temp + 7; |
|
|
|
if (temp2 > temp1 + Number - 1) |
|
|
|
temp2 = temp1 + Number - 1; |
|
|
|
printf("线圈第%d --- %d的状态为:%02X \n", temp2, temp, Response_Message[9+i]); |
|
|
|
temp = temp + 8; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void Printf_Register_date(UINT8 *Response_Message) |
|
|
|
void Printf_Register_date(UINT8 *Response_Message, UINT8 *Request_Message) |
|
|
|
{ |
|
|
|
printf("从站设备ID %02X 功能码为 %02X\n", Response_Message[6], Response_Message[7]); |
|
|
|
unsigned int temp1 = ((Request_Message[8] << 8) | Request_Message[9]) + 1; |
|
|
|
unsigned int Number = ((Request_Message[10] << 8) | Request_Message[11]); |
|
|
|
printf("寄存器起始地址为%d \n", temp1); |
|
|
|
for (int i = 0; i < Response_Message[8]; i = i + 2) |
|
|
|
{ |
|
|
|
printf("寄存器第%d的值为:%02X %02X \n", temp1++, Response_Message[9 + i], Response_Message[10+i]); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
void Printf_Anomaly_date(UINT8 *Response_Message) |
|
|
|
{ |
|
|
|
|
|
|
|
UINT8 a = Response_Message[8]; |
|
|
|
printf("从站设备ID %02X 功能码为 %02X\n", Response_Message[6], Response_Message[7]); |
|
|
|
switch (a) |
|
|
|
{ |
|
|
|
case 0x01: printf("%02X : 从站设备不支持此功能码",a); break; |
|
|
|
case 0x02: printf("%02X : 指定的数据地址在从站设备中不存在",a); break; |
|
|
|
case 0x03: printf("%02X : 指定的数据超过范围或者不允许使用",a); break; |
|
|
|
case 0x04: printf("%02X : 从站设备处理响应的过程中,出现未知错误等",a); break; |
|
|
|
default: printf("Unkown Other Error!!!!!"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
k |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool Analysis_Response_Message(UINT8 *Response_Message, UINT8 *Request_Message, int Response_Message_len) |
|
|
|
{ |
|
|
|
if (Response_Message[7] == Request_Message[7] + 0x80 && Response_Message_len == 9)//先处理异常响应 |
|
|
|
{ |
|
|
|
|
|
|
|
Printf_Anomaly_date(Response_Message); |
|
|
|
return true; |
|
|
|
} |
|
|
|
else if (Response_Message[6] == Request_Message[6] && Response_Message_len - 5 == Response_Message[5]) //判断是否是正常响应帧 |
|
|
|
{ |
|
|
|
|
|
|
|
if (Response_Message[7] == 0x01) |
|
|
|
Printf_Coil_date(Response_Message, Request_Message); |
|
|
|
if (Response_Message[7] == 0x03) |
|
|
|
Printf_Register_date(Response_Message, Request_Message); |
|
|
|
if (Response_Message[7] == 0x10) |
|
|
|
printf("成功写入从站线圈%d个", ((Request_Message[10] << 8) | Request_Message[11])); |
|
|
|
if (Response_Message[7] == 0x0F) |
|
|
|
printf("成功写入从站寄存器%d个" ,((Request_Message[10] << 8) | Request_Message[11])); |
|
|
|
return true; |
|
|
|
} |
|
|
|
return false; |
|
|
@@ -197,18 +233,22 @@ bool Tcp_client(string IP, unsigned int Port_number) |
|
|
|
printf("%02x ", Request_Message[i]); |
|
|
|
} |
|
|
|
printf("\n"); |
|
|
|
Log_Note(Request_Message, 1, Message_len); |
|
|
|
Clear_recv_buf(ClientSocket); |
|
|
|
send(ClientSocket, (char*)Request_Message, Message_len, 0); |
|
|
|
memset(Response_Message, 0, 260); |
|
|
|
int ret = recv(ClientSocket, (char*)Response_Message, 260, 0); |
|
|
|
if (ret > 0) |
|
|
|
{ |
|
|
|
Log_Note(Response_Message, 0, ret); |
|
|
|
printf("从站响应 :"); |
|
|
|
for (int i = 0; i < ret; i++) |
|
|
|
{ |
|
|
|
printf("%02x ", Response_Message[i]); |
|
|
|
} |
|
|
|
printf("\n"); |
|
|
|
if (Analysis_Response_Message(Response_Message, Request_Message, ret)) |
|
|
|
printf("响应报文异常\n\n"); |
|
|
|
} |
|
|
|
else |
|
|
|
cout << "响应超时" << endl; |
|
|
|