Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 18

Тема: правильное подавление дребезга контактов

  1. #1
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию правильное подавление дребезга контактов

    Не нашел ничего по этому вопросу на форуме. Я новичок в ПЛК, все здесь странно до удивления

    Скажите, плз, как красиво организовать опрос кнопки, подключенной к дискретному входу контроллера? Программа на SFC, бегает себе по кругу, опрашивает входы, изменяет выходы. Нужно, чтобы нажатие кнопки вызвало установку битовой переменной bStep, причем 1 раз на нажатие (хотя из-за дребезга контактов на вход поступает каша из нулей и единиц в течение нескольких десятков миллисекунд. Ну, а когда программа узнает об этом событии, то bStep нужно сбросить.
    Нажатие может произойти при активности разных шагов, естественно. В идеале, "ловить" нажатие нужно всегда - а уж отработку bStep сделаем только при необходимости.

    Если путано - извините. Но мне кажется, что задача настолько обычная, что у вас уже есть решения Может быть, эти решения где-то описаны. Но здесь хотелось бы не ссылку на примеры, а просто реализацию. Или хоть на пальцах...

    Спасибо!

  2. #2

    По умолчанию

    Цитата Сообщение от drvlas Посмотреть сообщение
    Нужно, чтобы нажатие кнопки вызвало установку битовой переменной bStep, причем 1 раз на нажатие (хотя из-за дребезга контактов на вход поступает каша из нулей и единиц в течение нескольких десятков миллисекунд. Ну, а когда программа узнает об этом событии, то bStep нужно сбросить.
    Все зависит от того, что именно вы хотите получить.
    Просто подавление дребезга контактов - "Time of filtration" в параметрах модуля "Discrete input" (PLC Configuration).
    Если нужна защита от случайных нажатий (требуется не просто ткнуть в кнопку, а нажать и подержать) - таймер TON.
    Если надо запомнить факт нажатия кнопки и обработать его в некой определенной фазе цикла работы установки (например, "production stop": доделали последнее изделие, а следующий рабочий цикл уже не начинаем), есть RS-триггер (см. библиотеку standard.lib, "Bistable function blocks"). Сигнал от кнопки на его вход SET, и будет помнить его до тех пор, пока программа не соизволит обратить на него внимание (и не сделает ему RESET после обработки).
    Выделение фронта сигнала (импульс по нажатию, либо по отпусканию кнопки) - функциональные блоки R_TRIG и F_TRIG.
    В общем, типовых "кирпичиков" достаточно. Стройте из них что хотите.
    Последний раз редактировалось Terrano1992; 28.10.2010 в 09:23.

  3. #3
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от Terrano1992 Посмотреть сообщение
    Все зависит от того, что именно вы хотите получить.
    Просто подавление дребезга контактов - "Time of filtration" в параметрах модуля "Discrete input" (PLC Configuration).
    Именно это, в данном случае. Открыл, посмотрел. Ожидал индивидуальной настройки по битам (ведь по односму входу дребезжащая кнопка, а по другому датчик, который нужно отработать максимально быстро).
    А увидел общее окошко на весь входной порт (если я правильно понял). Но в табличке индекс - это и есть номер бита? А время в миллисекундах?
    То есть именно это свойство "фильтрации" (как-то там отрабатывается без моего участия) - это и есть стандартный способ борьбы с дребезгом? Очень хорошо!
    Буду разбираться, спасибо!

    По остальным подсказкам - спасибо отдельное! Они подтвердили, что я уже начал кое-что понимать. Это важно новичку

  4. #4

    По умолчанию

    Цитата Сообщение от drvlas Посмотреть сообщение
    увидел общее окошко на весь входной порт (если я правильно понял). Но в табличке индекс - это и есть номер бита?
    Ну, почти да. Они по порядку в списке идут.
    Цитата Сообщение от drvlas Посмотреть сообщение
    А время в миллисекундах?
    В "попугаях". Размер одного попугая равен 100 микросекунд.
    Все это подробно описано в документе "PLC_Configuration_OWEN.pdf", который есть у вас на диске, прилагавшемся к ПЛК. Так что углубляться в детали не стану, сами прочтете.

  5. #5
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    спасибо, очень конкретно. почитаю.

  6. #6
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от Terrano1992 Посмотреть сообщение
    "PLC_Configuration_OWEN.pdf"
    Читаю. Есть вопрос.

    На входе у меня объявлена переменная

    _bStep AT %IX0.0.3: BOOL;

    Теперь наука говорит, что по дискретным входам есть:

    2.1.3. Подмодуль «Триггер» (Trigger)

    Супер! Ставлю этот подмодуль, чтобы на нажатие кнопки, после соответствующей фильтрации (50 попугаев период, это за 32 мс будет переход в TRUE) взвелся триггер и выдал один короткий импульс.
    В чем проблема: в окне конфигуратора входов в канале дискретных входов добавил
    Triger[VAR]
    AT %IX0.0.0: BOOL;
    В панели "Параметры модуля" ставлю Number of input = 3.

    Внимание, вопрос: почему описание триггера не изменяется? Как было
    AT %IX0.0.0: BOOL;
    так и осталось. Смотри приложенный скриншот.

    И в догонку. Как быть с именами? Вот то, что я в программе объявил

    _bStep AT %IX0.0.3: BOOL;

    - как связано с триггером, который, надеюсь, привяжу к этому же входу. Сейчас, когда триггер какого-то фига привязан к нулевому входу, попытка указать имя переменной в описании триггера

    _bStep AT %IX0.0.0: BOOL;

    вызывает ругань со стороны компилятора.

    Добавлено: аналогичная фигня и каналом ШИМ. Так же задаю номер порта не ноль, а в подмодуле PWM пишет:

    AT %QW1.0.0: WORD;
    Вложения Вложения
    Последний раз редактировалось drvlas; 29.10.2010 в 15:33. Причина: Добавил скриншот

  7. #7

    По умолчанию

    Внимание, вопрос: почему описание триггера не изменяется?
    Ну вот, пришлось с этим модулем поэкспериментировать Сам я им никогда не пользовался до сих пор...
    В общем, сразу после добавления "Триггера" на один из входов PLC в текущем проекте он перестал компилироваться. С ошибкой:
    Error 3454: The address '%IB0.0' points to a used memory block!
    Error 3454: The address '%IX0.0.0' points to a used memory block!

    И так было до тех пор, пока посмотрел на Node Id в "Trigger (VAR) / Base Parameters". Был он равен 0, как и у модуля "Discrete Input 8 bit (FIX)". Поставил ему от балды Node Id, не используемый ни одним из ранее созданных в конфигурации модулей (в моем случае это был 11) - ругань компилятора прекратилась.
    Не знаю, насколько это корректно... Экспериментировать дальше над контроллером с уже отлаженной и оттестированной бета-версией проекта не хотелось, так что заливать и проверять в работе не стал.
    Что касается имен - тут все вполне очевидно. Имена входов PLC - это глобальные переменные. Не могут одновременно существовать две разные глобальные переменные с одинаковым именем, возникнет ошибка "Error 3703: Several declarations with the same identifier". Обзовите триггер не "_bStep", а например "_bStepTrg", и проблема с именами решится. Ну и дальше проверьте сами - если _bStepTrg переходит в TRUE при каждом соответствующем изменении _bStep, то все работает нормально.

  8. #8
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от Terrano1992 Посмотреть сообщение
    Node Id, не используемый ни одним из ранее созданных в конфигурации модулей (в моем случае это был 11) - ругань компилятора прекратилась.
    Но проблема осталась. Теперь триггер считается

    AT %IX0.11.0

    И нет никакой связи между этим триггером и входом

    _bStep AT %IX0.0.0

    Изменение входа _bStep есть, а триггер этого не замечает.

    Цитата Сообщение от Terrano1992 Посмотреть сообщение
    Что касается имен - тут все вполне очевидно. Имена входов PLC - это глобальные переменные. Не могут одновременно существовать две разные глобальные переменные с одинаковым именем
    Ну, все равно теперь не ясно. Если триггер связать с IX0.0.0, то ругается компилятор, если связать с (неработающим) входом IX0.11.0, то нечего проверять.
    А как все же правильно выбрать имена перед объявлениями:

    VAR_INPUT
    _bStep AT %IX0.0.0: BOOL;

    и в конфигураторе входов

    Triger[VAR]
    _bStepTGR AT %IX0.???.0: BOOL;

    К какой переменной мне потом обращаться в программе - к _bStep или _bStepTGR? Каков вообще смысл присвоения имени _bStep, если работает только выход триггера?

    Сейчас вычищу проект от всего остального и выложу для того, чтобы желающие могли экспериментировать (или с ходу подсказать, где собака порылась)

  9. #9
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Итак, есть проект (во вложении), в котором по двум входам объявлены переменные _bS1 и _bS2

    VAR_INPUT
    _bS1 AT %IX0.0.0: BOOL;
    _bS2 AT %IX0.0.1: BOOL;
    END_VAR


    , а также в конфигураторе создан подмодуль

    Triger[VAR]
    _bTRG AT %IX0.1.0: BOOL;

    Здесь поставил 0.1.0 для неругни компилятора. Больше в проекте переменных нет.
    Вопросы:

    1) Как связать триггер со входом %IX0.0.0
    2) если удастся п.1, то как что называть и какую переменную использовать в программе как выход триггера по входу %IX0.0.0
    Вложения Вложения
    Последний раз редактировалось drvlas; 30.10.2010 в 13:56.

  10. #10

    Exclamation

    Здравствуйте.
    Для корректной работы триггера в ПЛК должна быть установлена последняя версия прошивки. В данной прошивке корректно работают высокоскоростные входы (счетчики и триггер). На данный момент последняя прошивка имеет номер 2.12.7:
    http://www.owen.ru/catalog/78552813

    Есть особенность при добавлении триггера. К сожалению он добавляется не корректно и имеет адрес 0,0,0 что совпадает с адресом дискретных входов, поэтому необходимо перед триггером добавить еще один модуль, например Counter 16_bit.

    Привязка триггера к конкретному входу осуществляется через вкладку параметры модуля в поле number of input.

    Еще несколько замечаний. Данный триггер является аппаратным и способен улавливать сигналы приходящие с очень высокой скоростью (до 10кГц) но!!! фактически программно триггер вы можете опрашивать один раз в цикл. Поэтому если за 1 цикл придет 10 импульсов, обработаны они будут как один.

    Пример программы с настроенным триггером (по первому входу, фильтрация выключена, т.к. сигнал подавался с транзисторных выходов) для ПЛК100-К-L смотрите во вложении.
    Вложения Вложения

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

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