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

Ошибки в ответе ModBus


Автор Повідомлення
Повідомлення створено: 08. 12. 2014 [14:22]
igkondrat
Игорь Кондрат
Автор теми
Зареєстрован(а) с: 04.12.2014
Повідомлення: 4
Добрый день,
Столкнулся с одной проблемой, которая проявила себя в версии 0.8.0.10, в 0.8.0.4 проблем нет.
Суть проблемы -
Создал пользовательский протокол для счетчиков Меркурий 230. Сам протокол 'modbus-подобный'.
Для снятия показаний для начала необходимо авторизоваться (в моем случае код 111111)
Так выглядит запрос -
using Special.FLibSYS;
req = SYS.XMLNode("RTU");
req.setAttr("reqTm",1000).setAttr("node",190).setAttr("reqTry",2);
req.setText(Special.FLibSYS.strEnc2Bin("01 01 01 01 01 01 01 01"));
SYS.Transport.Serial.out_moxa_2_213.messIO(req,"ModBus");

Запрос -> be 01 01 01 01 01 01 01 01 0e 26
Ошибка -> 13:Ошибка ответа -> be 00 70 10

Т.е. ответ приходит (значение — 00 ), что означает - доступ разрешен.

Далее хочу получить энергию -
//Энергия по сумме фаз
req.setText(Special.FLibSYS.strEnc2Bin("05 00 00"));
SYS.Transport.Serial.out_moxa_2_213.messIO(req,"ModBus");
answer=Special.FLibSYS.strDec4Bin(req.text()).match("[0-9a-fA-F][0-9a-fA-F]","g");
Apos=(((answer[1].insert("2",answer[0])).insert("4",answer[3])).insert("6",answer[2])).toInt(16)/1000;
Rpos=(((answer[9].insert("2",answer[8])).insert("4",answer[11])).insert("6",answer[10])).toInt(16)/1000;


Запрос -> be 05 00 00 34 0d
Ошибка -> 1:2A:Функция не поддерживается. -> be aa 01 6c 47 ff ff ff ff 53 00 85 af ff ff ff
ff 5c f5

Как видно ответ все же приходит, но с ошибкой и соответственно я не могу разобрать ответ - «aa 01 6c 47» (Из них читается так 2-1-4-3 байты)

При запросе частоты, ответ без ошибки -

req.setText(Special.FLibSYS.strEnc2Bin("08 11 40"));
SYS.Transport.Serial.out_moxa_2_213.messIO(req,"ModBus");
answer=Special.FLibSYS.strDec4Bin(req.text()).match("[0-9a-fA-F][0-9a-fA-F]","g");
Frq=((answer[0].insert("2",answer[2])).insert("4",answer[1])).toInt(16);

Запрос -> be 08 11 40 a8 6e
Ответ -> be 00 87 13 06 31


Можно ли как нибудь игнорировать ошибку в ответе?
P.S.
При отправке запроса через Транспорты → Последовательный интерфейс → Выходной транспорт ошибок нет...
Повідомлення створено: 08. 12. 2014 [17:46]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"igkondrat" wrote:

Столкнулся с одной проблемой, которая проявила себя в версии 0.8.0.10, в 0.8.0.4 проблем нет.

На дворе давно 0.8.11!

"igkondrat" wrote:

Запрос -> be 01 01 01 01 01 01 01 01 0e 26
Ошибка -> 13:Ошибка ответа -> be 00 70 10

Слишком короткий PDU.

"igkondrat" wrote:

Запрос -> be 05 00 00 34 0d
Ошибка -> 1:2A:Функция не поддерживается. -> be aa 01 6c 47 ff ff ff ff 53 00 85 af ff ff ff
ff 5c f5

Реально ошибка, согласно спецификации ModBus.

"igkondrat" wrote:

Можно ли как нибудь игнорировать ошибку в ответе?

Нельзя и не нужно натягивать на ModBus/RTU то, что таким по определению не является!
Пишите отдельную реализацию запросов.

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



15502