ПОМОЩЬ! новичку 55 летнему!

может не ту библиотеку <ModbusRtu.h> выбрал?

Модбас не может быть не тем. Он умеет передавать только ворды. Целые двух байтовые переменные от 0 до 2^16. Если надо передать float, то есть варианты. Можно умножить его 100, получить четырёхзначное целое число (14.07 → 1407) ,передать его по модбасу а на приёмной стороне поделить на 100. Можно отдельно передать целую и отдельно дробную часть в виде целых. Можно передать 4 байта из которых состоит float , а на приёмной стороне собрать float. Здесь union поможет.

2 лайка

а передать 10 бит сырых данных и на приёмной стороне преобразовать не проще?

на сколько я понимаю на “приемной стороне” (в моем случае СИМПЛАЙТ) эти вещи уже все стандартны.
но я эти стандарты перебрал и ничего не получилось.
предлагаемый Вами вариант возможно работать и будет (не представляю как это сделать), но должно быть все проще…это ведь стандартные вещи реализованные в языке программирования ардуины.
может я и не прав, это ход моих мыслей

попробую этот вариант. если получится, буду с этим жить

Как-то так, но не обязательно. Скады могут и наоборот регистры собирать.

union {
    float asFloat;
    int asInt[2];
}
modbusConverter;

modbusConverter.asFloat = 3.1415926;

modbusReg[_N_ + 0] = modbusConverter.asInt[0];
modbusReg[_N_ + 1] = modbusConverter.asInt[1];

блин, вот озадачили…а куда это вставить?

СИМПЛАЙТ не умеет передавать float и принимать через модбас. Это ограничение системы. Тут ничего не сделать.

На скриншотах есть флот32. Запломбирована фича?

Не. Передают только целую часть по модбасу. И то только от 0 до 65535. А дальше сам. Или сервер надо поднимать родной.

Ну, с этим OPC незнаком, не буду настаивать. Хардварный электроизмеритель передавал мне float через два регистра, в IEEE 754.

Такшто, чем мог - тем помог.

буду мучиться. отпишусь

Неправильно понимаешь.
В спецификации Modbus , float’ов нет вообще.
Каждый из производителей реализует на свое усмотрение.
Как хочешь реализовать ты твое личное дело.

зачем мучиться, наслаждайся

Не СИМПЛАЙТом единым мир полон. Есть много систем где можно реализовать такой же функционал. Ну а если только СИМПЛАЙТ, то не надо пытаться сделать то на что он не рассчитан.

Все получилось. как говорится “Не мытьем, так катаньем”.
Всем спасибо, особенно nik182.

(в скетче результат умножил на 100, а в СИМПЛАЙТе вставил формулу, разделить на 100.)

На будущее сообществу, как вариант

и это неправильный алгоритм, ты два раза теряешь в точности, смысл?
Передал значение с аналогового пина оно у тебя умещается в uint16, а на приёмной стороне умножить на 5.0 и разделить на 1023.0
PS но по сути тоже неправильно, так как 5.0 берёшь с потолка