Благодарю вас! Это то что нужно и удалось реализовать расширяемость системы.
Код:FOR i := 1 TO count - 1 DO IF Conveyors[i+1].motorSensor THEN START_MOTORS[i](inStart:=Conveyors[i].motorStart, inReset:=Conveyors[i].motorStop); Conveyors[i].motorSensor := START_MOTORS[i].OUT;(*Имитируем ответный сигнал что конвейер запустился*) END_IF END_FOR
Последний раз редактировалось Валенок; 04.02.2024 в 13:13.
Добрый день, кто нибудь делал связку PLC овен 110-60 и бпс-3-и с газоанализаторами СТГ-3 в codesys 2.3? Не получается получить данные с бпс3
я не делал, просто рядом постоял
если мне не изменяет память - там модбас, основные общие данные спокойно можно прочитать, там обычный byte, делайте UMD и считывайте и распаковывайте
а если хотите всю детализацию, то и там и в СТГ тоже формат BCD, там 4 байта , тут надо уже глубоко погружаться . хотя это как и DWORD в принципе, но там надо повозиться с распаковкой и придёться скорее всего вручную это писать
и зачем вам СТГ напрямую? он же адресный, для подключения к БПС
Последний раз редактировалось In_Da_Cher_A; 08.02.2024 в 17:21.
Больше нет сил! Ткните носом, пожалуйста. Управление вентиляцией представлена структурой. В отдельном ФБ - все функции системы. Есть функция управления заслонкой без обратной связи с отслеживанием позиции по времени ее работы:
FUNCTION_BLOCK VenFunctions
VAR_INPUT
num : INT;
END_VAR
--------------------
...
IF Ven[num].Flap.Open THEN
IF Ven[num].Flap.Open AND NOT Ven[num].Flap.xOpen THEN
Ven[num].Flap.xOpen:=TRUE;
Ven[num].Flap.Close:=Ven[num].Flap.xClose:=FALSE;
Ven[num].Flap.t_Pos:=TIME();
ELSIF Ven[num].Flap.Open AND Ven[num].Flap.xOpen THEN
Ven[num].Flap.Pos:= Ven[num].Flap.Pos + 0.00258 * (TIME_TO_REAL(TIME() - Ven[num].Flap.t_Pos));
Ven[num].Flap.t_Pos:=TIME();
IF Ven[num].Flap.Pos > 90 THEN Ven[num].Flap.Pos:=90;
END_IF;
ELSE
Ven[num].Flap.xOpen:=FALSE;
END_IF;
END_IF;
...
Тоже самое и на закрытие. Отлично работает, видно включение выхода на ПЛК, видно движение в визуализации.
Вчера написал режим калибровки/антизалипания (время от времени полностью открывать, потом закрывать для синхронизации положения) и проблема, в том, что, по каким-то причинам данный функция пытается выполниться за 1 цикл ПЛК, то есть не записывает выходные переменные. Подскажите, как обыграть данную ситуёвину( Максимально упрощенный блок калибровки:
IF Ven[num].Flap.xAdjust THEN (* Пора калиброваться *)
CASE Ven[num].Flap.sAdjust OF (* Счетчик шагов в структуре *)
1: Ven[num].Flap.Close:=FALSE; (*Шаг 1, Открываем заслонку, понадобится 40 секунд с запасом *)
VEN[num].Flap.Open:=TRUE;
t1(IN:=TRUE, PT:=T#40s);
IF t1.q THEN
Ven[num].Flap.sAdjust:=Ven[num].Flap.sAdjust+1;
t1.in:=FALSE;
END_IF;
2: VEN[num].Flap.Close:=TRUE; (*Шаг 2, Закрываем заслонку, те же 40 секунд *)
VEN[num].Flap.Open:=FALSE;
t1(IN:=TRUE, PT:=T#40s);
IF t1.q THEN
Ven[num].Flap.sAdjust:=Ven[num].Flap.sAdjust+1;
t1.in:=FALSE;
END_IF;
3: VEN[num].Flap.Close:=FALSE; (*Шаг 3 Выключаем управление *)
VEN[num].Flap.Open:=FALSE;
Ven[num].Flap.sAdjust:=1; (* Сбрасываем счетчик *)
Ven[num].Flap.xAdjust:=FALSE; (* Завершаем режим калибровки *)
END_CASE
END_IF;
(В программе управления вентиляцией объявляем этот ФБ, как входной параметр указываем номер системы - V1(num:=1); )
Перепробовал RETURN, убрать CASE за IF.. не могу осилить :/
Да, и еще момент - через визиализацию видно, что таймеры работают, так как шаги шагаются ( Ven[num].Flap.sAdjust увеличивается, как положено ), но значения на вход не пишутся
Последний раз редактировалось Easy_Enemy; 12.02.2024 в 16:23.