РЕШЕНО Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Прочие PLC и HMI на русском
qqgo
Posts: 6
Joined: Thu Jan 20, 2022 5:40 pm

РЕШЕНО Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Post by qqgo »

Здравствуйте! У меня проблема с получением данных по MODBUS RTU. Данные приходят в непонятном формате. Скорее всего это связано с порядком слов/битов.

Получаю данные с двух регистров вольтметра. Первый выдает целое число V (примеры: 0 = 0; 17239 = 215; 17240 = 216; 17244 = 220. меньше 17239 и больше 17245 проверить нет возможности, непонятно что он будет выдавать при маленьких и больших кол-вах V), второй - десятичное (0 = 0; 6554 = 1; 13107 = 2; 19661 = 3; 26214 = 4; -32768 = 5; -26214 = 6; -19661 = 7; -13107 = 8; -6554 = 9).

Контроллер AS228T; софт DIADesigner; язык LD; считываю блоком MODRW.

Если считать подряд два регистра и передать их в Numeric Display как двойное слово/флоат, то значение на панели показывает верное, типа 218.6(только надо в настройках Numeric Display переключить Word arrangement на High Word First(софт DIAScreen)). Но мне нужно в программе дальше обрабатывать нормальное значение V, никак не могу добиться правильного формата в программе.

Раньше с таким ещё не сталкивался, пытаюсь уже не первый день это сделать. Уже и разбивал слово пополам, свапал местами, клеил обратно и всё в этом роде, но пока безуспешно. Догадываюсь, что ответ лежит на поверхности, и я его почти нашёл, но уже немного запутался в этом.. Поэтому и решил обратиться за помощью. Буду рад любой информации по этой теме.
Last edited by qqgo on Fri Jan 21, 2022 9:54 pm, edited 1 time in total.
andreyit
Posts: 224
Joined: Wed Dec 26, 2018 5:39 pm

Re: Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Post by andreyit »

Ну, кроме плк узнать бы модель вольтметра с которого читаете данные. Вдруг все расписано в документации.
qqgo
Posts: 6
Joined: Thu Jan 20, 2022 5:40 pm

Re: Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Post by qqgo »

andreyit wrote: Thu Jan 20, 2022 6:18 pm Ну, кроме плк узнать бы модель вольтметра с которого читаете данные. Вдруг все расписано в документации.
AKR194U-A*1. Вольтметр китайский, пришёл без документации и после нескольких дней переписывания с продавцом я понял что в этом нет смысла, так как он постоянно высылал не те мануалы и не мог ответить на простые вопросы о вольтметре. Перерыл весь интернет, включая китайский, документации нет.
Тут 99% проблема с перестановкой слов. Я блоком DTM конвертирую 16 бит данных("17243") в два регистра по 8 бит = "91" и "67". "17243" это должно быть целое число "219". По hex и bin я нашёл, что "67" это первая часть "219", а "91" - вторая. Сейчас пытаюсь с помощью конвертаций/свапов/сравнений и тд как-то правильно объединить это всё.
qqgo
Posts: 6
Joined: Thu Jan 20, 2022 5:40 pm

Re: Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Post by qqgo »

Насчёт 91 и 67 - это с помощью разных конвертаций/перестановок, уже запутался каких именно даже. Могу добавить, что в программе при онлайн режиме я могу изменить формат числа, но он изменяется только мне для вида. Если показать "17243" в HEX'e = 435B, а если перевести 16#435B в десятичное представление с помощью IEEE 754 калькулятора, то получится именно 219.
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

Re: Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Post by Rex2701 »

qqgo wrote: Thu Jan 20, 2022 5:46 pmПолучаю данные с двух регистров вольтметра. Первый выдает целое число V (примеры: 0 = 0; 17239 = 215; 17240 = 216; 17244 = 220. меньше 17239 и больше 17245 проверить нет возможности, непонятно что он будет выдавать при маленьких и больших кол-вах V), второй - десятичное (0 = 0; 6554 = 1; 13107 = 2; 19661 = 3; 26214 = 4; -32768 = 5; -26214 = 6; -19661 = 7; -13107 = 8; -6554 = 9).
Возьмём к примеру значения регистров 17240 и -26214, что соответствует значениям 216 и 6.
17240 = 0x4358
-26214 = 0x999A
Склеиваем вместе - 0x4358999A
Интерпретируем это как 32-битный Float (https://www.binaryconvert.com/result_fl ... l=4358999A) - получаем 2.16600006103515625e2, т.е. 2.166x10^2 = 216.6.
Вот и всё. Делов-то...

На самом деле, половинки регистров никаким конкретным цифрам не соответствуют, это просто половинки флоата.
andreyit
Posts: 224
Joined: Wed Dec 26, 2018 5:39 pm

Re: Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Post by andreyit »

Вот именно. У вас это число с плавающей запятой. Используйте просмотр чтобы показывались эти числа нормально через view>format - где-то там. Потом умножайте на 100 (чтобы при преобразовании не было одного числа 2), и инструкцией преобразуйте в десятичные числа (в дельте она есть же. INT инструкция - для нее нужно 2 ячейки, которые у вас есть. В одной лежит "4358" в следующей "999A" - на выходе получим нормальное число).
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

Re: Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Post by Rex2701 »

andreyit wrote: Fri Jan 21, 2022 5:24 am Потом умножайте на 100 (чтобы при преобразовании не было одного числа 2)
Не надо ничего умножать, там нормальное число лежит.
qqgo
Posts: 6
Joined: Thu Jan 20, 2022 5:40 pm

Re: Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Post by qqgo »

Я вроде понял что нужно сделать, но не могу понять как именно это делается в дельте.
Какие инструкции использовать?
INT(DINT) превращает 216.3(просто пример, если напрямую такое передать) в 216. А FLT(DFLT) 17240(опять же пример) в 17240.0.
UPD.> Вот нашёл только если передать в DFLT значение которое я считываю в DWORD'e и результат сохранить в DWORD'e, то получится число с двух объединённых хексов.
Подал на вольтметр 32V, сейчас считал 31.9 как DWORD - получил в первый регистр куда считывал 858997247; во второй 13107. Пытаюсь понять что с ними делать дальше.
qqgo
Posts: 6
Joined: Thu Jan 20, 2022 5:40 pm

Re: Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Post by qqgo »

Сейчас я остановился на том, что я могу получить правильные хексы и склеить их в один регистр. Как в дельте преобразовать данные "42006666" в "32.1" или что-то подобное? (sos)

UPD > Проблема решена. Оказалось всё намного проще, чем мне казалось.
Считываю два регистра инструкцией MODRW и сохраняю значения в DWORD. Далее меняю данные в считанных регистрах инструкцией DXCH и посредством DMOV копирую первый регистр в REAL = 32.100.

Большое спасибо за подсказку, andreyit и Rex2701. Всего Вам наилучшего! :)
Last edited by qqgo on Fri Jan 21, 2022 10:10 pm, edited 2 times in total.
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

Re: Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Post by Rex2701 »

5 минут курения мануала от Дельты: у тебя 30000 ячеек данных типа "D". Кладёшь первую часть например в D1000, вторую часть в D1001. После чего с D1000 можно работать как обычным FLOAT.
Тут https://sp-t.ru/uploads/pdfs/delta-elec ... ya-eng.pdf в разделах 5.2.1 и 5.2.2.1 всё нормально расписано.
qqgo
Posts: 6
Joined: Thu Jan 20, 2022 5:40 pm

Re: Delta PLC Получение данных в неправильном формате с регистров вольтметра MODBUS RTU

Post by qqgo »

Rex2701 wrote: Fri Jan 21, 2022 9:15 pm 5 минут курения мануала от Дельты: у тебя 30000 ячеек данных типа "D". Кладёшь первую часть например в D1000, вторую часть в D1001. После чего с D1000 можно работать как обычным FLOAT.
Тут https://sp-t.ru/uploads/pdfs/delta-elec ... ya-eng.pdf в разделах 5.2.1 и 5.2.2.1 всё нормально расписано.
Да, уже разобрался. Только сегодня дошёл к вопросу, как преобразовать во флоат, до этого начитался у людей очень похожих проблем с решением в перестановку битов/слов и зашёл не в ту степь. У меня документация с офф сайта на 1300+ страниц, всю перерыл, и это читал. Но там не написано, что это делается DMOV'ом. Только сегодня нормально разобрался в работе этой инструкции. В своём сообщении до этого отчитался за решение. Ещё раз спасибо!!!