Вход

Просмотр полной версии : Разбираюсь с CODESYS и ОВЕН ПЛК



yurakir
21.05.2016, 19:28
можно ли на плк овен реализовать генератор синусоидального сигнала? (мне нужно перемножить два сигнала - умножитель, найти их корелляционную функцию и оценить корелляционную функцию по пороговому значению).

Newcomer
21.05.2016, 21:02
можно ли на плк овен реализовать генератор синусоидального сигнала? (мне нужно перемножить два сигнала - умножитель, найти их корелляционную функцию и оценить корелляционную функцию по пороговому значению).

Конечно можно. Даже ПЛК живой не нужен, можно все в симуляторе сделать.

yurakir
29.05.2016, 18:17
Я пишу в тип POU программу на CFC. Можно ли эту программу написанную на CFC конвертировать в ST?

capzap
29.05.2016, 18:19
автоматически нет, только ручками

yurakir
29.05.2016, 19:12
автоматически нет, только ручками

Поставил генератор назначил вход "a" и выход "b".
Код генератора в менеджере библиотек такой:

FUNCTION_BLOCK BLINK
(* Function block to simulate a turn signal *)
VAR_INPUT
ENABLE:BOOL; (* TRUE:run Blink, FALSE: OUT keeps its value*)
TIMELOW:TIME; (* Time for OUT=FALSE *)
TIMEHIGH:TIME; (* Time for OUT=TRUE *)
END_VAR
VAR_OUTPUT
OUT:BOOL; (* output variable, starting with FALSE *)
END_VAR
VAR
CLOCK:TP;
END_VAR

значения переменных поменял так.
TIMELOW:T#1s0ms; (* Time for OUT=FALSE *)
TIMEHIGH:T#1s0ms; (* Time for OUT=TRUE *)

не могу понять как это все связать воедино на st?

capzap
29.05.2016, 19:24
нажмите F2 в поле кода, выберете из библиотек требуемый ПОУ и подставте нужные переменные на входы и выходы. Неплохо бы перечитать документацию по КДС, там примеры как графического вида, так и текстового

yurakir
29.05.2016, 19:36
нажмите F2 в поле кода, выберете из библиотек требуемый ПОУ и подставте нужные переменные на входы и выходы. Неплохо бы перечитать документацию по КДС, там примеры как графического вида, так и текстового

Я что-то не вижу...

capzap
29.05.2016, 20:45
blink должен находиться в стандартных функц.блоках

yurakir
29.05.2016, 21:03
blink должен находиться в стандартных функц.блоках

Нашел, кликнул по нему. Но он только вставился как "blink" в окно кода. :confused:

capzap
29.05.2016, 21:08
а кто говорил что будет легко, теперь нужно "отфотошопить"

yurakir
29.05.2016, 21:55
В общем, что надо исправить? Пробовал разные выходы и формы сигнала. Ошибка остается.
out1 - дискретный выход

smk1635
29.05.2016, 22:06
"несоответствие типов на выходе: невозможно преобразовать int в bool" переводится так:
"У меня на выходе циферки. По этому моргать лампочкой не могу."

capzap
29.05.2016, 22:10
INT_TO_BOOL ему нужно в одно место вставить

smk1635
29.05.2016, 22:25
Скорее всего ФБ BLINK ему подойдет

yurakir
30.05.2016, 00:06
Есть ли в codesys функции перемножителя и интегратора?

yurakir
30.05.2016, 09:09
Создал основную программу на cfc, в ней создал функциональный блок на st. Задал все как на скриншотах, но при запуске программы значение A2 - не меняется.

Николаев Андрей
30.05.2016, 09:20
Все вполне логично.
Вам необходимо добавить вызов экземпляра Вашего блока. В поле основной программы добавить блок (аналогично GEN) и указать имя - созданный Вами блок.
Не забудьте так же как GEN его объявить. Именно после этого ЭКЗЕМПЛЯР Вашего блока будет работать.

melky
30.05.2016, 09:22
И с какого перепуга она должна меняться ? для блока на ST она всего лишь ВХОДНАЯ переменная.

Николаев Андрей
30.05.2016, 09:29
Лучше бы конечно понять цель. Судя по всему человек просто разбирается с CODESYS. Но как то возникла мысль с данного блока на DO сигнал подавать.

Николаев Андрей
30.05.2016, 09:34
Просьба не плодить темы.
И коллегам будет проще подсказать видя всю историю.

yurakir
30.05.2016, 09:35
Все вполне логично.
Вам необходимо добавить вызов экземпляра Вашего блока. В поле основной программы добавить блок (аналогично GEN) и указать имя - созданный Вами блок.
Не забудьте так же как GEN его объявить. Именно после этого ЭКЗЕМПЛЯР Вашего блока будет работать.
FUNCTION_BLOCK SUM_FB
VAR_INPUT
gen1: GEN;
A1:INT;
A2:INT;
END_VAR
VAR_OUTPUT
END_VAR
VAR
END_VAR

--------------
gen1;
A2:= 2 ;

Что-то я не так сделал :confused:

smk1635
30.05.2016, 12:14
FUNCTION_BLOCK SUM_FB
VAR_INPUT
gen1: GEN;
A1:INT;
A2:INT;
END_VAR
VAR_OUTPUT
END_VAR
VAR
END_VAR

--------------
gen1;


A2:= 2 ;

Что-то я не так сделал :confused:

Ладно, с картинками попробую. :)

24637

Затем появится ассистент ввода. Выбираете там ФБ GEN и жмёте Enter.

24638

Получите:

24639

Заполняете то что в скобках так же как делали в CFC.
Переименовывете в программе GEN, в ваш gen1.

Николаев Андрей
30.05.2016, 12:29
Может пример здесь Вам поможет.
http://www.owen.ru/forum/showthread.php?t=13588
Создание и вызов POU.

yurakir
30.05.2016, 13:47
Ладно, с картинками попробую. :)

24637

Затем появится ассистент ввода. Выбираете там ФБ GEN и жмёте Enter.

24638

Получите:

24639

Заполняете то что в скобках так же как делали в CFC.
Переименовывете в программе GEN, в ваш gen1.

Создал новую программу на ST.
Все работает. Спасибо за помощь.

yurakir
30.05.2016, 14:17
Есть ли пример программы для перемножения функций? Может есть библиотеки?

capzap
30.05.2016, 14:52
Есть ли пример программы для перемножения функций? Может есть библиотеки?

вы читали этот документ полностью? http://www.owen.ru/uploads/txtlic.php?url=http:/www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf

yurakir
30.05.2016, 18:21
Как вычислить определенный интеграл. У меня не фиксируется значение вычисления интеграла, переменной S2 ?

smk1635
30.05.2016, 20:14
Задам вопрос.
Написав в программе integral1 вы что делаете?

yurakir
30.05.2016, 21:25
Задам вопрос.
Написав в программе integral1 вы что делаете?

Нахожу интеграл (сумма произведений значений функции на соответствующие этим значением интервалы времени) от произведения двух функций (умножение выполнил на предыдущем этапе).

smk1635
30.05.2016, 21:51
Не-а. :)
Интеграл вычисляет функциональный блок INTEGRAL, с именем Integral1.

А вы прописав в программе Integral1, просто сказали контроллеру: каждый цикл вызываем такой то блок, с таким то именем.
На входа которого подаем такие то значения, а результат записываем в такую то переменную (это то что в скобках заполняется).
Цикл - вызов блока-получили значение, новый цикл - вызов блока-новое значение ... и так по кругу. Время цикла - миллисекунды.
Так что с какой радости значение должно быть фиксированным.

yurakir
30.05.2016, 21:56
Не-а. :)
Интеграл вычисляет функциональный блок INTEGRAL, с именем Integral1.

А вы прописав в программе Integral1, просто сказали контроллеру: каждый цикл вызываем такой то блок, с таким то именем.
Цикл - вызов блока-получили значение, новый цикл - вызов блока-новое значение ... и так по кругу. Время цикла - миллисекунды.
Так что с какой радости значение должно быть фиксированным.

Как тогда правильно?

smk1635
30.05.2016, 22:21
Ну значит надо дополнительное условие сделать.
К примеру, добавить переменную Stop типа bool и допустим переменную Rezultat типа real.
И прописать в программе условие: если Stop истино, то переменой Rezultat присвоить значение S2.
Как один из вариантов.
Заодно можно переменую Stop завести на вход Reset блока Integral, если необходимо.

yurakir
06.06.2016, 14:33
Как использовать ЦАП в ПЛК 160? В библиотеках не нашел такой функции.

lara197a
06.06.2016, 15:09
Это типа в телепрограмме искать описание настроек телевизора :)
читайте ИЭ ПЛК.

yurakir
06.06.2016, 15:26
Как считываются сигналы с дискретного входа, по-битово или группой за такт работы плк?

Владимир Ситников
06.06.2016, 15:58
Как считываются сигналы с дискретного входа, по-битово или группой за такт работы плк?

А какая разница?

Хороший вопрос "может ли во время работы PLC_MAIN внезапно измениться значение входа. Ну, читаем 2 раза один и тот же вход, и получаем разные значения".
Скорее всего, в текущих ОВЕН ПЛК так быть не может.

Ещё вариант вопроса "подали сигнал сразу 2 входа, есть ли гарантия, что PLC_MAIN их увидит оба в одном и том же цикле".
Тут гарантия вряд ли есть. И даже если просто подать один и тот же сигнал на разные входы, то сами входы могут отработать за разное время => стать видимыми в разных циклах.

Николаев Андрей
08.06.2016, 09:23
Как бы я предупреждал. Заведите себе тему и в ней рубитесь.

К сути:
ЦАП на ПЛК работает не через библиотеки, а через Конфигурацию ПЛК. В соответствующий канал записывается значение переменной, в заданном диапазоне.
Про считывание входов, опрос и изменение во время цикла.`
1. К PLCOpen отсылать не буду, но книжку Петрова или Минаева полистать стоит. Есть думаю и другие достойные книги.
2. Нужно понимать особенности работы ПЛК. Опрос области памяти входов - выполнение цикла - запись области памяти выходов - сервисное время - опрос области памяти входов. ПЛК работает так и только так. Классически. Именно по этому Вы обращаетесь не к физической памяти контроллера, а к области памяти AT%...
3. А вот записываются значения физических входов в память входов, и управление физическими выходами из памяти выходов в независимости от цикла ПЛК.

Говоря простыми словами - после того как контроллер считал область памяти входов и ушел в выполнение цикла (а он может быть и в секундах - никто не запрещает) - изменение физических входов восприниматься не будет. И уже только закончив цикл и снова перейдя к чтению области памяти входов контроллер возьмет последнее записанное в эту область памяти значение, которое за это время могло измениться 100 раз.
При этом совершенно не важно сколько у Вас процессоров - 1 или 1000. Если Вы работаете с AT% - Вы всегда берете значение из области памяти входов.

Для задач, где требуется реагировать на изменение значения входов даже когда программа выполняет цикл - прерывания. Но это совсем другая история.