В ST не силен, если можно на CFC пожалуйста.
Вид для печати
В ST не силен, если можно на CFC пожалуйста.
На CFC будет так. Вложение 29419
На CFC тоже не сложно
Вложение 29420
Тоже самое, линий просто больше
Вложение 29421
Скрытый текст:
Petera спасибо, выручил.
Здравствуйте. Есть одна проблема. Есть два генератора BLINK, которые работают поочередно.
Необходимо выходы генераторов подать на один вход. Включение выходов через элемент OR проблему не
решил, так как выходы генераторов могут произвольно находиться в любом состоянии и 0 и 1.
Да, такой уж этот БЛИНК.
Нужно делать так
Вложение 29539
тогда выходы генераторов не смогут произвольно находиться в любом состоянии и 0 и 1
И теперь можно, будет OR использовать
Вложение 29540
Спасибо Petera все оказалось не так сложно.
Добрый день! Пишу программу для ПЛК63, изменение уставки с помощью кнопок на панели контроллера. Руководствуюсь примером, который был на сайте ОВЕН. При компеляции возникает сообщение что в выражении rm(clk:=kbrd=key_up ) идентификатор "kbrd" не определен. Может кто подскажет как с этим бороться?
где-то вы или забыли объявить переменную или при объявлении описались.
Воспользуйтесь поиском и найдите ее в программе и области объявлений.
Проблема решена.
Приветствую всех.
Возникла проблема, сижу туплю. (Естественно, только только) :))
Пид регулятор, переменная sp1(*уставка*) - глобальная и прописана в SubMenu конфигураторе ПЛК.
Вспомнил что все же нужно ее сделать RETAIN, что операторам меньше работы было.
Теперь капец. Ошибка 3703 (два раза объявлено).
Может надо эту переменную сделать VAR_OUT sp1 RETAIN и в конфигураторе ПЛК обозвать так же sp1?
Еще вопрос, как находить переменные с 2м объявлением?
Пролез по локальным, по глобальным, двух индификаторов не встретил . Как вы их ищите?
Здравствуйте, есть несколько вопросов:
1. Как реализовать периодическую синхронизацию времени ПЛК 100 со временем MASTER SCADA?
2. Как можно реализовать изменение состояния переменных в зависимости от текущего времени, месяца и числа на календаре? (то есть сравнивать текущее время с интересующим нас диапазоном времени к примеру
IF "текущее число и месяц" = 01:01 THEN
IF 00:00:00 < "текущее время" < 02:00:00
THEN Control_K4 := TRUE AND Control_K6 := TRUE AND Control_K8 := TRUE; )
Буду очень благодарен, тому кто поможет, С МЕНЯ ПИВО.
Переменные TOD и TD Вам в помощь ну и производные из них
Например,
IF 00:00:00 < "текущее время" < 02:00:00
превращается в
IF TOD_Now > tod#00:00:00 AND TOD_Now < tod#02:00:00 THEN
где
TOD_Now:=DWORD_TO_TOD((INT_TO_DWORD(HH)*3600 +INT_TO_DWORD( MM*60) +INT_TO_DWORD( SS))*1000);
HH -текущий час
MM - текущие минуты
SS - текущие секунды
Я не знаю, в каком виде в ПЛК приходит время из MASTER SCADA, в виде отдельных значений - год, месяц, день, час, мин, сек или в упакованном виде, например, в формате POSIX оно же время UNIX, оно же в кодесис Time AND Date (TD). От этого зависит как быть с синхронизацией.
А вообще полезно будет почитать статью И. Петрова "Программируем временные сложности" http://prolog-plc.ru/docs/TimeExperience.pdf
Тогда будете знать как "Как можно реализовать изменение состояния переменных в зависимости от текущего времени, месяца и числа на календаре"
SysLibTime
Пример получения "HH -текущий час MM - текущие минуты SS - текущие секунды" http://www.owen.ru/forum/showthread....l=1#post235872
Вложение 29596
Потому, что
здесь
IF TOD_Now > tod#00:00:00 AND TOD_Now < tod#02:00:00 THEN
Текущее время в формате TOD(Time Of Day) сравнивается только с двумя константами tod#00:00:00 и tod#02:00:00
А если брать "в готовом виде", тогда сравнивать придется с шестью константами в формате INT
IF HH > 0 AND MM >0 AND SS > 0 AND HH < 2 AND MM = 0 AND SS = 0 THEN
к тому же работать не будет, т.к. состояний, когда
одновременно SS > 0 и SS = 0 или MM > 0 и MM = 0 не может быть
Все привет! Как реализовать типовой ПИД-регулятор на языке ST? Если есть, пример или ещё что-то в помощь. Заранее спасибо.
1. Зачем, когда он есть в util.lib?
2. Откройте util.lib и изучайте соответствующий ФБ.
Подскажите если можно. ПЛК110-32 написана программа. В режиме симуляции все работает, а после загрузки в контроллер при подаче напряжения на вход физически сигнал есть но программа и как следствие контроллер этот сигнал на входе не видит.
Добрый день, имеется шаговый двигатель для управления необходимо 400 импульсов в секунду. Возможно ли им (и как) управлять, если указано что минимальная длительность ШИМ 10мс на ПЛК73?
Приветствую.
Есть PID, у него выходY- REAL, есть Y_min и Y_max. Мне надо на выходе ПЛК получить 4...20мА для упр клапаном.
Как сделать правильно?
Задать PID 4...20мА в Y_min=4 и Y_max=20 и получу на выходе ПЛК 4...20мА?
Использовать на выходе из ПИДа Lin_trafo и задать 4...20мА?
Или есть какое то правильное решение?
lecsa для начала открыть документацию на ПЛК, а то может на выход надо подавать не 4-20 а 0-1.....
В конфигураторе наверное переменные забыли объявить..Цитата:
Подскажите если можно. ПЛК110-32 написана программа. В режиме симуляции все работает, а после загрузки в контроллер при подаче напряжения на вход физически сигнал есть но программа и как следствие контроллер этот сигнал на входе не видит.
Lecsa, в своих проектах так и делаю. Сначала значение с АЦП масштабирую в значение флоат и обратно масштабирую для передачи в поле.
Спасибо. С праздничком! :)
Приветствую. Это опять я со своими тупыми вопросами :)
Все тот же ПЛК73м. Не могу понять как реализовать следующее, вернее реализовано все кроме 3го абзаца.
Кратко: Уставка (sp1) температуры в ПИД. Изменение уставки с панели (Sub_menu - Float - sp1 - тип "конфигурационный") По умолчанию "0". При вводе кнопками уставки, ПЛК запоминает ее значение при выключении питания. Тут все нормально. И как я понимаю, в этом случае sp1 является глобальной,так как обьявлена в sub_menu, правильно?
Далее, для познания не опознанного, сделал визуализацию, для более комфортного настраивания ПИД. Визуализация записывает переменные в плк в он-лайн режиме, допустим ту же уставку sp1, все отлично, но плк не запоминает ее при выключении.
Проба обьявить sp1 VAR_GLOBAL_RETAIN_PERSISTENT увенчалась конфликтом с глобальной sp1 .
Как правильно сделать. Я еще не силен чтоб самому додуматься. Если можно строчку кода или ссылку на пример или просто немного разжевать.
Наверное правильно будет спросить так " Как записать значение переменной в меню конфигурации самого плк через тег визуализации но чтобы осталась возможность, задавать значение переменной через ручной ввод на панели плк, меню конфигурации"
Файлик с проектом прилагаю.
Все вопрос снимается. В конфигурацию через кодесис записать значение переменной НЕЛЬЗЯ.
Конфигурационные пользовательские параметры – значение этих парамет-ров считывается из EEPROM при запуске контроллера. Конфигурационные пользова-тельские параметры доступны для редактирования с передней панели и для чте-ния / записи по сети (при условии установленных атрибутов).
Введенные в ПО CoDeSys (в окне режима «Конфигурация ПЛК (PLC Configuration)») новые значения этих параметров не сохраняются в EEPROM и не до-ступны по сети RS.
Введенные с передней панели ПЛК или по сети значения конфигурационных па-раметров сохраняются в EEPROM, и при выключении питания будут сохранены.
lecsa запишите по сети
здесь речь идет, НЕ о введенных в окне визуализации, а о тех случаях, когда вводятся значения вручную прямо в дерево ресурса конфигурация.
А так, в программе запросто, только использовать нужно функцию "SAVE_PARAMETER" из библиотеки ARM7_specific.lib
ЗЫ
Пример есть на диске ПЛК
Применение данной функции показано на примере ее вызова в составе
программы, которая при отпускании нажатых кнопок Альт+стрелка вверх записывает
значение параметра «Уставка 1», увеличенное на 1.
Вложение 29798
Код:PROGRAM PLC_PRG
VAR
tm:TON;
fm:F_TRIG;
starting:BOOL:=FALSE;
param_ptr:POINTER TO parameter_descriptor;
param_adr: POINTER TO REAL;
param_adr2: POINTER TO ARRAY[0..15] OF BYTE;
temp: REAL;
temp2: ARRAY [0..15] OF BYTE;
END_VAR
VAR CONSTANT
key:BYTE:=136;
END_VAR
IF NOT starting THEN (*То что делается при начальной загрузке контроллера*)
SetWorkScreenCount(1); (*Установим количество экранов = 1 *)
ClearScreen(0); (*Очистим экран*)
starting:=TRUE; (*Установим аттрибут, чтобы больше не входить в этот цикл*)
END_IF
fm(clk:=kbrd=key); (*Если пользователь нажал Альт+стрелка вверх*)
IF fm.Q THEN (*и отпустил, то будет выполнен этот цикл*)
param_ptr:=READ_BY_HASH(16#37B7,0); (*чтение дескриптора параметра*)
temp:=sp1+1.0; (*в переменную temp занесём значение уставки + 1*)
param_adr:=ADR(temp); (*в param_adr -- адрес temp*)
param_adr2:=param_adr; (*Сделаем так, чтобы переменные param_adr и param_adr2 ссылались на одно и то же место в памяти*)
temp2:=param_adr2^; (*в temp2 занесём результат, считанный по адресу param_adr2, то есть фактически в temp2 попадает значение из temp с учётом преобразования типов*)
param_ptr^.value:=temp2; (*значение переменной в param_ptr занесём temp2*)
SAVE_PARAMETER(param_ptr); (*запись параметра в память контроллера*)
END_IF
tm(in:=NOT tm.Q, pt:=t#200ms); (*цикл индикации -- 200 мс*)
IF tm.Q THEN (*цикл будет запущен каждые 200 мс*)
ShowReal(0,0,0,'%2.1f',sp1); (*отображаем значение уставки*)
END_IF
О, petera благодарю! Попробую вникнуть!
Добрый вечер. Есть проблема. Нужно поднять ТРМ в кодесис на СFC. C cамим ТРМ проблем не возникло, но с гистерезисом никак не справлюсь. Подскажите как лучше это сделать.
Примеры смотрели на сайте?