а не может такого быть, что на старом плк была настроена фильтрация на входах, а на новом этого пока нет, поэтому и считает всякий мусор
Вид для печати
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-ю космическую скорость.
Чуете подвох?
Надо к счетчику дозировки добавлять разницу между актуальными данными аппаратного счетчика и его же данными с предыдущего цикла ПЛК. Причем учитывать переполнение аппаратного счетчика. При достижении максимального значение счетчик сам обнуляется и считает с нуля. Это и есть те неудобства, о которых я говорил выше.
в этом может быть проблема?
даже сейчас по всем 4 дозировкам , хотя я ничего не запускал и ничего не бежит , счетчики фигачат Вложение 84822
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?
Товарищи , какой то странный прикол, перезагружаю я ПЛК и из 4 дозировок только на 1 счетчике бегут показания сразу после перезагрузки.
Далее жму старт дозировки 170 счетчика и он работает нормально, то есть показания не бегут, жму стоп , все останавливается , жму старт снова все запускается и показания не бегут (но может все же вылететь после 15 раз так и опять побегут и поможет только перезагрузка)
на других 2х после перезагрузки не бегут сразу автоматом , но после того как жмешь старт начинают бежать и помогает только перезагрузка ПЛК
Как раз и получается что написали вы Валенок?
Вложение 84828 вот как раз после перезагрузки ПЛК видно что 3 счетчик сам включился автоматически и у него 1. Остальные по 0 , даже 170 после старта и стопа, а так до перезагрузки на 1 Единцу увеличивались после старта
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;