Перейти к содержанию
    

Протокол Modbus

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

 

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет.

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

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

 

Изменено пользователем lyric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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-переменной.

Изменено пользователем lyric
Разобрался в проблеме, обновление информации

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...