Спасибо всем ответившим.
Правильный ответ на мой 1-й вопрос:
Library Manager - (ComService) - Data types
И видим тип перечисление.
Делаю вывод:
Объявленный тип данных является глобальным по умолчанию.
Если ошибаюсь пусть меня поправят.
С уважением, Михаил.
Принцип умолчаний здесь неприменим, т.к. вариант лишь один — любой тип данных в кодесисе является глобальным.Объявленный тип данных является глобальным по умолчанию.
Спасибо за ответ. Я имею ввиду всплывающее окно. То есть на схеме несколько клапанов. Нажимая на каждый, появляется окно, их может быть одновременно несколько открытых, если нажать сразу на несколько клапанов. Именно окно поверх схемы. А с управляющей панелью места не хватит на все клапаны на экране.
У Вас не таймер внутри таймера, а IF внутри другого IF. И условие для вложенного IF не будет выполняться никогда.
Т.к. программа в ПЛК выполняется циклически, то всякий раз, через время одного цикла:
-первой строкой программы, время задержки таймера устанавливается равным 7с.
- второй строкой программы обнуляется переменная OUT
И в результате
каждые 7 с, и на время одного цикла переменная OUT будет принимать значение равное 1.Код:............... IF TP1.Q=0 THEN OUT:=1;
А из этой конструкции
..........
А условие IF TP1.Q=0 THEN не будет выполняться никогда, т.к. после TP1(IN:=TRUE,PT:=T#10s) выход TP1.Q всегда будет в состоянии 1.Код:TP1(IN:=FALSE,PT:=T#0s); TP1(IN:=TRUE,PT:=T#10s); IF TP1.Q=0 THEN OUT:=2;
А TP1(IN:=TRUE,PT:=T#10s); не имеет смысла, т.к. смотрим выше на первую строку программы.
Не понятен контекст фрагмента кода, если нужно один раз после старта программы выполнить последовательность состояний для OUT:= 0(в начале) ,1(через 7с), 2(через 10с), то например так.
Код:PROGRAM PLC_PRG VAR TP1:TP:=(PT:=T#10s); OUT: INT; END_VAR TP1(IN:=TRUE); IF TP1.ET>=T#7s THEN OUT:=1; ELSE OUT:=0; END_IF IF TP1.ET=T#10s THEN OUT:=2; END_IF
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Спасибо.
Хотел упростить код чтобы проще было мне помочь но похоже упростил на столько что специалисты отвечают на то что видят а не на то что я думаю.
Я прикрепил проект, у меня не получается вот что:
1) Должен отработать таймер в CASE 1:
2) Должны отработать два таймера в функции
3) И только после этого должен отработать таймер в CASE 2:
Код я снова упростил, на самом деле в функции есть вычисления. По отдельности всё работает хорошо, функция вычисляет то что требуется, время работы таймеров динамически рассчитывается внутри функции. В самой программе CASE обходит всё как задумано и т.д. Но стоит мне функцию вставить в программу расчет в функции до конца не доходит, после первого цикла контроллера продолжает выполняться программа когда функция еще не дошла до своего логического конца.
В проекте кодесиса могут присутствовать разные POU -программы, функции и функциональные блоки. Давайте не путать термины.
У Вас в проекте нет функций, а есть две программы. Программа Fn() вызывается из главной программы.
Обе программы не работают параллельно.
Строки программы Fn() выполняются тогда, когда в основной программе PLC_PRG происходит ее вызов и затем продолжает выполняться основная программа со строки следующей за вызовом программы Fn(). А не ждет, когда в вызываемой программе отработает таймер и выполнятся все CASE. Вы же ни как не обмениваетесь состоянием переменных между программами, нет ни глобальных переменных ни выходных переменных у Fn()
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Есть аналог дешифратора 32 бит в CodeSys, как присутствует в OWEN Logic ?
На входе целочисленное от 0 до 31 (номер бита, который необходимо установить в 1), на выходе число 32-х битное согласно установленному биту.
capzap, блин, я тормоз, PUTBIT все тоже самое делает по аналогии с DC32 из лоджика.
Для меня ST пока темный лес практически.