PDA

Просмотр полной версии : Собственный протокол устройства + OPC сервер



Vitorgan
26.09.2014, 11:16
Здравствуйте, прошу помощи! Начну по порядку:
1. Подключил устройство через АС4, далее в MasterOPC Universal Modbus Server создал новый коммуникационный узел с настройками: 14514
Настройки взял из документации на прибор ( Wordовский документ в архиве)
2. Добавил устройство и прописал настройки:14515
где адрес - прописал адрес, который забивал в устройстве :008
3.Добавил тег: 14516

Во-первых вопрос: куда мне прописывать скрипт? В Устройство? или Тег?

Со скриптом еще веселее.
Хочется считать с устройства например значение датчиков. В документации описано:14517

Если я не ошибся, то это очень похоже на протокол "DCON".

Просмотрел пример реализации собственных протоколов.

Листинг 1.7 Пример реализации протокола DCON

-- функция,выполняющаяся перед чтением тегов

function OnBeforeReading()

local Addr=server.GetCurrentDeviceAddress(); --считываем адрес устройства

local send={}; --инициализируем таблицу запроса

send[1] = "#"; --оператор типа запроса

send[2] = string.format ("%02X",Addr); --преобразование адреса

--к нужному виду

send[3]="\r"; --добавление символа перевода каретки

local sendmask={"string","string","string"}; --маска запроса

local dest={}; --инициализация таблицы принятых значений

local destmask={"string:1","sdouble:8:7"}; --маска ответа

--дополнительные переменные: ошибка, количество элементов в таблице dest,

--количество принятых байт

local err,len; --объявление переменных - флаг ошибки

--и количество принятых элементов

local n=0; --количество попыток запроса

--запрос к устройству в цикле

repeat

В коде мне требуется поменять в строке send[1] = "#"; решетку на @.
В send[3]="\r"; меняю \r на 02h ( так как в протоколе устройства 3-им в запросе идет команда)
Добавляю send[4]="..."; Что в него прописывать я не понимаю...
Добавляю send[5]="*"; так как <*> - (ASCII – 2Ah)- стоповый байт кадра.

Следовательно маска у меня должна получиться такой:
local sendmask={"string","string","string","string","string"};

В правильном ли направлении я двигаюсь?

Архив на Я.диске https://yadi.sk/d/SUtApWG7bfrxn

SCADAMaster
26.09.2014, 15:12
Во-первых вопрос: куда мне прописывать скрипт? В Устройство? или Тег?
Это зависит от архитектуры. Если вы например опрашиваете одно значение (для одного тега), то лучше размещать скрипт в теге. Если один запрос опрашивает за раз несколько значений, то тогда лучше у устройства или подустройства.


В коде мне требуется поменять в строке send[1] = "#"; решетку на @.
Да


В send[3]="\r"; меняю \r на 02h ( так как в протоколе устройства 3-им в запросе идет команда)
Только просто "02".


Добавляю send[4]="..."; Что в него прописывать я не понимаю...
Добавляю send[5]="*"; так как <*> - (ASCII – 2Ah)- стоповый байт кадра.
Вот здесь проблема.
Обычно при работе с DCON конец кадра сигнализирует символ "перевод каретки" (\r). У вас же - звездочка.
У нас при работе функции SendAndReceiveDataByMask, при подсчете контрольной суммы DCON в обязательном порядке должен быть символ перевода каретки. Поэтому в вашем случае автоматический подсчет контрольной суммы не подойдет.
Вам придется сделать подсчет контрольной суммы вручную (сделайте отдельную функцию и вызывайте - посмотрите пример Rnet в документации)
Вот здесь описано как считать контрольную сумму у DCON (страница 10):
http://www.ssau.ru/files/resources/sotrudniki/grafkin_a_v.pdf
Поищите - может быть найдете готовый код на другом языке (перевести на Lua будет не сложно).