Страница 1 из 2

Получение данных из float Holding Register

СообщениеДобавлено: Чт июн 10, 2010 9:15 am
Igor V. Zhdanov
Используется связка:
УВП-280А --> Шлюз Modbus/TCP --> DASMBTCP
Значение float не правильно отображается, например, вместо 10 показывает 1,634774E-19. Это связано с не корректным считыванием информации из регистров Modbus.
Можно ли как-нибудь исправить ситуацию настройками драйвера, без написания дополнительных скриптов?

СообщениеДобавлено: Чт июн 10, 2010 9:57 am
Klinkmann_Msk
To Igor V. Zhdanov:

Попробуйте:
1.
• 219 HRS 16-bit signed integer
• 000 HRL 32-bit signed integer
• 100 HRF 32-bit floating point
• 000 HRU 32-bit unsigned integer

2.
400001 F
When a space and the letter "F" follow the register
number, the register contents are treated as a floatingpoint
quantity.
This takes up two consecutive registers.

СообщениеДобавлено: Чт июн 10, 2010 11:28 am
Igor V. Zhdanov
Первый пункт не понял.

Item выглядит таким образом: 41033 f. Т.е обращаюсь 3-ей функцией к регистрам 1032 и 1033.
RTU запрос: 01 03 04 08 00 02 44 F9
А вот ответ RTU: 01 03 04 00 00 20 41 23 C3. Здесь все правильно, 20 41 как раз и есть 10,0. А вот драйвер DASMBTCP не хочет нормально определить. Может, есть какая-то хитрая настройка?

СообщениеДобавлено: Вт июн 15, 2010 8:16 am
Klinkmann_Msk
To Igor V. Zhdanov:

1. Первый пункт не понял.
The MBTCP DAServer also uses another naming convention called the
Absolute Notation. This naming convention is independent of the PLC model numbers.
The Absolute naming convention allows access to the four Modbus data types, each with an address from 0 to 65535. The data types are indicated by the item name suffix characters.
The IR and HR absolute notation can also be combined with the following
conversions: L (long), F (floating), S (signed), or U (unsigned).

2. Какова версия DASMBTCP ? Свежая версия = 2.0

3. Попробуйте "поиграть" полями Use Concept data structures (Reals), Register Size и Register Type на закладке New ModbusPLC Parameters.

СообщениеДобавлено: Вт июн 15, 2010 11:20 am
Igor V. Zhdanov
DASMBTCP 1.1
где можно скачать 2?

СообщениеДобавлено: Вт июн 15, 2010 12:11 pm
Klinkmann_Msk
To Igor V. Zhdanov:

Попробуйте отсюда:
http://files.mail.ru/BJK7YH

Хотя, и версия 1.5 SP1, скорее всего, подошла бы.

СообщениеДобавлено: Ср июн 16, 2010 4:15 am
Igor V. Zhdanov
никакого результата :(
нужно бы читать как 41 20 00 00 тогда все ОК

СообщениеДобавлено: Ср июн 16, 2010 8:26 am
Klinkmann_Msk
To Igor V. Zhdanov:

никакого результата
Странно. Жаль.
Если я правильно понял, на Вашем приборе есть последовательный порт. Можете попробовать считывать информацию через него с помощью DASMBSerial?

СообщениеДобавлено: Ср июн 16, 2010 8:34 am
Klinkmann_Msk
To Igor V. Zhdanov:

Очень надеюсь, что поможет.
Копипаст из техноты 693:

When accessing a floating point value on some end devices, the value may be incorrect. For example, if a value of 123.45 is expected but a value of -2.7E+38 is being returned, the order of the two 16 bit registers that make up the 32-bit floating point value must be reversed. This can be done by selecting (or unselecting) the Use Concept Data Structures (Reals) option in the DASMBTCP PLC object.

СообщениеДобавлено: Ср июн 16, 2010 9:37 am
Igor V. Zhdanov
Use Concept Data Structures выбрана. Если отключаю, то значение 0.
Во всей документации, которую прочитал, сказано, что драйвер поддерживает IEEE float. где-то какая-то хрень сидит...
Пробовал Item такого вида: 1000 IRF (сейчас я мучаю эти регистры), с тем же результатом.
В обед уже пришла мысль использовать Serial. буду пытать дальше

СообщениеДобавлено: Ср июн 16, 2010 12:19 pm
Igor V. Zhdanov
DASMBSerial - такой же результат

СообщениеДобавлено: Ср июн 16, 2010 2:27 pm
Klinkmann_Msk
To Igor V. Zhdanov:

А можете продолжить мучения?
Есть масса OPC-серверов для Modbus (KEPWare, Matricon). А у WW есть OPC-клиент (OPCLink/FSGateway). Можете обкатать такую связку?

СообщениеДобавлено: Ср июн 16, 2010 4:44 pm
Klinkmann_Msk
To Igor V. Zhdanov:

Я тут подумал (и мне понравилось!)
А не связаны ли Ваши проблемы с национальными настройками ОС? Попробуйте установить национальные настройки ОС на English (USA). В первую очередь это касается раздела "Числа-Разделитель целой и дробной части".

СообщениеДобавлено: Чт июн 17, 2010 4:11 am
Igor V. Zhdanov
У меня установлен Windows XP Pro Eng SP3. Установил региональные настройки в English (United States). В строке Number: 123,456,789.00
Попробовал установить Modicon MODBUS Serial IO Server 7.5. Там включение/отключение Use Concept Data никак не влияет на результат.
Вообщем, все по-старому :(

СообщениеДобавлено: Чт июн 17, 2010 3:52 pm
Klinkmann_Msk
To Igor V. Zhdanov:

Тогда пока остаётся только:
Есть масса OPC-серверов для Modbus (KEPWare, Matricon). А у WW есть OPC-клиент (OPCLink/FSGateway). Можете обкатать такую связку?

СообщениеДобавлено: Ср июл 07, 2010 3:17 pm
Джа
Klinkmann_Msk писал(а):To Igor V. Zhdanov:

Я тут подумал (и мне понравилось!)
А не связаны ли Ваши проблемы с национальными настройками ОС? Попробуйте установить национальные настройки ОС на English (USA). В первую очередь это касается раздела "Числа-Разделитель целой и дробной части".

Национальные настройки к протоколу Modbus не относятся, числа в памяти хранятся без точек, пробелов и запятых :lol: - вот если бы вы число из какого-нить текста конвертили - другое дело. Проблема просто в последовательноти регистров, вечная бага ModBus - протокол официально 16тиразрядный, float - 32 бита - ну и получаем на выходе что напридумывали своих форматов следования 16ти разрядных слов (их 2 получается - но кто-то и в словах байты додумался переставлять :twisted: ). Надо действительно тестить с хорошими OPC-серверами, как предложил Klinkmann_Msk, например KepWare - там есть опция "переворота" слов для float (в Matrikon-е не видел, но мож есть, у KepWare более удобная демка для этого).
Как вариант проверки - попробуйте прочитать регистры float со сдвигом в адресе на +1, лучше чтобы после 2го регистра был 0 записан - если получите похожее на нужное число (после запятой - будет 0 или лажа) - значит просто слова перевернуты.

СообщениеДобавлено: Чт июл 08, 2010 6:39 am
Klinkmann_Msk
To Джа:

"Проблема просто в последовательноти регистров, вечная бага ModBus - протокол официально 16тиразрядный, float - 32 бита - ну и получаем на выходе что напридумывали своих форматов следования 16ти разрядных слов (их 2 получается - но кто-то и в словах байты додумался переставлять )."
Помню, специально тестировал Modbus-сервера от WW на предмет работы с 64-битными числами (Long, Real64). И нормально работали. Правда, с "правильным" KEPWare-сервером :)

СообщениеДобавлено: Чт июл 08, 2010 8:46 am
Джа
Klinkmann_Msk писал(а):To Джа:

"Проблема просто в последовательноти регистров, вечная бага ModBus - протокол официально 16тиразрядный, float - 32 бита - ну и получаем на выходе что напридумывали своих форматов следования 16ти разрядных слов (их 2 получается - но кто-то и в словах байты додумался переставлять )."
Помню, специально тестировал Modbus-сервера от WW на предмет работы с 64-битными числами (Long, Real64). И нормально работали. Правда, с "правильным" KEPWare-сервером :)

Дак в том-то и дело что именно KepWare И собирает регистры правильно. Но если существующий софт этого не позвоялет - бывает даже переписывают программу ПЛК, переворачивают регистры там специально - есть реальные примеры.

СообщениеДобавлено: Вт июл 13, 2010 12:33 pm
Igor V. Zhdanov
С ОРС серверами не экспериментировал, т.к. уверен, что результат будет положителен. Корень проблемы ясен. Существует даже ОРС специально для УВП-280 от Инсат. Но покупать никто не будет. Требуется выводить только расход, всего несколько тегов. Поэтому будет проще считать float как 2 целых и перевернуть в Интаче.

СообщениеДобавлено: Чт сен 16, 2010 2:30 am
Igor V. Zhdanov
УВП-280 не только переворачивает регистры (с этой проблемой драйвер модбас справился бы), но переворачивает еще и байты в слове. Поэтому считываю как целое и преобразовываю в Интаче вот таким образом (может, кому пригодится):
Получение старшего слова и перестановка байтов:
((T1 SHL 16 SHR 24)+(T1 SHL 24 SHR 16))
Получение младшего слова и перестановка байтов:
((T1 SHR 24)+(T1 SHL 8 SHR 16))
Преобразование:
H31=(((a31 - (Int(a31/128))*128)+128)*65536+b31)*2**((Int(a31/128)) - 150)
Делаем подстановку в последнюю формулу и получаем в итоге:
(((((T1 SHL 16 SHR 24)+(T1 SHL 24 SHR 16)) - (Int(((T1 SHL 16 SHR 24)+(T1 SHL 24 SHR 16))/128))*128)+128)*65536+((T1 SHR 24)+(T1 SHL 8 SHR 16)))*2**((Int(((T1 SHL 16 SHR 24)+(T1 SHL 24 SHR 16))/128)) - 150)
Тег в Интаче должен быть Real с диапазоном от -1e+015 до 1e+015, item типа 31001I, 31004I ит.д. Считывается как двойное слово.
Можно и упростить, но делал в спешке.

Re: Получение данных из float Holding Register

СообщениеДобавлено: Ср фев 01, 2012 12:01 pm
b4900113
что то не выходит, не могли бы вы подробнее описать третью формулу

Re: Получение данных из float Holding Register

СообщениеДобавлено: Пт фев 03, 2012 3:43 pm
b4900113
Igor V. Zhdanov Вы работали с архивами данного прибора? Посвятите пожалуйста в тонкости этой черной магии.

Re: Получение данных из float Holding Register

СообщениеДобавлено: Вт мар 27, 2012 1:35 pm
trs
А можно ли стандартными средствами получить данные double float?

Re: Получение данных из float Holding Register

СообщениеДобавлено: Вт мар 27, 2012 4:08 pm
Генератор зла
Джа писал(а):Klinkmann_Msk писал(а):
To Джа:

"Проблема просто в последовательноти регистров, вечная бага ModBus - протокол официально 16тиразрядный, float - 32 бита - ну и получаем на выходе что напридумывали своих форматов следования 16ти разрядных слов (их 2 получается - но кто-то и в словах байты додумался переставлять )."
Помню, специально тестировал Modbus-сервера от WW на предмет работы с 64-битными числами (Long, Real64). И нормально работали. Правда, с "правильным" KEPWare-сервером

Re: Получение данных из float Holding Register

СообщениеДобавлено: Вт мар 27, 2012 4:30 pm
trs
Генератор зла писал(а):

Только через kepware, я правильно понял?

Re: Получение данных из float Holding Register

СообщениеДобавлено: Вт мар 27, 2012 4:53 pm
Генератор зла
Нет, не правильно.
Я работаю через KEPWare. С ним у меня всё Ок. Как с другими - не знаю. Запросите техсаппорт.

Re: Получение данных из float Holding Register

СообщениеДобавлено: Вт мар 27, 2012 5:17 pm
trs
Да, с kepware всё хорошо, и float, и double float. Неужели нельзя нормальный DASMBTCP (DASMBSerial) сделать?

Re: Получение данных из float Holding Register

СообщениеДобавлено: Вт мар 27, 2012 5:33 pm
Генератор зла
С версией 2.0 не работает?

Re: Получение данных из float Holding Register

СообщениеДобавлено: Вт мар 27, 2012 5:51 pm
trs
Double float даже в документации не упоминается. С float вышеобозначенную проблему (с перестановкой байтов) решить не удаётся. (А я ещё удивлялся - что это подрядчики кучу формул нагородили?).

Re: Получение данных из float Holding Register

СообщениеДобавлено: Вт мар 27, 2012 5:56 pm
Генератор зла
trs писал(а):Double float даже в документации не упоминается.

В документации много чего не упоминается ;) Например, в InTouch тип IO Integer/Memory Integer. Но диапазон у него как у Double, а вовсе не -32768 - +32767.