Задача состоит в том, что с OPC приходят значения тип данных string,
в нем вложено 4-х байтное значение, например: E0 92 9A 19
Нужно получить значение Float
Буду признателен за пример реализации скрипта.
Вид для печати
Задача состоит в том, что с OPC приходят значения тип данных string,
в нем вложено 4-х байтное значение, например: E0 92 9A 19
Нужно получить значение Float
Буду признателен за пример реализации скрипта.
а язык какой? BitConverter.ToSingle(byte[], StartIndex) в шарпах ну если что, то переставить байты еще
поправил
Упс, еще из строки в байтовый массив придется кинуть
Ну там проще, вырезать каждый элемент и превращать в число всяким int.TryParse и подобным. что там есть для этого в скриптах и складывать в массив, можно сразу в нужной последовательности, если требуется перестановка.
Для второго надо писать функцию. Ну или убить пробелы и попробовать преобразовать, но не уверен. Я даже не уверен за одиночные E0
Convert.ToByte(string, 16); - только вот в байт можно только два символа конвертнуть из HEX
Все получилось спасибо коллегам по цеху Евгению Кислову и Сергею И
Конвертер 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);
}
}
интересная конструкция с int.Parse а если прилетит из OPC 8 байт или строка в HEX с несколькими переменными ?
Еще будете функцию городить... по принципу когда придет проблема, будем ее решать ? :)
з.ы. по коду не понял откуда берется HexString ????
я так понимаю где-то было string HexString = ""; но тут его нету
Теперь я понимаю, почему MasterScada так "быстро" работает :) потому что программируют ее по мере возникновения проблем :)
Прав конечно...
Скажем так, оно и прилетает иногда "не верно"
Пример: Вложение 60058
Онлайн конвертер ascii_to_hex: C0 58 E6 40
Скрипт пишет ошибку в лог и ничего не делает. Вполне адекватное поведение.
Однако общую картину это не портит, и скада тут подвязана как некий промежуточный, доказательный элемент.
То есть в общем и целом графики пишутся, вот что за ночь записало:
Вложение 60057
Откуда вообще выросла эта задача(работа с конвертером протоколов ADFweb):
https://fast-project.ru/articles/snmp-i-modbus.html
Велосипед не мой. Код, проверяющий строку на праведность HEX
Например если строка не hex (сперва удалить пробелы ессно) то возвращайте или предыдущее значение или недостоверное значение по желаниюКод:public static bool IsHex(this string s)
{
foreach (char c in s)
if (!Uri.IsHexDigit(c))
return false;
return true;
}
з.ы. ADFWeb больше никогда не куплю :) машинка конено справляется с задачей, но она придурошная во всем остальном...
Правда ценник гуманнее, чем у Babel Buster