From 60d4d4d2573cd4eeacfa11e35448cd12f5dea3fc Mon Sep 17 00:00:00 2001 From: andrey Date: Fri, 26 Jun 2026 15:23:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BC=D0=BE=D0=B4=D0=B1=D0=B0=D1=81-=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=D0=BB=D1=8C=20=D0=B4=D0=BB=D1=8F=20john103C6T6=5FF?= =?UTF-8?q?4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modbus/modbus_config.h | 71 ++++ .../Modbus/modbus_data.c | 141 +++++++ .../Modbus/modbus_data.h | 383 ++++++++++++++++++ .../Modbus/modbus_data.h.orig | 282 +++++++++++++ 4 files changed, 877 insertions(+) create mode 100644 john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_config.h create mode 100644 john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.c create mode 100644 john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.h create mode 100644 john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.h.orig diff --git a/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_config.h b/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_config.h new file mode 100644 index 0000000..5ee4ec6 --- /dev/null +++ b/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_config.h @@ -0,0 +1,71 @@ +/** +****************************************************************************** +* @file modbus_config.h +* @brief Конфигурационные параметры Modbus устройства +****************************************************************************** +@addtogroup MODBUS_CONFIGS Modbus configs +@ingroup MODBUS +@brief Конфигурация библиотеки +@{ +****************************************************************************** +* @details +Файл содержит настройки для работы Modbus: +- Подключение библиотек контроллера +- ID устройства и таймауты +- Строковые идентификаторы (Vendor, Product, Revision) +- Настройки периферии (UART, TIMER) +- Подключение модулей Modbus +- Опциональные функции (переключение команд 0x03/0x04) +******************************************************************************/ +#ifndef _MODBUS_CONFIG_H_ +#define _MODBUS_CONFIG_H_ +#include "stm32f4xx_hal.h" + +// Общие параметры +#define MODBUS_DEVICE_ID 3 ///< Адрес устройства в сети Modbus +#define MODBUS_TIMEOUT 5000 ///< Таймаут в тиках таймера + +// Строковые идентификаторы устройства +#define MODBUS_VENDOR_NAME "NIO-12" +#define MODBUS_PRODUCT_CODE "" +#define MODBUS_REVISION "" +#define MODBUS_VENDOR_URL "" +#define MODBUS_PRODUCT_NAME "" +#define MODBUS_MODEL_NAME "" +#define MODBUS_USER_APPLICATION_NAME "" + +#define MODBUS_NUMB_OF_USEROBJECTS 0 ///< Количество пользовательских объектов +#define MODBUS_USEROBJECT_0_NAME "" ///< Строка пользовательского идентификатора 0. По аналогии можно определить строки до <=128 USEROBJECT + +// Периферия (опционально) +#define mb_huart huart1 ///< Удобный дефайн для модбасовского uart +#define mb_htim htim2 ///< Удобный дефайн для модбасовского таймера +//#define RS_EnableReceive() ///< Функция изменения направления передачи на ПРИЕМ для RS-485 +//#define RS_EnableTransmit() ///< Функция изменения направления передачи на ПЕРЕДАЧУ для RS-485 + + +// Модули modbus +#define MODBUS_ENABLE_SLAVE ///< Включить обработку СЛЕЙВ режима +#define MODBUS_ENABLE_MASTER ///< Включить обработку МАСТЕР режима + +#define MODBUS_ENABLE_COILS ///< Включить обработку коилов +#define MODBUS_ENABLE_HOLDINGS ///< Включить обработку регистров хранения +#define MODBUS_ENABLE_INPUTS ///< Включить обработку входных регистров +#define MODBUS_ENABLE_DEVICE_IDENTIFICATIONS ///< Включить обработку идентификаторы устройства +#define MODBUS_ENABLE_DIAGNOSTICS ///< Включить обработку диагностики модбас + +//#define MODBUS_PROTOCOL_TCP ///< Включить TCP-протокол, иначе - RTU + +/** + * @brief Поменять комманды 0x03 и 0x04 местами (для LabView терминалки от двигателей) + * @details Терминалка от двигателей использует для чтения регистров комманду R_HOLD_REGS вместо R_IN_REGS + * Поэтому чтобы считывать Input Regs - надо поменять их местами. + */ +//#define MODBUS_SWITCH_COMMAND_R_IN_REGS_AND_R_HOLD_REGS + +///////////////////////////////////////////////////////////////////// +/////////////////////////---CALC DEFINES---////////////////////////// + + + +#endif //_MODBUS_CONFIG_H_ diff --git a/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.c b/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.c new file mode 100644 index 0000000..50ffa3a --- /dev/null +++ b/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.c @@ -0,0 +1,141 @@ +/** +****************************************************************************** +* @file modbus_data.c +* @brief Функции доступа к данным Modbus +****************************************************************************** +* @details +Модуль реализует функции валидации адресов и доступа к данным: +- Проверка корректности запрашиваемых адресов +- Определение указателей на реальные данные в памяти +- Поддержка пользовательских массивов регистров и coils + +@section Валидация адресов: +- MB_Check_Address_For_Arr() - проверка принадлежности адреса массиву +- MB_DefineRegistersAddress() - получение указателя на регистры +- MB_DefineCoilsAddress() - получение указателя на coils + +******************************************************************************/ + +#include "modbus_core.h" +#include "modbus_coils.h" +#include "modbus_holdregs.h" +#include "modbus_inputregs.h" +#include "modbus_devid.h" + + +/** + * @brief Check is address valid for certain array. + * @param Addr Начальный адресс. + * @param Qnt Количество запрашиваемых элементов. + * @param R_ARR_ADDR Начальный адресс массива R_ARR. + * @param R_ARR_NUMB Количество элементов в массиве R_ARR. + * @return ExceptionCode - ET_ILLEGAL_DATA_ADRESS если адресс недействителен, и ET_NO_ERRORS если все ок. + * + * @details Позволяет определить, принадлежит ли адресс Addr массиву R_ARR: + * Если адресс Addr находится в диапазоне адрессов массива R_ARR, то возвращаем NO_ERROR. + * Если адресс Addr находится за пределами адрессов массива R_ARR - ET_ILLEGAL_DATA_ADDRESSю. + */ +MB_ExceptionTypeDef MB_Check_Address_For_Arr(uint16_t Addr, uint16_t Qnt, uint16_t R_ARR_ADDR, uint16_t R_ARR_NUMB) +{ + // if address from this array + if(Addr >= R_ARR_ADDR) + { + // if quantity too big return error + if ((Addr - R_ARR_ADDR) + Qnt > R_ARR_NUMB) + { + return ET_ILLEGAL_DATA_ADDRESS; // return exception code + } + // if all ok - return no errors + return ET_NO_ERRORS; + } + // if address isnt from this array return error + else + return ET_ILLEGAL_DATA_ADDRESS; // return exception code +} +/** + * @brief Define Address Origin for Input/Holding Registers + * @param pRegs Указатель на указатель регистров. + * @param Addr Адрес начального регистра. + * @param Qnt Количество запрашиваемых регистров. + * @param WriteFlag Флаг регистр нужны для чтения или записи. + * @return ExceptionCode Код исключения если есть, и ET_NO_ERRORS если нет. + * + * @details Определение адреса начального регистра. + * @note WriteFlag пока не используется. + */ +MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, uint16_t Qnt, uint8_t RegisterType) +{ + /* check quantity error */ + if (Qnt > DATA_SIZE) + { + return ET_ILLEGAL_DATA_VALUE; // return exception code + } + + if(RegisterType == RegisterType_Holding) + { + // Default holding registers + if(MB_Check_Address_For_Arr(Addr, Qnt, R_HOLDING_ADDR, R_HOLDING_QNT) == ET_NO_ERRORS) + { + *pRegs = MB_Set_Register_Ptr(&MB_DATA.HoldRegs, Addr - R_HOLDING_ADDR); // указатель на выбранный по Addr регистр + } + // if address doesnt match any array - return illegal data address response + else + { + return ET_ILLEGAL_DATA_ADDRESS; + } + } + else if(RegisterType == RegisterType_Input) + { + // Default input registers + if(MB_Check_Address_For_Arr(Addr, Qnt, R_INPUT_ADDR, R_INPUT_QNT) == ET_NO_ERRORS) + { + *pRegs = MB_Set_Register_Ptr(&MB_DATA.InRegs, Addr - R_INPUT_ADDR); // указатель на выбранный по Addr регистр + } + // if address doesnt match any array - return illegal data address response + else + { + return ET_ILLEGAL_DATA_ADDRESS; + } + } + else + { + return ET_ILLEGAL_FUNCTION; + } + // if found requeried array return no err + return ET_NO_ERRORS; // return no errors +} +/** + * @brief Define Address Origin for coils + * @param pCoils Указатель на указатель коилов. + * @param Addr Адресс начального коила. + * @param Qnt Количество запрашиваемых коилов. + * @param start_shift Указатель на переменную содержащую сдвиг внутри регистра для начального коила. + * @param WriteFlag Флаг коилы нужны для чтения или записи. + * @return ExceptionCode Код исключения если есть, и ET_NO_ERRORS если нет. + * + * @details Определение адреса начального регистра запрашиваемых коилов. + * @note WriteFlag используется для определния регистров GPIO: ODR или IDR. + */ +MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint16_t Qnt, uint16_t *start_shift, uint8_t WriteFlag) +{ + /* check quantity error */ + if (Qnt > 2000) + { + return ET_ILLEGAL_DATA_VALUE; // return exception code + } + + // Default coils + if(MB_Check_Address_For_Arr(Addr, Qnt, C_CONTROL_ADDR, C_CONTROL_QNT) == ET_NO_ERRORS) + { + *pCoils = MB_Set_Coil_Reg_Ptr(&MB_DATA.Coils, Addr - C_CONTROL_ADDR); // указатель на выбранный по Addr массив коилов + } + // if address doesnt match any array - return illegal data address response + else + { + return ET_ILLEGAL_DATA_ADDRESS; + } + + *start_shift = Addr % 16; // set shift to requested coil + // if found requeried array return no err + return ET_NO_ERRORS; // return no errors +} diff --git a/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.h b/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.h new file mode 100644 index 0000000..9162337 --- /dev/null +++ b/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.h @@ -0,0 +1,383 @@ +/** +************************************************************************** +* @file modbus_data.h +* @brief Заголовочный файл с описанием даты MODBUS. +* @details Данный файл необходимо подключается в rs_message.h. После rs_message.h +* подключается к основному проекту. +* +* @defgroup MODBUS_DATA +* @ingroup MODBUS +* @brief Modbus data description +* +*************************************************************************/ + + + + +#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 + +// RTC holding registers: write time/date here and set apply=1. +#define R_HOLDING_RTC_ADDR 200 +#define R_HOLDING_RTC_HOURS_ADDR (R_HOLDING_RTC_ADDR + 0) +#define R_HOLDING_RTC_MINUTES_ADDR (R_HOLDING_RTC_ADDR + 1) +#define R_HOLDING_RTC_SECONDS_ADDR (R_HOLDING_RTC_ADDR + 2) +#define R_HOLDING_RTC_DATE_ADDR (R_HOLDING_RTC_ADDR + 3) +#define R_HOLDING_RTC_MONTH_ADDR (R_HOLDING_RTC_ADDR + 4) +#define R_HOLDING_RTC_YEAR_ADDR (R_HOLDING_RTC_ADDR + 5) +#define R_HOLDING_RTC_WEEKDAY_ADDR (R_HOLDING_RTC_ADDR + 6) +#define R_HOLDING_RTC_APPLY_ADDR (R_HOLDING_RTC_ADDR + 7) +#define R_HOLDING_RTC_STATUS_ADDR (R_HOLDING_RTC_ADDR + 8) + +// RTC input registers: current time/date. +#define R_INPUT_RTC_ADDR 1201 +#define R_INPUT_RTC_HOURS_ADDR (R_INPUT_RTC_ADDR + 0) +#define R_INPUT_RTC_MINUTES_ADDR (R_INPUT_RTC_ADDR + 1) +#define R_INPUT_RTC_SECONDS_ADDR (R_INPUT_RTC_ADDR + 2) +#define R_INPUT_RTC_DATE_ADDR (R_INPUT_RTC_ADDR + 3) +#define R_INPUT_RTC_MONTH_ADDR (R_INPUT_RTC_ADDR + 4) +#define R_INPUT_RTC_YEAR_ADDR (R_INPUT_RTC_ADDR + 5) +#define R_INPUT_RTC_WEEKDAY_ADDR (R_INPUT_RTC_ADDR + 6) +#define R_INPUT_RTC_APPLY_ADDR (R_INPUT_RTC_ADDR + 7) +#define R_INPUT_RTC_STATUS_ADDR (R_INPUT_RTC_ADDR + 8) + +#define MB_RTC_APPLY_SET 1U +#define MB_RTC_STATUS_IDLE 0U +#define MB_RTC_STATUS_SET_OK 1U +#define MB_RTC_STATUS_VALUE_ERROR 2U +#define MB_RTC_STATUS_HAL_ERROR 3U + +// 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 +/** + * @addtogroup MODBUS_DATA_RERISTERS_DEFINES + * @ingroup MODBUS_DATA + * @brief Defines for registers + Структура дефайна адресов + @verbatim + Для массивов регистров: + R__ADDR - модбас адресс первого регистра в массиве + R__QNT - количество регистров в массиве + + При добавлении новых массивов регистров, необходимо их добавить в функцию MB_DefineRegistersAddress + + if(MB_Check_Address_For_Arr(Addr, Qnt, R__ADDR, R__QNT) == NO_ERRORS) + { + *pRegs = MB_Set_Register_Ptr(&, Addr); // начало регистров хранения/входных + } + @endverbatim + * @{ + */ + + +/** + * @brief Регистры хранения + */ + + +/** + * @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) +#define mb_fill_gap(_from_, _to_, _struct_) (((_to_) > ((_from_) + mb_sizeof(_struct_))) ? ((_to_) - (_from_) - mb_sizeof(_struct_)) : 0) + +#define R_INPUT_ROOM_ADDR 400 +#define R_INPUT_ID_ADDR 1000 +#define R_INPUT_NUM_TSENS_ADDR 1200 +#define R_HOLDING_HYST_ADDR 100 +#define R_HOLDING_ROOM_ADDR 300 + +#define MB_ROOM_TEMP_SCALE 10U +#define MB_ROOM_VALVE_ANGLE_MAX_DEFAULT 90U +#define ROOM_MODE_AUTO 0U +#define ROOM_MODE_MANUAL 1U +#define ROOM_COMMAND_STOP 0U +#define ROOM_COMMAND_OPEN 1U +#define ROOM_COMMAND_CLOSE 2U + + + + + + +typedef __PACKED_STRUCT +{ + uint16_t hours; + uint16_t minutes; + uint16_t seconds; + uint16_t date; + uint16_t month; + uint16_t year; + uint16_t weekday; + uint16_t apply; + uint16_t status; +} MB_RtcCalendarRegsTypeDef; + +typedef __PACKED_STRUCT +{ + uint16_t channel; + uint16_t location; + uint16_t ds18b20_id[4]; + uint16_t temperature_x10; + uint16_t setpoint_x10; + uint16_t hysteresis_x10; + uint16_t valve_position_pct; + uint16_t valve_angle_deg; + uint16_t valve_angle_max_deg; + uint16_t is_connected; + uint16_t valve_open; + uint16_t valve_close; + uint16_t mode; + uint16_t command_state; + uint16_t reserved; +} MB_RoomInputRegsTypeDef; + + +typedef __PACKED_STRUCT +{ + uint16_t setpoint_x10; + uint16_t hysteresis_x10; + uint16_t valve_position_pct; + uint16_t valve_angle_max_deg; + uint16_t mode; + uint16_t command; + uint16_t location; + uint16_t apply; +} MB_RoomHoldingRegsTypeDef; + + + + + +typedef __PACKED_STRUCT//MB_DataInRegsTypeDef +{ + + uint16_t sens_Temp[MAX_SENSE]; + uint16_t reserve_to_room[mb_fill_rsv(R_INPUT_ROOM_ADDR, uint16_t[MAX_SENSE])]; + MB_RoomInputRegsTypeDef room[MAX_SENSE]; + uint16_t reserve_to_id[mb_fill_gap(R_INPUT_ROOM_ADDR, R_INPUT_ID_ADDR, MB_RoomInputRegsTypeDef[MAX_SENSE])]; + DS18B20_Drv_t ID; + uint16_t reserve_to_num_tsens[mb_fill_gap(R_INPUT_ID_ADDR, R_INPUT_NUM_TSENS_ADDR, DS18B20_Drv_t)]; + uint16_t num_Tsens; + MB_RtcCalendarRegsTypeDef rtc; + + +} MB_DataInRegsTypeDef; + + +/** + * @brief Входные регистры + */ +typedef __PACKED_STRUCT //MB_DataInRegsTypeDef +{ + uint16_t set_Temp[MAX_SENSE]; + uint16_t reserve_to_hyst[mb_fill_rsv(R_HOLDING_HYST_ADDR, uint16_t[MAX_SENSE])]; + uint16_t set_hyst[MAX_SENSE]; + uint16_t reserve_to_rtc[mb_fill_gap(R_HOLDING_HYST_ADDR, R_HOLDING_RTC_ADDR, uint16_t[MAX_SENSE])]; + MB_RtcCalendarRegsTypeDef rtc; + uint16_t reserve_to_room_cfg[mb_fill_gap(R_HOLDING_RTC_ADDR, R_HOLDING_ROOM_ADDR, MB_RtcCalendarRegsTypeDef)]; + MB_RoomHoldingRegsTypeDef room_cfg[MAX_SENSE]; +} MB_DataHoldRegsTypeDef; + + + + + +/** MODBUS_DATA_RERISTERS_DEFINES + * @} + */ + +//----------------DEFINES FOR COILS----------------- +/** + * @addtogroup MODBUS_DATA_COILS_DEFINES + * @ingroup MODBUS_DATA + * @brief Defines for coils + @verbatim + Структура дефайна + Для массивов коилов: + C__ADDR - модбас адресс первого коила в массиве + C__QNT - количество коилов в массиве (минимум 16) + + При добавлении новых массивов коилов, необходимо их добавить в функцию MB_DefineCoilsAddress + + if(MB_Check_Address_For_Arr(Addr, Qnt, C__ADDR, C__QNT) == NO_ERRORS) + { + *pCoils = MB_Set_Coil_Reg_Ptr(&, Addr); + } + + @endverbatim + * @{ + */ + + + +/** + * @brief Коилы + * @details Желательно с помощью reserved делать стркутуру кратной 16-битам + */ +typedef union +{ + __PACKED_STRUCT + { + unsigned state_val_01: 1; + unsigned state_val_02: 1; + unsigned state_val_03: 1; + unsigned state_val_04: 1; + unsigned state_val_05: 1; + unsigned state_val_06: 1; + unsigned state_val_07: 1; + unsigned state_val_08: 1; + unsigned state_val_09: 1; + unsigned state_val_10: 1; + unsigned state_val_11: 1; + unsigned state_val_12: 1; + unsigned state_val_13: 1; + unsigned state_val_14: 1; + unsigned state_val_15: 1; + unsigned state_val_16: 1; + } state_val_bit; + uint16_t all; + + +} word; +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[3]; //48 + uint16_t reserve_coils[mb_fill_rsv(128 / 16, word[3])]; + STATUS_TSENS status_tSens[MAX_SENSE / 16]; //32 + uint16_t reserve_status_tSens[mb_fill_rsv(128 / 16, STATUS_TSENS[MAX_SENSE / 16])]; + RELAY_Struct relay_struct_on; //16 ON + uint16_t reserve_relay_struct_on[mb_fill_rsv(32 / 16, RELAY_Struct)]; + RELAY_Struct relay_struct_off; //16 OFF + uint16_t reserve_relay_struct_off[mb_fill_rsv(32 / 16, RELAY_Struct)]; + uint16_t reserve3[mb_fill_rsv(80 / 16, RELAY_Struct)]; + + unsigned init_param: 1; //384 + unsigned init_Tsens: 1; //385 + unsigned Save_Param_to_Flash: 1; //386 + unsigned reserved2: 13; + +} MB_DataCoilsTypeDef; + + + +/** MODBUS_DATA_COILS_DEFINES + * @} + */ + + +//-----------MODBUS DEVICE DATA SETTING------------- +// MODBUS DATA STRUCTTURE +/** + * @brief Структура со всеми регистрами и коилами модбас + * @ingroup MODBUS_DATA + */ +typedef struct // tester modbus data +{ + MB_DataInRegsTypeDef InRegs; ///< Modbus input registers @ref MB_DataInRegsTypeDef + + MB_DataCoilsTypeDef Coils; ///< Modbus coils @ref MB_DataCoilsTypeDef + + MB_DataHoldRegsTypeDef HoldRegs; ///< Modbus holding registers @ref MB_DataHoldRegsTypeDef +} MB_DataStructureTypeDef; +extern MB_DataStructureTypeDef MB_DATA; + +#endif //_MODBUS_DATA_H_ + +///////////////////////////////////////////////////////////// +///////////////////////TEMP/OUTDATE/OTHER//////////////////// diff --git a/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.h.orig b/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.h.orig new file mode 100644 index 0000000..3d2232a --- /dev/null +++ b/john103C6T6NewVer/john103C6T6_JZ-F407VET6_F4/Modbus/modbus_data.h.orig @@ -0,0 +1,282 @@ +/** +************************************************************************** +* @file modbus_data.h +* @brief Заголовочный файл с описанием даты MODBUS. +* @details Данный файл необходимо подключается в rs_message.h. После rs_message.h +* подключается к основному проекту. +* +* @defgroup MODBUS_DATA +* @ingroup MODBUS +* @brief Modbus data description +* +*************************************************************************/ + + + + +#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 +/** + * @addtogroup MODBUS_DATA_RERISTERS_DEFINES + * @ingroup MODBUS_DATA + * @brief Defines for registers + Структура дефайна адресов + @verbatim + Для массивов регистров: + R__ADDR - модбас адресс первого регистра в массиве + R__QNT - количество регистров в массиве + + При добавлении новых массивов регистров, необходимо их добавить в функцию MB_DefineRegistersAddress + + if(MB_Check_Address_For_Arr(Addr, Qnt, R__ADDR, R__QNT) == NO_ERRORS) + { + *pRegs = MB_Set_Register_Ptr(&, Addr); // начало регистров хранения/входных + } + @endverbatim + * @{ + */ + + +/** + * @brief Регистры хранения + */ + + +/** + * @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; + + +/** + * @brief Входные регистры + */ +typedef __PACKED_STRUCT //MB_DataInRegsTypeDef +{ + 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; + + + + + +/** MODBUS_DATA_RERISTERS_DEFINES + * @} + */ + +//----------------DEFINES FOR COILS----------------- +/** + * @addtogroup MODBUS_DATA_COILS_DEFINES + * @ingroup MODBUS_DATA + * @brief Defines for coils + @verbatim + Структура дефайна + Для массивов коилов: + C__ADDR - модбас адресс первого коила в массиве + C__QNT - количество коилов в массиве (минимум 16) + + При добавлении новых массивов коилов, необходимо их добавить в функцию MB_DefineCoilsAddress + + if(MB_Check_Address_For_Arr(Addr, Qnt, C__ADDR, C__QNT) == NO_ERRORS) + { + *pCoils = MB_Set_Coil_Reg_Ptr(&, Addr); + } + + @endverbatim + * @{ + */ + + + +/** + * @brief Коилы + * @details Желательно с помощью reserved делать стркутуру кратной 16-битам + */ +typedef union +{ + __PACKED_STRUCT + { + unsigned state_val_01: 1; + unsigned state_val_02: 1; + unsigned state_val_03: 1; + unsigned state_val_04: 1; + unsigned state_val_05: 1; + unsigned state_val_06: 1; + unsigned state_val_07: 1; + unsigned state_val_08: 1; + unsigned state_val_09: 1; + unsigned state_val_10: 1; + unsigned state_val_11: 1; + unsigned state_val_12: 1; + unsigned state_val_13: 1; + unsigned state_val_14: 1; + unsigned state_val_15: 1; + unsigned state_val_16: 1; + } state_val_bit; + uint16_t all; + + +} word; +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[3]; //48 + 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_on; //16 ON + RELAY_Struct relay_struct_off; //16 OFF + uint16_t reserve3[mb_fill_rsv(128 / 16, RELAY_Struct[MAX_SENSE / 16 * 2])]; + + unsigned init_param: 1; //384 + unsigned init_Tsens: 1; //385 + unsigned Save_Param_to_Flash: 1; //386 + unsigned reserved2: 13; + +} MB_DataCoilsTypeDef; + + + +/** MODBUS_DATA_COILS_DEFINES + * @} + */ + + +//-----------MODBUS DEVICE DATA SETTING------------- +// MODBUS DATA STRUCTTURE +/** + * @brief Структура со всеми регистрами и коилами модбас + * @ingroup MODBUS_DATA + */ +typedef struct // tester modbus data +{ + MB_DataInRegsTypeDef InRegs; ///< Modbus input registers @ref MB_DataInRegsTypeDef + + MB_DataCoilsTypeDef Coils; ///< Modbus coils @ref MB_DataCoilsTypeDef + + MB_DataHoldRegsTypeDef HoldRegs; ///< Modbus holding registers @ref MB_DataHoldRegsTypeDef +} MB_DataStructureTypeDef; +extern MB_DataStructureTypeDef MB_DATA; + +#endif //_MODBUS_DATA_H_ + +///////////////////////////////////////////////////////////// +///////////////////////TEMP/OUTDATE/OTHER//////////////////// \ No newline at end of file