Jump to content
Форум по продукции MOXA

Recommended Posts

Доброго времени суток!

Ранее... сколько-то лет назад реализовал сбор данных с оборудования. Там был контроллер 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
15 минут назад, Знайка сказал:

Пока не могу ответить. Читаю, ищу как построить TCP пакет побайтно. Потому как на PC реально доустановить необходимое (хоть питон, хоть другое). А для IA241LX имея только Си(кросскомпилятор), Баш и что-то то что ранее собрал. Собственно MOXA(IA241LX) должен сам кроме сбора и ещё контролировать работу. Сейчас MOXA только по Modbus RTU управляет системой охлаждения и поддерживает указанные соединения. А должна и получать ряд параметров (температура, масса, мощность, наличие напряжения на силовой установке и др.) для нормального управления. Программисты оборудования конечно выдали ряд сигналов на свободные порты контроллера, которые MOXA принимает через порты ввода по второму порту Modbus RTU. Но ранее с другим контроллером IA241LX всё получал по eth0 без костылей.

Link to comment
2 часа назад, Знайка сказал:

Кое-что нашел в коде на Си по этой теме. Вроде как без библиотек... только сокеты... пока не вижу другого иного. Мне из кода вырвать легче чем из абстрактных описаний, многие из которых просто так недоступны В любом случае код выложу... конечно при удачной реализации.

Link to comment

Доброго времени суток!

Пока вот нарвался на тестовый код... пробую с ноутбука на 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

Вот мучаюсь... изучая 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
В 09.02.2020 в 17:03, Знайка сказал:

Что-то кроме оглавлений ничего увидеть так просто не могу. Одним словом начало документа есть,(станицы 4 с оглавлением), а продолжения нет.

Link to comment
10 hours ago, oiv_1968 said:

Что-то кроме оглавлений ничего увидеть так просто не могу. Одним словом начало документа есть,(станицы 4 с оглавлением), а продолжения нет.

Потому как они платные, похоже что :(

Link to comment
Только что, Знайка сказал:

Потому как они платные, похоже что :(

:(

Меня бы устроил пример кода, где применяется достаточный набор из таких ключевых слов. Вообще-то платное описание некоего общепринятого стандарта (именно стандарта, а не продукта) это уж слишком. Чем-то напоминает монопольное право на имена ассемблерных инструкций для процессора I8080 и ZILOGу для Z80 пришлось придумывать свои названия при практически одинаковой архитектуре при практически одинаковых командах.   

Link to comment

И всё-таки на гитхабе 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
  • 4 weeks later...

Доброго времени суток!

Проблема: посылаю запрос:

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

Доброго времени суток!

Вопрос:

Есть ли возможность используя обращение к OPC UA серверу сразу в один запрос читать несколько параметров, а не по одному (вышеуказанный пример). Уж больно большой интервал в получении данных по списку по одному.

Спасибо!

Link to comment
В 20.03.2020 в 15:15, oiv_1968 сказал:

Доброго времени суток!

Вопрос:

Есть ли возможность используя обращение к OPC UA серверу сразу в один запрос читать несколько параметров, а не по одному (вышеуказанный пример). Уж больно большой интервал в получении данных по списку по одному.

Спасибо!

Доброго времени суток!

Спасибо, что уделили внимание!

Научился читать данные по необходимому списку имён за один запрос к OPC UA серверу.

Вопрос снят!

Спасибо!

Позднее будет предъявлен вполне рабочий код.

Link to comment
  • 3 months later...

Доброго времени суток! Вот это:

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
  • 3 weeks later...

Доброго времени суток!

Вот реализовал доступ к OPC UA к серверу для сбора параметров из устройства IA240. Теперь возникло желание(задание) что бы это же устройство получало доступ к MySQL серверу с целью их сохранения. Вот перебрал много чего из исходников, но имеющийся кросс-компилятор не умеет того что умеет обычный на Debian.

Если не сложно ткните носом на подходящие исходники для сборки libmysqlclient(mysql-client).

Заранее благодарен.

Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...