PDA

Просмотр полной версии : звeно зaпaздывания на SТ



longalier
11.11.2014, 21:54
что то я не очень понял что получается...
Помогите разобраться
на выходе получаем - 0.
записывает в первый элемент массива 1 и всё, деятельность невидна(


FUNCTION_BLOCK ZP
VAR_INPUT
vhod:REAL;
T:TIME;
N:BYTE;
END_VAR
VAR_OUTPUT
y:REAL;
END_VAR
VAR
mas:ARRAY[1..10] OF REAL;
TP:TP;
i:BYTE;
END_VAR

IF TP.Q=FALSE THEN
TP(in:=TRUE, PT:=T, Q=>, ET=>);
y:=mas[N];
i:=N;
REPEAT
mas[i]:=mas[i-1];
i:=i-1;
UNTIL i=1
END_REPEAT;
mas[i]:=vhod;
END_IF;

capzap
11.11.2014, 22:10
заполняется один раз,потому что не правильно используется таймер

longalier
11.11.2014, 22:22
"Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. При переходе IN в TRUE выход Q устанавливается в TRUE и таймер начинает отсчет времени (в миллисекундах) на выходе ET до достижения длительности, заданной PT. Далее счетчик не увеличивается. Таким образом, выход Q генерирует импульс длительностью PT по фронту входа IN."
не очень понял про это.
помогите с кодом

capzap
11.11.2014, 22:29
прочтите документацию на таймер, посмотрите эпюры, выход ТР станет вновь фальш, когда вход будет тоже фальш, а у Вас это где?

longalier
11.11.2014, 23:02
IF TP.IN=TRUE THEN
TP(PT:=T, Q=>, ET=>);
y:=mas[N];
i:=N;
REPEAT
mas[i]:=mas[i-1];
i:=i-1;
UNTIL i=1
END_REPEAT;
mas[i]:=vhod;
END_IF;
TP.IN:=FALSE;
такой же результат(
p.s. посмотрел Эпюры, т.е. при переводе IN в тру Q сама переводится в тру?

приборист
11.11.2014, 23:11
такой же результат(
p.s. посмотрел Эпюры, т.е. при переводе IN в тру Q сама переводится в тру?
Как по мне, так проще использовать TON.
А по коду вы вызов таймера запихиваете в цикл, и при выходе из этого цикла таймер не изменит своего значения.
А в конце вы его еще и сбрасываете каждый цикл.

longalier
11.11.2014, 23:19
мне сказали "вот тебе звено запаздывания на ST" а видите как.
а если поступить иначе, что они тут хотели сказать? это должно быть звено запаздывания перед динамическим звеном. как я понял оно должно передавать значение с задержкой, так? а начерта тут массив?
смысл-"просто чтобы у нас отрабатывался не каждый шорох возмущения, а раз в .... секунд" или как?


TP.IN:=TRUE;
IF TP.IN=TRUE THEN
TP(PT:=T, Q=>, ET=>);
y:=mas[N];
i:=N;
REPEAT
mas[i]:=mas[i-1];
i:=i-1;
UNTIL i=1
END_REPEAT;
mas[i]:=vhod;
END_IF;
TP.IN:=FALSE;

тот же результат...
p.s. и еще вопрос, вот редактирую я свой элемент, сохраняю в библиотеку, а окном открыт проект с этим элементом, при компиляции в этом основном проекте элемент будет уже обновленный(т.е. каждый раз при компиляции вызывается из библиотеки) верно?

amn
11.11.2014, 23:44
Как-то решали подобную задачку, посмотрите по ссылке может оно?
http://www.owen.ru/forum/showthread.php?t=16380&p=125912&viewfull=1#post125912

Yegor
12.11.2014, 06:32
оно должно передавать значение с задержкой, так? а начерта тут массив?
смысл-"просто чтобы у нас отрабатывался не каждый шорох возмущения, а раз в .... секунд" или как?Зачем массив? Просто куда-то надо складывать значения за период задержки. В идеале этот буфер должен быть достаточно большим, чтобы вмещать каждую порцию данных, то есть иметь размер N = Td / Ts, где Td — время задержки, Ts — наименьшее время цикла ПЛК. Если наименьшее время неизвестно или принимается неограниченно малым, то N стремится к бесконечности, из-за чего приходится вводить искусственное ограничение частоты сэмплирования при помощи, например, таймера. Если известно Ts, но неизвестно Td, то N вновь может получиться бесконечно большим. Наконец, при известных Td и Ts можно уже принимать окончательный размер буфера.

Поэтому вы сначала назовите величину задержки и приемлемую частоту сэмплирования, и тогда мы сможем предложить вам реализацию.

Lode Runner
12.11.2014, 06:45
longalier, прочитайте книгу Петрова И.В. "Программируемые контроллеры." Там доступно и просто рассказано и об основном цикле ПЛК, и о том, как правильно пользоваться таймерами. Сразу станет понятно, в чём тут ошибка и как сделать, чтобы всё заработало.

longalier
13.11.2014, 09:34
посмотрел страничку что предложили, там он работает с задержкой сигнала типa bool, а мне нужно с real(
так никто не поможет в данном случае?

за 2004 год последнее издание петрова?

Валенок
13.11.2014, 11:14
так никто не поможет в данном случае?

смотри п#9

amn
13.11.2014, 16:13
Надо бы описать задачу подробнее. Что дано и что должны получить в итоге. А то не совсем понятно что Вам нужно.

petera
13.11.2014, 16:52
посмотрел страничку что предложили, там он работает с задержкой сигнала типa bool, а мне нужно с real(
так никто не поможет в данном случае?

за 2004 год последнее издание петрова?
Нужно смотреть библиотеку OSCAT
15168
15169
15170
Три ФБ, различаются разрешением(дискретизацией) сигнала на выходе

FUNCTION_BLOCK FT_TN8
VAR_INPUT
in : REAL;
T : TIME;
END_VAR
VAR_OUTPUT
out : REAL;
trig: BOOL;
END_VAR
VAR
length : INT := 8;
X : ARRAY[0..7] OF REAL;
cnt : INT;
last : TIME;
tx: TIME;
init: BOOL;
END_VAR
tx := DWORD_TO_TIME(T_PLC_MS());
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;

FUNCTION_BLOCK FT_TN16
VAR_INPUT
in : REAL;
T : TIME;
END_VAR
VAR_OUTPUT
out : REAL;
trig : BOOL;
END_VAR
VAR
length : INT := 16;
X : ARRAY[0..15] OF REAL;
cnt : INT;
last : TIME;
tx: TIME;
init: BOOL;
END_VAR

(* read system time *)
tx := DWORD_TO_TIME(T_PLC_MS());
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;


FUNCTION_BLOCK FT_TN64
VAR_INPUT
in : REAL;
T : TIME;
END_VAR
VAR_OUTPUT
out : REAL;
trig: BOOL;
END_VAR
VAR
length : INT := 64;
X : ARRAY[0..63] OF REAL;
cnt : INT;
last : TIME;
tx: TIME;
init: BOOL;
END_VAR
(* read system time *)
tx := DWORD_TO_TIME(T_PLC_MS());

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;

Используется функция T_PLC_MS из той же библиотеки

FUNCTION T_PLC_MS : DWORD
VAR CONSTANT
debug : BOOL := 0;
N : INT := 0;
offset : DWORD := 0;
END_VAR
VAR
tx : TIME;
END_VAR
tx := TIME();
T_PLC_MS := TIME_TO_DWORD(Tx);


IF debug THEN
T_PLC_MS := (SHL(T_PLC_MS,N) OR SHL(DWORD#1,N)-1) + OFFSET;
END_IF;

petera
13.11.2014, 19:37
Пример работы ФБ FT_TN. Для наглядности на языке CFC
15171 15172

longalier
17.11.2014, 00:03
спасибо большое! разобрался поверхностно с элементами- как надо действует, завтра посмотрю КАК это работает)
у меня несколько вопросов...
0-а что это за "библиотеку OSCAT"?
1- как сделать чтобы на выход подавался именно вещественный синус, а не "целый"?
2- мы же вроде задали 4 секунды, а "отпаузил" он лишь 2,2? и даже если считать с начала работы то тоже порядка 3,2 с, почему так? и с какого момента отсчет этого времени, с момента нажатия "Старт"?
3- как ДОБАВИТЬ элемент в библиотеку(как создавать новые библиотеки - понял, а как добавить элемент, не пойму)?

petera
17.11.2014, 04:53
спасибо большое! разобрался поверхностно с элементами- как надо действует, завтра посмотрю КАК это работает)
у меня несколько вопросов...
0-а что это за "библиотеку OSCAT"?
1- как сделать чтобы на выход подавался именно вещественный синус, а не "целый"?
2- мы же вроде задали 4 секунды, а "отпаузил" он лишь 2,2? и даже если считать с начала работы то тоже порядка 3,2 с, почему так? и с какого момента отсчет этого времени, с момента нажатия "Старт"?
3- как ДОБАВИТЬ элемент в библиотеку(как создавать новые библиотеки - понял, а как добавить элемент, не пойму)?
0.OSCAT - это сообщество разработчиков библиотек в стандарте IEC 61131-3 с открытым исходным кодом, существующее с 2006 года. Скачать библиотеки и документацию к ним можно по ссылкам из этой темы http://www.owen.ru/forum/showthread.php?t=14007. Для CDS v2.xx нужно качать "OSCAT Basic Codesys / Twincat 2.x"
1. Например взять генератор синуса из той же библиотеки OSCAT
15227
2. Где Вы увидели 2,2 с? Я увидел 220 мс:)
А Вас не смущает, что половина периода исходного сигнала на трассировке равна примерно 460 мс, а должна быть 7500 мс?
Скорей всего Вы пытаетесь запускать трассировку в эмуляции. Тогда покажите настройки сэмплирования. Скорей всего Вы задали интервалы выборок несколько мс, а для эмулятора нужно задавать сотни мс, что бы получить более менее правильные результаты.
Дело в том, что в эмуляции используется системный таймер компьютера и сама Windows не является оп.системой реального времени.
Запускать трассировку нужно в режиме онлайн соединения с живым ПЛК, в крайнем случае можно использовать PLC WinNT. И не нужно устанавливать интервалы в трассировке меньше чем время цикла ПЛК. Например
Выполнение программы и трассировки в эмуляторе
15228
Результат
15229 15230
Хорошо видно, что в эмуляции трассировка с выборкой 20 мс отображается не верно.
Теперь эта же программа выполняется в PLC WinNT с теми же параметрами выборки
15231
Здесь видно, что задержка сигнала действительно равна 4 сек.
3. Библиотека такой же проект кодесис. Добавить элемент можно так, же как и в проекте "Добавить объект.."

ЗЫ. Эта простейшая программа в эмуляторе имеет время цикла 63 мс, а в PLC WinNT примерно 16 мс.

longalier
18.11.2014, 21:31
а всё таки с GEN можно такое совершить?:)
добавил "OSCAT Basic Codesys / Twincat 2.x" вылезло вот - ошибка 3612 превышено максимальное кол-во POU.
вычленил из библиотеки, но там еще полно вложенных функций было, мне надо каждую из них искать вручную? нельзя так вытащить функцию из библиотеки, чтобы всё вложенное так же утащилось?)
такие как MATH - это элементы всё той же библиотеки? не могу его найти помогите найти сего динозавра, нашёл всё остальное что нужно, а это не нашел
хочу нормальный sin(, если с GEN нельзя так сделать
и ещё подскажите как в цифровой трассировке сделать адекватный масштаб по оси Х - хотябы секунд 40 реальных чтоб помещалось...

petera
19.11.2014, 03:44
а всё таки с GEN можно такое совершить?:)
добавил "OSCAT Basic Codesys / Twincat 2.x" вылезло вот - ошибка 3612 превышено максимальное кол-во POU.
вычленил из библиотеки, но там еще полно вложенных функций было, мне надо каждую из них искать вручную? нельзя так вытащить функцию из библиотеки, чтобы всё вложенное так же утащилось?)
такие как MATH - это элементы всё той же библиотеки? не могу его найти помогите найти сего динозавра, нашёл всё остальное что нужно, а это не нашел
хочу нормальный sin(, если с GEN нельзя так сделать
и ещё подскажите как в цифровой трассировке сделать адекватный масштаб по оси Х - хотябы секунд 40 реальных чтоб помещалось...
1. Для GEN из Util.lib для синуса или косинуса можно так
15286
2.ошибка 3612 превышено максимальное кол-во POU.
Для PLCWinNT увеличить число POU в настройках целевой платформы
15287
Для ПЛК63/73 такой способ не доступен. В этом случае либо экспорт из библиотеки и импорт в проект нужных ФБ(можно несколько за одну операцию), либо в опциях проекта для генератора кода исключить неиспользуемые POU.
Только, чтобы исключить неиспользуемые POU необходимо хотя бы один раз выполнить компиляцию проекта, но при этом получается "ошибка 3612 превышено максимальное кол-во POU".:(
По этому вначале нужно выбрать другой ПЛК, даже тот же PLCWinNT или None, выполнить компиляцию проекта. Затем исключить неиспользуемые POU
15288
Затем в настройках целевой платформы выбрать ПЛК63/73, в конфигурации ПЛК в меню "Дополнение" выполнить "Стандартная конфигурация".
3."такие как MATH - это элементы всё той же библиотеки? не могу его найти помогите найти сего динозавра"
Нужно также не забывать про другие ресурсы библиотек, глобальные переменные и пользовательские типы данных:rolleyes:
15289

15290

petera
19.11.2014, 07:20
и ещё подскажите как в цифровой трассировке сделать адекватный масштаб по оси Х - хотябы секунд 40 реальных чтоб помещалось...
Если шаг выборки 100мс, то поместится 49 сек.
http://www.owen.ru/forum/attachment.php?attachmentid=15291&d=1416369657
можно вместо трассировки использовать визуализацию с трендом
15292

longalier
19.11.2014, 23:15
у меня стоит None, попробовал на другой ПЛК выбрать, ставить POU 4к - и при "Подключении" вылетает "ошибка #0: Ошибка связи" и подключение вырубается.
а кнопку уже гуглил, у меня она нигде вообще не активна.
но я уже научился добавлять всё в 1 библиотеку) наверное лучше разобраться с Math :
вот чо пишет, добавил в своей базе(куда вынес все нужные элементы+ мои собственные) всё что написано в вашей, но он всё равно непонимат.
ошибка 3740.... help, оч хочу синус)))
p/s/ и с "шаг выборки " разобрался, у меня он "шаг семпл" , как я раньше не догнал...

capzap
19.11.2014, 23:59
если из оскат что то берете, конкретно математические константы, то в бибке используются все вкладки проекта, внимательно изучите

petera
20.11.2014, 07:09
у меня стоит None, попробовал на другой ПЛК выбрать, ставить POU 4к - и при "Подключении" вылетает "ошибка #0: Ошибка связи" и подключение вырубается.
а кнопку уже гуглил, у меня она нигде вообще не активна.
но я уже научился добавлять всё в 1 библиотеку) наверное лучше разобраться с Math :
вот чо пишет, добавил в своей базе(куда вынес все нужные элементы+ мои собственные) всё что написано в вашей, но он всё равно непонимат.
ошибка 3740.... help, оч хочу синус)))
p/s/ и с "шаг выборки " разобрался, у меня он "шаг семпл" , как я раньше не догнал...
"Смешались в кучу кони, люди,
И залпы тысячи орудий...."
Вы хотите спросить про все сразу:rolleyes:, а я предлагаю разобраться по порядку.
И так, живого контроллера у Вас скорей всего нет. И Вам очень хочется синус в формате REAL. Самый простой путь
1. Оставляем ПЛК "None"
2. Не пользуемся целой библиотекой OSCAT, а берем из нее только ФБ FT_TN и функцию T_PLC_MS, текст можно скопировать из поста #14.
3. Используем генератор из Util.lib
Теперь маленькая хитрость. На вход ФБ FT_TN нужно подать внутреннею переменную "help" генератора. Для этого или пишем "через точку "ИмяФБгенератора.help", например "MyGen.help" или при вводе нажимаем F2 и используем Ассистент ввода.
15330
Теперь и будет как написано в моей программе См. вложение "Синус REAL.pro"
UPD1
Теперь о том как "разобраться с Math".
Если Вы хотите импортировать и другие ФБ из библиотеки OSCAT, то как я и писал раньше, нужно также не забывать про другие ресурсы библиотек, глобальные переменные и пользовательские типы данных.
Вот с глобальными переменными библиотеки OSCAT Вы разобрались. А с пользовательскими типами данных нет. Почитайте справку по содесису о типах данных.
Ведь компилятор Вам сказал, что используется неизвестный тип данных
15332
Пользовательские типы данных находятся на соответствующей вкладке дерева проекта
15333
UPD2
"а кнопку уже гуглил, у меня она нигде вообще не активна"
Прежде чем, что-либо исключить из компиляции нужно хотя бы один раз выполнить компиляцию проекта. По этому кнопка и не активная.
Но выполнить компиляцию проекта с такой большой библиотекой для ПЛК "None" не получится. Нужно вначале выбрать другой ПЛК.

"попробовал на другой ПЛК выбрать, ставить POU 4к - и при "Подключении" вылетает "ошибка #0: Ошибка связи" и подключение вырубается."
Пока Вы использовали ПЛК "None", то "подключались" всегда к эмулятору
15334
А при выборе другого ПЛК, если он физически не подключен к компьютеру, нужно галку "Эмуляция" включить принудительно.
15335
И кроме того, кто Вас заставляет сразу подключаться к не существующему контроллеру.
Ведь нужно только выполнить первую компиляцию, чтобы можно было исключить не нужное (чтобы кнопка стала активной). А для этого есть меню "Проект-->Компилировать"