[C++] 纯文本查看 复制代码 // 解析响应帧的函数
void parseResponse(unsigned char* response, size_t responseLength) {
// 检查响应长度是否足够
if (responseLength < 12) {
std::cout << "响应长度不足,解析失败。" << std::endl;
return;
}
// 获取响应数据长度,包含状态位 2 应减去2得到实际长度
unsigned int dataLength = (static_cast<unsigned int>(response[8]) << 8) | response[7];
// 获取结束代码,0代表无错
unsigned int endCode = (static_cast<unsigned int>(response[10]) << 8) | response[9];
if (endCode != 0) {
// 出错,弹出包含错误代码的消息框
char errorMessage[50];
sprintf_s(errorMessage, "操作出错,错误代码: 0x%04X", endCode);
MessageBoxA(NULL, errorMessage, "错误", MB_OK | MB_ICONERROR);
}
else {
// 正确,输出接收到的值
std::cout << "操作成功,接收到的值如下:" << std::endl;
for (size_t i = 11; i < 11 + dataLength * 2 && i < responseLength; i += 2) {
short value = static_cast<short>((response[i + 1] << 8) | response);
std::cout << std::dec << value << " ";
}
std::cout << std::endl;
}
}
// 构造请求指令的函数
std::vector<unsigned char> constructRequestCommand(const std::string& softElement, short length, short waitTime, unsigned int startAddress) {
std::vector<unsigned char> request;
// 副头部
request.push_back(0x50);
request.push_back(0x00);
// 网络编号
request.push_back(0x00);
// PLC 编号
request.push_back(0xFF);
// IO 编号
request.push_back(0xFF);
request.push_back(0x03);
// 模块站号
request.push_back(0x00);
//请求数据长度
request.push_back(0x00);
request.push_back(0x00);
// 时钟(等待时间),拆分为低位和高位
request.push_back(waitTime & 0xFF);
request.push_back((waitTime >> 8) & 0xFF);
// 指令
request.push_back(0x01);
request.push_back(0x04);
// 子指令
request.push_back(0x00);
request.push_back(0x00);
// 首地址,拆分为三个字节
request.push_back(startAddress & 0xFF);
request.push_back((startAddress >> 8) & 0xFF);
request.push_back((startAddress >> 16) & 0xFF);
// 软元件,根据输入字符串转换
unsigned char softElementCode = 0;
if (softElement == "D") {
softElementCode = 0xA8;
}
request.push_back(softElementCode);
// 长度,拆分为低位和高位
request.push_back(length & 0xFF);
request.push_back((length >> 8) & 0xFF);
// 计算请求数据长度
unsigned short dataLength = static_cast<unsigned short>(request.size() - 9);
request[7]= dataLength & 0xFF;
request[8]= dataLength >> 8;
return request;
}
|