PDA

Просмотр полной версии : ПЛК 100+МВА8. Ошибка связи при увеличении длины программы.



HeKPoMaHT
30.01.2009, 16:37
добрый день! я пишу весовой дозатор для РБУ на ПЛК.
Конфигурация пока следующая: ОВЕН ПЛК 100 R-L + МВА-8. В качестве задатчиков массы использую 4 источника 4-20 мА, подключенных к МВА. Всё было хорошо, пока программа не начала увеличиваться в размерах. Буквально вчера начал добавлять защиты разные и в итоге заметил, что при запуске программы в PLC Configuration постоянно выпадает ошибка связи 81 (моргает то 0 то 81). Весь вечер сидел думал. Создается такое впечатление что весь код программы не успевает выполниться за программный цикл и контроллер просто не успевает совершать обмен по Modbus, т.к. при удалении любой части программы эта ошибка пропадает... Может кто-то сталкивался с подобной проблемой? Подскажите в чем моя ошибка?

Филоненко Владислав
30.01.2009, 17:48
Вы абсолютно верно описали явление. Надо либо оптимизировать код программы (это правильно), либо увеличивать цикл ПЛК (временное решение)

Для оптимизации в CoDeSys есть понятие задача и событие

HeKPoMaHT
30.01.2009, 18:04
А можно поподробнее про задачи, события и оптимизацию? Желательно с примером программы.

Филоненко Владислав
30.01.2009, 21:07
Предположим, у вас в программе есть 3 PID-регулятора.
Каждый из них пользуется данными с датчика, опрашиваемого 10 раз в секунду.

Если Вы вставите вызов всех 3 PID в одну задачу - и будете вызывать её 1000 раз в секунду: код пидов будет выполнятся в 100 раз больше по процессорному времени, чем реально надо.

Теперь соптимизируем:
Создадим 3 задачи, в каждую поместим по вызову PIDа.
Вызов каждой задачи свяжем с событием - обновлением данных с соответствующего датчика.
В результате код пидов будет вызываться только тогда, когда нужно, и "пустая" нагрузка на ПЛК сократится в десятки (а то и в 100) раз.

Конкретная реализация - рекомендую для начала прочитать руководство по CoDeSys 2.3 на русском языке (см. прилагаемый диск). Там достаточно обстоятельно механизм создания и типы задач разобраны.

HeKPoMaHT
04.02.2009, 17:33
А можно всё-таки примерчик программы, где активно использются задачи и события (хотя бы с теми же ПИДами)? В руководстве почитал, но не совсем понятно, с примером гораздо проще было бы

Филоненко Владислав
04.02.2009, 18:12
Завтра постараюсь выложить.

Kirill
06.02.2009, 14:06
А можно всё-таки примерчик программы, где активно использются задачи и события (хотя бы с теми же ПИДами)? В руководстве почитал, но не совсем понятно, с примером гораздо проще было бы

простой пример во вложении.
3 программы, прибавляющие 1 в каждом цикле.
первая срабатывает 1 раз в секунду.
вторая выполняется так быстро, как это возможно.
третья срабатывает один раз при каждом замыкании 1 дискретного входа ПЛК.
Посмотрите, все основные принципы там хорошо видны.

972

HeKPoMaHT
06.02.2009, 14:55
Спасибо за пример! Это мне понятно. А как сделать чтобы подпрограмма работала допустим 10 раз в секунду циклически, но при этом не постоянно, а только когда установлен какой-либо флаг? Тоесть если флаг истина, то подпрограмма работает 10 раз в секунду, а если ложь, то она не работает вовсе.

Николаев Андрей
06.02.2009, 15:10
Пишите отдельно программу (она будет подпрограммой).
В основной программе отслеживаете флаг и запускаете таймер.
Если флаг тру и таймер сработал - вызвать подпрограмму (первую программу с именем "не PLC_PRG").

Сергей71
09.02.2009, 10:28
Предположим, у вас в программе есть 3 PID-регулятора.
Каждый из них пользуется данными с датчика, опрашиваемого 10 раз в секунду.

Если Вы вставите вызов всех 3 PID в одну задачу - и будете вызывать её 1000 раз в секунду: код пидов будет выполнятся в 100 раз больше по процессорному времени, чем реально надо.

Теперь соптимизируем:
Создадим 3 задачи, в каждую поместим по вызову PIDа.
Вызов каждой задачи свяжем с событием - обновлением данных с соответствующего датчика.
В результате код пидов будет вызываться только тогда, когда нужно, и "пустая" нагрузка на ПЛК сократится в десятки (а то и в 100) раз.

Конкретная реализация - рекомендую для начала прочитать руководство по CoDeSys 2.3 на русском языке (см. прилагаемый диск). Там достаточно обстоятельно механизм создания и типы задач разобраны.

Вопрос.
Если сигнал с датчика не меняется, то ПИД не вызывается. Что произойдет если мне надо изменить уставку. Как будет вести себя ПИД.

Kirill
09.02.2009, 10:32
Вопрос.
Если сигнал с датчика не меняется, то ПИД не вызывается. Что произойдет если мне надо изменить уставку. Как будет вести себя ПИД.

если вы изменяете уставку, возникает большое рассогласование. П составляющая увеличивается скачком и тащит регулятор к новой уставке. В это время И-составляющая активно нарастает (или уменьшается). У вас происходит раскачивание системы. Если коэффициэнты ПИД-а подобраны хорошо, то будет несколько (2-3) затухающих колебаний вокруг новой уставки.

Сергей71
09.02.2009, 12:27
Я про другое.

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

Филоненко Владислав
09.02.2009, 13:53
Когда следующее измерение произойдёт - ПИД отработает и уставку и сигнал датчика

Сергей71
09.02.2009, 16:18
Когда следующее измерение произойдёт - ПИД отработает и уставку и сигнал датчика

Еще вопрос. Измерение произошло как это увидить если сигнал не изменился.
Пример: измерение напряжения(сигнала датчика) происходит в каждом цикле, а напряжение(сигнал датчика) на входе, ПИД смотрит по событию изменения этого напряжения(сигнала датчика). Т.е событие изменения сигнала датчика может не наступить. Значит задачу надо выполнять в кажом цикле.

Вместо цикла может происходить опрос по RS485 (RTU) - где здесь увидеть что он опросил нужный регистр с данными.

PS или я чето недогоняю. Я про событие обновления данных.

Филоненко Владислав
09.02.2009, 17:15
В приборах ОВЕН есть специальный параметр - циклическое время, если оно поменялось - есть новое значение.
Для приборов др. производителей надо либо использовать таймер, либо др. признаки в соотв. с возможностями приборов.

Сергей71
10.02.2009, 09:01
Вот и проходится заводить таймеры.
Мастер RTU опрос трех регистров с датчиков - частота опроса примерно 200мс (время измерения датчика составляет 5 Гц)
Три регистра на каждый ПИД и три таймера (частота примерно 200мсек).

Но проще завести таймеры в программе а не через TASK - т.к нет параллельности и точного времени вызова.
И тогда безболезненно можно вызавать ПИД из программы при смене уставки тп.

Попутно вопрос если у ФБ вызывается его Action(действие) из внешнего ФБ - то весь ФБ то же выполняется или только Action.

Малышев Олег
10.02.2009, 12:11
Я вообще извиняюсь, что вклиниваюсь в чужой разговор, но вроде бы ПИД работают так - если изменилось время или уставка - то пересчет мощности.Изменение времени учитывается явно - как в ПИД библиотеки pid_regulators, PID_FIXCYCL или неявно как PID библиотеки util.lib. Таким образом заводить доп обработку смысла нет

Вызывается только Action