Я уже рассказывал про железо и программирование ПЛК производства китайской компании Wecon. Недавно я написал небольшую программку для системы из ПЛК Wecon LX3V-1208, подключенному к нему модулю расширения аналогового ввода Wecon LX3V-4AD и сенсорной панели PI8070 производства этой же компании.
Работу выполнял по интернету, для другого полушария. ПЛК Wecon LX3V (правда, модели LX3V-0806) у меня имелся свой, а модуль расширения LX3V-4AD и сенсорную панель PI8070 видел только по скайпу. Тем не менее, все получилось.
Железо Wecon LX3V-4AD
1. LX3V-4AD это модуль аналогового ввода, работает с ПЛК Wecon LX3V по его внутренней шине.
Выглядит он так:
Краткие характеристики модуля:
- 4 дифференциальных канала аналогового ввода
- Три диапазона измерения: -10…+10В, -20…+20мА и 4…20 мА
- АЦП 16 бит
2. Работа модуля возможна только с ПЛК Wecon серии LX3V начиная с модели LX3V-1208. То есть с теми, что имеют разъем для подключения модулей расширения. Мой самый простой и дешевый LX3V-0806 такого разъема не имеет, а потому к нему нельзя подключить LX3V-4AD.
3. Подключение сигналов разных типов к модулю осуществляется по разному, например:
Тут к каналу CH1 подключен аналоговый сигнал, а к CH3 вольтовый.
4. При наладке программы, которая использует аналоговые сигналы, нужно использовать прибор-задатчик тока. Пока программа не написана и не отлажена, подключать сразу реальный прибор смысла нет. Допустим, программа должна принимать данные от датчика давления 4..20 мА. Подключил реальный датчик и видишь, что давление атмосферное. Классно, и что? Нужно прогнать работу программы по всей шкале датчика, посмотреть, как отрабатывается алгоритм. В таком случае без задатчика тока никак.
Если задатчика нет( как у меня, например) то можно самому спаять некоторое его подобие из зарядки от старого мобильника и нескольких простых элементов:
Такой самодельный девайс успешно поможет сымитировать реальный датчик с токовым выходным сигналом- крутишь ручку потенциометра и меняешь значение на аналоговом входе модуля.
Программирование Wecon LX3V-4AD
Программирование модуля LX3V-4AD расписано в 10-страничном документе «USER’S MANUAL LX3V-4AD extend module». Там ничего сложного нет, но лучше прокомментировать ряд моментов.
1. Показания аналоговых входов модуля LX3V-4AD и его настройки хранятся в так называемой буферной памяти(buffer memory), расположенные там регистры называются BFM. BFM регистры являются 16-битными числами и соответствуют регистрам данных D, только доступ к BFM осуществляется командами FROM и TOP.
FROM — прочитать данные из BFM.
TOP- записать данные в BFM.
2. LX3V-4AD имеет 31 регистр BFM:
BFM#0
Задает тип каналов, число в формате HEX из 4 разрядов. Каждый разряд содержит настройку одного из 4-х каналов.
Разряды BFM#0 | Analog input | Digital output | Resolution | Offset/Gain | Constant |
0 | -10V~10V | -2000~2000 | 5Mv | 0/5000 | 1000 |
1 | 4Ma~20mA | 0~1000 | 16μA | 4000/20000 | 1000 |
2 | -20mA~20mA | -1000~1000 | 20μA | 0/20000 | 1000 |
3 | Disable | / | / | / | / |
4 | -10V~10V | -10000~10000 | 1mV | 0/5000 | 10000 |
5 | 4Ma~20mA | 0~10000 | 16μA | 4000/20000 | 10000 |
6 | -20mA~20mA | -10000~10000 | 20μA | 0/20000 | 10000 |
Например
H3110: CH4 отключен, CH3 и CH2 4…20 мA, CH1 -10…+10 V.
H0031: CH4 и CH3 -10…+10 V, CH2 отключен, CH1 4…20 мA.
BFM#1…BFM#4
Количество выборок для усреднения значений каждого канала. Например, при BFM#3= 5 в средние значения канала CH3 будет записано число из усреднения пяти выборок текущих значений CH3.
BFM#5…BFM#8
Усредненные значения по каждому каналу. Например, усредненное значение CH4 находится в BFM#8.
BFM#9…BFM#12
Текущие значения по каждому каналу, без усреднения.
BFM#15 Скорость преобразования. 0/1 = нормально/быстро.
BFM#16…BFM#19 Резерв, не используются.
BFM#20 Сброс настроек в настройки по умолчанию.
BFM#21 B01/B10 = разрешить/запретить внесение данных в смещение(offset) и усиление (gain).
BFM#22 0/1 = отключить/включить смещение(offset) и усиление (gain).
BFM#23 Смещение (offset)
BFM#24 Усиление (gain)
Смещение(offset) и усиление(gain) позволяют преобразовывать входящий на канал электрический сигнал в число с заданным интервалом. При значениях по умолчанию, когда смещение и усиление отключено, измеренный сигнал на канале преобразуется в число от 0 до 1000 (разряды в BFM#0 = 0, 1 или 2 ) или в число от 0 до 10000 (разряды в BFM#0 = 4, 5 или 6) .
Но если включить и задать смещение= 4000, а усиление= 20000, то входной сигнал 4…20 мА преобразуется в число от 4000 до 20000. То есть число в текущем значении канала(BFM#9…BFM#12) будет соответствовать микроамперам входного токового сигнала.
Идея с усилением и смещением хороша и понятна, но у меня что-то не сложилось- я и выставлял, и включал offset с gain’ом, но на результатах измерения это никак не сказывалось. Не знаю, что я делал не так, времени разобраться не было, да и заказчика устраивало преобразование по умолчанию, без смещений и усилений, пока оставили так.
BFM#25…BFM#28 Резерв, не используются.
BFM#29
Ошибки измерения. BFM#29=0 ошибок нет, BFM#29>0 какая-либо ошибка при измерении. Значения ошибок указаны в документации.
Важно понимать, что в регистре ошибок не отмечается, на каком из каналов CH1…CH4 произошла ошибка. Это очень неудобно. Если все четыре канала включены и на одном из них, к примеру на CH2, сигнал вышел за заданный диапазон, то по коду можно понять только, что ошибка произошла на одном из включенных каналов, а на каком именно, неясно.
BFM#30 Идентификационный код модели. Я так понял, было две модификации модуля: с 12-битным АЦП(код 2010) и 16-битным АЦП(код 2011).
BFM#31 Версия железа(Hardware version). Что-то значит, а что, непонятно. Понятно только то, что практического значения это не имеет.
Разбор примера программы из «USER’S MANUAL LX3V-4AD extend module»
В документации на модуль приведена простая программка, показывающая, как работает LX3V-4AD:
1. При старте программы (M8002 = 1) в регистр D4 записывается значение BFM#30, это идентификационный код модуля. Если модуль 16-битный, то BFM#30 = 2011. Как отмечалось выше, чтение данных из BFM осуществляется инструкцией FROM, запись в BFM- инструкцией TOP.
2. Инструкцией CMP сравнивается значение в D4(туда мы записали идентификационный код из BFM#30) c с числом 2011. Т.е. определяем, действительно ли модуль расширения является Wecon LX3V-4AD. Если D4 = 2011, то M1 станет равен 1.
3. Если M1 = true (см. шаг 2), то выполняются шаги 3…6. В BFM#0 записывается число 3300(hex). Это настройка каналов: CH1 и CH2 -10…+10 V, CH3 и CH4 отключены. Если бы мы хотели настроить все четыре аналоговых входа на токовый сигнал 4…20 мА, то нужно было в BFM#0 записать число 1111(hex):
TOP K0 K0 H1111 K1.
Почему эту настройку канала в тестовом примере делают каждый цикл программы, мне неясно. Логично проводить это один раз при старте программы (M8002=1), как в своем проекте сделал я.
4. В BFM#1 и BFM#2 пишется число 4. Командой TOP можно записать не один регистр, а несколько. За количество записей отвечает последний операнд инструкции. В данном случае K2 в инструкции «TOP K0 K1 K4 K2» означает «записать число 4 в буферную память по двум следующим друг за другом адресам начиная с адреса BFM#1». Тем самым мы будем усреднять значения CH1 и CH2 из 4 выборок текущих значений.
В своем проекте этот шаг, как и предыдущий, я тоже делаю один раз при старте программы (M8002=1) а не постоянно, как в тестовом примере.
5. Записываем биты из регистра ошибок BFM#29 в битовые регистры по адресам от М10 до М25.
6. Если M10 = false и М20 = false, значит ошибок измерений не было. Тогда читаем средние значения каналов CH1 и CH2 из BFM#5 и BFM#6 и записываем их в D0 и D1 соответственно.
Что касается ошибок, может возникнуть вопрос: почему мы смотрим только значения M10 и M20, а не всех c M10 до M25, куда разложили регистр ошибок?
Все дело в структуре BFM#29, там все хитро.
В BFM#29 биты номер 1, 2, 3, 10, 11, 12 означают какую-то конкретную ошибку измерения. Итого, отслеживается 6 разных ошибок. Если какой-либо бит номер 1, 2 или 3 равен true, то бит номер 0 выставляется тоже в true (BFM#29.0 = BFM#29.1 or BFM#29.2 or BFM#29.3 ). Остальные биты не используются.
В шаге 5 мы записали нулевой бит BFM#29 в М10. Значит, если M10 будет равен true, то произошла одна из трех ошибок измерения.
Ну а в регистр M20 в шаге 5 мы записали бит номер 10 из BFM#29, это выход за границы измерения(Digital range error). Если M20 = true, то вышли за допустимое значение сигнала. Например, при диапазоне 4…20 мА, BFM#29.10 = true при токовом сигнале больше 20.4 мА.
Ок, четыре ошибки отслеживаем, а с остальными двумя как быть?
BFM#29.11 выставляется при неправильном числе усреднения, если BFM#1…BFM#4 больше 4097 или меньше 0.
BFM#29.12 выставляется при запрете смещения и усиления, если BFM#21 = B10.
BFM#29.11 и BFM#29.12 в шаге 5 записываются по адресам M21 и М22 соответственно.
Так как в тестовом примере в шаге 4 правильно выставлено количество усреднения, а запрет смещения в программе не выставлялся, то и соответствующие ошибки не проверяются.
Wecon этот, я смотрю, очень похож в плане программирования на Mitsubishi. Как будто те же инструкции, хотя я года два назад с ними сталкивался. Китайцы не по лицензии, часом, его делают?