EnglishУкраїнськаmRussian
Login/New
Topic with many replies

Вопрос о ModBus


Author Message
Written on: 29. 12. 2011 [17:32]
yozhik
Алексей Николаев
registered since: 29.11.2010
Posts: 127
"roman" wrote:

Функция messIO() ничего не разбивает и вообще не работает с запросом в текстовом представлении.

Согласен, что вопрос задал некорректно. В итоге на выходе кода подобного следующему
JAVASCRIPT
req = SYS.XMLNode("TCP");
 req.setAttr("id","test").setAttr("reqTm",1).setAttr("node",1).setAttr("reqTry",2).setText(Special.FLibSYS.strEnc2Bin("03 00 00 00 05"));
 SYS.Transport.Sockets.out_testModBus.messIO(req,"ModBus");
 test = Special.FLibSYS.strDec4Bin(req.text());

получаем в test строки по 16 байт в каждой. Я вот это имел ввиду. Значит это strDec4Bin разбивает текст на строки. Насколько это оправдано?
Written on: 29. 12. 2011 [17:42]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"yozhik" wrote:

JAVASCRIPT
req = SYS.XMLNode("TCP");
 req.setAttr("id","test").setAttr("reqTm",1).setAttr("node",1).setAttr("reqTry",2).setText(Special.FLibSYS.strEnc2Bin("03 00 00 00 05"));
 SYS.Transport.Sockets.out_testModBus.messIO(req,"ModBus");
 test = Special.FLibSYS.strDec4Bin(req.text());

получаем в test строки по 16 байт в каждой. Я вот это имел ввиду. Значит это strDec4Bin разбивает текст на строки. Насколько это оправдано?

Ну дык, не используем Special.FLibSYS.strDec4Bin() и не получаем: http://wiki.oscada.org/Doc/FLibSYS#h378-30.

Learn, learn and learn better than work, work and work.
Written on: 30. 12. 2011 [06:42]
yozhik
Алексей Николаев
registered since: 29.11.2010
Posts: 127
"roman" wrote:

Ну дык, не используем Special.FLibSYS.strDec4Bin() и не получаем

Точно. Все гениальное просто :)
Written on: 18. 01. 2012 [09:14]
andrey-sw
Андрей Сычев
Topic creator
registered since: 10.12.2008
Posts: 32
Такая ситуация есть несколько ТРМ138(5шт) и ТРМ212(4шт) опрашиваю через шлюз ModbusTCP ADAM-4572 каждые 1-2сек, скорость 9600b. Настроил все стандартно через модуль ModBus. C ТРМ138 Опрашивается 8 каналов по 3 регистра на каждый, в результате улетают звпрросы вида

Wed Jan 18 05:19:12 2012 TCP: 'BOX2_A5_TRM138' --> 16(Sockets.BOX2_ADAM)
Запрос -> 15 01 00 00 00 06 10 04 00 00 00 25
Ответ -> 15 01 00 00 00 4d 10 04 4a 00 01 fd 90 00 00 c2
79 b0 a7 00 01 ff c2 00 00 c0 c7 c5 5f 00 01 ff
c2 00 00 c0 c8 26 7f 00 01 ff c2 00 00 c0 c7 ec
39 00 01 ff c2 00 00 c0 c8 39 eb 00 01 ff c2 00
00 c0 c8 26 7f 00 01 ff c2 00 00 c0 c7 c5 5f 00
01 ff c2

По отдельности все работает без сбоев, но стоит запустить опрос сразу 2-х и более устройств, сразу начинаются проблемы. Первое устройство опрашивается нормально, все остальные в лучшем случае через раз. Игры с таймаутами и увиличением периода опроса ни к чему не приводят.
Written on: 18. 01. 2012 [09:34]
andrey-sw
Андрей Сычев
Topic creator
registered since: 10.12.2008
Posts: 32
Решил сделать по другому, создал контролер контроллер ввычиcлитkе на java с функцией
JAVASCRIPT
using Special.FLibSYS;
n=(f_start || n>=10)?1:n+1;
reqTm=500;
if (n==1)
{
req = SYS.XMLNode("TCP");
req.setAttr("id","BOX2_ADAM_TCP").setAttr("reqTm",reqTm).setAttr("node",16).setAttr("reqTry",2).setText(strEnc2Bin("04 00 00 00 25"));
SYS.Transport.Sockets.out_BOX2_ADAM.messIO(req,"ModBus");
res = strDec4Bin(req.text()).match("[0-9a-fA-F][0-9a-fA-F]","g"); 
ans1=res;
 
BOX2_A5_TRM138_CH1_dot=SYS.DAQ.JavaLikeCalc.lib_UsrLib.Reg2Int(res[2],res[3]);
BOX2_A5_TRM138_CH1_val=SYS.DAQ.JavaLikeCalc.lib_UsrLib.Reg2Int(res[4],res[5]);
BOX2_A5_TRM138_CH1_err=SYS.DAQ.JavaLikeCalc.lib_UsrLib.Reg2Int(res[6],res[7]);
 
BOX2_A5_TRM138_CH2_dot=SYS.DAQ.JavaLikeCalc.lib_UsrLib.Reg2Int(res[12],res[13]);
BOX2_A5_TRM138_CH2_val=SYS.DAQ.JavaLikeCalc.lib_UsrLib.Reg2Int(res[14],res[15]);
BOX2_A5_TRM138_CH2_err=SYS.DAQ.JavaLikeCalc.lib_UsrLib.Reg2Int(res[16].res[17]);
...
 
} else
if (n==2)
{
req = SYS.XMLNode("TCP");
req.setAttr("id","BOX2_ADAM_TCP").setAttr("reqTm",reqTm).setAttr("node",24).setAttr("reqTry",2).setText(Special.FLibSYS.strEnc2Bin("04 00 00 00 25"));
SYS.Transport.Sockets.out_BOX2_ADAM.messIO(req,"ModBus");
res = Special.FLibSYS.strDec4Bin(req.text()); 
ans2=res.match("[0-9a-fA-F][0-9a-fA-F]","g");
}


Период вычислений 0.2сек, среднее время запроса 150-170мсек, тоесть между запросами появилась пауза 30-50мсек и сразу все нормализовалось и работает без сбоев. Но приходится жестко в функции пробивать более 120 переменных, и теряется гибкость конфигурирования что конечно же неудобно как минимум.
Проведя анализ подручными средствами получается следующее. Если Запросы летят без пауз то либо ADAM либо ТРМ начинает сбоить.
Еще замечено спомощю анализатора трафика, что в пакете запроса Id транзакции всегда один и тотже, обычно так и делают но взможно в данном случае из за этого у адама крыше едет?
Ну и разумеется хотелки - как бы сделать эту самую задержку между запросами. Например в модуле Modbus добавить параметр с этой задержкой чтобы контролеры опрашивались не просто подряд с определенным периодом а еще и со сдвигом по времени. Или например в чтоб запросы передавались на сокет не чаще чем каждые скажем 100мсек.
Written on: 18. 01. 2012 [09:51]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"andrey-sw" wrote:

Такая ситуация есть несколько ТРМ138(5шт) и ТРМ212(4шт) опрашиваю через шлюз ModbusTCP ADAM-4572 каждые 1-2сек, скорость 9600b. Настроил все стандартно через модуль ModBus. C ТРМ138 Опрашивается 8 каналов по 3 регистра на каждый, в результате улетают звпрросы вида

Wed Jan 18 05:19:12 2012 TCP: 'BOX2_A5_TRM138' --> 16(Sockets.BOX2_ADAM)
Запрос -> 15 01 00 00 00 06 10 04 00 00 00 25
Ответ -> 15 01 00 00 00 4d 10 04 4a 00 01 fd 90 00 00 c2
79 b0 a7 00 01 ff c2 00 00 c0 c7 c5 5f 00 01 ff
c2 00 00 c0 c8 26 7f 00 01 ff c2 00 00 c0 c7 ec
39 00 01 ff c2 00 00 c0 c8 39 eb 00 01 ff c2 00
00 c0 c8 26 7f 00 01 ff c2 00 00 c0 c7 c5 5f 00
01 ff c2


Запрос/ответ корректен

"andrey-sw" wrote:

По отдельности все работает без сбоев, но стоит запустить опрос сразу 2-х и более устройств, сразу начинаются проблемы. Первое устройство опрашивается нормально, все остальные в лучшем случае через раз. Игры с таймаутами и увиличением периода опроса ни к чему не приводят.

Это проблема не OpenSCADA, а ModBus шлюза и скорее не вопрос таймаутов сокетов в OpenSCADA, а вопрос таймаутов последовательного интерфейса в шлюзе, хотя если речь зашла о таймаутах то не мешало-бы их приводить. Похоже шлюз или вообще не разделяет ресурса или таймауты по последовательному интерфейсу малы.

Хотя если много объектов контроллеров ModBus и для них созданы отдельные объекты транспортов то таймаут на каждом должен быть равен таймауту последовательного интерфейса помноженного на количество объектов контроллеров-транспортов. Проще всего в таком случае сделать один общий исходящий транспорт сокета для всех объектов контроллеров на одном шлюзе (с одним адресом) тогда и очередь будет естественным образом строиться на самом транспорте с небольшим таймаутом, равному таймауту последовательного интерфейса.

P.S. "Настроил всё стандартно" в данном случае не говорит ни о чем, поэтому детализируйте согласно моим догадкам выше!

Learn, learn and learn better than work, work and work.
Written on: 18. 01. 2012 [11:38]
andrey-sw
Андрей Сычев
Topic creator
registered since: 10.12.2008
Posts: 32
дело не в таймаутах. Транспорт один, сбой происходит в случае если запрос к следующему контролеру пошел менее чем через 10 мс. Согласен виноват по видимому шлюз, либо постоянный id транзакции. Если шлюз его анализирует то возможно и получается коллизия. Возможно ситуацию могло бы исправить число повторов при сбое прежде чем выдать ошибку. В API я этот параметр видел ( setAttr("reqTry",2) - если конечно не ошибаюсь ). Тогда бы наблюдалось что то типа

при таймауте 200мс

0мс 1 запрос НОРМА
5мс 2 запрос ОШИБКА
205мс повтор 2 запроса НОРМА

хотя это и не совсем красиво
Written on: 18. 01. 2012 [13:34]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"andrey-sw" wrote:

дело не в таймаутах. Транспорт один, сбой происходит в случае если запрос к следующему контролеру пошел менее чем через 10 мс. Согласен виноват по видимому шлюз, либо постоянный id транзакции.

ID транзакции сделал случайно генерируемым - проверяйте.

Learn, learn and learn better than work, work and work.
Written on: 18. 01. 2012 [17:43]
andrey-sw
Андрей Сычев
Topic creator
registered since: 10.12.2008
Posts: 32
Вопрос может быть глупый, но можно ли заменить только библиотеку не переустанавливая всю систему. сижу на версии 0.7.2(Alt P6 openscada-0.7.2-alt1.i586.rpm). Если да то какую именно?
Written on: 18. 01. 2012 [18:08]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"andrey-sw" wrote:

Вопрос может быть глупый, но можно ли заменить только библиотеку не переустанавливая всю систему. сижу на версии 0.7.2(Alt P6 openscada-0.7.2-alt1.i586.rpm). Если да то какую именно?

daq_ModBus.so

Learn, learn and learn better than work, work and work.



5792