Автор |
Повідомлення |
Повідомлення створено: 13. 03. 2010 [21:50]
|
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
|
Согласен, что бинарный пакет лучше разбирать посимвольно, но пока для наглядности пойдёт и то , что есть (хоть каждый байт видно).
После обновления разницы не заметил, но считывание остатков пустой строкой помогло. В си++ на порядок проще решать возникающие проблемы. Рычагов управления поболее, чем в ява.
Следующий код работает корректно:
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 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Повідомлення створено: 14. 03. 2010 [09:22]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
almaz wrote:
После обновления разницы не заметил, но считывание остатков пустой строкой помогло. В си++ на порядок проще решать возникающие проблемы. Рычагов управления поболее, чем в ява.
Данная проблема решается идентично.
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.
|
Повідомлення створено: 14. 03. 2010 [12:01]
|
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
|
UserProtocol интересен. Только как с ним работать? Документации пока нет, в демо тоже ничего...
Может есть какие-нибудь образцы входных и выходных программ?
Непонятно с каким периодом работает протокол. Наверно, по событиям. Тогда как к пользовательскому протоколу попадает входящий поток данных? И как доходит до пользовательских программ, например в блочный вычислитель? С выходным потоком тоже не совсем ясно... Как им воспользоваться из пользовательской программы в DAQ?
В общем, тут много неизвестностей...
Кое-что есть во всплывающих подсказках:
Следующие атрибуты определены для обработки входных запросов:
'rez' - результат обработки (0-полный запрос;1-не полный запрос);
'request' - сообщение запроса;
'answer' - сообщение ответа;
'sender' - отправитель запроса.
Следующие атрибуты определены для обработки выходных запросов:
'io' - XMLNode объект интерфейса входа/выхода;
'tr' - ассоциированный транспорт.
Всё равно информации мало...
Всё-таки нужны образцы входных и выходных программ протокола и образец программы, использующей этот протокол...
[Повідомлення редагувалось 4 раз(ів), останній раз 15.03.2010 в 07:27.]
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Повідомлення створено: 15. 03. 2010 [17:57]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
http://wiki.oscada.org/Doc/UserProtocol
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 15. 03. 2010 [21:21]
|
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 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 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Повідомлення створено: 16. 03. 2010 [10:16]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
almaz wrote:
Частично разобрался. Перекомпиляция программы протокола производится галочкой "Включен". После удаления первого протокола подключается к другому. Всё равно привязывается только к первому созданному протоколу, т.е. к одному.
Вообще-то поле выбора исходящего транспорта именно для этого было! И в документации об этом было написано. Сейчас я эту функцию изменил. Теперь конкретный пользовательский протокол указывается атрибутом "ProtIt".
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 16. 03. 2010 [10:43]
|
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
|
После любых изменений в пользовательском протоколе требуется перезапустить протокол галочкой "Включен". Это нужно для перекомпиляции программ протокола и возможного изменения выходного транспорта.
Насчёт исходящего транспорта я понял. Но это привязывает транспорт к одному единственному протоколу. У меня будет два разных протокола на один транспорт. Эти протоколы на физическом уровне не конфликтуют. Вечером обновлюсь и испытаю новую возможность выбора протокола.
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Повідомлення створено: 16. 03. 2010 [10:45]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
almaz wrote:
После любых изменений в пользовательском протоколе требуется перезапустить протокол галочкой "Включен". Это нужно для перекомпиляции программ протокола и возможного изменения выходного транспорта.
И это правильно!
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 17. 03. 2010 [00:40]
|
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 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 нормально работает. Надо пользоваться. Теперь драйвера оборудования можно делать в ява!
[Повідомлення редагувалось 1 раз(ів), останній раз 17.03.2010 в 06:53.]
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Повідомлення створено: 17. 03. 2010 [14:39]
|
Aleksey
Aleksey Popkov
Contributor
Зареєстрован(а) с: 31.07.2008
Повідомлення: 326
|
almaz wrote:
Закольцевать транспорт удалось, только почему-то выходной транспорт производит однократную посылку и его галочка "Выполняется" отключается!
У меня происходит тоже самое.
Так и должно быть, выходной транспорт активируется когда отдать чего-то нужно, потом падает.
|