Добавлен модбас-модуль для john103C6T6_F4
This commit is contained in:
@@ -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_
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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_<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)
|
||||||
|
#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_<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////////////////////
|
||||||
@@ -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////////////////////
|
||||||
Reference in New Issue
Block a user