diff --git a/camera.cpp b/camera.cpp index 21b306e..9ae11a1 100644 --- a/camera.cpp +++ b/camera.cpp @@ -5,7 +5,7 @@ #define GlobalDebug 0 // 全局是否允许打印Debug信息(打印会拖慢处理时间) #define DebugDetection 0 // 注意开启这个编译选项会导致图片存储, 处理时间会很慢 #define DebugDetectionTime 0 // 是否打印处理时间 -#define DebugLowerMacCOM 0 // 是否打印和下位机通讯的相关信息 +#define DebugLowerMacCOM 1 // 是否打印和下位机通讯的相关信息 camera::camera() {} diff --git a/cotton_double2.pro.user b/cotton_double2.pro.user index 79f8c93..618ba4a 100644 --- a/cotton_double2.pro.user +++ b/cotton_double2.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/libmodbus/modbus.c b/libmodbus/modbus.c index be98c4f..b22fff6 100644 --- a/libmodbus/modbus.c +++ b/libmodbus/modbus.c @@ -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) { - errno = MODBUS_ENOBASE + exception_code; - } else { - errno = EMBBADEXC; - } - _error_print(ctx, NULL); - return -1; - } else { - errno = EMBBADEXC; - _error_print(ctx, NULL); - return -1; - } + int exception_code = rsp[offset + 1]; + fprintf(stdout, "Modbus Exception Detected: Code = %d\n", exception_code); + errno = MODBUS_ENOBASE + exception_code; + 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", - rsp_length, rsp_length_computed); - } - if (ctx->error_recovery & MODBUS_ERROR_RECOVERY_PROTOCOL) { - _sleep_response_timeout(ctx); - modbus_flush(ctx); - } + fprintf(stdout, "Response Length Mismatch: received %d, expected %d\n", + rsp_length, rsp_length_computed); 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; diff --git a/widget.cpp b/widget.cpp index 816229a..09a6d2c 100644 --- a/widget.cpp +++ b/widget.cpp @@ -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;"