@page phase_break_error_flow Детектирование и передача ошибки обрыва фаз # Детектирование и передача ошибки обрыва фаз ## 1. Назначение Документ описывает полную связь от входов АЦП платы УМП до выставления признаков обрыва фаз в `modbus_table_mpu_out[125]` основного контроллера `BALZAM_167`. В текущей реализации обрыв определяется как сильный перекос действующих значений фаз. Отдельных независимых флагов для физических фаз A, B и C нет. Передаётся общий флаг `Wry` с маской `0x0004`. ## 2. Общая цепочка сигнала ```text Фазные напряжения | v АЦП peripheral-платы CONV02 -> channel 0 -> измеряемая фаза A CONV03 -> channel 1 -> измеряемая фаза C | v Current_count(0), Current_count(1) | +--> RMS A = lev_count[0] +--> RMS C = lev_count[1] +--> RMS B = lev_count[4], расчёт B = -(A + C) | v Выбор Max = max(RMS A, RMS B, RMS C) | v (Max - RMS проверяемой фазы) / Max > 0.30 AND Max > Curr_Edge | v Счётчик выдержки er_anal() | v error.bit.Wry = 1 (бит 2, маска 0x0004) | v sens_error[0] / sens_error[1] | v modbus[0] / modbus[1] | v Быстрый CAN-цикл peripheral-платы | v Unites[UMP1_CAN_DEVICE][0/1] или Unites[UMP2_CAN_DEVICE][0/1] | v BALZAM_167, update_abnormal.c | +--> mpu_out[125].bit6 — УМП1 +--> mpu_out[125].bit10 — УМП2 ``` ## 3. Связь входов АЦП с фазами Для режима УМП (`Desk == dsk_LOAD`) преобразования настроены в `Source/Internal/ADC.c`. | АЦП | Физический вход | Внутренний канал | Назначение | |---|---:|---:|---| | `CONV02` | `ADCINA5` | `0` | измеряемое напряжение фазы A | | `CONV03` | `ADCINA4` | `1` | измеряемое напряжение фазы C | | `CONV04` | `ADCINA7` | `2` | ток первого канала | | `CONV05` | `ADCINA2` | `3` | ток второго канала | В обработчике АЦП результаты `ADCRESULT2...ADCRESULT5` записываются в `adc_table_lem[0...3]`, после чего для каждого канала вызывается `Current_count(i)`. ## 4. Расчёт действующих значений Из отсчёта АЦП вычитается сохранённый нулевой уровень и применяется калибровочный коэффициент: ```c Current = (Numb - Zero_lev[chan]) * powK[chan]; ``` Действующее значение измеряемой фазы рассчитывается через экспоненциальное усреднение квадрата: ```c lev_quadr[chan] += ((Current * Current) - lev_quadr[chan]) / (1.0 * ADC_FREQ); lev_count[chan] = sqrt(lev_quadr[chan]); ``` Третья фаза непосредственно не измеряется. Она восстанавливается из условия нулевой суммы фаз: ```text A + B + C = 0 B = -(A + C) ``` В коде: ```c Numb = -Current - aCurrent; lev_quadr[thrd] += (Numb * Numb - lev_quadr[thrd]) / (1.0 * ADC_FREQ); lev_count[thrd] = sqrt(lev_quadr[thrd]); ``` Диагностические значения публикуются в следующих регистрах: | Регистр peripheral | Значение | |---:|---| | `0x68` | RMS фазы A | | `0x69` | RMS фазы C | | `0x6A` | расчётный RMS фазы B | | `0x6B` | RMS первого токового канала | | `0x6C` | RMS второго токового канала | | `0x6D` | расчётный RMS третьего тока | ## 5. Условие выставления `Wry` Для каждой пары выбирается максимальный уровень: ```c Max = max(lev_count[chan], lev_count[pair], lev_count[thrd]); ``` Ошибка набирается при выполнении обоих условий: ```text (Max - PhaseRms) / Max > 0.30 Max > Curr_Edge ``` Для УМП устанавливается: ```c Curr_Edge = 300; ``` Следовательно, флаг формируется, когда: 1. максимальная из трёх фаз больше `300`; 2. проверяемая фаза ниже максимальной более чем на 30%; 3. счётчик `er_anal()` достиг выдержки. Пример: ```text RMS A = 400 RMS B = 390 RMS C = 100 Max = 400 (400 - 100) / 400 = 0.75 0.75 > 0.30 -> условие обрыва/перекоса фазы C активно ``` Если все три уровня одновременно ниже `Curr_Edge`, `Wry` не выставляется. Полное пропадание напряжения должно определяться диагностикой низкого уровня `Out`, а не фазовым перекосом `Wry`. ## 6. Выдержка времени Частота обработки: ```c #define ADC_FREQ 3750 ``` Порог счётчика: ```c time_3sec = 3 * ADC_FREQ; /* 11250 */ ``` Функция `er_anal()` увеличивает счётчик на каждом ошибочном отсчёте и уменьшает его на каждом нормальном отсчёте: ```c if (term) { if (*count >= edge) return 1; (*count)++; return 0; } if (*count == 0) return 0; (*count)--; return 0; ``` Для измеряемых фаз A и C номинальная выдержка составляет около 3 секунд. Расчётная фаза B проверяется при обработке обоих измеряемых каналов, поэтому её общий счётчик увеличивается дважды за цикл АЦП. Фактическая выдержка для B может составлять около 1,5 секунды. После запуска УМП диагностика блокируется на время `WAKE`: ```c WAKE_TIME = 10L * ADC_FREQ; ``` То есть первые 10 секунд после запуска `Wry` не формируется. ## 7. Формирование регистра ошибки peripheral-платы Структура регистра ошибки определена в `Source/Internal/Include/measure.h`: | Бит | Маска | Поле | Назначение | |---:|---:|---|---| | 0 | `0x0001` | `Tear` | крайнее значение АЦП/обрыв датчика | | 2 | `0x0004` | `Wry` | перекос или предполагаемый обрыв фазы | | 3 | `0x0008` | `Out` | низкий общий уровень | | 4 | `0x0010` | `Over` | превышение тока | | 5 | `0x0020` | `Hyper` | превышение напряжения | | 8 | `0x0100` | `Stop` | требование аварийного останова | | 9 | `0x0200` | `Ready` | готовность канала | | 14 | `0x4000` | `Ignor` | запрет локального останова | | 15 | `0x8000` | `Bypas` | полное исключение канала | После достижения выдержки выполняется: ```c error.bit.Wry = 1; if (!ignor) error.bit.Stop = 1; ``` Поведение управляющих признаков: | Состояние | `Wry` | `Stop` | Передача по CAN | |---|---:|---:|---:| | обычный канал | 1 | 1 | да | | `Ignor = 1` | 1 | 0 | да | | `Bypas = 1` | 0 | 0 | передаётся регистр без ошибки | | `WAKE != 0` | 0 | 0 | передаётся регистр без ошибки | Для УМП признаки напряжений находятся в регистрах ошибок: | Регистр | Содержит `Wry` при проблеме | |---:|---| | `modbus[0]` | измеряемая фаза A или расчётная фаза B | | `modbus[1]` | измеряемая фаза C или расчётная фаза B | В основном контроллере регистры `0` и `1` объединяются логическим ИЛИ, поэтому для индикации достаточно наличия маски `0x0004` в любом из них. ## 8. Передача по CAN `Init_packMask()` включает регистры ошибок УМП `0...3` в быстрый CAN-цикл. Главный цикл peripheral-платы вызывает: ```c CAN_send(0, modbus, address); ``` Один CAN-пакет содержит начальный адрес и три 16-битных регистра. Основной контроллер принимает пакет и записывает данные в массив: ```text Unites[номер устройства][адрес регистра] ``` Соответствие устройств: | Устройство | CAN-индекс основного контроллера | Регистры флага | |---|---:|---:| | УМП1 | `UMP1_CAN_DEVICE = 5` | `Unites[5][0]`, `Unites[5][1]` | | УМП2 | `UMP2_CAN_DEVICE = 6` | `Unites[6][0]`, `Unites[6][1]` | ## 9. Выставление `mpu_out[125]` Основной контроллер выполняет проверку в `BALZAM_167/Src/balzam_7/update_abnormal.c`. ### УМП1 ```c modbus_table_mpu_out[125].bit.bit6 = (Unites[UMP1_CAN_DEVICE][0] & 0x4) || (Unites[UMP1_CAN_DEVICE][1] & 0x4) ? 1 : 0; ``` ### УМП2 ```c modbus_table_mpu_out[125].bit.bit10 = (Unites[UMP2_CAN_DEVICE][0] & 0x4) || (Unites[UMP2_CAN_DEVICE][1] & 0x4) ? 1 : 0; ``` Оба признака разрешены только при следующем условии: ```c f.FittingScheme == 1 ``` Если выбрана другая схема, основной контроллер принудительно записывает ноль в `mpu_out[125].bit6` и `mpu_out[125].bit10` независимо от данных УМП. ## 10. Итоговая таблица связей | Физическое событие | Peripheral-регистр | Передаваемая маска | Приёмник | Выход MPU | |---|---:|---:|---|---| | перекос/обрыв A на УМП1 | `modbus[0]` | `0x0004` | `Unites[5][0]` | `mpu_out[125].bit6` | | расчётный перекос B на УМП1 | `modbus[0]` или `[1]` | `0x0004` | `Unites[5][0/1]` | `mpu_out[125].bit6` | | перекос/обрыв C на УМП1 | `modbus[1]` | `0x0004` | `Unites[5][1]` | `mpu_out[125].bit6` | | перекос/обрыв A на УМП2 | `modbus[0]` | `0x0004` | `Unites[6][0]` | `mpu_out[125].bit10` | | расчётный перекос B на УМП2 | `modbus[0]` или `[1]` | `0x0004` | `Unites[6][0/1]` | `mpu_out[125].bit10` | | перекос/обрыв C на УМП2 | `modbus[1]` | `0x0004` | `Unites[6][1]` | `mpu_out[125].bit10` | ## 11. Ограничения алгоритма 1. `Wry` означает как обрыв, так и сильный перекос более 30%; эти события не различаются. 2. Фаза B не измеряется непосредственно. Если при физическом обрыве B фазы A и C остаются нормальными, расчётная B также может выглядеть нормальной и ошибка не будет обнаружена. 3. Одновременное исчезновение всех фаз не создаёт `Wry`, потому что не выполняется условие `Max > 300`. 4. Из-за двойной проверки расчётной фазы B её выдержка короче выдержки A и C. 5. Выходные биты `mpu_out[125].bit6` и `bit10` не показывают конкретную фазу, а только общий факт фазового перекоса соответствующего УМП.