Jump to content

    
Sign in to follow this  
masterok

Протокол Modbus

Recommended Posts

Всем привет.

Сделал на AVR'ке MODBUS RTU, через конвертер интерфейсов UART - USB подключил её к компьютеру и опрашиваю OPC-сервером.

Использую только функцию чтения (03). Целочисленные переменные читаются без проблем.

А вот переменные типа FLOAT читаются на компе с погрешностью.

Значение FLOAT пробовал представлять в виде массива CHAR двумя способами, и никакой разницы между ними не увидел:

unsigned char *ptr;
    float primer_float=18.43;
    
    ptr=(char *)&primer_float;
    
        mirror[0]=*(ptr+3);
        mirror[1]=*(ptr+2);
        mirror[2]=*(ptr+1);
        mirror[3]=*(ptr+0);

и так:

union{
		unsigned char t[4];	
		float f;
	}un;
	un.f=18.43;
	mirror[0]=un.t[3];
	mirror[1]=un.t[2];
	mirror[2]=un.t[1];
	mirror[3]=un.t[0];

В меге задаю константу 18.43, а в компьютер это значение приходит уже равное 18.378908

Почему происходит такое искажение - непонятно. Подскажите пожалуйста?

 

Edited by lyric

Share this post


Link to post
Share on other sites
21 hours ago, pnp_mechanic said:

lyric,  не плохо бы "проверить руками" ваши числа.

https://www.h-schmidt.net/FloatConverter/IEEE754.html

Спасибо!

Проверил в этом конверторе по битам на примере числа 175.83. Разложил это число в биты через конвертор задал константами байтам и отправил в порт. В общем из AVR'ки уходит число точно в представлении IEEE 754, но результат точно такой же получается как и до этого, - искажение осталось. 

Из меги уходит такой набор байтов:                                     01000011 00101111 11010100 01111011

А в OPC-сервере эти же байты отображаются вот так:       01000011 00101111 00001000 00000001

То есть два байта совпадают и два НЕ совпадают, причём ВООБЩЕ, без какой-либо закономерности меняются.

Ну и как бы последовательность битов, которая отображается в ОРС-сервере в конверторе даёт число 175.03127, как раз вот она и ошибка.

 

Получается, виновата кривая реализация MODBUS RTU которую я использую? Или ещё какие-то причины могут быть?

 

UPD:

Разобрался с проблемой, всё отправляется правильно. Надо было писать эти 4 байта в обменный буфер начиная с первой его ячейки, а не с учётом прошлой посылки, 2 байта целочисленной переменной отправлялось вместо нужных байтов float-переменной.

Edited by lyric
Разобрался в проблеме, обновление информации

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this