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

Опрос устройств по событию


Author Message
Written on: 13. 03. 2010 [21:50]
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
Согласен, что бинарный пакет лучше разбирать посимвольно, но пока для наглядности пойдёт и то , что есть (хоть каждый байт видно).
После обновления разницы не заметил, но считывание остатков пустой строкой помогло. В си++ на порядок проще решать возникающие проблемы. Рычагов управления поболее, чем в ява. icon_biggrin.gif

Следующий код работает корректно:
str=Special.FLibSYS.strDec4Bin(SYS.Transport.Serial.out_ttyUSB0.messIO(Special.FLibSYS.strEnc2Bin("4B 00 37 40"),0.2));
str=str+Special.FLibSYS.strDec4Bin(SYS.Transport.Serial.out_ttyUSB0.messIO("",0.2));

Или так:
str=Special.FLibSYS.strDec4Bin(SYS.Transport.Serial.out_ttyUSB0.messIO(Special.FLibSYS.strEnc2Bin("4B 00 37 40"),0.2))+Special.FLibSYS.strDec4Bin(SYS.Transport.Serial.out_ttyUSB0.messIO("",0.2));

Теперь можно драйвера всяких малораспространённых железок писать на яве. Чтоб не загромождать DAQ.
Спасибо за подсказку!!!

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 14. 03. 2010 [09:22]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
almaz wrote:

После обновления разницы не заметил, но считывание остатков пустой строкой помогло. В си++ на порядок проще решать возникающие проблемы. Рычагов управления поболее, чем в ява. icon_biggrin.gif

Данная проблема решается идентично.

almaz wrote:

Следующий код работает корректно:
str=Special.FLibSYS.strDec4Bin(SYS.Transport.Serial.out_ttyUSB0.messIO(Special.FLibSYS.strEnc2Bin("4B 00 37 40"),0.2));
str=str+Special.FLibSYS.strDec4Bin(SYS.Transport.Serial.out_ttyUSB0.messIO("",0.2));

Может и работает в вашей ситуации, но опять же это полумера. А если кусков будет три?
Правильно так, если не знаете ожидаемого размера ответа:
rez=SYS.Transport.Serial.out_ttyUSB0.messIO(Special.FLibSYS.strEnc2Bin("4B 00 37 40"),0.2);
while(true)
{
trez = SYS.Transport.Serial.out_ttyUSB0.messIO("");
if( !trez.length ) break;
rez+=trez;
}

almaz wrote:

Теперь можно драйвера всяких малораспространённых железок писать на яве. Чтоб не загромождать DAQ.

Теперь это всё можно делать прямо в модуле протокола, создавая отдельные пользовательские протоколы для разных устройств, включая и обработку входящих запросов для серверов, с помощью модуля Protocol.UserProtocol.


Learn, learn and learn better than work, work and work.
Written on: 14. 03. 2010 [12:01]
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
UserProtocol интересен. Только как с ним работать? Документации пока нет, в демо тоже ничего...
Может есть какие-нибудь образцы входных и выходных программ?
Непонятно с каким периодом работает протокол. Наверно, по событиям. Тогда как к пользовательскому протоколу попадает входящий поток данных? И как доходит до пользовательских программ, например в блочный вычислитель? С выходным потоком тоже не совсем ясно... Как им воспользоваться из пользовательской программы в DAQ?
В общем, тут много неизвестностей...

Кое-что есть во всплывающих подсказках:

Следующие атрибуты определены для обработки входных запросов:
'rez' - результат обработки (0-полный запрос;1-не полный запрос);
'request' - сообщение запроса;
'answer' - сообщение ответа;
'sender' - отправитель запроса.

Следующие атрибуты определены для обработки выходных запросов:
'io' - XMLNode объект интерфейса входа/выхода;
'tr' - ассоциированный транспорт.

Всё равно информации мало...
Всё-таки нужны образцы входных и выходных программ протокола и образец программы, использующей этот протокол...

[This article was edited 4 times, at last 15.03.2010 at 07:27.]

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 15. 03. 2010 [17:57]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
http://wiki.oscada.org/Doc/UserProtocol

Learn, learn and learn better than work, work and work.
Written on: 15. 03. 2010 [21:21]
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
Спасибо!!! Изучаю. Вроде механизм понятен. Пробую использовать на практике.

Создал пользовательский протокол prt. Заработал следующий код вызова этого протокола:
req = SYS.XMLNode("test");
req.setText("4b 00 37 40 ");
SYS.Transport.Serial.out_ttyUSB0.messIO(req,"UserProtocol");
str=req.attr("status");

Код выходного протокола:
rez=Special.FLibSYS.strDec4Bin(tr.messIO(Special.FLibSYS.strEnc2Bin(io.text()),0.2));
while(true)
{
trez = tr.messIO("");
if( !trez.length ) break;
rez+=Special.FLibSYS.strDec4Bin(trez);
}
if (rez==io.text()) io.setAttr("status","online"); else io.setAttr("status","offline");

В целом механизм понятен.

А если имеется несколько пользовательских протоколов как указать какому из них конкретно передавать объект?
В данный момент включено два одинаковых протокола с разными id. Что бы не делал объект попадает только в первый созданный протокол. Во второй ну никак не хочет попадать, даже при отключении первого.

Частично разобрался. Перекомпиляция программы протокола производится галочкой "Включен". После удаления первого протокола подключается к другому. Всё равно привязывается только к первому созданному протоколу, т.е. к одному.

Как же быть с несколькими пользовательскими протоколами?

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 16. 03. 2010 [10:16]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
almaz wrote:

Частично разобрался. Перекомпиляция программы протокола производится галочкой "Включен". После удаления первого протокола подключается к другому. Всё равно привязывается только к первому созданному протоколу, т.е. к одному.

Вообще-то поле выбора исходящего транспорта именно для этого было! И в документации об этом было написано. Сейчас я эту функцию изменил. Теперь конкретный пользовательский протокол указывается атрибутом "ProtIt".

Learn, learn and learn better than work, work and work.
Written on: 16. 03. 2010 [10:43]
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
После любых изменений в пользовательском протоколе требуется перезапустить протокол галочкой "Включен". Это нужно для перекомпиляции программ протокола и возможного изменения выходного транспорта.

Насчёт исходящего транспорта я понял. Но это привязывает транспорт к одному единственному протоколу. У меня будет два разных протокола на один транспорт. Эти протоколы на физическом уровне не конфликтуют. Вечером обновлюсь и испытаю новую возможность выбора протокола.

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 16. 03. 2010 [10:45]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
almaz wrote:

После любых изменений в пользовательском протоколе требуется перезапустить протокол галочкой "Включен". Это нужно для перекомпиляции программ протокола и возможного изменения выходного транспорта.

И это правильно!

Learn, learn and learn better than work, work and work.
Written on: 17. 03. 2010 [00:40]
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
Конечно правильно! Только об этом надо знать. Сейчас работает автоотключение галочки при изменениях. Так лучше! Вначале не сразу приходит понимание, что есть необходимость перепуска.
Исчезло поле указания выходного транспорта в выходном протоколе и это правильно. Транспорт указывается уже при вызове в программе пользователя.

Выбор пользовательского протокола атрибутом "ProtIt" нормально работает.

Идём дальше. Создал два транспорта-сокета с целью замкнуть выходной на входной:
Входной транспорт testUserPrtIn (TCP:localhost:10100:1 UserProtocol.prt)
Выходной транспорт testUserPrtOut (TCP:localhost:10100)
Закольцевать транспорт удалось, только почему-то выходной транспорт производит однократную посылку и его галочка "Выполняется" отключается!

Программа пользователя в DAQ:
req = SYS.XMLNode("test");
req.setText("TEST Self");
req.setAttr("ProtIt","prt");
SYS.Transport.Sockets.out_testUserPrtOut.messIO(req,"UserProtocol");
str=req.attr("status");

Выходная программа протокола prt:
rez=tr.messIO(io.text());
while(true)
{
trez = tr.messIO("");
if( !trez.length ) break;
rez+=trez;
}
io.setAttr("status",(rez==io.text()) ? "online" : "offline");

Входная программа протокола prt:
if (request=="TEST Self") rez=0; else rez=1;
if (!rez) answer=request;
return 0;

return 0 уже, наверно, не нужно. Протокол по умолчанию возвращает rez?

В целом UserProtocol нормально работает. Надо пользоваться. Теперь драйвера оборудования можно делать в ява!

[This article was edited 1 times, at last 17.03.2010 at 06:53.]

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 17. 03. 2010 [14:39]
Aleksey
Aleksey Popkov
Contributor
registered since: 31.07.2008
Posts: 326
almaz wrote:

Закольцевать транспорт удалось, только почему-то выходной транспорт производит однократную посылку и его галочка "Выполняется" отключается!


У меня происходит тоже самое.
Так и должно быть, выходной транспорт активируется когда отдать чего-то нужно, потом падает.



7716