Вы же тоже не написали какие действия производите, если пришла единица. Вот и я оставил пустое место, вставляйте код между лейбами и все, придет единица выполнится вычисление, будет ноль функция вернется без вычислений
Вид для печати
Тогда эту функцию можно вызывать бесконечно пока не появится единица?
А собака?
В ПЛК у вас для ожидания всё будет вызываться бесконечно. Тут подход к программированию другой. Циклы ожидания организовывать не надо, т.к. вы уже в бесконечном цикле.Цитата:
Тогда эту функцию можно вызывать бесконечно пока не появится единица?
Может просто без премудростей сделать свой ФБ?
http://i011.radikal.ru/1306/c3/5940a591af27t.jpg
Это не сложнее, чем стандартный unpack, см. библиотеку Util.lib
http://s018.radikal.ru/i507/1306/fe/64f2ca1e4282t.jpg
Здравствуйте. Просветите, пожалуйста, в таком вопросе. Можно ли задействовать дискретный вход ПЛК150 в качестве приемника импульсов с расходомера? Задача такая: имеется расходомер ПРЭМ с числоимпульсным выходом и ПЛК150-И-М. Необходимо подсчитать мгновенный часовой расход холодной воды. Максимальная частота расходомера 500Гц.
Нельзя. Обновление аналогового входа - 0,3 сек.
Счетчик подключите на дискретный вход, а другой сигнал на аналоговый.
raven34716 максимальная частота сигнала при программной обработке 1 кГц при программной обработке.
Инфа из каталога.
Но это если время цикла программы менее 1 мс.
у вас максимальная 500 Гц, уже 2 мс. должен успевать, если у вас до максимума к тому же доходить не будет.
А вот что означает макс 10 кГц при применении аппаратного счетчика для ПЛК 150 ? где-то настраивается в ПЛК ?
Всем добрый вечер.
Просьба камнями не кидать, начинающий.
Подскажите, как получить текущую TOD и желательно без секунд.
CurTimeEx тикает, можно добыть из него по отдельности что надо, но тогда ветвлений получится много при сравнении отдельно часов и минут.
Вижу RTC от Петрова, но CDT там в формате DT.
Задача - естественно, работа по расписанию. Много примеров посмотрел, но что-то не врублюсь никак.
Добрый день,
Если не затруднит, подскажите пжлст,
как ограничить количество знаков после запятой у переменной формата REAL без преобразований в другие типы.
в мануале по CodeSys не нашёл шаблона для записи формата.
Про количество знаков после запятой можно говорить только применительно к вводу или выводу числа, вы его куда отправляете (или откуда забираете)?
В библиотеке OSCAT есть ф-ция ROUND(in,N), выгядит она почти так:
Код:VAR_INPUT in : REAL;
N : INT;
END_VAR
VAR
X: REAL;
DECADES : ARRAY[0..8] OF REAL := 1.0,10.0,100.0,1000.0,10000.0,10000.0,100000.0,1000000.0,10000000.0;
END_VAR
X :=DECADES[LIMIT(0,N,8)];
ROUND := DINT_TO_REAL(REAL_TO_DINT(in * X)) / X;
To YuriBel
Наблюдаю за переменной в самой CodeSys в визуализации.
Есть ли возможность обрезать "хвост" у REAL на экране, без манипуляций c преобразованием типов.
Хотел ограничиться одним знаком после запятой.
To petera
Спасибо. Думаю эта функция решает вопрос, но сложновато.
Сам я пока решаю так, REAL x 10 -> INT -> REAL /10, но думал, что есть просто шаблон вывода.
Для визуализации есть и шаблоны вывода.
http://s017.radikal.ru/i434/1306/fc/0362b4513240t.jpg
To petera.
Большое спасибо. То, что надо.
Раньше я читал этот фрагмент, но тогда не понял, что куда подставлять.
Никто мой вопрос не увидел ))):
>>> Всем добрый вечер.
Просьба камнями не кидать, начинающий.
Подскажите, как получить текущую TOD и желательно без секунд.
CurTimeEx тикает, можно добыть из него по отдельности что надо, но тогда ветвлений получится много при сравнении отдельно часов и минут.
Вижу RTC от Петрова, но CDT там в формате DT.
Задача - естественно, работа по расписанию. Много примеров посмотрел, но что-то не врублюсь никак.
необходимые библиотеки: SYSLIBTIME.lib, STANDARD.lib
VAR
GetTime:CurTimeEx;
Sys_Time:SysTime64;
SYST:SystemTimeDate;
SYSTIME:TOD;
END_VAR
SYST.Day:=0;
SYST.DayOfWeek:=0;
SYST.dwHighMsec:=0;
SYST.dwLowMSecs:=0;
SYST.Hour:=0;
SYST.Milliseconds:=0;
SYST.Minute:=0;
SYST.Day:=0;
SYST.Month:=0;
SYST.Second:=0;
SYST.Year:=0;
GetTime(SystemTime:=Sys_Time, TimeDate:=SYST);
SYSTIME:=STRING_TO_TOD(CONCAT(CONCAT(CONCAT('TOD#' ,UINT_TO_STRING(SYST.Hour)) ,':') ,UINT_TO_STRING(SYST.Minute)));
ЗЫ: может быть последняя строчка индусами попахивает, но я делал так.
Вариантов-то сколько сразу ))))
спасибо, что вы такие отзывчивые есть.
обязательно попробую их все, хотя, CurTimeEx как-то понятнее работает.
а вот через 0:00 не просто будет перескочить, как я понимаю? 1,00 не будет больше 23,00 без доп вычислений ?
Технологические сутки делятся на неравные 2 части. Начало суток никогда не будет в 00,00. В разных интервалах насос работает в разных режимах по блинку. Тут не привязаться к таймерам, которые при перебоях электроэнергии будут скидываться в нули. Надо плясать от системного времени. Ну да ладно, это уже не такая большая проблема.
Нарисовал линейку на листе - на самом деле проблем с 0 нет, так что одна баба с воза ушла
Вообщем здесь манипуляции с системным временем и время/дата в строки
В строки - одной функцией с задаваемым свободным форматом
Здравствуйте, такой вопрос.
У меня есть модуль ввода и ПЛК, к которому так же подключена коробка управления магнитопроводом. Посоветуйте пожалуйста, как получать разницу значений модуля ввода при включенном 1 входе ПЛК и при включенном 2 входе ПЛК. Можно - ли объединить значение МВ и 1 входа ПЛК в одну переменную, и значение МВ и 2 входа ПЛК в другую переменную? И как это сделать?
Попробую по - другому описать проблему)Цитата:
Вроде написано по русски, но ни чего не понятно
Мне нужно сравнить значение модуля ввода, при включении 1 и 2 входа ПЛК.
Возможно ли задержать выполнение программы на ПЛК?
Т.е. некий аналог фукции Sleep, чтобы программа остановила свое выполнение и через, например 50 мс, продолжила с того же места. Есть таймеры, но они, насколько я понимаю, выполнение программы не прерывают.
Поясню для чего это нужно, допустим пришла команда по сети сменить направление вращения движка, для ПЛК это значит выключить один дискретный выход и включить другой. без задержки эти действия выполнять нельзя. Можно, конечно, сделать это на таймерах, но функция sleep была бы удобнее
Не изобретайте велосипед, это неправильный подход. Программа в контроллере должна работать постоянно, это основа безопасности. То, что вам нужно, без труда делается на таймерах.
При управлении исполнительными механизмами с тремя состояниями (Открыть-Откл-Закрыть; Влево-Откл-Вправо...) проще всего использовать программу или ф.блок на языке SFC. Т.к очень просто реализуется блокировка одновременного включения управляющих выходов, если присутствуют оба сигнала управления Откр и Закр.
http://s004.radikal.ru/i208/1306/80/3e5276bd10c9t.jpg
И кроме того в этой простейшей программе автоматически обеспечивается задержка между изменениями состояния выходов ПЛК равная одному циклу без каких-либо дополнительных ухищрений
Если состояния входов Откр=1, Закр=0 одновременно изменится на Откр=0, Закр=1, то выход Откр станет равным 0 в текущем цикле, а выход Закр включится только в следующем цикле.
Продлить задержку между переключениями выходов на время больше, чем время одного цикла тоже очень просто, без дополнительных таймеров
http://s017.radikal.ru/i402/1306/61/76abc4fafaf5t.jpg
Немного не так. У меня один тип входов BOOL, это входы на контроллере, а второе значение - это значение с модуля ввода, оно REAL. Обозвал это значение например izm. Так вот, можно - ли объединить в одну переменную izm и in1, а в другую переменную izm и in2. А потом сравнивать значения?Цитата:
В конфигурации дайте имена входам, например in1 и in2.
В программе:
IF in1 AND in2 THEN
<сравниваем что нужно>
END_IF
Это если нужно что-то сравнить при включенных входах in1 и in2. Тип входов BOOL.
Здравствуйте, я новичок, у меня 2 вопроса 1) как на языке ST сделать авто подхват кнопки (кнопку нажал пришла единица и она осталась, а кнопка отошла) и 2) написал программу на SFC упрощенном -первый цикл проходит в конце выставляю все значения в начальные, на 2 цикле программа будто цикла не замечает летает по кругу (специально на условиях переключения останавливал - в тело ШАГА она не заходит а сразу на условие перехода) хотя я может не правильно её понял?
Спасибо Amn, а нет идей по по воду 2 -го вопроса - там проблема после прохождения первого цикла счетчик не сбрасывается (CTU) через Reset. Не знаешь его принудительно как нибудь сбросить можно?