diff --git a/john103C6T6/Core/Inc/Proj_setup.h b/john103C6T6/Core/Inc/Proj_setup.h index 88e17bd..ed964fa 100644 --- a/john103C6T6/Core/Inc/Proj_setup.h +++ b/john103C6T6/Core/Inc/Proj_setup.h @@ -3,7 +3,7 @@ //**********BEGIN defines*********** //#define OldVer - +#define MAX_SENSE 32 // НЕ ДЕЛАТЬ МЕНЬШЕ 16 diff --git a/john103C6T6/Core/Inc/ds18b20_driver.h b/john103C6T6/Core/Inc/ds18b20_driver.h index 41de8ba..3a30f9f 100644 --- a/john103C6T6/Core/Inc/ds18b20_driver.h +++ b/john103C6T6/Core/Inc/ds18b20_driver.h @@ -20,10 +20,12 @@ /* Includes ------------------------------------------------------------------*/ #include "onewire.h" +#include "PROJ_setup.h" + /* Data Structure ------------------------------------------------------------*/ -#define DS18B20_DEVICE_AMOUNT 30 +#define DS18B20_DEVICE_AMOUNT MAX_SENSE /* Register ------------------------------------------------------------------*/ #define DS18B20_CMD_CONVERT 0x44 @@ -75,7 +77,7 @@ typedef struct { uint8_t DevAddr[DS18B20_DEVICE_AMOUNT][8]; } DS18B20_Drv_t; -extern DS18B20_Drv_t DS;; +extern DS18B20_Drv_t DS; extern OneWire_t OW; /* External Function ---------------------------------------------------------*/ diff --git a/john103C6T6/Core/Inc/main.h b/john103C6T6/Core/Inc/main.h index 5fff0cd..6389314 100644 --- a/john103C6T6/Core/Inc/main.h +++ b/john103C6T6/Core/Inc/main.h @@ -2,8 +2,8 @@ /** *************************************************************** * 1 2 3 4 5 6 7 8 * -* --- +++ * -* * +* --- +++ * +* * ***************************************************************** @@ -35,9 +35,29 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "stm32f1xx_hal.h" +#include "modbus_data.h" +#include "PROJ_setup.h" +#include "dallas_tools.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +typedef enum +{ + FuncOK=0, + FuncERROR=1 + +}FuncStat; + + +typedef enum { + CONFIG_DEVICE_ID = 0, + CONFIG_BAUDRATE, + CONFIG_CALIBRATION, + CONFIG_SETTINGS +} ConfigParams; + + + typedef enum { STATE_OPEN_VALVE = 0, // open STATE_CLOSE_VALVE= 1 // close @@ -49,17 +69,19 @@ typedef struct uint16_t location; uint8_t t_open; float t_set; - uint8_t t_close; - - - uint8_t status_T_sense:1 ; - + uint8_t t_close; + uint8_t status_T_sense:1 ; ValveState state; - uint16_t count; - - - -}TEMP; + uint16_t count; +}TEMP_TypeDef; +typedef struct { + uint32_t init_tsens : 1; // Update Interrupt Flag ( 0) / + + // ... ( ) +} Flags_TypeDef; + + + @@ -78,10 +100,15 @@ typedef struct extern void handle_command(char* cmd); typedef void (*FunctionPointer)(void); -uint16_t handle_valves(TEMP* tmp_sense); -void init_all_T_sense(void); +uint16_t handle_valves(TEMP_TypeDef* tmp_sense); +void init_setpoint_all_T_sense(void); void iwdg_refresh(void); void led_blink(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,uint8_t iter,uint16_t delay); +FuncStat Field_modbus(MB_DataStructureTypeDef* MB_DATA, Flags_TypeDef* flag); +FuncStat packStruct(MB_DataStructureTypeDef* MB_DATA,int sizeARR); +void Check_Tconnect(MB_DataStructureTypeDef* MB_DATA, Flags_TypeDef* flag ,DALLAS_HandleTypeDef* hdallas, int a[50]); + +void reinit_t_sens(void); /* USER CODE END ET */ diff --git a/john103C6T6/Core/Src/UART_TERM.c b/john103C6T6/Core/Src/UART_TERM.c index 1932e3d..0f7f00d 100644 --- a/john103C6T6/Core/Src/UART_TERM.c +++ b/john103C6T6/Core/Src/UART_TERM.c @@ -7,7 +7,7 @@ //extern uint8_t devices_found ; extern uint8_t roms[MAX_DEVICES][8]; extern char rx_buffer[64]; -extern TEMP temp_sense[30]; +extern TEMP_TypeDef temp_sense[30]; extern uint8_t init; int test_var=0; //void handle_command(char* cmd) diff --git a/john103C6T6/Core/Src/gpio.c b/john103C6T6/Core/Src/gpio.c index a116fc5..b49f3e5 100644 --- a/john103C6T6/Core/Src/gpio.c +++ b/john103C6T6/Core/Src/gpio.c @@ -25,6 +25,7 @@ /* USER CODE END 0 */ + /*----------------------------------------------------------------------------*/ /* Configure GPIO */ /*----------------------------------------------------------------------------*/ @@ -51,7 +52,8 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4 @@ -64,9 +66,9 @@ void MX_GPIO_Init(void) |GPIO_PIN_15, GPIO_PIN_RESET); /*Configure GPIO pin : PC13 */ - GPIO_InitStruct.Pin = GPIO_PIN_13; + GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); diff --git a/john103C6T6/Core/Src/main.c b/john103C6T6/Core/Src/main.c index 91a2a1d..a29d86b 100644 --- a/john103C6T6/Core/Src/main.c +++ b/john103C6T6/Core/Src/main.c @@ -27,6 +27,13 @@ #include "usart.h" #include "gpio.h" + + + + + + + /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "dallas_tools.h" @@ -34,6 +41,9 @@ #include "def.h" #include #include "rs_message.h" +#include "eeprom_emul.h" +#include "stdio.h" + @@ -57,19 +67,20 @@ uint8_t ralay_5v_on_var=0; /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ - float temperature; - extern uint8_t roms[MAX_DEVICES][8]; - //extern uint8_t devices_found ; - uint8_t _debug_init=0; - //TEMP temp_sense[30]; - float set_temp_old[30]; - char rx_buffer[64]; - uint8_t rx_index = 0; - char command_ready = 0; - uint8_t uart_byte = 0; - uint8_t first_in=1; - DALLAS_SensorHandleTypeDef sens[30]; - int init_sens=0; + float temperature; + extern uint8_t roms[MAX_DEVICES][8]; + Flags_TypeDef flag; + //extern uint8_t devices_found ; + uint8_t _debug_init=0; + //TEMP_TypeDef temp_sense[30]; + float set_temp_old[30]; + char rx_buffer[64]; + uint8_t rx_index = 0; + char command_ready = 0; + uint8_t uart_byte = 0; + uint8_t first_in=1; + DALLAS_SensorHandleTypeDef sens[30]; + int init_sens=0; /* USER CODE END PM */ @@ -132,38 +143,31 @@ int main(void) /* USER CODE BEGIN 2 */ led_blink(GPIOC,13,rest_iter,reset_blink_delay); - MODBUS_FirstInit(); + MODBUS_FirstInit(); uint8_t uart_byte = 0; RS_Receive_IT(&hmodbus1, &MODBUS_MSG); Dallas_BusFirstInit(&htim1); // ������������� �� ������� ��������� �������� // ������������� �� ������� (����������� ������ ���������� �������) - - for ( int i=0; iRomCnt;i++) - { - // ������������� �� ROM-������ - //sens[i].Init.init_func = &Dallas_SensorInitByROM; - // sens[i].Init.InitParam.ROM = rom_address; - sens[i].Init.InitParam.Ind = i; - sens[i].Init.init_func = &Dallas_SensorInitByInd; - sens[i].Init.Resolution = DALLAS_CONFIG_9_BITS; - MB_DATA.HoldRegs.set_Temp[i] =sens[i].set_temp =20.; - MB_DATA.HoldRegs.set_hyst[i]=sens[i].hyst =1; - Dallas_AddNewSensors(&hdallas, &sens[i]); + reinit_t_sens(); -} + MB_DATA.InRegs.num_Tsens=hdallas.onewire->RomCnt; /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { + Field_modbus(&MB_DATA,&flag); + + + if( hmodbus1.pMessagePtr->Func_Code&ERR_VALUES_START) { static int pause_Alarm_led; while (1) { - if (pause_Alarm_led>1000000) + if (pause_Alarm_led>36000000) { GPIOC->ODR^=1<<13; pause_Alarm_led=0; @@ -174,29 +178,9 @@ int main(void) } - for(int i=0;iRomCnt;i++) - if(sens[i].isLost) - { - init_sens=1; - } - if (init_sens) - { - init_sens=0; - //Dallas_BusFirstInit(&htim1); - for ( int i=0; iRomCnt;i++) - { - // ������������� �� ROM-������ - //sens[i].Init.init_func = &Dallas_SensorInitByROM; - // sens[i].Init.InitParam.ROM = rom_address; - sens[i].Init.InitParam.Ind = i; - sens[i].Init.init_func = &Dallas_SensorInitByInd; - sens[i].Init.Resolution = DALLAS_CONFIG_9_BITS; - MB_DATA.HoldRegs.set_Temp[i] =sens[i].set_temp =20.; - MB_DATA.HoldRegs.set_hyst[i]=sens[i].hyst =1; - Dallas_AddNewSensors(&hdallas, &sens[i]); - } - } + Check_Tconnect(&MB_DATA,&flag,&hdallas, 0); + if (_debug_init||MB_DATA.Coils.init_param) { _debug_init=0; @@ -226,7 +210,8 @@ int main(void) MB_DATA.InRegs.sens_Temp[i]=sens[i].temperature*10; - +/////////////////////////заменить на define ralay_5v_on_var GPIOA->ODR|=1<<10; + ralay_5v_on_var=MB_DATA.Coils.coils[1].state_val_bit.state_val_05; if (ralay_5v_on_var) { @@ -338,41 +323,121 @@ void led_blink(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,uint8_t iter,uint16_t delay HAL_Delay(delay); } } -//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) -//{ -// if (huart->Instance == USART1) -// { -// if(first_in) -// { -// first_in=0; -// rx_index = 0; -// -// } -// -// -// -// static uint8_t ch; -// HAL_UART_Receive_IT(&huart1, &ch, 1); -// if (ch == '\r' || ch == '\n') -// { -// rx_buffer[rx_index] = 0; -// command_ready = 1; -// rx_index = 0; -// first_in=1; -// -// } -// else -// { -// if (rx_index < sizeof(rx_buffer) - 1) -// { -// rx_buffer[rx_index++] = ch; -// } -// } -// } -//} +void Check_Tconnect(MB_DataStructureTypeDef* MB_DATA, Flags_TypeDef* flag ,DALLAS_HandleTypeDef* hdallas, int a[0]) +{ + for(int i=0;ionewire->RomCnt;i++) + { + if(sens[i].isLost) + { + //init_sens=1; + } + + } + if (init_sens||flag->init_tsens) + { + init_sens=0; + flag->init_tsens=0; + //Dallas_BusFirstInit(&htim1); + DS18B20_Search(&DS, &OW) ; + reinit_t_sens(); + MB_DATA->InRegs.num_Tsens = hdallas->onewire->RomCnt; + } +} -//uint16_t handle_valves(TEMP* tmp_sense ) +void reinit_t_sens(void) +{ + for ( int i=0; iRomCnt;i++) + { + // ������������� �� ROM-������ + //sens[i].Init.init_func = &Dallas_SensorInitByROM; + // sens[i].Init.InitParam.ROM = rom_address; + sens[i].Init.InitParam.Ind = i; + sens[i].Init.init_func = &Dallas_SensorInitByInd; + sens[i].Init.Resolution = DALLAS_CONFIG_9_BITS; + MB_DATA.HoldRegs.set_Temp[i] =sens[i].set_temp =20.; + MB_DATA.HoldRegs.set_hyst[i]=sens[i].hyst =1; + Dallas_AddNewSensors(&hdallas, &sens[i]); + + } + } +FuncStat packStruct(MB_DataStructureTypeDef* MB_DATA,int sizeARR) + { + for(int i=0;iRomCnt;sens_num++) + { + switch(sens_num) + { + case 0: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp1_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 1: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp2_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 2: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp3_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 3: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp4_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 4: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp5_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 5: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp6_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 6: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp7_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 7: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp8_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 8: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp9_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 9: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp10_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 10: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp11_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 11: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp12_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 12: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp13_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 13: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp14_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 14: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp15_isConnected = sens[i*16+sens_num ].isConnected; + break; + case 15: + MB_DATA->Coils.status_tSens[i].state_val_bit.Temp16_isConnected = sens[i*16+sens_num ].isConnected; + break; + } + } + } + return FuncOK; + + } +FuncStat Field_modbus(MB_DataStructureTypeDef* MB_DATA, Flags_TypeDef* flag) + { + + MB_DATA->InRegs.ID= *hdallas.ds_devices; + flag->init_tsens=MB_DATA->Coils.init_Tsens; + packStruct(MB_DATA,MAX_SENSE/16); + + + return FuncOK; + }; + + + + +//uint16_t handle_valves(TEMP_TypeDef* tmp_sense ) //{ // // if (temp_sense[0].state==STATE_OPEN_VALVE) @@ -389,7 +454,7 @@ void led_blink(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,uint8_t iter,uint16_t delay // //} -//void init_all_T_sense(void) +//void init_setpoint _all_T_sense(void) //{ // //ds_search_devices(); // for(int i=0;iRomCnt;i++) diff --git a/john103C6T6/Core/Src/rtc.c b/john103C6T6/Core/Src/rtc.c index 1db9f29..dfa4bb9 100644 --- a/john103C6T6/Core/Src/rtc.c +++ b/john103C6T6/Core/Src/rtc.c @@ -45,7 +45,7 @@ void MX_RTC_Init(void) */ hrtc.Instance = RTC; hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND; - hrtc.Init.OutPut = RTC_OUTPUTSOURCE_SECOND; + hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); diff --git a/john103C6T6/EEPROM_Emul/lib/EEPROM_Emul.h b/john103C6T6/EEPROM_Emul/lib/EEPROM_Emul.h new file mode 100644 index 0000000..f7c6bd8 --- /dev/null +++ b/john103C6T6/EEPROM_Emul/lib/EEPROM_Emul.h @@ -0,0 +1,49 @@ +#ifndef EEPROM_EMUL_H +#define EEPROM_EMUL_H + +#include "stm32f1xx_hal.h" + +// Адреса для эмуляции EEPROM (последние страницы Flash) +#define EEPROM_START_ADDRESS 0x0800F000 // Последний килобайт Flash +#define EEPROM_PAGE_SIZE 1024 // Размер страницы STM32F103 +#define EEPROM_SIZE 1024 // Общий размер EEPROM + +// Максимальное количество переменных +#define EEPROM_MAX_VARIABLES 64 + +// Статусы операций +typedef enum { + EEPROM_OK = 0, + EEPROM_ERROR = 1, + EEPROM_INVALID = 2, + EEPROM_FULL = 3 +} EEPROM_Status; + +// Структура элемента данных +#pragma pack(push, 1) +typedef struct { + uint16_t address; // Адрес переменной (0-EEPROM_MAX_VARIABLES) + uint16_t data; // Данные + uint32_t timestamp; // Временная метка +} EEPROM_Item; +#pragma pack(pop) + +// Инициализация EEPROM +EEPROM_Status EEPROM_Init(void); + +// Чтение данных +EEPROM_Status EEPROM_Read(uint16_t virt_address, uint16_t* data); + +// Запись данных +EEPROM_Status EEPROM_Write(uint16_t virt_address, uint16_t data); + +// Массовая запись +EEPROM_Status EEPROM_WriteMultiple(uint16_t virt_address, uint8_t* data, uint16_t size); + +// Получение информации о EEPROM +void EEPROM_GetInfo(uint32_t* used, uint32_t* total); + +// Полное форматирование +EEPROM_Status EEPROM_Format(void); + +#endif \ No newline at end of file diff --git a/john103C6T6/EEPROM_Emul/src/EEPROM_Emul.c b/john103C6T6/EEPROM_Emul/src/EEPROM_Emul.c new file mode 100644 index 0000000..462d6c2 --- /dev/null +++ b/john103C6T6/EEPROM_Emul/src/EEPROM_Emul.c @@ -0,0 +1,256 @@ +#include "eeprom_emul.h" +#include + +// Внутренние переменные +static uint32_t eeprom_current_write_address = EEPROM_START_ADDRESS; +static uint8_t eeprom_initialized = 0; + +// Прототипы внутренних функций +static EEPROM_Status EEPROM_FindLatestData(uint16_t virt_address, uint16_t* data); +static EEPROM_Status EEPROM_WriteItem(EEPROM_Item* item); +static EEPROM_Status EEPROM_ErasePage(uint32_t address); +static uint32_t EEPROM_FindNextWriteAddress(void); +static uint8_t EEPROM_IsPageErased(uint32_t address); +static uint32_t EEPROM_CalculateCRC(EEPROM_Item* item); + +// Инициализация EEPROM +EEPROM_Status EEPROM_Init(void) { + if (eeprom_initialized) { + return EEPROM_OK; + } + + // Находим следующий адрес для записи + eeprom_current_write_address = EEPROM_FindNextWriteAddress(); + + // Если вся память заполнена, выполняем сборку мусора (форматирование) + if (eeprom_current_write_address >= EEPROM_START_ADDRESS + EEPROM_SIZE) { + EEPROM_Format(); + } else { + eeprom_initialized = 1; + } + + return EEPROM_OK; +} + +// Чтение данных по виртуальному адресу +EEPROM_Status EEPROM_Read(uint16_t virt_address, uint16_t* data) { + if (!eeprom_initialized) { + return EEPROM_ERROR; + } + + if (virt_address >= EEPROM_MAX_VARIABLES || data == NULL) { + return EEPROM_INVALID; + } + + return EEPROM_FindLatestData(virt_address, data); +} + +// Запись данных по виртуальному адресу +EEPROM_Status EEPROM_Write(uint16_t virt_address, uint16_t data) { + EEPROM_Item item; + + if (!eeprom_initialized) { + return EEPROM_ERROR; + } + + if (virt_address >= EEPROM_MAX_VARIABLES) { + return EEPROM_INVALID; + } + + // Подготавливаем элемент данных + item.address = virt_address; + item.data = data; + item.timestamp = HAL_GetTick(); // Используем системный таймер + + // Записываем элемент + return EEPROM_WriteItem(&item); +} + +// Поиск последних данных для виртуального адреса +static EEPROM_Status EEPROM_FindLatestData(uint16_t virt_address, uint16_t* data) { + uint32_t address = EEPROM_START_ADDRESS; + EEPROM_Item current_item; + uint32_t latest_timestamp = 0; + uint16_t latest_data = 0; + uint8_t data_found = 0; + + // Сканируем всю область EEPROM + while (address < EEPROM_START_ADDRESS + EEPROM_SIZE) { + // Читаем элемент + memcpy(¤t_item, (void*)address, sizeof(EEPROM_Item)); + + // Проверяем, является ли это валидными данными + if (current_item.address == virt_address) { + if (current_item.timestamp >= latest_timestamp) { + latest_timestamp = current_item.timestamp; + latest_data = current_item.data; + data_found = 1; + } + } + + address += sizeof(EEPROM_Item); + + // Проверяем конец страницы + if ((address - EEPROM_START_ADDRESS) % EEPROM_PAGE_SIZE == 0) { + address += (EEPROM_PAGE_SIZE - (sizeof(EEPROM_Item) * 2)); + } + } + + if (data_found) { + *data = latest_data; + return EEPROM_OK; + } + + return EEPROM_INVALID; +} + +// Запись элемента в EEPROM +static EEPROM_Status EEPROM_WriteItem(EEPROM_Item* item) { + HAL_StatusTypeDef hal_status; + + // Проверяем, нужно ли стирать страницу + if ((eeprom_current_write_address - EEPROM_START_ADDRESS) % EEPROM_PAGE_SIZE == 0) { + if (!EEPROM_IsPageErased(eeprom_current_write_address)) { + if (EEPROM_ErasePage(eeprom_current_write_address) != EEPROM_OK) { + return EEPROM_ERROR; + } + } + } + + // Разблокируем Flash + HAL_FLASH_Unlock(); + + // Записываем данные по словам (32 бита) + uint32_t* data_ptr = (uint32_t*)item; + + for (uint8_t i = 0; i < sizeof(EEPROM_Item) / 4; i++) { + hal_status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, + eeprom_current_write_address + (i * 4), + data_ptr[i]); + + if (hal_status != HAL_OK) { + HAL_FLASH_Lock(); + return EEPROM_ERROR; + } + } + + // Блокируем Flash + HAL_FLASH_Lock(); + + // Обновляем адрес для следующей записи + eeprom_current_write_address += sizeof(EEPROM_Item); + + // Проверяем переполнение + if (eeprom_current_write_address >= EEPROM_START_ADDRESS + EEPROM_SIZE) { + // Выполняем сборку мусора (в данном случае - форматирование) + EEPROM_Format(); + } + + return EEPROM_OK; +} + +// Стирание страницы Flash +static EEPROM_Status EEPROM_ErasePage(uint32_t address) { + FLASH_EraseInitTypeDef erase; + uint32_t page_error; + + // Определяем номер страницы + uint32_t page = (address - FLASH_BASE) / EEPROM_PAGE_SIZE; + + HAL_FLASH_Unlock(); + + erase.TypeErase = FLASH_TYPEERASE_PAGES; + erase.PageAddress = address; + erase.NbPages = 1; + + if (HAL_FLASHEx_Erase(&erase, &page_error) != HAL_OK) { + HAL_FLASH_Lock(); + return EEPROM_ERROR; + } + + HAL_FLASH_Lock(); + return EEPROM_OK; +} + +// Поиск следующего адреса для записи +static uint32_t EEPROM_FindNextWriteAddress(void) { + uint32_t address = EEPROM_START_ADDRESS; + EEPROM_Item item; + + // Ищем первую свободную позицию + while (address < EEPROM_START_ADDRESS + EEPROM_SIZE) { + memcpy(&item, (void*)address, sizeof(EEPROM_Item)); + + // Если нашли пустой элемент (все FFFF), это свободная позиция + if (item.address == 0xFFFF && item.data == 0xFFFF && item.timestamp == 0xFFFFFFFF) { + break; + } + + address += sizeof(EEPROM_Item); + + // Проверяем границу страницы + if ((address - EEPROM_START_ADDRESS) % EEPROM_PAGE_SIZE == 0) { + address += (EEPROM_PAGE_SIZE - (sizeof(EEPROM_Item) * 2)); + } + } + + return address; +} + +// Проверка, стерта ли страница +static uint8_t EEPROM_IsPageErased(uint32_t address) { + uint32_t* check_addr = (uint32_t*)address; + + // Проверяем первые несколько слов + for (uint8_t i = 0; i < 8; i++) { + if (check_addr[i] != 0xFFFFFFFF) { + return 0; + } + } + + return 1; +} + +// Полное форматирование EEPROM +EEPROM_Status EEPROM_Format(void) { + uint32_t address = EEPROM_START_ADDRESS; + + // Стираем все страницы, используемые для EEPROM + while (address < EEPROM_START_ADDRESS + EEPROM_SIZE) { + if (EEPROM_ErasePage(address) != EEPROM_OK) { + return EEPROM_ERROR; + } + address += EEPROM_PAGE_SIZE; + } + + eeprom_current_write_address = EEPROM_START_ADDRESS; + eeprom_initialized = 1; + + return EEPROM_OK; +} + +// Получение информации об использовании EEPROM +void EEPROM_GetInfo(uint32_t* used, uint32_t* total) { + uint32_t address = EEPROM_START_ADDRESS; + uint32_t used_bytes = 0; + + if (used) { + // Подсчитываем использованные байты + while (address < EEPROM_START_ADDRESS + EEPROM_SIZE) { + EEPROM_Item item; + memcpy(&item, (void*)address, sizeof(EEPROM_Item)); + + if (item.address != 0xFFFF || item.data != 0xFFFF || item.timestamp != 0xFFFFFFFF) { + used_bytes += sizeof(EEPROM_Item); + } + + address += sizeof(EEPROM_Item); + } + + *used = used_bytes; + } + + if (total) { + *total = EEPROM_SIZE; + } +} \ No newline at end of file diff --git a/john103C6T6/MDK-ARM/DebugConfig/john103C6T6_STM32F103C8_1.0.0.dbgconf b/john103C6T6/MDK-ARM/DebugConfig/john103C6T6_STM32F103C8_1.0.0.dbgconf new file mode 100644 index 0000000..66e10b6 --- /dev/null +++ b/john103C6T6/MDK-ARM/DebugConfig/john103C6T6_STM32F103C8_1.0.0.dbgconf @@ -0,0 +1,36 @@ +// File: STM32F101_102_103_105_107.dbgconf +// Version: 1.0.0 +// Note: refer to STM32F101xx STM32F102xx STM32F103xx STM32F105xx STM32F107xx Reference manual (RM0008) +// STM32F101xx STM32F102xx STM32F103xx STM32F105xx STM32F107xx datasheets + +// <<< Use Configuration Wizard in Context Menu >>> + +// Debug MCU configuration register (DBGMCU_CR) +// Reserved bits must be kept at reset value +// DBG_TIM11_STOP TIM11 counter stopped when core is halted +// DBG_TIM10_STOP TIM10 counter stopped when core is halted +// DBG_TIM9_STOP TIM9 counter stopped when core is halted +// DBG_TIM14_STOP TIM14 counter stopped when core is halted +// DBG_TIM13_STOP TIM13 counter stopped when core is halted +// DBG_TIM12_STOP TIM12 counter stopped when core is halted +// DBG_CAN2_STOP Debug CAN2 stopped when core is halted +// DBG_TIM7_STOP TIM7 counter stopped when core is halted +// DBG_TIM6_STOP TIM6 counter stopped when core is halted +// DBG_TIM5_STOP TIM5 counter stopped when core is halted +// DBG_TIM8_STOP TIM8 counter stopped when core is halted +// DBG_I2C2_SMBUS_TIMEOUT SMBUS timeout mode stopped when core is halted +// DBG_I2C1_SMBUS_TIMEOUT SMBUS timeout mode stopped when core is halted +// DBG_CAN1_STOP Debug CAN1 stopped when Core is halted +// DBG_TIM4_STOP TIM4 counter stopped when core is halted +// DBG_TIM3_STOP TIM3 counter stopped when core is halted +// DBG_TIM2_STOP TIM2 counter stopped when core is halted +// DBG_TIM1_STOP TIM1 counter stopped when core is halted +// DBG_WWDG_STOP Debug window watchdog stopped when core is halted +// DBG_IWDG_STOP Debug independent watchdog stopped when core is halted +// DBG_STANDBY Debug standby mode +// DBG_STOP Debug stop mode +// DBG_SLEEP Debug sleep mode +// +DbgMCU_CR = 0x00000007; + +// <<< end of configuration section >>> diff --git a/john103C6T6/MDK-ARM/john103C6T6.uvoptx b/john103C6T6/MDK-ARM/john103C6T6.uvoptx index f2f433d..ac12308 100644 --- a/john103C6T6/MDK-ARM/john103C6T6.uvoptx +++ b/john103C6T6/MDK-ARM/john103C6T6.uvoptx @@ -1,4 +1,4 @@ - + 1.0 @@ -26,7 +26,7 @@ 0x4 ARM-ADS - 8000000 + 12000000 1 1 @@ -104,19 +104,29 @@ 0 0 6 - - - - - - - - - - + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F10x_128 -FL020000 -FS08000000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U37FF71064E57343634C31443 -O206 -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 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 + 0 ARMRTXEVENTFLAGS @@ -130,45 +140,35 @@ 0 ARMDBGFLAGS - + 0 DLGUARM (105=-1,-1,-1,-1,0) - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C6$Flash\STM32F10x_128.FLM)) - - - 0 - ST-LINKIII-KEIL_SWO - -U37FF71064E57343625581443 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL08000 -FP0($$Device:STM32F103C6$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 - 0 0 - 168 + 171 1 -
0
+
134247538
0 0 0 0 0 - 0 + 1 ../Core/Src/main.c - - + + \\john103C6T6\../Core/Src/main.c\171
1 0 - 167 + 173 1
0
0 @@ -178,56 +178,8 @@ 0 0 ../Core/Src/main.c - - -
- - 2 - 0 - 679 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\Modbus\modbus.c - - -
- - 3 - 0 - 165 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ../Core/Src/main.c - - -
- - 4 - 0 - 172 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ../Core/Src/main.c - - + +
@@ -304,37 +256,12 @@ 14 1 - modbus_uart_buff + flag,0x0A 15 1 - _ - - - 16 - 1 - init_sens,0x0A - - - 17 - 1 - sens[i] - - - 18 - 1 - sens[0].isLost,0x0A - - - 19 - 1 - sens[1].isLost,0x0A - - - 20 - 1 - sens[2].isLost,0x0A + sens[sens_num] @@ -353,7 +280,7 @@ 1 0 - 0x20000278 + 0x08000000 0 @@ -386,40 +313,28 @@ 0 0 - - + + 0 0 0 - - - - - - - - + + + + + + + + - - System Viewer\GPIOA - 35904 - System Viewer\GPIOB 35900 - System Viewer\IWDG + System Viewer\GPIOC 35905 - - System Viewer\TIM1 - 35903 - - - System Viewer\USART1 - 35902 - 1 @@ -464,18 +379,6 @@ 0 0 0 - ..\Core\Src\UART_TERM.c - UART_TERM.c - 0 - 0 - - - 2 - 3 - 1 - 0 - 0 - 0 ..\Core\Src\dallas_tools.c dallas_tools.c 0 @@ -483,7 +386,7 @@ 2 - 4 + 3 1 0 0 @@ -495,7 +398,7 @@ 2 - 5 + 4 1 0 0 @@ -507,7 +410,7 @@ 2 - 6 + 5 1 0 0 @@ -519,7 +422,7 @@ 2 - 7 + 6 1 0 0 @@ -531,7 +434,7 @@ 2 - 8 + 7 1 0 0 @@ -543,7 +446,7 @@ 2 - 9 + 8 1 0 0 @@ -555,7 +458,7 @@ 2 - 10 + 9 1 0 0 @@ -567,7 +470,7 @@ 2 - 11 + 10 1 0 0 @@ -579,7 +482,7 @@ 2 - 12 + 11 1 0 0 @@ -591,7 +494,7 @@ 2 - 13 + 12 1 0 0 @@ -603,7 +506,7 @@ 2 - 14 + 13 1 0 0 @@ -615,7 +518,7 @@ 2 - 15 + 14 1 0 0 @@ -627,7 +530,7 @@ 2 - 16 + 15 1 0 0 @@ -639,7 +542,7 @@ 2 - 17 + 16 1 0 0 @@ -651,7 +554,7 @@ 2 - 18 + 17 1 0 0 @@ -663,7 +566,7 @@ 2 - 19 + 18 1 0 0 @@ -675,7 +578,7 @@ 2 - 20 + 19 1 0 0 @@ -687,7 +590,7 @@ 2 - 21 + 20 1 0 0 @@ -697,6 +600,18 @@ 0 0 + + 2 + 21 + 1 + 0 + 0 + 0 + ..\EEPROM_Emul\src\EEPROM_Emul.c + EEPROM_Emul.c + 0 + 0 + @@ -724,6 +639,30 @@ 0 0 0 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c + stm32f1xx_hal_tim.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c + stm32f1xx_hal_tim_ex.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c stm32f1xx_hal_adc.c 0 @@ -731,7 +670,7 @@ 3 - 24 + 26 1 0 0 @@ -743,7 +682,7 @@ 3 - 25 + 27 1 0 0 @@ -755,7 +694,7 @@ 3 - 26 + 28 1 0 0 @@ -767,7 +706,7 @@ 3 - 27 + 29 1 0 0 @@ -779,7 +718,7 @@ 3 - 28 + 30 1 0 0 @@ -791,7 +730,7 @@ 3 - 29 + 31 1 0 0 @@ -803,7 +742,7 @@ 3 - 30 + 32 1 0 0 @@ -815,7 +754,7 @@ 3 - 31 + 33 1 0 0 @@ -827,7 +766,7 @@ 3 - 32 + 34 1 0 0 @@ -839,7 +778,7 @@ 3 - 33 + 35 1 0 0 @@ -851,7 +790,7 @@ 3 - 34 + 36 1 0 0 @@ -863,7 +802,7 @@ 3 - 35 + 37 1 0 0 @@ -875,7 +814,7 @@ 3 - 36 + 38 1 0 0 @@ -887,7 +826,7 @@ 3 - 37 + 39 1 0 0 @@ -899,7 +838,7 @@ 3 - 38 + 40 1 0 0 @@ -911,7 +850,7 @@ 3 - 39 + 41 1 0 0 @@ -921,30 +860,6 @@ 0 0 - - 3 - 40 - 1 - 0 - 0 - 0 - ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c - stm32f1xx_hal_tim.c - 0 - 0 - - - 3 - 41 - 1 - 0 - 0 - 0 - ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c - stm32f1xx_hal_tim_ex.c - 0 - 0 - 3 42 @@ -987,6 +902,14 @@ 1 + + ::CMSIS Driver + 0 + 0 + 0 + 1 + + ::Compiler 0 diff --git a/john103C6T6/MDK-ARM/john103C6T6.uvprojx b/john103C6T6/MDK-ARM/john103C6T6.uvprojx index c2f7466..460b15f 100644 --- a/john103C6T6/MDK-ARM/john103C6T6.uvprojx +++ b/john103C6T6/MDK-ARM/john103C6T6.uvprojx @@ -1,7 +1,10 @@ - - + + + 2.1 +
### uVision Project, (C) Keil Software
+ john103C6T6 @@ -12,33 +15,33 @@ 1 - STM32F103C6 + STM32F103C8 STMicroelectronics Keil.STM32F1xx_DFP.2.4.0 http://www.keil.com/pack/ - IRAM(0x20000000-0x200027FF) IROM(0x8000000-0x8007FFF) CLOCK(8000000) CPUTYPE("Cortex-M3") TZ - - - + IRAM(0x20000000,0x00005000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) 0 - - - - - - - - - - - $$Device:STM32F103C6$SVD\STM32F103xx.svd + $$Device:STM32F103C8$Device\Include\stm32f10x.h + + + + + + + + + + $$Device:STM32F103C8$SVD\STM32F103xx.svd 0 0 - - - - - + + + + + 0 0 @@ -60,8 +63,8 @@ 0 0 - - + + 0 0 0 @@ -70,8 +73,8 @@ 0 0 - - + + 0 0 0 @@ -79,16 +82,16 @@ 0 - 1 - - + 0 + + 0 0 0 0 1 - + 0 @@ -102,17 +105,17 @@ 0 0 3 - - + + 0 SARMCM3.DLL - -REMAP + -REMAP DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -135,12 +138,12 @@ 4101 1 - STLink\ST-LINKIII-KEIL_SWO.dll - "" () - - - - + BIN\UL2CM3.DLL + + + + + 0 @@ -173,7 +176,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -193,7 +196,7 @@ 0 0 3 - 4 + 3 0 0 0 @@ -245,12 +248,12 @@ 0 0x20000000 - 0x2800 + 0x5000 1 0x8000000 - 0x8000 + 0x10000 0 @@ -275,12 +278,12 @@ 1 0x8000000 - 0x8000 + 0x10000 1 - 0x8008000 - 0x2000 + 0x0 + 0x0 0 @@ -300,7 +303,7 @@ 0 0x20000000 - 0x2800 + 0x5000 0 @@ -308,7 +311,7 @@ 0x0 - + 1 @@ -335,10 +338,10 @@ 0 0 - + USE_HAL_DRIVER,STM32F103x6 - - ../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;../Modbus + + ../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;../Modbus;..\EEPROM_Emul\lib @@ -353,10 +356,10 @@ 0 1 - - - - + + + + @@ -366,15 +369,15 @@ 0 1 0 - - - - - - - - - + + + + + + + + + @@ -392,11 +395,6 @@ Application/User/Core - - UART_TERM.c - 1 - ..\Core\Src\UART_TERM.c - dallas_tools.c 1 @@ -459,6 +457,8 @@ 2 2 11 + + 1 @@ -486,6 +486,12 @@ 2 2 2 + + + + + + @@ -507,6 +513,8 @@ 2 2 11 + + 1 @@ -534,6 +542,12 @@ 2 2 2 + + + + + + @@ -555,6 +569,8 @@ 2 2 11 + + 1 @@ -582,6 +598,12 @@ 2 2 2 + + + + + + @@ -603,6 +625,8 @@ 2 2 11 + + 1 @@ -630,6 +654,12 @@ 2 2 2 + + + + + + @@ -651,6 +681,8 @@ 2 2 11 + + 1 @@ -678,6 +710,12 @@ 2 2 2 + + + + + + @@ -707,6 +745,11 @@ 1 ../Core/Src/stm32f1xx_hal_timebase_tim.c + + EEPROM_Emul.c + 1 + ..\EEPROM_Emul\src\EEPROM_Emul.c + @@ -744,6 +787,8 @@ 2 2 11 + + 1 @@ -771,6 +816,12 @@ 2 2 2 + + + + + + @@ -792,6 +843,8 @@ 2 2 11 + + 1 @@ -819,6 +872,12 @@ 2 2 2 + + + + + + @@ -890,6 +949,8 @@ 2 2 11 + + 1 @@ -917,6 +978,12 @@ 2 2 2 + + + + + + @@ -938,6 +1005,8 @@ 2 2 11 + + 1 @@ -965,6 +1034,12 @@ 2 2 2 + + + + + + @@ -986,6 +1061,8 @@ 2 2 11 + + 1 @@ -1013,6 +1090,12 @@ 2 2 2 + + + + + + @@ -1034,6 +1117,8 @@ 2 2 11 + + 1 @@ -1061,6 +1146,12 @@ 2 2 2 + + + + + + @@ -1082,6 +1173,8 @@ 2 2 11 + + 1 @@ -1109,6 +1202,12 @@ 2 2 2 + + + + + + @@ -1133,30 +1232,48 @@ ::CMSIS + + ::CMSIS Driver + ::Compiler + - - - - + + + - + + + + + + + + + + + + + + + - + - + - + + @@ -1165,5 +1282,5 @@ -
+
diff --git a/john103C6T6/MDK-ARM/john103C6T6/john103C6T6.sct b/john103C6T6/MDK-ARM/john103C6T6/john103C6T6.sct index fb0348d..09aa1bd 100644 --- a/john103C6T6/MDK-ARM/john103C6T6/john103C6T6.sct +++ b/john103C6T6/MDK-ARM/john103C6T6/john103C6T6.sct @@ -2,14 +2,14 @@ ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* -LR_IROM1 0x08000000 0x00008000 { ; load region size_region - ER_IROM1 0x08000000 0x00008000 { ; load address = execution address +LR_IROM1 0x08000000 0x00010000 { ; load region size_region + ER_IROM1 0x08000000 0x00010000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } - RW_IRAM1 0x20000000 0x00002800 { ; RW data + RW_IRAM1 0x20000000 0x00005000 { ; RW data .ANY (+RW +ZI) } } diff --git a/john103C6T6/Modbus/modbus.c b/john103C6T6/Modbus/modbus.c index f188bfd..df8e769 100644 --- a/john103C6T6/Modbus/modbus.c +++ b/john103C6T6/Modbus/modbus.c @@ -63,8 +63,16 @@ * @endverbatim * ******************************************************************************/ +//#pragma pack(push, pack_modbus, 1) + + + +//#pragma pack(pop, pack_modbus) + +#include "modbus_data.h" #include "rs_message.h" + uint32_t dbg_temp, dbg_temp2, dbg_temp3; // for debug /* MODBUS HANDLES */ extern UART_HandleTypeDef rs_huart; diff --git a/john103C6T6/Modbus/modbus_data.h b/john103C6T6/Modbus/modbus_data.h index 54f91bb..1346ac3 100644 --- a/john103C6T6/Modbus/modbus_data.h +++ b/john103C6T6/Modbus/modbus_data.h @@ -11,10 +11,32 @@ * *************************************************************************/ + + + #ifndef _MODBUS_DATA_H_ #define _MODBUS_DATA_H_ - + + +// DEFINES FOR INPUT REGISTERS ARRAYS +#define R_INPUT_ADDR 0 +#define R_INPUT_QNT 2000 + +// DEFINES FOR HOLDING REGISTERS ARRAYS +#define R_HOLDING_ADDR 0 +#define R_HOLDING_QNT 2000 + +// DEFINES FOR COIL ARRAYS +#define C_CONTROL_ADDR 0 +#define C_CONTROL_QNT 1000 + + + #include "stdint.h" +#include "ds18b20_driver.h" +#include "PROJ_setup.h" + + //--------------DEFINES FOR REGISTERS--------------- // DEFINES FOR ARRAYS /** @@ -41,19 +63,36 @@ /** * @brief Регистры хранения */ - - - #define MAX_SENSE 30 - -typedef struct //MB_DataInRegsTypeDef -{ - uint16_t sens_Temp[MAX_SENSE]; - uint16_t UzptPLUS; - uint16_t UzptMINUS; - uint16_t UzptPLUS_MIN; - +/** + * @brief Определить размер структуры в регистрах модбас (16-бит слова) + */ +#define mb_sizeof(_struct_) (sizeof(_struct_)/sizeof(uint16_t)) +/** + * @brief Определить количество резервных байт для выравнивания + * @details Выравнивает так, чтобы количество регистров в _struct_ и reserved равнялось _align_. + * + */ +#define mb_fill_rsv(_align_, _struct_) ((_align_ > mb_sizeof(_struct_)) ? (_align_ - mb_sizeof(_struct_)) : 0) + + + + + + + +typedef __PACKED_STRUCT//MB_DataInRegsTypeDef +{ + + uint16_t sens_Temp[MAX_SENSE]; + + uint16_t reserve[mb_fill_rsv(1000, uint16_t[MAX_SENSE])]; + + DS18B20_Drv_t ID; + uint16_t reserve1[mb_fill_rsv(200, DS18B20_Drv_t)]; + uint16_t num_Tsens; + }MB_DataInRegsTypeDef; @@ -61,20 +100,16 @@ typedef struct //MB_DataInRegsTypeDef /** * @brief Входные регистры */ -typedef struct //MB_DataInRegsTypeDef +typedef __PACKED_STRUCT //MB_DataInRegsTypeDef { - uint16_t set_Temp[MAX_SENSE]; + uint16_t set_Temp[MAX_SENSE]; + uint16_t reserve[mb_fill_rsv(100, uint16_t[MAX_SENSE])]; uint16_t set_hyst[MAX_SENSE]; + uint16_t reserve1[mb_fill_rsv(100, uint16_t[MAX_SENSE])]; }MB_DataHoldRegsTypeDef; -// DEFINES FOR INPUT REGISTERS ARRAYS -#define R_INPUT_ADDR 0 -#define R_INPUT_QNT 40 -// DEFINES FOR HOLDING REGISTERS ARRAYS -#define R_HOLDING_ADDR 0 -#define R_HOLDING_QNT 40 /** MODBUS_DATA_RERISTERS_DEFINES @@ -110,8 +145,9 @@ typedef struct //MB_DataInRegsTypeDef * @details Желательно с помощью reserved делать стркутуру кратной 16-битам */ typedef union - { - struct __packed { + { + __PACKED_STRUCT + { unsigned state_val_01:1; unsigned state_val_02:1; unsigned state_val_03:1; @@ -133,19 +169,92 @@ typedef union }word; -typedef struct //MB_DataCoilsTypeDef + typedef union + { + __PACKED_STRUCT + { + unsigned Temp1_relay_isOn :1; + unsigned Temp2_relay_isOn :1; + unsigned Temp3_relay_isOn :1; + unsigned Temp4_relay_isOn :1; + unsigned Temp5_relay_isOn :1; + unsigned Temp6_relay_isOn :1; + unsigned Temp7_relay_isOn :1; + unsigned Temp8_relay_isOn :1; + unsigned Temp9_relay_isOn :1; + unsigned Temp10_relay_isOn :1; + unsigned Temp11_relay_isOn :1; + unsigned Temp12_relay_isOn :1; + unsigned Temp13_relay_isOn :1; + unsigned Temp14_relay_isOn :1; + unsigned Temp15_relay_isOn :1; + unsigned Temp16_relay_isOn :1; + + + } state_val_bit; + uint16_t all; + + + }RELAY_Struct; + + typedef union + { + __PACKED_STRUCT + { + unsigned Temp1_isConnected :1; + unsigned Temp2_isConnected :1; + unsigned Temp3_isConnected :1; + unsigned Temp4_isConnected :1; + unsigned Temp5_isConnected :1; + unsigned Temp6_isConnected :1; + unsigned Temp7_isConnected :1; + unsigned Temp8_isConnected :1; + unsigned Temp9_isConnected :1; + unsigned Temp10_isConnected :1; + unsigned Temp11_isConnected :1; + unsigned Temp12_isConnected :1; + unsigned Temp13_isConnected :1; + unsigned Temp14_isConnected :1; + unsigned Temp15_isConnected :1; + unsigned Temp16_isConnected :1; + + } state_val_bit; + uint16_t all; + + + }STATUS_TSENS; + + +typedef __PACKED_STRUCT + { + int temp ; + unsigned Temp_relay_on :1; + unsigned Temp_relay_off :1; + unsigned is_connect:1; + + }Temp_sens; + extern Temp_sens temp_sens ; + +typedef __PACKED_STRUCT { - word coils[2]; + + word coils[3]; //32 + uint16_t reserve1[mb_fill_rsv(128/16, word[3])]; + STATUS_TSENS status_tSens[MAX_SENSE/16]; //32 + uint16_t reserve2[mb_fill_rsv(128/16, STATUS_TSENS[MAX_SENSE/16])]; + RELAY_Struct relay_struct[MAX_SENSE/16*2];//16 2 реле на 1 датчик + uint16_t reserve3[mb_fill_rsv(128/16, RELAY_Struct[MAX_SENSE/16*2])]; + unsigned init_param:1; - unsigned reserved:15; + unsigned init_Tsens:1; + unsigned Save_Param_to_Flash:1; + unsigned reserved2:14; }MB_DataCoilsTypeDef; -// DEFINES FOR COIL ARRAYS -#define C_CONTROL_ADDR 0 -#define C_CONTROL_QNT 100 + /** MODBUS_DATA_COILS_DEFINES * @} diff --git a/john103C6T6c русскими коментами.rar b/john103C6T6c русскими коментами.rar new file mode 100644 index 0000000..e36b5fd Binary files /dev/null and b/john103C6T6c русскими коментами.rar differ