Размер строки блока регистров DAQ.ModBus ("R_s:15,20:r")
Author |
Message |
Written on: 16. 10. 2013 [15:19]
|
aleax
Alexey Bondarchuk
Topic creator
registered since: 27.01.2010
Posts: 73
|
Какие ограничения на размер строки которая формируется в контролере DAQ.ModBus?
В связи с релизом 0.8.0.8 в котором появилась возможность:
"R_s:15,20:r" — получить строку, блок регистров, из регистра 15 и размером 20.
Решил попробовать "упростить" шаблоны для термометрии (~2700 регистров ModBus).
Написал простой тестовый шаблончик:
f_frq Частота обсчёта функции (Гц) Вещественный Вход Не атрибут Константа 1000
f_start Флаг запуска функции Логический Вход Не атрибут Константа 0
f_stop Флаг останова функции Логический Вход Не атрибут Константа 0
f_err Ошибка функции Строка Вход Не атрибут Константа 0
str str Строка Вход Только чтение Связь R_s:0,5:r:str:str
using Special.FLibSYS;
SYS.messDebug("modbusDigital2","str.length="+str.length+" strDec4Bin(str)=«\n"+strDec4Bin(str)+"\n»");
Пробую читать:
Конфиг:
R_s:0,10:r:str:str
Результат:
0|modbusDigital2 | str.length=20 strDec4Bin(str)=«
00 f2 01 00 02 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00
»
Конфиг:
R_s:0,99:r:str:str
Результат:
0|modbusDigital2 | str.length=198 strDec4Bin(str)=«
00 f2 01 00 02 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 04 28 0f be
00 02 fa 00 1c 00 fe 28 0f 68 00 02 85 00 1c 00
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff
»
Конфиг:
R_s:0,100:r:str:str
Результат:
0|modbusDigital2 | str.length=6 strDec4Bin(str)=«
3c 45 56 41 4c 3e
»
Т.е. максимальный размер 99?
Данные в первых двух случая корректные (в конце строки все регистры действительно ff), а в случае длины строки 100, в регистрах данных "3c 45 56 41 4c 3e " реально нигде нет.
|
Written on: 16. 10. 2013 [19:51]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"aleax" wrote:
Т.е. максимальный размер 99?
Данные в первых двух случая корректные (в конце строки все регистры действительно ff), а в случае длины строки 100, в регистрах данных "3c 45 56 41 4c 3e " реально нигде нет.
Нет, максимальный 100:
int rN = vmax(0,vmin(100,strtol(TSYS::strParse(ai,1,",").c_str(), NULL, 0)));
Learn, learn and learn better than work, work and work.
|
Written on: 16. 10. 2013 [20:01]
|
aleax
Alexey Bondarchuk
Topic creator
registered since: 27.01.2010
Posts: 73
|
"roman" wrote:
Нет, максимальный 100:
Хм. Тогда почему при указании размера 100, строка на выходе получается длинной 6, и с непонятными данными?
Протестирую еще разок завтра на работе.
P.S.: а почему 100? а можно ли 1000? Сто конечно тоже хорошо 2700/100=27 атрибутов, а хотелось решить все тремя (на самом деле одним, для однотипного набора данных т.е. "массива" =) ).
|
Written on: 16. 10. 2013 [22:16]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"aleax" wrote:
"roman" wrote:
Нет, максимальный 100:
Хм. Тогда почему при указании размера 100, строка на выходе получается длинной 6, и с непонятными данными?
Протестирую еще разок завтра на работе.
У меня всё нормально:
Запит -> c7 8d 00 00 00 06 01 03 00 00 00 63
Відпов. -> c7 8d 00 00 00 c9 01 03 c6 03 e8 00 2e 00 00 00
0a 60 fa 00 00 00 00 00 00 00 00 00 00 31 30 33
32 35 34 37 36 39 38 31 30 33 32 35 34 37 36 39
38 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Запит -> c5 18 00 00 00 06 01 03 00 63 00 0b
Відпов. -> c5 18 00 00 00 19 01 03 16 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Тут нужно учитывать, что размер запроса лимитирован, по умолчанию в 200 байт (100 регистров), и строка может попадать на два запроса, как выше.
"aleax" wrote:
P.S.: а почему 100? а можно ли 1000? Сто конечно тоже хорошо 2700/100=27 атрибутов, а хотелось решить все тремя (на самом деле одним, для однотипного набора данных т.е. "массива" =) ).
Опять-же под типовой размер PDU = 200 байт (100 регистров). Хотя можно и 1000, но на плохих каналах выпадание одного запроса из десяти приведёт к строке EVAL.
Learn, learn and learn better than work, work and work.
|
Written on: 16. 10. 2013 [22:56]
|
aleax
Alexey Bondarchuk
Topic creator
registered since: 27.01.2010
Posts: 73
|
"roman" wrote:
У меня всё нормально:
Тут нужно учитывать, что размер запроса лимитирован, по умолчанию в 200 байт (100 регистров), и строка может попадать на два запроса, как выше.
Завтра потестирую у себя внимательнее.
"roman" wrote:
Опять-же под типовой размер PDU = 200 байт (100 регистров). Хотя можно и 1000, но на плохих каналах выпадание одного запроса из десяти приведёт к строке EVAL.
А этого я не учел. Тогда все нормально, лучше меньшую строку, чем один большой EVAL).
Тут у меня есть еще такая хотелка (сам пробовал разобраться во внутренностях src/moduls/daq/ModBus/modbus_daq.cpp, но пока не разобрался где вклинится).
Если в шаблоне, для элемента io, с установленной конфигурацией "связь", поле "значение" заполнено чем-то вида "R_s:0,5:r:str:str" или "MB:R_s:0,5:r:str:str", то при применении данного шаблона для параметра контроллера модбас, переносить данную строку в конфигурацию шаблона. (ну что б вручную не заполнять).
Сейчас обхожусь следующим костылем:
using Special.FLibSYS;
using DAQ.JavaLikeCalc.lib_libSDKT;
path=this.nodePath();
ctrl_path=path.replace(new RegExp("/prm_.+/$"), "/");
//Получаем адрес устройства из контроллера;
req = xmlNode("get").setAttr("path",ctrl_path+"%2fcntr%2fcfg%2fNODE");
xmlCntrReq(req);
m=req.text().toInt();
if(f_start)
{
ID=EVAL_INT;
//Начальная подготовка ModBus шаблона
reg_cnt=0;
//установка адресса ID, io=2, mb_reg=0
req = xmlNode("set").setAttr("path",path+"%2fcfg%2fprm%2fel_2").setText("R:"+reg_cnt+":r");
rez = xmlCntrReq(req);
reg_cnt++;
//установка адресса measTimeToMB, io=2563, mb_reg=1
req = xmlNode("set").setAttr("path",path+"%2fcfg%2fprm%2fel_2563").setText("R:"+reg_cnt+":rw");
rez = xmlCntrReq(req);
reg_cnt++;
//установка адресов podSensorsQuantReg[1-12], io=2581..2592, mb_reg=2..13
for( i = 2581; i<=2592; i++)
{
req = xmlNode("set").setAttr("path",path+"%2fcfg%2fprm%2fel_"+i).setText("R:"+reg_cnt+":r");
rez = xmlCntrReq(req);
reg_cnt++;
}
//установка адресов in[1-512](Id[1-4]|temp), io=3..2562, mb_reg=14..2573
for( i = 3; i<=2562; i++)
{
req = xmlNode("set").setAttr("path",path+"%2fcfg%2fprm%2fel_"+i).setText("R:"+reg_cnt+":r");
rez = xmlCntrReq(req);
reg_cnt++;
}
//сбрасываем флаг памяти кода ошибки
f_tmp_err=0;
return; //Выходим для того что б со следующего запуска уже читались данные из корректных регистров;
}
// дальше основной код программы
|
Written on: 17. 10. 2013 [18:44]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"aleax" wrote:
Тут у меня есть еще такая хотелка (сам пробовал разобраться во внутренностях src/moduls/daq/ModBus/modbus_daq.cpp, но пока не разобрался где вклинится).
Если в шаблоне, для элемента io, с установленной конфигурацией "связь", поле "значение" заполнено чем-то вида "R_s:0,5:r:str:str" или "MB:R_s:0,5:r:str:str", то при применении данного шаблона для параметра контроллера модбас, переносить данную строку в конфигурацию шаблона. (ну что б вручную не заполнять).
А смысл?
В таком виде в ручную он будет заполняться или в шаблоне или уже при конфигурации шаблона.
А если и скопируется с шаблона то повторяемость на одном экземпляре и закончится.
Я так в шаблоне для ModBus ничего и не прописываю.
Learn, learn and learn better than work, work and work.
|
|
|