В ПР200 при переходе на экран с помощью кнопок никак не определить на какой вы перешли экран
Вид для печати
Хотелось бы услышать, что Вы согласны сделать переходы по изменению(редактированию) переменной с экрана!
Все преведущие товарищи говорили, что это менее удобно и отказывались!
Здесь не надо быть большим специалистом, чтобы понимать что это менее удобно, но это решает проблему!
Короче, при редактировании переменной с экрана формируется импульс перехода на соответствующий экран, всё. Я делал продолжительность импульса перехода = 255 мс, говорят(я не проверял) от продолжительности в один цикл не всегда срабатывает.
Вложение 88557
Вложение 88558
Ох тж, а я то думал!!! :) Вот в чем секрет! Эдак и я так могу :)
Ладно забейте, нет так нет, это просто был вопрос, можно или нет, оказывается нет, сделаю так как вы очень давно предлагали, хотя я это сделал еще до того как задал этот вопрос и это слишком просто и не по феншую...
В любом случае всем спасибо! :)
добрый день, как сделать в схеме в OWEN LOGIC, чтобы при нажатии на лкм i1 сигнал был 1, при отжатии лкм I1 уходил в ноль, то есть кнопка без фиксации
А "лкм" = это левая кнопка мыши?
Добрый день, подскажите пожалуйста, Овен ПЛК 110-60, в codesys написана программа, в конфигураторе ПЛК добавил Modbus slave (TCP) и добавил 8bit в кол-ве 4 штук, то есть на регистр 0х00 2 и на 0х01 2, проблема в том, что в Овен OPC при опросе контроллера не видит изменение переменных после 15бита, с 0х01 регистра, состояние подключения пишет GOOD.
Если через Codesys подключаться, то в конфигураторе и в программе все переключается, переменные все глобальные, на самом плк индикаторы тоже переключаются
Да, на 1-15 бит адрес 0, для 16-31 адрес 1, пробовал добавлять еще 2 по 8bit, чтобы проверить 2 адрес, но результат не меняется.
Думал возможно проблема в настройке OPC, но и там вроде все нормально
Если у вас Holding регистры, то регистр 0 биты с 0 по 15, Вложение 88565
регистр 1 тоже биты с 0 по 15.
На скрине сделал по 10 бит в 0 и 1 регистре
А вот опрос для Coils, только адреса уже 0-15 и 16-31. Вложение 88566
На скрине сделал тоже по 10 бит
Добрый день.
Помогите сообразить!
Пишу свой код типа счетчика моточасов. Готовые решения не устраивают, поэтому не плюйтесь.
А вопрос в следующем. Необходимо сохранять счетчик при потере питания и соответственно восстанавливать данные после подачи питания. Для этого я, вне функционального блока создал энергонезависимую переменную. Вход куда я ее записываю, и выход который изменяет эту переменную. Но при старте программа не успевает перебросит данные с входа на выход и переменная обнуляется. Точнее если написать в начале кода (первой строкой Vaur OUT := Var IN) То она успевает перезаписать и все вроде нормально. Но если поместить ее строкой ниже или не дай бог засунуть в условие типа IF. то она конечно не успевает пере записаться и обнуляется.
Возможно я изобретаю велосипед, подскажите как реализовать правильно эту функцию.
И от сюда вытекает второй вопрос. В программе мне необходимо использовать 2 блока. 1 это инициализация (выполняется один раз при старте) и 2 в цикле. Я использовал оператор IF c защелкой. (решение мне самому не нравится). Сейчас играюсь с функциями WHILE и REPEAT UNTIL. мне кажется они более правильные.
Есть ли какие-то более гибкие и правильные реализации этих двух вопросов?
Але-ндр Варианты, как понял тебя я (я делал такой блок на FBD, и он отлично работает):
1. Да! В коде ST положение строк ВАЖНО. Потому что они выполняются сверху вниз.
И если тебе надо сначала получить данные из VAR_IN_OUT, а потом выдать - то строки поулчения должны быть выше.
2. Если писать счётчик часов на FBD, то можно объявить энергонезависимую переменную прям внутри макроса (я так и сделал).
3. WHILE - это цикл. Я не уверен, что он нужен в этом блоке.
Вложение 88613 Вложение 88614
ДА.
Как это не парадоксально. но вся программа у меня также написана на FBD и уже давно работает (больше 2 лет).
А тут решил ( как говорится) ради самоистязания (в свободное время) изучить ST, и переписать уже работающую программу. (на самом деле готовлю обновление).
По этому все вопросы исключительно по ST.
Самая большая проблема что я не смог найти данных о времени выполнения тех или иных функций (тайминги реального процессора) хотя в принципе они не критичны. Опытным путем определил что Vaur OUT := Var IN корректно работает в первых трех строках.
И до сих пор не разобрался в приоритетах выполнения (последовательности функциональных блоков).
Почему разбиваю выполнение на 2 блока? На самом деле это мая (в некотором смысле ) прихоть не хочу нагружать цикл тупым переписываниями 14 переменных одними и теми же данными, обычно они прописываются при инициализации. К сожалению при определении переменных им можно задавать только константы. На сколько я помню (могу ошибаться, не хочу лезть в справочник) на запись уходит 3 такта процессор (3х14=42) а на функцию IF около 10.
Ситуация с "первыми тремя строчками" конечно странная - как я понимаю, при обработке ФБ его программа на ST обрабатывается полностью, прежде чем произойдёт запись в переменные, присоединённые к его выходам или начнётся обработка следующего ФБ. И поэтому все эти такты/тайминги влияют только на общее значение текущего времени обработки холста (времени цикла).
Выбор порядка выполнения блоков остаётся за компилятором, и можно повлиять на него лишь используя линии задержки. Наверное можно считать, что ФБ связанные непосредственной линией связи - будут обработаны последовательно,. Я бы хотел, чтобы на блоках отображался порядок их выполнения (хотя бы по вызову, как например в CDS3.5)
Не очень понятно, но, условно у вас есть счетчик А := А + time. Чтобы он был энергонезависмый, пишем Out := In + time, (In, Out - одна и та же энергонезависимая переменная на входе и на выходе).
По инициализации:
Код:if init then
основное тело
else
что надо сделать в момент первого запуска
end_if
init := true;
Але-ндр 1. Ой ой! Ты путаешь ПРку и микроконтроллеры. Тут НЕ надо считать такты и время цикла.
Потому что время цикла ПРки зависит от нагруженности её программы.
2. Внутри FUN/FB ST-код выполняется по строкам так, как написан.
3. Зря ты морочишься. Можно же часть программы писать на ST, а часть на FBD.
4. Про "Vaur OUT := Var IN корректно работает в первых трех строках" - показал бы весь код FBшки-то? Интересно, что же там такого ты накрутил!
Даже если не устраивают готовые решения, посмотреть как сделана инициализация и как сохранять данные можно было.
Пример Опер таймера (наработка) на ST и ФБ времени https://owen.ru/forum/showthread.php...l=1#post443096
И вы конечно изобретаете велосипед, IF наше всё, а с WHILE очень аккуратно.
Вложение 88652
Сделал программу, в режиме симуляции пытаюсь посмотреть, что происходит в той её части, что снизу справа, и есть ощущение, что эта часть даже не запускается. Для сравнения, в симуляции всей остальной программе на каждом входе и выходе показаны текущие значения, а тут их просто нет. В чём может быть дело?
Скорее всего переменная level нигде не используется. Она должна направляться на выход или выводиться на экран или быть энергонезависимой. Иначе вся ветка не обсчитывается
Здравствуйте !!!
Подскажите есть какой то механизм внутри среды.
Который позволяет выполнить запись или чтение 485 один раз после старта ?
Вот отсюда плясать
Вложение 88669
А как у Вас сразу опрос и чтение в одной переменной ?
Или это из мануала.
Я так понимаю делаем какую то дефлтную переменную с значением ноль.
На нее таймер с задержкой выключения и полуучаем допустим запись первую секундлу после старта.
Потом уже включаем чтение.
Я правильно понимаю, что при активации делается только одна попытка записи. А не циклично пока переменная true ?
На ПР200 есть запись и чтение одной переменной.
Вам лучше не читать однократно, а сделать инициализацию при включении из энергонезависимой переменной. А запись по изменению и так однократная при изменении.
В слейве вообще все сетевые сохраняются сами, если только мастер их не перезапишет при включении.
Вариант:
- создаёте обычную булеву needWrite и ставите её в "Запуск записи"
далее добавляете:
Вложение 88672
первый цикл выставит команду на запись
после записи ПР сбросит needWrite до следующего запуска
Добрый день, возникла проблема с выбором таймера для установки выдержки в данную схему Вложение 88679. Дело в том, что по условиям задачи таймер должен включится в тот момент когда ПИД достигнет уставки и более не реагировать на этот сигнал до конца процесса, уставка же выдержки должна задаваться с экрана. В примерах ОЛ есть подобный таймер (так во всяком случае выходит из его описания) написанный на ST, но при попытке создать fb при использовании данного примера ОЛ ругается на ошибки Вложение 88680.
Само же описание fb вот:
FUNCTION_BLOCK TP_timer //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL := FALSE;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
TP_1: SYS.TP;
END_VAR
//область кода
TP_1(I := I_in, T := T#1000ms);
//где ms - миллисекунды, s - секунды, m - минуты, h - часы, d - дни
Q_out := TP_1.Q;
END_FUNCTION_BLOCKFUNCTION_BLOCK TP_timer //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL := FALSE;
T_in : UDINT := 5000;//миллисекунд
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
TP_1: SYS.TP;
T_time: TIME;
END_VAR
//область кода
T_time := UDINT_TO_TIME(T_in);
TP_1(I := I_in, T := T_time, Q => Q_out);
END_FUNCTION_BLOCK
Возможно кто-то может объяснить данный казус?!! Прошу учесть, что я абсолютный невежда в данном вопросе.
У вас два кода слились вместе. Верхний надо убрать
Вложение 88682
Код 2 таймера должен быть таким, а у вас 2 блока вместе
Скрытый текст:
А ещё есть таймеры не только с задачей, но и выходом времени.
Новый таймер TON_P c ET и паузой, на ST, Версия 2.6.345.0____https://owen.ru/forum/showthread.php...39&page=42#420
Несколько вариантов таймера TP с паузой и без_________ https://owen.ru/forum/showthread.php...l=1#post470730
Новые таймеры TOF и TOF_P с выходом ET и паузой, BLINK со сбросом, Версия 2.6.345.0_____ https://owen.ru/forum/showthread.php...&page=358#3577
Таймер прямого и обратного отсчёта с задачей времени и памятью наработки____ https://owen.ru/forum/showthread.php...l=1#post461025
У меня просто самописный слейв. Панелька для приточной вентиляции.
Меняет расписание внутри себя.
На старте мастер туда загоняет расписание из своей энергонезависимой.
Потом мастер просто читает от туда раз в хх времени.
А не все ли равно?
из
видны 4 состояния:
1.процесса нет (вангую что приоритетный)
2.какой-то регулятор (пофиг какой) не вышел на уставку
3.что-то (пофиг что) активно заданное с экрана время
4.что-то из п.3 пошло лесом до конца света (нет)
Условия переходов достаточно очевидны.
Там любой таймер можно заюзать. Но нужны ли именно они (именно TP/TON/TOF) если ТС на ST колбасит и есть get_time?