суббота, 24 апреля 2021 г.

Синий экран смерти при подключении к S7-300 - S7otranx32.sys

Тут на днях вновь всплыла ошибка, возникавшая у меня несколько лет назад при подключении к контроллеру S7-300 через оригинальный Siemens'овский USB/MPI кабель. Выскакивает вот такая "радость":


Почему это происходит и чем лечится я не знаю, прошлый раз это прошло как-то само собой. В любой случае, если такое возникает в "полевых" условиях, есть один 100%-ый вариант как это прекратить. Для этого необходимо иметь под рукой китайский кабель PC-MPI с aliexpress, который подключается к COM-порту (т.е. понадобится еще переходник USB-RS232). COM-порт надо выбрать в настройках Set PG/PC Interface:


При работе с таким адаптером ошибки винды из-за файла S7otranx.sys не будет точно.

P.S.

Раньше на aliexpress был комбинированный адаптер 2в1: PC/MPI + USB/RS232, т.е. он включался в USB и определялся как обычный преобразователь в RS232, работая через драйвер Profilic. Выглядел он вот так:

 

Но, к сожалению, больше таких адаптеров китайцы не делают, все их USB-адаптеры теперь работают только через Siemens'овские драйвера, а не через эмуляцию COM-порта, а конкретно они теперь все используют старую версию Siemens'овского USB-драйвера (версия 2.0, которая берет питание с порта USB, в то время как более новый сименовский драйвер 8.x берет питание с порта MPI), поможет ли использование такого кабеля под старые дрова - я точно сказать не могу. А если требуется через COM-порт подключится (100% вариант, причем, еще и никак не привязанный к версии Windows - что актуально на фоне того, как Microsoft стал агрессивно навязывать новые версии винды), тогда на aliexpress надо покупать именно PC-MPI адаптер (RS232/MPI).

четверг, 11 марта 2021 г.

Тензо-М ТВ-003/05Д: весоизмерительная поделка

Сегодняшняя тема будет про преобразование сигналов тензодатчиков с помощью приборов "ТВ-003/05Д" от компании "Тензо-М". Хочу сразу обратить внимание, что речь идёт не в целом о компании - производителе тензодатчиков, а о конкретном устройстве, потому что если говорить о датчиках, то, в принципе, у меня с ними никогда проблем не было, работают на разных объектах без нареканий. Тут речь о том, что не надо делать то, чего не умеешь: если ты делаешь хорошо тензодатчики, ну так и делай их, и не надо начинать производство каких-то глючных приборов для их подключения. 

Так вот перейдем теперь к ТВ-003/05Д. Это поистине весоизмерительное чудовище - огромное, тяжелое, глючное. В общем-то, чтобы понять, насколько оно неудобное в использовании, достаточно просто заглянуть в инструкции к этим приборам. 

Хочу обратить внимание на несколько моментов, с которыми пришлось столкнуться мне лично при работе с этим оборудованием.

1. Разные модификации. Если кто-то всерьёз думает, что совсем недешёвый, тяжеленный и неудобный в использовании прибор должен быть хотя бы универсальным - это заблуждение. На каждом таком приборе есть специальная наклейка, где производитель ставит пометки напротив опций, которые включены в конкретную модификацию. Т.е. делать просто универсальные приборы, которые имеют на борту интерфейсные выходы RS485, RS232 и аналоговый выход - это слишком сложная задача для отечественного производителя (который и без того неконкурентоспособен по цене, и, казалось бы, ну почему бы не постараться хоть что-то сделать хорошо? но нет...) , поэтому не нужно удивляться, что именно необходимый вам для вашей конкретной задачи способ считывания информации с вашего конкретного прибора ТВ-003 поддерживаться не будет.

2. Кривой интерфейс RS485. Очень долгое  время ответа прибора при опросе. Нет возможности задавать проверку четности или нечетности, параметры - 8N1, других нет, настраивается только скорость передачи данных и адрес. Мало того, дополняя пункт 1, следует также обратить внимание на то, что на приборах разных прошивок еще и скорости доступны разные (!), например на каких-то одних прошивках можно устанавливать скорость (параметр №13 меню прибора) от 1.2 до 9.6 кбит/с, а, например, на версии прошивки dd-107 есть всего два варианта: 9.6. и 19.2 кбит/с.

3. Свой собственный протокол. Данный прибор не поддерживает стандартные протоколы передачи данных. Вместо этого у них собственный протокол, который можно преобразовать в Modbus RTU только при помощи преобразователя стороннего производителя. Называется ДПИ-МТ-1, преобразователь крутой, настраивается через веб-интерфейс, даже имеет на борту wifi для этой самой настройки и... стоит в полтора раза дороже, чем ТВ-003/05Д.

3. Кривой OPC-сервер. Продолжая историю собственного протокола Тензо-М, следует вспомнить и их собственный OPC-сервер. Работает он ужасно, не имеет никаких настроек тегов и не отображает никаких значений (т.е. нет таблицы тегов и значений как в обычном пользовательском интерфейсе любых OPC-серверов). Вы даже не поймёте, что OPC-сервер подключился к устройству, потому что это никак не отображается. Всё, что вы увидите, - это количество клиентов OPC-сервера в данный момент времени (ну, т.е. самую ненужную информацию по сути). Устройства и теги не имеют иерархии, посмотрите инструкцию, что они пишут:

Данный OPC-сервер имеет плоскую структуру, т.е. теги расположены на одной,
главной ветви. Для того чтобы идентифицировать местоположение тега (items), номер
дозатора, которому принадлежит тег, и номер линии, на которой расположен дозатор,
предусмотрена специальная маркировка для всех тегов (items):
LX_DY_имя тега
где X - Номер линии; Y - номер (порядковый) дозатора.
Так, например имя тега принадлежащего 3 дозатору который расположен на 1
линии будет выглядеть как: L1_D1_имя тега.

(о, Господи!) Т.е. они не в состоянии были сделать даже элементарную древовидную структуру, вместо этого они сделали кучу тэгов, которым по именам надо различать, к какому устройству они относятся! Да, можно понять, что производитель делает тензодатчики, это его основное направление деятельности, но неужели так сложно нанять одно-единственного программиста, который сделает нормальный OPC-сервер?

Лично я не смог нормально пользоваться этим OPC-сервером, потому что после подключения к нему мой OPC-клиент на базе wtclient.dll, отлично работающий с любыми OPC-серверами (и Siemens, и InSat, и Овен) просто загнал загрузку CPU компьютера чуть ли не на максимум.

4. Разные меню прибора и способы перехода в него в зависимости от версии прошивки. 

Ну, т.е., по всей видимости, производитель изначально сделал, как ему показалось, не самое удобное меню, и решил его поменять. А потом опять поменять. А потом ОПЯТЬ! Спрашивается, ребята, вы в своем вообще уме? Т.е. на одном предприятии в одном цеху висят одни и те же приборы и настраиваются они все по-разному. У операторов мозг закипает каждый раз, как надо оттарировать ёмкости или выполнить еще какие-то операции, требующие перехода в меню, а также заменить один прибор другим.

Значит, по печатной инструкции от Тензо-М, которая есть у меня, для перехода в меню следует выполнить такие действия:

Вход в режим программирования
Для входа в режим программирования 
1) нажмите клавишу "Ф", при этом на индикаторе высветится "Func"
2) нажмите клавишу "0", при этом на индикаторе высветится приглашение к вводу пароля "oooooo"
3) последователь нажимая цифровые клавиши, введите шестизначный пароль...
4) после безошибочного ввода последнего (шестого) знака пароля терминал перейдет в редим программирования (при этом на индикаторе высвечивается "SEL")...

На половине моих проборов такое нажатие кнопок не давало нужного эффекта.

Теперь почитаем инструкцию, которая называется "Преобразователь весоизмерительный TВ-003/05Д. Версия программного обеспечения 10.13АХ. Руководство по эксплуатации и калибровке" (инструкция с сайта Тензо-М). Там мы узнаем, что все функции выполняются простым нажатием кнопки "Ф" и кнопки с цифрой, но при этом там не указаны такие сочетания как "Ф" + "0" (из предыдущей инструкции") и "Ф" + 2 (о чем речь пойдет ниже). В сервисное меню по этой инструкции надо заходить, нажимая "Ф" + "ВВОД". Такое сочетание кнопок ни на одном приборе не давало у меня эффекта. Наверно, потому что это для прошивки 10.13АX, ну да...

Идём дальше. Методом "научного тыка" я определил, как же мне настроить остальные приборы, для которых первый способ не сработал. Последовательность действий такая:

1. Жмём кнопку "СБР". Загорается номер прошивки (как при включении прибора): dd-107

2. Ждём, пока первый раз проморгает лампа "КОНТР" (промаргивает она два раза)

3. Нажимаем в этот момент кнопку "Ф"

4. Появляется приглашение ввести пароль "оооооо"

5. Вводим 535160. Появляется надпись "SEL"

6. Нажимаем кнопку "2". Итак, мы в меню.

7. Нажимаем кнопку со стрелкой вниз, чтобы переходить по пунктам меню.

Если же нажать "Ф" слишком поздно, то вместо "оооооо" появляется "Func" (как из печатной инструкции), вот только нажатие после этого любой кнопки (в том числе "0") приводит лишь к тому, что на экране просто отображается текущее значение тензодатчика, т.е. перехода в меню или запроса на ввод пароля не происходит.

 

5. Распиновка 25-контактного штекера. 

В упомянутой выше инструкции (той, которая для прошивки 10.13АХ) мы можем увидеть такую распиновку для интерфейсов RS485 и RS232:

2 -- RXD (rs232)

3 -- TXD (rs232)

5 -- GND (rs232)

7 -- Data+ (rs485)

8 -- Data- (rs485)

9 -- GND (rs485)

А потом оказывается, что это распиновка не DB25, а DB9. Вот как хочешь, так и догадайся! Может быть у них есть модификации с DB9 или типа того, но неужто так сложно написать в инструкции три символа: "D", "B", "9"?? 

Короче, подключать RS485 надо так:

13 -- Data-

25* -- Data+

9 -- GND

* на штекерах, которые установлены на моём предприятии (какие-то необычные штекеры под шлейфы), этот пин пронумерован как 14-ый, а не 25-ый, т.е. нумерация идет "змейкой" от конца первого ряда контактов вниз на второй ряд и потом в обратную сторону (14-ый оказывается под 13-ым), а не так, как это нумеруется стандартно на разъемах DB25 (где 14-ый контакт расположен под 1-ым).

Скачав разные инструкции, я нашел в одной из них нормальную таблицу распиновки:

 Правильная нумерация DB25 (на всякий случай):


ДПИ-МТ-1

Теперь насчёт преобразователей ДПИ-МТ-1. Делает томская компания "Фактор Кода", выглядит в общем и целом как заводское устройство, нареканий по работе нет. ПРЕДНАЗНАЧЕН ТОЛЬКО ДЛЯ ОДНОГО УСТРОЙСТВА ТЕНЗО-М. Т.е. если Тензо-М несколько - то и ДПИ-МТ-1 нужно тоже несколько. Как я уже сказал, стоит это устройство дороже, чем сам Тензо-М (больше $200).  

Что не понравилось - это то, что, во-первых, нельзя выбрать скорость 1.2 kbit/s для Тензо-М (хотя сам прибор работает на такой скорости - кроме прошивки dd-107, где почему-то оставили только две скорости: 9.6 и 19.2) и, что самое главное, нельзя установить проверку четности/нечетности, задать число стоп-битов и количество бит данных. Т.е. подключая прибор к существующей сети RS485, сразу необходимо переводить эту сеть на 8N1, что, конечно, может быть неудобным: нацепляешь в одну сеть таких приборов вместе с каким-нибудь овеновским ТРМ202 (у которого 8N2, число стоп-бит нельзя поменять) -- и "добрый вечер"...

Настраивается через web-интерфейс (IP: 192.168.4.1), подключается по wifi. Для протокола Тензо-М можно задавать скорость (от 2.4 kbps) и адрес, тоже самое и для протокола Modbus на выходе. Опрос данных производится по регистрам:

#400

0x0190

40401

FLOAT

Масса нетто

#406

0x0196

40407

FLOAT

Масса брутто

#206

0x00CE

40207

BCD

Масса нетто

#208

0x00D0

40209

BCD

Масса брутто

(!) Для типа данных FLOAT необходимо осуществлять перестановку байт старшим словом вперёд (Кстати! Именно такая последовательность установлена для протокола Modicon Modbus панелей оператора Siemens, так что можно эти приборчики цеплять напрямую к любой панели оператора Siemens, где есть RS485, включая Smart-панели)



В общем, вот так. Как мне кажется, чем покупать глючную чудо-поделку от Тензо-М, которая крайне неудобна для эксплуатации и которой требуется дорогущий преобразователь для диспетчеризации для перехода на нормальный протокол, лучше за те же деньги купить, например, вот это на четыре канала тензодатчиков и какой-нибудь дешевенький PLC и панель оператора к нему (я бы купил китайский S7-200 и Smart-панель к нему на Aliexpress, но есть и более дешевые решения), чтобы сделать всю настройку по-человечески и удобной для использования. 

Ну, и еще раз скажу, что к самим тензодатчикам Тензо-М претензий нет. Такое впечатление, что ребята просто попробовали делать то, что не умеют. Я не знаю, как там обстоят дела с последними моделями - возможно, они что-то в них исправили, улучшили, но в любом случае инструкций нормальных нет, OPC-сервера нормального нет, ценник рядом с китайцами - неадекватный. В компании "Фактор Кода", которая делает преобразователи в Modbus, аргументируют использование приборов Тензо-М с той точки зрения, что они со всех сторон сертифицированные. Возможно, что и так. Поскольку все мы знаем, насколько априори бутафорская, никчёмная и бессмысленная (для потребителя) в нашей стране любая сертификация, то наличие сертификата соответствия - это в 99% случаев просто попытка набить цену на некачественный продукт. Хотя, там, где государство требует все эти филькины грамоты, там без сертификатов не обойтись.


P.S. Кому нужна инструкция к прибору на прошивку DD-107 (или DD-10.7, как она обозначена на некоторых устройствах) - можно скачать тут.

суббота, 6 марта 2021 г.

Запретить Firefox использовать адресную строку для поиска

Сегодня вспомнилась одна совершенно ненужная функция браузера - использование адресной строки как строки поисковика. Т.е. достаточно совершить опечатку при наборе сайта, и сразу браузер начинает искать введённый текст через очередной яндекс. Чтобы этого не было, в Firefox делается так:

1. открыть страницу about:config

2. найти пункт keyword.enabled

3. установить его в состояние false

 

Как отключить открытие PDF-файлов в Firefox вместо их нормального скачивания - см. тут.

среда, 27 января 2021 г.

MPI и Profibus в Ethernet

Очередная тема про китайские чудо-изобретения с aliexpress. На этот раз - речь о преобразователе интерфейса MPI и Profibus DP в Ethernet. В общем-то задача стояла такая, что нужно было данные передавать от контроллера S7-300 на пульт диспетчеризации (WinCC). На контроллере были оба интерфейса - и MPI, и Profibus. И тут было два варианта - либо покупать Siemens'овскую плату для компьютера, чтобы подключаться напрямую к этим интерфейсам, либо купить преобразователь на ethernet. Речи о покупке оригинального модуля для S7-300 не шло - контроллер нельзя без долгих согласований переводить в "Stop", а без этого подключить модуль и перезалить Hardware'ную часть невозможно. 

Aliexpress дал большой выбор преобразователей - разного исполнения, с разными драйверами. 

 Я выбрал фактически самую дешевую - за $84


 

Выполнено устройство в корпусе модуля Siemens S7-200, прекрасно вписывается в шкаф автоматики, устанавливается на стандартную DIN-рейку (только не надо забывать, что у S7-300 и S7-400 другая DIN-рейка, если что). Настройка - по IP-адресу 192.168.1.222. Вот скрины экранов настроек, которые сделал я:

 

 

В выпадающем списке можно выбрать скорость и интерфейс (MPI или Profibus DP):


Пытаясь найти описание к устройству перед его покупкой, я наткнулся вот на этот сайт. Явно видно, что это тоже самое устройство, потому что и внешне, и по настройкам оно совпадает, но  всего того, что там перечислено мне делать не пришлось - никаких драйверов я не устанавливал, а просто выбрал интерфейс, скорость и IP-адрес для моего устройства, затем добавил контроллер S7-300 в проект WinCC Runtime, выбрал для него ту же самую точку доступа (Access Point - обычная сетевая карта в найстройках PG/PC Interface), на которой висят другие контроллеры в сети (S7-1200), и всё заработало. Это оказалось самое простое и почти самое дёшевое устройство. Оно работает уже более полугода, нареканий к работе нет.

 

 

Были на Aliexpress и другие модели. Предлагаю вам посмотреть на них:

1. Вот такая вещица:

В общем-то ценник что надо, и IP-адрес для настройки 192.168.1.222 дает надежду на то, что это хорошее устройство, что приобрёл я за $84, только в другом корпусе.

2. Вот такой преобразователь за $150:


Данный преобразователь работает путем расшаривания одного-единственного блока данных на стороне WinCC под видом контроллера S7-200 (т.е., например, адрес DB1.DBD0 превращается в VD0 и т.д.). Такой адаптер будет полезен для подключения, например, панели Smart к S7-300, поскольку у панели Smart нет возможности работать S7-300 напрямую. Смущает тут то, что в описании сказано: ETH-smartIE adapter can be connected to the STEP7, but can use only 8-9 hours after power up, т.е. адаптер работает 8-9 часов, а потом его надо перезапускать,.. но если не хочешь перезапускать - тогда: If you want to use STEP7 continuously, please buy our another ETH-smartIE, т.е купи другой адаптер - и ссылка - внешне такой же точно, но за $220, такая вот "замечательная" история:

 


3.  Следующая штука, которая преобразует MPI не только в стандартный S7-TCP, а еще и в Modbus TCP.

 


 В общем-то, интересная вещь за $360, мне она, не подошла ни по цене, ни по избыточности функционала (Modbus TCP мне не нужен совершенно), но сама по себе вещь интересная, потому что можно ее использовать для подключения к OPC-серверам, например. А еще у нее сзади дополнительный штекер DB9, через который можно присоединять устройства Modbus RTU. Картинка от производителя:

 

Устройство создаёт свои точки подключения, т.е. в настройках PG/PC Interface нужно выбирать не просто сетевую карту, поскольку адаптер работает через свой драйвер. Наверно, это не очень хорошо, потому что неизвестно, что будет дальше с поддержкой этих драйверов.


вторник, 14 июля 2020 г.

Дата и время: S7-1200 и панели оператора Siemens

Постоянно приходится иметь дело с настройкой даты/времени панелей оператора Siemens и контроллеров S7-1200. В этой статье я расскажу как делается синхронизация даты/времени панелей операторов (HMI) с этим PLC. Основное предназначение такого мероприятия: правильное отображение даты/времени в аварийных и иных сообщениях понели оператора, и чтобы эти дату и время не нужно было задавать каждый раз при включении панели.

Принцип


Принцип установки и синхронизации даты/времени выглядит так:

- дата и время хранятся на PLC, поскольку в этом устройстве они не сбиваются при отключении питания

- HMI периодически синхронизирует свои дату/время с PLC

- на HMI есть ячейки, которые позволяют изменять дату и время PLC и, таким образом, менять дату и время HMI (которая синхронизирована с PLC)

Возможности


Возможности предоставляются следующие.

Со стороны HMI:

1. Считывать текущее дату/время HMI и использовать её для каких-то целей на ПЛК. Для этого надо выделить ячейки памяти в Data Block'е PLC для сохранения этих даты/времени и задать ячейку памяти Job MailBox - это та ячейка, которая воспринимается панелью оператора как внешняя команда, в частности, значение 40 в этой ячейке - это команда скопировать время HMI в заданную область память PLC.

2. Дать задание HMI обновлять один раз в заданный период времени (раз в секунду, минуту, час...) свои дату/время в соответствии со значениями, задаваемыми в заранее выделенной для этого области PLC. Т.е. панель оператора сама не запрашивает у PLC текущие дату/время, но если алгоритм работы PLC будет пересылать свои значения в определённые ячейки, то панель с ними синхронизируется.

Со стороны PLC:

1. Считывать текущие дату/время PLC и сохранять их в виде значений в Data Block'ах.

2. Задавать дату и время, хранящуюся в Data Block'ах, в качестве даты/времени PLC.



Отличия WinCC Flexible 2008 / WinCC Flexible Smart от WinCC TIA Portal

Стóит заметить, что есть разница между WinCC, которая встроена в TIA Portal и старой WinCC - WinCC Flexible 2008, а также сделанной на ее основе WinCC Flexible Smart.

Короче, суть вот в чём: старые WinCC Flexible разрешали как передачу текущих даты/времени, установленных на панели оператора, в память ПЛК, так и, одновременно с этим, разрешали автоматическое обновление даты/времени панели оператора через считывание. Та WinCC, которая теперь находится внутри TIA Portal, позволяет делать только что-то одно из перечисленного - либо синхронизировать HMI с PLC, либо передавать дату/время HMI на PLC, но не одновременно. Иначе будет вот что:


Почему ограничение введено - совершенно не имеет объяснения, потому что, с точки зрения HMI, значения даты/времени - это обычные данные для приёма-передачи, такие же теги, т.е. вы можете создать хоть сотню тегов, которые как угодно друг с другом переплетаются, привязаны к одним и тем же (или частично) адресам памяти, настроены на разные ячейки на чтение, запись или и то, и другое одновременно - никаких ограничений нет - но почему-то с датой/времени Siemens вдруг решил ввести ограничения. В любом случае это особо не повлияет на нашу настройку, далее я покажу в чём будет заключаться отличие.

Резервирование памяти PLC


На PLC необходимо создать блок данных и ячейки в нём, где будут хранится:

1. Job MailBox панели оператора.
Это та ячейка, которая будет давать команду HMI на пересылку её текущих даты/времени в PLC. Как только значение MailBox станет равно 40, HMI выполнит команду, а MailBox сбросит в 0.

2. Дата и время HMI в формате BCD.
Это ячейки памяти PLC, куда будут сохранены дата и время HMI. Представлены они в двоично-десятичном формате (BCD), причём каждое число в виде 1 байта, включая год. А тот самый год, который вроде как измеряется в тысячах, выглядит либо как число от 80 до 99 - это будет означать соответственно с 1980-го по 1999 год, либо как число от 0 до 29 - это будет год с 2000 по 2029-ый. Вот так это представлено в справке как WinCC Flexible:


В моём примере ниже ячейки памяти для даты/времени HMI будут обозначены как HMI2_DATETIME.

3. Дата и время тех же значений HMI, что и в предыдущем пункте, но переведённых в виде нормальных чисел.
В моём примере ниже - HMI_DATETIME.

4. Дата и время PLC в обычном формате.
В таком формате они возвращаются системной функцией PLC.
В моём примере ниже - PLC_DATETIME.

5. Дата и время PLC в формате BCD.
В таком формате они принимаются HMI для обновления её значений
В моём примере ниже - PLC2_DATETIME.


6. "Новые" дату и время для обновления на PLC.
Т.е. на HMI создаются поля для ввода даты и времени, привязанные к этим ячейкам PLC, и кнопка, по нажатию которой информация из этих ячеек передаётся в системную функцию обновления даты/времени PLC. В моём примере ниже - NEW_DATETIME.

7. Биты для управляющих кнопок:
- скопировать текущие дату/время HMI в ячейки для новых даты/времени
- скопировать текущие дату/время PLC в ячейки для новых даты/времени
- применить новую дату/время PLC (кнопка, упомянутая в пункте 6)

В общем и целом зарезервированная память в ПЛК выглядит так:


Исходный код на PLC


// Считать время HMI и отображать его в отдельных ячейках HMI
IF(#Front) THEN
   "HMI_DB".HMI_MAILBOX.Value := 40;
END_IF;

"HMI_DB".HMI_DATETIME.Year  := BCD16_TO_INT("HMI_DB".HMI2_DATETIME.Year);
"HMI_DB".HMI_DATETIME.Month := BCD16_TO_INT("HMI_DB".HMI2_DATETIME.Month);
"HMI_DB".HMI_DATETIME.Day   := BCD16_TO_INT("HMI_DB".HMI2_DATETIME.Day);
"HMI_DB".HMI_DATETIME.Hour  := BCD16_TO_INT("HMI_DB".HMI2_DATETIME.Hour);
"HMI_DB".HMI_DATETIME.Min   := BCD16_TO_INT("HMI_DB".HMI2_DATETIME.Min);
"HMI_DB".HMI_DATETIME.Sec   := BCD16_TO_INT("HMI_DB".HMI2_DATETIME.Sec);

// Записать заданное с HMI время в PLC

IF("HMI_DB".HMI_btn_Clock_Set_to_PLC) THEN
   "NotUsedInt" := WR_SYS_T(IN := "HMI_DB".NEW_DATETIME);
   "HMI_DB".HMI_btn_Clock_Set_to_PLC := false;
END_IF;

// Считать время PLC, отображать его в отдельных ячейках HMI
// и отправлять его на панель для обновления времени HMI (через PLC2_DATETIME)

"NotUsedInt" := RD_SYS_T(OUT => "HMI_DB".PLC_DATETIME);
"HMI_DB".PLC2_DATETIME.Year := "BCD_TO_BYTE"("HMI_DB".PLC_DATETIME.YEAR);
"HMI_DB".PLC2_DATETIME.Month := "BCD_TO_BYTE"("HMI_DB".PLC_DATETIME.MONTH);
"HMI_DB".PLC2_DATETIME.Day := "BCD_TO_BYTE"("HMI_DB".PLC_DATETIME.DAY);
"HMI_DB".PLC2_DATETIME.Hour := "BCD_TO_BYTE"("HMI_DB".PLC_DATETIME.HOUR);
"HMI_DB".PLC2_DATETIME.Min := "BCD_TO_BYTE"("HMI_DB".PLC_DATETIME.MINUTE);
"HMI_DB".PLC2_DATETIME.Sec := "BCD_TO_BYTE"("HMI_DB".PLC_DATETIME.SECOND);     

// Скопировать текущее время PLC в NEW

IF("HMI_DB".HMI_btn_Clock_Copy_PLC_to_NEW) THEN
   "HMI_DB".NEW_DATETIME.YEAR := "HMI_DB".PLC_DATETIME.YEAR;
   "HMI_DB".NEW_DATETIME.MONTH := "HMI_DB".PLC_DATETIME.MONTH;
   "HMI_DB".NEW_DATETIME.DAY := "HMI_DB".PLC_DATETIME.DAY;
   "HMI_DB".NEW_DATETIME.HOUR := "HMI_DB".PLC_DATETIME.HOUR;
   "HMI_DB".NEW_DATETIME.MINUTE := "HMI_DB".PLC_DATETIME.MINUTE;
   "HMI_DB".NEW_DATETIME.SECOND := "HMI_DB".PLC_DATETIME.SECOND;
   "HMI_DB".HMI_btn_Clock_Copy_PLC_to_NEW := false;
END_IF;

// Скопировать текущее время HMI в NEW

IF("HMI_DB".HMI_btn_Clock_Copy_HMI_to_NEW) THEN
   "HMI_DB".NEW_DATETIME.YEAR := BYTE_TO_UINT("HMI_DB".HMI_DATETIME.Year) + 2000;
   "HMI_DB".NEW_DATETIME.MONTH := "HMI_DB".HMI_DATETIME.Month;
   "HMI_DB".NEW_DATETIME.DAY := "HMI_DB".HMI_DATETIME.Day;
   "HMI_DB".NEW_DATETIME.HOUR := "HMI_DB".HMI_DATETIME.Hour;
   "HMI_DB".NEW_DATETIME.MINUTE := "HMI_DB".HMI_DATETIME.Min;
   "HMI_DB".NEW_DATETIME.SECOND := "HMI_DB".HMI_DATETIME.Sec;
   "HMI_DB".HMI_btn_Clock_Copy_HMI_to_NEW := false;
END_IF;


Настройки HMI


В HMI необходимо зайти в раздел Connections, а затем перейти во вкладку Area Pointer, где есть общая часть (For all connections), связанная с обновлением значения даты/времени HMI (синхронизация может происходить только с одним PLC) и конкретная часть для каждого PLC отдельно (For each connection) - в частности, сохранение текущей даты/времени HMI в PLC:


Следовательно, для нашего примера на PLC настройки HMI будут выглядеть следующим образом:


Теперь посмотрим, как это выглядит на панелях оператора Siemens Smart:


Как видно, номера строк не совпадают для одних и тех же параметров английской версии WinCC Flexible 2008 и WinCC Flexible Smart (и WinCC Flexible China SP4), однако, тут легко догадаться, какие строки нам нужны в китайской версии, даже не понимая иероглифов: четвёртая колонка Length указывают длину параметра (в 16-битных словах), которая для всех параметров каждого раздела разная. Т.е. тут легко сопоставить длины параметров:


Далее необходимо добавить все наши данные в таблицу тэгов.


Ну, и создаём экран такого плана:


Надеюсь, не надо объяснять, какой тэг к какой ячейке и к какой кнопке привязывается, тут и так всё очевидно. Единственное, следует обратить внимание, что год в считываемой с HMI текущей дате в моём примере состоит из двух ячеек: одна просто декоративная, в которой постоянно светится число "20", а вторая часть - это двузначное число HMI_DATETIME.Year. В принципе, можно было сделать и по-другому, переводя считываемое с HMI значение в полноценное четырёхзначное число (в функции на PLC).

WinCC в TIA Portal


Тут всё почти тоже самое, кроме того, что мы не можем считывать с HMI текущие дату/время, поскольку мы должны выбирать: либо задаём время на HMI, либо считываем его. Иначе получаем такую ошибку:  

The area pointer 'Date/time' is invalid. The "Date/Time" and "Date/Time PLC" global area pointers cannot be set at the same time

Поскольку у нас основная задача как раз задавать время, то функцию считывания мы не используем. Это не смертельно, хотя, повторюсь, совершенно непонятно, зачем Siemens ввёл такое ограничение. Соответственно, мы тут тоже настраиваем раздел Connections -> Area Pointer , но в усечённом виде, поскольку задаём только параметр Date/Time PLC. Ну, и Siemens не был бы Siemens'ом, если бы в этой версии WinCC не поставил всё с ног на голову:


Т.е. заметьте, что разделы и называются по другому: тот, который был раньше For all connections, теперь зовётся Global area pointer of HMI device, а раздел For each connection тут и вовсе не имеет названия. Ну, и конечно, разделы поменяны местами, как же без этого. Поменяны местами и строки: интересующая нас единственная строка Date/Time PLC теперь последняя в списке.

Соответсвенно, на экране больше нет ячеек для считанных с HMI значений и нет кнопки для копирования значений HMI в ячейки для задаваемых даты/времени:


Всё.




пятница, 22 мая 2020 г.

Особенность настройки ICP CON 7061D


Сегодняшняя тема - про модули ввода-вывода от фирмы ICP DAS. Долгое время у меня были сомнения насчёт использования различного рода дешёвых модулей ввода-вывода в связке с контроллером S7-1200, но вот возник объект, куда клиентом были закуплены модули M-7061D - дискретные выходы (12 DQ) и M-7041D - дискретные входы (14 DI).

По умолчанию на этих модулях используется протокол DCON. Мы с этим протоколом не работаем, мы используем Modbus RTU. Для изменения протокола и настройки параметров связи необходимо установить программу DCON Utility Pro. Где скачивать ПО и как настраивать оборудование, объясняет инструкция, которая идёт в комплекте с оборудованием. Инструкция - общая для любых модулей I-7000 и M-7000.


В левой верхней части мы видим настройки по умолчанию (Default Communication Parameters). В частности, там сказано, что для модулей M-7000 протоколом по умолчанию является Modbus RTU с адресом 1 и параметрами 9600 kbps, 8E1. Я не уверен, что это так. У меня было в распоряжении несколько модулей M-7061D и M-7041D и, по крайней мере некоторые из них, будучи в состоянии "с завода", при поиске устройств сети (поиск по обоим протоколам - DCON и Modbus RTU) вообще никакого результата не показали (может быть, надо было искать Modbus ASCII, - ну, я не пробовал). Поэтому я дальше этот поиск осуществлять не стал, а сразу перевел все устройства в режим INIT, и дальше уже с ним вёл настройку.

На модулях M-7041D режим INIT активируется тумблером INIT/NORMAL в задней части модуля.
На модулях M-7061D активация происходит перемычкой с клеммы GND на клемму INIT*.
Зачем так по-разному сделано? Я так понимаю, что изначально они хотели везде сделать активацию перемычкой, но на модуле M-7061D сравнительно много клемм, потому что на нём каждый канал дискретного выхода является отдельной группой (т.е. каждый канал использует две клеммы). Ну, соответственно, клемм получилось много, а размер самого устройства стандартный - как для всех M-7000, в итоге клемме INIT* места не досталось, вот и придумал производитель сделать тумблер. Как по мне, ни один из способов перехода в режим INIT не является удобным, потому что тумблер на M-7061D расположен в задней части модуля. Это значит, что если вы приедете на объект с уже собранным шкафом автоматики и установленными в нём на din-рейках устройствами, то каждое из них придётся снимать, чтобы переключать тумблер на обратной стороне. Перемычка - тоже так себе вариант. Почему не сделать было тумблер на передней части модуля (да и вообще всю настройку параметров интерфейса тумблерами) - неизвестно.

Далее под пунктом 2 мы видим рекламу конвертеров RS232/RS485 и USB/RS485 от ICP, которые они рекомендуют использовать для подключения к компу. Пункт 3 - это ссылка на скачивание DCON Utility Pro.

Переходим к пункту 4, тут мы видим картинку последовательности действий для поиска устройства:


Непонятно, зачем они понаставили галочек на разные скорости и на разные протоколы, если перед этим уже перевели устройства в режим INIT. В этом режиме искать надо на скорости 9600 kbps, протокол - DCON, без проверки контрольной суммы (Checksum Disabled), формат - без проверки на чётность, 8 бит, 1 стоп-бит ("N,8,1").

Переходим к пятому пункту. Тут у нас настройка параметров связи.

Ну, т.е. видите: (1) - нажали кнопку поиска, (2) - сделали двойной щелчок мыши по названию устройства в первой колонке таблицы, открылось окно настройки, (3) - поменяли всё, что нужно, (4) - нажали кнопку "Set...",  (5) - на выход, настройка закончена.

Для модуля M-7041D у меня всё так и настроилось. Вот смотрим нотариально заверенный скриншот:


А вот с модулями M-7061D что-то пошло не так:


В общем-то пляска с бубном привела к нажатию вот такой вот кнопочки:


И, собственно, появилось окошко, где в выпадающем списке можно выбрать тип модуля:


Выбираем M-7061D, после чего открывается окно настройки интерфейса - похожее на то, которое было до этого, но в заголовке окна присутствует надпись Offline Configuration. и кнопка другая - Write Configuration to I/O Module. Тут всё настроилось без проблем:


Далее обесточиваем модуль, убираем INIT, включаем и всё работает.

Регистры Modbus RTU


Для считывания текущего состояния дискретных входов модуля M-7041D используются Modbus-функция 02: Read input bits. Регистр для чтения - 10001. Функция позволяет читать несколько битов подряд за один запрос, т.е. читаем сразу 14 битов.

Для записи значений дискретных выходов модуля M-7061D используется Modbus-функция 05: Writing an output bit (если надо записать 1 бит) или функция 15: Writing multiple output bits - если надо записать значения для нескольких выходов (пишем сразу все 12 выходов, например). Регистр для записи - 1.

Возможно, что будет желание проверять состояние связи с каждым модулем (для индикации ошибки) через считывание контрольного слова. Я использовал для этого чтение значения из регистра 40485. В этом регистре хранится текущий адрес устройства в сети Modbus, это значение условно можно считать проверочным значением для текущего устройства.

P. S.
В общем-то, ничего пока сказать о качестве этих модулей не могу. Но думаю, что шансов, что они будут нормально работать, гораздо больше, чем у модулей Овена и других подобных горе-производителей. Ценник более чем приемлем, хотя вся эта приемлемость проистекает напрямую из-за возможности покупать модули тут, в России через юрлицо, не занимаясь обналом. Если же сравнивать с ценами Aliexpress, то я бы предпочел купить S7-200 и noname-модули к нему, и так же по Modbus сделать связку с S7-1200, потому что на S7-200 можно переложить часть функционала, включая проверки на дребезг контактов и масштабирование аналогового сигнала. Ценник на модули ICP CON у официалов явно завышен, это легко проверить, если сравнить с ценами на них же на Aliexpress, хотя модулей M-7000 (Modbus) я с ходу не нашел, но вот, например, модуль I-7000 для подключения 8 термопар (I-7019R) на Aliexpress стоит $60, а в России - $250, на дискретные модули разбег, понятное дело, меньший (раза в полтора - два), но просто из-за невозможности торгашей сделать конкурентную цену высокой.

четверг, 13 февраля 2020 г.

Ошибка OPCENUM в Windows 10

В Windows 10 при попытке запустить приложение, написанное с использованием WTCLIENT.DLL, выдало ошибку:

Failed to Execute OPCENUM

На Windows 7 подобной ошибки никогда не возникало. Ну, короче, необходимо в таком случае установить OPC Core Components.

Качаем тут

или на официальном сайте - но там необходимо сначала зарегистрироваться...

P.S. Напомню, WTClient - удобная бесплатная библиотека для написания приложений с использованием OPC-сервера, только качать ее надо тут