EnglishУкраїнськаmRussian
Login/New
Topic with no new replies

Можно ли вызывать пользовательские функции из скрипта пользовательского протокола входящих запросов.


Author Message
Written on: 18. 09. 2011 [11:07]
dmpetrov
Дмитрий Петров
Topic creator
registered since: 15.09.2011
Posts: 4
Добрый день. Пытаюсь реализовать пассивный механизм сбора данных через фичу "Пользовательский протокол".

Предполагается следующая последовательность операций:
1. Клиент посылает OpenSCADA данные на определенный порт
2. Запрос попадает на транспорт, затем в реализацию пользовательского протокола
3. Пользовательский протокол обрабатывает данные, сохраняет в системе, шлет ответ клиенту.

Транспорт завелся с полпинка, реализация пользовательского протокола тоже вызывается.

При написании реализации пользовательского протокола входящих запросов столкнулся со следующими проблемами:

1. Объект DAQ не определен в функции-реализации протокола входящих запросов. То есть, писать DAQ.(...) нельзя, можно только SYS.DAQ.(...)

2. Не получается вызывать пользовательскую функцию из функции-реализации протокола входящих запросов: вызов SYS.DAQ.JavaLikeCalc.lib_<имя либы>.<имя функции>(<параметры>) всегда возвращает нуль, а сама функция не вызывается. При этом объект SYS.DAQ.JavaLikeCalc.lib_<имя либы>.<имя функции> является объектом TCntrNodeObj.

3. Проверка следующего кода завершается с ошибкой:
func1 = SYS.DAQ.lib_lib1["setValue1"];
func1(Value1);
Ошибка: недопустимый символ '(', ожидается ';'

Подскажите пожалуйста где может быть косяк.
Спасибо!
Written on: 18. 09. 2011 [17:21]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"dmpetrov" wrote:

3. Проверка следующего кода завершается с ошибкой:
func1 = SYS.DAQ.lib_lib1["setValue1"];
func1(Value1);
Ошибка: недопустимый символ '(', ожидается ';'

Подскажите пожалуйста где может быть косяк.
Спасибо!

Прочитайте внимательнее документацию. Где-то рядом такой вопрос уже был: http://oscada.org/ru/forum/posts/proekt/rabota_so_strokami
Цитата из документации:
JAVASCRIPT
Для адресации к функциям этой библиотеки можно использовать
статический адрес вызова "DAQ.JavaLikeCalc.lib_doc.{Func}"
или динамический "SYS.DAQ.JavaLikeCalc["lib_doc"]["{Func}"].call()".
Где {Func} — идентификатор функции в библиотеке.


Learn, learn and learn better than work, work and work.
Written on: 21. 09. 2011 [18:33]
dmpetrov
Дмитрий Петров
Topic creator
registered since: 15.09.2011
Posts: 4
Большое спасибо, помогло.
Written on: 05. 09. 2012 [19:18]
legend
Oleg N
registered since: 13.04.2012
Posts: 63
"dmpetrov" wrote:

3. Пользовательский протокол обрабатывает данные, сохраняет в системе, шлет ответ клиенту.


В пользовательском протоколе во входном транспорте ожидаю запроса от прибора. Запрос приходит, но я могу его записать только в архив сообщений, например SYS.messDebug("TEST REQ: ",request).

А каким способом можно сохранить данные в системе, а именно передать в вычислитель на Java Like Calc для дальейшей обработки и сохранения полученных данных в архив?

С ответами на исходящие запросы все понятно - XML Node, а вот во входном транспорте такого способа нету...

[This article was edited 1 times, at last 05.09.2012 at 19:20.]
Written on: 06. 09. 2012 [08:03]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"legend" wrote:

А каким способом можно сохранить данные в системе, а именно передать в вычислитель на Java Like Calc для дальейшей обработки и сохранения полученных данных в архив?

В любой атрибут любого объекта контроллера в системе, включая и объектные атрибуты, которые могут быть и XMLNode.

А так-же любые другие механизмы пользовательского API OpenSCADA: http://wiki.oscada.org/Doc/OpisanieProgrammy#h920-1

Learn, learn and learn better than work, work and work.
Written on: 29. 11. 2017 [13:16]
Vorgehen
Артём Корниевский
registered since: 08.07.2012
Posts: 20
Добрый день всем. И всё таки остаётся не понятным (для меня) как из входящего протокола можно вытащить request в JavaLikeCalc. Для исходящего транспорта всё понятно существует функция messIO. Можно прямо из вычислителя отправлять запросы и обрабатывать всё в вычислителе, 5 лет уже так работает система у нас. А вот как переменную из UserProtocol input строку request забрать в вычислитель. Раз 10 уже прочитал текст документации на UserProtocol для входящих запросов и не могу осознать. Заранее благодарю за помощь.
Опишу коротко задачу.
1. Есть датчик который набор байтов отправляет по ком порту.
2. Создаю входящий транспорт и отправляю всё в UserProtocol
3. необходимо этот набор байтов передать из модуля UserProtocol в контроллер JavaLikeCalc
4. Я издеваюсь над данными как хочу.
с 1. 2. и 4. пунктами всё ясно. А вот как осуществить пункт 3 никак не вкурю.
Written on: 30. 11. 2017 [12:03]
Vorgehen
Артём Корниевский
registered since: 08.07.2012
Posts: 20
Решил проблему. Всё удивляюсь гибкости системы. Спасибо Роман. Набросал на Python3 скрипт name1.
JAVASCRIPT
import io
import time
import serial
 
ser=serial.Serial(port='/dev/ttyS1', baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS,timeout=1)
 
y=ser.read(14)
print(y[0])
print(y[1])
print(y[2])
print(y[3])
print(y[4])
print(y[5])
print(y[6])
print(y[7])
print(y[8])
print(y[9])
print(y[10])
print(y[11])
print(y[12])
print(y[13])


Потом вызвал из JavaLikeCalc при помощи
JAVASCRIPT
Rezult1=SYS.system("python3 /home/name1", false);


p.s. так и не разобрался как из UserProtocol вытащить request в JavaLikeCalc



[This article was edited 2 times, at last 30.11.2017 at 12:42.]
Written on: 30. 11. 2017 [12:42]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"Vorgehen" wrote:

Решил проблему. Всё удивляюсь гибкости системы. Спасибо Роман. Набросал на Python3 скрипт name1.

А если почитаете пользовательское API далее, за описанием функции system(), то найдёте функции записи в атрибуты параметров объектов контроллеров, включая и JavaLikeCalc, в чём однако я из вашего описания смысла не увидел.

P.S. На данный момент для входных пользовательских протоколов я вижу только одно расширение, что сделало-бы его более удобным и унифицируемым, а именно добавить собственный контекст данных с возможностью использования единой процедуры - реализации протокола. Что позволит создавать полноценные библиотеки таких реализаций и возможностью их широкой параметризации под нужные входные-логические адреса, как DCON, ModBus и ссылки на модель данных — как-раз на параметры объектов контроллеров. Это можно делать и сейчас, но через модификацию самой процедуры, т.е. скопировать и прямо там поменять адреса, что отрывает копию от первичной-библиотечной реализации.

Learn, learn and learn better than work, work and work.



6672