скорее всего имелось ввиду Вложение 69623 нельзя сразу целочисленное прогнать через маску
Вид для печати
скорее всего имелось ввиду Вложение 69623 нельзя сразу целочисленное прогнать через маску
Вопрос к разработчикам, может конечно, его раньше и задавали, но ответа не нашел к сожалению.
Планируется ли в принципе использование функций и функциональных блоков ST внутри макросов, или нет?
И если да, то когда примерно это может произойти?
to ASo
опс.
Посмотрим
//
еще бы чек лист что исправлено/добавлено
to nnnn1
ну вооще
читаем ...
Мельком посмотрел новую версию, лучше стало с всплывающими окнами, но при выделении и перемещении элемента(группы элементов) на холсте всплывающая подсказка загораживает место, куда перемещаю элемент, приходится вслепую ставить, затем поправлять, это конечно не так критично, просто небольшое неудобство!
Когда планируется добавление стандартных FB типа R_TRIG, TON, TOF, PID и т.д. (библиотеки standard и util из Codesys)?
zaychenko так вы можете сами добавить, или вы хотите как Валенок писал
x := r_trig; ?
Триггеры то ладно, но каких-то средств для работы с временнЫми интервалами точно не хватает
Да, библиотеки конечно не хватает...
Городить все стандартные блоки лениво...
Да и отсутствие TIME не очень радует, хотя программа не даёт использовать имя TIME в качестве переменной, скорее всего работы ведутся и имя переменной уже зарезервировано.
Использую для тестов время цикла, не знаю на сколько такой вариант верный, но, как мне кажется, он более менее точный:
function_block times
var_input
T_cycle:udint;
end_var
var_output
T : udint;
end_var
var
M:udint;
end_var
M:=T;
T:=M+T_cycle;
end_function_block
А Таймер TOF получился такой (используя ФБ ST Tites)
function_block TOF
var_input
IN:bool;
PT:udint;
T_cycle:udint;
end_var
var_output
Q:bool;
ET:udint;
end_var
var
M:bool;
StartTime:udint;
T:times;
end_var
T();
T.T_cycle:=T_cycle;
if IN then
Q:=true;
ET:=0;
else
if M then
StartTime:=T.T;
end_if
if Q then
ET:=T.T-StartTime;
if ET>=PT then
Q:=false;
ET:=PT;
end_if
end_if
end_if
M:=IN;
end_function_block
Ну как временный эрзац. Если задача тяжелая - то может имеет смысл проверить "циклов за секунду"
А по поводу fb times - даже сейчас нужен ли он ? Во всех блоках типа TON/TOF/BLINK/PID/... локальный "readonly" t := t + 1 изобразит TIME()
Внезапно оказавшийся 1.754мс за цикл тоже не проблема и сейчас
Вложение 69661Вложение 69662
В ПР205 (думаю что и в 103-ем),есть системное время в мс, и их можно использовать для реального времени блоков TON\TOF\TP и прочих.
yura2507 а не могли бы выкладывать код закрывая его тегами, чтобы можно было развернуть и скопировать? спасибо.
R_TRIG Триггер переднего фронта, от слова Raise
F_TRIG Триггер заднего фронта, от слова FallКод:function_block R_TRIG
var_input
I:bool;
end_var
var_output
Q : bool;
end_var
var
M:bool;
end_var
Q:=false;
if I and not M then Q:=true; end_if
M:=I;
end_function_block
Код:function_block F_TRIG
var_input
I:bool;
end_var
var_output
Q : bool;
end_var
var
M:bool;
end_var
Q:=false;
if not I and M then Q:=true; end_if
M:=I;
end_function_block
Спасибо, полезно, когда ни на что не остается свободного времени и кто-то уже переписал или создал FB на ST...
Код:function_block R_TRIG
var_input
I:bool;
end_var
var_output
Q : bool;
end_var
var
M:bool;
end_var
(*
Q:=false;
if I and not M then Q:=true; end_if
*)
Q:=I and not M;
M:=I;
end_function_block
Код:function_block F_TRIG
var_input
I:bool;
end_var
var_output
Q : bool;
end_var
var
M:bool;
end_var
(*
Q:=false;
if not I and M then Q:=true; end_if
*)
Q:=not I and NOT M;
M:=NOT I;
end_function_block
То, что вы называете передним фронтом называется просто фронт. То, что вы называете задним фронтом называется срез.
Ибо, передний фронт - масло масляное, а задний фронт - полный абсурд. Фронт - это то, что спереди.
https://ru.wikipedia.org/wiki/Фронт
capzap выкладывать чтобы каждый не писал по кругу одно и то же, тем более из oscat.
Посмотрел, кто-то уже выдернул TOF, значит можно его себе не переписывать а переписать то, чего еще нет.
Ну в программе ОЛ они так называются:
1. Детектор переднего фронта
2. Детектор заднего фронта
Вот так, выложишь что-то, для таких же не особо далёких как и сам (я про себя), чтобы упростить жизнь всем, и узнаешь кучу нового, в том числе и о себе. Будем внимательней и прочитаем стандарт IEC 61131-3, где про фронт и срез говорится следующим маслом - R_TRIG - Rising Edge Detector, F_TRIG - Falling Edge Detector. Обратимся к официальной справке Овен Лоджик, там сказано следующее - Детектор переднего фронта импульса (RTRIG). Обратимся к CodeSys2.3 - Функциональный блок R_TRIG генерирует импульс по переднему фронту входного сигнала. Ну и CodeSys 3.5 - Функциональный блок для выявления переднего фронта.
Вынужден учиться на том, что дают.
Да будет так, первый фронт, и Второй фронт = тушенка и все что там с этим было связано :)
Newcomer мне кажется излишне придираться там, где все прекрасно понимают о чем речь. Если вдруг вы не поняли о чем, то надо что-то менять в датском королевстве.
Не могу понять где ашыпка. При первом запуске внутренняя переменная EMA(t) := входному значению, все последующие итерации выполняются по формуле расчета скользящего экспоненциального. Но при симуляции получается иначе. Первый проход так-же считается по формуле EMA(t) = coef * input + (1 - coef) * EMA(t-1), хотя сброс переменной первого запуска проходит и сброс фильтра, если его активировать, так-же выполняется.
Код:function_block EMA // Фильтр экспоненциальное скользящее среднее
var_input
input : real; // Вход
coeff : real; // Коэффициент от 1(min) до 0(max)
reset : bool; // Сброс фильтра
end_var
var_output
output : real; // Выход
end_var
var
EMAt : real;
first_run : bool := true;
end_var
if (reset = true) OR (first_run = true) then
EMAt := input;
first_run := false;
else
EMAt := coeff * input +(1 - coeff)*EMAt;
end_if
output := EMAt;
end_function_block
Нет ошибки. При симуляции считает правильно. 2.4.334.0
Возможно в составе чего-то большего не так симулятор считает, но один блок на холсте без ошибок.
if reset OR first_run then - так короче, переменные и так булевы.
Зачем так категорично ? https://ru.wikipedia.org/wiki/%D0%A4...B0%D0%BB%D0%B0
Слова могут иметь несколько значений, в зависимости от контекста! Например: во время ВОВ был Волховский фронт, явно, фронт здесь в другом значении!
Речь была о фронтах эл. сигнала (импульса), а ссылка была на военные действия. При этом есть конкретное понятие (ссылку дал) , да и учили нас давно так.
ФБ для конвертации BCD формата панелей, HEX в DEC и обратно DEC в HEX, пришлось переделать из функций, для приёма времени из панели ИП320.
Время там в шестнадцатиричной системе, да ещё и совмещено год с месяцем, день с часами, минуты с секундами.
В панелях СП307, СП310 время тоже передаётся в BCD формате, только отдельными регистрами.
Чтобы их разделить функции не достаточно. На скрине 2308 (год 23, месяц 08) принимается как 8968 Вложение 69715
Код:function_block HEX_DEC // Конвертация из Шестнадцатиричной в Десятичную
var_input
x: udint;
end_var
var_output //объявление выходных переменных
Q,Q1,Q2 : udint;
end_var
Q := x/4096 MOD 16*1000+x/256 MOD 16*100+x/16 MOD 16*10+x MOD 16;
Q1:=Q/100; Q2:=Q-Q1*100;
end_function_block
Код:function_block DEC_HEX // Конвертация из Десятичной в Шестнадцатиричную
var_input
x: udint;
end_va
var_output //объявление выходных переменных
Q,Q1,Q2 : udint;
end_var
var
a,b,c,d: udint;
end_var
a:=x/1000; b:=(x-a*1000)/100; c:=(x-a*1000-b*100)/10; d:=x-a*1000-b*100-c*10;
Q := a*4096 + b*256+c*16+d; Q1:=Q/100; Q2:=Q-Q1*100;
end_function_block