PDA

Просмотр полной версии : Проблема с таймерами на ПЛК 110М2



Seyran
20.01.2021, 07:36
на производстве 12 машин работают на ПЛК110М2, на всех них одна и та же программа. Проблема такая, есть подпрограммы которые по коду операции пришедшему по Modbus запускают некий агрегат по таймеру, код выглядит примерно так:



PROGRAM dododo
VAR
TON_KnL: TON;
KnlElasp:BOOL;
END_VAR

TON_KnL(IN := TRUE, PT := DINT_TO_TIME(TRUNC(UST_Time * 1000)), Q=>KnlElasp);
IF(KnlElasp) THEN
TON_KnL(IN := FALSE);
UST_Time := 0;
END_IF;


работает какое то время, но периодически появляется то на одной машине, то на другой машине пропуск операции. Входит в подпрограмму, запускает таймер и он сразу отрабатывает. Сделал принудительный сброс первой итерации с принудительным перезапуском таймера, так:



PROGRAM dododo
VAR
TON_KnL: TON;
KnlElasp:BOOL;
inInd:BOOL := TRUE;
END_VAR


IF(inInd) THEN
TON_KnL(IN := FALSE);
inInd :=FALSE;
ELSE
TON_KnL(IN := TRUE, PT := DINT_TO_TIME(TRUNC(UST_Time * 1000)), Q=>KnlElasp);
IF(KnlElasp) THEN
TON_KnL(IN := FALSE);
inInd :=TRUE;
UST_Time := 0;
END_IF;
END_IF;


стало лучше, но пропуски хоть и реже, но продолжают появляться. Может кто то сталкивался с данной проблемой, либо знает как полечить.

Seyran
20.01.2021, 08:10
я просто привел пример того как инициализируются и запускаются таймеры, упрощу код, но сути это не поменяет



PROGRAM dododo
VAR
TON_KnL: TON;
KnlElasp:BOOL;
inInd:BOOL := TRUE;
END_VAR


IF(inInd) THEN
TON_KnL(IN := FALSE);
inInd :=FALSE;
ELSE
TON_KnL(IN := TRUE, PT := t#60s, Q=>KnlElasp);
IF (NOT Motor) Motor:=TRUE; (*вот тут запустили агрегат*)
IF(KnlElasp) THEN
Motor:=FALSE; (* а тут по истечении работы таймера его остановили*)
TON_KnL(IN := FALSE);
inInd :=TRUE;
END_IF;
END_IF;

Sergey666
20.01.2021, 08:31
я просто привел пример того как инициализируются и запускаются таймеры, упрощу код, но сути это не поменяет



PROGRAM dododo
VAR
TON_KnL: TON;
KnlElasp:BOOL;
inInd:BOOL := TRUE;
END_VAR


IF(inInd) THEN
TON_KnL(IN := FALSE);
inInd :=FALSE;
ELSE
TON_KnL(IN := TRUE, PT := t#60s, Q=>KnlElasp);
IF (NOT Motor) Motor:=TRUE; (*вот тут запустили агрегат*)
IF(KnlElasp) THEN
Motor:=FALSE; (* а тут по истечении работы таймера его остановили*)
TON_KnL(IN := FALSE);
inInd :=TRUE;
END_IF;
END_IF;


Motor почти всегда будет True, за исключением цикла в котором таймер отработает, а практически всегда будет включен... нафига такое писать? Как еще это dododo вызывается...это случайно не какая-нибудь вытяжка в DoDo Pizza?

Sulfur
20.01.2021, 08:41
Seyran
Я в своих проектах все таймеры всегда объявляю глобально.

Seyran
20.01.2021, 09:27
это не основная программа, это программа которая вызывается по коду операции из основного цикла, а в момент когда мотор отключается, глобальный код операции сбрасывается и программа больше сюда не заходит пока не придет опять код данной операции. Уважаемые, Вы по моему не туда внимание свое направили. Вопрос заключается в том что иногда, не понятно по каким причинам, когда приходит нужный код операции и выполнение переходит в подобную подпрограмму таймер не тикает как указанно 60 секунд, а сразу говорит что все, и KnlElasp выставляется в TRUE. Это происходит не постоянно, а очень редко и на разных контроллерах. Но из за того что машин 12, техслужба периодически фиксирует отклонения по операциям. В ближайшем будущем надо переводить на ПЛК оставшиеся машины, и их уже будет 38, но с такой проблемой я пока не могу пойти на модернизацию остальных машин.

Sergey666
20.01.2021, 09:49
это не основная программа, это программа которая вызывается по коду операции из основного цикла, а в момент когда мотор отключается, глобальный код операции сбрасывается и программа больше сюда не заходит пока не придет опять код данной операции. Уважаемые, Вы по моему не туда внимание свое направили. Вопрос заключается в том что иногда, не понятно по каким причинам, когда приходит нужный код операции и выполнение переходит в подобную подпрограмму таймер не тикает как указанно 60 секунд, а сразу говорит что все, и KnlElasp выставляется в TRUE. Это происходит не постоянно, а очень редко и на разных контроллерах. Но из за того что машин 12, техслужба периодически фиксирует отклонения по операциям. В ближайшем будущем надо переводить на ПЛК оставшиеся машины, и их уже будет 38, но с такой проблемой я пока не могу пойти на модернизацию остальных машин.

Уважаемый, это вас надо спрашивать как вы организовали вызов подпрограммы и зачем вы оформили подпрограмму в виде программы если есть Action и как так у вас таймер не всегда сбрасывается (наверное надо сброс таймера делать перед вызовом подпрограммы) и в каком колледже вы воспитывались.

Sergey666
20.01.2021, 09:55
Seyran
Я в своих проектах все таймеры всегда объявляю глобально.

Очень жаль, что в учебных заведениях нет физических наказаний в виде порки розгами...

Seyran
20.01.2021, 11:47
capzap, вот за это спасибо, это попробую.


наверное надо сброс таймера делать перед вызовом подпрограммы
таймер не глобальный, сброс происходит и до запуска таймера и после того как он отработает

Sulfur
20.01.2021, 13:08
в виде порки розгами...
Таймер в подпрограмме локально, вызов подпрограммы по условию. Во время работы таймера в следующем цикле условие изменилось, вызова нет. Что будет с таймером?

Sergey666
20.01.2021, 13:17
Таймер в подпрограмме локально, вызов подпрограммы по условию. Во время работы таймера в следующем цикле условие изменилось, вызова нет. Что будет с таймером?

По хорошему программы должны работать в цикле Freewel, по условиям вызывать подпрограммы (Action), так работают надежные (вах четкие:) ), предсказуемые программы.
А то понапишуть кода с подвыподвертом, а потом- о-о-о чей-то оно как-то не так работает...ну типа иногдаааа и не всегда постоянно чета не так
Глобальный таймер это как пиво с утра- шаг в неизвестность.

И еще... если программа, подпрограмма вызвана по условию и она выполняет свою функцию более одного прогона, то сбрасывать флаг условия своего запуска должна она-же по выполнении своей задачи и со сбросом всех таймеров и прочего.

Seyran
20.01.2021, 15:18
таймер в данном случае вызывается при каждом проходе программы, и подвывертов в коде нет. Есть факт того что очень редко при каких то не выясненных обстоятельствах таймер дает сбой и говорит сразу о том что отработал, очень похоже на ситуацию когда таймер не сброшен, но при всех возможных выходов из программы есть сброс таймера. Action, это что то из Codesys 3.0 или я что то не понимаю, ибо перешел по нескольким ссылкам в поиске гугла по фразе "Codesys Action", все ведут к статьям по Codesys 3.0.

Sergey666
20.01.2021, 16:40
ПКМ на объекте "программы" и в контекстном меню - действие (Action).