PDA

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



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

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

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

Спасибо!

Terrano1992
28.10.2010, 06:26
Нужно, чтобы нажатие кнопки вызвало установку битовой переменной 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.
В общем, типовых "кирпичиков" достаточно. Стройте из них что хотите.

drvlas
28.10.2010, 09:01
Все зависит от того, что именно вы хотите получить.
Просто подавление дребезга контактов - "Time of filtration" в параметрах модуля "Discrete input" (PLC Configuration).


Именно это, в данном случае. Открыл, посмотрел. Ожидал индивидуальной настройки по битам (ведь по односму входу дребезжащая кнопка, а по другому датчик, который нужно отработать максимально быстро).
А увидел общее окошко на весь входной порт (если я правильно понял). Но в табличке индекс - это и есть номер бита? А время в миллисекундах?
То есть именно это свойство "фильтрации" (как-то там отрабатывается без моего участия) - это и есть стандартный способ борьбы с дребезгом? Очень хорошо!
Буду разбираться, спасибо!

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

Terrano1992
28.10.2010, 20:52
увидел общее окошко на весь входной порт (если я правильно понял). Но в табличке индекс - это и есть номер бита?

Ну, почти да. Они по порядку в списке идут.

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

drvlas
28.10.2010, 21:38
спасибо, очень конкретно. почитаю.

drvlas
29.10.2010, 12:16
"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;

Terrano1992
29.10.2010, 18:45
Внимание, вопрос: почему описание триггера не изменяется?
Ну вот, пришлось с этим модулем поэкспериментировать :) Сам я им никогда не пользовался до сих пор...
В общем, сразу после добавления "Триггера" на один из входов 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, то все работает нормально.

drvlas
29.10.2010, 19:46
Node Id, не используемый ни одним из ранее созданных в конфигурации модулей (в моем случае это был 11) - ругань компилятора прекратилась.
Но проблема осталась. Теперь триггер считается

AT %IX0.11.0

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

_bStep AT %IX0.0.0

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


Что касается имен - тут все вполне очевидно. Имена входов 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, если работает только выход триггера?

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

drvlas
29.10.2010, 20:09
Итак, есть проект (во вложении), в котором по двум входам объявлены переменные _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

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

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

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

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

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

drvlas
01.11.2010, 10:51
Спасибо за ответ!

Не все ясно.


На данный момент последняя прошивка имеет номер 2.12.7
Не делал такого раньше. Скажите, пожалуйста, что именно из двух выделенных красненьким мне нужно кликнуть:

v.2.12.7 PLC100.exe
или
Update PLC100.bin


необходимо перед триггером добавить еще один модуль, например Counter 16_bit.
Привязка триггера к конкретному входу осуществляется через вкладку параметры модуля в поле number of input.
...
Пример программы с настроенным триггером... смотрите во вложении.
Надеюсь из примера увидеть, как это делается. При этом подскажите, пожалуйста, что именно мне нужно сделать, когда во время первого открывания Вашего примера я получаю сообщение:

Ошибка при чтении конфигурации ПЛК!
Файл описания модуля 'Module.Root' не найден.
Изменить конфигурационную директорию?

Я прошу Вас выбрать любой удобный Вам вариант:
1) Для блондинов: последовательность кликов до полного окея;
2) Для желающих понять: расскажите причину появления такого сообщения и способ его грамотного лечения.
На вопросы грамотного управления директориями, которые я задавал на форумах, мне ответили нечто вроде "ничего не трогай, система устанавливает все правильно". Наверное, хороший совет, но он не избавляет от необходимости шаманить каждый раз при запуске чужих примеров.
Я попробовал что-то подкидывать в список директорий проекта, но увы.
Можете ли Вы внятно объяснить, откуда система пробовала читать конфигурацию, где нормально находится тот модуль РУТ, почему в Вашем проекте он попал не туда, как именно и какую директорию во вкладке ПРОЕКТ/ОПЦИИ нужно занести правильный путь.
Да там еще и 3 из 7 библиотек не находятся. Те же вопросы, те же варианты ответов. Если не в лом, конечно.

С уважением

Александр Приходько
01.11.2010, 12:09
Здравствуйте.
Запустите программу v.2.12.7 PLC100.exe
Дальше программа вам все по шагам расскажет что делать.
-------------------------------------------
Ошибка при чтении конфигурации ПЛК!
Файл описания модуля 'Module.Root' не найден.
Изменить конфигурационную директорию?
---------------------------------------------
Это значит, что необходимо установить Target файл
Скачайте и установите данный файл:
http://www.owen.ru/uploads/install_target_v.2.10_for_plc1xx.exe
После запустите пример.

Все библиотеки рекомендую класть в папку среды программирования Codesys:
C:\Program Files\3S Software\CoDeSys V2.3\Library

Terrano1992
01.11.2010, 12:17
Файл описания модуля 'Module.Root' не найден.
Это у вас target для той модификации контроллера, на которой создавался проект с примером, в Codesys не инсталлирован. Решение очевидно - посмотреть, какой target нужен (в данном примере - для ПЛК100.24-К-L) и установить его с помощью штатной утилиты Installtarget.

еще и 3 из 7 библиотек не находятся
Где угодно раздобыть эти дополнительные библиотеки (скорее всего, на компакт-диске, прилагавшемся к ПЛК) и положить их в каталог, где все остальные Codesys'овские библиотеки лежат.

Terrano1992
01.11.2010, 12:25
Для корректной работы триггера в ПЛК должна быть установлена последняя версия прошивки. В данной прошивке корректно работают высокоскоростные входы (счетчики и триггер). На данный момент последняя прошивка имеет номер 2.12.7
Теперь понятно, почему у меня триггер в примере от drvlas не захотел переключаться даже тогда, когда я перед ним Counter16bit подсунул... на моем контролере прошивка "2.10.что-то-там". Придется обновить...

drvlas
01.11.2010, 16:23
большое спасибо! проверю все ваши рекомендации.

Гадир
11.01.2012, 15:20
Уважаемые специалисты, у меня та же проблема. У меня ОВЕН ПЛК110-60-М

Ошибка при чтении конфигурации ПЛК!
Файл описания модуля 'Module.Root' не найден.
Изменить конфигурационную директорию?


Следующие библиотеки не могут быть загружены

(Задайте путь в 'Проект''Опции''Директории'):



WORK_MODE.LIB 13.3.09 13:32:31

Побывал установить тарджет с http://www.owen.ru/uploads/install_t...for_plc1xx.exe
Все равно та же ошибка выходит что мне делать?

lara197a
11.01.2012, 15:35
Ну библиотеки можно по новой подключить в ПЛК конфигураторе в соответствующем разделе. Старые удалите.
Я делаю так 1добавил-старую удалил, затем следующую.
ПЛК перешейте на последнюю оф. версию и заново загрузите соответствующий таргет.
Что-то у вас по версиям не срастается.

Гадир
12.01.2012, 11:14
Ну библиотеки можно по новой подключить в ПЛК конфигураторе в соответствующем разделе. Старые удалите.
Я делаю так 1добавил-старую удалил, затем следующую.
ПЛК перешейте на последнюю оф. версию и заново загрузите соответствующий таргет.
Что-то у вас по версиям не срастается.
Все это сделал все равно та же фигня... Перепрошил на посл. версию... Нее может найти модуле рут и ворк_мод.либ. Мне просто очень нужно черес модбас подключится к OMNI FLOW 6000 и читать ячейки. Поэтому мне очень нужен этот пример. Заранее спасибо!