Триггер RS2 не соединён с SR2, оттяните и посмотрите.
Кол-во срабатываний 2 - переменная не энергонезависимая.
Вид для печати
kondor3000, спасибо большое! Точно соединение отвалилось. Из-за близкого расположения и небольшого экрана ноутбука не заметил. Впредь постараюсь быть внимательнее. Еще раз спасибо!
Здравствуйте.
Подскажите, пожалуйста, есть ли возможность реализовать выполнение группы математических операций по некому триггеру (булевому)?
Извиняюсь, если это уже где-то обсуждалось, не нашёл.
Вот в проекте по булевому сигналу выполняется запись заводских значений(значений по умолчанию):
Вложение 85420
Здесь сумматор делал: https://owen.ru/forum/showthread.php...l=1#post183127
Вложение 85422
Мне кажется лучше делать на ST. Вроде как при наличии if если условие не выполнено то код исполняться не будет, в отличии от FBD, где цепочка кода исполняется полностью.
Спасибо за ответы.
На ST понятно. Интересовало именно на FBD, люблю, когда программа наглядна.
Возник вопрос такого рода!
Есть такие, блоки записи и считывания значений в функциональные блоки, с записью все понятно, а вот со считыванием, тоже вроде все понятно, но не понятно мне зачем мне этот блок показывает то что я туда записал, это я и так знаю, мне бы знать в каком он сейчас значении находится (сколько миллисекунд он отсчитал или сколько осталось отсчитать и.т.д.), но он этого не показывает, он показывает уставку, не я понимаю, что иногда это может быть и нужно, но даже по логике вещей, я полагал, что он считывает текущее значение, а это не так и для этого нужно городить еще целый ворох ФБ или я не так что то делаю? :)
Возможно что-то не так делаете. Можно и читать, что записано. Были примеры ПЗУ от Сергей308, использовал для сохранения аварий в журнале, и соответственно мог прочитать по кругу, какие аварии были, то есть записаны давно.
То что записано, это ежу понятно, мне надо что сейчас в нем в данный момент времени!
Ну например: Есть ФБ TON (таймер задержки включения) и как бы мне нужно видеть сколько времени осталось до этого самого включения, а он этого не показывает, он показывает то что я в него записал, я это и так знаю!:)
Когда я в симуляторе в отладке программы я вижу как там меняется значение, когда в Он-Лайн отладке уже ничего не видно, но это ладно, вот эти бы значения считывать и выводить на дисплей или далее в программу если есть такая необходимость...
Ну была сначала мысль, что этот блок считывания настраивается, типа какие данные считывать, уставку или динамику, но этого тоже нет!
тю, ну ведь делали люди таймеры на ST и даже на FBD с выводом пройденного времени. Штатные не поддерживают такого. Овен не предусматривал :)
Надо использовать самописные таймеры и получить ET (отсчёт таймера). Тут первые 2 ссылки на TON и TOF, есть с паузой и без.
В примерах программ есть ещё много всего, есть и таймер TP.
https://owen.ru/forum/showthread.php...=9&p=429061#81
И все же городить пришлось, там нет ФБ TP (Импульс включения заданной длительности), там по ссылкам нет такого на ST, а я пока на ST не силен, поэтому он у меня получился аляповатым, т.е. по факту считает в 2 раза медленнее, хотя я почти уверен, если считать не миллисекундах а в секундах, то будет норм, в общем вот:
Вложение 85479
Ну и собсно сама программа, если кому такое барахло нужно:
https://owen.ru/forum/attachment.php...1&d=1756469102
Если кто напишет на ST, что нить похожее будет полезно... :)
Не претендую на оптимальность
Код:function_block fbTP
var_input
IN : bool;
PT : udint;
RST : bool;
end_var
var_output
Q : bool;
ET : udint;
end_var
var
st, tm : udint;
fl : bool;
end_var
tm := time_to_udint(get_time());
if RST then
Q := false;
elsif IN and not fl then
Q := true;
st := tm;
end_if
if Q then
ET := tm - st;
if ET >= PT then Q := false; end_if
else
ET := PT;
end_if;
fl := Q or IN;
end_function_block
Вариант 2:
Вложение 85482
Код:function_block TP
var_input
I : bool; // Входной импульс
T : udint; // Время в мс
end_var
var_output
Q : bool; // Выход
ET : udint; // Текущее значение таймера с обратным отсчетом
end_var
var
ts, d : udint; // Фиксация системного времени и дельты
rt : SYS.RTRIG; // Тригер фронта
end_var
rt(I := I and not Q); // Фиксируем начало нового импульса
if rt.Q then
ts := time_to_udint(get_time()); ET := T; Q := true; // Фиксируем продолжительность и начало импульса
end_if
if ET > 0 then
d := time_to_udint(get_time()) - ts; ts := ts + d; // Прошло времени в мc
if ET > d then
ET := ET - d; // Уменьшаем ET на это время
else
ET := 0; Q := false; // Иначе фиксируем завершение импульса
end_if
end_if
end_function_block
Вот сто лет тому назад выкладывал таймер с прямым и обратным отсчётом времени:
https://owen.ru/forum/showthread.php...l=1#post353353
Вы как будто только сегодня после обеда с луны упали, мне так кажется!
Раз пошла такая пьянка то тоже выложу свое.
Принципиальным считаю имена. Одно имя - одно поведение для портаций туды-сюды
Лишних полей не люблю
Запись без уступов терпеть не могу
Код:function_block TP
//полный эквивалент Кодесис/Standart/TP с ТЕМ ЖЕ дебильным мерцанием при PT = 0 IN = TRUE
var_input //описание полей - см справка Кодесис
IN: bool;
PT: udint; //мс
end_var
var_output
Q : bool;
ET: udint; //мс
//++ к Кодесис/Standart/TP
REM: udint; //мс, оставшееся время работы
end_var
var
StartTime: time;
end_var
if Q then
ET := time_to_udint(get_time() - StartTime);
if ET >= PT then
ET := PT;
end_if
Q := ET < PT;
REM := PT - ET;
elsif not IN then
ET := 0;
REM := PT;
elsif ET = 0 then
StartTime := get_time();
Q := true;
end_if
end_function_block
Добрый день! Подскажите пожалуста, вот на ST выражениеЖ
if LE_PR AND PUSK OR PUSK_F_RIGT AND NOT L_KONC AND NOT STOP then
MOTOR :=TRUE;
PUSK_F_RIGT:=true;
ELSE
MOTOR :=false;
PUSK_F_RIGT:=false;
А это скрин сииммуляцциии его в лоджике
end_ifВложение 85485. вопрос _почему когда входные переменные:
LE_PR=1 PUSK=1 и L_KONC=1 выходная переменная MOTOR тоже равна 1 хотя условие and not L_KONC должно запрещать выходной переменной MOTOR true? Наверное я чегото с синтаксисом не так написал?
Влияет
OR PUSK_F_RIGT
Если написать например так
if (LE_PR AND PUSK OR PUSK_F_RIGT) AND NOT L_KONC AND NOT STOP then
то будет работать
спасибо, сейчас попробую. Только сейчас заметил что задал вопрос не втой ветке и продублировал его в ,,правильной,,
Да все верно, работает.БЛАГОДАРЮ
Операция and - это логическое умножение, or - сложение. И приоритеты у ниж такие же как в обычной математике. Т.е., в вашем случае получилось:
1 * 1 + 1 * 0 * 1 = 1 + 0 = 1. Так что выделяйте нужный порядок скобками
А еще, так, для справки, выражение not A and not B можно записать как not (A or B), ну и, также not A or not B = not (A and B)
Я б ещё добавил, что если юзается чисто бинарное выражение (if else) да ещё и и с присвоением по сути результата if, то сам if не нужен, можно просто присвоить
Мотор := логическое выражение //выше норм сказали
А второй переменной (здесь) присвоить Мотор
В кодесис можно было бы сделать сквозное присвоение
Мотор := вторая переменная := логическое выражение
Теперь,наверное, в правильной ветке задам вопрос. Напмсал ФБ на ST_проверил его в симуляторе все работает ошибок нетВложение 85487
Перенес его на основной ,,холст,, лоджика_плдключил необходимые переменные_ включаю симуляцию и две из четырех переменных привязаных к физичиским входам не активны в симуляторе (на скрине их отметил красными стрелками)
Вложение 85488. Если одну из этих ,, мертвых,, перееемеых ,,отвязываю,, от ФБ и соединяю с любым из не используемых выходов на ,,холсте,, она,,оживает,,.. Прикручиваю оббраатно - вхоод нова становиться не доступным . Может кто подскажет что с ними не так?
В качестве эксперимента отсоеденил от ФБ ,,мертвый,, *Пуск_П* и к нему прикрутил используемый в другом участке схемы физичиский вход *З_право* - вс нормально вход доступен в симуляции, значит дело не в написаном мною ФБ.Вложение 85489
Точно, вот я шляпа Спасибо!
Вот этот подошел, работает как надо, у Dimensy тоже работает как положено, но отсчет времени прямой, это не претензия, просто мне нужон обратный :), будет время постараюсь вникнуть и модифицирую под себя, ну типа булевое значение введу, типа 0 прямой счет, 1 обратный или наоборот, но все равно спасибо, буду начинать изучать ST...
А вот у kondor3000, сначала не понял, потом дошло, в общем нужно в ms, там в коде "PT:=PT*1000" тыщу заменил на единицу и стало как надо, или эту строку вообще можно убрать? :)
В общем всем спасибо! :)
Мне кажется это бред сивой кобылы, в смысле, выводить на индикацию обратный отсчёт времени в миллисекундах, они будут мигать и всё!
Короче, максимум это уставка в миллисекундах, ещё куда не шло и то возможна большая погрешность равная времени цикла программы + время включения(выключения) выходного реле!
Да вы правы, но я хочу уточнить, эта информация лично для меня, т.е. я просто делаю стенд, для тестирования другого девайса, и мне хочется видеть на каком этапе идет процесс, а почему миллисекунды, ну все до банальности просто, мне лень там вешать на выходе доп. ФБ... А так да, если бы эта инфа несла бы какой нибудь смысл, то это было бы в секундах, а то и в минутах... :)
И потом я просто пытаюсь понять как писать на этом языке, не более того... :)
Доброе время суток! Делаю освещение в дом. Скажите пожалуйста можно ли обьединить два ПРМ-220 по RS485 чтобы принажатие кнопки (МАСТЕР СВЕТ) срабатывали оба ПРМ.
Проблема в том что у ПРМ нет RS485, в смысле, это модули расширения по внутренней шине, без ПР, что их поддерживает, они абсолютно бесполезны!
Просто любопытно, зачем Вы их накупили, если у вас нет ПР?
Короче, подключайте каждое ПРМ к своему ПР, а ПР можно объединить в сеть!