Вячеслав Штейбезандт
5b2a64a39b
Реализовано и проверено: 1) Подключение устройства 2) Запись и чтение Coil и Holding регистров 3) Индикация работы МЗКТЭ и напряжения на ТЭ Реализовано и нуждается в проверке: 1) Поиск плат и установление их адресов в сети 2) Сканирование текущих настроек платы при подключении 3) Опрос текущих значений напряжений ТЭ по таймеру 4) Изменение скорости обмена, сетевого адреса плат и настройка контроля четности. #3
374 lines
19 KiB
C
374 lines
19 KiB
C
/**
|
||
**************************************************************************
|
||
* @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;
|