Вам бы для начала найти гарантированно тот регистр, значение которого вы знаете точно, так вы узнаете куда смещать или не смещать адрес. А потом уже на нужном регистре с вычисленным смещением проверять все перестановки...
Вид для печати
Вам бы для начала найти гарантированно тот регистр, значение которого вы знаете точно, так вы узнаете куда смещать или не смещать адрес. А потом уже на нужном регистре с вычисленным смещением проверять все перестановки...
Если float, то там 8 вариантов, потому что можно зацепить не с того регистра :)
Попробовать через стандартным средтсвом опроса CODESYS опросить расходомер и с разной перестановкой , с разной перестановкой байт?
Да компьютером с самого начала надо посмотреть и определиться. Потом подключать к ПЛК.
++!!
Задать адрес 99 и найти его. Сам бодрейт опять же.
Что же касается флоатов. Прочитать нужные 2 регистра как целое 32-битное и сделать простейшие операции
в иксах все вариантыКод:D1 at% MD0: dword;
X1 at% MD0: real; //1234
D2 at% MD2: dword;
X2 at% MD2: real; //3412
D3 at% MD4: dword;
X3 at% MD4: real; //2143
D4 at% MD6: dword;
X4 at% MD6: real; //4321
-------------------------
D1 := D3 := что прочитали
D2 := D4 := rol(D1, 16);
D3 := (shl(D3, 8) and 16#FF00FF00) + (shr(D3,8) and 16#00FF00FF);
D4 := (shl(D4, 8) and 16#FF00FF00) + (shr(D4,8) and 16#00FF00FF);
да всё это элементарно читается орс сервером или модбас пулом
спокойно всё делается
никаких проблем кроме нежелания прежде чем чтото делать выяснить что такое модбас и чем регистры ввода отличаются от регистров хранения
к ОВЕНу это не имеет никакого отношения
Чтобы не привязываться к абсолютным адресам, делаю как в Pascal - через "объединения".
https://content.helpme-codesys.com/e...ype_union.html
Внимание - набирал без проверки в браузере, но смысл должен быть понятным
Сначала объявляю тип TConvert
А потом в программе объявляю переменную tcTemp и с помощью её полей обмениваю байты и словаКод:TYPE TConvert:
UNION
by0, by1, by2, by3 : BYTE;
w0, w1: WORD;
dw: DWORD;
r : REAL;
END_UNION
END_TYPE
или любой другой вариант.Код:tcTemp.r := rReceived;
// перестановка 3412
wTemp := tcTemp.w0;
tcTemp.w0 := tcTemp.w1;
tcTemp.w1 := wTemp;
// или такая перестановка 4321 взамен предыдущей
byTemp := tcTemp.by0;
tcTemp.by0 := tcTemp.by1;
tcTemp.by1 := byTemp;
byTemp := tcTemp.by2;
tcTemp.by2 := tcTemp.by3;
tcTemp.by3 := byTemp;
wTemp := tcTemp.w0;
tcTemp.w0 := tcTemp.w1;
tcTemp.w1 := wTemp;
// присвоение результата в итоговую переменную rResult
rResult := tcTemp.r;
Обмен можно и при помощи ротации выполнять, а можно и как в примере - прямым обменом.
Тут плюс в отсутствии привязки к абсолютным адресам.
Попробовал сегодня Modbus Scan просто найти устройства, нашёл, всё отлично.
Потом попробовал ModbusTool, прочитать регистр из карты регистров которую сам нашёл на сайте производителя, float, пробовал разную перестановку байт, единственное адекватный вариант float AB CD, но значение всё равно какое то левое.
Производитель написал, Вот ссылка на карту регистров для Эксперт https://vzljot.ru/upload/iblock/2c2/..._em_expert.pdf
Регистр текущего расхода 349187, л/мин, формат float. Считываете функцией 4 два регистра с адреса 49186.
Попробовал регистр который он дал, ошибка ILLEGAL DATA VALUE.
Извините, коллеги. Ошибка вот в чём была, прибор у меня показывает в м3/час, а регистр читается в л/мин, умножил полученное значение на 0.06, получилось нужное значение ))