Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
capzap
В проекте применен FastCounter на FDI, в этом режиме фильтрации нет.
1. Считываем показания аппаратного счетчикаWATER_ZAD_NR170 := wtmp_zad;
counter_copy := COUNTER_NR170_WATER;
IF O_CL_NR170_WATER THEN
WCOUNTER_ACTIVE_NR170 := TRUE;
wimpCount := wimpCount + counter_copy;
END_IF;
2. Счетчик дозировки := Счетчик дозировки + показания аппаратного счетчика
3. Повторяем до выхода на 3-ю космическую скорость.
Чуете подвох?
Надо к счетчику дозировки добавлять разницу между актуальными данными аппаратного счетчика и его же данными с предыдущего цикла ПЛК. Причем учитывать переполнение аппаратного счетчика. При достижении максимального значение счетчик сам обнуляется и считает с нуля. Это и есть те неудобства, о которых я говорил выше.
Последний раз редактировалось Sulfur; 15.07.2025 в 08:42.
в этом может быть проблема?
даже сейчас по всем 4 дозировкам , хотя я ничего не запускал и ничего не бежит , счетчики фигачат изображение_2025-07-15_125717759.png
Последний раз редактировалось atomo2; 15.07.2025 в 08:57.
atomo2
В теории да, если датчик расхода на механических контактах, например геркон. Дребезг есть даже у них. В любом случае, стоит убедиться в отсутствие изменений показаний аппаратного счетчика при отключенном датчике.
Далееcounter_copy := COUNTER_NR170_WATER;
wimpCount := wimpCount + counter_copy;
--
Происходит увеличение wimpCount на величину counter_copy в каждом цикле ПЛК.
COUNTER_NR170_WATER в проекте прикручен к аппаратному счетчику на FDI, он не сбрасывается.
Надо как-то так:
1. Однократно при запуске программы считать COUNTER_NR170_WATER в переменную например old_counter_copy,
2. При дозировке:
wimpCount := wimpCount + (COUNTER_NR170_WATER - old_counter_copy);
old_counter_copy:= COUNTER_NR170_WATER;
Останется только прикрутить контроль переполнения COUNTER_NR170_WATER.
---
В конфиге ПЛК при мониторинге смотрели показания счетчиков FDI?
Последний раз редактировалось Sulfur; 15.07.2025 в 09:18.
Товарищи , какой то странный прикол, перезагружаю я ПЛК и из 4 дозировок только на 1 счетчике бегут показания сразу после перезагрузки.
Далее жму старт дозировки 170 счетчика и он работает нормально, то есть показания не бегут, жму стоп , все останавливается , жму старт снова все запускается и показания не бегут (но может все же вылететь после 15 раз так и опять побегут и поможет только перезагрузка)
на других 2х после перезагрузки не бегут сразу автоматом , но после того как жмешь старт начинают бежать и помогает только перезагрузка ПЛК
Как раз и получается что написали вы Валенок?
изображение_2025-07-15_150428988.png вот как раз после перезагрузки ПЛК видно что 3 счетчик сам включился автоматически и у него 1. Остальные по 0 , даже 170 после старта и стопа, а так до перезагрузки на 1 Единцу увеличивались после старта
Последний раз редактировалось atomo2; 15.07.2025 в 11:07.
atomo2
Не столь важно первоначальное значение, сколь именно его прирост без работы внешних датчиков. Если прироста не наблюдается, значит с датчиками всё в порядке, следует искать ошибку в алгоритме подсчета\преобразования данных аппаратного счетчика в своей программе. Примерные пути уже обозначены.
Ну вроде как исправил, теперь просто так счетчик не бежит и при нажатии кнопки старт тоже.
Код:PROGRAM WODA_DOZIROVKA_NR170 VAR wtmp_zad : WORD; wimpCount : DWORD; wcur : INT; wprev : INT; startCounter : DWORD := 0; delta : DWORD := 0; wtimer : TIMERING; END_VAR wcur := WATER_FACT_NR170; wtimer( tme := t#120s, CUR := wcur, PREV := wprev, DOZ := WATER_DOZ_NR170, NORM_S := TRUE ); IF wtimer.TIME_OUT THEN WATER_DOZ_NR170 := FALSE; END_IF; IF WATER_START_NR170 AND (NOT WATER_DOZ_NR170) THEN startCounter := COUNTER_NR170_WATER; wimpCount := 0; WATER_DOZ_NR170 := TRUE; WATER_START_NR170 := FALSE; WATER_DONE_NR170 := FALSE; wtmp_zad := WATER_ZAD_NR170; wcur := 0; wprev := 0; END_IF; IF WATER_START_NR170 AND WATER_DOZ_NR170 THEN WATER_START_NR93_1 := FALSE; END_IF; IF WATER_DOZ_NR170 THEN WATER_ZAD_NR170 := wtmp_zad; IF O_CL_NR170_WATER THEN WCOUNTER_ACTIVE_NR170 := TRUE; ELSE WCOUNTER_ACTIVE_NR170 := FALSE; END_IF; delta := COUNTER_NR170_WATER - startCounter; wimpCount := delta; WATER_FACT_NR170 := DWORD_TO_WORD(wimpCount / 88); ELSE WCOUNTER_ACTIVE_NR170 := FALSE; WATER_FACT_NR170 := 0; END_IF; IF WATER_FACT_NR170 >= WATER_ZAD_NR170 THEN WATER_DOZ_NR170 := FALSE; WATER_DONE_NR170 := TRUE; END_IF; IF WATER_STOP_NR170 = TRUE THEN WATER_DOZ_NR170 := FALSE; WATER_DONE_NR170 := TRUE; WATER_STOP_NR170 := FALSE; END_IF; wprev := wcur;