Compare commits

...

2 Commits

Author SHA1 Message Date
a2bc323649 Сделана заготовка для Read Device Identification
И надо как-то переструктуризировать и оптимизировать модбас библиотеку
2024-12-24 16:38:42 +03:00
1830087d6e в мб дату добавлены дефолтные значения + minor fixes 2024-12-24 14:45:40 +03:00
10 changed files with 306 additions and 94 deletions

View File

@ -18,6 +18,14 @@
@{
*/
#define MODBUS_VENDOR_NAME "\n\rNIO-12"
#define MODBUS_PRODUCT_CODE "\n\r12345"
#define MODBUS_REVISION "\n\r1.0"
#define MODBUS_VENDOR_URL "\n\rhttps://git.arktika.cyou/Andrey/Diod_Test"
#define MODBUS_PRODUCT_NAME "\n\rDiode Tester"
#define MODBUS_MODEL_NAME "\n\rSTM32F103"
#define MODBUS_USER_APPLICATION_NAME "\n\rdiode_tester"
//#define MODBUS_UART_NUMB 1 ///< Номер используемого UART, по нему выставляется дефайн USED_MB_UART = USARTx
#define MODBUS_SPEED 115200 ///< Скорость UART для модбас
//#define MODBUS_GPIOX GPIOA ///< Порт для UART RX/TX

View File

@ -95,6 +95,7 @@ RS_HandleTypeDef hmodbus1;
/* DEFINE REGISTERS/COILS */
MB_DataStructureTypeDef MB_DATA;
RS_MsgTypeDef MODBUS_MSG;
MB_DeviceIdentificationTypeDef MB_INFO;
uint32_t delay_scide = 1;
uint32_t numb_scide = 10;
@ -109,6 +110,7 @@ uint32_t numb_scide = 10;
*/
void MODBUS_FirstInit(void)
{
MB_DevoceInentificationInit();
//-----------SETUP MODBUS-------------
// set up UART for modbus
#ifdef INCLUDE_GENERAL_PERIPH_LIBS
@ -589,6 +591,54 @@ uint8_t MB_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg)
return 1;
}
void MB_WriteObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj)
{
mbdata[(*ind)++] = obj->length;
for (int i = 0; i < obj->length; i++)
{
mbdata[(*ind)++] = obj->name[i];
}
}
/**
* @brief Proccess command Read Device Identification (43/14 - 0x2B/0E).
* @param modbus_msg - указатель на структуру собщения modbus.
* @return fMessageHandled - статус о результате обработки комманды.
* @details Обработка команды Write Single Register.
*/
uint8_t MB_Read_Device_Identification(RS_MsgTypeDef *modbus_msg)
{
char *mbdata = (char *)modbus_msg->DATA;
unsigned ind = 0;
switch(modbus_msg->DevId.ReadDevId)
{
case MB_BASIC_IDENTIFICATION:
mbdata[ind++] = 0x00;
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.VendorName);
mbdata[ind++] = 0x01;
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.ProductCode);
mbdata[ind++] = 0x02;
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.Revision);
modbus_msg->DevId.NumbOfObj = 3;
break;
case MB_REGULAR_IDENTIFICATION:
mbdata[ind++] = 0x03;
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.VendorUrl);
mbdata[ind++] = 0x04;
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.ProductName);
mbdata[ind++] = 0x05;
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.ModelName);
mbdata[ind++] = 0x06;
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.UserApplicationName);
modbus_msg->DevId.NumbOfObj = 4;
break;
default:
return 0;
}
modbus_msg->ByteCnt = ind;
return 1;
}
/**
* @brief Respond accord to received message.
@ -661,6 +711,11 @@ RS_StatusTypeDef RS_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_ms
}
break;
case MB_R_DEVICE_INFO:
hmodbus->f.MessageHandled = MB_Read_Device_Identification(hmodbus->pMessagePtr);
break;
/* unknown func code */
default: modbus_msg->Except_Code = 0x01; /* set exception code: illegal function */
}
@ -715,6 +770,35 @@ RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *mo
if (modbus_msg->Func_Code < ERR_VALUES_START) // if no error occur
{
// fill modbus header
if(modbus_msg->Func_Code == MB_R_DEVICE_INFO) // devide identification header
{
modbus_uart_buff[ind++] = modbus_msg->DevId.MEI_Type;
modbus_uart_buff[ind++] = modbus_msg->DevId.ReadDevId;
modbus_uart_buff[ind++] = modbus_msg->DevId.Conformity;
modbus_uart_buff[ind++] = modbus_msg->DevId.MoreFollows;
modbus_uart_buff[ind++] = modbus_msg->DevId.NextObjId;
modbus_uart_buff[ind++] = modbus_msg->DevId.NumbOfObj;
if (modbus_msg->ByteCnt > DATA_SIZE*2) // if ByteCnt less than DATA_SIZE
{
TrackerCnt_Err(hmodbus->rs_err);
return RS_COLLECT_MSG_ERR;
}
//---------------DATA----------------
//-----------[data bytes]------------
uint8_t *tmp_data_addr = (uint8_t *)modbus_msg->DATA;
for(int i = 0; i < modbus_msg->ByteCnt; i++) // filling buffer with data
{ // set data
modbus_uart_buff[ind++] = *tmp_data_addr;
tmp_data_addr++;
}
}
else // modbus data header
{
// set size of received data
if (modbus_msg->ByteCnt <= DATA_SIZE*2) // if ByteCnt less than DATA_SIZE
modbus_uart_buff[ind++] = modbus_msg->ByteCnt;
@ -737,6 +821,9 @@ RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *mo
tmp_data_addr++;
}
}
}
}
else // if some error occur
{ // send expection code
@ -776,9 +863,17 @@ RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modb
if(modbus_msg->MbAddr != hmodbus->ID)
return RS_SKIP;
// get dat or err response
// get func code
modbus_msg->Func_Code = modbus_uart_buff[ind++];
if(modbus_msg->Func_Code == MB_R_DEVICE_INFO) // if it device identification request
{
modbus_msg->DevId.MEI_Type = modbus_uart_buff[ind++];
modbus_msg->DevId.ReadDevId = modbus_uart_buff[ind++];
modbus_msg->DevId.NextObjId = modbus_uart_buff[ind++];
modbus_msg->ByteCnt = 0;
}
else // if its classic modbus request
{
// get address from CMD
modbus_msg->Addr = modbus_uart_buff[ind++] << 8;
modbus_msg->Addr |= modbus_uart_buff[ind++];
@ -786,7 +881,7 @@ RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modb
// get address from CMD
modbus_msg->Qnt = modbus_uart_buff[ind++] << 8;
modbus_msg->Qnt |= modbus_uart_buff[ind++];
}
if(hmodbus->f.RX_Half == 0) // if all message received
{
//---------------DATA----------------
@ -856,6 +951,7 @@ RS_StatusTypeDef RS_Define_Size_of_RX_Message(RS_HandleTypeDef *hmodbus, uint32_
if(MB_RES == RS_SKIP) // if message not for us
return MB_RES; // return
if ((hmodbus->pMessagePtr->Func_Code & ~ERR_VALUES_START) < 0x0F)
{
hmodbus->pMessagePtr->ByteCnt = 0;
@ -867,6 +963,13 @@ RS_StatusTypeDef RS_Define_Size_of_RX_Message(RS_HandleTypeDef *hmodbus, uint32_
// +1 because that defines is size, not ind.
*rx_data_size = hmodbus->pMessagePtr->ByteCnt + 2;
}
if(hmodbus->pMessagePtr->Func_Code == MB_R_DEVICE_INFO)
{
*rx_data_size = 0;
}
hmodbus->RS_Message_Size = RX_FIRST_PART_SIZE + *rx_data_size; // size of whole message
return RS_OK;
}
@ -875,21 +978,25 @@ RS_StatusTypeDef RS_Define_Size_of_RX_Message(RS_HandleTypeDef *hmodbus, uint32_
//-------------------------------------------------------------------
void MB_DevoceInentificationInit(void)
{
MB_INFO.VendorName.name = MODBUS_VENDOR_NAME;
MB_INFO.ProductCode.name = MODBUS_PRODUCT_CODE;
MB_INFO.Revision.name = MODBUS_REVISION;
MB_INFO.VendorUrl.name = MODBUS_VENDOR_URL;
MB_INFO.ProductName.name = MODBUS_PRODUCT_NAME;
MB_INFO.ModelName.name = MODBUS_MODEL_NAME;
MB_INFO.UserApplicationName.name = MODBUS_USER_APPLICATION_NAME;
MB_INFO.VendorName.length = sizeof(MODBUS_VENDOR_NAME);
MB_INFO.ProductCode.length = sizeof(MODBUS_PRODUCT_CODE);
MB_INFO.Revision.length = sizeof(MODBUS_REVISION);
MB_INFO.VendorUrl.length = sizeof(MODBUS_VENDOR_URL);
MB_INFO.ProductName.length = sizeof(MODBUS_PRODUCT_NAME);
MB_INFO.ModelName.length = sizeof(MODBUS_MODEL_NAME);
MB_INFO.UserApplicationName.length = sizeof(MODBUS_USER_APPLICATION_NAME);
}
//-------------------------------------------------------------------
//-------------------------HANDLERS FUNCTION-------------------------
//void USART1_IRQHandler(void)
//{
// Trace_MB_UART_Enter();
// RS_UART_Handler(&hmodbus1);
// Trace_MB_UART_Exit();
//}
//void TIM1_UP_TIM10_IRQHandler(void)
//{
// Trace_MB_TIM_Enter();
// RS_TIM_Handler(&hmodbus1);
// Trace_MB_TIM_Exit();
//}
//-------------------------HANDLERS FUNCTION-------------------------
//-------------------------------------------------------------------

View File

@ -86,6 +86,8 @@ typedef enum //MB_FunctonTypeDef
MB_W_COILS = 0x0F, ///< Запись нескольких битовых ячеек
MB_W_HOLD_REGS = 0x10, ///< Запись нескольких регистров
MB_R_DEVICE_INFO = 0x2B, ///< Чтения информации об устройстве
/* ERRORS */
// error reading
MB_ERR_R_COILS = MB_R_COILS + ERR_VALUES_START, ///< Ошибка чтения битовых ячеек
@ -100,11 +102,41 @@ typedef enum //MB_FunctonTypeDef
MB_ERR_W_HOLD_REGS = MB_W_HOLD_REGS + ERR_VALUES_START, ///< Ошибка записи нескольких регистров
}MB_FunctonTypeDef;
/** @brief Structure for MEI func codes */
typedef enum //MB_FunctonTypeDef
{
MEI_DEVICE_IDENTIFICATION = 0x0E,
}MB_MEITypeDef;
/** @brief Structure for MEI func codes */
typedef enum //MB_FunctonTypeDef
{
MB_BASIC_IDENTIFICATION = 0x01,
MB_REGULAR_IDENTIFICATION = 0x02,
/* ERRORS */
MB_ERR_BASIC_IDENTIFICATION = MB_BASIC_IDENTIFICATION + ERR_VALUES_START,
MB_ERR_REGULAR_IDENTIFICATION = MB_REGULAR_IDENTIFICATION + ERR_VALUES_START,
}MB_ConformityTypeDef;
/** @brief Structure for decive identification message type */
typedef struct
{
MB_MEITypeDef MEI_Type; ///< MEI Type assigned number for Device Identification Interface
MB_ConformityTypeDef ReadDevId;
MB_ConformityTypeDef Conformity;
uint8_t MoreFollows; ///< in this library always a zero
uint8_t NextObjId;
uint8_t NumbOfObj;
}MB_DevIdMsgTypeDef;
/** @brief Structure for modbus messsage */
typedef struct // RS_MsgTypeDef
{
uint8_t MbAddr; ///< Modbus Slave Address
MB_FunctonTypeDef Func_Code; ///< Modbus Function Code
MB_DevIdMsgTypeDef DevId; ///< Read Device Identification Header struct
uint16_t Addr; ///< Modbus Address of data
uint16_t Qnt; ///< Quantity of modbus data
uint8_t ByteCnt; ///< Quantity of bytes of data in message to transmit/receive

View File

@ -148,6 +148,23 @@ typedef struct // tester modbus data
extern MB_DataStructureTypeDef MB_DATA;
typedef struct
{
unsigned length;
char *name;
}MB_DeviceObjectTypeDef;
typedef struct
{
MB_DeviceObjectTypeDef VendorName;
MB_DeviceObjectTypeDef ProductCode;
MB_DeviceObjectTypeDef Revision;
MB_DeviceObjectTypeDef VendorUrl;
MB_DeviceObjectTypeDef ProductName;
MB_DeviceObjectTypeDef ModelName;
MB_DeviceObjectTypeDef UserApplicationName;
}MB_DeviceIdentificationTypeDef;
void MB_DevoceInentificationInit(void);
#endif //_MODBUS_DATA_H_

View File

@ -388,12 +388,12 @@ RS_StatusTypeDef RS_UART_RxCpltCallback(RS_HandleTypeDef *hRS)
{ // First receive part of message, then define size of rest of message, and start receive it
hRS->f.RX_Half = 1;
//---------------FIND DATA SIZE-----------------
uint32_t NuRS_of_Rest_Bytes = 0;
uint32_t NuRS_of_Rest_Bytes = 0xFFFF;
RS_RES = RS_Define_Size_of_RX_Message(hRS, &NuRS_of_Rest_Bytes);
// if there is no bytes to receive OR we need to skip this message - restart receive
if ((NuRS_of_Rest_Bytes == 0) || (RS_RES == RS_SKIP))
// if we need to skip this message - restart receive
if(RS_RES == RS_SKIP || NuRS_of_Rest_Bytes == 0xFFFF)
{
TrackerCnt_Err(hRS->rs_err);
RS_Abort(hRS, ABORT_RX);
@ -401,6 +401,26 @@ RS_StatusTypeDef RS_UART_RxCpltCallback(RS_HandleTypeDef *hRS)
return RS_RES;
}
// if there is no bytes to receive
if(NuRS_of_Rest_Bytes == 0)
{
hRS->f.RX_Half = 0;
//---------PROCESS DATA & ENDING RECEIVING--------
RS_Set_RX_End(hRS);
if(hRS->sRS_Timeout) // if timeout setted
HAL_TIM_Base_Stop_IT(hRS->htim); // stop timeout
// parse received data
RS_RES = RS_Parse_Message(hRS, hRS->pMessagePtr, hRS->pBufferPtr); // parse message
// RESPONSE
RS_RES = RS_Response(hRS, hRS->pMessagePtr);
return RS_RES;
}
//-------------START UART RECEIVE---------------
uart_res = HAL_UART_Receive_IT(hRS->huart, (hRS->pBufferPtr + RX_FIRST_PART_SIZE), NuRS_of_Rest_Bytes);

View File

@ -86,7 +86,7 @@ void TESTER_ADC_UpdateSettings(TESTER_ADCTypeDef *adc, MB_DataStructureTypeDef *
adc->chAdc.s.expected_pulse_sign = mbdata->HoldRegs.Adc_PulseSign;
adc->chAdc.s.pulse_width = mbdata->HoldRegs.Adc_PulseWidth;
adc->chAdc.s.U_step = (float)mbdata->HoldRegs.Adc_U_Calibr/(adc->chAdc.s.ADC_calibr - adc->chAdc.s.ADC_zero);
adc->chAdc.s.U_step = ((float)mbdata->HoldRegs.Adc_U_Calibr/1000)/(adc->chAdc.s.ADC_calibr - adc->chAdc.s.ADC_zero);
}
HAL_StatusTypeDef ADC_DMA_StartRead(TESTER_ADCTypeDef *adc)

View File

@ -25,12 +25,6 @@
*/
#define DEF_MS_TIME_FOR_POSITIVE 2000
/**
* @brief Задержка для дедтайма ПО УМОЛЧАНИЮ
* @details Задержка миллисекундная или микросекундная @ref DEF_DEADTIME_MS_DELAY
*/
#define DEF_DEADTIME 500
#define DEF_DEADTIME_MS_DELAY 0 ///< включение миллисекундной задержки для @ref DEF_DEADTIME по умолчанию
/**
* @brief Задержка перед началом тестирования ПО УМОЛЧАНИЮ
@ -39,6 +33,13 @@
#define DEF_TIME_BEFORE_TEST 500
#define DEF_TIME_BEFORE_TEST_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_TEST по умолчанию
/**
* @brief Задержка для дедтайма ПО УМОЛЧАНИЮ
* @details Задержка миллисекундная или микросекундная @ref DEF_DEADTIME_MS_DELAY
*/
#define DEF_DEADTIME 500
#define DEF_DEADTIME_MS_DELAY 0 ///< включение миллисекундной задержки для @ref DEF_DEADTIME по умолчанию
/**
* @brief Задержка между включением АЦП и предполагаемым скачком напряжения ПО УМОЛЧАНИЮ
* @details Задержка нужна, чтобы точно поймать его в буфере АЦП.
@ -135,6 +136,8 @@
* @brief Конфигурации для АЦП
@{
*/
#define TESTER_ADC_PULSE_EXPETCED_WIDTH 4 ///< Предполагаемая длительность пика в отчетах ацп
#define TESTER_ADC_PULSE_SIGN 0 ///< Полярность импульса 0 - положительная, 1 - отрицательая
#define ADC_BUFF_SIZE (200) ///< Размер буфера АЦП
#define ADC_DMA_BUFF_SIZE (ADC_BUFF_SIZE) ///< Размер буфера ДМА (1 канал)
@ -145,7 +148,6 @@
#define ADC_READ_TIMEOUT_MS 20 ///< Таймаут на ожидание разрядки конденсатора
#define TESTER_ADC_PULES_EXPETCED_WIDTH 4 ///< Предполагаемая длительность пика в отчетах ацп
/** TESTER_ADC_CONFIG
* @}

View File

@ -220,7 +220,7 @@ void TESTER_Set_Default_Settings(TESTER_ProjectTypeDef *tester)
/* Настройка АЦП */
tester->mbdata->HoldRegs.Adc_PulseWidth = TESTER_ADC_PULES_EXPETCED_WIDTH;
tester->mbdata->HoldRegs.Adc_PulseWidth = TESTER_ADC_PULSE_EXPETCED_WIDTH;
tester->mbdata->HoldRegs.Adc_CalibrValue = ADC_VALUE_CALIBR;
tester->mbdata->HoldRegs.Adc_ZeroValue = ADC_VALUE_ZERO;
tester->mbdata->HoldRegs.Adc_U_Calibr = ADC_U_CALIBR;

View File

@ -148,7 +148,24 @@
<Name>-U53FF72064980555724221187 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL08000 -FP0($$Device:STM32F103C6$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>
<Breakpoint>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>227</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134244270</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>../Core/Src/stm32f1xx_it.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\diode_tester\../Core/Src/stm32f1xx_it.c\227</Expression>
</Bp>
</Breakpoint>
<WatchWindow1>
<Ww>
<count>0</count>
@ -180,6 +197,11 @@
<WinNumber>1</WinNumber>
<ItemText>tester-&gt;mbdata-&gt;Coils</ItemText>
</Ww>
<Ww>
<count>6</count>
<WinNumber>1</WinNumber>
<ItemText>RS_Buffer</ItemText>
</Ww>
</WatchWindow1>
<WatchWindow2>
<Ww>
@ -217,6 +239,26 @@
<WinNumber>2</WinNumber>
<ItemText>\\diode_tester\../Core/Tester_main/tester_main.c\TESTER</ItemText>
</Ww>
<Ww>
<count>7</count>
<WinNumber>2</WinNumber>
<ItemText>MB_INFO</ItemText>
</Ww>
<Ww>
<count>8</count>
<WinNumber>2</WinNumber>
<ItemText>RS_Buffer</ItemText>
</Ww>
<Ww>
<count>9</count>
<WinNumber>2</WinNumber>
<ItemText>*ind</ItemText>
</Ww>
<Ww>
<count>10</count>
<WinNumber>2</WinNumber>
<ItemText>&amp;ind</ItemText>
</Ww>
</WatchWindow2>
<Tracepoint>
<THDelay>0</THDelay>
@ -262,28 +304,12 @@
<pMultCmdsp></pMultCmdsp>
<SystemViewers>
<Entry>
<Name>System Viewer\ADC1</Name>
<WinId>35903</WinId>
</Entry>
<Entry>
<Name>System Viewer\AFIO</Name>
<WinId>35905</WinId>
</Entry>
<Entry>
<Name>System Viewer\DMA1</Name>
<WinId>35902</WinId>
</Entry>
<Entry>
<Name>System Viewer\GPIOA</Name>
<WinId>35904</WinId>
</Entry>
<Entry>
<Name>System Viewer\GPIOB</Name>
<WinId>35901</WinId>
<Name>System Viewer\TIM2</Name>
<WinId>35899</WinId>
</Entry>
<Entry>
<Name>System Viewer\USART1</Name>
<WinId>35900</WinId>
<WinId>35905</WinId>
</Entry>
</SystemViewers>
<DebugDescription>

Binary file not shown.