M3KTE_TERM/ТЗ/modbus_data.h
Вячеслав Штейбезандт 5b2a64a39b Программа нуждается в тестировании.
Реализовано и проверено:
1) Подключение устройства
2) Запись и чтение Coil и Holding регистров
3) Индикация работы МЗКТЭ и напряжения на ТЭ

Реализовано и нуждается в проверке:
1) Поиск плат и установление их адресов в сети
2) Сканирование текущих настроек платы при подключении
3) Опрос текущих значений напряжений ТЭ по таймеру
4) Изменение скорости обмена, сетевого адреса плат и настройка контроля четности.

#3
2024-12-10 17:19:23 +03:00

374 lines
19 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
**************************************************************************
* @file modbus_data.h
* @brief Заголовочный файл с описанием даты MODBUS.
* @details Данный файл необходимо подключается в rs_message.h. После rs_message.h
* подключается к основному проекту.
*
* @defgroup MODBUS_DATA
* @ingroup MODBUS
* @brief Modbus data description
*
*************************************************************************/
#include "stdint.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 - количество регистров в массиве
@endverbatim
* @{
*/
/**
* @brief Скорость обмена
*/
typedef enum //MB_SpeedTypeDef
{
MB_9600bs = 0x0000, ///< Скорость 9600 б/с
MB_14400bs = 0x0001, ///< Скорость 14400 б/с
MB_19200bs = 0x0002, ///< Скорость 19200 б/с
MB_31250bs = 0x0003, ///< Скорость 31250 б/с
MB_38400bs = 0x0004, ///< Скорость 38400 б/с
MB_56000bs = 0x0005, ///< Скорость 56000 б/с
MB_57600bs = 0x0006, ///< Скорость 57600 б/с
MB_115200bs = 0x0007, ///< Скорость 115200 б/с
mb16bit = 0x1000, ///< костыль чтобы enum был 16-битный... или забить на enum, пока не определился
}MB_SpeedTypeDef;
/**
* @brief Контроль четности
*/
typedef enum //MB_ParityCtrlTypeDef
{
NoParityCtrl = 0x0000, ///< контроля нет
EvenParityCtrl = 0x0400, ///< четный контроль
OddParityCtrl = 0x0600, ///< нечетый контроль
}MB_ParityCtrlTypeDef;
/**
* @brief Регистры хранения для уставок параметров МКЗТЭ
*/
typedef struct //MB_DataHoldRegsTypeDef
{
uint16_t Warning_Setpoints[85]; /*!< @brief Адреса 0-84: Уставки «Предупреждение»
@details Задает пороговое напряжение, при достижении которого будет сформирован сигнал «Предупреждение».
Максимальное значение (записываемое в регистр) - 1100 (1,1 В *1000) */
uint16_t Errors_Setpoints[85]; /*!< @brief Адреса 85-169: Уставки «Авария»
@details Задает пороговое напряжение, при достижении которого будет сформирован сигнал «Авария».
Максимальное значение (записываемое в регистр) - 1100 (1,1 В *1000) */
uint16_t Commands_Mode; /*!< @brief Адрес 170: Уставка «Команды»
@details Принимаемые значения:
- 0x0000 стандартная работа
- 0x0001 запрет опроса ТЭ (активен только обмен с ЛСУ ЭС, ТЭ не контролируются) */
uint16_t reserved; ///< Адрес 171 зарезервирован
uint16_t MZKTE_Network_Adress; /*!< @brief Адрес 172: Уставка «Сетевой адрес МЗКТЭ»
@details При удачной записи этого регистра ответный фрейм не отправляется */
MB_SpeedTypeDef Modbus_Speed:16; /*!< @brief Адрес 173: Уставка «Скорость обмена»
@details Принимаемые значения описаны в @ref MB_SpeedTypeDef.
При удачной записи этого регистра ответный фрейм не отправляется */
MB_ParityCtrlTypeDef Parity_Control:16; /*!< @brief Адрес 174: Уставка «Команды»
@details Принимаемые значения описаны в @ref MB_ParityCtrlTypeDef.
При удачной записи этого регистра ответный фрейм не отправляется */
}MB_DataHoldRegsTypeDef;
/**
* @brief Номер неисправности МЗКТЭ
*/
typedef enum //MB_MZKTEErrorsTypeDef
{
No_Err = 0x00, ///< Неисправность отсутствует
Err_Digit_5V_Power = 0x01, ///< Неисправность цифрового источника питания +5 В
Err_Analog_15V_5V_3V_Power = 0x02, ///< Неисправность аналогового источника питания (±15 В/+5 В/+3,3 В)
Err_SCI_5V_Power = 0x03, ///< Неисправность источника питания последовательных интерфейсов микроконтроллера +5 В
Err_24V_Power = 0x04, ///< Неисправность источника питания +24 В
Program_Err_1 = 0x05, ///< Программная ошибка 1
Program_Err_2 = 0x06, ///< Программная ошибка 2
Program_Err_3 = 0x07, ///< Программная ошибка 3
Program_Err_4 = 0x08, ///< Программная ошибка 4
Program_Err_5 = 0x09, ///< Программная ошибка 5
Program_Err_6 = 0x0A, ///< Программная ошибка 6
Program_Err_7 = 0x0B, ///< Программная ошибка 7
Program_Err_8 = 0x0C, ///< Программная ошибка 8
}MB_MZKTEErrorsTypeDef;
/**
* @brief Сборный параметр
* @details Информация о состоянии МЗКТЭ
*/
typedef union //MB_MZKTEStatusTypeDef
{
uint16_t all; ///< Доступ к регистру целиком
struct
{
unsigned TE_ErrActive:1; /*!< @brief Бит [0]: Авария на ТЭ
@details Состояния:
- 0 - напряжения на всех ТЭ выше аварийных порогов, задаваемых уставками «Авария»
- 1 - напряжение на одном или нескольких ТЭ достигло или ниже аварийного порога, задаваемого уставкой «Авария» */
unsigned TE_WarnActive:1; /*!< @brief Бит [1]: Предупреждения на ТЭ
@details Состояния:
- 0 - напряжения на всех ТЭ выше предупредительных порогов, задаваемых уставкой «Предупреждение»
- 1 - напряжение на одном или нескольких ТЭ достигло или ниже предупредительного порога, задаваемого уставкой «Предупреждение» */
unsigned Opros_TE:1; /*!< @brief Бит [2]: Разрешение опроса ТЭ
@details Состояния:
- 0 опрос ТЭ разрешен
- 1 опрос ТЭ запрещен */
unsigned MZKTE_ErrStatus:2; /*!< @brief Биты [4:3]: Состояние МЗКТЭ
@details Состояния:
- 0 - МЗКТЭ функционирует нормально. Идет опрос ТЭ.
- 1 - неисправность МЗКТЭ, при которой МЗКТЭ может выполнять свои основные функции
(некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef)
- 2 - Неисправность МЗКТЭ, при которой выполнение основных функций не представляется возможным
(ошибки 1-3 и некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef) */
unsigned reserved:3; ///< Биты [7:5] зарезервированны
MB_MZKTEErrorsTypeDef MZKTE_Error:8; /*!< @brief Биты [15:8]: Номер неисправности МЗКТЭ
@details Номера неисправностей описаны в @ref MB_MZKTEErrorsTypeDef */
}param; ///< Доступ к регистру по параметрам
}MB_MZKTEStatusTypeDef;
/**
* @brief Входные регистры для контроля состояния МЗКТЭ
*/
typedef struct //MB_DataInRegsTypeDef
{
uint16_t U_TE[85]; /*!< @brief Адреса 0-84: Текущие значения напряжения ТЭ
@details Значения передаются умноженными на 1000 (т.е. если Uтэ = 0,625 В, то будет передано число 625) */
MB_MZKTEStatusTypeDef Status; /*!< @brief Адрес 85: Сборный параметр
@details Информация о состоянии МЗКТЭ @ref MB_MZKTEStatusTypeDef */
}MB_DataInRegsTypeDef;
// DEFINES FOR REGISTERS ARRAYS
#define R_INREG_ADDR 0
#define R_INREG_QNT 86
#define R_HOLDREG_ADDR 0
#define R_HOLDREG_QNT 175
// DEFINES FOR REGISTERS LOCAL ADDRESSES
//#define R_SET_ERROR(_te_num_) 0
/** 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)
@endverbatim
* @{
*/
/**
* @brief Флаги исключения ТЭ из алгоритма формирования сигналов «Предупреждение» и «Авария»
* @details В случае установки нулевого значения конкретной ячейки значение напряжения ТЭ,
* связанного с этой ячейкой, не будет учитываться при формировании сигналов «Предупреждение» и «Авария»
*/
typedef struct //MB_DataCoilsTypeDef
{
union
{
struct
{
uint64_t TE0_63; ///< Ячейки ТЭ №0-63
uint32_t TE64_84:21; ///< Ячейки ТЭ №64-84
}all;
struct
{
unsigned TE0_Exclude:1;
unsigned TE1_Exclude:1;
unsigned TE2_Exclude:1;
unsigned TE3_Exclude:1;
unsigned TE4_Exclude:1;
unsigned TE5_Exclude:1;
unsigned TE6_Exclude:1;
unsigned TE7_Exclude:1;
unsigned TE8_Exclude:1;
unsigned TE9_Exclude:1;
unsigned TE10_Exclude:1;
unsigned TE11_Exclude:1;
unsigned TE12_Exclude:1;
unsigned TE13_Exclude:1;
unsigned TE14_Exclude:1;
unsigned TE15_Exclude:1;
unsigned TE16_Exclude:1;
unsigned TE17_Exclude:1;
unsigned TE18_Exclude:1;
unsigned TE19_Exclude:1;
unsigned TE20_Exclude:1;
unsigned TE21_Exclude:1;
unsigned TE22_Exclude:1;
unsigned TE23_Exclude:1;
unsigned TE24_Exclude:1;
unsigned TE25_Exclude:1;
unsigned TE26_Exclude:1;
unsigned TE27_Exclude:1;
unsigned TE28_Exclude:1;
unsigned TE29_Exclude:1;
unsigned TE30_Exclude:1;
unsigned TE31_Exclude:1;
unsigned TE32_Exclude:1;
unsigned TE33_Exclude:1;
unsigned TE34_Exclude:1;
unsigned TE35_Exclude:1;
unsigned TE36_Exclude:1;
unsigned TE37_Exclude:1;
unsigned TE38_Exclude:1;
unsigned TE39_Exclude:1;
unsigned TE40_Exclude:1;
unsigned TE41_Exclude:1;
unsigned TE42_Exclude:1;
unsigned TE43_Exclude:1;
unsigned TE44_Exclude:1;
unsigned TE45_Exclude:1;
unsigned TE46_Exclude:1;
unsigned TE47_Exclude:1;
unsigned TE48_Exclude:1;
unsigned TE49_Exclude:1;
unsigned TE50_Exclude:1;
unsigned TE51_Exclude:1;
unsigned TE52_Exclude:1;
unsigned TE53_Exclude:1;
unsigned TE54_Exclude:1;
unsigned TE55_Exclude:1;
unsigned TE56_Exclude:1;
unsigned TE57_Exclude:1;
unsigned TE58_Exclude:1;
unsigned TE59_Exclude:1;
unsigned TE60_Exclude:1;
unsigned TE61_Exclude:1;
unsigned TE62_Exclude:1;
unsigned TE63_Exclude:1;
unsigned TE64_Exclude:1;
unsigned TE65_Exclude:1;
unsigned TE66_Exclude:1;
unsigned TE67_Exclude:1;
unsigned TE68_Exclude:1;
unsigned TE69_Exclude:1;
unsigned TE70_Exclude:1;
unsigned TE71_Exclude:1;
unsigned TE72_Exclude:1;
unsigned TE73_Exclude:1;
unsigned TE74_Exclude:1;
unsigned TE75_Exclude:1;
unsigned TE76_Exclude:1;
unsigned TE77_Exclude:1;
unsigned TE78_Exclude:1;
unsigned TE79_Exclude:1;
unsigned TE80_Exclude:1;
unsigned TE81_Exclude:1;
unsigned TE82_Exclude:1;
unsigned TE83_Exclude:1;
unsigned TE84_Exclude:1;
}bit; ///< Биты для доступа к каждой ячейке ТЭ
}Exclude; ///< Юнион для исключения ТЭ
}MB_DataCoilsTypeDef;
// DEFINES FOR COIL ARRAYS
#define C_TE_EXCLUDE_ADDR 0
#define C_TE_EXCLUDE_QNT 84
/** MODBUS_DATA_COILS_DEFINES
* @}
*/
//-----------MODBUS DEVICE DATA SETTING-------------
// MODBUS DATA STRUCTTURE
/**
* @brief Структура со всеми регистрами и коилами модбас
* @ingroup MODBUS_DATA
*/
typedef struct // mzkt 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;
/////////////////////////////////////////////////////////////
///////////////////////TEMP/OUTDATE/OTHER////////////////////
//typedef enum //MB_MZKTECommandsTypeDef
//{
// StandartMode = 0x00, ///< Стандартная работа
// Opros_TE_Disable = 0x01, ///< Запрет опроса ТЭ (активен только обмен с ЛСУ ЭС, ТЭ не контролируются)
//}MB_MZKTECommandsTypeDef;
///**
// * @brief Состояние МЗКТЭ
// */
//typedef enum //MB_MZKTEErrStatusTypeDef
//{
// MZKTE_OK = 0x0, ///< МЗКТЭ функционирует нормально. Идет опрос ТЭ.
// NonCritical_Err = 0x1, ///< Неисправность МЗКТЭ, при которой МЗКТЭ может выполнять свои основные функции (некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef).
// Critical_Err = 0x2, ///< Неисправность МЗКТЭ, при которой выполнение основных функций не представляется возможным (ошибки 1-3 и некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef)
//
//}MB_MZKTEErrStatusTypeDef;
//typedef enum
//{
// TE_No_Err = 0x0, ///< Напряжения на всех ТЭ выше аварийных порогов, задаваемых уставками «Авария»
// TE_Err = 0x1, ///< Напряжение на одном или нескольких ТЭ достигло или ниже аварийного порога, задаваемого уставкой «Авария»
//}MB_TEErrActiveTypeDef;
//typedef enum
//{
// TE_No_Warn = 0x0, ///< Напряжения на всех ТЭ выше предупредительных порогов, задаваемых уставкой «Предупреждение»
// TE_Warn = 0x1, ///< Напряжение на одном или нескольких ТЭ достигло или ниже предупредительного порога, задаваемого уставкой «Предупреждение»
//}MB_TEWarnActiveTypeDef;
//typedef enum
//{
// OprosTE_Enable = 0x0, ///< Опрос ТЭ разрешен
// OprosTE_Disable = 0x1, ///< Опрос ТЭ запрещен (см. регистр хранения 170)
//}MB_OprosTETypeDef;