Показано с 1 по 8 из 8

Тема: Конвертация HEX to FLOAT

  1. #1

    По умолчанию Конвертация HEX to FLOAT

    Задача состоит в том, что с OPC приходят значения тип данных string,
    в нем вложено 4-х байтное значение, например: E0 92 9A 19

    Нужно получить значение Float

    Буду признателен за пример реализации скрипта.
    +79104444236
    С уважением,
    Лапшин Вячеслав

  2. #2
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,586

    По умолчанию

    а язык какой? BitConverter.ToSingle(byte[], StartIndex) в шарпах ну если что, то переставить байты еще

    поправил

    Упс, еще из строки в байтовый массив придется кинуть
    Последний раз редактировалось melky; 02.04.2022 в 19:39.

  3. #3
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,586

    По умолчанию

    Ну там проще, вырезать каждый элемент и превращать в число всяким int.TryParse и подобным. что там есть для этого в скриптах и складывать в массив, можно сразу в нужной последовательности, если требуется перестановка.

  4. #4
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,586

    По умолчанию

    Для второго надо писать функцию. Ну или убить пробелы и попробовать преобразовать, но не уверен. Я даже не уверен за одиночные E0

    Convert.ToByte(string, 16); - только вот в байт можно только два символа конвертнуть из HEX
    Последний раз редактировалось melky; 03.04.2022 в 00:44.

  5. #5

    Thumbs up Конвертер String(Hex) to Float

    Все получилось спасибо коллегам по цеху Евгению Кислову и Сергею И

    Конвертер String(Hex) to Float
    Пример: 60 BA 07 41
    Float - Little Endian (DCBA)

    Код:
    using System;
    using MasterSCADA.Script.FB;
    using MasterSCADA.Hlp;
    using FB;
    using FB.FBAttributes;
    using System.Linq;
    using System.Globalization;
    
    [FBRetain]
    public partial class ФБ : ScriptBase
    {
        public override void Execute()
        {
                int intValue = int.Parse(HexString.Replace(" ", ""), System.Globalization.NumberStyles.AllowHexSpecifier);
                byte[] bytes = BitConverter.GetBytes(intValue);
                Array.Reverse(bytes);
                Float = BitConverter.ToSingle(bytes,0);
        }
    }
    +79104444236
    С уважением,
    Лапшин Вячеслав

  6. #6
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,586

    По умолчанию

    интересная конструкция с int.Parse а если прилетит из OPC 8 байт или строка в HEX с несколькими переменными ?
    Еще будете функцию городить... по принципу когда придет проблема, будем ее решать ?

    з.ы. по коду не понял откуда берется HexString ????

    я так понимаю где-то было string HexString = ""; но тут его нету

    Теперь я понимаю, почему MasterScada так "быстро" работает потому что программируют ее по мере возникновения проблем
    Последний раз редактировалось melky; 03.04.2022 в 08:29.

  7. #7

    По умолчанию

    Прав конечно...
    Скажем так, оно и прилетает иногда "не верно"
    Пример: 2022-04-03_08-37-06.png

    Онлайн конвертер ascii_to_hex: C0 58 E6 40

    Скрипт пишет ошибку в лог и ничего не делает. Вполне адекватное поведение.
    Однако общую картину это не портит, и скада тут подвязана как некий промежуточный, доказательный элемент.
    То есть в общем и целом графики пишутся, вот что за ночь записало:
    2022-04-03_08-20-23.png

    Откуда вообще выросла эта задача(работа с конвертером протоколов ADFweb):
    https://fast-project.ru/articles/snmp-i-modbus.html
    Последний раз редактировалось krollcbas; 03.04.2022 в 08:37.
    +79104444236
    С уважением,
    Лапшин Вячеслав

  8. #8
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,586

    По умолчанию

    Велосипед не мой. Код, проверяющий строку на праведность HEX

    Код:
            public static bool IsHex(this string s)
            {
                foreach (char c in s)
                    if (!Uri.IsHexDigit(c))
                        return false;
                return true;
            }
    Например если строка не hex (сперва удалить пробелы ессно) то возвращайте или предыдущее значение или недостоверное значение по желанию

    з.ы. ADFWeb больше никогда не куплю машинка конено справляется с задачей, но она придурошная во всем остальном...
    Правда ценник гуманнее, чем у Babel Buster
    Последний раз редактировалось melky; 03.04.2022 в 09:19.

Похожие темы

  1. Конвертация TIME_TO_INT
    от Виктор Р в разделе СПК1хх
    Ответов: 8
    Последнее сообщение: 25.05.2023, 10:00
  2. Переход от float (Nullable) к просто float
    от ASo в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 12.11.2014, 14:21
  3. Конвертация библиотек
    от Антон12345 в разделе ПЛК3хх
    Ответов: 7
    Последнее сообщение: 31.08.2011, 17:16
  4. Конвертация проекта из ПЛК100 в ПЛК110
    от Баженов Николай в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 17.05.2011, 16:07

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •