From a116f3f4505cdb25ffabd4871f8cb244f055f344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D1=8F=D1=87=D0=B5=D1=81=D0=BB=D0=B0=D0=B2=20=D0=A8?= =?UTF-8?q?=D1=82=D0=B5=D0=B9=D0=B1=D0=B5=D0=B7=D0=B0=D0=BD=D0=B4=D1=82?= Date: Fri, 27 Feb 2026 13:45:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2=20GAS?= =?UTF-8?q?=20=D0=B8=20Error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Inc/requester.h | 3 +++ Core/Src/requester.c | 54 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/Core/Inc/requester.h b/Core/Inc/requester.h index c9ca2d1..18708f9 100644 --- a/Core/Inc/requester.h +++ b/Core/Inc/requester.h @@ -318,6 +318,9 @@ void CanRequestToDiscreteReset(struct RXMsg _rxMsg); void CanRequestToDiscreteChangeMode(struct RXMsg _rxMsg); void CanRequestToDiscreteRequestListOfParameters(struct RXMsg _rxMsg); +void REQUESTER_GeneralAddressSpace_Answer(struct RXMsg _rxMsg); +HAL_StatusTypeDef CanRequestError(struct RXMsg _rxMsg); + CRR_Status REQUESTER_ModbusProcessing(struct RXMsg _rxMsg); HAL_StatusTypeDef CanRequestToModbusCoil(struct RXMsg _rxMsg); HAL_StatusTypeDef CanRequestToModbusDiscrete(struct RXMsg _rxMsg); diff --git a/Core/Src/requester.c b/Core/Src/requester.c index 8ebc378..29719d0 100644 --- a/Core/Src/requester.c +++ b/Core/Src/requester.c @@ -67,7 +67,7 @@ void REQUESTER_MainWhile(void) } else if(rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_GENERAL_ADDRESS_SPACE) { - + REQUESTER_GeneralAddressSpace_Answer(rxMsg[CurrentStep]); } else if(rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_MODBUS_COIL || rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_MODBUS_DISCRETE || @@ -76,6 +76,10 @@ void REQUESTER_MainWhile(void) { REQUESTER_ModbusProcessing(rxMsg[CurrentStep]); } + else if(rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_ERROR) + { + CanRequestError(rxMsg[CurrentStep]); + } CurrentStep = (uint16_t)(CurrentStep + 1) % CAN_RX_BUFFER_SIZE; } } @@ -450,6 +454,34 @@ __weak void CanRequestToDiscreteRequestListOfParameters(struct RXMsg _rxMsg) return; } + +void REQUESTER_GeneralAddressSpace_Answer(struct RXMsg _rxMsg) +{ + CAN_TxHeaderTypeDef TxHeader; + uint32_t TxMailBox = 0; + uint8_t data[8]; + TxHeader.IDE = CAN_ID_EXT; + TxHeader.TransmitGlobalTime = DISABLE; + TxHeader.RTR = CAN_RTR_DATA; + extID tmp_eID; + tmp_eID.BitAll = _rxMsg.eID.BitAll; + tmp_eID.Fields.Route = ROUTE_SLAVE; + TxHeader.ExtId = tmp_eID.BitAll; + TxHeader.DLC = 8; + data[0] = 'G'; + data[1] = 'A'; + data[2] = 'S'; + data[3] = '-'; + for(int i = 0; i < 4; i++) { + unsigned sym = (_rxMsg.eID.Fields.Msg.Body>>(12-(i*4)))&0xF; + if(sym >= 10) + data[4+i] = sym%10+'A'; + else + data[4+i] = sym+'0'; + } + HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox); +} + /** * @brief Функция обработки Modbus запросов. * @param struct RXMsg _rxMsg - структура для полученного сообщения. @@ -580,6 +612,26 @@ __weak HAL_StatusTypeDef CanRequestToModbusInput(struct RXMsg _rxMsg) return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox); } +__weak HAL_StatusTypeDef CanRequestError(struct RXMsg _rxMsg) +{ + CAN_TxHeaderTypeDef TxHeader; + uint32_t TxMailBox = 0; + uint8_t data[8]; + TxHeader.IDE = CAN_ID_EXT; + TxHeader.TransmitGlobalTime = DISABLE; + TxHeader.RTR = CAN_RTR_DATA; + extID tmp_eID; + tmp_eID.BitAll = _rxMsg.eID.BitAll; + tmp_eID.Fields.Route = ROUTE_SLAVE; + tmp_eID.Fields.MsgType = DATA_TYPE_ERROR; + tmp_eID.Fields.Msg.Error.ErrorCode = 0xFF; + tmp_eID.Fields.Msg.Error.Info = 0; + TxHeader.ExtId = tmp_eID.BitAll; + TxHeader.DLC = 0; + return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox); +} + + /** * @brief * @param extID tmp_eID