PDA

Просмотр полной версии : Не записываются переменные в CoDeSys



Juan Esteban
19.03.2021, 08:11
Здравствуйте! Очередной ламерский вопрос. У меня есть проект, который при запуске что на контроллере, что в эмуляции, странно работает, то есть не работает: входы считываются, но значения из одних переменных не передаются другим, как будто проект не запущен, хотя он запущен. Я уже голову сломал, не могу понять, может, какой-то специальный режим включен?

Причем действует это избирательно.

На всякий случай прикладываю файл проекта - особо это видно в POU to_OPC и Valves_alarms.

Juan Esteban
19.03.2021, 10:31
Посредством всяких тыканий выяснил, что не работают только задачи, после определенного приоритета (например, задачи с приоритетом выше 11 выполняются, а остальные нет).

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

Juan Esteban
19.03.2021, 16:26
.. т.е. отказом от непонятно за каким прикрученым сюда приоритетам. Да еще овер 11 уровней.

Нет, не так. Приоритеты остались, их в любом случае в конфигураторе задач надо задавать, если он используется - от 0 до 15.

Под циклическим режимом в данном случае подразумевается выполнение задачи через определенное время - в данном случае через 1 секунду. Свободный режим подразумевает выполнение задачи по кругу без пауз.

Juan Esteban
19.03.2021, 17:39
Нету у вас там задач требующих приоритетов. 99.99% задач которые решают на плк не требуют приоритетов. Не говорите что именно у вас, именно эти 0.01%. Приоритеты тут - чисто менагерская фича. Прикрутили, а на кой они тут - неизвестно.

Я не настаиваю, что без них не обойтись, но лично мне удобно для понимания, что за чем выполняется.

YuriBel
19.03.2021, 18:49
А что мешает просто тупо перечислить ваши подпрограммы в PLC_PRG ровно в том порядке, который вам нужен и не связываться с задачами вообще?

Juan Esteban
19.03.2021, 19:02
А что мешает просто тупо перечислить ваши подпрограммы в PLC_PRG ровно в том порядке, который вам нужен и не связываться с задачами вообще?

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

Juan Esteban
20.03.2021, 05:52
)) Ну да. А с приоритетами такая упорядоченность и удобный поиск ...


Да уж удобнее, чем весь код в одно место складывать.



Задача - пройти вперед.
1.Копаем яму перед собой.
2.Ищем способ пройти
3.Строим мост через яму
Задача - решена.


Ну и что, что проблема возникла, волков бояться - в лес не ходить.


))и что сделали в 1-ую очередь ? Еще ДО залезания в таски ?


Залез в настройки, погуглил - не нашел.

Вообще не понимаю, в чем проблема. Вы правда считаете, что тасков надо бояться только из-за того, что там циферки надо поставить, что за чем выполняется? Лично мне гораздо удобнее все разбить на подпрограммы, чем все мешать в одну кучу. Так проще искать, проще копировать однотипный код, например.

Cs-Cs
20.03.2021, 11:32
Так приоритеты тасков - это НЕ номер последовательности, по которой они выполняются.
Это именно приоритет: кто ГЛАВНЕЕ, если выражаться образно. И если окажется так, что ты сказал "вот эта задача главнее, а эта - совсем на 15ом месте" и если "более главная" задача отжирает больше ресурсов и времени - то может быть так, что менее важные задачи вообще не будут работать, потому что ПЛК отдаст время тем, кто главнее.

Задачами удобнее пользоваться для разделения чего-то по времени. Например, если есть медленные процессы типа "взяли температуру и через секунд 10 как-то там среагировали, потому что пофиг" (например, регулирование отопления в квартире, где медленная реакция прокатит) - то всё это можно вынести в задачу и сказать ей "Выполняйся раз в 500 мсек".
И, например, если у нас идёт обмен с модулями IO (обработка данных от AI, пересчёт их и что-то такое) - то это мы делаем самым коротким по коду (чтобы быстро выполнялось и не было сложных задач) и говорим "выполняйся раз в 20 мсек".

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

Cs-Cs
20.03.2021, 11:37
Я ещё допишу. Вот задачи IO - нафига они по секунде стоят? Конечно они не будут работать. Раз в секунду-то...
Ты путаешь, путаешь очередь выполнения (она пользователю недоступна) и важность выполнения. Раз у тебя стоит Discret_outputs 15ым (самым последним) в очереди, и ещё и раз в секунду - то ПЛК на эту задачу может просто забить и сказать "А, ну нафиг, она не важная, и ещё и раз в секунду - отдам время другим задачам, а этой как придётся".

Тебе хватит меньше задач:
* Просто для IO с переменными - самая быстрая (20-30 мсек), высокий приоритет (0-1)
* Регулирование (для управления чем ты управляешь) - быстрая (50-100 мсек), приоритет чуть ниже IO, но высокий (1-2)
* Обмен с OPC - медленная (200-500 мсек), приоритет ещё чуть ниже (2-5)
И всё.

Juan Esteban
20.03.2021, 12:24
Спасибо за пояснения. По секунде у меня все стоит для простоты: опрос модулей осуществляется с интервалом 1 с (на данном производстве нет необходимости делать это быстрее), поэтому задачи IO, да и остальные тоже нет надобности, как я понимаю делать быстрее, - только контроллер нагружать.

В данном случае, если интервал запуска у всех задач одинаковый - то их очередь выполнения соответствует порядку заданных приоритетов, ведь так?

capzap
20.03.2021, 12:44
Спасибо за пояснения. По секунде у меня все стоит для простоты: опрос модулей осуществляется с интервалом 1 с (на данном производстве нет необходимости делать это быстрее), поэтому задачи IO, да и остальные тоже нет надобности, как я понимаю делать быстрее, - только контроллер нагружать.

В данном случае, если интервал запуска у всех задач одинаковый - то их очередь выполнения соответствует порядку заданных приоритетов, ведь так?

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

Juan Esteban
20.03.2021, 12:47
Разве не логично при постановке такого вопроса, записать в главной программе, последовательно, все поу которые сейчас разнесены по задачам?

А что, в PLC_PRG можно вызывать другие PRG?

capzap
20.03.2021, 13:40
А что, в PLC_PRG можно вызывать другие PRG?

пробуйте, ни кто из присутствующих не запрещает

Juan Esteban
20.03.2021, 13:54
пробуйте, ни кто из присутствующих не запрещает

Потому и спрашиваю, что не знаю, как это делать. Как вызывать функцию или ФБ - понятно, а PRG - не знаю. Если имеется в виду простое копирование кода из всех PRG в PLC_PRG - то это как-то тупо.

Cs-Cs
20.03.2021, 17:22
Juan Esteban Нет, секунда - это очень много. Используй те цифры, которые я писал. Ты же забываешь о том, что (это ОЧЕНЬ условное и примитивное объяснение), что ПЛК раз в секунду дёрнул одну задачу, раз в секунду другую, раз в секунду - третью. И может получаться так, что секунда будет превращаться и в две и в три.

Про PLC_PRG. Да нет, не код скопировать. А вставить "Элемент", и там там написать вызов своих POU (программ).
54098

Juan Esteban
20.03.2021, 17:27
Хм, ок, попробую, спасибо.

Juan Esteban
24.03.2021, 16:40
Juan EstebanПро PLC_PRG. Да нет, не код скопировать. А вставить "Элемент", и там там написать вызов своих POU (программ).
54098

Попробовал, кстати - не работает это, выдает ошибку, что %PRG_name% не является допустимым блоком или оператором.

Cs-Cs
24.03.2021, 21:53
Ну как "не работает", если я это сделал в твоём же проекте.
Ты же его узнаёшь на скриншоте же?

Juan Esteban
25.03.2021, 11:41
Ну как "не работает", если я это сделал в твоём же проекте.
Ты же его узнаёшь на скриншоте же?

Блоки-то создаются, но проект не компилируется, выдаёт вышеизложенные ошибки.

Juan Esteban
27.03.2021, 12:28
Всё, разобрался.