Author |
Message |
Written on: 05. 08. 2010 [17:24]
|
andrelek
Андрей Полевой
Topic creator
registered since: 13.12.2008
Posts: 210
|
Здравствуйте! Не удается получить 20 байтный ответ через ком-порт, приходит не полный ответ, опрашиваю из функции через пользовательский протокол.
Получаю его только на странице настройки исходящего транспорта вкладка "Запрос" если установить галочку "Ожидать тайм аут", но если галочку убрать то приходит не полный ответ.
Подскажите в чем может быть проблема?
|
Written on: 05. 08. 2010 [19:39]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
Если Вы ожидаете ответа по теме, а не наставлений о том как нужно задавать вопросы, то указывать конкретный код и функцию нужно!
Learn, learn and learn better than work, work and work.
|
Written on: 06. 08. 2010 [09:09]
|
andrelek
Андрей Полевой
Topic creator
registered since: 13.12.2008
Posts: 210
|
Вот скрипт функции с помощью которой делаю запрос, это протокол ModBus на получение 15регистров, имею на столе такое устройство, реально пишу протокол для нестандартного устройства где ответ будет равен 25 байтам.
using Special.FLibSYS;
using sub_DAQ.mod_JavaLikeCalc;
ques="01 03 0b be 00 0f 67 ce";
req = SYS.XMLNode("myprot"
req.setAttr("ProtIt","test".setText(Special.FLibSYS.strEnc2Bin(ques));
SYS.Transport.Serial.out_testModBus.messIO(req,"UserProtocol"
status = req.attr("status"
rez=req.attr("result"
Вот выходной скрипт пользовательского протокола test
using Special.FLibSYS;
req=strDec4Bin(io.text());
rez=strDec4Bin(tr.messIO(io.text(),3000)); //здесь таймаут ожидания пробовал менять разный, и вообще не указывать также
SYS.messDebug("us_prot_test:req",req);
SYS.messDebug("us_prot_test:rez",rez);
io.setAttr( "status", (rez!="" ? "online" : "offline" );
io.setAttr("result", rez);
SYS.messDebug("us_prot_test:io",io.save( 0x08 ));
Это получаю если исполняю функцию (вкладка исполнить)
1|/WorkSt/sub_UI/mod_QTCfg/ | root| Нажат </WorkSt/sub_DAQ/mod_JavaLikeCalc/lib_sql/fnc_myprot/%2fexec%2fcalc>!
0|us_prot_test:req | 01 03 0b be 00 0f 67 ce
0|us_prot_test:rez | 01 03 1e 42 55 c5 eb bf
0|us_prot_test:io | <myprot ProtIt="test" result="01 03 1e 42 55 c5 eb bf " status="online">
�
Вот настройки выходного транспорта
/dev/ttyS0:19200:8E1 тайминги пробовал от такого 586:5.73 до такого 3000:500
Вот что получаю с помощью выходного траспорта (вкладка запрос):
1.Получаю полный ответ (смотрю по количеству запрошенных байтов) когда галка "Ожидать таймаут" установлена принтскрин в файле norma.png
2.Получаю неполный ответ если галку убираю, такая же ситуация и при запросе из функции, файл not_norma.png
Подскажите где я что не правильно делаю, как получить полный ответ в функцию?
Честно говоря не знаю как смайлики отключить....
[This article was edited 1 times, at last 06.08.2010 at 09:17.]
Attachment
norma.png (File type: image/png, Size: 86.8 kilobytes) — 1999 downloads
not_norma.png (File type: image/png, Size: 84.26 kilobytes) — 2016 downloads
|
Written on: 06. 08. 2010 [13:12]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"andrelek" wrote:
using Special.FLibSYS;
using sub_DAQ.mod_JavaLikeCalc;
ques="01 03 0b be 00 0f 67 ce";
req = SYS.XMLNode("myprot" );
req.setAttr("ProtIt","test" ).setText(Special.FLibSYS.strEnc2Bin(ques) );
SYS.Transport.Serial.out_testModBus.messIO(req,"UserProtocol" );
status = req.attr("status" );
rez=req.attr("result" );
Это не ошибка, а не понимание Вами назначения того, что используете.
Вызов не корректен. Форум по прежнему не читаем.
Learn, learn and learn better than work, work and work.
|
Written on: 06. 08. 2010 [17:26]
|
andrelek
Андрей Полевой
Topic creator
registered since: 13.12.2008
Posts: 210
|
using Special.FLibSYS;
//эта строка в этом скрипте на данный момент не нужна
using sub_DAQ.mod_JavaLikeCalc;
//непосредственно запрос
ques="01 03 0b be 00 0f 67 ce";
//создание xml узла, какое название не имеет значения, как я понял из экспериментов
req = SYS.XMLNode("myprot" );
//идентификация пользовательского протокола, и установка самого запроса в бинарном виде
req.setAttr("ProtIt","test" ).setText(Special.FLibSYS.strEnc2Bin(ques) );
//отправка запроса в транспорт через пользовательский протокол
SYS.Transport.Serial.out_testModBus.messIO(req,"UserProtocol" );
// получение статуса, атрибут добавляется в узел в пользовательском протоколе
status = req.attr("status" );
//получение ответа,атрибут также добавляется в протоколе,
rez=req.attr("result" );
предполагал что ответ помещается в req.text() но там остается отсылаемый запрос
Укажите пожалуйста где я ошибаюсь, или вышлите пример скрипта,
|
Written on: 06. 08. 2010 [21:13]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
Я вроде ясно сказал - форум читайте внимательно!
Это Вам не коммерческая техническая поддержка (ТП), где Вам обязаны отвечать на вопросы любого уровня и многократно.
И даже для ТП я мог-бы на подобные вопросы не реагировать в течении трёх дней.
Кроме того, этот раздел обсуждения для сообщения об ошибках, а это не ошибка!
Learn, learn and learn better than work, work and work.
|
Written on: 07. 08. 2010 [12:11]
|
andrelek
Андрей Полевой
Topic creator
registered since: 13.12.2008
Posts: 210
|
Я понял. Большое спасибо!
Разобрался все работает. Не хватало "дожидания" полного ответа, описано здесь http://oscada.org/ru/forum/posts//opros_ustroistv_po_sobytiju//1/
Кстати в демо-проэкте в скрипте UserProtocol --> test (обновляюсь с "svn co ....." Checked out revision 1119) , если конечно уже не исправлено
//вот в этой строке полученные данные декодируются из бинарного вида
rez=Special.FLibSYS.strDec4Bin(tr.messIO(io.text()));
while(true)
{
//а здесь не декодируются, хотя потом добавляются к декодированным
trez = tr.messIO(""
if( !trez.length ) break;
rez+=trez;
}
io.setAttr( "status", (rez==io.text()) ? "online" : "offline" );
[This article was edited 2 times, at last 09.08.2010 at 12:03.]
|