避免modbus连接失败。
This commit is contained in:
parent
cba4629927
commit
ad3ff333c7
@ -5,7 +5,7 @@
|
||||
#define GlobalDebug 0 // 全局是否允许打印Debug信息(打印会拖慢处理时间)
|
||||
#define DebugDetection 0 // 注意开启这个编译选项会导致图片存储, 处理时间会很慢
|
||||
#define DebugDetectionTime 0 // 是否打印处理时间
|
||||
#define DebugLowerMacCOM 0 // 是否打印和下位机通讯的相关信息
|
||||
#define DebugLowerMacCOM 1 // 是否打印和下位机通讯的相关信息
|
||||
|
||||
camera::camera() {}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE QtCreatorProject>
|
||||
<!-- Written by QtCreator 15.0.0, 2025-01-09T15:44:34. -->
|
||||
<!-- Written by QtCreator 15.0.0, 2025-01-09T18:48:16. -->
|
||||
<qtcreator>
|
||||
<data>
|
||||
<variable>EnvironmentId</variable>
|
||||
|
||||
@ -516,129 +516,194 @@ static int check_confirmation(modbus_t *ctx, uint8_t *req,
|
||||
const int offset = ctx->backend->header_length;
|
||||
const int function = rsp[offset];
|
||||
|
||||
if (ctx->backend->pre_check_confirmation) {
|
||||
rc = ctx->backend->pre_check_confirmation(ctx, req, rsp, rsp_length);
|
||||
if (rc == -1) {
|
||||
if (ctx->error_recovery & MODBUS_ERROR_RECOVERY_PROTOCOL) {
|
||||
_sleep_response_timeout(ctx);
|
||||
modbus_flush(ctx);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
fprintf(stdout, "Function Code Received: 0x%X\n", function);
|
||||
fprintf(stdout, "Received Response Length: %d\n", rsp_length);
|
||||
|
||||
rsp_length_computed = compute_response_length_from_request(ctx, req);
|
||||
fprintf(stdout, "Expected Response Length: %d\n", rsp_length_computed);
|
||||
|
||||
/* Exception code */
|
||||
/* 忽略 Transaction ID 检查 */
|
||||
fprintf(stdout, "Ignoring Transaction ID check.\n");
|
||||
|
||||
/* 检查 Function Code */
|
||||
if (function >= 0x80) {
|
||||
if (rsp_length == (offset + 2 + (int)ctx->backend->checksum_length) &&
|
||||
req[offset] == (rsp[offset] - 0x80)) {
|
||||
/* Valid exception code received */
|
||||
|
||||
int exception_code = rsp[offset + 1];
|
||||
if (exception_code < MODBUS_EXCEPTION_MAX) {
|
||||
fprintf(stdout, "Modbus Exception Detected: Code = %d\n", exception_code);
|
||||
errno = MODBUS_ENOBASE + exception_code;
|
||||
} else {
|
||||
errno = EMBBADEXC;
|
||||
}
|
||||
_error_print(ctx, NULL);
|
||||
return -1;
|
||||
} else {
|
||||
errno = EMBBADEXC;
|
||||
_error_print(ctx, NULL);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check length */
|
||||
if ((rsp_length == rsp_length_computed ||
|
||||
/* 检查 `rsp_length` 是否匹配 */
|
||||
if ((abs(rsp_length - rsp_length_computed) <= 2 ||
|
||||
rsp_length_computed == MSG_LENGTH_UNDEFINED) &&
|
||||
function < 0x80) {
|
||||
|
||||
int req_nb_value;
|
||||
int rsp_nb_value;
|
||||
|
||||
/* Check function code */
|
||||
if (function != req[offset]) {
|
||||
if (ctx->debug) {
|
||||
fprintf(stderr,
|
||||
"Received function not corresponding to the request (0x%X != 0x%X)\n",
|
||||
function, req[offset]);
|
||||
}
|
||||
if (ctx->error_recovery & MODBUS_ERROR_RECOVERY_PROTOCOL) {
|
||||
_sleep_response_timeout(ctx);
|
||||
modbus_flush(ctx);
|
||||
}
|
||||
errno = EMBBADDATA;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Check the number of values is corresponding to the request */
|
||||
/* 获取 `req_nb_value` 和 `rsp_nb_value` */
|
||||
switch (function) {
|
||||
case MODBUS_FC_READ_COILS:
|
||||
case MODBUS_FC_READ_DISCRETE_INPUTS:
|
||||
/* Read functions, 8 values in a byte (nb
|
||||
* of values in the request and byte count in
|
||||
* the response. */
|
||||
req_nb_value = (req[offset + 3] << 8) + req[offset + 4];
|
||||
req_nb_value = (req_nb_value / 8) + ((req_nb_value % 8) ? 1 : 0);
|
||||
rsp_nb_value = rsp[offset + 1];
|
||||
break;
|
||||
case MODBUS_FC_WRITE_AND_READ_REGISTERS:
|
||||
case MODBUS_FC_READ_HOLDING_REGISTERS:
|
||||
case MODBUS_FC_READ_INPUT_REGISTERS:
|
||||
/* Read functions 1 value = 2 bytes */
|
||||
req_nb_value = (req[offset + 3] << 8) + req[offset + 4];
|
||||
rsp_nb_value = (rsp[offset + 1] / 2);
|
||||
break;
|
||||
case MODBUS_FC_WRITE_MULTIPLE_COILS:
|
||||
case MODBUS_FC_WRITE_MULTIPLE_REGISTERS:
|
||||
/* N Write functions */
|
||||
req_nb_value = (req[offset + 3] << 8) + req[offset + 4];
|
||||
rsp_nb_value = (rsp[offset + 3] << 8) | rsp[offset + 4];
|
||||
break;
|
||||
case MODBUS_FC_REPORT_SLAVE_ID:
|
||||
/* Report slave ID (bytes received) */
|
||||
req_nb_value = rsp_nb_value = rsp[offset + 1];
|
||||
break;
|
||||
default:
|
||||
/* 1 Write functions & others */
|
||||
req_nb_value = rsp_nb_value = 1;
|
||||
}
|
||||
|
||||
if (req_nb_value == rsp_nb_value) {
|
||||
fprintf(stdout, "Request Register Count: %d, Response Register Count: %d\n",
|
||||
req_nb_value, rsp_nb_value);
|
||||
|
||||
/* 如果 `req_nb_value` 和 `rsp_nb_value` 不匹配,打印错误信息 */
|
||||
if (abs(req_nb_value - rsp_nb_value) <= 2) {
|
||||
rc = rsp_nb_value;
|
||||
} else {
|
||||
if (ctx->debug) {
|
||||
fprintf(stderr,
|
||||
"Quantity not corresponding to the request (%d != %d)\n",
|
||||
rsp_nb_value, req_nb_value);
|
||||
}
|
||||
|
||||
if (ctx->error_recovery & MODBUS_ERROR_RECOVERY_PROTOCOL) {
|
||||
_sleep_response_timeout(ctx);
|
||||
modbus_flush(ctx);
|
||||
}
|
||||
|
||||
fprintf(stdout, "Mismatch Detected: req_nb_value = %d, rsp_nb_value = %d\n",
|
||||
req_nb_value, rsp_nb_value);
|
||||
errno = EMBBADDATA;
|
||||
rc = -1;
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (ctx->debug) {
|
||||
fprintf(stderr,
|
||||
"Message length not corresponding to the computed length (%d != %d)\n",
|
||||
fprintf(stdout, "Response Length Mismatch: received %d, expected %d\n",
|
||||
rsp_length, rsp_length_computed);
|
||||
}
|
||||
if (ctx->error_recovery & MODBUS_ERROR_RECOVERY_PROTOCOL) {
|
||||
_sleep_response_timeout(ctx);
|
||||
modbus_flush(ctx);
|
||||
}
|
||||
errno = EMBBADDATA;
|
||||
rc = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
// static int check_confirmation(modbus_t *ctx, uint8_t *req,
|
||||
// uint8_t *rsp, int rsp_length)
|
||||
// {
|
||||
// int rc;
|
||||
// int rsp_length_computed;
|
||||
// const int offset = ctx->backend->header_length;
|
||||
// const int function = rsp[offset];
|
||||
|
||||
// if (ctx->backend->pre_check_confirmation) {
|
||||
// rc = ctx->backend->pre_check_confirmation(ctx, req, rsp, rsp_length);
|
||||
// if (rc == -1) {
|
||||
// if (ctx->error_recovery & MODBUS_ERROR_RECOVERY_PROTOCOL) {
|
||||
// _sleep_response_timeout(ctx);
|
||||
// modbus_flush(ctx);
|
||||
// }
|
||||
// return -1;
|
||||
// }
|
||||
// }
|
||||
|
||||
// rsp_length_computed = compute_response_length_from_request(ctx, req);
|
||||
|
||||
// /* Exception code */
|
||||
// if (function >= 0x80) {
|
||||
// if (rsp_length == (offset + 2 + (int)ctx->backend->checksum_length) &&
|
||||
// req[offset] == (rsp[offset] - 0x80)) {
|
||||
// /* Valid exception code received */
|
||||
|
||||
// int exception_code = rsp[offset + 1];
|
||||
// if (exception_code < MODBUS_EXCEPTION_MAX) {
|
||||
// errno = MODBUS_ENOBASE + exception_code;
|
||||
// } else {
|
||||
// errno = EMBBADEXC;
|
||||
// }
|
||||
// _error_print(ctx, NULL);
|
||||
// return -1;
|
||||
// } else {
|
||||
// errno = EMBBADEXC;
|
||||
// _error_print(ctx, NULL);
|
||||
// return -1;
|
||||
// }
|
||||
// }
|
||||
|
||||
// /* Check length */
|
||||
// if ((rsp_length == rsp_length_computed ||
|
||||
// rsp_length_computed == MSG_LENGTH_UNDEFINED) &&
|
||||
// function < 0x80) {
|
||||
// int req_nb_value;
|
||||
// int rsp_nb_value;
|
||||
|
||||
// /* Check function code */
|
||||
// if (function != req[offset]) {
|
||||
// if (ctx->debug) {
|
||||
// fprintf(stderr,
|
||||
// "Received function not corresponding to the request (0x%X != 0x%X)\n",
|
||||
// function, req[offset]);
|
||||
// }
|
||||
// if (ctx->error_recovery & MODBUS_ERROR_RECOVERY_PROTOCOL) {
|
||||
// _sleep_response_timeout(ctx);
|
||||
// modbus_flush(ctx);
|
||||
// }
|
||||
// errno = EMBBADDATA;
|
||||
// return -1;
|
||||
// }
|
||||
|
||||
// /* Check the number of values is corresponding to the request */
|
||||
// switch (function) {
|
||||
// case MODBUS_FC_READ_COILS:
|
||||
// case MODBUS_FC_READ_DISCRETE_INPUTS:
|
||||
// /* Read functions, 8 values in a byte (nb
|
||||
// * of values in the request and byte count in
|
||||
// * the response. */
|
||||
// req_nb_value = (req[offset + 3] << 8) + req[offset + 4];
|
||||
// req_nb_value = (req_nb_value / 8) + ((req_nb_value % 8) ? 1 : 0);
|
||||
// rsp_nb_value = rsp[offset + 1];
|
||||
// break;
|
||||
// case MODBUS_FC_WRITE_AND_READ_REGISTERS:
|
||||
// case MODBUS_FC_READ_HOLDING_REGISTERS:
|
||||
// case MODBUS_FC_READ_INPUT_REGISTERS:
|
||||
// /* Read functions 1 value = 2 bytes */
|
||||
// req_nb_value = (req[offset + 3] << 8) + req[offset + 4];
|
||||
// rsp_nb_value = (rsp[offset + 1] / 2);
|
||||
// break;
|
||||
// case MODBUS_FC_WRITE_MULTIPLE_COILS:
|
||||
// case MODBUS_FC_WRITE_MULTIPLE_REGISTERS:
|
||||
// /* N Write functions */
|
||||
// req_nb_value = (req[offset + 3] << 8) + req[offset + 4];
|
||||
// rsp_nb_value = (rsp[offset + 3] << 8) | rsp[offset + 4];
|
||||
// break;
|
||||
// case MODBUS_FC_REPORT_SLAVE_ID:
|
||||
// /* Report slave ID (bytes received) */
|
||||
// req_nb_value = rsp_nb_value = rsp[offset + 1];
|
||||
// break;
|
||||
// default:
|
||||
// /* 1 Write functions & others */
|
||||
// req_nb_value = rsp_nb_value = 1;
|
||||
// }
|
||||
|
||||
// if (req_nb_value == rsp_nb_value) {
|
||||
// rc = rsp_nb_value;
|
||||
// } else {
|
||||
// if (ctx->debug) {
|
||||
// fprintf(stderr,
|
||||
// "Quantity not corresponding to the request (%d != %d)\n",
|
||||
// rsp_nb_value, req_nb_value);
|
||||
// }
|
||||
|
||||
// if (ctx->error_recovery & MODBUS_ERROR_RECOVERY_PROTOCOL) {
|
||||
// _sleep_response_timeout(ctx);
|
||||
// modbus_flush(ctx);
|
||||
// }
|
||||
|
||||
// errno = EMBBADDATA;
|
||||
// rc = -1;
|
||||
// }
|
||||
// } else {
|
||||
// if (ctx->debug) {
|
||||
// fprintf(stderr,
|
||||
// "Message length not corresponding to the computed length (%d != %d)\n",
|
||||
// rsp_length, rsp_length_computed);
|
||||
// }
|
||||
// if (ctx->error_recovery & MODBUS_ERROR_RECOVERY_PROTOCOL) {
|
||||
// _sleep_response_timeout(ctx);
|
||||
// modbus_flush(ctx);
|
||||
// }
|
||||
// errno = EMBBADDATA;
|
||||
// rc = -1;
|
||||
// }
|
||||
|
||||
// return rc;
|
||||
// }
|
||||
|
||||
static int response_io_status(uint8_t *tab_io_status,
|
||||
int address, int nb,
|
||||
uint8_t *rsp, int offset)
|
||||
@ -1363,12 +1428,13 @@ int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src)
|
||||
|
||||
if (ctx == NULL) {
|
||||
errno = EINVAL;
|
||||
fprintf(stdout, "Error context is null");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (nb > MODBUS_MAX_WRITE_REGISTERS) {
|
||||
if (ctx->debug) {
|
||||
fprintf(stderr,
|
||||
fprintf(stdout,
|
||||
"ERROR Trying to write to too many registers (%d > %d)\n",
|
||||
nb, MODBUS_MAX_WRITE_REGISTERS);
|
||||
}
|
||||
@ -1392,10 +1458,16 @@ int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src)
|
||||
uint8_t rsp[MAX_MESSAGE_LENGTH];
|
||||
|
||||
rc = _modbus_receive_msg(ctx, rsp, MSG_CONFIRMATION);
|
||||
if (rc == -1)
|
||||
if (rc == -1){
|
||||
fprintf(stdout, "Error return receive message rc=%d. \n", rc);
|
||||
return -1;
|
||||
|
||||
}
|
||||
rc = check_confirmation(ctx, req, rsp, rc);
|
||||
if (rc == -1){
|
||||
fprintf(stdout, "Writing %d registers to addr %d\n", nb, addr);
|
||||
fprintf(stdout, "Confirmation is actually rc = %d. \n", rc);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
|
||||
@ -148,6 +148,7 @@ void Widget::heart_beat()
|
||||
{
|
||||
if(!this->plc_connector->try_connect()){
|
||||
// 未连接的情况下尝试连接失败,设置 lab_plc 为红色
|
||||
qDebug() << "Try to connect to the PLC";
|
||||
this->ui->lab_plc->setStyleSheet(
|
||||
"QLabel{"
|
||||
"background-color: red;"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user