Modbus RTU и отрицательные числа
- Войдите на сайт для отправки комментариев
Ср, 05/07/2017 - 23:57
Здраствуите,
Выход нагрузки серво усилителя +- 0,5VDC.Через делитель подключил к A0.Применив ''map'' настроил на ноль.В ''Serial.print'' всё отлично.Но мние нужен Modbus.И тут засада - от 0 в + всё правильно,а в - начинает с 65535.В нете накопал что 8 bit Ардуины(255) и 16 bit Modbus(65535) надо как то дополнительно объединить.А вот как ,ненашол.Может кто то решал уже такую задачу?
скетч публикуй, если не желаешь получить хрустальным шаром в лоб.
ок.
а, так Serial.print(unsigned int(val)); // правильный результат алхоритма?
41
нет,
от 0 в + = правильно
от 0 в - = начинает от 65535
a Modbus без изменений
И в чем проблема? 65535 это и есть "-1"
В Modbus-мастере настройте, чтобы полученное значение регистра интерпретировалось не как uint16, а как sint16.
нет
так, не тупи тогда, вычитая из unsigned int
нет
так, не тупи тогда, вычитая из unsigned int
Можно по-подробнее?
А про Modbus я знаю только это:
http://www.homanndesigns.com/pdfs/Using_Modbus_with_Mach3.pdf
нет
так, не тупи тогда, вычитая из unsigned int
Можно по-подробнее?
unsigned int
Я уже писал,что (unsigned int val;) в сериале от 0 в + правильно,а в - начинает от 65535,
а в Modbus тоже идентично.
Лучше бы не писал, а читал про дополнительный код и представление отрицательного числа.
Скажи мне в чем разница этих записей?
#FFFF
1111 1111 1111 1111 1111
-1
65535
Ни в чем!!! В шестнадцати-битной ячейке это одно и тоже значение. Разница только в интерпретации.
Modbus не является объектно-ориентированным протоколом. Он имеет дело только с регистрами, а что в этих регистрах находится ему без разницы. Все зависит он интерпретации. В двух регистрах может быть короткий Float, а может быть вообще 8 char.
Поэтому возьми модбас-тестер (модбас-мастер), который может отображать значения полученных регистров в нужное представление (тебе нужен signed int).
дополнительный код и представление отрицательного числа.
Кажетса,я больше писатель,чем читатель.Меняя типы (int,signed int ,unsigned int) в сериале разное отображение,а в модбусе - без разницы.Я не настолько силён ,так что мние нужен исполнитель.
Кажетса,я больше писатель,чем читатель.Меняя типы (int,signed int ,unsigned int) в сериале разное отображение,а в модбусе - без разницы.Я не настолько силён ,так что мние нужен исполнитель.
ок.
у тебя есть возможность программно сдвинуть шкалу значений переменной val с 0 до 32767 ?
те.:
32767 - это 0.
32766 - это -1
32768 - это 1
или это #6
Пока до топикстартера не дойдет, что нет отрицательных,дробных и прочих чисел, есть только нолики и единички и наше представление о том, как эти нолики и единички интерпретировать, ничего объяснить не получится.
В модбас упаковываются нолики и единички в виде шестнадциразрядных групп. каждая группа имеет номер. Для простоты имеет описание uint_16. Как туда упаковать числа решает каждый сам. Главное потом восстановить - распаковать правильно.
В 1 посту писал,что ардуино 8 ,а модбус 16 бит .Тут биты надо сравнивать,а вот как?
В 1 посту писал,что ардуино 8 ,а модбус 16 бит .
хуйню писал.
Особая благодарность «Condensator» за наводку #11.Некоторым советою ещё раз послушать « В Питере - пить» Решение в 39-40 строках.
a=(~a)|0;
Это прям в копилку маразмов.
a=(~a)|0;
Это прям в копилку маразмов.
Нет завален тупыми застольными дебатами.
А палочку с 0 пока оставил ,это как бы оффсет .Скеч работает.Хоть пояснили,в чём маразм?
Аптмуш операция ИЛИ 0 бессмысленна.
Ну да,так как начало числа передвинуть ненужно, хватило и
a=~a;
Скажите, а в какой момент число становится отрицательным? Ну чисто теоретически? Результат АЦП пололожительный. map тоже положительный.
Чисто практически, прочитаете с самого начала.Я зацепилса за выход сервы...и покатилось...
Я помню про серву. Мой вопрос про программу в посте #18. В строках 36-38 отрицательного числа быть не может. Зачем в строке 38 переменная val - двухбайтовая беззнаковая, в точности соответствующая регистру модбас - копируется в двухбайтовое знаковое? Хочу заметить,что после MAP значение будет укладываться в один байт и никогда не превратиться в отрицательное. Так где число станет отрицательным?
Я не имею опoрных знаний программирования. прочитал инфо из #11 ,сделал copy-paste ,и заработало.Работает и так:
int val;
if (val < 0)
val = ~val;
Юридически слово отрицательный надо менять на обратный или перевёрнутый.
Поделитесь пожалуйста ссылкой на github, где лежит библиотека ModbusRTU.h или Modbusrtu . Нужна для работы в режимах Master и Slave
https://www.google.ru/search?q=ModbusRTU&rlz=1C1GGGE_ruRU408RU408&oq=ModbusRTU&aqs=chrome..69i57&sourceid=chrome&ie=UTF-8#newwindow=1&q=modbusrtu+github+arduino
Мне больше всего нравится вторая ссылка.