PDA

Просмотр полной версии : Кто это все придумал?



ВладОвен
29.03.2022, 11:46
Всем привет.
В среде CodeSys пытаюсь использовать обычный логический двухвходовой элемент И.
Однако в этом элементе есть цепи EN и ENO.
Что это за они и зачем они нужны?

59985

Евгений Кислов
29.03.2022, 11:52
Всем привет.
В среде CodeSys пытаюсь использовать обычный логический двухвходовой элемент И.
Однако в этом элементе есть цепи EN и ENO.
Что это за они и зачем они нужны?

59985

Добрый день.

EN - вход управления: если он в TRUE, то элемент обрабатывается при выполнении POU, если в FALSE - то не обрабатывается.
Это позволяет "включать" и "выключать" выполнение каких-то фрагментов схемы в процессе работы программы.


Значение ENO равно значению EN и используется для "прокидывания" сигнала управления в другие блоки без засорения холста лишними линиями от EN.

https://help.codesys.com/webapp/_cds_cmd_fbd_ld_il_insert_empty_box_with_en_eno;pr oduct=codesys;version=3.5.17.0


Кто это все придумал?

Авторы стандарта МЭК 61131-3.

melky
29.03.2022, 13:48
а почитать? можно вообще запретить выполнение блока и нанизывать их один на другой.

kondor3000
29.03.2022, 15:28
Всем привет.
В среде CodeSys пытаюсь использовать обычный логический двухвходовой элемент И.
Однако в этом элементе есть цепи EN и ENO.
Что это за они и зачем они нужны?



Вас кто то принуждает? Не надо этих входов - пишите программу на CFC или ST, там нет этого, если вы специально не используете управляющие входы.

kondor3000
31.03.2022, 10:01
Видимо про SFC?

Они (ен/ено) есть везде. В ST это IF, в SFC это ветвление обхода шага

А дочитать предложение до конца? Что за манера, вырывать куски из контекста.

ВладОвен
07.06.2022, 17:49
Привет. Наверное, мне пока в отпуск!

1. Создадим структуру:

TYPE struct1 :STRUCT
bFlag1: BOOL;
bFlag2: BOOL;
bFlag3: BOOL;
bFlag4: BOOL;
bFlag5: BOOL;
bFlag6: BOOL;
END_STRUCT
END_TYPE

2. Объявим массив:

VAR
arrBuffer: ARRAY[1..2] OF struct1;
END_VAR

3. На экране визуализации разместим графический элемент "Кнопка-флажок".
В поле "Переменная" вставим: PLC_PRG.arrBuffer[1].bFlag1.
А в поле "Конфигурация ввода - OnValueChanged" установим "Переключить переменную - PLC_PRG.arrBuffer[1].bFlag1".

4. Запустим все это безобразие на ПЛК "CODESYS Control Win V3".

5. При попытке переключить флажок получаем ошибку визуализации/зависание.

Что я делаю не так?
Файл:

Евгений Кислов
07.06.2022, 18:17
Что я делаю не так?

А чего вы добиться-то своими действиями хотели?

ВладОвен
08.06.2022, 08:17
Переключение логического флага. Т.е. множества таких флагов.
Разве "Кнопка-Флажок" не для этого предназначена?

Евгений Кислов
08.06.2022, 08:23
Переключение логического флага. Т.е. множества таких флагов.
Разве "Кнопка-Флажок" не для этого предназначена?

Для переключения логического флага OnValueChanged не нужно.

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

ВладОвен
08.06.2022, 10:02
Ок. Спасибо. Заработало.

ВладОвен
08.06.2022, 12:37
Вот только теперь "варнинги" сыплются постоянно...
Можно было бы и забить на них, но мы ведь профессионалы! Недопускам костылей. Не так ли?
61120

Евгений Кислов
08.06.2022, 12:43
Вот только теперь "варнинги" сыплются постоянно...
Можно было бы и забить на них, но мы ведь профессионалы! Недопускам костылей. Не так ли?
61120

Удалите вообще действие из настроек чекбоксов (сейчас вы только переменную из действия удалили, а само действие осталось).

ВладОвен
13.06.2022, 16:52
А если в графическом элементе "Нажимной выключатель" в конфигурации ввода "OnValueChanged" разместить команду "Выполнить ST-код", то он при нажатии на этот выключатель должен выполниться один раз? Или я что-то не понимаю?

Евгений Кислов
13.06.2022, 17:34
А если в графическом элементе "Нажимной выключатель" в конфигурации ввода "OnValueChanged" разместить команду "Выполнить ST-код", то он при нажатии на этот выключатель должен выполниться один раз? Или я что-то не понимаю?

Вы понимаете правильно.

ВладОвен
21.06.2022, 10:58
Привет. Подскажите, как присвоить переменной дату и время в момент нажатия на клавишу на экране?

Будем использовать библиотеку CAA DTUtility и ее функциональный блок GetDateAndTime.
Создадим на экране визуализации клавишу "Временной хлопок!" и в событии OnMouseClick разместим код:

PC_PRG.fbGetDateTime.xExecute := TRUE; // запустим ф-блок
В основной программе расположим следующий код:

fbGetDateTime: DTU.GetDateAndTime; // при объявлении переменных создадим экземпляр ф-блока
dtMyDateTime: DATE_AND_TIME; // объявляем переменную для хранения даты и времени последнего (крайнего) хлопка

Основная программа:
IF fbGetDateTime.xDone THEN // дождемся завершения работы ф-блока
dtMyDateTime := fbGetDateTime.dtDateAndTime; // забираем результат
fbGetDateTime.xExecute := FALSE; // деактивируем ф-блок
END_IF

При нажатии на клавишу дата и время не записываются в переменную.
Что я делаю не так?

Евгений Кислов
21.06.2022, 11:02
Привет. Подскажите, как присвоить переменной дату и время в момент нажатия на клавишу на экране?

Будем использовать библиотеку CAA DTUtility и ее функциональный блок GetDateAndTime.
Создадим на экране визуализации клавишу "Временной хлопок!" и в событии OnMouseClick разместим код:

PC_PRG.fbGetDateTime.xExecute := TRUE; // запустим ф-блок
В основной программе расположим следующий код:

fbGetDateTime: DTU.GetDateAndTime; // при объявлении переменных создадим экземпляр ф-блока
dtMyDateTime: DATE_AND_TIME; // объявляем переменную для хранения даты и времени последнего (крайнего) хлопка

Основная программа:
IF fbGetDateTime.xDone THEN // дождемся завершения работы ф-блока
dtMyDateTime := fbGetDateTime.dtDateAndTime; // забираем результат
fbGetDateTime.xExecute := FALSE; // деактивируем ф-блок
END_IF

При нажатии на клавишу дата и время не записываются в переменную.
Что я делаю не так?

Вы не вызываете блок.

Надо так:

"Создадим на экране визуализации клавишу "Временной хлопок!" и привяжем к ее параметру Конфигурация ввода/Нажатие/Переменная переменную PC_PRG.xGetDateAndTime типа BOOL.



// объявление переменных
VAR
fbGetDateTime: DTU.GetDateAndTime; // при объявлении переменных создадим экземпляр ф-блока
dtMyDateTime: DATE_AND_TIME; // объявляем переменную для хранения даты и времени последнего (крайнего) хлопка
xGetDateAndTime: BOOL; // команда чтения системного времени из визуализации
END_VAR


// код программы
fbGetDateTime(xExecute := xGetDateAndTime);

IF fbGetDateTime.xDone THEN // дождемся завершения работы ф-блока
dtMyDateTime := fbGetDateTime.dtDateAndTime; // забираем результат
fbGetDateTime(xExecute := FALSE); // деактивируем ф-блок. в данной реализации можно этого и не делать, потому что он будет автоматически деактивирован при отпускании кнопки в визуализации за счет первой строки программы
END_IF

ВладОвен
21.06.2022, 11:43
Спасибо. Так заработало.
Подскажите, а почему при нажатии на кнопку "Временной хлопок!" дата и время становятся равными: 21.06.2022 08:36:21 ?
Хотя хлопок произошел в 21.06.2022 11:36:21 .
При этом в соседнем поле на экране визуализации (для контроля) выводится текст %t[dd.MM.yyyy HH:mm:ss] (т.е. текущая дата/время). Там отображается 21.06.2022 11:36:21 , т.е. верные дата/время.
Что может быть не так?

Евгений Кислов
21.06.2022, 11:46
Спасибо. Так заработало.
Подскажите, а почему при нажатии на кнопку "Временной хлопок!" дата и время становятся равными: 21.06.2022 08:36:21 ?
Хотя хлопок произошел в 21.06.2022 11:36:21 .
При этом в соседнем поле на экране визуализации (для контроля) выводится текст %t[dd.MM.yyyy HH:mm:ss] (т.е. текущая дата/время). Там отображается 21.06.2022 11:36:21 , т.е. верные дата/время.
Что может быть не так?

Они не "становятся равными", они считываются без учета часового пояса (в UTC+0).
Для наших контроллеров эта библиотека вообще не нужна - у нас системное время и часовой пояс доступны в узле OwenRTC в дереве проекта.

61328

ВладОвен
21.06.2022, 12:02
Евгений, спасибо за оперативные и быстрые ответы. Без вас можно было бы волосы рвать от безнадёги (в т.ч. и на голове). :)

ВладОвен
01.07.2022, 16:26
Привет. Компилирую проект, но получаю кучу непонятных предупреждений. И нет указания где именно в коде произошло то, или иное предупреждение.
Подскажите в чем дело? См. рисунок.
Спасибо.
61496

Евгений Кислов
01.07.2022, 16:42
Привет. Компилирую проект, но получаю кучу непонятных предупреждений. И нет указания где именно в коде произошло то, или иное предупреждение.
Подскажите в чем дело? См. рисунок.
Спасибо.
61496

По тексту предупреждений очевидно, что они связаны с ненастроенными элементами визуализации, а не с кодом.

ВладОвен
01.07.2022, 16:53
Да, Евгений. Это я тоже понял. Но IDE не пишет какой элемент править-то.
Все поудалять и новое создать что-ли? Походу только так... :(

Евгений Кислов
01.07.2022, 16:58
Да, Евгений. Это я тоже понял. Но IDE не пишет какой элемент править-то.
Все поудалять и новое создать что-ли? Походу только так... :(

Выкладывайте проект, посмотрим.

Parovoz
04.07.2022, 04:49
проще забить, на работу это не влияет. "варнинги" они на то и "варнинги", чтобы просто привлечь внимание к возможной ошибке, но ошибки может и не быть, а может быть специфика написания программы.

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

Мой совет - завязывать с перфекционизмом и не сношать мозг ни себе ни людям.

ВладОвен
04.07.2022, 11:13
Можно и так.
Только помните, если появляется более 100 варнингов, то система не выводит последующие. Т.е. 101 и далее вы уже не увидите.

ВладОвен
23.09.2022, 16:05
Привет.

Всем удачных выходных!