From eb48424111a3915423c33ad79ce0c1149280dba3 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Sat, 14 Feb 2026 09:50:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B8=20=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлено управление от ПУИ --- UPP/Core/Configs/modbus_data.c | 32 +- UPP/Core/Configs/modbus_data.h | 48 +- UPP/Core/Configs/upp_config.h | 1 + UPP/Core/Configs/upp_defs.h | 86 +-- UPP/Core/PowerMonitor/power_monitor.c | 4 +- UPP/Core/Src/gpio.c | 12 +- UPP/Core/UPP/upp_errors.c | 53 +- UPP/Core/UPP/upp_main.c | 42 +- UPP/Core/UPP/upp_main.h | 1 + UPP/Core/UPP/upp_params.h | 8 +- UPP/Core/UPP/upp_status.c | 108 ++-- UPP/Core/UPP/upp_status.h | 3 +- UPP/MDK-ARM/UPP.uvoptx | 59 +- UPP/UPP.ioc | 6 +- .../Modbus Карта.docx | Bin 14526 -> 15795 bytes ...нутренние настройки.mbp | 537 ++++++++++++++++++ .../Modbus/Вызов функций.mbp | 138 +++++ .../Modbus/Значения для ПУИ.mbp | 277 +++++++++ .../Modbus/Настройки ПУИ.mbp | 169 ++++++ .../Управление от ПУИ.mbp | 78 +++ 20 files changed, 1514 insertions(+), 148 deletions(-) create mode 100644 Информация для программиста (УПП СП СЭД)/Modbus/Внутренние настройки.mbp create mode 100644 Информация для программиста (УПП СП СЭД)/Modbus/Вызов функций.mbp create mode 100644 Информация для программиста (УПП СП СЭД)/Modbus/Значения для ПУИ.mbp create mode 100644 Информация для программиста (УПП СП СЭД)/Modbus/Настройки ПУИ.mbp create mode 100644 Информация для программиста (УПП СП СЭД)/Modbus/Управление от ПУИ.mbp diff --git a/UPP/Core/Configs/modbus_data.c b/UPP/Core/Configs/modbus_data.c index 33c0103..d016027 100644 --- a/UPP/Core/Configs/modbus_data.c +++ b/UPP/Core/Configs/modbus_data.c @@ -81,16 +81,19 @@ MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, u return ET_ILLEGAL_DATA_VALUE; // return exception code } + int local_addr = 0; 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 регистр + local_addr = Addr - R_HOLDING_ADDR; + *pRegs = MB_Set_Register_Ptr(&MB_DATA.HoldRegs, local_addr); // указатель на выбранный по Addr регистр } - else if(MB_Check_Address_For_Arr(Addr, Qnt, R_HOLDING_PRVT_PARAMS_ADR, R_HOLDING_PRVT_PARAMS_QNT) == ET_NO_ERRORS) + else if(MB_Check_Address_For_Arr(Addr, Qnt, R_HOLDING_PRVT_ADDR, R_HOLDING_PRVT_QNT) == ET_NO_ERRORS) { - *pRegs = MB_Set_Register_Ptr(&MB_INTERNAL, Addr - R_HOLDING_PRVT_PARAMS_ADR); // указатель на выбранный по Addr регистр + local_addr = Addr - R_HOLDING_PRVT_ADDR; + *pRegs = MB_Set_Register_Ptr(&MB_INTERNAL.param, local_addr); // указатель на выбранный по Addr регистр } // if address doesnt match any array - return illegal data address response else @@ -103,7 +106,8 @@ MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, u // 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 регистр + local_addr = Addr - R_INPUT_ADDR; + *pRegs = MB_Set_Register_Ptr(&MB_DATA.InRegs, local_addr); // указатель на выбранный по Addr регистр } // if address doesnt match any array - return illegal data address response else @@ -135,7 +139,12 @@ MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint /* В режиме работа ничего не записываем */ if((upp.workmode == UPP_Work) && WriteFlag) { - return ET_ILLEGAL_FUNCTION; + /* Оставляем только запись регистрво управления */ + int is_control_register = (Addr > 100 && Addr + Qnt <= 101); + if(!is_control_register) + { + return ET_ILLEGAL_FUNCTION; + } } /* check quantity error */ @@ -143,11 +152,18 @@ MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint { return ET_ILLEGAL_DATA_VALUE; // return exception code } - + + int local_addr = 0; // Default coils if(MB_Check_Address_For_Arr(Addr, Qnt, C_COILS_ADDR, C_COILS_QNT) == ET_NO_ERRORS) { - *pCoils = MB_Set_Coil_Reg_Ptr(&MB_DATA.Coils, Addr - C_COILS_ADDR); // указатель на выбранный по Addr массив коилов + local_addr = Addr - C_COILS_ADDR; + *pCoils = MB_Set_Coil_Reg_Ptr(&MB_DATA.Coils, local_addr); // указатель на выбранный по Addr массив коилов + } + else if(MB_Check_Address_For_Arr(Addr, Qnt, C_COILS_PRVT_ADDR, C_COILS_PRVT_QNT) == ET_NO_ERRORS) + { + local_addr = Addr - C_COILS_PRVT_ADDR; + *pCoils = MB_Set_Coil_Reg_Ptr(&MB_INTERNAL.FuncCalls, local_addr); // указатель на выбранный по Addr массив коилов } // if address doesnt match any array - return illegal data address response else @@ -155,7 +171,7 @@ MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint return ET_ILLEGAL_DATA_ADDRESS; } - *start_shift = Addr % 16; // set shift to requested coil + *start_shift = local_addr % 16; // set shift to requested coil // if found requeried array return no err return ET_NO_ERRORS; // return no errors } diff --git a/UPP/Core/Configs/modbus_data.h b/UPP/Core/Configs/modbus_data.h index 289053c..c76596e 100644 --- a/UPP/Core/Configs/modbus_data.h +++ b/UPP/Core/Configs/modbus_data.h @@ -56,23 +56,6 @@ #include "stdint.h" - -//--------------SIZES OF DATA--------------- -#define R_HOLDING_PRVT_PARAMS_ADR 555 -#define R_HOLDING_PRVT_PARAMS_QNT (sizeof(UPP_PrvtParams_t)/sizeof(uint16_t)) - -// DEFINES FOR INPUT REGISTERS ARRAYS -#define R_INPUT_ADDR 0 ///< Начальный адрес входных регистров -#define R_INPUT_QNT (sizeof(UPP_PUI_Values_t)/sizeof(uint16_t)) ///< Количество входных регистров - -// DEFINES FOR HOLDING REGISTERS ARRAYS -#define R_HOLDING_ADDR 0 ///< Начальный адрес регистров хранения -#define R_HOLDING_QNT (2000) ///< Количество регистров хранения - -// DEFINES FOR COIL ARRAYS -#define C_COILS_ADDR 0 ///< Начальный адрес коилов -#define C_COILS_QNT 16 ///< Количество регистров коилов - //--------------DEFINES FOR REGISTERS--------------- // DEFINES FOR ARRAYS /** @@ -93,7 +76,7 @@ */ typedef struct //MB_DataInRegsTypeDef { - UPP_PUI_Values_t pui; + UPP_PUI_Values_t pui_values; }MB_DataInRegsTypeDef; @@ -102,7 +85,10 @@ typedef struct //MB_DataInRegsTypeDef */ typedef struct //MB_DataInRegsTypeDef { - UPP_PUI_Params_t pui_params; + UPP_PUI_Params_t pui_params; ///< Адрес 0 и далее : Уставки от ПУИ + uint16_t reserved1[mb_fill_rsv(100, UPP_PUI_Params_t)]; + + UPP_PUI_Control_t pui_control; ///< Адрес 100 и далее: Управление от ПУИ }MB_DataHoldRegsTypeDef; @@ -172,6 +158,30 @@ typedef struct }MB_DataInternalTypeDef; extern MB_DataInternalTypeDef MB_INTERNAL; + + +//--------------SIZES OF DATA--------------- +#define R_HOLDING_PRVT_ADDR 1000 +#define R_HOLDING_PRVT_QNT (sizeof(UPP_PrvtParams_t)/sizeof(uint16_t)) + +#define C_COILS_PRVT_ADDR 1000 +#define C_COILS_PRVT_QNT (16) + +// DEFINES FOR INPUT REGISTERS ARRAYS +#define R_INPUT_ADDR 0 ///< Начальный адрес входных регистров +#define R_INPUT_QNT (sizeof(MB_DataInRegsTypeDef)/sizeof(uint16_t)) ///< Количество входных регистров + +// DEFINES FOR HOLDING REGISTERS ARRAYS +#define R_HOLDING_ADDR 0 ///< Начальный адрес регистров хранения +#define R_HOLDING_QNT (sizeof(MB_DataHoldRegsTypeDef)/sizeof(uint16_t)) ///< Количество регистров хранения + +// DEFINES FOR COIL ARRAYS +#define C_COILS_ADDR 0 ///< Начальный адрес коилов +#define C_COILS_QNT 0 ///< Количество регистров коилов + + + + #endif //_MODBUS_DATA_H_ ///////////////////////////////////////////////////////////// diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index a2e11de..f79a833 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -106,6 +106,7 @@ #define ERRORS_DELAY_MS_UAMP_ERR 1500 // todo #define ERRORS_DELAY_MS_F_ERR 5000 #define ERRORS_DELAY_MS_CRITICAL_ERR 0.0f +#define ERRORS_DELAY_MS_POWERBOARDS 2000 #define ERRORS_DELAY_MS_DEFAULT 0.1f diff --git a/UPP/Core/Configs/upp_defs.h b/UPP/Core/Configs/upp_defs.h index 375fe32..8b4b023 100644 --- a/UPP/Core/Configs/upp_defs.h +++ b/UPP/Core/Configs/upp_defs.h @@ -15,6 +15,20 @@ #include "upp_config.h" +/** + * @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) + + + + /** * @addtogroup UPP_HIGHLEVEL Defines for high-level * @ingroup UPP_DEFS @@ -27,10 +41,10 @@ * @brief Список аварий УПП */ typedef enum { - UPP_Init = 0, ///< УПП не инициализирован - UPP_Ready = 1, ///< УПП в готовности - UPP_Work = 2, ///< УПП в работе, управляет тиристорами - UPP_Error = 3, ///< УПП в аварии + UPP_Error = 0, ///< УПП в аварии + UPP_Init = 1, ///< УПП не инициализирован + UPP_Ready = 2, ///< УПП в готовности + UPP_Work = 3, ///< УПП в работе, управляет тиристорами // WM_Done = 3, ///< УПП закончил свою работу } UPP_WorkModeType_t; @@ -118,12 +132,13 @@ typedef struct */ typedef struct { - uint16_t NoConnectionPCH:1; + uint16_t Workmode:2; + uint16_t NoConnectionLSU:1; uint16_t NoInputVoltage:1; uint16_t CurrentLimited:1; uint16_t OverVoltage:1; uint16_t UnderVoltage:1; -}UPP_PUI_Warnings_t; +}UPP_PUI_Status_t; /** * @brief Структура данных от УПП передаваемых в ПУИ @@ -131,36 +146,32 @@ typedef struct typedef struct { uint16_t Error; /** @brief Адрес 0: Текущая авария @details В случае срабатывания защиты */ - - uint16_t WorkMode; /** @brief Адрес 1: Режим работы - @details «Готовность» или «Работа» */ - - uint16_t Uall; /** @brief Адрес 2: Среднее напряжение по трем фазам на входе УПП (RMS), Вольты */ - uint16_t Uab; /** @brief Адрес 3: Напряжение фазы AB (RMS), Вольты */ - uint16_t Ubc; /** @brief Адрес 4: Напряжение фазы BC (RMS), Вольты */ - uint16_t Uca; /** @brief Адрес 5: Напряжение фазы CA (RMS), Вольты */ - - uint16_t Iall; /** @brief Адрес 6: Средний ток по трем фазам на входе УПП (RMS), Амперы */ - uint16_t Ia; /** @brief Адрес 7: Ток фазы A (RMS), Амперы */ - uint16_t Ib; /** @brief Адрес 8: Ток фазы B (RMS), Амперы */ - uint16_t Ic; /** @brief Адрес 9: Ток фазы C (RMS), Амперы */ - - uint16_t Fall; /** @brief Адрес 10: Средняя частота напряжений по трем фазам на входе УПП, Герцы */ - uint16_t Fab; /** @brief Адрес 11: Частота напряжения фазы AB, Герцы */ - uint16_t Fbc; /** @brief Адрес 12: Частота напряжения фазы BC, Герцы */ - uint16_t Fca; /** @brief Адрес 13: Частота напряжения фазы CA, Герцы */ - - uint16_t Trad; /** @brief Адрес 14: Температура радиатора тиристоров, Градусы Цельсия */ - uint16_t Tshkaf; /** @brief Адрес 15: Температура внутри шкафа УПП, Градусы Цельсия */ - - uint16_t reserved[34]; /** @brief Адрес 16-49: Зарезервированны */ - - union { uint16_t all; - UPP_PUI_Warnings_t warn; - }Warnings; /** @brief Адрес 50: Предупреждения УПП */ + UPP_PUI_Status_t bit; + }Status; /** @brief Адрес 1: Состояние УПП */ + + uint16_t reserved[3]; + + uint16_t Uall; /** @brief Адрес 5: Среднее напряжение по трем фазам на входе УПП (RMS), Вольты */ + uint16_t Uab; /** @brief Адрес 6: Напряжение фазы AB (RMS), Вольты */ + uint16_t Ubc; /** @brief Адрес 7: Напряжение фазы BC (RMS), Вольты */ + uint16_t Uca; /** @brief Адрес 8: Напряжение фазы CA (RMS), Вольты */ + + uint16_t Iall; /** @brief Адрес 9: Средний ток по трем фазам на входе УПП (RMS), Амперы */ + uint16_t Ia; /** @brief Адрес 10: Ток фазы A (RMS), Амперы */ + uint16_t Ib; /** @brief Адрес 11: Ток фазы B (RMS), Амперы */ + uint16_t Ic; /** @brief Адрес 12: Ток фазы C (RMS), Амперы */ + + uint16_t Fall; /** @brief Адрес 13: Средняя частота напряжений по трем фазам на входе УПП, Герцы */ + uint16_t Fab; /** @brief Адрес 14: Частота напряжения фазы AB, Герцы */ + uint16_t Fbc; /** @brief Адрес 15: Частота напряжения фазы BC, Герцы */ + uint16_t Fca; /** @brief Адрес 16: Частота напряжения фазы CA, Герцы */ + + uint16_t Trad; /** @brief Адрес 17: Температура радиатора тиристоров, Градусы Цельсия */ + uint16_t Tshkaf; /** @brief Адрес 18: Температура внутри шкафа УПП, Градусы Цельсия */ + } UPP_PUI_Values_t; /** @@ -207,6 +218,15 @@ typedef struct { } UPP_PUI_Params_t; +/** + * @brief Структура управления УПП от ПУИ + * @details Параметры по умолчанию приведены в @ref UPP_PARAMS_DEFAULT + * @note Защиты №X приведены в @ref UPP_ErrorType_t + */ +typedef struct { + uint16_t Pusk; /** @brief Адрес 100: Пуск УПП + @details 0 – Остановка и сброс ошибок УПП, 1 – Запуск УПП */ +} UPP_PUI_Control_t; /** //UPP_HIGHLEVEL * @} */ diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c index 4bcc300..7d539d6 100644 --- a/UPP/Core/PowerMonitor/power_monitor.c +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -107,8 +107,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm) ADC_UpdateTemperatures(&hpm->adc); float t1 = hpm->adc.Data[ADC_CHANNEL_TEMP1]; float t2 = hpm->adc.Data[ADC_CHANNEL_TEMP2]; - meas->final.T[TEMP_RAD] = Filter_Process(&hpm->avg[AVG_TEMP1], t1); - meas->final.T[TEMP_SHKAF] = Filter_Process(&hpm->avg[AVG_TEMP2], t2); + meas->final.T[TEMP_SHKAF] = Filter_Process(&hpm->avg[AVG_TEMP1], t1); + meas->final.T[TEMP_RAD] = Filter_Process(&hpm->avg[AVG_TEMP2], t2); /* Расчет третьей фазы */ meas->slow.U[U_BC] = U_BC_calc(meas->slow.U[U_AB], meas->slow.U[U_CA]); diff --git a/UPP/Core/Src/gpio.c b/UPP/Core/Src/gpio.c index 99df2bd..7a5e077 100644 --- a/UPP/Core/Src/gpio.c +++ b/UPP/Core/Src/gpio.c @@ -134,11 +134,17 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(ERR_5VSI_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pins : PDPin PDPin PDPin */ - GPIO_InitStruct.Pin = DIN3_Pin|ERR_24VDIO_Pin|DIN2_Pin; + /*Configure GPIO pins : PDPin PDPin */ + GPIO_InitStruct.Pin = DIN3_Pin|DIN2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = ERR_24VDIO_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + HAL_GPIO_Init(ERR_24VDIO_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = ERR_24V_Pin; diff --git a/UPP/Core/UPP/upp_errors.c b/UPP/Core/UPP/upp_errors.c index 2f68376..9ce030e 100644 --- a/UPP/Core/UPP/upp_errors.c +++ b/UPP/Core/UPP/upp_errors.c @@ -57,8 +57,12 @@ void UPP_Errors_Program(void) void UPP_Errors_Power(void) { - static int error_latch_ticks = 0; - int error_latch_timeout = 5000; + /* Счетчики для отсчитывания задержки выставления ошибки */ + static int Power_DIO_24VCnt = 0; + static int Power_24VCnt = 0; + static int Power_Digit_5VCnt = 0; + static int Power_SCI_5VCnt = 0; + static int Power_Analog_5VCnt = 0; /* Считывание неисправностей источников питания */ int err_24Vdio = GPIO_Read_Switch(&UPP_DIN.err_24Vdio); @@ -67,11 +71,32 @@ void UPP_Errors_Power(void) int err_5Vsi = GPIO_Read_Switch(&UPP_DIN.err_5Vsi); int err_Va = GPIO_Read_Switch(&UPP_DIN.err_Va); - ERR_PUI->Power_DIO_24V = err_24Vdio; - ERR_PUI->Power_24V = err_24V; - ERR_PUI->Power_Digit_5V = err_5Vd; - ERR_PUI->Power_SCI_5V = err_5Vsi; - ERR_PUI->Power_Analog_5V = err_Va; + ERR_PUI->Power_DIO_24V = setError(err_24Vdio, + ERR_PUI->Power_DIO_24V, + &Power_DIO_24VCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_POWERBOARDS)); + ERR_PUI->Power_24V = setError(err_24V, + ERR_PUI->Power_24V, + &Power_24VCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_POWERBOARDS)); + ERR_PUI->Power_Digit_5V = setError(err_5Vd, + ERR_PUI->Power_Digit_5V, + &Power_Digit_5VCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_POWERBOARDS)); + ERR_PUI->Power_SCI_5V = setError(err_5Vsi, + ERR_PUI->Power_SCI_5V, + &Power_SCI_5VCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_POWERBOARDS)); + ERR_PUI->Power_Analog_5V = setError(err_Va, + ERR_PUI->Power_Analog_5V, + &Power_Analog_5VCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_POWERBOARDS)); + +// ERR_PUI->Power_DIO_24V = err_24Vdio; +// ERR_PUI->Power_24V = err_24V; +// ERR_PUI->Power_Digit_5V = err_5Vd; +// ERR_PUI->Power_SCI_5V = err_5Vsi; +// ERR_PUI->Power_Analog_5V = err_Va; } void UPP_Errors_Ranges(void) @@ -182,17 +207,21 @@ void UPP_Errors_Other(void) static int InterlaceCnt = 0; #ifndef UPP_DISABLE_PROTECT_LONGSTART + /* Долгий пуск */ if(ERR_PRIVATE->longstart) ERR_PUI->LongStart = 1; else ERR_PUI->LongStart = 0; #endif - ERR_PUI->Interlace = setError(ERR_PRIVATE->interlance, - ERR_PUI->Interlace, - &InterlaceCnt, - MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); - //Interlance + /* Неправильный порядок чередования фаз */ + if(upp.PUI.params->Interlace) + { + ERR_PUI->Interlace = setError(ERR_PRIVATE->interlance, + ERR_PUI->Interlace, + &InterlaceCnt, + MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); + } } static UPP_ErrorType_t UPP_SelectCommonError(void) diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index e59841b..0db25b3 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -16,6 +16,7 @@ #include "tim.h" #include "iwdg.h" +int hardware_init_done = 0; UPP_t upp; RS_HandleTypeDef hmodbus_pui; HAL_StatusTypeDef res; // сюда сохраняется результат от выполения всяких функций @@ -34,8 +35,9 @@ int UPP_App_Init(void) BenchTime_Init(); // Подключение указателей upp.errors = &errors; + upp.PUI.control = &MB_DATA.HoldRegs.pui_control; upp.PUI.params = &MB_DATA.HoldRegs.pui_params; - upp.PUI.values = &MB_DATA.InRegs.pui; + upp.PUI.values = &MB_DATA.InRegs.pui_values; upp.call = &MB_INTERNAL.FuncCalls; #ifdef UPP_SET_DEFAULT @@ -97,6 +99,7 @@ int UPP_PreWhile(void) UPP_DO.CEN(ENABLE); + hardware_init_done = 1; return 0; } @@ -163,28 +166,25 @@ int UPP_While(void) UPP_Errors_Handle(); // Контроль парамеров UPP_Params_Control(); + // Определение режима работы УПП + UPP_Status_Handler_SlowCalc(); - - // Сброс на дефолтные по запросу - if(upp.call->set_default_pui || upp.call->set_default_internal) + + // Если КВИТИРОВАНИЕ - переходим в Init, где сбрасываем ошибки + if(upp.call->kvitir) { - UPP_Params_SetDefault(upp.call->set_default_pui, upp.call->set_default_internal); - upp.call->set_default_pui = 0; - upp.call->set_default_internal = 0; + upp.call->kvitir = 0; + upp.call->error_stop = 0; + upp.workmode = UPP_Init; } - -#ifndef UPP_DISABLE_ERROR_BLOCK - // если ошибка вызываем СТОП - upp.call->stop = (errors.common != Err_None); -#endif - // Если СТОП - переходим в ошибку - if (upp.call->stop) + else if (upp.call->error_stop) { Angle_PID_Reset(&upp.hangle); upp.workmode = UPP_Error; } - + + // Автомат состояний УПП switch(upp.workmode) { @@ -278,9 +278,9 @@ int UPP_While(void) UPP_DO.Ready(DISABLE); UPP_DO.Work(DISABLE); UPP_DO.Error(ENABLE); - // Находимся до тех пор пока ошибки не будет устранена - if(errors.common == Err_None) - upp.workmode = UPP_Init; +// // Находимся до тех пор пока ошибки не будет устранена +// if(errors.common == Err_None) +// upp.workmode = UPP_Init; retval = 1; break; @@ -303,11 +303,11 @@ int UPP_While(void) */ void UPP_Tick(void) { - // Начинаем все проверять только после того как уйдем из режима инициализации - if(upp.workmode == UPP_Init) + // Начинаем все проверять только после того как инициализируем железо + if(hardware_init_done == 0) return; - UPP_Status_Handler(); + UPP_Status_Handler_IRQ(); } diff --git a/UPP/Core/UPP/upp_main.h b/UPP/Core/UPP/upp_main.h index 112354d..e204971 100644 --- a/UPP/Core/UPP/upp_main.h +++ b/UPP/Core/UPP/upp_main.h @@ -31,6 +31,7 @@ typedef struct { UPP_PUI_Params_t *params; ///< Параметры от ПУИ UPP_PUI_Values_t *values; ///< Данные для ПУИ + UPP_PUI_Control_t *control; ///< Управление от ПУИ } PUI; ///< Общение с ПУИ diff --git a/UPP/Core/UPP/upp_params.h b/UPP/Core/UPP/upp_params.h index df58690..938bb0e 100644 --- a/UPP/Core/UPP/upp_params.h +++ b/UPP/Core/UPP/upp_params.h @@ -17,12 +17,13 @@ typedef struct { unsigned go:1; ///< Запустить УПП - unsigned stop:1; ///< Остановка УПП (авария) + unsigned error_stop:1; ///< Остановка УПП (авария) + unsigned kvitir:1; ///< Квитирование ошибок unsigned set_default_pui:1; ///< Выставить настройки ПУИ в дефолтные unsigned set_default_internal:1;///< Выставить внутренние настройки в дефолтные - unsigned reserved:11; + unsigned reserved:10; unsigned reset_mcu:1; }UPP_FuncCalls_t; @@ -47,6 +48,7 @@ typedef struct typedef struct { UPP_ParamsNominal_t nominal; + uint16_t reserved[1]; /* Параметры Температур */ struct @@ -81,7 +83,7 @@ typedef struct uint16_t PhaseMask; ///< Адрес 1050: Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c uint16_t Frequency; ///< Адрес 1051: Частота ШИМ для пачки импульсов на тиристоры [Герцы] uint16_t Duty; ///< Адрес 1052: Скважность ШИМ для пачки импульсов на тиристоры [Проценты] - uint16_t PulseLength; ///< Адрес 1053: Количесво импульсов в пачке [Количество] + uint16_t PulseLength; ///< Адрес 1053: Длина пачки импульсов [0..1 x 65535 от 180 градусов] uint16_t reserved[6]; }pwm; diff --git a/UPP/Core/UPP/upp_status.c b/UPP/Core/UPP/upp_status.c index 8283f2c..de1f051 100644 --- a/UPP/Core/UPP/upp_status.c +++ b/UPP/Core/UPP/upp_status.c @@ -8,40 +8,93 @@ #include "upp_main.h" // всё остальное по работе с УПП #include "upp_status.h" int cnt_oscil_size = 100; -void UPP_Status_Handler(void) + +void UPP_Status_Handler_SlowCalc(void) +{ + static int pui_pusk_prev = 0; + static int can_kvitir_prev = 0; + int pui_pusk = upp.PUI.control->Pusk; + int disc_pusk = GPIO_Read_Switch(&UPP_DIN.Pusk); + int mest = GPIO_Read_Switch(&UPP_DIN.MestDist); + int can_kvitir = 0; + + + if(mest) // Если МЕСТНОЕ - управляем от ПУИ + { + upp.call->go = pui_pusk; + // Если пришел СТОП от ПУИ - дополнительно квитируем ошибки + if(!pui_pusk && pui_pusk_prev) + { + upp.call->kvitir = 1; + } + } + else // Если ДИСТАНЦИОННОЕ - управляем от ПУИ + { + upp.call->go = disc_pusk; + upp.call->kvitir = can_kvitir; + if(can_kvitir && !can_kvitir_prev) + { + upp.call->kvitir = 1; + } + } + + + + + + + + // Сброс на дефолтные по запросу + if(upp.call->set_default_pui || upp.call->set_default_internal) + { + UPP_Params_SetDefault(upp.call->set_default_pui, upp.call->set_default_internal); + upp.call->set_default_pui = 0; + upp.call->set_default_internal = 0; + } + +#ifndef UPP_DISABLE_ERROR_BLOCK + // если ошибка вызываем СТОП + upp.call->error_stop = (errors.common != Err_None); +#endif + + + +} + +void UPP_Status_Handler_IRQ(void) { /* Хендлы для отладочных светодиодов (если выбран режим моргания) */ GPIO_LED_Dynamic_Handle(&UPP_LEDS.green1); GPIO_LED_Dynamic_Handle(&UPP_LEDS.green2); GPIO_LED_Dynamic_Handle(&UPP_LEDS.red); - MB_DATA.InRegs.pui.Error = upp.errors->common; - MB_DATA.InRegs.pui.WorkMode = upp.workmode; + upp.PUI.values->Error = upp.errors->common; + upp.PUI.values->Status.bit.Workmode = upp.workmode; + upp.PUI.values->Status.bit.NoConnectionLSU = 0; //todo + upp.PUI.values->Status.bit.NoInputVoltage = !upp.pm.f.isU; + upp.PUI.values->Status.bit.CurrentLimited = upp.hangle.f.CurrentLimited; + upp.PUI.values->Status.bit.OverVoltage = upp.errors->pui.err.OverVoltage; + upp.PUI.values->Status.bit.UnderVoltage = upp.errors->pui.err.UnderVoltage; - MB_DATA.InRegs.pui.Uall = upp.pm.measured.final.Uamp * MB_INTERNAL.param.nominal.U; - MB_DATA.InRegs.pui.Uab = upp.pm.measured.final.U[U_AB] * MB_INTERNAL.param.nominal.U; - MB_DATA.InRegs.pui.Ubc = upp.pm.measured.final.U[U_BC] * MB_INTERNAL.param.nominal.U; - MB_DATA.InRegs.pui.Uca = upp.pm.measured.final.U[U_CA] * MB_INTERNAL.param.nominal.U; + + upp.PUI.values->Uall = upp.pm.measured.final.Uamp * MB_INTERNAL.param.nominal.U / 10; + upp.PUI.values->Uab = upp.pm.measured.final.U[U_AB] * MB_INTERNAL.param.nominal.U / 10; + upp.PUI.values->Ubc = upp.pm.measured.final.U[U_BC] * MB_INTERNAL.param.nominal.U / 10; + upp.PUI.values->Uca = upp.pm.measured.final.U[U_CA] * MB_INTERNAL.param.nominal.U / 10; - MB_DATA.InRegs.pui.Iall = upp.pm.measured.final.Iamp * MB_INTERNAL.param.nominal.I; - MB_DATA.InRegs.pui.Ia = upp.pm.measured.final.I[I_A] * MB_INTERNAL.param.nominal.I; - MB_DATA.InRegs.pui.Ib = upp.pm.measured.final.I[I_B] * MB_INTERNAL.param.nominal.I; - MB_DATA.InRegs.pui.Ic = upp.pm.measured.final.I[I_C] * MB_INTERNAL.param.nominal.I; + upp.PUI.values->Iall = upp.pm.measured.final.Iamp * MB_INTERNAL.param.nominal.I; + upp.PUI.values->Ia = upp.pm.measured.final.I[I_A] * MB_INTERNAL.param.nominal.I; + upp.PUI.values->Ib = upp.pm.measured.final.I[I_B] * MB_INTERNAL.param.nominal.I; + upp.PUI.values->Ic = upp.pm.measured.final.I[I_C] * MB_INTERNAL.param.nominal.I; - MB_DATA.InRegs.pui.Fall = upp.pm.measured.final.Fmean * 10; - MB_DATA.InRegs.pui.Fab = upp.pm.measured.final.F[U_AB] * 10; - MB_DATA.InRegs.pui.Fbc = upp.pm.measured.final.F[U_BC] * 10; - MB_DATA.InRegs.pui.Fca = upp.pm.measured.final.F[U_CA] * 10; + upp.PUI.values->Fall = upp.pm.measured.final.Fmean * 10; + upp.PUI.values->Fab = upp.pm.measured.final.F[U_AB] * 10; + upp.PUI.values->Fbc = upp.pm.measured.final.F[U_BC] * 10; + upp.PUI.values->Fca = upp.pm.measured.final.F[U_CA] * 10; - MB_DATA.InRegs.pui.Trad = upp.pm.measured.final.T[TEMP_RAD] * 10; - MB_DATA.InRegs.pui.Tshkaf = upp.pm.measured.final.T[TEMP_SHKAF] * 10; - - MB_DATA.InRegs.pui.Warnings.warn.NoConnectionPCH = 0; //todo - MB_DATA.InRegs.pui.Warnings.warn.NoInputVoltage = !upp.pm.f.isU; - MB_DATA.InRegs.pui.Warnings.warn.CurrentLimited = upp.hangle.f.CurrentLimited; - MB_DATA.InRegs.pui.Warnings.warn.OverVoltage = !upp.errors->pui.err.OverVoltage; - MB_DATA.InRegs.pui.Warnings.warn.UnderVoltage = !upp.errors->pui.err.UnderVoltage; + upp.PUI.values->Trad = upp.pm.measured.final.T[TEMP_RAD] * 10; + upp.PUI.values->Tshkaf = upp.pm.measured.final.T[TEMP_SHKAF] * 10; static int mb_u_cnt = 0; @@ -69,13 +122,4 @@ void UPP_Status_Handler(void) cnt_oscil = 0; } - - if(GPIO_Read_Switch(&UPP_DIN.Pusk)) - { - upp.call->go = 1; - } - else - { - upp.call->go = 0; - } } \ No newline at end of file diff --git a/UPP/Core/UPP/upp_status.h b/UPP/Core/UPP/upp_status.h index b7f21ed..2396146 100644 --- a/UPP/Core/UPP/upp_status.h +++ b/UPP/Core/UPP/upp_status.h @@ -10,5 +10,6 @@ #define _UPP_STATUS_H #include "main.h" // общие библиотеки, конфигурации и вербальные имена из CubeMX -void UPP_Status_Handler(void); +void UPP_Status_Handler_SlowCalc(void); +void UPP_Status_Handler_IRQ(void); #endif //_UPP_STATUS_H \ No newline at end of file diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx index 0090099..bb70ab3 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -165,6 +165,22 @@ \\UPP\../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c\351 + + 1 + 0 + 183 + 1 +
134280762
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\Core\UPP\upp_main.c + + \\UPP\../Core/UPP/upp_main.c\183 +
@@ -247,6 +263,26 @@ 1 dbg_polarity + + 16 + 1 + MB_DATA,0x0A + + + 17 + 1 + MB_INTERNAL,0x0A + + + 18 + 1 + &MB_INTERNAL.FuncCalls + + + 19 + 1 + pCoils + @@ -317,40 +353,35 @@ 13 2 - MB_DATA.InRegs.pui + upp.errors->pui.err 14 2 - upp.errors->pui.err + MB_INTERNAL.param.nominal.U,0x0A 15 2 - MB_INTERNAL.param.nominal.U,0x0A + MB_INTERNAL.param,0x0A 16 2 - MB_INTERNAL.param,0x0A + upp.hangle,0x0A 17 2 - upp.hangle,0x0A + MB_INTERNAL.oscil.data,0x0A 18 2 - MB_INTERNAL.oscil.data,0x0A - - - 19 - 2 hmodbus1 - 20 + 19 2 cnt_oscil_size,0x0A @@ -402,6 +433,10 @@ System Viewer\ADC3 35905 + + System Viewer\GPIOD + 35903 + System Viewer\TIM1 35904 @@ -1088,7 +1123,7 @@ Application/User/Core - 0 + 1 0 0 0 diff --git a/UPP/UPP.ioc b/UPP/UPP.ioc index 4e903e3..93cd83d 100644 --- a/UPP/UPP.ioc +++ b/UPP/UPP.ioc @@ -294,16 +294,18 @@ PC8.Signal=S_TIM8_CH3 PC9.GPIOParameters=GPIO_Label PC9.GPIO_Label=PWM6 PC9.Signal=S_TIM8_CH4 -PD2.GPIOParameters=GPIO_Label +PD2.GPIOParameters=GPIO_PuPd,GPIO_Label PD2.GPIO_Label=DIN3 +PD2.GPIO_PuPd=GPIO_PULLUP PD2.Locked=true PD2.Signal=GPIO_Input PD3.GPIOParameters=GPIO_Label PD3.GPIO_Label=ERR_24VDIO PD3.Locked=true PD3.Signal=GPIO_Input -PD6.GPIOParameters=GPIO_Label +PD6.GPIOParameters=GPIO_PuPd,GPIO_Label PD6.GPIO_Label=DIN2 +PD6.GPIO_PuPd=GPIO_PULLUP PD6.Locked=true PD6.Signal=GPIO_Input PE0.GPIOParameters=PinState,GPIO_Label diff --git a/Информация для программиста (УПП СП СЭД)/Modbus Карта.docx b/Информация для программиста (УПП СП СЭД)/Modbus Карта.docx index d798307ee45265c2d03f66b329184af15c01c90d..d4a66443839a1256c9504ed81604f034015ccd68 100644 GIT binary patch delta 7179 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 delta 5976 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 z + + + + 96 + + 1000 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 16 + 10 + + 1330 + 380 + 900 + 900 + 1210 + 900 + 900 + 900 + 900 + 900 + 900 + 900 + 900 + 900 + 900 + 900 + + + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + + 0 + 0 + 3 + 6 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Type log name here + + + + 1 + 1 + 1000 + 0 + 1 + 1 + 1 + Type log name here + + + 3 +
1000
+ 80 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 3 + 0 + 216 + 14 + 88 + 2 + 232 + 3 + 136 + 19 + 232 + 3 + 232 + 3 + 30 + 0 + 0 + 0 + 90 + 0 + 90 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 255 + 56 + 255 + 56 + 123 + 2 + 123 + 2 + 69 + 7 + 69 + 7 + 69 + 7 + 69 + 7 + 69 + 7 + 69 + 7 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 52 + 2 + 40 + 0 + 66 + 8 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 7 + 0 + 128 + 62 + 16 + 0 + 27 + 199 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 10 + 0 + 200 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 27 + 199 + 227 + 56 + 25 + 0 + 226 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + Послед. фаз + + + + + + Кол-во фаз + + + + + + Номинал U, Вx10 + + + + + + Отклонение U+, %x100 + + + + + + Отклонение U-, %x100 + + + + + + Номинал F, Гцx100 + + + + + + Отклонение F+, %x100 + + + + + + Отклонение F-, %x100 + + + + + + Номинал I, Аx10 + + + + + + Темпер. предупр. + + + + + + Темпер. авария + + + + + + АЦП макс. Uab, Вх10 + + + + + + АЦП макс. Uca, Вх10 + + + + + + АЦП макс. Ic, Ах10 + + + + + + АЦП макс. Ia, Ах10 + + + + + + АЦП ур. нуля Uab + + + + + + АЦП ур. нуля Uca + + + + + + АЦП ур. нуля Ic + + + + + + АЦП ур. нуля Ia + + + + + + АЦП ур. нуля Trad + + + + + + АЦП ур. нуля Tshkaf + + + + + + Ампл. Imax, % от Inom + + + + + + rms_window_size + + + + + + rms_exp_alpha + + + + + + ШИМ PhaseMask + + + + + + ШИМ Частота, Гц + + + + + + ШИМ Скважность, % + + + + + + ШИМ Длина пачки + + + + + + Угол Макс. 0..1 + + + + + + Угол Мин. 0..1 + + + + + + ПИД Kp, x10 000 + + + + + + ПИД Ki, x10 000 + + + + + + ПИД Kd, x10 000 + + + + + + + +
+
diff --git a/Информация для программиста (УПП СП СЭД)/Modbus/Вызов функций.mbp b/Информация для программиста (УПП СП СЭД)/Modbus/Вызов функций.mbp new file mode 100644 index 0000000..98cda53 --- /dev/null +++ b/Информация для программиста (УПП СП СЭД)/Modbus/Вызов функций.mbp @@ -0,0 +1,138 @@ + + + + + 96 + + 1000 + 1 + 1 + 0 + 0 + 4 + 0 + 0 + 0 + 2 + 16 + + 900 + 900 + + + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + + 0 + 0 + 9 + 2 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Type log name here + + + + 1 + 1 + 1000 + 0 + 1 + 1 + 1 + Type log name here + + + 1 +
1000
+ 16 + 0 + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + Go + + + + + + Stop + + + + + + Kvitir + + + + + + Set default PUI + + + + + + Set Default Internal + + + + + + Reset MCU + + + + +
+
diff --git a/Информация для программиста (УПП СП СЭД)/Modbus/Значения для ПУИ.mbp b/Информация для программиста (УПП СП СЭД)/Modbus/Значения для ПУИ.mbp new file mode 100644 index 0000000..54ff48d --- /dev/null +++ b/Информация для программиста (УПП СП СЭД)/Modbus/Значения для ПУИ.mbp @@ -0,0 +1,277 @@ + + + + + 96 + + 100 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + 10 + + 950 + 1120 + 900 + 900 + + + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + + 0 + 0 + 1 + 1 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Type log name here + + + + 1 + 1 + 1000 + 0 + 1 + 1 + 1 + Type log name here + + + 4 +
0
+ 19 + 0 + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 10 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 213 + 0 + 198 + 0 + + + + + + Текущая авария + + + + + + Состояние УПП + + + + + + U, В + + + + + + Uab, В + + + + + + Ubc, В + + + + + + Uca, В + + + + + + I, А x10 + + + + + + Ia, А x10 + + + + + + Ib, А x10 + + + + + + Ic, А x10 + + + + + + F, Гц x10 + + + + + + Fab, Гц x10 + + + + + + Fbc, Гц x10 + + + + + + Fca, Гц x10 + + + + + + Tрад, °С x10 + + + + + + Tвнутр, °С x10 + + + + + + + + + Режим работы + Режим работы + Нет связи с ЛСУ + Нет входной сети + Токоограничение + Повышенное напряжеине + Пониежнное напряжение + + + + + + + + + + + + Режим работы + Режим работы + Нет связи с ЛСУ + Нет входной сети + Токоограничение + Повышенное напряжеине + Пониженное напряжение + + + + + + + + + + + +
+
diff --git a/Информация для программиста (УПП СП СЭД)/Modbus/Настройки ПУИ.mbp b/Информация для программиста (УПП СП СЭД)/Modbus/Настройки ПУИ.mbp new file mode 100644 index 0000000..d0d91de --- /dev/null +++ b/Информация для программиста (УПП СП СЭД)/Modbus/Настройки ПУИ.mbp @@ -0,0 +1,169 @@ + + + + + 96 + + 1000 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 10 + + 900 + 900 + + + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + 200 + + 0 + 0 + 6 + 2 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Type log name here + + + + 1 + 1 + 1000 + 0 + 1 + 1 + 1 + Type log name here + + + 3 +
0
+ 10 + 0 + + + + + + + + + + + + + + 44 + 1 + 136 + 19 + 80 + 0 + 120 + 0 + 24 + 0 + 7 + 0 + 136 + 19 + 30 + 0 + 1 + 0 + 0 + 0 + + + + + + Iref, % + + + + + + Тнт, мс + + + + + + Umin, % + + + + + + Umax, % + + + + + + Imax, % от 50 А + + + + + + Imin, % + + + + + + TiMax, мкс + + + + + + Tdelay, с + + + + + + Interlance + + + + + + + +
+
diff --git a/Информация для программиста (УПП СП СЭД)/Modbus/Управление от ПУИ.mbp b/Информация для программиста (УПП СП СЭД)/Modbus/Управление от ПУИ.mbp new file mode 100644 index 0000000..00cf497 --- /dev/null +++ b/Информация для программиста (УПП СП СЭД)/Modbus/Управление от ПУИ.mbp @@ -0,0 +1,78 @@ + + + + + 96 + + 1000 + 1 + 1 + 0 + 0 + 4 + 0 + 0 + 0 + 2 + 1 + + 900 + 900 + + + 200 + + 0 + 0 + 1 + 2 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Type log name here + + + + 1 + 1 + 1000 + 0 + 1 + 1 + 1 + Type log name here + + + 3 +
100
+ 1 + 0 + + + + + 1 + 0 + + + + + + +
+