Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 20 из 20

Тема: Прикол с TP, TON и TOF

  1. #11

    По умолчанию

    Цитата Сообщение от Pruvet Посмотреть сообщение
    Экземпляр функции объявлен в области глобальных переменных.
    Функции не имеют экземпляров.

    Цитата Сообщение от Pruvet Посмотреть сообщение
    DELAY.ZAB(IN:=0)
    Это нормальный сброс, но учтите что таймер управляется
    перепадами сигналов. Если перед этим он вызывался с 1, теперь с 0, то будет сброс.

    * При наблюдении значений переменных в отладчике, нужно совершенно четко понимать, что отображает и считывает он данные из контроллера асинхронно, несколько раз в секунду. Контроллер за это время несколько сотен циклов прокрутит. Переменная могла 200 раз поменяться, а на экране видно не будет. См. трассировку.

    * В SFC действие шага выполняется последний раз уже после того как шаг активность потерял!!! В это время уже работает след. шаг. Таково требование стандарта МЭК. В этом есть глубокий смысл (если интересно, то поясню какой).

  2. #12

    По умолчанию

    Ну так он сбрасываться должен с помощью DELAY.ZAB(IN:=false) , почему ты на вход ТР посылаешь 0 и CDS на это не ругается, непонятно!!!
    А вообще в самой функции стоит прописать сразу после инициализации сброс входа в false...
    А ещё лучше используй TON...

  3. #13

    По умолчанию

    Цитата Сообщение от Игорь Петров
    tmrZ(In:=start_tmr,pt:=T#1450MS);
    IF ACP_get_zapros=1 THEN
    start_tmr:=FALSE; //обнулили вход экземляра ФБ
    ....
    start_tmr:=TRUE; //и сразу опять установили
    //в след. цикле вызываем ФБ с опять установленным
    входом. Итого, никто его со сброшенным входом ни разу не вызвал и сделать свою работ по сбросу шансов у него нет... в ST с этим нужно тщательнее.
    Точно точно, затупил малёк, странно что тот пример у мя отробатывает))), но правельнее так:
    Код:
    IF ACP_get_zapros=1 THEN 
    	start_tmr:=FALSE;
    	tmrZ(In:=start_tmr,pt:=T#1450MS);
    	//выполняю первую процедуру
    	ACP_get_zapros:=7;
    	start_tmr:=TRUE;
    	tmrZ(In:=start_tmr,pt:=T#1450MS);
    END_IF
    IF ACP_get_zapros=7 AND tmrZ.Q=TRUE THEN 
    	//выполняю вторую процедуру
    	ACP_get_zapros:=0;
    END_IF
    И всётаки, если я эти переменные (tmrZ и start_tmr) объявлю в этой функции, скока они жть будут? Или в КДС об этом можно не думать?

  4. #14

    По умолчанию

    FALSE и 0 нет разницы.
    Про TON правильный совет. TP обязан отработать интервал всегда, 0 на входе или 1 ему до фонаря, если его запустили, то он выдаст импульс четко заданной длительности.

  5. #15

    По умолчанию

    Цитата Сообщение от Crusash Посмотреть сообщение
    И всётаки, если я эти переменные (tmrZ и start_tmr) объявлю в этой функции, скока они жть будут? Или в КДС об этом можно не думать?
    Думать надо. Все же из примера не видно это именно функция или ФБ... В функции будут обновляться при каждом ее вызове. Тут надо сделать ФБ, объявить все локально, и переменные будут жить вечно Не надо их глобальными делать.

  6. #16

    По умолчанию

    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    Думать надо. Все же из примера не видно это именно функция или ФБ... В функции будут обновляться при каждом ее вызове. Тут надо сделать ФБ, объявить все локально, и переменные будут жить вечно Не надо их глобальными делать.
    Большое спасибо, что прояснили этот момент...
    А если в PROGRAM сделать, переменные долго проживут?
    ...
    забыл уточнить: почему не сробатывает такой вызов tmrZ.IN:=TRUE;
    вход меняется, а выходы нет...
    Последний раз редактировалось Crusash; 06.07.2009 в 15:38.

  7. #17

    По умолчанию

    Цитата Сообщение от Crusash Посмотреть сообщение
    Ну так он сбрасываться должен с помощью DELAY.ZAB(IN:=false) , почему ты на вход ТР посылаешь 0 и CDS на это не ругается, непонятно!!!
    А вообще в самой функции стоит прописать сразу после инициализации сброс входа в false...
    А ещё лучше используй TON...
    Спасибо за совет, уже внимательно почитал PDF, особенно диаграммы работы и сделал TON, заработало...

  8. #18

    По умолчанию

    Цитата Сообщение от Crusash Посмотреть сообщение
    А если в PROGRAM сделать, переменные долго проживут?
    Да, долго. Программа похожа на ФБ, но не имеет экземпляров. Например, написал я свой таймер. Ну из программы 1 могу сделать. Все. Сделать их несколько, чтобы каждый имел свои внутренние данные = разные времена запуска, выдержки... никак, тут только ФБ с экземплярами.

    Обычно 'программы' делают на верхнем уровне. Если многозадачный проект, то он имеет несколько программ, связанных с задачами. Внутри программы используем функции и ФБ.

    Цитата Сообщение от Crusash Посмотреть сообщение
    забыл уточнить: почему не сробатывает такой вызов tmrZ.IN:=TRUE;
    вход меняется, а выходы нет...
    Дык это и не вызов совсем. Это просто изменение входа. Можно заранее все нужные входы поустанавливать в разных местах, затем вызов сделать совсем пустой, типа:
    tmrZ;

    Для полного понимания, подумайте над этим: допустим нужна такая штука как блок данных. Т.е. никакого кода, просто некий набор взаимосвязанных данных. В CoDeSys делаем пустой ФБ, без кода, только с переменными и получаем что надо. Это имеет право на жизнь. Можно наделать экземпляров этих блоков, хранить в них данные, обращаясь через точку. Это и есть метод работы с данными без вызова самого ФБ.

  9. #19

    По умолчанию

    Отлично, всё встаёт на свои места,
    спасибо что объяснили...

  10. #20
    Пользователь
    Регистрация
    18.03.2007
    Адрес
    г. Краснодар
    Сообщений
    233

    По умолчанию

    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    Для полного понимания, подумайте над этим: допустим нужна такая штука как блок данных. Т.е. никакого кода, просто некий набор взаимосвязанных данных. В CoDeSys делаем пустой ФБ, без кода, только с переменными и получаем что надо. Это имеет право на жизнь. Можно наделать экземпляров этих блоков, хранить в них данные, обращаясь через точку. Это и есть метод работы с данными без вызова самого ФБ.
    А можно в ФБ добавить Action (Save, Read итп) и и вызывая ФБ().Read или ФБ().Save писать и читать, например в файл.

Страница 2 из 2 ПерваяПервая 12

Ваши права

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