Страница 856 из 1044 ПерваяПервая ... 356756806846854855856857858866906956 ... ПоследняяПоследняя
Показано с 8,551 по 8,560 из 10432

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

  1. #8551

    По умолчанию

    Сижу и "причесываю" код программы для увеличения быстродействия кода. На днях жду ПЛК. И обратил внимание, как я использую таймеры TON.
    Пример:
    ...
    TM_DV_2(PT:=T#150ms);
    IF NOT DV_2 THEN
    Flag_DV_2:=FALSE;
    END_IF
    TM_DV_2.IN:=DV_2;
    IF TM_DV_2.Q THEN
    Flag_DV_2:=TRUE;
    END_IF
    ...
    У меня на каждом цикле ПЛК отрабатывается это кусок . А почему бы "TM_DV_2(PT:=T#150ms);" не делать единожды в программе, например, на первом цикле работа ПЛК? Тем более, что параметр таймера не изменяется никогда. Что скажут специалисты? Я прав?

  2. #8552

    По умолчанию

    vsa Специалисты (ну или не очень) скажут вот что. Что приёмы программирования в ПЛК отличаются от других (некоторых) языков в том, что в ПЛК все блоки (в том числе и таймеры) обсчитываются там же, где и вызываются.
    Ээээ... образно говоря, если перейти просто на схемы. Вот у нас есть это самое реле времени с задержкой на включение в настоящем мире - на DIN-рейку в щите например. И у него есть напряжение питания, которое надо на него подать, чтобы оно включилось через заданное время.
    По твоей идее ты хочешь чуток кратковременно подать электропитание на это реле и рассчитывать на то, что оно каким-то хитрым образом потом останется влкюченным и само по себе сработает.

    В ключе ПЛК получается так, что отсчёт времени (или другую обработку) любой блок (FB - функциональный блок) ведёт только тогда, когда его вызывают. Я этого много раз не понимал, и для меня это было откровением.
    Ща я пущусь в дебри... давай подумаем, как нам самим написать свой TON и как он мог бы работать?
    Сделаем так:
    а) Если его IN перешёл с FALSE в TRUE - то запомним текущее время в ПЛК и заданное время PT.
    б) При каждом следующем обращении к TON (вот для чего всегда нужен его циклический вызов) будем сравнивать разницу текущего времени и запомненную. Если она больше заданного PT - то включаем выход, иначе - нет.
    Сделано это как раз для того, чтобы можно было прервать работу таймеров, записав в PT ноль.

    Какие моменты тут можно выделить:
    а) Разница прошедшего времени и заданного PT сравнивается всегда. Если PT окажется равным нулю или меньше насчитанного - то TON сразу сработает (то же справедливо и для TOF).
    б) Особенность вызова FB в CodeSys такая, что если явно не заданы их параметры - то они НЕ меняются.
    Да! Можно один раз написать:
    TM_DV_2(PT:=T#150ms);
    ...но потом, чтобы он правильно считал, нужны его вызовы в коде. Циклические. В них PT меняться не будет, но для работы TON ты его должен всё равно вызывать. Хоть без аргументов, но должен:
    TM_DV_2();

    Поэтому, что ты напишешь с PT, то без - пофиг. Но вызывать надо все FB циклически.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  3. #8553

    По умолчанию

    Cs-Cs, тема закрыта. Убедительно ответили. И я проверил на практике - не работает, если только на первом цикле обратится к таймеру для начала работы (TM_DV_2(PT:=T#150ms); ). Спасибо!

  4. #8554

    По умолчанию

    Напишу попроще, можно написать TM_DV_2(); Тогда РТ надо задать в предыдущей строке TM_DV_2.PT:=T#150ms;

    Можно написать TM_DV_2(PT:=T1); Т1 задать в объявлении переменных T1 : TIME:=T#150ms;

    Но если у вас 10 таймеров, то надо задать 10 штук T1 : TIME:=T#150ms; T2 : TIME:=T#150ms; T3: TIME:=T#150ms; и т.д.
    Последний раз редактировалось kondor3000; 29.01.2022 в 15:36.

  5. #8555
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    За причесывание кода... Быстродействие кода с таймерами - далеко под сомнением.
    Там где нужно быстродействие, там каждый цикл на счету, какие там таймеры?

  6. #8556

    По умолчанию

    Валенок Спасибо за фишку инициализации FB сразу с параметрами ^_^. Я такое мимио глаз пропустил. Я про это - очень круто!
    VAR
    TM_DV_2 : TON := (PT := T#150ms); //"параметр таймера не изменяется никогда" (С)
    END_VAR
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  7. #8557
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    ну конкретно здесь некое событие раз в 150мс. Ловят же не 150.000мс.
    1, 5, 200 таймеров - не влияет при том что минц 1мс.
    Но есть и другой код, потихошку может накопится и превышение 1мс
    Тогда таймеры выносятся в обслуживающий код.
    "Причесывание" кричного ко времени кода совсем не так выглядит. Там за 150мс может все кардинально измениться.

    А конкретно тут - оптимизировать нечего. Программа 100% будет выполняться раз в 5 быстрее таймера, по фактическому времени.

  8. #8558
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Ну, вот у вас таймер, 150 мс.
    Время цикла какое? 100? 200 мс? Или 10?
    Тут разные оптимизации...

  9. #8559

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Приведенный код своеобразный если он именно так и задуман...
    [/CODE]
    Большое спасибо за отклик на мой вопрос.

    В приведенном фрагменте используется TON таймер. Задача такая: имеется подъемное устройство, которое должно при подъеме груза останавливаться на верхнем датчике. Но опыт эксплуатации подобных подъемников показал, что останавливается подъемник не в середине датчика, а в самом его начале. И при больших грузах (300-500 кг) при снятии напряжения с электродвигателя, пока срабатывают механические тормоза, груз немного опускается и сходит с верхнего датчика. И сигнал от датчика теряется. Конечно я управляю движением частотным преобразователем. И все скажут, что нужно было отстраивать определенные параметры частотного преобразователя в режиме торможения. Тем более, что я их и настраиваю. Но иногда это не помогает. И я исправляю аварийную ситуацию простым таймером, который немного задерживает сигнал от верхнего датчика на 150ms (значение настраивается при наладке оборудования) и передает в программу состояние DV_2 в виде Flag_DV_2.
    И Вы хотите сказать, что пример моего таймера не выполнит поставленную задачу? Тут главное, что Flag_DV_2 должен быть в TRUE всегда пока имеется сигнал от DV_2. И в программе я контролирую не сам сигнал от датчика, а его флаг Flag_DV_2.
    И еще, я таким образом убираю кратковременное появления сигнала DV_2 от помех на линии. Подобными алгоритмами обрабатываю и кнопочные станции. Уж очень помеховосприимчивы линии связи от кнопок. Тем более, когда работают частотные преобразователи на маленьких частотах.

  10. #8560

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение

    Код:
    VAR
      TM_DV_2 : TON := (PT := T#150ms);
    ...
    TM_DV_2(IN := DV_2, Q => Flag_DV_2);
    Спасибо за красивый код! Попробовал - работает! Не знал, что так можно обходится ФБ.

Страница 856 из 1044 ПерваяПервая ... 356756806846854855856857858866906956 ... ПоследняяПоследняя

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

Ваши права

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