Да сделайте же промежуточные массивы и обращайтесь по индексу раз приперло
Да сделайте же промежуточные массивы и обращайтесь по индексу раз приперло
Во вложении - пример привязки элементов массива входов и массива выходов (20 входов и 20 выходов), соответственно, к входам и выходам ПЛ110-60 (данная модель плк выбрана для примера).
Далее, при написании задачи, можно отслеживать состояние i-го элемента массива входов, и, соответственно, управлять j-м элементом массива выходов, не занимаясь каждый раз многократными повторами и присваиваниями.
P.S. Если честно, то алгоритм самой задачи не совсем ясен.
Последний раз редактировалось kolyan; 11.08.2012 в 20:58.
Kolyan, cпасибо за ваш пример. Именно так все конечно работает. А я хотел присваивание делать внутри функции. Или хотя бы ФБ. Пока переделал примерно по методу Yegor - все кроме DO присваивается функцией внутри ФБ, а DO - в основной программе снаружи ФБ (как его выходная переменная (и используется внутри него))
Вот так примерно
Последний раз редактировалось Barboris; 13.08.2012 в 11:08.
Не рекомендую делать управление выходами и работу с входами в функциях и ФБ.
1. Программа становится не переносима, ФБ и Ф не универсальные.
2. Вспомнить потом что и зачем делалось сложно.
Не поленитесь, и создайте в основной программе массив в него записывайте данные из ФБ и из этого массива берите данные для выходов.
В дальнейшем сильно облегчит жизнь.
Стоит подобная задача, управлять множеством реле с обратной связью и неким контролем на разрешение включения реле и обрыве. Но в этой теме все примеры, которые выкладывали недоступны((. Как правильно организовать ФБ, передавать каждый раз в него значения входа, выхода и других переменных как параметры, а после ФБ присваивать входы\выходы обращаясь к внутренним переменным ФБ или можно как-то через указатель один раз передать и потом уже использовать в теле ФБ?
Первым способом вроде как работает, я каждый раз в параметры ФБ передаю значения входа, бит ModBus(устанавливается\сбрасывается по команде с ПК) и число(мощность нагрузки), внутри происходит проверка, таймер на включение с интервалом 1с, если после истечение времени на входе не будет сигнала, то выключаем реле. Также проходит проверка на мощность. Проверяется текущая мощность с допустимой, если текущая мощность + мощность реле > допустимой, то мы не включаем реле иначе к текущей + мощность реле. А после отработки ФБ я входу и регистру ModBus присваиваю значения обращаясь к экземпляру ФБ через точку к его внутренним переменным или выходным.
Что посоветуете?
Я делал булевый массив. В ФБ\ПОУ оперировал по индексу. В конце ПЛЦ_ПРГ ставил вызов на собственную ПОУ (проще делать на LD), где массив раскладывается на реальные DO.
На картинке показано упаковка входов в массив и распаковка другого массива на выхода.
vjgfjdgj.jpg
В LD не силен совсем, мне понятнее будет ST где все операции наглядно видно, что и как происходит. А какая разница, что мы будем после каждого вызова ФБ устанавливать значения выхода, что после всех ФБ установим значения выходов обращаясь выход:=массив[0] и т.д.
В общих чертах у меня сейчас выглядит так:
FB1(in1, mb_bit1, power1);
out1:=FB.output;
mb_bit1:=FB.mb_bit;
FB2(in2, mb_bit2, power);
out2:=FB.output;
mb_bit2:=FB.mb_bit;
И таких вызовов от 40шт, на каждое реле. Мы в ФБ передаем бит из ModBus_slave, значение выхода и некий параметр мощности за который отвечает конкретное реле. И внутри ФБ происходит логика включения и выключения реле с контролем обрыва и мощности.
Это примерный вариант, по памяти, так как весь проект на работе.
Последний раз редактировалось Casper17; 09.08.2019 в 10:13.
Я привел пример своей работы. Задача была обрабатывать в цикле четыре одинаковых процесса, но с разными параметрами для каждого процесса. Причем в одно время должен работать только один процесс, остальные ждать его завершения. Что бы не городить тонны букав на ST я делал свою ПОУ на LD, а в PLC_PRG на ST делается общий контроль всей работы.
В моем случае массивы объявлены глобально, следовательно доступны из любого ФБ\ПОУ как прямо указанному индексу, так и по индексу, в качестве которого работает переменная типа INT.
Вообще, упрощено ФБ работает так - затолкали ему на вход данные>ФБ их прожевал, используя только локальные переменные своего экземпляра, а так же глобальные>выкинул на выход. Используя массивы можно затолкать в цикл FOR (например) свои ФБ, которые используют переменную цикла (глобальная) в качестве индекса, а это сильно сократит количество кода при выполнении большого количества однотипных задач.
А если как-то передать указатель на вход, выход один раз каждому экземпляру ФБ и внутри него уже сразу менять состояние, а не после того как ФБ отработал, брать его выходные данные и устанавливать значения входа\выхода.