Просмотр полной версии : Проблема с таймерами на ПЛК 110М2
на производстве 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;
стало лучше, но пропуски хоть и реже, но продолжают появляться. Может кто то сталкивался с данной проблемой, либо знает как полечить.
я просто привел пример того как инициализируются и запускаются таймеры, упрощу код, но сути это не поменяет
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?
Seyran
Я в своих проектах все таймеры всегда объявляю глобально.
это не основная программа, это программа которая вызывается по коду операции из основного цикла, а в момент когда мотор отключается, глобальный код операции сбрасывается и программа больше сюда не заходит пока не придет опять код данной операции. Уважаемые, Вы по моему не туда внимание свое направили. Вопрос заключается в том что иногда, не понятно по каким причинам, когда приходит нужный код операции и выполнение переходит в подобную подпрограмму таймер не тикает как указанно 60 секунд, а сразу говорит что все, и KnlElasp выставляется в TRUE. Это происходит не постоянно, а очень редко и на разных контроллерах. Но из за того что машин 12, техслужба периодически фиксирует отклонения по операциям. В ближайшем будущем надо переводить на ПЛК оставшиеся машины, и их уже будет 38, но с такой проблемой я пока не могу пойти на модернизацию остальных машин.
Sergey666
20.01.2021, 09:49
это не основная программа, это программа которая вызывается по коду операции из основного цикла, а в момент когда мотор отключается, глобальный код операции сбрасывается и программа больше сюда не заходит пока не придет опять код данной операции. Уважаемые, Вы по моему не туда внимание свое направили. Вопрос заключается в том что иногда, не понятно по каким причинам, когда приходит нужный код операции и выполнение переходит в подобную подпрограмму таймер не тикает как указанно 60 секунд, а сразу говорит что все, и KnlElasp выставляется в TRUE. Это происходит не постоянно, а очень редко и на разных контроллерах. Но из за того что машин 12, техслужба периодически фиксирует отклонения по операциям. В ближайшем будущем надо переводить на ПЛК оставшиеся машины, и их уже будет 38, но с такой проблемой я пока не могу пойти на модернизацию остальных машин.
Уважаемый, это вас надо спрашивать как вы организовали вызов подпрограммы и зачем вы оформили подпрограмму в виде программы если есть Action и как так у вас таймер не всегда сбрасывается (наверное надо сброс таймера делать перед вызовом подпрограммы) и в каком колледже вы воспитывались.
Sergey666
20.01.2021, 09:55
Seyran
Я в своих проектах все таймеры всегда объявляю глобально.
Очень жаль, что в учебных заведениях нет физических наказаний в виде порки розгами...
capzap, вот за это спасибо, это попробую.
наверное надо сброс таймера делать перед вызовом подпрограммы
таймер не глобальный, сброс происходит и до запуска таймера и после того как он отработает
в виде порки розгами...
Таймер в подпрограмме локально, вызов подпрограммы по условию. Во время работы таймера в следующем цикле условие изменилось, вызова нет. Что будет с таймером?
Sergey666
20.01.2021, 13:17
Таймер в подпрограмме локально, вызов подпрограммы по условию. Во время работы таймера в следующем цикле условие изменилось, вызова нет. Что будет с таймером?
По хорошему программы должны работать в цикле Freewel, по условиям вызывать подпрограммы (Action), так работают надежные (вах четкие:) ), предсказуемые программы.
А то понапишуть кода с подвыподвертом, а потом- о-о-о чей-то оно как-то не так работает...ну типа иногдаааа и не всегда постоянно чета не так
Глобальный таймер это как пиво с утра- шаг в неизвестность.
И еще... если программа, подпрограмма вызвана по условию и она выполняет свою функцию более одного прогона, то сбрасывать флаг условия своего запуска должна она-же по выполнении своей задачи и со сбросом всех таймеров и прочего.
таймер в данном случае вызывается при каждом проходе программы, и подвывертов в коде нет. Есть факт того что очень редко при каких то не выясненных обстоятельствах таймер дает сбой и говорит сразу о том что отработал, очень похоже на ситуацию когда таймер не сброшен, но при всех возможных выходов из программы есть сброс таймера. Action, это что то из Codesys 3.0 или я что то не понимаю, ибо перешел по нескольким ссылкам в поиске гугла по фразе "Codesys Action", все ведут к статьям по Codesys 3.0.
Sergey666
20.01.2021, 16:40
ПКМ на объекте "программы" и в контекстном меню - действие (Action).
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot