Просмотр полной версии : Конвертирование Float в Int а затем в Hex в MasterOPC Universal Modbus Server
fizhimik
21.06.2023, 16:58
Добрый день! Помогите пожалуйста со скриптом для конвертации float числа сначала в int16 затем в hex и обратно. В мануале по оборудованию приведены диапазоны работы, плюс есть пара примеров запроса в прибор.
-50.0 to 150.0 oC= FE0Ch to 5DCh (0.1oC/dig)
-20.0 to 90.0 oC= FF38h to 384h
10 to 40LPM=Ah to 28h (1L/min/dig)
2.6 to 10.6GPM=1Ah to 6Ah
По сайту https://www.scadacore.com/tools/programming-calculators/online-hex-converter/ я понял что нужно именно "INT16 - Big Endian (AB)" и INT16 - Little Endian (BA)". Для некоторых примеров float число увеличивается в 10 раз.
В справке MasterOPC Universal Modbus Server есть пример конвертации float to hex и есть приписка "Аналогичным образом можно делать преобразования любых чисел - float, double, int32, int16" - но у меня к сожалению ничего не получилось - менял маски запроса/ответа -все равно получал 8 символов вместо 4.
SCADAMaster
21.06.2023, 18:01
Не совсем понятно что вы хотите сделать. Зачем вам нужно HEX числа получать?
Если вы собираетесь слать данные в порт, то просто составьте маску в запросе SendAndReciveDataByMask - она сама все преобразует.
fizhimik
21.06.2023, 18:13
Не совсем понятно что вы хотите сделать. Зачем вам нужно HEX числа получать?
Если вы собираетесь слать данные в порт, то просто составьте маску в запросе SendAndReciveDataByMask - она сама все преобразует.
То есть вы имеете ввиду: вставить в таблицу отправки float число, а в маске прописать int16:10? Или вы же говорите про пример из справки?
SCADAMaster
21.06.2023, 18:31
В маске вы прописываете "float:3210:1", а функция сама в HEX все преобразует.
Посмотрите примеры в справке
https://support.mps-soft.ru/ModbusHelpRus/funkcii_rabotw_s_portami.html#bserver_sendandrecei vedatabymask
fizhimik
21.06.2023, 18:42
В маске вы прописываете "float:3210:1", а функция сама в HEX все преобразует.
Посмотрите примеры в справке
https://support.mps-soft.ru/ModbusHelpRus/funkcii_rabotw_s_portami.html#bserver_sendandrecei vedatabymask
Что то не выходит. Например я хочу преобразовать число "-20.0", но я не получаю того результата как приводится в мануале на устройство "FF38".
SCADAMaster
21.06.2023, 19:08
Пришлите лог обмена с устройством. Для этого в свойствах сервера включите запись журнала и всех его событий размер лога задайте равным 10000. Начиная с версии 4.2.24 у каждого устройства добавлена настройка "Журнал" - включите запись у проблемного устройства, и также включите запись всех действий. Запустите режим исполнения и воспроизведите ошибку. Лог пишется в папку:
c:\Users\All Users\InSAT\MasterOPC Universal Modbus Server\SERVERLOGS\
Лог заархивируйте и вышлите нам, также пришлите вашу конфигурацию ОРС сервера.
Укажите путь к тегу, где вы разместили скрипт.
fizhimik
22.06.2023, 10:59
-20.0 видимо в 0.1папугаях то есть -200 папугаев. Т.е 65536-200 в рамках 16 6ит. 65336 в калькуляторе переведите в hex
Да вы правы. Мне это вариант как раз вечером в голову пришел, что не зря онлайн конвекторы мне из FF38 не -20.0, а -200 выдавали и я сам отметил что число в 10 раз увеличивается. Проверил - так и есть, SendAndReciveDataByMask отрабатывает правильно - получил FF38 из -200. Побежал скорее на форум писать, а тут уже все решено. Спасибо!
fizhimik
22.06.2023, 14:44
Подскажите пожалуйста, как конвертировать из hex в dec в Lua. Функция tonumber(0xFF38,10) возвращает 65336, а надо -200. Нужно получить Decimal from signed 2's complement (3 digits) как например с сайта https://www.rapidtables.com/convert/number/hex-to-decimal.html
fizhimik
22.06.2023, 16:43
FF38 as signed 16 bit = -200
FF38 as unsigned 16 bit = 65336
К сожалению, не знаю как это использовать в скрипте Lua.
SCADAMaster
22.06.2023, 17:05
Подскажите пожалуйста, как конвертировать из hex в dec в Lua. Функция tonumber(0xFF38,10) возвращает 65336, а надо -200. Нужно получить Decimal from signed 2's complement (3 digits) как например с сайта https://www.rapidtables.com/convert/number/hex-to-decimal.html
Зачем вам это нужно? Это же просто визуальное представление числа.
fizhimik
22.06.2023, 17:27
Зачем вам это нужно? Это же просто визуальное представление числа.
Чтобы писать в тег это значение (температура), полученное от прибора.
Вот нашел, что похожее https://stackoverflow.com/questions/72480330/convert-bytes-to-signed-integers-in-lua-5-1-5.
Но результат совсем не тот.
Вот еще есть код, но у меня что то не сработало и выдает ошибку, но тут так же предлагают обработать строку hex через bin.
http://www.dialectronics.com/Lua/
SCADAMaster
22.06.2023, 17:41
Если вы используете функцию sendandrecievedatabymask, то она вам вернет готовое сконвертированное число - float. Вам его только в тег записать и все. Ничего больше преобразовывать не надо.
Посмотрите примеры по написанию протоколов в справке.
fizhimik
22.06.2023, 18:00
Если вы используете функцию sendandrecievedatabymask, то она вам вернет готовое сконвертированное число - float. Вам его только в тег записать и все. Ничего больше преобразовывать не надо.
Посмотрите примеры по написанию протоколов в справке.
Да, использую эту функцию. Прибор пока не подключен, решил заранее отработать все возможные проблемы. Если вы говорите что функция по маске int16:10 вернет число, которое я потом поделю на 10 и запишу в тег, то тогда все хорошо.
SCADAMaster
22.06.2023, 18:55
Да, все верно.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot