Чему у вас равно [99][6C][41][A6], либо [41][A6][99][6C]?
Интересно получается, если в моем массиве 5 элемент поставить на место 3-го и преобразовать во foat, то получается как и у вас 20,8735.
Чему у вас равно [99][6C][41][A6], либо [41][A6][99][6C]?
Интересно получается, если в моем массиве 5 элемент поставить на место 3-го и преобразовать во foat, то получается как и у вас 20,8735.
Интересный случай:
Первое число с оригинальным массивом, второе с переносом 6 байта в 4.Код:21.443102 //до переноса 21.408752 21.443174 //до переноса 21.388916 21.318317 //до переноса 21.349182 21.443388 //до переноса 21.388916
Каким образом "Циклическое время измерения" влияет на результат, причем погрешность небольшая?Код:tmp[3]=tmp[5];
Все дело в порядке передачи байт. В МВА температура храниться в 4 и 5 регистрах, вот с ними и работайте. То что у Вас и 3,4 регистры показывают почти правильно, это говорит о том что при формировании float основную роль играет четвертый регистр и он должен стоять в Вашей программе на втором месте, а третий или пятый, влияют только на зачения цифр после запятой. Я с самого начала на это намекаю, даже на видео показал, что перемена мест существенно изменяет значение, а Вы упорно пытаетесь использовать не нужный регистр
Так получается порядок регистров, а не байт. Сначала передается младшее слово, а потом старшее.
все в РЭ правильно про регистры написано
[32] - адрес прибораКод:[32][03][0C][00][00][00][14][00][00][99][6C][41][A6][FD][18][26][20]
[03] - номер функции
[0C] - кол-во байт в ответе
[00][00] - положение десятичной точки (старший, младший байты)
[00][14] - целое значение (старший, младший байты)
[00][00] - статус (старший, младший байты)
[99][6C] - циклическое время (старший, младший байты)
[41][A6][FD][18] - float
[26][20] - crc (старший, младший байты)
float надо собирать таким образом:
где X - номер первого байта в буфере ответа answer от МВА8Код: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^;
т.о. float имеет вид по байтам из ответа 3,4,1,2 и будет выглядеть как [FD][18][41][A6]
Последний раз редактировалось swerder; 03.10.2011 в 11:56.
вот так, обычно ссылаются на необговоренность правил передачи флоатов в протоколе модбас
3.2.1.8. Параметр «Порядок передачи байтов посылки» (Byte Sequence)
В параметре «Порядок передачи байтов посылки» (Byte Sequence) –
определяют, в каком порядке будут передаваться байты посылки протокола Modbus для переменных длиной 32 бита. У устройств разных производителей этот порядок разный, он не стандартизирован в самом протоколе, поэтому необходимо обговаривать его для конкретных устройств.
Для работы с модулями ввода/вывода OВЕН (например МВА8) необходимо установить значение параметра Trace_mode.