Просмотр полной версии : Данные с ЛабВЬю
Здравствуйте!
Парни подскажите пожалуйста, я сейчас занимаюсь изучением кодесиса и контроллеров овен.
Научился соединять контроллер с Лабвью через Модбас все хорошо контроллер берет значения с Лабвью и передает ему значения.
Вопрос в другом, допустим у меня с Лабвью поступают некоторые булева значения в контроллер, к примеру каждые 2-5 секунд (время плавающие) мне нужно чтобы выход на контроллере загорался через 12-17 секунд (то же время плавает). Но при этом пока откроется выход на контроллере, не был пропущен ни один сигнал с Лабвью. То есть мне получается нужно создать что то типа ячейки временных данных которые бы по очередно запускали выход на контроллере в различное время.
lara197a
07.03.2015, 14:01
Создайте к примеру переменную 2-х битную.
в ней к битам привяжите входящие команды.
команда устанавливает бит. Запускаете таймер задержки включения.
как таймер отработал- включаете выход, сбрасываете бит и включаете таймер задержки выключения (или ТР).
как сработала задержка выключения, сбрасываете выход.
Вариантов реализации много. нужно точно знать задачу.
Спасибо за быстрый ответ. Если честно не со всем разобрался, можете подсказать где найти пример или почитать о данной моей проблеме. С Таймерами включения и отключения разобрался, главное теперь запись значений с Лабвью и по очердное их отработаботка
lara197a
07.03.2015, 14:27
я не знаю что такое лабвью и что вам нужно включать-выключать.
Labview это среда программирования графическая там есть включатели (0 или 1) эта кнопка включения привязана к переменной Х1 в кодесисе через модбас. То есть включая или отключая выключатель в Лабвью я подаю значение TRUE FALSE переменной Х1 (к примеру за 10 секунд выключатель срабатывает несколько раз и несколько раз подает Тру на переменную Х1), в свою очередь переменная Х1 запускает дискретный выход на контроллере О1 через 12 секунд после получения сигнала от выключателя. Получается что пока сработает сигнал на О1 с выключателя поступит несколько сигналов, а срабатывает только один сигнал. То есть надо создать какой-то временный буфер хранения, в который запишутся все сигналы с выключателя Лабвью и потом эти сигналы будут включать дискретный выход контроллера О1, в порядке своего прихода в буфер. Как то так. Прошу Вас ткнуть где искать или как это реализовать, заранее спасибо.
lara197a
07.03.2015, 15:00
тогда создайте битовый массив.
при получении сигнала
записываете в переменную
и сдвигаете массив на единицу вниз.
Прочтите про массив в справке.
сдвигать циклически удобно через FOR.
если проще(но не так красиво), то через счетчик.
номер счетчика- номер переменной в массиве.
с Лабвью поступают некоторые булева значения в контроллер, к примеру каждые 2-5 секунд (время плавающие) мне нужно чтобы выход на контроллере загорался через 12-17 секунд
Неувязочка получается: будет очень быстро переполняться очередь. К тому моменту, когда контроллер выдаст один сигнал в очередь добавляется еще 3-8 сигналов.
lara197a
07.03.2015, 22:18
Вы так алгоритм описали.
Я понял, что Вам нужно.
Вот здесь было про звено запаздывания 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
Спасибо всем большое, после праздника углубленно разберусь. А так вариант Petera практически то что нужно. Так же нашел задачку Аmnа в другой теме тоже подходит под мой вариант за исключением того что задержка в заданном интервале идет на группу сигналов, а не на каждый отдельный сигнал. Так что спасибо Вам за информацию будем учиться.
...за исключением того что задержка в заданном интервале идет на группу сигналов, а не на каждый отдельный сигнал.
Достаточно заменить тип данных для ФБ, например с 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)
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot