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 d798307..d4a6644 100644 Binary files a/Информация для программиста (УПП СП СЭД)/Modbus Карта.docx and b/Информация для программиста (УПП СП СЭД)/Modbus Карта.docx differ diff --git a/Информация для программиста (УПП СП СЭД)/Modbus/Внутренние настройки.mbp b/Информация для программиста (УПП СП СЭД)/Modbus/Внутренние настройки.mbp new file mode 100644 index 0000000..2ce14e3 --- /dev/null +++ b/Информация для программиста (УПП СП СЭД)/Modbus/Внутренние настройки.mbp @@ -0,0 +1,537 @@ + + + + + 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 + + + + + + +
+