Opc клиент. нужна информация.

Тема в разделе "Флудилка", создана пользователем Igor68, 3 мар 2020.

  1. Igor68

    Igor68 Гуру

    Доброго времени суток! Вот тут (архив):
    OPC.zip
    Размещается OPC UA сервер на питоне (тестовый пример взят по поисковикам по теме кстати для малины) - я применял только как тестовый сервер для отладки клиента.
    Там же размещается и код клиента на C++ (тестовый код). Моя задача собрать клиента для устройства с Linux. Как код все работает. И компилятор для устройства применял. И данные с оборудования читаю.
    Вопрос в том, что информации, кроме рекламы с призывом купить, ничего найти не могу. Питон (библиотеки доступны) на том устройстве не реальны. Возможно ли читать сразу несколько параметров по этому протоколу... и вообще боюсь "напрягать" рабочее оборудование контроллером на Linux. А данные получать надо.
    Желающих предложить иные решения типа "костыли" просьба не беспокоить - контроллер SIEMENS предлагает услуги OPC UA к которым контроллер с Linux на борту должен получать параметры как клиет OPC UA. Просьба не предлагать Raspberry вместо упоминаемого контроллера с Linux с установленного на DIN рейку.
    Спасибо!
    Информации по протоколу вполне достаточно! И как говорил устройство самостоятельно уже читает параметры. Страшно читать кучу параметров частым обращением к этому Сименсу. По сему и вопрос по протоколу!
     

    Вложения:

    • OPC.zip
      Размер файла:
      503,5 КБ
      Просмотров:
      14
    Последнее редактирование: 3 мар 2020
  2. Igor68

    Igor68 Гуру

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

    Проблема: посылаю запрос:
    Код (Text):
    3:""MSG_AlarmToPanel"."BitList"."External Voltage On""
    А по Wirechark (снифер) проходит:
    Код (C++):
    3""MSG_AlarmToPanel"."BitList"."External
    найден участок кода(предположительно)
    Код (C++):
    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-ом конкретно. И именно этот параметр важен очень для автоконтроля...а остальные параметры сделали нормально и я их спокойно читаю.

    Есть ли возможность исправить?

    Спасибо.
     
  3. AlexU

    AlexU Гуру

    В архиве сертификат с закрытым ключём зачем выложили? Или это не боевые ключ и сертификат?
     
  4. Igor68

    Igor68 Гуру

    Ключ и сертификат просто для теста, а приложены не мною... всё взято из чужого опубликованного примера. Я только приспосабливаю его под себя и до этих параметров у меня дела нет. Предоставленный мне OPC сервер в изолированной сети - открытый.
    Вопрос был в другом.
     
  5. AlexU

    AlexU Гуру

    Вопрос был на всякий случай. А то были такие, что на публичные сервера выкладывали боевые закрытые ключи... В частности на github коммитили по-недосмотру...
    В этом участке кода нет проверки на пробел. Идёт поиск пары "ключ->значение" в списке, если находит, то заменяет значение, если нет, то добавляет в конец списка.
     
  6. Если ту самую строку
    Код (Text):
    3:""MSG_AlarmToPanel"."BitList"."External Voltage On""
    передаете в командной строке тестовому приложению, то из-за наличия пробелов получается множество аргументов.
    Код (Text):
    3:MSG_AlarmToPanel.BitList.External
    Voltage
    On
     
  7. Igor68

    Igor68 Гуру

    Доброго времени суток! Всякие ключи и т.п. надо настраивать в самом проекте для устройства... ну и клиента.
    По поводу замены на перенос... есть клиент (браузер для пробы) с ним нет проблем т.е. я им читаю параметры по выбору. Но требуется оснастить контроллер с Linux доступом к Сименс-контроллеру. Снифером посмотрел все... и S7-Simatic принимает именно строку всю нормально. Похоже выложенный код типа для примера и ограничен. Вообще-то по правилам нормального тона все имена имеют подобный вид:
    Код (Text):
    I_HVSwitch1IsOn
    ManPower
    OpMode
     
    И по началу я не понял почему именно этот параметр (сообщение об ошибке подачи высокого) - подача высокого напряжения. Искал и в блоках входа (Inputs) там так же через пробел... и в глобальных данных через пробел. И вот лампа индикации напряжения 6.3 кВ на щите в блоке (Outputs) без пробела:
    Код (Text):
    O_LMHVSwitch1On
    На том и остановился. А
    Код (Text):
    External Voltage On
    это уже поиск альтернативы. Сначала думал вообще, что не все параметры можно прочитать этим примером кода, а это дело в методе, который для документации и совсем не автоматизации.
    Окончание "ция" совсем не означает что документация и автоматизация одно и то же... ну и программа это рабочий код, а совсем не объяснительная начальнику и синтаксическая(или иная) ошибка в выводе сообщений программы в консоль вовсе не означает в неправильности работы алгоритма программы... ну и т.п.
     
  8. Igor68

    Igor68 Гуру

    А в этом случае символ с кодом 0x20 будет заменён на 0x0D (или 0x0A - уж и не помню кто из них "перевод строки" и "возврат каретки" - не на слуху)
     
  9. Я говорил о передаче параметров через командную строку, в примере для проверки просто вывожу все аргументы на печать
    Код (Text):
    ~$ echo -e '#include <stdio.h>\nint main(int argc, char **argv) { for (int n = 0; n < argc; printf("[%d](%s)\\n", n, argv[n]), n++); return 0; }' >/tmp/my_prog.c && gcc /tmp/my_prog.c -o /tmp/my_prog
    Передаю строку не экранируя пробелы
    Код (Text):
    ~$ /tmp/my_prog 3:""MSG_AlarmToPanel"."BitList"."External Voltage On""
    [0](/tmp/my_prog)
    [1](3:MSG_AlarmToPanel.BitList.External)
    [2](Voltage)
    [3](On)
    Передаю строку экранируя пробелы
    Код (Text):
    ~$ /tmp/my_prog 3:""MSG_AlarmToPanel"."BitList"."External\ Voltage\ On""
    [0](/tmp/my_prog)
    [1](3:MSG_AlarmToPanel.BitList.External Voltage On)
    Я высказал свеё предположение, если командная строка не используется, могли бы просто об этом сказать.
     
  10. Igor68

    Igor68 Гуру

    Да я понимаю вас! Мне передавать надо с пробелами... а вот в Wireshark:
    Код (Text):
    NodeId Identifier String: ""MSG_AlarmToPanel"."BitList"."External
    при этом:
    Код (Text):
    kto@debian:~/coding/OPC/tmp/libopc$ ./test.sh
    URL:192.168.0.234
    Input(def 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
    Input(def 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
    Input(def 84): 3:""MSG_AlarmToPanel"."BitList"."External Voltage On""
    Set and uses secure policy 'None' and messages mode 'None'
    ERROR: Browse: '0x80210000:'
    ERROR: Read: '0x80010000:'
    Input(def 84): 3:""MSG_AlarmToPanel"."BitList"."External Voltage On""
    Set and uses secure policy 'None' and messages mode 'None'
    ERROR: Browse: '0x80210000:'
    ERROR: Read: '0x80010000:'
    Input(def 84):
     
    просточило до первого пробела:
    Код (Text):
    3:""MSG_AlarmToPanel"."BitList"."External Voltage On""
    Это уже не важно... найден параметр без пробела (выход на лампу индикации этого параметра)

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

    Спасибо!
     
  11. Igor68

    Igor68 Гуру

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