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

Протокол обмена с счетчиками Меркурий 200 и Меркурий 230


Автор Сообщение
Сообщение создано: 07. 12. 2018 [11:58]
tavx
Дмитрий Лысенко
Зарегистрирован(а) с: 07.12.2018
Сообщения: 5
Добрый день.

Счетчик Меркурий 236 ART-02 подключен по RS-482 к серверу. На сервере поднят socat:
socat -x -d -d -d tcp-l:10012,reuseaddr,fork file:/dev/ttyUSB0,raw

В openscada 0.9.0 (Version : 1+r2563 по yum)
настроил в Transport->Sockets->Output Transport: транспорт с id m236_socat_tcp (address: TCP:адрес_сервера:10012, Timings: 5:1)
настроил в Data Acquisition->Module->Logical Level контроллер id merc236_1
к нему добавил параметр type std, id merc230_1 parameter template DevLib.m230 и Template Configuration: Network Address: 230, Password: 111111, Transport: m236_socat_tcp

Поменял код в Data Acquisition->Templates Library->Devices->Mercury230->IO с SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol"); на SYS.Transport["Sockets"]["out_"+transport].messIO(req,"UserProtocol");
чтобы соединение проходило через транспорт типа Sockets.

Вот IO Log транспорта m236_socat_tcp:

[2018-12-07T12:48:48.345523] Receiving timeouted

[2018-12-07T12:48:47.344271] Receiving timeouted

[2018-12-07T12:48:46.343143] Received from
00 E6 00 4B D0 ..K.

[2018-12-07T12:48:46.175172] Transmitted to
00 E6 01 01 01 01 01 01 01 01 95 E5 ...........


Видно что ответ приходит раньше таймаутов. Начал разбираться где затык.
Добавил немного отладочных сообщений в DA(Data Acquisition) и TP(Transport Protocol) модули Mercury 230 (хронология прямая):

> DA::Отправка пароля
TP:: сетевой адрес: 0xE6
TP:: тело запроса: E6 01 01 01 01 01 01 01 01
TP:: crc: 95 E5
>TP:: запрос: E6 01 01 01 01 01 01 01 01 95 E5
<TP:: ответ: E6 00 4B D0
TP:: тело ответа: E6 00
TP:: crc: 4B D0
TP:: контрольная сумма верна и ответ верный
TP:: пароль принят
< DA::..отправлен
DA:: нет ответа от транспорта


В итоге получается, что ответ от транспорта приходит, обрабатывается программой транспоротного протокола TP::Mercury230 но программа DA::Mercury230 не принимает от него данные.
Код из TP::Mercury230

if(request.charCodeAt(1)==0x01) {
Special.FLibSYS.messPut("/sub_DAQ/mod_LogicLev/cntr_merc236_1/",1,"TP:: пароль принят");
io.setText(Special.FLibSYS.strDec4Bin(resp));
}

видно что io.setText заполняется.

Код из DA::Mercury230

if(!req.text()) {
answer = EVAL_STR;TSAp = EVAL_STR;TSAm = EVAL_STR;TSRp = EVAL_STR;TSRm = EVAL_STR;
T1Ap = EVAL_STR;T1Am = EVAL_STR;T1Rp = EVAL_STR;T1Rm = EVAL_STR;T2Ap = EVAL_STR;T2Am = EVAL_STR;
T2Rp = EVAL_STR;T2Rm = EVAL_STR; T3Ap = EVAL_STR;T3Am = EVAL_STR;T3Rp = EVAL_STR;T3Rm = EVAL_STR;
T4Ap = EVAL_STR;T4Am = EVAL_STR;T4Rp = EVAL_STR;T4Rm = EVAL_STR;
PS = EVAL_STR;P1= EVAL_STR;P2= EVAL_STR;P3= EVAL_STR;U1= EVAL_STR;U2= EVAL_STR;U3= EVAL_STR;
I1= EVAL_STR;I2= EVAL_STR;I3= EVAL_STR;QS= EVAL_STR;Q1= EVAL_STR;Q2= EVAL_STR;Q3= EVAL_STR;
SS= EVAL_STR;S1= EVAL_STR;S2= EVAL_STR;S3= EVAL_STR;KS= EVAL_STR;K1= EVAL_STR;K2= EVAL_STR;
K3= EVAL_STR;F1= EVAL_STR;N1= EVAL_STR;
Special.FLibSYS.messPut("/sub_DAQ/mod_LogicLev/cntr_merc236_1/",1,"< DA:: нет ответа от транспорта");
return;
} else {
answer =req.text();
}

Тут req.text пустой.

Код трансопрта и сбора данных mercury230 используется из дистрибутива.

Добавлю что если, поднять клиент socat на стороне openscada и поднять выходной транспорт типа Serial, то ситуация такая же.

Подскажите, в чём может быть проблема?

[Сообщение редактировалось 1 раз(а), в последний раз 07.12.2018 в 12:02.]
Сообщение создано: 07. 12. 2018 [12:26]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
"tavx" wrote:

В openscada 0.9.0 (Version : 1+r2563 по yum)

Зоопарк там тогда или это не 0.9.0!

Learn, learn and learn better than work, work and work.
Сообщение создано: 07. 12. 2018 [13:11]
tavx
Дмитрий Лысенко
Зарегистрирован(а) с: 07.12.2018
Сообщения: 5
"roman" wrote:

"tavx" wrote:

В openscada 0.9.0 (Version : 1+r2563 по yum)

Зоопарк там тогда или это не 0.9.0!


Промахнулся сервером:
На сервере:
Name : openscada
Arch : x86_64
Version : 0.9.0

На клиенте:
Package: openscada
Architecture: amd64
Version: 0.9.0-2

Подключаюсь к серверу через openscada на ubuntu или веб интерфейс.
Сообщение создано: 08. 12. 2018 [22:02]
Godzilla
Арсен Закоян
Contributor
Создатель темы
Зарегистрирован(а) с: 12.02.2013
Сообщения: 123
Socat не пробовал, тестил все это дело через ser2net, да и то с Меркурием 230. Меркурий 236 тоже должен завестись, но это неточно.
Сообщение создано: 10. 12. 2018 [09:27]
tavx
Дмитрий Лысенко
Зарегистрирован(а) с: 07.12.2018
Сообщения: 5
"Godzilla" wrote:

Socat не пробовал, тестил все это дело через ser2net, да и то с Меркурием 230. Меркурий 236 тоже должен завестись, но это неточно.


ser2net попробовал, ситуация та же.

Поднял сервер openscada на машине с rs485 и настроил аналогичную конфигурацию, только тип транспорта изменил на serial. Проблема осталась.
Изменения таймаутов на счетчике и в транспорте ничего не решили.

Дело в то, что ответ приходит, но через определенное время в лог ввода/вывода транспорта приходит сообщение Receiving timeouted, и через некоторое время еще Receiving timeouted.
Такое впечатление, что где-то выставлено количество попыток запроса при отсутствии ответа, но ответ-то присутствует!
Сообщение создано: 10. 12. 2018 [11:11]
Godzilla
Арсен Закоян
Contributor
Создатель темы
Зарегистрирован(а) с: 12.02.2013
Сообщения: 123
Значит немного отличается ответ в 236. Мне к сожалению не на чем их потестить. Можете все запросы и ответы к счетчику при считывании конфигуратором мне скинуть, через сниффер последовательного порта например? Важно знать какие ответы дает счетчик на запросы.
Сообщение создано: 10. 12. 2018 [12:22]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
"Godzilla" wrote:

Можете все запросы и ответы к счетчику при считывании конфигуратором мне скинуть, через сниффер последовательного порта например?

Давно можно взять прямо в OpenSCADA (http://oscada.org/wiki/File:QTCfg_subsys_tr_mod_tr_log_ru.png), если обмен какой-то есть.

И даже если нет, то можно почитать параллельным физическим подключением к стороннему, хотя и разбирать потом сложно.

Learn, learn and learn better than work, work and work.
Сообщение создано: 10. 12. 2018 [12:28]
tavx
Дмитрий Лысенко
Зарегистрирован(а) с: 07.12.2018
Сообщения: 5
"Godzilla" wrote:

Значит немного отличается ответ в 236. Мне к сожалению не на чем их потестить. Можете все запросы и ответы к счетчику при считывании конфигуратором мне скинуть, через сниффер последовательного порта например? Важно знать какие ответы дает счетчик на запросы.


Вот обмен:
[2018-12-07T12:48:46.343143] Received from
00 E6 00 4B D0 ..K.

[2018-12-07T12:48:46.175172] Transmitted to
00 E6 01 01 01 01 01 01 01 01 95 E5 ..........

Ответ проверку CRC проходит:
if(CRCans==CRC1&&(request.charCodeAt(0)==answer.charCodeAt(0))/*&&answer.length>1*/ )
Вот это условие тоже проходит:
if(request.charCodeAt(1)==0x01)
далее транспортный модуль заполняет ответ для модуля в Сборе Данных:
io.setText(Special.FLibSYS.strDec4Bin(resp));

Но модуль этого ответа не видит, поэтому в нем срабатывает условие:
if(!req.text()) {
answer = EVAL_STR;TSAp = EVAL_STR;TSAm = EVAL_STR;TSRp = EVAL_STR;TSRm = EVAL_STR;
T1Ap = EVAL_STR;T1Am = EVAL_STR;T1Rp = EVAL_STR;T1Rm = EVAL_STR;T2Ap = EVAL_STR;T2Am = EVAL_STR;
T2Rp = EVAL_STR;T2Rm = EVAL_STR; T3Ap = EVAL_STR;T3Am = EVAL_STR;T3Rp = EVAL_STR;T3Rm = EVAL_STR;
T4Ap = EVAL_STR;T4Am = EVAL_STR;T4Rp = EVAL_STR;T4Rm = EVAL_STR;
PS = EVAL_STR;P1= EVAL_STR;P2= EVAL_STR;P3= EVAL_STR;U1= EVAL_STR;U2= EVAL_STR;U3= EVAL_STR;
I1= EVAL_STR;I2= EVAL_STR;I3= EVAL_STR;QS= EVAL_STR;Q1= EVAL_STR;Q2= EVAL_STR;Q3= EVAL_STR;
SS= EVAL_STR;S1= EVAL_STR;S2= EVAL_STR;S3= EVAL_STR;KS= EVAL_STR;K1= EVAL_STR;K2= EVAL_STR;
K3= EVAL_STR;F1= EVAL_STR;N1= EVAL_STR;return;}

Вот я и не могу понять почему потерялся ответ.
Сообщение создано: 10. 12. 2018 [13:06]
tavx
Дмитрий Лысенко
Зарегистрирован(а) с: 07.12.2018
Сообщения: 5
Вот данные из Конфигуратора меркурия (ser2net):

2018/12/10 13:49:12 tcp e6 00 4b d0 |..K.|
2018/12/10 13:49:13 tcp e6 00 4b d0 |..K.|
2018/12/10 13:49:13 tcp e6 00 4b d0 |..K.|
2018/12/10 13:49:13 term e6 00 4b d0 |..K.|
2018/12/10 13:49:13 tcp e6 01 01 01 01 01 01 01 |........|
2018/12/10 13:49:13 tcp 01 95 e5 |...|
2018/12/10 13:49:13 term e6 00 4b d0 |..K.|
2018/12/10 13:49:13 tcp e6 08 05 57 f4 |...W.|
2018/12/10 13:49:13 tcp e6 08 05 57 f4 |...W.|
2018/12/10 13:49:14 term e6 00 e6 11 bd |.....|
2018/12/10 13:49:14 tcp e6 08 00 97 f7 |.....|
2018/12/10 13:49:14 term e6 23 00 3e 1e 09 07 12 |.#.>....|
2018/12/10 13:49:14 term a1 79 |.y|
2018/12/10 13:49:14 tcp e6 08 03 d7 f6 |.....|
2018/12/10 13:49:14 term e6 08 00 00 b6 ae |......|
2018/12/10 13:49:14 tcp e6 08 12 17 fa |.....|
2018/12/10 13:49:14 term e6 b4 e5 c3 95 57 40 d9 |.....W@.|
2018/12/10 13:49:14 term 04 |.|
2018/12/10 13:49:14 tcp e6 08 26 16 2d |..&.-|
2018/12/10 13:49:14 tcp e6 08 26 16 2d |..&.-|
2018/12/10 13:49:15 tcp e6 08 26 16 2d |..&.-|

advanced serial monitor (подключил напрямую к физическому порту):
>E6004BD0
<E6004BD0
>E6010101010101010195E5
<E6004BD0
>E6080557F4
<E600E611BD
>E6080097F7
<E623003E1E090712A179
>E60803D7F6
<E6080000B6AE
>E6081217FA
<E6B4E5C3955740D904
>E60826162D
<E64E51646B
>E608021636
<E600010001BDD6

[Сообщение редактировалось 1 раз(а), в последний раз 10.12.2018 в 13:09.]
Сообщение создано: 10. 12. 2018 [13:31]
Godzilla
Арсен Закоян
Contributor
Создатель темы
Зарегистрирован(а) с: 12.02.2013
Сообщения: 123
ОК. Постараюсь разобраться. Но скорее всего уже после новогодних праздников.



8592