Страница 1029 из 1177 ПерваяПервая ... 29529929979101910271028102910301031103910791129 ... ПоследняяПоследняя
Показано с 10,281 по 10,290 из 11762

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

  1. #10281

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Проект выложите, в расширенном режиме, добавить файл.
    Зачистил все лишнее.

    Цитата Сообщение от capzap Посмотреть сообщение
    мало записать t1.in:=FALSE; надо еще и выполнить, поэтому лучше пишите t1(IN:=FALSE, PT:=t1.PT);
    это просто рекомендация, имеет ли она отношение к проблеме, не знаю
    Обычно таймерами не пользуюсь, просто пишу текущее время в переменную, и потом сравниваю, это уже от безысходности, но, попробую, спасибо!
    Вложения Вложения

  2. #10282

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    мало записать t1.in:=FALSE; надо еще и выполнить, поэтому лучше пишите t1(IN:=FALSE, PT:=t1.PT);
    это просто рекомендация, имеет ли она отношение к проблеме, не знаю
    Это точно имеет к этому отношение

    И ещё сходу не увидел, где инициализируется переменная case "Ven[num].Flap.sAdjust" (изначально она имеет значение 0, а case указаны только для значений 1...3)?

  3. #10283

    По умолчанию

    Цитата Сообщение от 1exan Посмотреть сообщение
    Это точно имеет к этому отношение

    И ещё сходу не увидел, где инициализируется переменная case "Ven[num].Flap.sAdjust" (изначально она имеет значение 0, а case указаны только для значений 1...3)?
    С таймером - не прокатило.. Изначально, управление сложнее, с бОльшим кол-вом переменных, через TIME(). Чтобы не отнимать время на кучу кода - втыкнул таймер.
    Про Adjust - да, прошу прощения: это пытался вывести CASE за условие IF (Если нужна калибровка, то Adjust =1, иначе 0, энд иф. И уже далее - просто кейс. Так тоже не сработало). Вернул счет с единички - тоже самое: при калибровке - система стоит. Уже попробовал ОТКР/ЗАКР вынести в отдельную функцию, а фб оставить чисто на такие модули с таймерами. Результат тот же..

  4. #10284

    По умолчанию

    Цитата Сообщение от Easy_Enemy Посмотреть сообщение
    С таймером - не прокатило.. Изначально, управление сложнее, с бОльшим кол-вом переменных, через TIME(). Чтобы не отнимать время на кучу кода - втыкнул таймер.
    Про Adjust - да, прошу прощения: это пытался вывести CASE за условие IF (Если нужна калибровка, то Adjust =1, иначе 0, энд иф. И уже далее - просто кейс. Так тоже не сработало). Вернул счет с единички - тоже самое: при калибровке - система стоит. Уже попробовал ОТКР/ЗАКР вынести в отдельную функцию, а фб оставить чисто на такие модули с таймерами. Результат тот же..
    Покажете вариант, в котором не прокатило?

  5. #10285

    По умолчанию

    Цитата Сообщение от 1exan Посмотреть сообщение
    Покажете вариант, в котором не прокатило?
    Код:
    IF Ven[num].Flap.xAdjust THEN (* Выносим Case за IF *)
    	Ven[num].Flap.sAdjust:=1;
    ELSE
    	Ven[num].Flap.sAdjust:=0;
    END_IF;
    
    CASE Ven[num].Flap.sAdjust OF (*то же, без цикла IF*)
    	1: Ven[num].Flap.Close:=FALSE; (*Шаг 1*)
                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, PT:=t1.PT);
        	    END_IF;
    	2: VEN[num].Flap.Close:=TRUE; (* Шаг 2*)
    	    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, PT:=t1.PT);
    	    END_IF;
    	3: VEN[num].Flap.Close:=FALSE; (* Шаг 3*)
    	    VEN[num].Flap.Open:=FALSE;
    	    Ven[num].Flap.sAdjust:=0; (* Сбрасыываем все *)
    	    Ven[num].Flap.xAdjust:=FALSE;
    END_CASE
    Думал ошибка инициации ФБ, уже намертво прибил Ven[1], но, с другой стороны, все 9 заслонок открываются/закрываются, значит все ок.. воткнуть RETURN после каждого шага, чтобы, условно, "не ждать сейчас таймер, заглянем потом" - так же не дают результата..


    Код:
    IF Ven[num].Flap.sAdjust = 1 THEN
    	Ven[num].Flap.Close:=FALSE;
    	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, PT:=t1.PT);
    	END_IF;
    END_IF;
    IF Ven[num].Flap.sAdjust = 2 THEN
    	VEN[num].Flap.Close:=TRUE; 
    	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, PT:=t1.PT);
    	END_IF;
    END_IF;
    IF Ven[num].Flap.sAdjust = 3 THEN
    	VEN[num].Flap.Close:=FALSE;
    	VEN[num].Flap.Open:=FALSE;
    	Ven[num].Flap.sAdjust:=0;
    	Ven[num].Flap.xAdjust:=FALSE;
    END_IF;
    Тоже самое, но без CASE. Не катит..
    Последний раз редактировалось Easy_Enemy; 12.02.2024 в 17:52.

  6. #10286

    По умолчанию

    У вас переменная bool, а вы её в кейс засунули как переменную инт, и она в первом иф всегда 1...
    Пардон, там x... и s...
    Выносите таймеры из кейса.

    Если честно, кровь из глаз чуть не пошла от этого кода. Ничего там не понял... Вернее впал в спупор.

    Вы же в кодесисе... Таймеры запускаются? В кейсах или ифах сделайте переменную равную тру, у уже ей запускайте таймер вне условий. Сброс таймеров можете таким же оставить, но только с командой фальш без задания времени.
    Код:
    t1(IN:=парарам, PT:=T#40s);
    IF Ven[num].Flap.sAdjust = 1 THEN
    	Ven[num].Flap.Close:=FALSE;
    	VEN[num].Flap.Open:=TRUE;
    	Парарам :=тру;
    	IF t1.q THEN
    		Ven[num].Flap.sAdjust:=Ven[num].Flap.sAdjust+1;
    		t1(IN:=FALSE);
    	END_IF;
    END_IF;
    И т.д.
    
    
    
    IF Ven[num].Flap.sAdjust = 2 THEN
    	VEN[num].Flap.Close:=TRUE; 
    	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, PT:=t1.PT);
    	END_IF;
    END_IF;
    IF Ven[num].Flap.sAdjust = 3 THEN
    	VEN[num].Flap.Close:=FALSE;
    	VEN[num].Flap.Open:=FALSE;
    	Ven[num].Flap.sAdjust:=0;
    	Ven[num].Flap.xAdjust:=FALSE;
    END_IF;
    И ещё одно замечание:
    T1[I](IN:=парарам[I], PT:=T#40s);
    Последний раз редактировалось МихаилГл; 12.02.2024 в 18:16.

  7. #10287

    По умолчанию

    Цитата Сообщение от Easy_Enemy Посмотреть сообщение
    Код:
    ...
    Думал ошибка инициации ФБ, уже намертво прибил Ven[1], но, с другой стороны, все 9 заслонок открываются/закрываются, значит все ок.. воткнуть RETURN после каждого шага, чтобы, условно, "не ждать сейчас таймер, заглянем потом" - так же не дают результата..


    Код:
    ...
    Тоже самое, но без CASE. Не катит..
    Наверно такое хотели получить:
    Код:
    IF Ven[num].Flap.xAdjust THEN (* Выносим Case за IF *)
    	IF Ven[num].Flap.sAdjust=0 THEN Ven[num].Flap.sAdjust:=1; END_IF;
    ELSE
    	Ven[num].Flap.sAdjust:=0;
    END_IF;
    
    CASE Ven[num].Flap.sAdjust OF (*то же, без цикла IF*)
    	1: Ven[num].Flap.Close:=FALSE; (*Шаг 1*)
            VEN[num].Flap.Open:=TRUE;
    	    t1(IN:=TRUE, PT:=T#10s);
    	    IF t1.q THEN
    			Ven[num].Flap.sAdjust:=2;
    			t1(IN:=FALSE);
        	END_IF;
    	2: VEN[num].Flap.Close:=TRUE; (* Шаг 2*)
    	    VEN[num].Flap.Open:=FALSE;
    	    t1(IN:=TRUE, PT:=T#10s);
    	    IF t1.q THEN
    			Ven[num].Flap.sAdjust:=3;
    			t1(IN:=FALSE);
    	    END_IF;
    	3: VEN[num].Flap.Close:=FALSE; (* Шаг 3*)
    	    VEN[num].Flap.Open:=FALSE;
    	    Ven[num].Flap.sAdjust:=0; (* Сбрасыываем все *)
    	    Ven[num].Flap.xAdjust:=FALSE;
    END_CASE
    
    
    (*Функция открытия заслонки*)
    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;
    
    (* Функция закрытия заслонки *)
    IF Ven[num].Flap.Close THEN
    	IF Ven[num].Flap.Close AND NOT Ven[num].Flap.xClose THEN
    		Ven[num].Flap.xClose:=TRUE;
    		Ven[num].Flap.xOpen:= FALSE;
    		Ven[num].Flap.t_Pos:=TIME();
    	ELSIF Ven[num].Flap.Close AND Ven[num].Flap.xClose 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 < 0 THEN Ven[num].Flap.Pos:=0;
    		END_IF;
    	ELSE
    		Ven[num].Flap.xClose:=FALSE;
    	END_IF;
    END_IF;
    А какая вообще функция у данного механизма и зачем нужна калибровка?

  8. #10288

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    У вас переменная bool, а вы её в кейс засунули как переменную инт, и она в первом иф всегда 1...
    Пардон, там x... и s...
    Выносите таймеры из кейса.

    Если честно, кровь из глаз чуть не пошла от этого кода. Ничего там не понял... Вернее впал в спупор.

    Вы же в кодесисе... Таймеры запускаются? В кейсах или ифах сделайте переменную равную тру, у уже ей запускайте таймер вне условий. Сброс таймеров можете таким же оставить, но только с командой фальш без задания времени.
    Таймеры и внутри и за CASE - работают. Работает и счетчик шагов, но не присваивались значения на выходы ПЛК..

    Опыт путем выяснил следующее: если в цикл запихнуть переменную, привязанную, непосредственно к выходу ПЛК - все работает. Если (как в моем случае) - это именно функция управления - не хочет ее обработать, что достаточно печально.. Будем разбираться, как это обходить..


    Цитата Сообщение от МихаилГл Посмотреть сообщение
    И ещё одно замечание:
    T1[I](IN:=парарам[I], PT:=T#40s);
    Не знаю, насколько правильно, но вместо таймеров провожу сравнения. Как минимум - все необходимые периоды, как правило, в одном месте, в какой-нибудь структуре..
    Код:
    ...
    Ven[num].Flap.tMove:=TIME(); (*Присваиваем текущую временную метку*)
    ...
    IF (TIME() - Ven[num].Flap.tMove) >= Ven[num].Flap.lMove THEN   (*Если текущее время плк минус временная метка больше-равно нужной, то..*)
       Ven[num].Flap.sAdjust:=3;
       Ven[num].Flap.tMove:=TIME();  (*Обновляем метку, если нужно*)
    END_IF;

    Цитата Сообщение от 1exan Посмотреть сообщение
    А какая вообще функция у данного механизма и зачем нужна калибровка?
    Это заслонки воздуховодов одновременно, приточки, кондеев и парогенератора. То есть, помимо регулировки воздушного потока "по восстребованию", они играют роль предохранителя от затопления воздуховодов увлажнителем, если авария у УК и отвалится подача, упадет качество воздуха (докинуть свежего), факторов уйма. А калибровка - банально нет датчиков положения, есть только концевики внутри самого привода. Все равно позиционирование будет копить ошибки и раз в месяц-пару нужно синхронить положение. Плюс "не залипнут", если в одном положении давно, что уже бывало..
    Последний раз редактировалось Easy_Enemy; 12.02.2024 в 19:17.

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

    По умолчанию

    а накой уходить в 3й шаг? заради выключить выходы?
    зачем мутилово с IF перед case? шаг 0 в case может быть из ";"
    чего флапу не сделать свой action где он это все без ven[num].flap.

  10. #10290

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    а накой уходить в 3й шаг? заради выключить выходы?
    Порядок такой - запоминаем текущее положение -> открываемся -> закрываемся -> возвращаемся туда, "где вроде было ок" -> отстаиваемся чуть -> передаем управление обратно ПИДу. Это уже упрощенный варик, чтоб хоть как-то заставить сиё работать..

    Цитата Сообщение от Валенок Посмотреть сообщение
    зачем мутилово с IF перед case? шаг 0 в case может быть из ";"
    просто тест, мало ли.. с учетом перепробаванных вариантов - почему нет..

    Цитата Сообщение от Валенок Посмотреть сообщение
    чего флапу не сделать свой action где он это все без ven[num].flap.
    Заслонок 9 (помещений), по 2 выхода на штуку (18). Помимо них - еще куча мишуры, пресущей данным помещениям. И не хотелось бы возиться с каждым такой штукой отдельно, собственно, было написано маппирование, а управление - через циклы и аттрибуты через точки

Страница 1029 из 1177 ПерваяПервая ... 29529929979101910271028102910301031103910791129 ... ПоследняяПоследняя

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

Ваши права

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