УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

Размер строки блока регистров DAQ.ModBus ("R_s:15,20:r")


Автор Сообщение
Сообщение создано: 16. 10. 2013 [15:19]
aleax
Alexey Bondarchuk
Создатель темы
Зарегистрирован(а) с: 27.01.2010
Сообщения: 73
Какие ограничения на размер строки которая формируется в контролере DAQ.ModBus?

В связи с релизом 0.8.0.8 в котором появилась возможность:

"R_s:15,20:r" — получить строку, блок регистров, из регистра 15 и размером 20.


Решил попробовать "упростить" шаблоны для термометрии (~2700 регистров ModBus).

Написал простой тестовый шаблончик:
JAVASCRIPT
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 " реально нигде нет.
Сообщение создано: 16. 10. 2013 [19:51]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"aleax" wrote:

Т.е. максимальный размер 99?
Данные в первых двух случая корректные (в конце строки все регистры действительно ff), а в случае длины строки 100, в регистрах данных "3c 45 56 41 4c 3e " реально нигде нет.

Нет, максимальный 100:
JAVASCRIPT
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.
Сообщение создано: 16. 10. 2013 [20:01]
aleax
Alexey Bondarchuk
Создатель темы
Зарегистрирован(а) с: 27.01.2010
Сообщения: 73
"roman" wrote:

Нет, максимальный 100:


Хм. Тогда почему при указании размера 100, строка на выходе получается длинной 6, и с непонятными данными?

Протестирую еще разок завтра на работе.

P.S.: а почему 100? а можно ли 1000? Сто конечно тоже хорошо 2700/100=27 атрибутов, а хотелось решить все тремя (на самом деле одним, для однотипного набора данных т.е. "массива" =) ).
Сообщение создано: 16. 10. 2013 [22:16]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 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.
Сообщение создано: 16. 10. 2013 [22:56]
aleax
Alexey Bondarchuk
Создатель темы
Зарегистрирован(а) с: 27.01.2010
Сообщения: 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", то при применении данного шаблона для параметра контроллера модбас, переносить данную строку в конфигурацию шаблона. (ну что б вручную не заполнять).

Сейчас обхожусь следующим костылем:
JAVASCRIPT
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;	//Выходим для того что б со следующего запуска уже читались данные из корректных регистров;
}
 
// дальше основной код программы


Сообщение создано: 17. 10. 2013 [18:44]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 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.



12470