masterok 0 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба Доброго дня, коллеги! Посоветуйте пожалуйста литературу по реализации протокола MODBUS ASCII / RTU. Кто чем пользовался? Заранее спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба http://modbus.org/tech.php http://www.freemodbus.org Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 3 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба LibModbus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lyric 0 2 апреля, 2019 Опубликовано 2 апреля, 2019 (изменено) · Жалоба Всем привет. Сделал на 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 Почему происходит такое искажение - непонятно. Подскажите пожалуйста? Изменено 2 апреля, 2019 пользователем lyric Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pnp_mechanic 2 2 апреля, 2019 Опубликовано 2 апреля, 2019 · Жалоба lyric, не плохо бы "проверить руками" ваши числа. https://www.h-schmidt.net/FloatConverter/IEEE754.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lyric 0 3 апреля, 2019 Опубликовано 3 апреля, 2019 (изменено) · Жалоба 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-переменной. Изменено 3 апреля, 2019 пользователем lyric Разобрался в проблеме, обновление информации Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 7 3 апреля, 2019 Опубликовано 3 апреля, 2019 · Жалоба Возможно, cервер интерпретирует число как float 16-bit, с соответствующей потерей точности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться