Возникла такая необходимость. Нужно фиксировать данные на 5 секунд, а не на один цикл на выходе D блока TREND библиотеки BASIC OSCAT. Сутки голову ломаю, ни одной мысли.
Вид для печати
Возникла такая необходимость. Нужно фиксировать данные на 5 секунд, а не на один цикл на выходе D блока TREND библиотеки BASIC OSCAT. Сутки голову ломаю, ни одной мысли.
Вы бы чуть конкретнее, что за программа?
Codesys 3.5
Пишу нв CFC. Мне данные с выхода нужны для дальнейшей обработки и управления приводом, а так как данные появляются только на один цикл, я не могу привязать управление двигателем.
Адаптируйте под свои нужды и "заверните" в функциональный блок указанный выше код, который потом используйте в CFC.Код:VAR
TON1 : TON;
Trig1 : R_TRIG;
B1 : BYTE;
Var1 : BYTE;
END_VAR
B1 := B1 + 1;
TON1(IN := NOT TON1.Q, PT := T#5000MS);
Trig1(CLK := TON1.Q);
IF Trig1.Q THEN
Var1 := B1;
END_IF
🙂Я на язык ST смотрю и ничего не понимаю, для меня это темный лес. Я так понимаю, нужно созжать ФБ по этому коду. Нужно дописать вход и выход как я понимаю. Вход будет B1, а выход Var1, как чтоли?
На вход подается значение REAL, а на этом выходе на один цикл появляется значение на которое изменился вход. Через некоторое время значение входа меняется, на выхода данные на сколько изменились данные на один цикл. А мне нужно эти данные привязать к счетчику импульсов.
Ну так REAL на входе может меняться непрерывно, значит и на выходе D в каждом цикле будет новое значение?
Вот код блока TREND:
У вас каждый цикл значение на выходе D меняется, если вы "выхватываете" и задерживаете одно значение, то теряете несколько следующихКод:FUNCTION_BLOCK TREND_DW
VAR_INPUT
X : DWORD;
END_VAR
VAR_OUTPUT
Q : BOOL;
TU : BOOL;
TD : BOOL;
D : DWORD;
END_VAR
VAR
last_X: DWORD;
END_VAR
IF X > last_X THEN
TU := TRUE;
TD := FALSE;
D := X - last_X;
Q := TRUE;
ELSIF X < last_X THEN
TD := TRUE;
TU := FALSE;
D := last_X - X;
Q := FALSE;
ELSE
TU := FALSE;
TD := FALSE;
D := 0;
END_IF;
last_X := X;
Лучше опишите в чём задача, возможно нужен другой подход