Просмотр полной версии : Разбираюсь с CODESYS и ОВЕН ПЛК
можно ли на плк овен реализовать генератор синусоидального сигнала? (мне нужно перемножить два сигнала - умножитель, найти их корелляционную функцию и оценить корелляционную функцию по пороговому значению).
Newcomer
21.05.2016, 21:02
можно ли на плк овен реализовать генератор синусоидального сигнала? (мне нужно перемножить два сигнала - умножитель, найти их корелляционную функцию и оценить корелляционную функцию по пороговому значению).
Конечно можно. Даже ПЛК живой не нужен, можно все в симуляторе сделать.
Я пишу в тип POU программу на CFC. Можно ли эту программу написанную на CFC конвертировать в ST?
автоматически нет, только ручками
автоматически нет, только ручками
Поставил генератор назначил вход "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?
нажмите F2 в поле кода, выберете из библиотек требуемый ПОУ и подставте нужные переменные на входы и выходы. Неплохо бы перечитать документацию по КДС, там примеры как графического вида, так и текстового
нажмите F2 в поле кода, выберете из библиотек требуемый ПОУ и подставте нужные переменные на входы и выходы. Неплохо бы перечитать документацию по КДС, там примеры как графического вида, так и текстового
Я что-то не вижу...
blink должен находиться в стандартных функц.блоках
blink должен находиться в стандартных функц.блоках
Нашел, кликнул по нему. Но он только вставился как "blink" в окно кода. :confused:
а кто говорил что будет легко, теперь нужно "отфотошопить"
В общем, что надо исправить? Пробовал разные выходы и формы сигнала. Ошибка остается.
out1 - дискретный выход
"несоответствие типов на выходе: невозможно преобразовать int в bool" переводится так:
"У меня на выходе циферки. По этому моргать лампочкой не могу."
INT_TO_BOOL ему нужно в одно место вставить
Скорее всего ФБ BLINK ему подойдет
Есть ли в codesys функции перемножителя и интегратора?
Создал основную программу на cfc, в ней создал функциональный блок на st. Задал все как на скриншотах, но при запуске программы значение A2 - не меняется.
Николаев Андрей
30.05.2016, 09:20
Все вполне логично.
Вам необходимо добавить вызов экземпляра Вашего блока. В поле основной программы добавить блок (аналогично GEN) и указать имя - созданный Вами блок.
Не забудьте так же как GEN его объявить. Именно после этого ЭКЗЕМПЛЯР Вашего блока будет работать.
И с какого перепуга она должна меняться ? для блока на ST она всего лишь ВХОДНАЯ переменная.
Николаев Андрей
30.05.2016, 09:29
Лучше бы конечно понять цель. Судя по всему человек просто разбирается с CODESYS. Но как то возникла мысль с данного блока на DO сигнал подавать.
Николаев Андрей
30.05.2016, 09:34
Просьба не плодить темы.
И коллегам будет проще подсказать видя всю историю.
Все вполне логично.
Вам необходимо добавить вызов экземпляра Вашего блока. В поле основной программы добавить блок (аналогично 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:
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.
Ладно, с картинками попробую. :)
24637
Затем появится ассистент ввода. Выбираете там ФБ GEN и жмёте Enter.
24638
Получите:
24639
Заполняете то что в скобках так же как делали в CFC.
Переименовывете в программе GEN, в ваш gen1.
Создал новую программу на ST.
Все работает. Спасибо за помощь.
Есть ли пример программы для перемножения функций? Может есть библиотеки?
Есть ли пример программы для перемножения функций? Может есть библиотеки?
вы читали этот документ полностью? http://www.owen.ru/uploads/txtlic.php?url=http:/www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf
Как вычислить определенный интеграл. У меня не фиксируется значение вычисления интеграла, переменной S2 ?
Задам вопрос.
Написав в программе integral1 вы что делаете?
Задам вопрос.
Написав в программе integral1 вы что делаете?
Нахожу интеграл (сумма произведений значений функции на соответствующие этим значением интервалы времени) от произведения двух функций (умножение выполнил на предыдущем этапе).
Не-а. :)
Интеграл вычисляет функциональный блок INTEGRAL, с именем Integral1.
А вы прописав в программе Integral1, просто сказали контроллеру: каждый цикл вызываем такой то блок, с таким то именем.
На входа которого подаем такие то значения, а результат записываем в такую то переменную (это то что в скобках заполняется).
Цикл - вызов блока-получили значение, новый цикл - вызов блока-новое значение ... и так по кругу. Время цикла - миллисекунды.
Так что с какой радости значение должно быть фиксированным.
Не-а. :)
Интеграл вычисляет функциональный блок INTEGRAL, с именем Integral1.
А вы прописав в программе Integral1, просто сказали контроллеру: каждый цикл вызываем такой то блок, с таким то именем.
Цикл - вызов блока-получили значение, новый цикл - вызов блока-новое значение ... и так по кругу. Время цикла - миллисекунды.
Так что с какой радости значение должно быть фиксированным.
Как тогда правильно?
Ну значит надо дополнительное условие сделать.
К примеру, добавить переменную Stop типа bool и допустим переменную Rezultat типа real.
И прописать в программе условие: если Stop истино, то переменой Rezultat присвоить значение S2.
Как один из вариантов.
Заодно можно переменую Stop завести на вход Reset блока Integral, если необходимо.
Как использовать ЦАП в ПЛК 160? В библиотеках не нашел такой функции.
lara197a
06.06.2016, 15:09
Это типа в телепрограмме искать описание настроек телевизора :)
читайте ИЭ ПЛК.
Как считываются сигналы с дискретного входа, по-битово или группой за такт работы плк?
Владимир Ситников
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% - Вы всегда берете значение из области памяти входов.
Для задач, где требуется реагировать на изменение значения входов даже когда программа выполняет цикл - прерывания. Но это совсем другая история.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot