oiv_1968 Posted February 9, 2020 Share Posted February 9, 2020 Доброго времени суток! Ранее... сколько-то лет назад реализовал сбор данных с оборудования. Там был контроллер AC800M и панель MT316R. Прослушал обмен между ними и имея имена параметров, их тип (из предоставленного проекта) реализовал сбор этих данных. Wireshark мне помог и были определены как протокол(MMS) и тип соединения (как последовательность подключения, так и обмен). Было реализовано как на Windods (C#; C; C++)на PC и UNO1019, так и позже на LINUX(PC Debian) и MOXA(IA240). Но в этом году был перемонтаж системы управления на контроллер от SIEMENS и другую сенсорную панель... от той же фирмы, что и ранее (ABP). Они полностью перешли на SIEMENS отказавшись от ABB и на контроллере любезно открыли OPC сервер (порт 4840) при этом объяснив что можно воспользоваться любым подходящим(стандартным) OPC клиентом и дали список параметром(имена и типы). Поискав на гугле и гитхабе выудил кое-что, но всё на питоне и др. И всё с применением библиотек, которые надо установить. Понятно что для IA240 мне надо будет самому написать всё (это не страшно). Но вот пошатавшись по форумам увидел только то, что это элементарно - подключаешь библиотеку и вперёд. Но никто не описал ничего по собственно работе. А вопрос такой: каков формат соединения и обмена. Мне же надо это делать на уровне сокетов. А описания обмена не смог найти. Конечно можно взять что-то готовое и вновь прослушать (Wireshark) обмен с момента соединения и процесс обмена (запрос-ответ). Но если это всё стандартное, то может ткнёте новом в каком месте мне копать. Рад буду любой информации по описанию низкоуровневого обмена клиента с сервером OPC. Для уточнения на данный момент реализовано: 1. рабочая сеть оборудования подключена на eth0 MOXA(IA241LX) собственно там OPC контроллера и VNC панели 2. сеть (192.168.1.0/24) на eth1 MOXA(IA241LX) с доступом к PC(Debian) 3. На IA241LX с помощью socat проброшены соединения для OPC и VNC для контроллера и панели соответственно из сети 192.168.1.0/24. 4. На PC(Debian 2 сетевые карты) с помощью socat проброшены соединения для OPC и VNC из локальной сети предприятия к MOXA(IA241LX - 192.168.1.220). 5. С PC локальной сети предприятия произведено тестирование доступа по VNC к сенсорной панели по схеме PC <-->PC(Debian 2 сетевые карты)<-->IA241LX<-->Панель. Работает нормально. Осталось OPC-UA реализовать. Спасибо заранее!!! Link to comment
Знайка Posted February 9, 2020 Share Posted February 9, 2020 Добрый день! Это http://webstore.iec.ch/webstore/webstore.nsf/mysearchajax?Openform&key=62541&sorting=&start=1&onglet=1 не то? Link to comment
oiv_1968 Posted February 9, 2020 Author Share Posted February 9, 2020 15 минут назад, Знайка сказал: Добрый день! Это http://webstore.iec.ch/webstore/webstore.nsf/mysearchajax?Openform&key=62541&sorting=&start=1&onglet=1 не то? Пока не могу ответить. Читаю, ищу как построить TCP пакет побайтно. Потому как на PC реально доустановить необходимое (хоть питон, хоть другое). А для IA241LX имея только Си(кросскомпилятор), Баш и что-то то что ранее собрал. Собственно MOXA(IA241LX) должен сам кроме сбора и ещё контролировать работу. Сейчас MOXA только по Modbus RTU управляет системой охлаждения и поддерживает указанные соединения. А должна и получать ряд параметров (температура, масса, мощность, наличие напряжения на силовой установке и др.) для нормального управления. Программисты оборудования конечно выдали ряд сигналов на свободные порты контроллера, которые MOXA принимает через порты ввода по второму порту Modbus RTU. Но ранее с другим контроллером IA241LX всё получал по eth0 без костылей. Link to comment
oiv_1968 Posted February 9, 2020 Author Share Posted February 9, 2020 2 часа назад, Знайка сказал: Добрый день! Это http://webstore.iec.ch/webstore/webstore.nsf/mysearchajax?Openform&key=62541&sorting=&start=1&onglet=1 не то? Кое-что нашел в коде на Си по этой теме. Вроде как без библиотек... только сокеты... пока не вижу другого иного. Мне из кода вырвать легче чем из абстрактных описаний, многие из которых просто так недоступны В любом случае код выложу... конечно при удачной реализации. Link to comment
oiv_1968 Posted February 10, 2020 Author Share Posted February 10, 2020 Доброго времени суток! Пока вот нарвался на тестовый код... пробую с ноутбука на OPC UA сервер. К сожалению нарвался, скачал пример, а адреса (URL) источника не сохранил. Компилил на Debian машине. Для MOXA трудоемко подключать модули. А там в примере строка компиляции: g++ -O2 libOPC_UA.cpp test.cpp -o testOPC_UA -lpthread -lssl -lcrypto испытал из локальной сети по схеме: Для уточнения на данный момент реализовано: 1. рабочая сеть оборудования подключена на eth0 MOXA(IA241LX) собственно там OPC контроллера и VNC панели 2. сеть (192.168.1.0/24) на eth1 MOXA(IA241LX) с доступом к PC(Debian) 3. На IA241LX с помощью socat проброшены соединения для OPC и VNC для контроллера и панели соответственно из сети 192.168.1.0/24. 4. На PC(Debian 2 сетевые карты) с помощью socat проброшены соединения для OPC и VNC из локальной сети предприятия к MOXA(IA241LX - 192.168.1.220). 5. С PC локальной сети предприятия произведено тестирование доступа по VNC к сенсорной панели по схеме PC <-->PC(Debian 2 сетевые карты)<-->IA241LX<-->Панель. Работает нормально. Осталось OPC-UA реализовать. и вот что вышло при тесте доступа к серверу: kto@debian:~/coding/OPC/tmp/libopc$ ./testOPC_UA opc.tcp://192.168.0.234:4840/None/None 84 Set and uses secure policy 'None' and messages mode 'None' Browse node '84' list from 4 items node0: "FolderType (61)" node1: "Objects (85)" node2: "Types (86)" node3: "Views (87)" Read node '84'=0h kto@debian:~/coding/OPC/tmp/libopc$ ./testOPC_UA opc.tcp://192.168.0.234:4840/None/None 61 Set and uses secure policy 'None' and messages mode 'None' Browse node '61' list from 23 items node0: "BaseObjectType (58)" node1: "AlarmGroupType (16405)" node2: "CertificateGroupFolderType (13813)" node3: "FileDirectoryType (13353)" node4: "OperationLimitsType (11564)" node5: "Root (84)" node6: "Objects (85)" node7: "Types (86)" node8: "Views (87)" node9: "ObjectTypes (88)" node10: "VariableTypes (89)" node11: "DataTypes (90)" node12: "ReferenceTypes (91)" node13: "ModellingRules (2019)" node14: "AggregateFunctions (2754)" node15: "ModellingRules (2996)" node16: "AggregateFunctions (2997)" node17: "EventTypes (3048)" node18: "ModellingRules (3093)" node19: "AggregateFunctions (3094)" node20: "AggregateFunctions (11172)" node21: "AggregateFunctions (11876)" node22: "FunctionalGroupType (2:1005)" Read node '61'=0h kto@debian:~/coding/OPC/tmp/libopc$ ./testOPC_UA opc.tcp://192.168.0.234:4840/None/None 85 Set and uses secure policy 'None' and messages mode 'None' Browse node '85' list from 5 items node0: "Root (84)" node1: "FolderType (61)" node2: "Server (2253)" node3: "DeviceSet (2:5001)" node4: "+F1=A05-D1 (3:"PLC")" Read node '85'=0h kto@debian:~/coding/OPC/tmp/libopc$ ./testOPC_UA opc.tcp://192.168.0.234:4840/None/None 90 Set and uses secure policy 'None' and messages mode 'None' Browse node '90' list from 5 items node0: "Types (86)" node1: "BaseDataType (24)" node2: "FolderType (61)" node3: "OPC Binary (93)" node4: "XML Schema (92)" Read node '90'=0h kto@debian:~/coding/OPC/tmp/libopc$ ./testOPC_UA opc.tcp://192.168.0.234:4840/None/None 92 Set and uses secure policy 'None' and messages mode 'None' Browse node '92' list from 4 items node0: "DataTypes (90)" node1: "DataTypeSystemType (75)" node2: "Opc.Ua (8252)" node3: "Opc.Ua.Di (2:6423)" Read node '92'=0h kto@debian:~/coding/OPC/tmp/libopc$ ./testOPC_UA opc.tcp://192.168.0.234:4840/None/None 75 Set and uses secure policy 'None' and messages mode 'None' Browse node '75' list from 3 items node0: "BaseObjectType (58)" node1: "XML Schema (92)" node2: "OPC Binary (93)" Read node '75'=0h kto@debian:~/coding/OPC/tmp/libopc$ Теперь буду щупать работу (спасибо незнакомым ребятам что ткнули носом и предоставили пример). Хотя скачал и с Гитхаба libopc-master, но не разобрался пока с libxml. Тут просто пример. Не получается пока Wireshark применить - уж больно много мусора по сети летает... она же общая для всех. А на оборудование всё нести пока руки не дошли. Link to comment
oiv_1968 Posted February 16, 2020 Author Share Posted February 16, 2020 Вот мучаюсь... изучая OPC UA. Очень мало (не считая " КУПИТЕ У НАС") информации удалось найти. Конечно можно глубоко изучать эту тему. Но мне не позволят. Вот выкладываю как пример: OPC.zip в директории server_ua сервер на питоне (взят из примеров для raspbery) и требует ряда доустановок библиотек и т.п. Внимания этому не уделял нужен был просто сервер для проверки кода клиента. в директории testclient_ua собственно рабочий консольный код который запускается на IA240LX/UC-7112LX-Plus. В директории файлы C++ и: test_Makefile - запускаемый файл для кросскомпиляции (для устройства, но можете указать и другой компилятор) testOPC_UA - результат компиляции... запускаемый файл. Ранее описывал его работу test.sh - маленький скрипт... ну чтобы каждый раз не вводить IP сервера. Порт на сервере выбран 4840, ну и клиент работает с сервером. Код предоставлен не мной (я выкладываю может он кому потребуется) просто для ознакомления. Вот вопросы: // Browse request for pointed node req.setAttr("id","Browse"); .... // Read pointed node value and access attribute req.clear()->setAttr("id", "Read")->setAttr("timestampsToReturn", int2str(TS_SOURCE)); .... req.clear()->setAttr("id", "Write")-> childAdd("node")->setAttr("nodeId", argv[2])->setAttr("attributeId", int2str(AId_Value))-> setAttr("VarTp", int2str(eMask))->setText("3.14159265"); Видите там есть ключевые слова. Я понимаю они выполняются сервером... но список этих команд в примере не полный. Если не сложно ткните носом, где можно ознакомиться с этим списком. Link to comment
oiv_1968 Posted February 16, 2020 Author Share Posted February 16, 2020 В 09.02.2020 в 17:03, Знайка сказал: Добрый день! Это http://webstore.iec.ch/webstore/webstore.nsf/mysearchajax?Openform&key=62541&sorting=&start=1&onglet=1 не то? Что-то кроме оглавлений ничего увидеть так просто не могу. Одним словом начало документа есть,(станицы 4 с оглавлением), а продолжения нет. Link to comment
Знайка Posted February 17, 2020 Share Posted February 17, 2020 10 hours ago, oiv_1968 said: Что-то кроме оглавлений ничего увидеть так просто не могу. Одним словом начало документа есть,(станицы 4 с оглавлением), а продолжения нет. Потому как они платные, похоже что Link to comment
oiv_1968 Posted February 17, 2020 Author Share Posted February 17, 2020 Только что, Знайка сказал: Потому как они платные, похоже что Меня бы устроил пример кода, где применяется достаточный набор из таких ключевых слов. Вообще-то платное описание некоего общепринятого стандарта (именно стандарта, а не продукта) это уж слишком. Чем-то напоминает монопольное право на имена ассемблерных инструкций для процессора I8080 и ZILOGу для Z80 пришлось придумывать свои названия при практически одинаковой архитектуре при практически одинаковых командах. Link to comment
oiv_1968 Posted February 17, 2020 Author Share Posted February 17, 2020 И всё-таки на гитхабе OpcUaStack-3.8.1 попался. И если там поковыряться то в определениях... // commands #include "OpcUaClient/ClientCommand/CommandConnect.h" #include "OpcUaClient/ClientCommand/CommandDisconnect.h" #include "OpcUaClient/ClientCommand/CommandRead.h" #include "OpcUaClient/ClientCommand/CommandReadH.h" #include "OpcUaClient/ClientCommand/CommandWrite.h" #include "OpcUaClient/ClientCommand/CommandWriteH.h" #include "OpcUaClient/ClientCommand/CommandDelay.h" #include "OpcUaClient/ClientCommand/CommandNodeSetServer.h" #include "OpcUaClient/ClientCommand/CommandNodeSetFilter.h" #include "OpcUaClient/ClientCommand/CommandBrowse.h" #include "OpcUaClient/ClientCommand/CommandFunction.h" #include "OpcUaClient/ClientCommand/CommandBrowsePathToNodeId.h" #include "OpcUaClient/ClientCommand/CommandGetEndpoint.h" #include "OpcUaClient/ClientCommand/CommandFindServer.h" #include "OpcUaClient/ClientCommand/CommandRegisterServer.h" // services #include "OpcUaClient/ClientService/ClientServiceConnect.h" #include "OpcUaClient/ClientService/ClientServiceDisconnect.h" #include "OpcUaClient/ClientService/ClientServiceRead.h" #include "OpcUaClient/ClientService/ClientServiceReadH.h" #include "OpcUaClient/ClientService/ClientServiceWrite.h" #include "OpcUaClient/ClientService/ClientServiceWriteH.h" #include "OpcUaClient/ClientService/ClientServiceDelay.h" #include "OpcUaClient/ClientService/ClientServiceNodeSetServer.h" #include "OpcUaClient/ClientService/ClientServiceNodeSetFilter.h" #include "OpcUaClient/ClientService/ClientServiceBrowse.h" #include "OpcUaClient/ClientService/ClientServiceFunction.h" #include "OpcUaClient/ClientService/ClientServiceBrowsePathToNodeId.h" #include "OpcUaClient/ClientService/ClientServiceGetEndpoint.h" #include "OpcUaClient/ClientService/ClientServiceFindServer.h" #include "OpcUaClient/ClientService/ClientServiceRegisterServer.h" Это ничего логичного не означает, но каждый файл соответствует слову ключевому. И там в файлах (как C++, так и заголовочных) есть кое-что. Вообще-то и скрипты для теста так же есть. Может и собрать выйдет... но больно хлопотно с путями в файлах, но корня проекта не увидел пока. Link to comment
oiv_1968 Posted March 12, 2020 Author Share Posted March 12, 2020 Доброго времени суток! Проблема: посылаю запрос: 3:""MSG_AlarmToPanel"."BitList"."External Voltage On"" А по Wirechark (снифер) проходит: 3:""MSG_AlarmToPanel"."BitList"."External найден участок кода(предположительно) XML_N* XML_N::setAttr( const string &name, const string &val ) { // for(unsigned iA = 0; iA < mAttr.size(); iA++) if(mAttr[iA].first == name) { mAttr[iA].second = val; return this; } mAttr.push_back(pair<string,string>(name,val)); return this; } Пропускает всё до первого пробела. А Товарищи ABP-шники сделали имя параметра с пробелами. С Си работаю, но не с C++ и string-ом конкретно. И именно этот параметр важен очень для автоконтроля...а остальные параметры сделали нормально и я их спокойно читаю. Есть ли возможность исправить? Спасибо. Link to comment
oiv_1968 Posted March 13, 2020 Author Share Posted March 13, 2020 Доброго времени суток! Найден альтернативный параметр без пробела ( в данном случае лампа индикации ). Link to comment
oiv_1968 Posted March 20, 2020 Author Share Posted March 20, 2020 Доброго времени суток! Вопрос: Есть ли возможность используя обращение к OPC UA серверу сразу в один запрос читать несколько параметров, а не по одному (вышеуказанный пример). Уж больно большой интервал в получении данных по списку по одному. Спасибо! Link to comment
oiv_1968 Posted March 22, 2020 Author Share Posted March 22, 2020 В 20.03.2020 в 15:15, oiv_1968 сказал: Доброго времени суток! Вопрос: Есть ли возможность используя обращение к OPC UA серверу сразу в один запрос читать несколько параметров, а не по одному (вышеуказанный пример). Уж больно большой интервал в получении данных по списку по одному. Спасибо! Доброго времени суток! Спасибо, что уделили внимание! Научился читать данные по необходимому списку имён за один запрос к OPC UA серверу. Вопрос снят! Спасибо! Позднее будет предъявлен вполне рабочий код. Link to comment
oiv_1968 Posted June 27, 2020 Author Share Posted June 27, 2020 Доброго времени суток! Вот это: opc_ua_work.zip мой рабочий вариант доступа к данным OPC UA серверу. Как пример запуска: www-data@Moxa:~/ramdisk$ ./myopcclient Доступ к данным контроллера SIMATIC.S7-1500.OPC-UAServer (без авторизации) вид: myopcclient opc.tcp://<IP>:<PORT>/None/None где: <IP> - IP адрес OPC UA сервера <PORT> - порт прослушивания OPC UA сервера Но это для вывода данных в консоль. Данных из списка. Конечно не одним запросом, а несколькими. Сервер почему-то ограничивает количество параметров в одном запросе. Так что по 6 параметров в одном запросе. так что весь пакет параметров теперь получаю на IA240 за 4 секунды. Вот список: #define _melt_mp1_com_sta_opmode "3:\"\"MELT_mp1\".\"com\".\"sta\".\"OpMode\"\"" #define _melt_mp2_com_sta_opmode "3:\"\"MELT_mp2\".\"com\".\"sta\".\"OpMode\"\"" #define _melt_mp1_melt_ope_temperature "3:\"\"MELT_mp1\".\"melt\".\"ope\".\"Temperature\"\"" #define _melt_mp2_melt_ope_temperature "3:\"\"MELT_mp2\".\"melt\".\"ope\".\"Temperature\"\"" #define _melt_mp1_sin_ope_temperature "3:\"\"MELT_mp1\".\"sin\".\"ope\".\"Temperature\"\"" #define _melt_mp2_sin_ope_temperature "3:\"\"MELT_mp2\".\"sin\".\"ope\".\"Temperature\"\"" #define _melt_mp1_melt_ope_weight "3:\"\"MELT_mp1\".\"melt\".\"ope\".\"Weight\"\"" #define _melt_mp2_melt_ope_weight "3:\"\"MELT_mp2\".\"melt\".\"ope\".\"Weight\"\"" #define _melt_mp1_melt_ope_manpower "3:\"\"MELT_mp1\".\"melt\".\"ope\".\"ManPower\"\"" #define _melt_mp2_melt_ope_manpower "3:\"\"MELT_mp2\".\"melt\".\"ope\".\"ManPower\"\"" #define _inv_inv1_sta_power "3:\"\"INV_inv1\".\"sta\".\"Power\"\"" #define _inv_inv2_sta_power "3:\"\"INV_inv2\".\"sta\".\"Power\"\"" #define _inv_inv1_sta_current "3:\"\"INV_inv1\".\"sta\".\"Current\"\"" #define _inv_inv2_sta_current "3:\"\"INV_inv2\".\"sta\".\"Current\"\"" #define _inv_inv1_sta_voltage "3:\"\"INV_inv1\".\"sta\".\"Voltage\"\"" #define _inv_inv2_sta_voltage "3:\"\"INV_inv2\".\"sta\".\"Voltage\"\"" #define _inv_inv1_sta_freq "3:\"\"INV_inv1\".\"sta\".\"Frequency\"\"" #define _inv_inv2_sta_freq "3:\"\"INV_inv2\".\"sta\".\"Frequency\"\"" #define _fur1_tilted "3:\"\"MELT_fur1\".\"ope\".\"Tilted\"\"" #define _fur2_tilted "3:\"\"MELT_fur2\".\"ope\".\"Tilted\"\"" #define _inv1_ison "3:\"\"INV_inv1\".\"sta\".\"IsOn\"\"" #define _inv2_ison "3:\"\"INV_inv2\".\"sta\".\"IsOn\"\"" #define _i_hvswitch1ison "3:\"\"I_HVSwitch1IsOn\"\"" #define _o_hvswitch1Lock "3:\"\"O_HVSwitch1Lock\"\"" #define _o_hwswitch1on "3:\"\"O_HVSwitch1On\"\"" #define _o_lmhvswitch1on "3:\"\"O_LMHVSwitch1On\"\"" #define _act_date "3:\"\"MELT_mpc\".\"com\".\"ActDate\"\"" #define _act_time "3:\"\"MELT_mpc\".\"com\".\"ActTime\"\"" Это определения для формирования. Понятное дело у Вас будет свой список и своё количество. Приложенный код работает с самодельным сервером связи... это если в строке параметров указать ещё и IP и PORT этого сервера. Но рассматривать весь проект тут не буду. Вот код из скрипта запуска (BASH) #!/bin/bash case $par in ... myopcclient_one) # тут буде только вывод в консоль killall -9 myopcclient echo "Starting myopclient..." ./myopcclient opc.tcp://$ip_opc:$p_opc/None/None & ;; myopcclient) # тут данные сразу в сервер связи killall -9 myopcclient echo "Starting myopclient..." ./myopcclient opc.tcp://$ip_opc:$p_opc/None/None $ip_mserver $p_mserver & ;; ... esac Вообще-то по исходникам всё видно. Link to comment
oiv_1968 Posted July 18, 2020 Author Share Posted July 18, 2020 Доброго времени суток! Вот реализовал доступ к OPC UA к серверу для сбора параметров из устройства IA240. Теперь возникло желание(задание) что бы это же устройство получало доступ к MySQL серверу с целью их сохранения. Вот перебрал много чего из исходников, но имеющийся кросс-компилятор не умеет того что умеет обычный на Debian. Если не сложно ткните носом на подходящие исходники для сборки libmysqlclient(mysql-client). Заранее благодарен. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now