PDA

Просмотр полной версии : МВА8 и ModBus-RTU



porex
02.10.2011, 12:20
Доброго времени суток!
Пишу программу для опроса МВА8 по протоколу ModBus-RTU и наткнулся на ряд несоответствий с РЭ. Например, считываю 6 регистров 1 входа:
[32][03][00][00][00][06][C0][0B]
1 байт - адрес МВА, 2-й - номер функции, 3-й и 4-й - адрес регистра, 5-й и 6-й - кол-во считываемых регистров, 7-й и 8-й - CRC. На что приходит ответ:

[32][03][0C][00][00][00][14][00][00][99][6C][41][A6][FD][18][26][20]
1-й и 2-й - адрес и функция, 7-й - целое значение, 10-13-й - float значение. Это не соответствует таблице 6.2 в РЭ. Между целым значением и float должно быть 4 байта, где они? Что в 3-ем байте(0С)? Почему длина посылки 17 байт, вместо 16?

porex
02.10.2011, 12:24
Версия прошивки 7.5

capzap
02.10.2011, 14:01
0C - это количество байт данных без контрольной суммы или в Вашем случае 6 регистров

porex
02.10.2011, 14:29
0C - это количество байт данных без контрольной суммы или в Вашем случае 6 регистров
Точно, как-то пропустил этот момент.
А где же "Циклическое время измерения входа"?

capzap
02.10.2011, 14:37
[32][03][0C][00][00][00][14][00][00][99][6C][41][A6][FD][18][26][20]
как то так

porex
02.10.2011, 15:37
По логике да, но [41][A6][FD][18] во float'е = 2.63612267e-36, а [99][6C][41][A6] = 21.46. Ко входу подсоединен датчик температуры.

porex
02.10.2011, 15:57
По логике да, но [41][A6][FD][18] во float'е = 2.63612267e-36, а [99][6C][41][A6] = 21.46. Ко входу подсоединен датчик температуры.

Точнее 20 с копейками.

capzap
02.10.2011, 16:02
из [41][A6][FD][18] у меня получилось 20.088256, что кстати соответствует первому регистру
:) тренируйтесь, прочтите еще раз Вашу вспомогательную документацию как создать Float

на groovy это выглядит так

uno = 16806
duo = 64792
ex = (((uno >> 7) & 0xFF)-127)
zna = (int)((uno & 0x8000)>0?-1:1)
str = "1" + (((uno & 0x7F)<<16)+duo)
println (zna*(((Long.parseLong(str))/(10.0**(str.size()-1)))*(2**ex)))

porex
02.10.2011, 16:32
из [41][A6][FD][18] у меня получилось 20.088256, что кстати соответствует первому регистру
:) тренируйтесь, прочтите еще раз Вашу вспомогательную документацию как создать Float

на groovy это выглядит так
Странно, но мой отладчик выдает другое:


tmp @0xbfffe594 unsigned short [6]
[0] (hex) 0 unsigned short
[1] (hex) 14 unsigned short
[2] (hex) 0 unsigned short
[3] (hex) 996c unsigned short
[4] (hex) 41a6 unsigned short
[5] (hex) fd18 unsigned short


*Value=*((float*)(&(tmp[3])));

Value=20.824913,а

*Value=*((float*)(&(tmp[4])));
Value=-1.26489701e+37

capzap
02.10.2011, 17:06
посмотрите видео, почувствуйте разницу :)

porex
02.10.2011, 18:34
Чему у вас равно [99][6C][41][A6], либо [41][A6][99][6C]?
Интересно получается, если в моем массиве 5 элемент поставить на место 3-го и преобразовать во foat, то получается как и у вас 20,8735.

porex
02.10.2011, 18:46
Интересный случай:

21.443102 //до переноса
21.408752

21.443174 //до переноса
21.388916

21.318317 //до переноса
21.349182

21.443388 //до переноса
21.388916
Первое число с оригинальным массивом, второе с переносом 6 байта в 4.

tmp[3]=tmp[5];
Каким образом "Циклическое время измерения" влияет на результат, причем погрешность небольшая?

capzap
02.10.2011, 19:34
Все дело в порядке передачи байт. В МВА температура храниться в 4 и 5 регистрах, вот с ними и работайте. То что у Вас и 3,4 регистры показывают почти правильно, это говорит о том что при формировании float основную роль играет четвертый регистр и он должен стоять в Вашей программе на втором месте, а третий или пятый, влияют только на зачения цифр после запятой. Я с самого начала на это намекаю, даже на видео показал, что перемена мест существенно изменяет значение, а Вы упорно пытаетесь использовать не нужный регистр

porex
02.10.2011, 19:57
Так получается порядок регистров, а не байт. Сначала передается младшее слово, а потом старшее.

swerder
03.10.2011, 11:48
все в РЭ правильно про регистры написано



[32][03][0C][00][00][00][14][00][00][99][6C][41][A6][FD][18][26][20]
1-й и 2-й - адрес и функция, 7-й - целое значение, 10-13-й - float значение. Это не соответствует таблице 6.2 в РЭ. Между целым значением и float должно быть 4 байта, где они? Что в 3-ем байте(0С)? Почему длина посылки 17 байт, вместо 16?


[32][03][0C][00][00][00][14][00][00][99][6C][41][A6][FD][18][26][20]
[32] - адрес прибора
[03] - номер функции
[0C] - кол-во байт в ответе
[00][00] - положение десятичной точки (старший, младший байты)
[00][14] - целое значение (старший, младший байты)
[00][00] - статус (старший, младший байты)
[99][6C] - циклическое время (старший, младший байты)
[41][A6][FD][18] - float
[26][20] - crc (старший, младший байты)

float надо собирать таким образом:


pointer2 := ADR(answer[X]) + 1;
pointer1 := ADR(float_value);
pointer1^ := pointer2^;
pointer2 := ADR(answer[X]);
pointer1 := pointer1 + 1;
pointer1^ := pointer2^;

pointer2 := ADR(answer[X]) + 3;
pointer1 := pointer1 + 1;
pointer1^ := pointer2^;
pointer2 := ADR(answer[X]) + 2;
pointer1 := pointer1 + 1;
pointer1^ := pointer2^;

где X - номер первого байта в буфере ответа answer от МВА8
т.о. float имеет вид по байтам из ответа 3,4,1,2 и будет выглядеть как [FD][18][41][A6]

porex
03.10.2011, 12:02
т.о. float имеет вид по байтам из ответа 3,4,1,2 и будет выглядеть как [FD][18][41][A6]
Собственно как я выше и написал:
Сначала передается младшее слово, а потом старшее только почему так, не понял. В описании не нашел.
Ну да ладно, capzap и swerder, спасибо за помощь!

swerder
03.10.2011, 12:07
вот так, обычно ссылаются на необговоренность правил передачи флоатов в протоколе модбас

capzap
03.10.2011, 12:10
3.2.1.8. Параметр «Порядок передачи байтов посылки» (Byte Sequence)
В параметре «Порядок передачи байтов посылки» (Byte Sequence) –
определяют, в каком порядке будут передаваться байты посылки протокола Modbus для переменных длиной 32 бита. У устройств разных производителей этот порядок разный, он не стандартизирован в самом протоколе, поэтому необходимо обговаривать его для конкретных устройств.
Для работы с модулями ввода/вывода OВЕН (например МВА8) необходимо установить значение параметра Trace_mode.

porex
03.10.2011, 12:11
вот так, обычно ссылаются на необговоренность правил передачи флоатов в протоколе модбас

Было бы хорошо все это в РЭ написать. Дума не я один натыкался на подобное.

porex
03.10.2011, 12:15
3.2.1.8. Параметр «Порядок передачи байтов посылки» (Byte Sequence)

Откуда это взято?

capzap
03.10.2011, 12:16
http://www.owen.ru/uploads/plc_configuration_owen__.pdf

vostin
03.10.2013, 13:58
[QUOTE=porex;69060]Доброго времени суток!
Пишу программу для опроса МВА8 по протоколу ModBus-RTU и наткнулся на ряд несоответствий с РЭ. Например, считываю 6 регистров 1 входа:
[32][03][00][00][00][06][C0][0B]
1 байт - адрес МВА,
Здесь указан адрес МВА "32", объясните плз, как удалось заставить общаться МВА8 по ModBus-RTU с адресом больше "8"?
У меня никак такое не получается, в чём секрет?

LexSL
04.10.2013, 08:46
Здесь указан адрес МВА "32", объясните плз, как удалось заставить общаться МВА8 по ModBus-RTU с адресом больше "8"? У меня никак такое не получается, в чём секрет?
А Вы случаем не забыли про такую программку - "КОНФИГУРАТОР МВА8", именно через нее Вы и должны задавать адрес Modbus для устройства, (не забывая про правильную адресацию - смещение адресов на n для следующего стройства)

vostin
04.10.2013, 09:33
А Вы случаем не забыли про такую программку - "КОНФИГУРАТОР МВА8", именно через нее Вы и должны задавать адрес Modbus для устройства, (не забывая про правильную адресацию - смещение адресов на n для следующего стройства)
А разве есть другие варианты присвоения адреса? Чесно говоря в недоумении от ответа, посты набиваете?

LexSL
04.10.2013, 17:53
А разве есть другие варианты присвоения адреса? Чесно говоря в недоумении от ответа, посты набиваете?
Извините, если Вам мой ответ показался некорректным... Я просто подумал, что Вы забыли задать нужный адрес на приборе...
Работал с МВА, и МВ110-8АС - такой проблемы не замечал
ЗЫ: Посты не набиваю...С продукцией ОВЕН работаю давно и на форуме зарегистрирован тоже давно, а вот на форуме начал общаться недавно...