PDA

Просмотр полной версии : Данные с ЛабВЬю



ASka
07.03.2015, 13:45
Здравствуйте!
Парни подскажите пожалуйста, я сейчас занимаюсь изучением кодесиса и контроллеров овен.
Научился соединять контроллер с Лабвью через Модбас все хорошо контроллер берет значения с Лабвью и передает ему значения.
Вопрос в другом, допустим у меня с Лабвью поступают некоторые булева значения в контроллер, к примеру каждые 2-5 секунд (время плавающие) мне нужно чтобы выход на контроллере загорался через 12-17 секунд (то же время плавает). Но при этом пока откроется выход на контроллере, не был пропущен ни один сигнал с Лабвью. То есть мне получается нужно создать что то типа ячейки временных данных которые бы по очередно запускали выход на контроллере в различное время.

lara197a
07.03.2015, 14:01
Создайте к примеру переменную 2-х битную.
в ней к битам привяжите входящие команды.
команда устанавливает бит. Запускаете таймер задержки включения.
как таймер отработал- включаете выход, сбрасываете бит и включаете таймер задержки выключения (или ТР).
как сработала задержка выключения, сбрасываете выход.
Вариантов реализации много. нужно точно знать задачу.

ASka
07.03.2015, 14:25
Спасибо за быстрый ответ. Если честно не со всем разобрался, можете подсказать где найти пример или почитать о данной моей проблеме. С Таймерами включения и отключения разобрался, главное теперь запись значений с Лабвью и по очердное их отработаботка

lara197a
07.03.2015, 14:27
я не знаю что такое лабвью и что вам нужно включать-выключать.

ASka
07.03.2015, 14:56
Labview это среда программирования графическая там есть включатели (0 или 1) эта кнопка включения привязана к переменной Х1 в кодесисе через модбас. То есть включая или отключая выключатель в Лабвью я подаю значение TRUE FALSE переменной Х1 (к примеру за 10 секунд выключатель срабатывает несколько раз и несколько раз подает Тру на переменную Х1), в свою очередь переменная Х1 запускает дискретный выход на контроллере О1 через 12 секунд после получения сигнала от выключателя. Получается что пока сработает сигнал на О1 с выключателя поступит несколько сигналов, а срабатывает только один сигнал. То есть надо создать какой-то временный буфер хранения, в который запишутся все сигналы с выключателя Лабвью и потом эти сигналы будут включать дискретный выход контроллера О1, в порядке своего прихода в буфер. Как то так. Прошу Вас ткнуть где искать или как это реализовать, заранее спасибо.

lara197a
07.03.2015, 15:00
тогда создайте битовый массив.
при получении сигнала
записываете в переменную
и сдвигаете массив на единицу вниз.
Прочтите про массив в справке.
сдвигать циклически удобно через FOR.
если проще(но не так красиво), то через счетчик.
номер счетчика- номер переменной в массиве.

amn
07.03.2015, 17:44
с Лабвью поступают некоторые булева значения в контроллер, к примеру каждые 2-5 секунд (время плавающие) мне нужно чтобы выход на контроллере загорался через 12-17 секунд
Неувязочка получается: будет очень быстро переполняться очередь. К тому моменту, когда контроллер выдаст один сигнал в очередь добавляется еще 3-8 сигналов.

lara197a
07.03.2015, 22:18
Вы так алгоритм описали.
Я понял, что Вам нужно.

petera
08.03.2015, 00:38
Вот здесь было про звено запаздывания http://www.owen.ru/forum/showthread.php?t=19268&p=152225&viewfull=1#post152225
Правда ФБ FT_TNхх из OSCAT работают с переменными REAL, по этому изменил тип на BOOL

FUNCTION_BLOCK DELAY_BOOL
VAR_INPUT
in : BOOL;
T : TIME;
END_VAR
VAR_OUTPUT
out : BOOL;
trig: BOOL;
END_VAR
VAR
LENGTH : INT := 32;
X : ARRAY[0..31] OF BOOL;
cnt : INT;
last : TIME;
tx: TIME;
init: BOOL;
END_VAR
tx:=TIME();
trig := FALSE;
IF NOT init THEN
x[cnt] := in;
init := TRUE;
last := tx;
ELSIF tx - last >= T / length THEN
IF cnt = length - 1 THEN cnt := 0; ELSE cnt := cnt + 1; END_IF;
Out := X[cnt];
x[cnt] := in;
last := tx;
trig := TRUE;
END_IF;

17027


http://youtu.be/QohmtDMQvVo

ASka
08.03.2015, 09:00
Спасибо всем большое, после праздника углубленно разберусь. А так вариант Petera практически то что нужно. Так же нашел задачку Аmnа в другой теме тоже подходит под мой вариант за исключением того что задержка в заданном интервале идет на группу сигналов, а не на каждый отдельный сигнал. Так что спасибо Вам за информацию будем учиться.

petera
08.03.2015, 14:37
...за исключением того что задержка в заданном интервале идет на группу сигналов, а не на каждый отдельный сигнал.
Достаточно заменить тип данных для ФБ, например с BOOL на BYTE, и он будет задерживать сразу группу из восьми сигналов

FUNCTION_BLOCK DELAY_BYTE
VAR_INPUT
in : BYTE;
T : TIME;
END_VAR
VAR_OUTPUT
out : BYTE;
trig: BOOL;
END_VAR
VAR
LENGTH : INT := 32;
X : ARRAY[0..31] OF BYTE;
cnt : INT;
last : TIME;
tx: TIME;
init: BOOL;
END_VAR
tx:=TIME();
trig := FALSE;
IF NOT init THEN
x[cnt] := in;
init := TRUE;
last := tx;
ELSIF tx - last >= T / length THEN
IF cnt = length - 1 THEN cnt := 0; ELSE cnt := cnt + 1; END_IF;
Out := X[cnt];
x[cnt] := in;
last := tx;
trig := TRUE;
END_IF;

17034

http://youtu.be/92O83CorFgg
Можно сделать на 16 сигналов(WORD) или 32(DWORD)