skodafelicia молодец! :) теория, подкрепленная экспериментом уже правило.
Ура!
Вид для печати
Всем доброго вечера!
Подскажите, пожалуйста, библиотека PID_reg2 применима только для контроллеров ПЛК 63, 73, 410? У меня в наличии ПЛК160..., получается, что эта библиотека не подходит?
Подходит для всех ПЛК
доброго вечера.
в поиск ходил, не нашел. контроллер ПЛК-110-60, пишу под него программу, столкнулся с такой штукой. пишем вот так:
PROGRAM PLC_PRG
VAR
tp1:TP;
tp2:TP;
END_VAR
tp1(in:=start, pt:=t#4s);
ek1:=tp1.Q;
tp2(in:=stop, pt:=t#4s);
ek1:=tp2.Q;
start и stop - два аппаратных входа DI1 и DI2, ek1 - аппаратный выход, скажем, DO5. в конфгурации ПЛК определены.
как я себе представляю логику работы:
подаю на один из входов единицу, запускается таймер TP, перещелкивает аппаратный выход в 1 на заданное время, потом возвращает выход обратно в 0.
соответственно, от второго входа реакция должна быть та же самая, только вход другой.
что происходит:
железом отрабатывается только вторая часть программы. выход щелкает только при появлении 1 на входе stop. после того, как таймер свое отработал, я подаю 1 на вход start, это приводит к срабатыванию таймера. кодесис в режиме онлайн показывает мне, как выход первого таймера сработал, но при этом аппаратный выход не срабатывает. попытка вручную включить выход в конфигурации ПЛК приводит к тому, что что-то упорно держит его в нуле и не хочет отпускать.
вопрос: что держит выход в нуле, что я делаю не так, и как избежать подобного рода вещей в будущем ?
Ошибка Ваша в том, что в конце программы у Вас опять повторяется строка с присвоением:
ek1:=tp2.Q;
И, когда Вы пытаетесь первым TP присвоить значение на выход, ПЛК доходит до последней строки, но там TP2 ещё не срабатывал и присваивает на выход FALSE.
Программа примерно должна выглядеть так:
tp1(IN:=start , PT:= t#4s, );
tp2(in:=stop, pt:=t#4s);
ek1:=tp1.Q OR tp2.Q;
В этом случае, выходу присвоится значение TRUE при срабатывании ТР1 ИЛИ ТР2.
спасибо большое, пример сработал.
возвращаясь к реальной жизни: выходов таких более десятка, включаются они одним и тем же образом. для их включения, чтобы не писать лишнего, я вынес конструкцию с TP в отдельный функциональный блок и вызываю его по мере необходимости. получается, что, если вызов этого блока определен в программе не один раз, то выходы все равно зависают в нуле. наверняка есть какое-то более изящное решение, чем переписывать всю программу, выкинув из нее этот функциональный блок и описав включение каждого выхода через TP с помощью кучи OR ?
вот они, куски кода. блок на ST. то, откуда он множественно вызывается, на CFC, и в остальной части программы таких вызовов блока много. как, кстати, правильно сбрасывать TP, и правильно ли я понимаю, что, написав необходимое количество блоков с вызовами TP, я в конце каждого блока этот таймер сбрасываю, и тогда оно начинаетработать, как надо ?
я только начинаю, по большому счету, осваивать ПЛК, не всегда еще понимаю логику его работы. мне почему-то подумалось, что, если я смогу привести вырожденный пример, то это не будет сильно отличаться от того, что есть на самом деле. я о том, что я получил одинаковый эффект от двух несколько разны, получается, действий и, исходя из этого, неверно сформулировал вопрос. тогда переформулирую: как один и тот же блок с TP использовать несколько раз так, чтобы работа одного экземпляра не оказывала влияния на другой ?
скрин получился поганый, ограничения на размер картинки. переделал.
Вот так и использовать, как Вы в скрине и показали.
У Вас создан функциональный блок ТР, но в основной программе Вы его вызываете под разными именами: VS3 и VS4.
Следовательно, это два различных экземпляра, которые не оказывают никакого влияния друг на друга.
Созданный Вами функциональный блок, фактически ничем не отличается от созданных программистами CoDeSys (или кем-то ещё) ФБ: TP, BLINK, RS, F_TRIG и.т.д.
И, когда Вы вызываете несколько одинаковых этих ФБ, но под разными именами, - у Вас ведь не возникает опасения, что эти ФБ будут как-то влиять друг на друга?
Главное помнить, что программа выполняется ПЛК не мгновенно.
А - слева направо, сверху вниз, к тому же циклично.
И, в первом Вашем примере,вначале ek1 был присвоен результат TRUE - при срабатывании TP1, но программа выполняется слишком быстро и Вы просто не успели этого заметить, потому что, когда выполнение программы дошло до строки в конце, где присваивается значение выхода TP2 ТОЙ ЖЕ переменной ek1, ей и было изменено значение из TRUE в FALSE, так как ТР2 не сработал и его выход имел значение FALSE.
Зачем она тогда в комплекте поставки ПЛК110 :) Попробовал PID на ПЛК110, компилируется но не заливается, пишет неразрешенные ссылки на внешние POU. Возникает только вопрос: зачем вы эту библиотеку в поставку 110 включаете и в документации на библиотеку пишете:На ПЛК63/73 нет PWM.Цитата:
Примечание. Значения Y_PLUS и Y_MINUS можно передавать на дискретный выход ПЛК, используя модуль PLC_Configuration PWM, для чего Y_PLUS приведен к значениям 0…65535, а Y_MINUS к значениям 65535…0
к сожалению, он не работает, не могу понять, почему. в аттаче - полный проект с этой проблемой. в нем есть вход ek1mo, и выход ek1. сначала я вызываю один экзмепляр блока vs в plc_prg, и потом вызываю еще несколько экземпляров vs из другого блока. при этом, ek1 в plc_prg не отрабатывает. перенесение его в другой блок результата не дает. вопрос, что я делаю не так.
да, точно. код во вложении сообщением выше не работает, если один из выходов используется более одного раза. не могу понять.
применительно к выложенному проекту.
цикл включения:
по входу start срабатывает выход ek1 и, если sens2 активен, срабатывает выход gen_kisl. через промежуток времени включаются выходы pump, gen_ozon и куча ek. ek - это электроклапана с трехпроводным управлением, один открытие, другой закрытие, третий - общий. функциональный блок vs используется для того, чтобы замкать выход на время, необходимое для полного открытия этого клапана. при этом, клапан ek1 можно открывать отдельной кнопкой ek1mo с ипользованием того же ФБ vs, внутри которого TP. так сделано просто чтобы меньше места занимало. семафоры там для удержания выходов gen_kisl, gen_ozon и pump в активном состоянии.
цикл выключения: по входу stop сначала срабатывает выход voc, который тоже такой же электроклапан, через промежуток времени срабатывают выходы, управляющие закрытием всей открытой ранее кучи клапанов - вся куча с буквой "c" на конце, сбрасываются поднятые ранее семафоры.
по большому счету, без семафоров можно обойтись, set/reset там тоже отлично работало. просто решил так.
пробовал заменить TP на TON/TOF, результат точно такой же, выходы висят в нулях.
это уже попытка сбросить выход этого TP. не помогло, кстати... :) первоначально ее не было. если ее убрать, отрабатывает всё, кроме связки ek1mo-vs-ek1 в plc_prg. если убрать из блока on_off упоминание ek1, связка начинает работать.
на отдых еще два дня впереди... :)
Вы попробовали убрасть R из vs, загрузить это в контроллер и посмотреть, что получится ? и оно заработало ? но КАК ? потому что то, что вижу я, выглядит так: вход отрабатывается, vs отрабатывается, а вот ek1 - нет. см. вложение.
Здравствуйте! Подскажите пожалуйста решение проблемы! Есть ПЛК100, к нему по RS-485 подключены модули МВА8 и МВУ8. В контроллере простинькая программа опроса входов и установки выходов. При пропадания питания на ПЛК, и последующего появления, контроллер перестает опрашивать модули ввода\вывода. Нажатия кнопки старт\стоп на контроллере ни к чему не приводят(((.
Онлайн-подключение-создание загрузочного проекта-старт.
Как обнулить таймер? Этот блок вызывается из программы несколько раз.
VAR
var1,var2:BOOL;
TON1:TON
END_VAR
var1:=1;
TON1(IN:=var1,PT:=T#20s,Q=>var2);
IF TON1.Q=1 THEN var1:=0
Переменная Q после первого прохода таймера остается в единице. Как перевести ее в 0.
Всем Привет! подскажите пожалуйста как исследовать FB hysteresis и др. аналоговые преобразователи FB? заранее спасибо!
Я совсем новичок в CoDesys пишу программу на языке LD для управления газовым нагревателям.Хочу пока отработать её без ПЛК. У нагревателя идёт регулирование температуры и давления на входе продукта и др. аналоговые сигналы. Затрудняюсь с программированием на языке LD аналоговых сигналов.
да блок который будет эмулировать температуру
LD - ИМХО мазохизм и пережиток прошлого. Пиши на ST и будет счастье.
ST конечно хорошо! наслышан, но у меня нет книг по изучению st, а в библиотеке кодесис описание его мне как новичку не хватает.
очень интересные авторы И.Г. Минаев, Самойленко В.В. всё понятно всё доступно, но они описывают LD. Есть ли подобная литература где описан ST, SFC и CFC?
Здравствуйте, недавно получили ПЛК 150 I-M и модули МВ110-8А и МВ110-16Д для тестирования. Проблема возникла при подключении модулей. Индикации RS485 нет, делал все по инструкции подключения к ПЛК, при подключении выдает ошибку #2000:2000.1.6 19:14:17 # 1 PLC STARTED. Что это за ошибка в документации я не нашел, в чем может быть проблема?
И еще для чего нужны перемычки (переключатели) на лицевой стороне модуля? описания в предоставленной документации тоже нет.
А где там написано, что это ошибка? Просто сообщение.Цитата:
при подключении выдает ошибку #2000:2000.1.6 19:14:17 # 1 PLC STARTED. Что это за ошибка в документации я не нашел, в чем может быть проблема?
Покажите свой пробный проект и снимок окна конфигуратора МВ с сетевыми настройками модуля.
удивительно, но в файлах РЭ_МВ110-16Д(ДН)_881.pdf и РЭ_МВ110-224 8А_984.pdf все довольно подробно расписано про перемычки. страницы 33 и 50 соответственно
Ламерский вопрос, но что-то аж разозлился от своего непонимания... Есть задача настройки пм01 и плк100, вообщем-то прошлый раз я реализовал почти всё что хотел при помощи примеров и так далее, но я делал это вслепую, я никак не могу нигде найти и нигде прочитать как мне работать с модемом прям из кодесис? читал "Прослушиваю связь между модемом и контроллером вижу строку ...." а как люди это делают? где писать посылаемые команды, где видеть принимаемые? я хочу во всём разобраться и написать свой работающий пример. В конечном счёте мне нужно, чтобы при звонке с мобильного на номер модема - он бросал трубку и на этот номер отвечал смс с текстом, а так же на него слал аварийные сообщения...
Здравствуйте)) программировал на С, там можно обращаться к переменой через ее адрес (с помощью указателей), сохранять адрес, также к адресу можно было прибавлять целые числа.
мне в программе надо управлять несколькими двигателями, можно ли обращаться к модулю в конфигураторе непосредственно через адрес?, так же прибавив к этому адресу число и обращаешься к следующему модулю.
В ПЛК все проще и ближе к людям. Можно и по адресам, но удобнее символьная адресация. Компилятор всё сделает за Вас.
Опасно. Память выделяете не вы и это не массив, а потому нельзя полагаться на то, что структуры лежат стык-в-стык.Цитата:
так же прибавив к этому адресу число и обращаешься к следующему модулю
Я сам плюсишник, но в ST решил особо не фокусничать. В основном проекте у меня через указатели только несколько экземпляров однотипных функциональных блоков адресуются.
Друзья, помогите разобраться с task configuration. В PLC_PRG вызываю прочие pou, например valves(); sensors();
Pou много, вызываются один за другим, все работает как надо. Переношу их в task configuration, в той же последовательности вызываю. Программа начинает работать некорректно, как будто pou не выполняются. В task configuration стоит циклический вызов 50 мс. Используя freewheeling ничего не меняется. Вообще объясните тупому в каких ситуациях рекомендуется использовать cycle а когда freewheeling? Как вообще грамотно работать с task configuration? Буду очень всем откликнувшимся благодарен.
cycle - вызывается с заданной частотой.
freewheeling - вызывается когда у ПЛК есть свободное время. Если времени нет - не вызывается :)
При подключении в TaskConfiguration PLC_PRG перестает быть программой по умолчанию.
Работа с данным инструментом очень хорошо описана в мануале по CoDeSys и в справке.
Вай из ит соу?Цитата:
Warning 2501: A callback function is not allowed to contain local variables.