Вам бы для начала найти гарантированно тот регистр, значение которого вы знаете точно, так вы узнаете куда смещать или не смещать адрес. А потом уже на нужном регистре с вычисленным смещением проверять все перестановки...
Вам бы для начала найти гарантированно тот регистр, значение которого вы знаете точно, так вы узнаете куда смещать или не смещать адрес. А потом уже на нужном регистре с вычисленным смещением проверять все перестановки...
Если 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);
Последний раз редактировалось Валенок; 26.07.2025 в 23:59.
да всё это элементарно читается орс сервером или модбас пулом
спокойно всё делается
никаких проблем кроме нежелания прежде чем чтото делать выяснить что такое модбас и чем регистры ввода отличаются от регистров хранения
к ОВЕНу это не имеет никакого отношения
Чтобы не привязываться к абсолютным адресам, делаю как в 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, получилось нужное значение ))