Jump to content

    

Протокол Modbus

Доброго дня, коллеги!

 

Посоветуйте пожалуйста литературу по реализации протокола MODBUS ASCII / RTU.

Кто чем пользовался?

 

Заранее спасибо!

Share this post


Link to post
Share on other sites

Всем привет.

Сделал на 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

Возможно, cервер интерпретирует число как float 16-bit, с соответствующей потерей точности.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this