добавил второй проект для C8T6

This commit is contained in:
2026-02-14 18:13:02 +03:00
parent 69ae4f8cf2
commit 8552d8ee90
2781 changed files with 1626381 additions and 41 deletions

View File

@@ -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 "stm32f1xx_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_

View File

@@ -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
}

View File

@@ -0,0 +1,284 @@
/**
**************************************************************************
* @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_<NAME_ARRAY>_ADDR - модбас адресс первого регистра в массиве
R_<NAME_ARRAY>_QNT - количество регистров в массиве
При добавлении новых массивов регистров, необходимо их добавить в функцию MB_DefineRegistersAddress
if(MB_Check_Address_For_Arr(Addr, Qnt, R_<NEW_ARRAY>_ADDR, R_<NEW_ARRAY>_QNT) == NO_ERRORS)
{
*pRegs = MB_Set_Register_Ptr(&<NEW_ARRAY>, 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_<NAME_ARRAY>_ADDR - модбас адресс первого коила в массиве
C_<NAME_ARRAY>_QNT - количество коилов в массиве (минимум 16)
При добавлении новых массивов коилов, необходимо их добавить в функцию MB_DefineCoilsAddress
if(MB_Check_Address_For_Arr(Addr, Qnt, C_<NEW_ARRAY>_ADDR, C_<NEW_ARRAY>_QNT) == NO_ERRORS)
{
*pCoils = MB_Set_Coil_Reg_Ptr(&<NEW_ARRAY>, 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////////////////////

View File

@@ -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_<NAME_ARRAY>_ADDR - модбас адресс первого регистра в массиве
R_<NAME_ARRAY>_QNT - количество регистров в массиве
При добавлении новых массивов регистров, необходимо их добавить в функцию MB_DefineRegistersAddress
if(MB_Check_Address_For_Arr(Addr, Qnt, R_<NEW_ARRAY>_ADDR, R_<NEW_ARRAY>_QNT) == NO_ERRORS)
{
*pRegs = MB_Set_Register_Ptr(&<NEW_ARRAY>, 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_<NAME_ARRAY>_ADDR - модбас адресс первого коила в массиве
C_<NAME_ARRAY>_QNT - количество коилов в массиве (минимум 16)
При добавлении новых массивов коилов, необходимо их добавить в функцию MB_DefineCoilsAddress
if(MB_Check_Address_For_Arr(Addr, Qnt, C_<NEW_ARRAY>_ADDR, C_<NEW_ARRAY>_QNT) == NO_ERRORS)
{
*pCoils = MB_Set_Coil_Reg_Ptr(&<NEW_ARRAY>, 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////////////////////