Страница 1028 из 1062 ПерваяПервая ... 285289289781018102610271028102910301038 ... ПоследняяПоследняя
Показано с 10,271 по 10,280 из 10618

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #10271
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,229

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    Здравствуйте, коллеги.
    Прошу помощи, в оптимизации кода. Возможно ли данный код привести к циклу чтобы реализовывать любое количество START_MOTOR
    Код:
    	IF Conveyors[2].motorSensor THEN
    		START_MOTOR1(inStart:=Conveyors[1].motorStart, inReset:=Conveyors[1].motorStop);
    		Conveyors[1].motorSensor := START_MOTOR1.OUT;
    	END_IF
    	IF Conveyors[3].motorSensor THEN
    		START_MOTOR2(inStart:=Conveyors[2].motorStart, inReset:=Conveyors[2].motorStop);
    		Conveyors[2].motorSensor := START_MOTOR2.OUT;
    	END_IF
    	IF Conveyors[4].motorSensor THEN
    		START_MOTOR3(inStart:=Conveyors[3].motorStart, inReset:=Conveyors[3].motorStop);
    		Conveyors[3].motorSensor := START_MOTOR3.OUT;
    	END_IF
    я пытаюсь делать в цикле но при любом Conveyors[i+1].motorSensor = TRUE все START_MOTOR срабатывают
    Код:
    	FOR i := 1 TO count - 1 DO
     	  IF Conveyors[i+1].motorSensor THEN
    		START_MOTOR(inStart:=Conveyors[i].motorStart, inReset:=Conveyors[i].motorStop);
    		Conveyors[i].motorSensor := START_MOTOR.OUT;
    	  END_IF
           END_FOR
    А разве может один экземпляр ФБ параллельно работать с несколькими группами значений?
    Наверное, все-таки надо объявить массив
    Код:
    START_MOTOR: ARRAY [1..10] OF fbSTART_MOTOR;

  2. #10272

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    А разве может один экземпляр ФБ параллельно работать с несколькими группами значений?
    Наверное, все-таки надо объявить массив
    Код:
    START_MOTOR: ARRAY [1..10] OF fbSTART_MOTOR;
    Благодарю вас! Это то что нужно и удалось реализовать расширяемость системы.
    Код:
    	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

  3. #10273
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,281

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    Благодарю вас! Это то что нужно и удалось реализовать расширяемость системы.
    Код:
    	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.

  4. #10274

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Я вот всего кода невижу, но СТАРТМОТОР (который фб) здесь не работает когда следующий конвейр не того.
    Так задумано?
    Да, все верно, когда следующий конвейер останавливается, то, коробка доходит до конца текущего конвейера и он останавливается. И наоборот при включении следующего, возобновляется движение предыдущего. Вроде реализовал, теперь бьюсь с визуализацией в Codesys

  5. #10275

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    Да, все верно, когда следующий конвейер останавливается, то, коробка доходит до конца текущего конвейера и он останавливается. И наоборот при включении следующего, возобновляется движение предыдущего. Вроде реализовал, теперь бьюсь с визуализацией в Codesys
    В версии 2.3? Или на скаде какой нибудь? Просто в кодесисе 2.3 визуализация вроде только в среде...

  6. #10276

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    В версии 2.3? Или на скаде какой нибудь? Просто в кодесисе 2.3 визуализация вроде только в среде...
    в кодесисе 2.3, мне чисто теория и примерный алгоритм нужен сейчас, в приложенном примере таргет для PLC110.30m(v2)
    Вложения Вложения

  7. #10277

    По умолчанию

    Добрый день, кто нибудь делал связку PLC овен 110-60 и бпс-3-и с газоанализаторами СТГ-3 в codesys 2.3? Не получается получить данные с бпс3

  8. #10278

    По умолчанию

    Цитата Сообщение от atomo2 Посмотреть сообщение
    Добрый день, кто нибудь делал связку PLC овен 110-60 и бпс-3-и с газоанализаторами СТГ-3 в codesys 2.3? Не получается получить данные с бпс3
    я не делал, просто рядом постоял
    если мне не изменяет память - там модбас, основные общие данные спокойно можно прочитать, там обычный byte, делайте UMD и считывайте и распаковывайте
    а если хотите всю детализацию, то и там и в СТГ тоже формат BCD, там 4 байта , тут надо уже глубоко погружаться . хотя это как и DWORD в принципе, но там надо повозиться с распаковкой и придёться скорее всего вручную это писать
    и зачем вам СТГ напрямую? он же адресный, для подключения к БПС
    Последний раз редактировалось In_Da_Cher_A; 08.02.2024 в 17:21.

  9. #10279

    По умолчанию

    Больше нет сил! Ткните носом, пожалуйста. Управление вентиляцией представлена структурой. В отдельном ФБ - все функции системы. Есть функция управления заслонкой без обратной связи с отслеживанием позиции по времени ее работы:
    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.

  10. #10280

    По умолчанию

    Цитата Сообщение от Easy_Enemy Посмотреть сообщение
    (В программе управления вентиляцией объявляем этот ФБ, как входной параметр указываем номер системы - V1(num:=1); )
    Перепробовал RETURN, убрать CASE за IF.. не могу осилить :/
    Да, и еще момент - через визиализацию видно, что таймеры работают, так как шаги шагаются ( Ven[num].Flap.sAdjust увеличивается, как положено ), но значения на вход не пишутся
    Проект выложите, в расширенном режиме, добавить файл.

Страница 1028 из 1062 ПерваяПервая ... 285289289781018102610271028102910301038 ... ПоследняяПоследняя

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •