to Денис_Гуливатенко. Будет. Я только что проверил. :) Можно еще так:
(*пользовательский блок proba*)
VAR_INPUT
i: BYTE;
END_VAR
VAR_OUTPUT
q: BYTE;
END_VAR
-------
i.2:=1;
q:=i;
(*вызвающая программа*)
proba1(i:=by1,q=>by1);
Вид для печати
to Денис_Гуливатенко. Будет. Я только что проверил. :) Можно еще так:
(*пользовательский блок proba*)
VAR_INPUT
i: BYTE;
END_VAR
VAR_OUTPUT
q: BYTE;
END_VAR
-------
i.2:=1;
q:=i;
(*вызвающая программа*)
proba1(i:=by1,q=>by1);
Спасибо. В не сообразил в эмуляторе проверить:(
По моему Вы куда-то не туда свернули.
А почему нельзя использовать явную адресацию переменных? Используйте входные и выходные переменные ФБ.
Ведь ФБ делают тогда, когда предполагается использовать его многократно в разных частях проекта и в главной программе и в не главных программах или внутри других ФБ. При каждом использовании одного и того же ФБ создаются его копии(реализации) и каждая живет своей жизнью.
Если же в ФБ изменять косвенно значения переменной в вызывающей программе , то о использовании такого ФБ в других POU бессмысленно. И это уже не ФБ, а программа(подпрограмма). Но и у программы есть входные и выходные переменные.
Эти переменные и предназначены для передачи значений между ФБ или программой и вызывающей их главной программой.
Разница между ФБ и программой
Цитата:
Программа
Программа - это POU, способный формировать произвольное число значение во время вычислений. Значения всех переменных программы сохраняются между вызовами. В отличие от функционального блока экземпляров программы не существует. Программа является глобальной во всем проекте.
Нельзя вызывать программу из функции.
Если вызвать программу, которая изменит значения своих переменных, то при следующем вызове ее переменные будут иметь те же значения, даже если она вызвана из другого POU.
В этом заключается главное различие между программой и функциональным блоком, в котором изменяются только значения переменных данного экземпляра функционального блока.
Создаем массив из 6 элементов типа структура. Структура из наработки, флага разрешения запуска и текущего состояния. дальше создаем переменную A где будет хранится номер выбранного котла и пишем туда ноль. Далее в цикле FOR i=1 TO 6 DO Проверяем возможность запуска котла и что он остановлен. Если условия выполнены то если А=0 то A= текущий котел. Если не нулю то проверяем если наработка текущего котла меньше чем наработка котла в массиве с индексом равным А то А= номер текущего котла.
P.S. У меня есть аналогичный пример с наработкой насосов, могу прислать на почту.
Я попробую объяснить для чего я это затеял. Мне нужно к ПЛК73 подключить чатотник iG5A. В данном контроллере все настройки подключения нужно описывать в программе. А управление через командное слово, в котором каждый бит определенная команда для него. Я хочу сделать отдельно функции для запуска/останова/аварийного установа/ и т.д. А в значении переменной(глобальной) буду после запуска той или иной функции менять биты, чтобы командное слово было "правильно" записано, то есть чтобы не было противоречий "запуск" и "останов" одновременно.Цитата:
По моему Вы куда-то не туда свернули.
Поправьте, если я неправильно думаю))
Уважаемый petera, Вы увлеклись или зациклились на ФБ, а есть ведь еще и функции, если возвращать необходимо множество значений, то можно пойти двумя способами: возвратить структуру, а потом после вызова распределять знчения по переменным программы, а можно послать функции указатели и прям в теле функции изменить требуемые значениЯ
Что-то про простой VAR_IN_OUT никто ничего не сказал. Нелюбят штоли
Добрый день... До сих пор занимаюсь каскадом с котлами. Интересует такой вопрос:
Допустим у нас есть диапазоны разностей температур уставки и подачи (0-5 градусов - включаем один котел, 5-15 градусов - включаем второй (два) котел и т.д). К примеру я задаю условие (см. приложение) для включения одного котла, он включается, в режиме отладки меняю текущую температуру на более высокую, прописываю условие, что при такой температуре котел с макс наработкой должен выключиться, он выключается...
Не могу сделать включение второго котла при переходе в диапазон работы двух котлов...
Vlad_45, тут тема про это есть. Может там Вам быстрей ответят http://www.owen.ru/forum/showthread.php?t=14338
А тут и намека про бит нет ))Цитата:
Как можно изменить значение переменной главной программы в пользовательском ФБ.
Через указатель можно?
(* фрагмент из PLC_PRG*)
start_adr:=ADR(start);
FB(i:=start_adr)
------------------------------
(* фрагмент из пользовательского блока*)
i^.8:=0; (*записываем 8бит переменной start*)
Как правильно в Codesys подключить модуль МВА8 - как OWEN_MVA8 или как Universal Modbus device с добавлением подэлементов Real Input module? В документации - первый вариант, в видеокурсе - второй. Как же все-таки более правильно?
Правильно и так и так.
В документации описание и так и так.
Рекомендации - подключайте как UniversalModBus Device.
Вас понял. Спасибо!
Вот у вас там используется триггер для фиксации работы блока... Я до сих пор не могу понять куда запихнуть условие сброса и как его правильно включать. Пока только он работает, если его сбрасывать вручную...
Вот элемент вызова вашего блока:
perebor_min( (*назвал так ФБ в PLC_PROG*)
t := timeworktek, (*Присваиваю время из своего счетчика*)
start:= TRUE,
kotel_number => start_kot); (*номер котла в массиве котлов устанавливаю в ИСТИНА*)
kotly [start_kot] := TRUE;
Вызов повторяется циклически, время меняется, а перебор не работает, так как триггер не сбрасывается
При запуске ФБ, то есть пришел сигнал на вход start, RS триггер фиксирует включенное состояние (как бы вход start становится постоянно включенным) на время работы блока. Это нужно для того, чтобы ФБ не реагировал на вход start в процессе того как он делает свою работу. Как только весь перебор произведен сбрасываем его, у меня сброс где-то в конце. После этого ФБ снова готов к запуску на выполнение. Другими словами смысл использования RS триггера в том, что пока ФБ не сделает весь перебор и не найдет нужный котел, еще раз его запустить не получится.
Да, в ФБ перебор происходит не в одном цикле ПЛК, а каждый шаг в новом цикле, имейте это в виду. Т.е. для перебора мы не создаем свой цикл, а используем цикл ПЛК.
Добрый день. Пытаюсь настроить отклик плк63-L на нажатие комбинации клавиш "Альт" + "Вверх". Где то здесь на форуме видел пример, сделал так как там написано было, то есть вот так вот:
rm(clk:=kbrd=136 ); (*альт+вверх=128+8*)
IF rm.Q THEN
Tech_support:=TRUE;
END_IF
Однако в отладчике значение переменной не изменяется после нажатия этих клавиш (переменная Tech_support объявлена как Global Retain, rm:R_TRIG).
Где я был неправ? Все это делается в режиме Work_mode.
P.S. Совсем забыл, может кто то подкинуть пример или объяснить как работать с отдельными битами внутри переменной (например типа word или int).
такой вопрос, вкратце: как к работающим котлам прибавить еще один котел с задержкой 10 мин при выполнении некоего условия, потом еще один котел через 5 минут при выполнении некоего условия, потом еще один через 5 мин. и т.д?
Какими лучше таймерами пользоваться? как логика должна строиться?
Таймер TON вполне подойдет..
пробовал... получается сделать задержку запуска одного котла.... второй и остальные включаются вместе с первым. не могу нормально условия прописать
так такие вещи надо изучать на проектах конкретно с таймером, чтоб понять его работу, а не в большой системе
Кстати вот и я когда то включал последовательно четыре насоса по уставке http://www.owen.ru/forum/showthread....ll=1#post63186
да и саме тема полна примеров на любой вкус
у меня сейчас часть проекта вынесена в отдельную программу с которой я работаю и отлаживаю работу таймеров и последовательность включения.
и .exp - это что за прога?
Подскажите пожалуйста, приобрёл для обучения Owen PLC 110-32M-R для програм
мирования в CoDeSys v.2. Программы с применением одного ПЛК у меня получаются,
а вот с подключением модуля расширения МК110 224.8ДН4Р по шине RS-485 у меня
не получается никак. Все настройки у них по свойствам связи все одинаковые
(скорость, биты и т.д.). Перечитал уже сколько раз эти инструкции по этим
приборам, но связи в программном ходе задачи нетушки. Может быть что-то не
так настраиваю в свойствах ПЛК, понять не могу. Мне всего-то нужно чтобы
каждый вход и выход работал независимо, т.е. по программе (вкл-выкл) без
всяких ШИМ. Уже ставил Modbus Master связь RS-485, Universal Modbus device.
Для входа Register Input module, в параметрах модуля Registr - 51 (81).
Command - Read holding Registers (0x03). Для выхода Register Output module,
в параметрах модуля Registr - 50 (80). Command - Preset singl Registers (0x06).
Но всё равно в тестовой программе при
подачи на вход сигнала, нет его на выходе, мне кажется сигнал пролетает за
микросекунды. А как сделать чтобы сигнал был постоянным, пока есть сигнал на
входе и на выходе не пролетал за микросекунды, а держался пока это необходимо
по программе.
Подскажите пожалуйста как и что написать в Register Input module и Register Output module, в полях Register Address, Command. Чтобы сигнал удерживался на выходе МК110 224.8ДН4Р по логике программы а не пролетал за микросекунды. По программе сигнал ВКЛ выходного реле, а на выходе реле уже давно отключилось.
Заранее ВАм большое спасибо за ответ. Уж очень хочется правильного ответа!!!
При нажатии Альт+Вверх пишет kbrd=136, однако rm.Q=Flase; Tech_support=False; Может я неправильно понимаю смысл самого блока R_TRIG? Он должен генерировать TRUE на выходе на время 1 цикла ПЛК если условие будет верно?
2. Если у меня переменная w типа int, я могу написать так: w.3:=1; w.10:=0;? Я не работал раньше с битовыми операциями, Ваша запись мне немножко непонятна :)
P.S. Или мб в этом примере w.3 := 3 > 5 результат логического сравнения записывается в 3 бит?
Клава — видна.Понимаете правильно, уточню - подъем по переднему фронту. Кусок кода верный. Варианты:
1.Сам участок невыполняется
2.Где-то сразу опускают Tech_support
1.1 Нажать F5
1.2 Вставить счетчики и думать
2. ДуматьКод:rm(..);
c1 := c1 + 1;
if rm.q then
c2 := c2 + 1;
..
end_if
byte/word/dword, да
Добрый день! Вопрос более приземленный к корифеям кдс: Подскажите пожалуйста как реализовать визуализацию состояния счетчика CTU и возможно ли это, в Direct Logic там оно на поверхности.
Спасибо. Это я знаю(это информация для самого программиста), а вот как это перенести на HMI-пользователю?
Спасибо все получилось, я просто не сообразил.что именно выход счетчика и пытался копать внутри его..
Подскажите простой способ получения текущей даты и времени в виде строки.
Нашел только ФБ CurTimeEx
Но для получения в виде строки нужно еще массу вычислений сделать.
Ок. Спасибо. Просто думал, что существует готовая функция.
Еще вопрос: Если я пишу функцию, которая будет возвращать тип STRING. Каков механизм передачи этой строки?
str := func();
Будет передан указатель на строку или скопируется сама строка?
Какой тип функции при создании присвоите тот и будет, у готовых функций обычно есть описалово по типам входов и выходов
ЗЫ Вы как то увлекаетесь очень указателями , функия не имеет памяти, поетому указатель после своего выполнения теряет всякий смысл
Спасибо, не учел :)
Сейчас перечитал и стыдно за вопрос стало.
Где можно найти ntp и ftp клиента (библиотеку) для ПЛК?
Не хочется самому обработчик писать...
Здравствуйте подскажите пожалуйста как в CoDeSys 2,3 из PLCBrouser заменить прошивку контролера ПЛК 160 с помощью команды Update Core. Замена прошивки связана с пропаданием питания в контролере после отключения питания?
За раннее спасибо!