PDA

Просмотр полной версии : ПЛК110 М02 и Fast Encoder



denkrauss
22.09.2020, 12:00
Добрый день уважаемые форумчане!

Честное слово, перечитал все темы, какие нашел, о работе энкодера в ПЛК110 М02, но не смог ответить себе на свой же вопрос (может для кого то и не очень сложный), так что прошу у Вас помощи!
ПЛК110-220-30-Р-М. Подключаю энкодер 100 имп/об, меняю модуль в конфигурации ПЛК на Fast Encoder. Счет идет, 400 единиц на оборот (что мне очень важно), все хорошо.

После читаю в руководстве:
2.1.5.3. Параметр «Тип энкодера» (Encoder Type) – определяет тип энкодера: либо круговой, либо линейный.
Внимание! Необходимо учитывать особенность подсчета для типов энкодера:
•при круговом типе – если при вращении осуществляется переход через условный нуль, показания счетчика сбрасываются, и начинается новый отсчет с 0;
•при линейном типе – осуществляется фиксация при достижении максимума или минимума диапазона, далее приращение не идет.


Задача - считать длину листов металла, когда датчик будет совершать несколько оборотов (скажем, даже очень много оборотов). В настройке в конфигураторе ПЛК описанной опции не нашел, да и, почитав форум, сложилось впечатление, что ее и нет((
Если энкодер перешел максимум (65535), я могу каким то образом получать данные с него и при дальнейшем его вращении в ту же сторону? Лиш бы шел счет, а там я уже применю у себя как то.
Понимаю, что вопрос "заезженый" и заранее прошу прощения! Программирую в CFC!

Благодарен любым идеям и подсказкам! Спасибо!

Филоненко Владислав
22.09.2020, 12:33
Внутри программы брать разницу между двумя отсчетами и прибавлять к внутреннему программному счетчику (32 или 64 разрядному)

denkrauss
22.09.2020, 12:47
Внутри программы брать разницу между двумя отсчетами и прибавлять к внутреннему программному счетчику (32 или 64 разрядному)

Простите за вопрос из разряда "от новичков", а откуда мне брать эти два отсчета, если счетчик IW0.0: WORD; уже 65535 и не считает больше?

Внутренний программный счетчик это CTU, CTD или CTUD с 32-х или 64-х разрядной переменной на выходе?

Sulfur
22.09.2020, 13:05
denkrauss
С энкодерами в данных ПЛК печалька.
Судя по вашей проблеме наблюдается остутсвие вот этого:

2.1.5.3. Параметр «Тип энкодера» (Encoder Type) – определяет тип энкодера: либо круговой, либо линейный.
Внимание! Необходимо учитывать особенность подсчета для типов энкодера:
•при круговом типе – если при вращении осуществляется переход через условный нуль, показания счетчика сбрасываются, и начинается новый отсчет с 0;
А вообще для воплощения своих хотелок с быстрыми входами\выходами ПЛК М02 существует проект HardellaIDE. Здесь на форуме найдете. Иногда даже сам автор проекта заглядывает.
---
Есть еще одно решение, но оно мне не очень нравится. Использовать конфигурацию входов Fast discrete inputs - direct control, библиотеку SysLibPorts и свою программу, которая вызывается по 20мкс-таймеру в Конфигурации задач ПЛК. Там можете сделать хоть DWORD\DINT счет со знаком, сбросами и прочими хороводами.
--
Но Харделла лучше однозначно.
----

Программирую в CFC!
Нет проблем. Пишете свой ФБ на любом языке, и тащите его на поляну основной программы.

A.Simonov
22.09.2020, 13:11
уже 65535 и не считает больше?
После 65535 счетчик сбросится в ноль и продолжит счет.

denkrauss
22.09.2020, 13:24
После 65535 счетчик сбросится в ноль и продолжит счет.

Если в конфигураторе ПЛК вместо FDI1 и FDI2 создан модуль Fast Encoder, а не "Быстрый счетчик", то не сбрасывается.. Может я не все понимаю, но по адресу модуля Fast Encoder IW0.0: WORD значение доходит с нуля до 65535 и при вращении энкодера в ту же сторону больше не изменяется.

denkrauss
22.09.2020, 13:26
denkrauss
С энкодерами в данных ПЛК печалька.
Судя по вашей проблеме наблюдается остутсвие вот этого:
А вообще для воплощения своих хотелок с быстрыми входами\выходами ПЛК М02 существует проект HardellaIDE. Здесь на форуме найдете. Иногда даже сам автор проекта заглядывает.
---
Есть еще одно решение, но оно мне не очень нравится. Использовать конфигурацию входов Fast discrete inputs - direct control, библиотеку SysLibPorts и свою программу, которая вызывается по 20мкс-таймеру в Конфигурации задач ПЛК. Там можете сделать хоть DWORD\DINT счет со знаком, сбросами и прочими хороводами.
--
Но Харделла лучше однозначно.
----

Нет проблем. Пишете свой ФБ на любом языке, и тащите его на поляну основной программы.

Спасибо, буду учить матчасть по Харделле!

A.Simonov
22.09.2020, 15:32
Может я не все понимаю, но по адресу модуля Fast Encoder IW0.0: WORD значение доходит с нуля до 65535 и при вращении энкодера в ту же сторону больше не изменяется.

Проверил на своем ПЛК. Прошивка 1.0.11 (на 1.1.0 тоже будет работать)
Прикладываю .gif файл где это хорошо видно.
51116

denkrauss
23.09.2020, 07:41
Проверил на своем ПЛК. Прошивка 1.0.11 (на 1.1.0 тоже будет работать)
Прикладываю .gif файл где это хорошо видно.
51116

A.Simonov, прошу прощения у Вас и у форумчан. Что-то я напутал (видимо несколько дней над проектом (и не только над одним и не только по ПЛК) сказались).
В модуле Fast Encoder счетчик действительно обнуляется после 65535 и считает заново, как указал A.Simonov. Прошивка 1.1.0, ПЛК 110-220-30-Р-М М02.
Дело в том, что я в проекте использую еще ИП320, который у меня также работает с пременной энкодера, может я там что напутал.

По итогу, промежуточной переменной с помощью MOVE по импульсу начала отсчета металлического листа присваиваю значение энкодера в момент начала отсчета, далее вычитаю с помощью SUB из текущего значения энкодера (которое начинает увеличиваться с его вращением) значение промежуточной переменной, и получаю длину метал. листа каждый раз актуальную.
Только SUB использую с разрешением присвоения EN, куда подаю "1" пока идет отсчет длины метел. листа.
И счет энкодера в таком случае должен идти только в сторону возрастания (иначе при переходе через "0" некорректное вычисление происходит).

Спасибо всем за отзыв на просьбу!

RemNC
01.04.2022, 15:16
добрый день форумчане. Если я правильно понял, при назначении быстрых входов как Fast Encoder, энкодер у нас будет считать импульсы максимум до 65535. И этот предел никак стандартными методами не увеличить? И еще - как заставить считать регистр с отрицательным значением?
(ПЛК 110-30 М02, энкодер обычный круговой ABZ 500имп/об)

Филоненко Владислав
03.04.2022, 14:04
добрый день форумчане. Если я правильно понял, при назначении быстрых входов как Fast Encoder, энкодер у нас будет считать импульсы максимум до 65535. И этот предел никак стандартными методами не увеличить? И еще - как заставить считать регистр с отрицательным значением?
(ПЛК 110-30 М02, энкодер обычный круговой ABZ 500имп/об)

У Вас ПЛК, а не прибор с жёсткой логикой. Поэтому было принято решение накопление и установку нуля доверить программистам ПЛК, а не хардкодить её внутри, т.к. никогда не угадаешь что же нужно клиенту на ПЛК.
Проблемы с этим нет никакой, код для данных действий прост как 2 копейки, при максимально теоретически возможной частоте счёта энкодера в 250кГц(если клиент сменит оптопары на быстрые и уберёт аппаратную фильтрацию входов) (а штатные оптопары 100кГц дают) 65535 переполнятся за 262 мс - это ещё надо сильно постараться не успеть обработать очередное значение энкодера!
А если не перепаивать - то более 0,5 секунды потупить можно!
Вот не верю я что несколько строчек кода на фоне десятков тысяч строк основного кода управления так сильно мешают программистам ПЛК

RemNC
04.04.2022, 15:34
написать то оно можно, но стандартную функцию для энкодера АБ со счетом вперед/назад и сбросом думаю реализовать можно (скажем по аналогии с митсубиси - там присутсвуют стандартные команды для этого). Реализовать пришлось, сделал. Теперь вопрос появился не по данной теме (как никак новичок пока в данных контроллерах, первый проект :) ) - как вывести данные с энкодера со знаком на панель оператора по протоколу modbus tcp? В проекте у меня хранится в DINT. А из тех видео обучающих что я видел подключаются регистры только типа Word или DWord.

kondor3000
04.04.2022, 19:15
написать то оно можно, но стандартную функцию для энкодера АБ со счетом вперед/назад и сбросом думаю реализовать можно (скажем по аналогии с митсубиси - там присутсвуют стандартные команды для этого). Реализовать пришлось, сделал. Теперь вопрос появился не по данной теме (как никак новичок пока в данных контроллерах, первый проект :) ) - как вывести данные с энкодера со знаком на панель оператора по протоколу modbus tcp? В проекте у меня хранится в DINT. А из тех видео обучающих что я видел подключаются регистры только типа Word или DWord.

Все 32 битные переменные передаются как DWord, разница только в формате отображения в панели, настраивается в дисплее.
Тип DINT - формат DEC (есть знак), тип DWord - формат Unsignet (оба целочисленные),
из ПЛК тип REAL, в панели тип DWord, формат Float (с плавающей запятой).
В контроллере (и в панели), все адреса 32 битных переменных должны быть чётные.

RemNC
05.04.2022, 11:01
Все 32 битные переменные передаются как DWord, разница только в формате отображения в панели, настраивается в дисплее.
Тип DINT - формат DEC (есть знак), тип DWord - формат Unsignet (оба целочисленные),
из ПЛК тип REAL, в панели тип DWord, формат Float (с плавающей запятой).
В контроллере (и в панели), все адреса 32 битных переменных должны быть чётные.

спасибо, буду экспериментировать. А то в кодесисе тот же dword выдавал значения только от 0.

Есть еще вопрос, не знаю пока в какой теме озвучуть. Есть ли в кодесисе, или конкретно в данном ПЛК регистр, по которому можно прочитать текущее входное напряжение, которое питает контроллер?

A.Simonov
05.04.2022, 11:12
спасибо, буду экспериментировать. А то в кодесисе тот же dword выдавал значения только от 0.

Есть еще вопрос, не знаю пока в какой теме озвучуть. Есть ли в кодесисе, или конкретно в данном ПЛК регистр, по которому можно прочитать текущее входное напряжение, которое питает контроллер?

Добрый день.

Такого регистра ПЛК нет.

kondor3000
05.04.2022, 14:56
спасибо, буду экспериментировать. А то в кодесисе тот же dword выдавал значения только от 0.


О типах переменных и о многом другом можно прочитать в Codesys 2.3, в справке по F1. Можно выделить например DINT или DWord и нажать F1.