PDA

Просмотр полной версии : Конвертация HEX to FLOAT



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

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

Буду признателен за пример реализации скрипта.

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

поправил

Упс, еще из строки в байтовый массив придется кинуть

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

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

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

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

Конвертер 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.AllowHexSpecifie r);
byte[] bytes = BitConverter.GetBytes(intValue);
Array.Reverse(bytes);
Float = BitConverter.ToSingle(bytes,0);
}
}

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

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

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

Теперь я понимаю, почему MasterScada так "быстро" работает :) потому что программируют ее по мере возникновения проблем :)

krollcbas
03.04.2022, 08:34
Прав конечно...
Скажем так, оно и прилетает иногда "не верно"
Пример: 60058

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

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

Откуда вообще выросла эта задача(работа с конвертером протоколов ADFweb):
https://fast-project.ru/articles/snmp-i-modbus.html

melky
03.04.2022, 09:16
Велосипед не мой. Код, проверяющий строку на праведность 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