Автор |
Сообщение |
Сообщение создано: 05. 08. 2010 [17:24]
|
andrelek
Андрей Полевой
Создатель темы
Зарегистрирован(а) с: 13.12.2008
Сообщения: 210
|
Здравствуйте! Не удается получить 20 байтный ответ через ком-порт, приходит не полный ответ, опрашиваю из функции через пользовательский протокол.
Получаю его только на странице настройки исходящего транспорта вкладка "Запрос" если установить галочку "Ожидать тайм аут", но если галочку убрать то приходит не полный ответ.
Подскажите в чем может быть проблема?
|
Сообщение создано: 05. 08. 2010 [19:39]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
Если Вы ожидаете ответа по теме, а не наставлений о том как нужно задавать вопросы, то указывать конкретный код и функцию нужно!
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 06. 08. 2010 [09:09]
|
andrelek
Андрей Полевой
Создатель темы
Зарегистрирован(а) с: 13.12.2008
Сообщения: 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
Подскажите где я что не правильно делаю, как получить полный ответ в функцию?
Честно говоря не знаю как смайлики отключить....
[Сообщение редактировалось 1 раз(а), в последний раз 06.08.2010 в 09:17.]
Вложенный файл
norma.png (Тип файла: image/png, Размер: 86.8 килобайт) — 1999 загрузок
not_norma.png (Тип файла: image/png, Размер: 84.26 килобайт) — 2016 загрузок
|
Сообщение создано: 06. 08. 2010 [13:12]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 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.
|
Сообщение создано: 06. 08. 2010 [17:26]
|
andrelek
Андрей Полевой
Создатель темы
Зарегистрирован(а) с: 13.12.2008
Сообщения: 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() но там остается отсылаемый запрос
Укажите пожалуйста где я ошибаюсь, или вышлите пример скрипта,
|
Сообщение создано: 06. 08. 2010 [21:13]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
Я вроде ясно сказал - форум читайте внимательно!
Это Вам не коммерческая техническая поддержка (ТП), где Вам обязаны отвечать на вопросы любого уровня и многократно.
И даже для ТП я мог-бы на подобные вопросы не реагировать в течении трёх дней.
Кроме того, этот раздел обсуждения для сообщения об ошибках, а это не ошибка!
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 07. 08. 2010 [12:11]
|
andrelek
Андрей Полевой
Создатель темы
Зарегистрирован(а) с: 13.12.2008
Сообщения: 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" );
[Сообщение редактировалось 2 раз(а), в последний раз 09.08.2010 в 12:03.]
|