Новая версия протокола CAN.
Пока без ответа на запрос в общее адресное пространство.
This commit is contained in:
@@ -26,7 +26,10 @@
|
|||||||
|
|
||||||
//CAN Filter
|
//CAN Filter
|
||||||
#define ID_MAIN_DEVICE 0x000
|
#define ID_MAIN_DEVICE 0x000
|
||||||
#define CURRENT_ID_DEVICE 0x002
|
|
||||||
|
#define CURRENT_TYPE_DEVICE 0b001
|
||||||
|
#define CURRENT_ID_DEVICE 0b0010
|
||||||
|
|
||||||
#define CAN_IDE_32 0b00000100 // Для 32-х битного масштаба
|
#define CAN_IDE_32 0b00000100 // Для 32-х битного масштаба
|
||||||
|
|
||||||
#define CAN_DATA_TYPE_FILTER 0x1F000000
|
#define CAN_DATA_TYPE_FILTER 0x1F000000
|
||||||
@@ -34,7 +37,7 @@
|
|||||||
#define CAN_SENSOR_TYPE_FILTER 0x00F80000
|
#define CAN_SENSOR_TYPE_FILTER 0x00F80000
|
||||||
#define CAN_SENSOR_ID_FILTER 0x0007FF00
|
#define CAN_SENSOR_ID_FILTER 0x0007FF00
|
||||||
|
|
||||||
union Byte{
|
typedef union{
|
||||||
struct bitfield{
|
struct bitfield{
|
||||||
unsigned bit0:1;
|
unsigned bit0:1;
|
||||||
unsigned bit1:1;
|
unsigned bit1:1;
|
||||||
@@ -46,7 +49,19 @@ union Byte{
|
|||||||
unsigned bit7:1;
|
unsigned bit7:1;
|
||||||
}Bitfield;
|
}Bitfield;
|
||||||
char AllBit;
|
char AllBit;
|
||||||
};
|
}Byte;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief HAL Status structures definition
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
CRR_OK = 0x00U,
|
||||||
|
CRR_ERROR = 0x01U,
|
||||||
|
CRR_BUSY = 0x02U,
|
||||||
|
CRR_TIMEOUT = 0x03U
|
||||||
|
} CRR_Status;
|
||||||
|
|
||||||
|
|
||||||
_Bool IsLeapYear(uint8_t year);
|
_Bool IsLeapYear(uint8_t year);
|
||||||
|
|
||||||
@@ -58,6 +73,10 @@ _Bool IsLeapYear(uint8_t year);
|
|||||||
#define HighByteOfWord(WORD) (WORD>>8)&0xFF
|
#define HighByteOfWord(WORD) (WORD>>8)&0xFF
|
||||||
#define LowByteOfWord(WORD) WORD&0xFF
|
#define LowByteOfWord(WORD) WORD&0xFF
|
||||||
|
|
||||||
|
//Priority level
|
||||||
|
#define PRIORITY_CRITICAL 0
|
||||||
|
#define PRIORITY_STANDARD 1
|
||||||
|
|
||||||
//Route mode
|
//Route mode
|
||||||
#define ROUTE_MASTER 0
|
#define ROUTE_MASTER 0
|
||||||
#define ROUTE_SLAVE 1
|
#define ROUTE_SLAVE 1
|
||||||
@@ -67,33 +86,34 @@ _Bool IsLeapYear(uint8_t year);
|
|||||||
#define DATA_TYPE_DISCRETE 0b0001
|
#define DATA_TYPE_DISCRETE 0b0001
|
||||||
#define DATA_TYPE_ANALOG 0b0010
|
#define DATA_TYPE_ANALOG 0b0010
|
||||||
#define DATA_TYPE_MODBUS_COIL 0b0011
|
#define DATA_TYPE_MODBUS_COIL 0b0011
|
||||||
#define DATA_TYPE_MODBUS_DISCRETE 0b0100
|
#define DATA_TYPE_GENERAL_ADDRESS_SPACE 0b0100
|
||||||
#define DATA_TYPE_MODBUS_HOLDING 0b0101
|
#define DATA_TYPE_MODBUS_DISCRETE 0b0101
|
||||||
#define DATA_TYPE_MODBUS_INPUT 0b0110
|
#define DATA_TYPE_MODBUS_HOLDING 0b0110
|
||||||
#define DATA_TYPE_ERROR 0b0111
|
#define DATA_TYPE_MODBUS_INPUT 0b0111
|
||||||
|
#define DATA_TYPE_ERROR 0b1000
|
||||||
#define DATA_TYPE_PULSE 0b1111
|
#define DATA_TYPE_PULSE 0b1111
|
||||||
|
|
||||||
//Sensor Types for DATA_TYPE_BROADCAST
|
//Sensor Types for DATA_TYPE_BROADCAST
|
||||||
#define SENSOR_TYPE_BROADCAST_STATUS 0b00000
|
#define SENSOR_TYPE_BROADCAST_STATUS 0b000000000000
|
||||||
#define SENSOR_TYPE_BROADCAST_ONOFF 0b00001
|
#define SENSOR_TYPE_BROADCAST_ONOFF 0b000000000001
|
||||||
#define SENSOR_TYPE_BROADCAST_RESTARTDEVICE 0b00010
|
#define SENSOR_TYPE_BROADCAST_RESTARTDEVICE 0b000000000010
|
||||||
#define SENSOR_TYPE_BROADCAST_RTCSETUP 0b00011
|
#define SENSOR_TYPE_BROADCAST_RTCSETUP 0b000000000011
|
||||||
|
|
||||||
//Sensor Types for DATA_TYPE_DISCRETE
|
//Sensor Types for DATA_TYPE_DISCRETE
|
||||||
#define SENSOR_TYPE_DISCRETE_ACCIDENT 0b00000
|
#define SENSOR_TYPE_DISCRETE_ACCIDENT 0b0000
|
||||||
#define SENSOR_TYPE_DISCRETE_WARNING 0b00001
|
#define SENSOR_TYPE_DISCRETE_WARNING 0b0001
|
||||||
#define SENSOR_TYPE_DISCRETE_CONTROL_SIGNALS 0b00010
|
#define SENSOR_TYPE_DISCRETE_CONTROL_SIGNALS 0b0010
|
||||||
#define SENSOR_TYPE_DISCRETE_FLAGS 0b00011
|
#define SENSOR_TYPE_DISCRETE_FLAGS 0b0011
|
||||||
#define SENSOR_TYPE_DISCRETE_RESET 0b00100
|
#define SENSOR_TYPE_DISCRETE_RESET 0b0100
|
||||||
#define SENSOR_TYPE_DISCRETE_CHANGE_MODE 0b00101
|
#define SENSOR_TYPE_DISCRETE_CHANGE_MODE 0b0101
|
||||||
#define SENSOR_TYPE_DISCRETE_REQUEST_LIST_OF_PARAMETERS 0b00110
|
#define SENSOR_TYPE_DISCRETE_REQUEST_LIST_OF_PARAMETERS 0b0110
|
||||||
|
|
||||||
//Sensor Types for DATA_TYPE_ANALOG
|
//Sensor Types for DATA_TYPE_ANALOG
|
||||||
#define SENSOR_TYPE_ANALOG_UNIVERSAL 0b00000
|
#define SENSOR_TYPE_ANALOG_UNIVERSAL 0b0000
|
||||||
#define SENSOR_TYPE_ANALOG_USTAVKI 0b00001
|
#define SENSOR_TYPE_ANALOG_USTAVKI 0b0001
|
||||||
#define SENSOR_TYPE_ANALOG_U 0b00010
|
#define SENSOR_TYPE_ANALOG_U 0b0010
|
||||||
#define SENSOR_TYPE_ANALOG_I 0b00011
|
#define SENSOR_TYPE_ANALOG_I 0b0011
|
||||||
#define SENSOR_TYPE_ANALOG_T 0b00100
|
#define SENSOR_TYPE_ANALOG_T 0b0100
|
||||||
|
|
||||||
//Error Code
|
//Error Code
|
||||||
#define NONEXISTENT_ELEMENT 0x01
|
#define NONEXISTENT_ELEMENT 0x01
|
||||||
@@ -129,21 +149,37 @@ union ext_ID_Modbus{
|
|||||||
unsigned int BitAll:29;
|
unsigned int BitAll:29;
|
||||||
};*/
|
};*/
|
||||||
|
|
||||||
typedef union _extID{
|
typedef union{
|
||||||
struct extID_Standard_Fields{
|
struct extID_Fields{
|
||||||
unsigned DeviceID:8;
|
union{
|
||||||
unsigned SensorID:11;
|
struct msgBody_Broadcast{
|
||||||
unsigned SensorType:5;
|
unsigned Page:4;
|
||||||
unsigned DataType:4;
|
unsigned BroadcastType:12;
|
||||||
|
}Broadcast;
|
||||||
|
struct msgBody_Discrete{
|
||||||
|
unsigned Body:12;
|
||||||
|
unsigned Type:4;
|
||||||
|
}Discrete;
|
||||||
|
struct msgBody_Analog{
|
||||||
|
unsigned SensorID:12;
|
||||||
|
unsigned SensorType:4;
|
||||||
|
}Analog;
|
||||||
|
struct msgBody_Modbus{
|
||||||
|
unsigned RegCount:4;
|
||||||
|
unsigned StrAdr:12;
|
||||||
|
}Modbus;
|
||||||
|
struct msgBody_Error{
|
||||||
|
unsigned ErrorCode:8;
|
||||||
|
unsigned Info:8;
|
||||||
|
}Error;
|
||||||
|
unsigned Body:16;
|
||||||
|
}Msg;
|
||||||
|
unsigned MsgType:4;
|
||||||
|
unsigned DeviceID:4;
|
||||||
|
unsigned DeviceType:3;
|
||||||
unsigned Route:1;
|
unsigned Route:1;
|
||||||
}StandardFields;
|
unsigned Priority:1;
|
||||||
struct extID_Modbus_Fields{
|
}Fields;
|
||||||
unsigned DeviceID:8;
|
|
||||||
unsigned CountReg:8;
|
|
||||||
unsigned StrAdr:8;
|
|
||||||
unsigned DataType:4;
|
|
||||||
unsigned Route:1;
|
|
||||||
}ModbusFields;
|
|
||||||
unsigned int BitAll:29;
|
unsigned int BitAll:29;
|
||||||
}extID;
|
}extID;
|
||||||
|
|
||||||
@@ -260,20 +296,20 @@ void REQUESTER_Init(void);
|
|||||||
void REQUESTER_MainWhile(void);
|
void REQUESTER_MainWhile(void);
|
||||||
void Boot_SystemClock_Config(void);
|
void Boot_SystemClock_Config(void);
|
||||||
|
|
||||||
void REQUESTER_AnalogProcessing(struct RXMsg _rxMsg);
|
CRR_Status REQUESTER_AnalogProcessing(struct RXMsg _rxMsg);
|
||||||
HAL_StatusTypeDef CanRequestToAnalogUniversal(struct RXMsg _rxMsg);
|
HAL_StatusTypeDef CanRequestToAnalogUniversal(struct RXMsg _rxMsg);
|
||||||
HAL_StatusTypeDef CanRequestToAnalogUSTAVKI(struct RXMsg _rxMsg);
|
HAL_StatusTypeDef CanRequestToAnalogUSTAVKI(struct RXMsg _rxMsg);
|
||||||
HAL_StatusTypeDef CanRequestToAnalogUSens(struct RXMsg _rxMsg);
|
HAL_StatusTypeDef CanRequestToAnalogUSens(struct RXMsg _rxMsg);
|
||||||
HAL_StatusTypeDef CanRequestToAnalogISens(struct RXMsg _rxMsg);
|
HAL_StatusTypeDef CanRequestToAnalogISens(struct RXMsg _rxMsg);
|
||||||
HAL_StatusTypeDef CanRequestToAnalogTSens(struct RXMsg _rxMsg);
|
HAL_StatusTypeDef CanRequestToAnalogTSens(struct RXMsg _rxMsg);
|
||||||
|
|
||||||
void REQUESTER_BroadcastProcessing(struct RXMsg _rxMsg);
|
CRR_Status REQUESTER_BroadcastProcessing(struct RXMsg _rxMsg);
|
||||||
HAL_StatusTypeDef CanRequestToBroadcastStatus(struct RXMsg _rxMsg);
|
HAL_StatusTypeDef CanRequestToBroadcastStatus(struct RXMsg _rxMsg);
|
||||||
void CanRequestToBroadcastOnOff(struct RXMsg _rxMsg);
|
void CanRequestToBroadcastOnOff(struct RXMsg _rxMsg);
|
||||||
void CanRequestToBroadcastRestart(struct RXMsg _rxMsg);
|
void CanRequestToBroadcastRestart(struct RXMsg _rxMsg);
|
||||||
void CanRequestToBroadcastRtcSetup(struct RXMsg _rxMsg);
|
void CanRequestToBroadcastRtcSetup(struct RXMsg _rxMsg);
|
||||||
|
|
||||||
void REQUESTER_DiscreticProcessing(struct RXMsg _rxMsg);
|
CRR_Status REQUESTER_DiscreticProcessing(struct RXMsg _rxMsg);
|
||||||
void CanRequestToDiscreteAccident(struct RXMsg _rxMsg);
|
void CanRequestToDiscreteAccident(struct RXMsg _rxMsg);
|
||||||
void CanRequestToDiscreteWarning(struct RXMsg _rxMsg);
|
void CanRequestToDiscreteWarning(struct RXMsg _rxMsg);
|
||||||
void CanRequestToDiscreteControlSignals(struct RXMsg _rxMsg);
|
void CanRequestToDiscreteControlSignals(struct RXMsg _rxMsg);
|
||||||
@@ -282,11 +318,11 @@ void CanRequestToDiscreteReset(struct RXMsg _rxMsg);
|
|||||||
void CanRequestToDiscreteChangeMode(struct RXMsg _rxMsg);
|
void CanRequestToDiscreteChangeMode(struct RXMsg _rxMsg);
|
||||||
void CanRequestToDiscreteRequestListOfParameters(struct RXMsg _rxMsg);
|
void CanRequestToDiscreteRequestListOfParameters(struct RXMsg _rxMsg);
|
||||||
|
|
||||||
void REQUESTER_ModbusProcessing(struct RXMsg _rxMsg);
|
CRR_Status REQUESTER_ModbusProcessing(struct RXMsg _rxMsg);
|
||||||
void CanRequestToModbusCoil(struct RXMsg _rxMsg);
|
HAL_StatusTypeDef CanRequestToModbusCoil(struct RXMsg _rxMsg);
|
||||||
void CanRequestToModbusDiscrete(struct RXMsg _rxMsg);
|
HAL_StatusTypeDef CanRequestToModbusDiscrete(struct RXMsg _rxMsg);
|
||||||
void CanRequestToModbusHolding(struct RXMsg _rxMsg);
|
HAL_StatusTypeDef CanRequestToModbusHolding(struct RXMsg _rxMsg);
|
||||||
void CanRequestToModbusInput(struct RXMsg _rxMsg);
|
HAL_StatusTypeDef CanRequestToModbusInput(struct RXMsg _rxMsg);
|
||||||
|
|
||||||
void REQUESTER_RTC_SYNC(uint8_t *data);
|
void REQUESTER_RTC_SYNC(uint8_t *data);
|
||||||
void REQUESTER_Pulse_TIM_Handler(void);
|
void REQUESTER_Pulse_TIM_Handler(void);
|
||||||
|
|||||||
@@ -1,29 +1,13 @@
|
|||||||
#include "requester.h"
|
#include "requester.h"
|
||||||
|
|
||||||
static union Byte byte[2048][8];
|
|
||||||
#define byte_modbusadr(x) byte[x/64][(x%64)/8]
|
|
||||||
#define _GET_MODBUS_BIT(x) byte[x/64][(x%64)/8].AllBit>>((x%64)%8)
|
|
||||||
#define _GET_MODBUS_ADR(SensorId, RequestedBytePosition, RequestedBitPosition) SensorId*64 + RequestedBytePosition*8 + RequestedBitPosition
|
|
||||||
|
|
||||||
uint16_t ModbusFilters[COUNT_OF_MODBUS_SECTIONS][2];
|
|
||||||
|
|
||||||
struct device CurrentDevice;
|
struct device CurrentDevice;
|
||||||
struct device Device_on_the_Network[32];
|
struct device Device_on_the_Network[8][16];
|
||||||
struct data Data;
|
|
||||||
struct controlflags ControlFlags;
|
struct controlflags ControlFlags;
|
||||||
struct received_request ReceivedRequest;
|
|
||||||
|
|
||||||
uint8_t CurrentStep = 0;
|
uint8_t CurrentStep = 0;
|
||||||
uint8_t LastStep = 0;
|
uint8_t LastStep = 0;
|
||||||
struct RXMsg rxMsg[CAN_RX_BUFFER_SIZE];
|
struct RXMsg rxMsg[CAN_RX_BUFFER_SIZE];
|
||||||
|
|
||||||
#define MAX_NUM_OF_DEVICES_PER_LINE 4
|
|
||||||
#define MAX_NUM_OF_REGISTERS_IN_DEVICE 255
|
|
||||||
|
|
||||||
//Регистр это слово (16 бит). uint16
|
|
||||||
uint16_t ModbusDemonstration[MAX_NUM_OF_DEVICES_PER_LINE][MAX_NUM_OF_REGISTERS_IN_DEVICE];
|
|
||||||
uint16_t ModbusAlternativeTable[MAX_NUM_OF_DEVICES_PER_LINE*MAX_NUM_OF_REGISTERS_IN_DEVICE];
|
|
||||||
|
|
||||||
_Bool IsLeapYear(uint8_t year)
|
_Bool IsLeapYear(uint8_t year)
|
||||||
{
|
{
|
||||||
year+=2000;
|
year+=2000;
|
||||||
@@ -50,135 +34,94 @@ void REQUESTER_Init(void)
|
|||||||
ControlFlags.IsPulse = 1;
|
ControlFlags.IsPulse = 1;
|
||||||
MX_TIM7_Init();
|
MX_TIM7_Init();
|
||||||
MX_RTC_Init();
|
MX_RTC_Init();
|
||||||
|
|
||||||
#ifdef _DEMO
|
|
||||||
int Reg_AltModbusTable;
|
|
||||||
//Тестовые значения регистров. Для отладки/демонстрации
|
|
||||||
for(int x = 0; x < MAX_NUM_OF_DEVICES_PER_LINE; x++)
|
|
||||||
{
|
|
||||||
for(int y = 0; y < MAX_NUM_OF_REGISTERS_IN_DEVICE; y++)
|
|
||||||
{
|
|
||||||
ModbusDemonstration[x][y] = x<<8 | y;
|
|
||||||
|
|
||||||
Reg_AltModbusTable = x*MAX_NUM_OF_REGISTERS_IN_DEVICE+y;
|
|
||||||
|
|
||||||
ModbusAlternativeTable[Reg_AltModbusTable] = x<<8 | y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ProverkaDefinaResult;
|
|
||||||
int ProverkaDefinaItem = 0;
|
|
||||||
int ProverkaArbitors = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Функция с обработкой полученных запросов
|
* @brief Функция с обработкой полученных запросов
|
||||||
* @details В бесконечном цикле функция ожидает выставление флага о полученном запросе.
|
* @details В бесконечном цикле функция ожидает приёма сообщения. После этого сообщение распределяется в зависимости от DataType.
|
||||||
* Обработка запроса аналоговых значений - REQUESTER_AnalogProcessing().
|
* Обработка запроса аналоговых значений - REQUESTER_AnalogProcessing().
|
||||||
* Обработка широковещательных запросов - REQUESTER_BroadcastProcessing().
|
* Обработка широковещательных запросов - REQUESTER_BroadcastProcessing().
|
||||||
* Обработка запроса дискретных значений - REQUESTER_DiscreticProcessing().
|
* Обработка запроса дискретных значений - REQUESTER_DiscreticProcessing().
|
||||||
* Обработка Modbus - REQUESTER_ModbusProcessing().
|
* Обработка Modbus - REQUESTER_ModbusProcessing().
|
||||||
* @note
|
|
||||||
*/
|
*/
|
||||||
void REQUESTER_MainWhile(void)
|
void REQUESTER_MainWhile(void)
|
||||||
{
|
{
|
||||||
CAN_TxHeaderTypeDef TxHeader;
|
|
||||||
uint32_t TxMailBox = 0;
|
|
||||||
uint8_t data[8];
|
|
||||||
extID eID;
|
|
||||||
eID.BitAll = 0;
|
|
||||||
eID.StandardFields.DeviceID = 2;
|
|
||||||
eID.StandardFields.DataType = DATA_TYPE_ANALOG;
|
|
||||||
eID.StandardFields.SensorType = 0x1F;
|
|
||||||
eID.StandardFields.SensorID = 0;
|
|
||||||
eID.StandardFields.Route = ROUTE_SLAVE;
|
|
||||||
|
|
||||||
TxHeader.IDE = CAN_ID_EXT;
|
|
||||||
TxHeader.TransmitGlobalTime = DISABLE;
|
|
||||||
TxHeader.RTR = CAN_RTR_DATA;
|
|
||||||
TxHeader.ExtId = eID.BitAll;
|
|
||||||
int TxTest = 0;
|
|
||||||
HAL_TIM_Base_Start_IT(&htim7);
|
HAL_TIM_Base_Start_IT(&htim7);
|
||||||
|
unsigned currentAttemptCount;
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
if(AvailableCanRxMsg())
|
if(AvailableCanRxMsg())
|
||||||
{
|
{
|
||||||
if(rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_ANALOG)
|
currentAttemptCount = 0;
|
||||||
|
if(rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_ANALOG)
|
||||||
{
|
{
|
||||||
REQUESTER_AnalogProcessing(rxMsg[CurrentStep]);
|
REQUESTER_AnalogProcessing(rxMsg[CurrentStep]);
|
||||||
}
|
}
|
||||||
else if(rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_BROADCAST)
|
else if(rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_BROADCAST)
|
||||||
{
|
{
|
||||||
REQUESTER_BroadcastProcessing(rxMsg[CurrentStep]);
|
REQUESTER_BroadcastProcessing(rxMsg[CurrentStep]);
|
||||||
}
|
}
|
||||||
else if(rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_DISCRETE)
|
else if(rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_DISCRETE)
|
||||||
{
|
{
|
||||||
REQUESTER_DiscreticProcessing(rxMsg[CurrentStep]);
|
REQUESTER_DiscreticProcessing(rxMsg[CurrentStep]);
|
||||||
}
|
}
|
||||||
else if(rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_MODBUS_COIL ||
|
else if(rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_GENERAL_ADDRESS_SPACE)
|
||||||
rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_MODBUS_DISCRETE ||
|
{
|
||||||
rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_MODBUS_HOLDING ||
|
|
||||||
rxMsg[CurrentStep].eID.StandardFields.DataType == DATA_TYPE_MODBUS_INPUT)
|
}
|
||||||
|
else if(rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_MODBUS_COIL ||
|
||||||
|
rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_MODBUS_DISCRETE ||
|
||||||
|
rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_MODBUS_HOLDING ||
|
||||||
|
rxMsg[CurrentStep].eID.Fields.MsgType == DATA_TYPE_MODBUS_INPUT)
|
||||||
{
|
{
|
||||||
REQUESTER_ModbusProcessing(rxMsg[CurrentStep]);
|
REQUESTER_ModbusProcessing(rxMsg[CurrentStep]);
|
||||||
}
|
}
|
||||||
CurrentStep = (uint16_t)(CurrentStep + 1) % CAN_RX_BUFFER_SIZE;
|
CurrentStep = (uint16_t)(CurrentStep + 1) % CAN_RX_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0);
|
|
||||||
|
|
||||||
if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox)!= HAL_OK)
|
|
||||||
{
|
|
||||||
ProverkaArbitors++;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// eID.Fields.SensorID++;
|
|
||||||
// if(eID.Fields.SensorID>10)
|
|
||||||
//{
|
|
||||||
// eID.Fields.SensorID = 0;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Функция обработки аналоговых запросов.
|
* @brief Функция обработки аналоговых запросов.
|
||||||
* @details Функция, формирующая и отправляющая ответ на запросы. Типы запросов: Универсальный, Уставки, Напряжение, Ток, Температура
|
* @param struct RXMsg _rxMsg - структура для полученного сообщения.
|
||||||
|
* @details Функция, формирующая и отправляющая ответ на запросы. Типы запросов: Универсальный, Уставки, Напряжение, Ток, Температура.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void REQUESTER_AnalogProcessing(struct RXMsg _rxMsg)
|
CRR_Status REQUESTER_AnalogProcessing(struct RXMsg _rxMsg)
|
||||||
{
|
{
|
||||||
switch (_rxMsg.eID.StandardFields.SensorType)
|
switch (_rxMsg.eID.Fields.Msg.Analog.SensorType)
|
||||||
{
|
{
|
||||||
case SENSOR_TYPE_ANALOG_UNIVERSAL:
|
case SENSOR_TYPE_ANALOG_UNIVERSAL:
|
||||||
{
|
{
|
||||||
CanRequestToAnalogUniversal(_rxMsg);
|
return (CRR_Status)CanRequestToAnalogUniversal(_rxMsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SENSOR_TYPE_ANALOG_USTAVKI:
|
case SENSOR_TYPE_ANALOG_USTAVKI:
|
||||||
{
|
{
|
||||||
CanRequestToAnalogUSTAVKI(_rxMsg);
|
return (CRR_Status)CanRequestToAnalogUSTAVKI(_rxMsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SENSOR_TYPE_ANALOG_U:
|
case SENSOR_TYPE_ANALOG_U:
|
||||||
{
|
{
|
||||||
CanRequestToAnalogUSens(_rxMsg);
|
return (CRR_Status)CanRequestToAnalogUSens(_rxMsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SENSOR_TYPE_ANALOG_I:
|
case SENSOR_TYPE_ANALOG_I:
|
||||||
{
|
{
|
||||||
CanRequestToAnalogISens(_rxMsg);
|
return (CRR_Status)CanRequestToAnalogISens(_rxMsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SENSOR_TYPE_ANALOG_T:
|
case SENSOR_TYPE_ANALOG_T:
|
||||||
{
|
{
|
||||||
CanRequestToAnalogTSens(_rxMsg);
|
return (CRR_Status)CanRequestToAnalogTSens(_rxMsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
//RESERVE SENSOR TYPE
|
//RESERVE SENSOR TYPE
|
||||||
|
return CRR_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return CRR_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak HAL_StatusTypeDef CanRequestToAnalogUniversal(struct RXMsg _rxMsg)
|
__weak HAL_StatusTypeDef CanRequestToAnalogUniversal(struct RXMsg _rxMsg)
|
||||||
@@ -191,7 +134,7 @@ __weak HAL_StatusTypeDef CanRequestToAnalogUniversal(struct RXMsg _rxMsg)
|
|||||||
TxHeader.RTR = CAN_RTR_DATA;
|
TxHeader.RTR = CAN_RTR_DATA;
|
||||||
extID tmp_eID;
|
extID tmp_eID;
|
||||||
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
||||||
tmp_eID.StandardFields.Route = ROUTE_SLAVE;
|
tmp_eID.Fields.Route = ROUTE_SLAVE;
|
||||||
TxHeader.ExtId = tmp_eID.BitAll;
|
TxHeader.ExtId = tmp_eID.BitAll;
|
||||||
TxHeader.DLC = 6;
|
TxHeader.DLC = 6;
|
||||||
data[0] = 'U';
|
data[0] = 'U';
|
||||||
@@ -213,7 +156,7 @@ __weak HAL_StatusTypeDef CanRequestToAnalogUSTAVKI(struct RXMsg _rxMsg)
|
|||||||
TxHeader.RTR = CAN_RTR_DATA;
|
TxHeader.RTR = CAN_RTR_DATA;
|
||||||
extID tmp_eID;
|
extID tmp_eID;
|
||||||
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
||||||
tmp_eID.StandardFields.Route = ROUTE_SLAVE;
|
tmp_eID.Fields.Route = ROUTE_SLAVE;
|
||||||
TxHeader.ExtId = tmp_eID.BitAll;
|
TxHeader.ExtId = tmp_eID.BitAll;
|
||||||
TxHeader.DLC = 7;
|
TxHeader.DLC = 7;
|
||||||
data[0] = 'U';
|
data[0] = 'U';
|
||||||
@@ -236,15 +179,15 @@ __weak HAL_StatusTypeDef CanRequestToAnalogUSens(struct RXMsg _rxMsg)
|
|||||||
TxHeader.RTR = CAN_RTR_DATA;
|
TxHeader.RTR = CAN_RTR_DATA;
|
||||||
extID tmp_eID;
|
extID tmp_eID;
|
||||||
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
||||||
tmp_eID.StandardFields.Route = ROUTE_SLAVE;
|
tmp_eID.Fields.Route = ROUTE_SLAVE;
|
||||||
TxHeader.ExtId = tmp_eID.BitAll;
|
TxHeader.ExtId = tmp_eID.BitAll;
|
||||||
TxHeader.DLC = 6;
|
TxHeader.DLC = 6;
|
||||||
data[0] = 'U';
|
data[0] = 'U';
|
||||||
data[1] = ' ';
|
data[1] = 'S';
|
||||||
data[2] = 's';
|
data[2] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID / 1000;
|
||||||
data[3] = 'e';
|
data[3] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID / 100 % 10;
|
||||||
data[4] = 'n';
|
data[4] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID / 10 % 10;
|
||||||
data[5] = 's';
|
data[5] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID % 10;
|
||||||
return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox);
|
return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,15 +201,15 @@ __weak HAL_StatusTypeDef CanRequestToAnalogISens(struct RXMsg _rxMsg)
|
|||||||
TxHeader.RTR = CAN_RTR_DATA;
|
TxHeader.RTR = CAN_RTR_DATA;
|
||||||
extID tmp_eID;
|
extID tmp_eID;
|
||||||
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
||||||
tmp_eID.StandardFields.Route = ROUTE_SLAVE;
|
tmp_eID.Fields.Route = ROUTE_SLAVE;
|
||||||
TxHeader.ExtId = tmp_eID.BitAll;
|
TxHeader.ExtId = tmp_eID.BitAll;
|
||||||
TxHeader.DLC = 6;
|
TxHeader.DLC = 6;
|
||||||
data[0] = 'I';
|
data[0] = 'I';
|
||||||
data[1] = ' ';
|
data[1] = 'S';
|
||||||
data[2] = 's';
|
data[2] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID / 1000;
|
||||||
data[3] = 'e';
|
data[3] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID / 100 % 10;
|
||||||
data[4] = 'n';
|
data[4] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID / 10 % 10;
|
||||||
data[5] = 's';
|
data[5] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID % 10;
|
||||||
return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox);
|
return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,30 +223,34 @@ __weak HAL_StatusTypeDef CanRequestToAnalogTSens(struct RXMsg _rxMsg)
|
|||||||
TxHeader.RTR = CAN_RTR_DATA;
|
TxHeader.RTR = CAN_RTR_DATA;
|
||||||
extID tmp_eID;
|
extID tmp_eID;
|
||||||
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
||||||
tmp_eID.StandardFields.Route = ROUTE_SLAVE;
|
tmp_eID.Fields.Route = ROUTE_SLAVE;
|
||||||
TxHeader.ExtId = tmp_eID.BitAll;
|
TxHeader.ExtId = tmp_eID.BitAll;
|
||||||
TxHeader.DLC = 6;
|
TxHeader.DLC = 6;
|
||||||
data[0] = 'T';
|
data[0] = 'T';
|
||||||
data[1] = ' ';
|
data[1] = 'S';
|
||||||
data[2] = 's';
|
data[2] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID / 1000;
|
||||||
data[3] = 'e';
|
data[3] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID / 100 % 10;
|
||||||
data[4] = 'n';
|
data[4] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID / 10 % 10;
|
||||||
data[5] = 's';
|
data[5] = 47 + _rxMsg.eID.Fields.Msg.Analog.SensorID % 10;
|
||||||
return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox);
|
return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Функция обработки широковещательных запросов.
|
* @brief Функция обработки широковещательных запросов.
|
||||||
|
* @param struct RXMsg _rxMsg - структура для полученного сообщения.
|
||||||
* @details Функция, выполняющая команды, переданные в широковещательном формате с головного (master) устройства. Типы команд: Запрос статуса, запрос на включение или выключение, рестарт устройств, установка времени.
|
* @details Функция, выполняющая команды, переданные в широковещательном формате с головного (master) устройства. Типы команд: Запрос статуса, запрос на включение или выключение, рестарт устройств, установка времени.
|
||||||
*/
|
*/
|
||||||
void REQUESTER_BroadcastProcessing(struct RXMsg _rxMsg)
|
CRR_Status REQUESTER_BroadcastProcessing(struct RXMsg _rxMsg)
|
||||||
{
|
{
|
||||||
switch(_rxMsg.eID.StandardFields.SensorType)
|
switch(_rxMsg.eID.Fields.Msg.Broadcast.BroadcastType)
|
||||||
{
|
{
|
||||||
case SENSOR_TYPE_BROADCAST_STATUS:
|
case SENSOR_TYPE_BROADCAST_STATUS:
|
||||||
{
|
{
|
||||||
//Обработка запроса статуса устройства
|
//Обработка запроса статуса устройства
|
||||||
CanRequestToBroadcastStatus(_rxMsg);
|
if(CanRequestToBroadcastStatus(_rxMsg)!=HAL_OK)
|
||||||
|
{
|
||||||
|
return CRR_ERROR;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SENSOR_TYPE_BROADCAST_ONOFF:
|
case SENSOR_TYPE_BROADCAST_ONOFF:
|
||||||
@@ -326,8 +273,10 @@ void REQUESTER_BroadcastProcessing(struct RXMsg _rxMsg)
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
//RESERVE SENSOR TYPE.
|
//RESERVE SENSOR TYPE.
|
||||||
|
return CRR_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return CRR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak HAL_StatusTypeDef CanRequestToBroadcastStatus(struct RXMsg _rxMsg)
|
__weak HAL_StatusTypeDef CanRequestToBroadcastStatus(struct RXMsg _rxMsg)
|
||||||
@@ -341,8 +290,9 @@ __weak HAL_StatusTypeDef CanRequestToBroadcastStatus(struct RXMsg _rxMsg)
|
|||||||
TxHeader.RTR = CAN_RTR_DATA;
|
TxHeader.RTR = CAN_RTR_DATA;
|
||||||
extID tmp_eID;
|
extID tmp_eID;
|
||||||
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
tmp_eID.BitAll = _rxMsg.eID.BitAll;
|
||||||
tmp_eID.StandardFields.Route = ROUTE_SLAVE;
|
tmp_eID.Fields.Route = ROUTE_SLAVE;
|
||||||
tmp_eID.StandardFields.DeviceID = CURRENT_ID_DEVICE;
|
tmp_eID.Fields.DeviceType = CURRENT_TYPE_DEVICE;
|
||||||
|
tmp_eID.Fields.DeviceID = CURRENT_ID_DEVICE;
|
||||||
TxHeader.ExtId = tmp_eID.BitAll;
|
TxHeader.ExtId = tmp_eID.BitAll;
|
||||||
|
|
||||||
RTC_TimeTypeDef sTime = {0};
|
RTC_TimeTypeDef sTime = {0};
|
||||||
@@ -372,7 +322,7 @@ __weak void CanRequestToBroadcastRestart(struct RXMsg _rxMsg)
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(_rxMsg.eID.StandardFields.SensorID == (CURRENT_ID_DEVICE / (_rxMsg.DLC*8)))
|
if(_rxMsg.eID.Fields.Msg.Broadcast.Page == (CURRENT_ID_DEVICE / (_rxMsg.DLC*8)))
|
||||||
{
|
{
|
||||||
uint64_t page = 0;
|
uint64_t page = 0;
|
||||||
for(int i = 0; i < _rxMsg.DLC; i++)
|
for(int i = 0; i < _rxMsg.DLC; i++)
|
||||||
@@ -416,12 +366,13 @@ __weak void CanRequestToBroadcastRtcSetup(struct RXMsg _rxMsg)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Функция обработки дискретных запросов.
|
* @brief Функция обработки дискретных запросов.
|
||||||
|
* @param struct RXMsg _rxMsg - структура для полученного сообщения.
|
||||||
* @details Функция, формирующая и отправляющая ответ на запросы. Типы запросов: Аварии, Предупреждения, Управляющие сигналы, Флаги, Рестарт устройства, Изменение режима работы устройства, Запрос на устройство.
|
* @details Функция, формирующая и отправляющая ответ на запросы. Типы запросов: Аварии, Предупреждения, Управляющие сигналы, Флаги, Рестарт устройства, Изменение режима работы устройства, Запрос на устройство.
|
||||||
* @note Запрос на устройство. Головное (master) устройство запрашивает некоторое колличество параметров. В Data - 64 битовых адресса параметров, тип которых задаётся в Sensor ID. Имеется возможность запрашивать непоследовательные параметры.
|
* @note Запрос на устройство. Головное (master) устройство запрашивает некоторое колличество параметров. В Data - 64 битовых адресса параметров, тип которых задаётся в Sensor ID. Имеется возможность запрашивать непоследовательные параметры.
|
||||||
*/
|
*/
|
||||||
void REQUESTER_DiscreticProcessing(struct RXMsg _rxMsg)
|
CRR_Status REQUESTER_DiscreticProcessing(struct RXMsg _rxMsg)
|
||||||
{
|
{
|
||||||
switch(_rxMsg.eID.StandardFields.SensorType){
|
switch(_rxMsg.eID.Fields.Msg.Discrete.Type){
|
||||||
case SENSOR_TYPE_DISCRETE_ACCIDENT:
|
case SENSOR_TYPE_DISCRETE_ACCIDENT:
|
||||||
{
|
{
|
||||||
CanRequestToDiscreteAccident(_rxMsg);
|
CanRequestToDiscreteAccident(_rxMsg);
|
||||||
@@ -459,8 +410,10 @@ void REQUESTER_DiscreticProcessing(struct RXMsg _rxMsg)
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
//RESERVE SENSOR TYPE.
|
//RESERVE SENSOR TYPE.
|
||||||
|
return CRR_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return CRR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak void CanRequestToDiscreteAccident(struct RXMsg _rxMsg)
|
__weak void CanRequestToDiscreteAccident(struct RXMsg _rxMsg)
|
||||||
@@ -499,116 +452,144 @@ __weak void CanRequestToDiscreteRequestListOfParameters(struct RXMsg _rxMsg)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Функция обработки Modbus запросов.
|
* @brief Функция обработки Modbus запросов.
|
||||||
|
* @param struct RXMsg _rxMsg - структура для полученного сообщения.
|
||||||
* @details Функция, формирующая и отправляющая ответ на запросы.
|
* @details Функция, формирующая и отправляющая ответ на запросы.
|
||||||
*/
|
*/
|
||||||
void REQUESTER_ModbusProcessing(struct RXMsg _rxMsg)
|
CRR_Status REQUESTER_ModbusProcessing(struct RXMsg _rxMsg)
|
||||||
{
|
{
|
||||||
switch(_rxMsg.eID.ModbusFields.DataType)
|
switch(_rxMsg.eID.Fields.MsgType)
|
||||||
{
|
{
|
||||||
case DATA_TYPE_MODBUS_COIL:
|
case DATA_TYPE_MODBUS_COIL:
|
||||||
{
|
{
|
||||||
CanRequestToModbusCoil(_rxMsg);
|
return (CRR_Status)CanRequestToModbusCoil(_rxMsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DATA_TYPE_MODBUS_DISCRETE:
|
case DATA_TYPE_MODBUS_DISCRETE:
|
||||||
{
|
{
|
||||||
CanRequestToModbusDiscrete(_rxMsg);
|
return (CRR_Status)CanRequestToModbusDiscrete(_rxMsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DATA_TYPE_MODBUS_HOLDING:
|
case DATA_TYPE_MODBUS_HOLDING:
|
||||||
{
|
{
|
||||||
CanRequestToModbusHolding(_rxMsg);
|
return (CRR_Status)CanRequestToModbusHolding(_rxMsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DATA_TYPE_MODBUS_INPUT:
|
case DATA_TYPE_MODBUS_INPUT:
|
||||||
{
|
{
|
||||||
CanRequestToModbusInput(_rxMsg);
|
return (CRR_Status)CanRequestToModbusInput(_rxMsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
//ERROR
|
//ERROR
|
||||||
|
return CRR_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return CRR_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak void CanRequestToModbusCoil(struct RXMsg _rxMsg)
|
__weak HAL_StatusTypeDef CanRequestToModbusCoil(struct RXMsg _rxMsg)
|
||||||
{
|
{
|
||||||
return;
|
|
||||||
}
|
|
||||||
__weak void CanRequestToModbusDiscrete(struct RXMsg _rxMsg)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
__weak void CanRequestToModbusHolding(struct RXMsg _rxMsg)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
__weak void CanRequestToModbusInput(struct RXMsg _rxMsg)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* СТАРЫЙ УЖАСНЫЙ МОДБАС
|
|
||||||
if((ReceivedRequest.SensorToModbus.Modbus.StrAdr>=0) && (ReceivedRequest.SensorToModbus.Modbus.StrAdr<=127))
|
|
||||||
{
|
|
||||||
//Обращение к существующему в устройстве модбас регистру
|
|
||||||
CAN_TxHeaderTypeDef TxHeader;
|
CAN_TxHeaderTypeDef TxHeader;
|
||||||
uint32_t TxMailBox = 0;
|
uint32_t TxMailBox = 0;
|
||||||
uint8_t data[8];
|
uint8_t data[8];
|
||||||
TxHeader.IDE = CAN_ID_EXT;
|
TxHeader.IDE = CAN_ID_EXT;
|
||||||
TxHeader.DLC = 8;
|
TxHeader.TransmitGlobalTime = DISABLE;
|
||||||
TxHeader.RTR = CAN_RTR_DATA;
|
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] = 'M';
|
||||||
|
data[1] = 'C';
|
||||||
|
data[2] = ' ';
|
||||||
|
data[3] = 'S';
|
||||||
|
data[4] = _rxMsg.eID.Fields.Msg.Modbus.StrAdr;
|
||||||
|
data[5] = ' ';
|
||||||
|
data[6] = 'C';
|
||||||
|
data[7] = _rxMsg.eID.Fields.Msg.Modbus.RegCount;
|
||||||
|
return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox);
|
||||||
|
}
|
||||||
|
__weak HAL_StatusTypeDef CanRequestToModbusDiscrete(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] = 'M';
|
||||||
|
data[1] = 'D';
|
||||||
|
data[2] = ' ';
|
||||||
|
data[3] = 'S';
|
||||||
|
data[4] = _rxMsg.eID.Fields.Msg.Modbus.StrAdr;
|
||||||
|
data[5] = ' ';
|
||||||
|
data[6] = 'C';
|
||||||
|
data[7] = _rxMsg.eID.Fields.Msg.Modbus.RegCount;
|
||||||
|
return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox);
|
||||||
|
}
|
||||||
|
__weak HAL_StatusTypeDef CanRequestToModbusHolding(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] = 'M';
|
||||||
|
data[1] = 'H';
|
||||||
|
data[2] = ' ';
|
||||||
|
data[3] = 'S';
|
||||||
|
data[4] = _rxMsg.eID.Fields.Msg.Modbus.StrAdr;
|
||||||
|
data[5] = ' ';
|
||||||
|
data[6] = 'C';
|
||||||
|
data[7] = _rxMsg.eID.Fields.Msg.Modbus.RegCount;
|
||||||
|
return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox);
|
||||||
|
}
|
||||||
|
__weak HAL_StatusTypeDef CanRequestToModbusInput(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] = 'M';
|
||||||
|
data[1] = 'I';
|
||||||
|
data[2] = ' ';
|
||||||
|
data[3] = 'S';
|
||||||
|
data[4] = _rxMsg.eID.Fields.Msg.Modbus.StrAdr;
|
||||||
|
data[5] = ' ';
|
||||||
|
data[6] = 'C';
|
||||||
|
data[7] = _rxMsg.eID.Fields.Msg.Modbus.RegCount;
|
||||||
|
return HAL_CAN_AddTxMessage(&_HCAN, &TxHeader, data, &TxMailBox);
|
||||||
|
}
|
||||||
|
|
||||||
int RequestFromDLC;
|
/**
|
||||||
for(RequestFromDLC = ReceivedRequest.SensorToModbus.Modbus.StrAdr;
|
* @brief
|
||||||
(RequestFromDLC<MAX_NUM_OF_REGISTERS_IN_DEVICE) &&
|
* @param extID tmp_eID
|
||||||
((RequestFromDLC-ReceivedRequest.SensorToModbus.Modbus.StrAdr)<ReceivedRequest.SensorToModbus.Modbus.Count);
|
* @param uint32_t tmp_IDE
|
||||||
// RequestFromDLC++
|
* @param uint32_t tmp_RTR
|
||||||
)
|
* @param uint32_t tmp_DLC
|
||||||
{
|
* @param uint8_t *tmp_DATA
|
||||||
TxHeader.DLC = 0;
|
* @param uint16_t tmp_LastStep
|
||||||
extID eID;
|
* @details
|
||||||
eID.BitAll = ReceivedRequest.RequestedExtID.BitAll;
|
*/
|
||||||
eID.StandardFields.Route = ROUTE_SLAVE;
|
|
||||||
eID.StandardFields.SensorType = RequestFromDLC>>11;
|
|
||||||
eID.StandardFields.SensorID = RequestFromDLC;
|
|
||||||
TxHeader.ExtId = eID.BitAll;
|
|
||||||
for(int DataFor = 0; DataFor < 8; DataFor+=2)
|
|
||||||
{
|
|
||||||
data[DataFor] = HighByteOfWord(ModbusDemonstration[CURRENT_ID_DEVICE][RequestFromDLC]);
|
|
||||||
data[DataFor+1] = LowByteOfWord(ModbusDemonstration[CURRENT_ID_DEVICE][RequestFromDLC]);
|
|
||||||
RequestFromDLC++;
|
|
||||||
TxHeader.DLC +=2;
|
|
||||||
if(!((RequestFromDLC<MAX_NUM_OF_REGISTERS_IN_DEVICE) &&
|
|
||||||
((RequestFromDLC-ReceivedRequest.SensorToModbus.Modbus.StrAdr)<ReceivedRequest.SensorToModbus.Modbus.Count)))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0);
|
|
||||||
HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox);
|
|
||||||
}
|
|
||||||
extID emID;
|
|
||||||
emID.BitAll = 0;
|
|
||||||
emID.ModbusFields.DeviceID = CURRENT_ID_DEVICE;
|
|
||||||
emID.ModbusFields.DataType = DATA_TYPE_ERROR;
|
|
||||||
emID.ModbusFields.CountReg = NONEXISTENT_ELEMENT;
|
|
||||||
emID.ModbusFields.Route = ROUTE_SLAVE;
|
|
||||||
TxHeader.DLC = 0;
|
|
||||||
for(;(RequestFromDLC-ReceivedRequest.SensorToModbus.Modbus.StrAdr)<ReceivedRequest.SensorToModbus.Modbus.Count; RequestFromDLC++)
|
|
||||||
{
|
|
||||||
emID.ModbusFields.StrAdr = RequestFromDLC;
|
|
||||||
TxHeader.ExtId = emID.BitAll;
|
|
||||||
while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0);
|
|
||||||
HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailBox);
|
|
||||||
}
|
|
||||||
ReceivedRequest.ModbusFlags.AllFlags = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ReceivedRequest.ModbusFlags.AllFlags = 0;
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void TakeRxMsgToBuffer(extID tmp_eID, uint32_t tmp_IDE, uint32_t tmp_RTR, uint32_t tmp_DLC, uint8_t *tmp_DATA, uint16_t tmp_LastStep)
|
void TakeRxMsgToBuffer(extID tmp_eID, uint32_t tmp_IDE, uint32_t tmp_RTR, uint32_t tmp_DLC, uint8_t *tmp_DATA, uint16_t tmp_LastStep)
|
||||||
{
|
{
|
||||||
rxMsg[tmp_LastStep].eID.BitAll = tmp_eID.BitAll;
|
rxMsg[tmp_LastStep].eID.BitAll = tmp_eID.BitAll;
|
||||||
@@ -638,28 +619,26 @@ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
|
|||||||
|
|
||||||
if(tmp_LastStep == CurrentStep)
|
if(tmp_LastStep == CurrentStep)
|
||||||
{
|
{
|
||||||
|
//Буффер переполнен
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
extID ExtID_Of_RX_MSG;
|
extID ExtID_Of_RX_MSG;
|
||||||
ExtID_Of_RX_MSG.BitAll = RxHeader.ExtId;
|
ExtID_Of_RX_MSG.BitAll = RxHeader.ExtId;
|
||||||
//Полученное сообщение - широковещательное
|
//Полученное сообщение - широковещательное
|
||||||
if (ExtID_Of_RX_MSG.StandardFields.DeviceID == ID_MAIN_DEVICE)
|
if (ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_BROADCAST)
|
||||||
{
|
|
||||||
if(ExtID_Of_RX_MSG.StandardFields.DataType == DATA_TYPE_BROADCAST)
|
|
||||||
{
|
{
|
||||||
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
//Если ID запроса соответствует ID устройства
|
//Если ID запроса соответствует ID устройства
|
||||||
if(ExtID_Of_RX_MSG.StandardFields.DeviceID == (CURRENT_ID_DEVICE))
|
if((ExtID_Of_RX_MSG.Fields.DeviceType == CURRENT_TYPE_DEVICE) && (ExtID_Of_RX_MSG.Fields.DeviceID == CURRENT_ID_DEVICE))
|
||||||
{
|
{
|
||||||
if(ExtID_Of_RX_MSG.StandardFields.DataType == DATA_TYPE_DISCRETE)
|
if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_DISCRETE)
|
||||||
{
|
{
|
||||||
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(ExtID_Of_RX_MSG.StandardFields.DataType == DATA_TYPE_ANALOG)
|
if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_ANALOG)
|
||||||
{
|
{
|
||||||
//Является ли полученное сообщение - запросом
|
//Является ли полученное сообщение - запросом
|
||||||
if(RxHeader.RTR)
|
if(RxHeader.RTR)
|
||||||
@@ -668,20 +647,20 @@ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(ExtID_Of_RX_MSG.StandardFields.DataType == DATA_TYPE_MODBUS_COIL ||
|
if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_COIL ||
|
||||||
ExtID_Of_RX_MSG.StandardFields.DataType == DATA_TYPE_MODBUS_DISCRETE ||
|
ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_DISCRETE ||
|
||||||
ExtID_Of_RX_MSG.StandardFields.DataType == DATA_TYPE_MODBUS_HOLDING ||
|
ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_HOLDING ||
|
||||||
ExtID_Of_RX_MSG.StandardFields.DataType == DATA_TYPE_MODBUS_INPUT)
|
ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_INPUT)
|
||||||
{
|
{
|
||||||
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Полученное сообщение - пульс устройств в сети
|
//Полученное сообщение - пульс устройств в сети
|
||||||
if (ExtID_Of_RX_MSG.StandardFields.DataType == DATA_TYPE_PULSE)
|
if (ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_PULSE)
|
||||||
{
|
{
|
||||||
Device_on_the_Network[ExtID_Of_RX_MSG.StandardFields.DeviceID].Status = ONLINE;
|
Device_on_the_Network[ExtID_Of_RX_MSG.Fields.DeviceType][ExtID_Of_RX_MSG.Fields.DeviceID].Status = ONLINE;
|
||||||
Device_on_the_Network[ExtID_Of_RX_MSG.StandardFields.DeviceID].TimeFromLastPulse = 0;
|
Device_on_the_Network[ExtID_Of_RX_MSG.Fields.DeviceType][ExtID_Of_RX_MSG.Fields.DeviceID].TimeFromLastPulse = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -699,9 +678,11 @@ void REQUESTER_Pulse_TIM_Handler()
|
|||||||
uint32_t TxMailBox = 0;
|
uint32_t TxMailBox = 0;
|
||||||
extID currentID;
|
extID currentID;
|
||||||
currentID.BitAll = 0;
|
currentID.BitAll = 0;
|
||||||
currentID.StandardFields.DeviceID = CURRENT_ID_DEVICE;
|
currentID.Fields.DeviceID = CURRENT_ID_DEVICE;
|
||||||
currentID.StandardFields.DataType = DATA_TYPE_PULSE;
|
currentID.Fields.DeviceType = CURRENT_TYPE_DEVICE;
|
||||||
currentID.StandardFields.Route = ROUTE_SLAVE;
|
currentID.Fields.MsgType = DATA_TYPE_PULSE;
|
||||||
|
currentID.Fields.Route = ROUTE_SLAVE;
|
||||||
|
currentID.Fields.Priority = PRIORITY_STANDARD;
|
||||||
TxHeader.ExtId = currentID.BitAll;
|
TxHeader.ExtId = currentID.BitAll;
|
||||||
uint8_t data[8];
|
uint8_t data[8];
|
||||||
TxHeader.IDE = CAN_ID_EXT;
|
TxHeader.IDE = CAN_ID_EXT;
|
||||||
@@ -719,7 +700,7 @@ void REQUESTER_Pulse_TIM_Handler()
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Функция установки в RTC полученной даты/время из запроса.
|
* @brief Функция установки в RTC полученной даты/время из запроса.
|
||||||
* @param Байтовый массив, 7 элементов. [0] - Часы. [1] - Минуты. [2] - Секунды. [3] - Год. [4] - Месяц. [5] - Дата. [6] - День недели.
|
* @param uint8_t *data - Байтовый массив, 7 элементов. [0] - Часы. [1] - Минуты. [2] - Секунды. [3] - Год. [4] - Месяц. [5] - Дата. [6] - День недели.
|
||||||
*/
|
*/
|
||||||
void REQUESTER_RTC_SYNC(uint8_t *data)
|
void REQUESTER_RTC_SYNC(uint8_t *data)
|
||||||
{
|
{
|
||||||
@@ -751,73 +732,122 @@ void REQUESTER_RTC_SYNC(uint8_t *data)
|
|||||||
* @brief Функция настройки фильтров CAN.
|
* @brief Функция настройки фильтров CAN.
|
||||||
* @details Настройка фильтров. Фильр для приёма сообщений с главного устройства. Фильтр для приёма на текущее устройство. Фильтр для приёма пульса других устройств в сети.
|
* @details Настройка фильтров. Фильр для приёма сообщений с главного устройства. Фильтр для приёма на текущее устройство. Фильтр для приёма пульса других устройств в сети.
|
||||||
*/
|
*/
|
||||||
void REQUESTER_CAN_FILTERS()
|
|
||||||
|
void CONFIG_CAN_FILTER(uint8_t filterBank, uint32_t idFilter, uint32_t idMask)
|
||||||
{
|
{
|
||||||
//MAIN DEVICE
|
|
||||||
CAN_FilterTypeDef canFilterConfig;
|
CAN_FilterTypeDef canFilterConfig;
|
||||||
canFilterConfig.FilterBank = 0;
|
canFilterConfig.FilterBank = filterBank;
|
||||||
canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
|
canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
|
||||||
canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
|
canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
|
||||||
/*Для ID устройства используются восемь младших битов.
|
|
||||||
Макс значение 0 устройство - 0x000, 1 - 0x002, 2 - 0x004, 3 - 0x006*/
|
|
||||||
canFilterConfig.FilterIdHigh = (uint16_t)(ID_MAIN_DEVICE>>13);
|
|
||||||
canFilterConfig.FilterIdLow = (uint16_t)(ID_MAIN_DEVICE<<5) | CAN_IDE_32;
|
|
||||||
/*Маска 1.1111.1110.<...>. Нули - любые символы. Единицы - точное соответствие фильтру выше.*/
|
|
||||||
canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DEVICE_ID_FILTER>>13);
|
|
||||||
canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DEVICE_ID_FILTER<<3) | CAN_IDE_32;
|
|
||||||
canFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
|
canFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
|
||||||
canFilterConfig.FilterActivation = ENABLE;
|
canFilterConfig.FilterActivation = ENABLE;
|
||||||
canFilterConfig.SlaveStartFilterBank = 14;
|
canFilterConfig.SlaveStartFilterBank = 14;
|
||||||
if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
|
||||||
{
|
|
||||||
Error_Handler();
|
|
||||||
}
|
|
||||||
|
|
||||||
//CURRENT DEVICE
|
// Разбиваем 32-битный ID и маску для фильтрации на High и Low 16 бит
|
||||||
canFilterConfig.FilterBank = 1;
|
canFilterConfig.FilterIdHigh = (uint16_t)( ((idFilter & 0xFFFF) >> 13) ); // верхние 16 бит
|
||||||
/*Для ID устройства используются восемь младших битов.
|
canFilterConfig.FilterIdLow = (uint16_t)( (((idFilter & 0x1FFF) << 3) ) | CAN_IDE_32 ); // низкие 16 бит,
|
||||||
Макс значение 0 устройство - 0x000, 1 - 0x002, 2 - 0x004, 3 - 0x006*/
|
canFilterConfig.FilterMaskIdHigh = (uint16_t)(((idMask & 0xFFFF) >> 13) );
|
||||||
canFilterConfig.FilterIdHigh = (uint16_t)(CURRENT_ID_DEVICE>>13);
|
canFilterConfig.FilterMaskIdLow = (uint16_t)( (((idMask & 0x1FFF) << 3) ) | CAN_IDE_32 );
|
||||||
canFilterConfig.FilterIdLow = (uint16_t)(CURRENT_ID_DEVICE<<5) | CAN_IDE_32;
|
|
||||||
/*Маска 1.1111.1110.<...>. Нули - любые символы. Единицы - точное соответствие фильтру выше.*/
|
|
||||||
canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DEVICE_ID_FILTER>>13);
|
|
||||||
canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DEVICE_ID_FILTER<<3) | CAN_IDE_32;
|
|
||||||
if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
|
||||||
{
|
|
||||||
Error_Handler();
|
|
||||||
}
|
|
||||||
|
|
||||||
//MODBUS
|
|
||||||
canFilterConfig.FilterBank = 2;
|
|
||||||
canFilterConfig.FilterIdHigh = (uint16_t)(0x03000000>>13);
|
|
||||||
canFilterConfig.FilterIdLow = (uint16_t)(0x03000000<<5) | CAN_IDE_32;
|
|
||||||
canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DATA_TYPE_FILTER>>13); // we're checking only high 13 bits, that contained "key"
|
|
||||||
canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DATA_TYPE_FILTER<<3) | CAN_IDE_32; // 1<<2 - set IDE bit
|
|
||||||
if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
|
||||||
{
|
|
||||||
Error_Handler();
|
|
||||||
}
|
|
||||||
|
|
||||||
//PULSE
|
|
||||||
canFilterConfig.FilterBank = 3;
|
|
||||||
canFilterConfig.FilterIdHigh = (uint16_t)(HighIdFilter(DATA_TYPE_PULSE)>>13);
|
|
||||||
//canFilterConfig.FilterIdHigh = (uint16_t)(0x1F000000>>13);
|
|
||||||
canFilterConfig.FilterIdLow = (uint16_t)(HighIdFilter(DATA_TYPE_PULSE)<<5) | CAN_IDE_32;
|
|
||||||
canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DATA_TYPE_FILTER>>13); // we're checking only high 13 bits, that contained "key"
|
|
||||||
canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DATA_TYPE_FILTER<<3) | CAN_IDE_32; // 1<<2 - set IDE bit
|
|
||||||
if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
|
||||||
{
|
|
||||||
Error_Handler();
|
|
||||||
}
|
|
||||||
|
|
||||||
//DEBUG FILTER "ALL IDE WELCOME"
|
|
||||||
canFilterConfig.FilterBank = 4;
|
|
||||||
canFilterConfig.FilterIdHigh = (uint16_t)(HighIdFilter(0)>>13);
|
|
||||||
canFilterConfig.FilterIdLow = (uint16_t)(HighIdFilter(0)<<5) | CAN_IDE_32;
|
|
||||||
canFilterConfig.FilterMaskIdHigh = (uint16_t)(0>>13); // we're checking only high 13 bits, that contained "key"
|
|
||||||
canFilterConfig.FilterMaskIdLow = (uint16_t)(0<<3) | CAN_IDE_32; // 1<<2 - set IDE bit
|
|
||||||
if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
||||||
{
|
{
|
||||||
Error_Handler();
|
Error_Handler();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define BIT27 (1UL << 27)
|
||||||
|
#define BITS_20_23_MASK (0xFUL << 20) // 4 бита (20..23)
|
||||||
|
#define BITS_24_26_MASK (0x7UL << 24) // 3 бита (24..26)
|
||||||
|
|
||||||
|
uint32_t filter1_id = BIT27 | CURRENT_TYPE_DEVICE | CURRENT_ID_DEVICE;
|
||||||
|
uint32_t filter1_mask = BIT27 | BITS_24_26_MASK | BITS_20_23_MASK; // все проверяемые биты
|
||||||
|
|
||||||
|
#define BITS_16_19_MASK (0xFUL << 16)
|
||||||
|
|
||||||
|
uint32_t filter2_id = DATA_TYPE_BROADCAST;
|
||||||
|
uint32_t filter2_mask = BITS_16_19_MASK;
|
||||||
|
|
||||||
|
uint32_t filter3_id = DATA_TYPE_PULSE;
|
||||||
|
uint32_t filter3_mask = BITS_16_19_MASK;
|
||||||
|
|
||||||
|
void REQUESTER_CAN_FILTERS()
|
||||||
|
{
|
||||||
|
// Первый фильтр: проверяем 20-27 биты, где 27-й всегда 1
|
||||||
|
CONFIG_CAN_FILTER(0, filter1_id, filter1_mask);
|
||||||
|
|
||||||
|
// Второй фильтр: проверяем 16-19 биты, равны DATA_TYPE_BROADCASTE
|
||||||
|
CONFIG_CAN_FILTER(1, filter2_id, filter2_mask);
|
||||||
|
|
||||||
|
// Третий фильтр: проверяем 16-19 биты, равны DATA_TYPE_PULSE
|
||||||
|
CONFIG_CAN_FILTER(2, filter3_id, filter3_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
//void REQUESTER_CAN_FILTERS()
|
||||||
|
//{
|
||||||
|
// //MAIN DEVICE
|
||||||
|
// CAN_FilterTypeDef canFilterConfig;
|
||||||
|
// canFilterConfig.FilterBank = 0;
|
||||||
|
// canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
|
||||||
|
// canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
|
||||||
|
// /*Для ID устройства используются восемь младших битов.
|
||||||
|
// Макс значение 0 устройство - 0x000, 1 - 0x002, 2 - 0x004, 3 - 0x006*/
|
||||||
|
// canFilterConfig.FilterIdHigh = (uint16_t)(ID_MAIN_DEVICE>>13);
|
||||||
|
// canFilterConfig.FilterIdLow = (uint16_t)(ID_MAIN_DEVICE<<5) | CAN_IDE_32;
|
||||||
|
// /*Маска 1.1111.1110.<...>. Нули - любые символы. Единицы - точное соответствие фильтру выше.*/
|
||||||
|
// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DEVICE_ID_FILTER>>13);
|
||||||
|
// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DEVICE_ID_FILTER<<3) | CAN_IDE_32;
|
||||||
|
// canFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
|
||||||
|
// canFilterConfig.FilterActivation = ENABLE;
|
||||||
|
// canFilterConfig.SlaveStartFilterBank = 14;
|
||||||
|
// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
||||||
|
// {
|
||||||
|
// Error_Handler();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// //CURRENT DEVICE
|
||||||
|
// canFilterConfig.FilterBank = 1;
|
||||||
|
// /*Для ID устройства используются восемь младших битов.
|
||||||
|
// Макс значение 0 устройство - 0x000, 1 - 0x002, 2 - 0x004, 3 - 0x006*/
|
||||||
|
// canFilterConfig.FilterIdHigh = (uint16_t)(CURRENT_ID_DEVICE>>13);
|
||||||
|
// canFilterConfig.FilterIdLow = (uint16_t)(CURRENT_ID_DEVICE<<5) | CAN_IDE_32;
|
||||||
|
// /*Маска 1.1111.1110.<...>. Нули - любые символы. Единицы - точное соответствие фильтру выше.*/
|
||||||
|
// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DEVICE_ID_FILTER>>13);
|
||||||
|
// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DEVICE_ID_FILTER<<3) | CAN_IDE_32;
|
||||||
|
// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
||||||
|
// {
|
||||||
|
// Error_Handler();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// //MODBUS
|
||||||
|
// canFilterConfig.FilterBank = 2;
|
||||||
|
// canFilterConfig.FilterIdHigh = (uint16_t)(0x03000000>>13);
|
||||||
|
// canFilterConfig.FilterIdLow = (uint16_t)(0x03000000<<5) | CAN_IDE_32;
|
||||||
|
// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DATA_TYPE_FILTER>>13); // we're checking only high 13 bits, that contained "key"
|
||||||
|
// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DATA_TYPE_FILTER<<3) | CAN_IDE_32; // 1<<2 - set IDE bit
|
||||||
|
// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
||||||
|
// {
|
||||||
|
// Error_Handler();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// //PULSE
|
||||||
|
// canFilterConfig.FilterBank = 3;
|
||||||
|
// canFilterConfig.FilterIdHigh = (uint16_t)(HighIdFilter(DATA_TYPE_PULSE)>>13);
|
||||||
|
// canFilterConfig.FilterIdLow = (uint16_t)(HighIdFilter(DATA_TYPE_PULSE)<<5) | CAN_IDE_32;
|
||||||
|
// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DATA_TYPE_FILTER>>13); // we're checking only high 13 bits, that contained "key"
|
||||||
|
// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DATA_TYPE_FILTER<<3) | CAN_IDE_32; // 1<<2 - set IDE bit
|
||||||
|
// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
||||||
|
// {
|
||||||
|
// Error_Handler();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// //DEBUG FILTER "ALL IDE WELCOME"
|
||||||
|
// canFilterConfig.FilterBank = 4;
|
||||||
|
// canFilterConfig.FilterIdHigh = (uint16_t)(HighIdFilter(0)>>13);
|
||||||
|
// canFilterConfig.FilterIdLow = (uint16_t)(HighIdFilter(0)<<5) | CAN_IDE_32;
|
||||||
|
// canFilterConfig.FilterMaskIdHigh = (uint16_t)(0>>13); // we're checking only high 13 bits, that contained "key"
|
||||||
|
// canFilterConfig.FilterMaskIdLow = (uint16_t)(0<<3) | CAN_IDE_32; // 1<<2 - set IDE bit
|
||||||
|
// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
||||||
|
// {
|
||||||
|
// Error_Handler();
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|||||||
@@ -117,6 +117,11 @@
|
|||||||
<pMon>Segger\JL2CM3.dll</pMon>
|
<pMon>Segger\JL2CM3.dll</pMon>
|
||||||
</DebugOpt>
|
</DebugOpt>
|
||||||
<TargetDriverDllRegistry>
|
<TargetDriverDllRegistry>
|
||||||
|
<SetRegEntry>
|
||||||
|
<Number>0</Number>
|
||||||
|
<Key>DLGUARM</Key>
|
||||||
|
<Name>В¬†wTІв TІв п;Зq</Name>
|
||||||
|
</SetRegEntry>
|
||||||
<SetRegEntry>
|
<SetRegEntry>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
<Key>ARMRTXEVENTFLAGS</Key>
|
<Key>ARMRTXEVENTFLAGS</Key>
|
||||||
@@ -135,11 +140,7 @@
|
|||||||
<SetRegEntry>
|
<SetRegEntry>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
<Key>JL2CM3</Key>
|
<Key>JL2CM3</Key>
|
||||||
<Name>-U -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F103RG$Flash\STM32F10x_1024.FLM)</Name>
|
<Name>-U-O14 -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F103RG$Flash\STM32F10x_1024.FLM)</Name>
|
||||||
</SetRegEntry>
|
|
||||||
<SetRegEntry>
|
|
||||||
<Number>0</Number>
|
|
||||||
<Key>DLGUARM</Key>
|
|
||||||
</SetRegEntry>
|
</SetRegEntry>
|
||||||
<SetRegEntry>
|
<SetRegEntry>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
@@ -152,7 +153,79 @@
|
|||||||
<Name>-U-O142 -O2254 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F103RG$Flash\STM32F10x_1024.FLM)</Name>
|
<Name>-U-O142 -O2254 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F103RG$Flash\STM32F10x_1024.FLM)</Name>
|
||||||
</SetRegEntry>
|
</SetRegEntry>
|
||||||
</TargetDriverDllRegistry>
|
</TargetDriverDllRegistry>
|
||||||
<Breakpoint/>
|
<Breakpoint>
|
||||||
|
<Bp>
|
||||||
|
<Number>0</Number>
|
||||||
|
<Type>0</Type>
|
||||||
|
<LineNumber>30</LineNumber>
|
||||||
|
<EnabledFlag>1</EnabledFlag>
|
||||||
|
<Address>134237984</Address>
|
||||||
|
<ByteObject>0</ByteObject>
|
||||||
|
<HtxType>0</HtxType>
|
||||||
|
<ManyObjects>0</ManyObjects>
|
||||||
|
<SizeOfObject>0</SizeOfObject>
|
||||||
|
<BreakByAccess>0</BreakByAccess>
|
||||||
|
<BreakIfRCount>1</BreakIfRCount>
|
||||||
|
<Filename>..\Core\Src\requester.c</Filename>
|
||||||
|
<ExecCommand></ExecCommand>
|
||||||
|
<Expression>\\CAN_Request_Response_protocol\../Core/Src/requester.c\30</Expression>
|
||||||
|
</Bp>
|
||||||
|
<Bp>
|
||||||
|
<Number>1</Number>
|
||||||
|
<Type>0</Type>
|
||||||
|
<LineNumber>52</LineNumber>
|
||||||
|
<EnabledFlag>1</EnabledFlag>
|
||||||
|
<Address>134236608</Address>
|
||||||
|
<ByteObject>0</ByteObject>
|
||||||
|
<HtxType>0</HtxType>
|
||||||
|
<ManyObjects>0</ManyObjects>
|
||||||
|
<SizeOfObject>0</SizeOfObject>
|
||||||
|
<BreakByAccess>0</BreakByAccess>
|
||||||
|
<BreakIfRCount>1</BreakIfRCount>
|
||||||
|
<Filename>../Core/Src/can.c</Filename>
|
||||||
|
<ExecCommand></ExecCommand>
|
||||||
|
<Expression>\\CAN_Request_Response_protocol\../Core/Src/can.c\52</Expression>
|
||||||
|
</Bp>
|
||||||
|
<Bp>
|
||||||
|
<Number>2</Number>
|
||||||
|
<Type>0</Type>
|
||||||
|
<LineNumber>334</LineNumber>
|
||||||
|
<EnabledFlag>1</EnabledFlag>
|
||||||
|
<Address>134223362</Address>
|
||||||
|
<ByteObject>0</ByteObject>
|
||||||
|
<HtxType>0</HtxType>
|
||||||
|
<ManyObjects>0</ManyObjects>
|
||||||
|
<SizeOfObject>0</SizeOfObject>
|
||||||
|
<BreakByAccess>0</BreakByAccess>
|
||||||
|
<BreakIfRCount>1</BreakIfRCount>
|
||||||
|
<Filename>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c</Filename>
|
||||||
|
<ExecCommand></ExecCommand>
|
||||||
|
<Expression>\\CAN_Request_Response_protocol\../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c\334</Expression>
|
||||||
|
</Bp>
|
||||||
|
<Bp>
|
||||||
|
<Number>3</Number>
|
||||||
|
<Type>0</Type>
|
||||||
|
<LineNumber>1008</LineNumber>
|
||||||
|
<EnabledFlag>1</EnabledFlag>
|
||||||
|
<Address>134224438</Address>
|
||||||
|
<ByteObject>0</ByteObject>
|
||||||
|
<HtxType>0</HtxType>
|
||||||
|
<ManyObjects>0</ManyObjects>
|
||||||
|
<SizeOfObject>0</SizeOfObject>
|
||||||
|
<BreakByAccess>0</BreakByAccess>
|
||||||
|
<BreakIfRCount>1</BreakIfRCount>
|
||||||
|
<Filename>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c</Filename>
|
||||||
|
<ExecCommand></ExecCommand>
|
||||||
|
<Expression>\\CAN_Request_Response_protocol\../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c\1008</Expression>
|
||||||
|
</Bp>
|
||||||
|
</Breakpoint>
|
||||||
|
<WatchWindow1>
|
||||||
|
<Ww>
|
||||||
|
<count>0</count>
|
||||||
|
<WinNumber>1</WinNumber>
|
||||||
|
<ItemText>sTime</ItemText>
|
||||||
|
</Ww>
|
||||||
|
</WatchWindow1>
|
||||||
<Tracepoint>
|
<Tracepoint>
|
||||||
<THDelay>0</THDelay>
|
<THDelay>0</THDelay>
|
||||||
</Tracepoint>
|
</Tracepoint>
|
||||||
@@ -195,6 +268,16 @@
|
|||||||
<pszMrulep></pszMrulep>
|
<pszMrulep></pszMrulep>
|
||||||
<pSingCmdsp></pSingCmdsp>
|
<pSingCmdsp></pSingCmdsp>
|
||||||
<pMultCmdsp></pMultCmdsp>
|
<pMultCmdsp></pMultCmdsp>
|
||||||
|
<SystemViewers>
|
||||||
|
<Entry>
|
||||||
|
<Name>System Viewer\CAN</Name>
|
||||||
|
<WinId>35904</WinId>
|
||||||
|
</Entry>
|
||||||
|
<Entry>
|
||||||
|
<Name>System Viewer\RTC</Name>
|
||||||
|
<WinId>35905</WinId>
|
||||||
|
</Entry>
|
||||||
|
</SystemViewers>
|
||||||
<DebugDescription>
|
<DebugDescription>
|
||||||
<Enable>1</Enable>
|
<Enable>1</Enable>
|
||||||
<EnableFlashSeq>1</EnableFlashSeq>
|
<EnableFlashSeq>1</EnableFlashSeq>
|
||||||
|
|||||||
@@ -1,62 +0,0 @@
|
|||||||
#ifndef _new_can_protocol_ID_struct
|
|
||||||
#define _new_can_protocol_ID_struct
|
|
||||||
|
|
||||||
//Route mode
|
|
||||||
#define ROUTE_MASTER 0
|
|
||||||
#define ROUTE_SLAVE 1
|
|
||||||
|
|
||||||
//Data Types
|
|
||||||
#define DATA_TYPE_BROADCAST 0b0000
|
|
||||||
#define DATA_TYPE_DISCRETE 0b0001
|
|
||||||
#define DATA_TYPE_ANALOG 0b0010
|
|
||||||
#define DATA_TYPE_MODBUS_COIL 0b0011
|
|
||||||
#define DATA_TYPE_MODBUS_DISCRETE 0b0100
|
|
||||||
#define DATA_TYPE_MODBUS_HOLDING 0b0101
|
|
||||||
#define DATA_TYPE_MODBUS_INPUT 0b0110
|
|
||||||
#define DATA_TYPE_ERROR 0b0111
|
|
||||||
#define DATA_TYPE_PULSE 0b1111
|
|
||||||
|
|
||||||
//Sensor Types for DATA_TYPE_BROADCAST
|
|
||||||
#define SENSOR_TYPE_BROADCAST_STATUS 0b00000
|
|
||||||
#define SENSOR_TYPE_BROADCAST_ONOFF 0b00001
|
|
||||||
#define SENSOR_TYPE_BROADCAST_RESTARTDEVICE 0b00010
|
|
||||||
#define SENSOR_TYPE_BROADCAST_RTCSETUP 0b00011
|
|
||||||
|
|
||||||
//Sensor Types for DATA_TYPE_DISCRETE
|
|
||||||
#define SENSOR_TYPE_DISCRETE_ACCIDENT 0b00000
|
|
||||||
#define SENSOR_TYPE_DISCRETE_WARNING 0b00001
|
|
||||||
#define SENSOR_TYPE_DISCRETE_CONTROL_SIGNALS 0b00010
|
|
||||||
#define SENSOR_TYPE_DISCRETE_FLAGS 0b00011
|
|
||||||
#define SENSOR_TYPE_DISCRETE_RESET 0b00100
|
|
||||||
#define SENSOR_TYPE_DISCRETE_CHANGE_MODE 0b00101
|
|
||||||
#define SENSOR_TYPE_DISCRETE_REQUEST_LIST_OF_PARAMETERS 0b00110
|
|
||||||
|
|
||||||
//Sensor Types for DATA_TYPE_ANALOG
|
|
||||||
#define SENSOR_TYPE_ANALOG_UNIVERSAL 0b00000
|
|
||||||
#define SENSOR_TYPE_ANALOG_USTAVKI 0b00001
|
|
||||||
#define SENSOR_TYPE_ANALOG_U 0b00010
|
|
||||||
#define SENSOR_TYPE_ANALOG_I 0b00011
|
|
||||||
#define SENSOR_TYPE_ANALOG_T 0b00100
|
|
||||||
|
|
||||||
//Error Code
|
|
||||||
#define NONEXISTENT_ELEMENT 0x01
|
|
||||||
|
|
||||||
typedef union _extID{
|
|
||||||
struct extID_Standard_Fields{
|
|
||||||
unsigned DeviceID:8;
|
|
||||||
unsigned SensorID:11;
|
|
||||||
unsigned SensorType:5;
|
|
||||||
unsigned DataType:4;
|
|
||||||
unsigned Route:1;
|
|
||||||
}StandardFields;
|
|
||||||
struct extID_Modbus_Fields{
|
|
||||||
unsigned DeviceID:8;
|
|
||||||
unsigned CountReg:8;
|
|
||||||
unsigned StrAdr:8;
|
|
||||||
unsigned DataType:4;
|
|
||||||
unsigned Route:1;
|
|
||||||
}ModbusFields;
|
|
||||||
unsigned int BitAll:29;
|
|
||||||
}extID;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
BIN
requester.xlsx
BIN
requester.xlsx
Binary file not shown.
BIN
Протокол CAN и ОАП.xlsx
Normal file
BIN
Протокол CAN и ОАП.xlsx
Normal file
Binary file not shown.
Reference in New Issue
Block a user