Всем доброго вечера!
Подскажите, пожалуйста, библиотека 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 использовать несколько раз так, чтобы работа одного экземпляра не оказывала влияния на другой ?
скрин получился поганый, ограничения на размер картинки. переделал.