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