Twincat 3: Как преобразовать массив 4 HEX в Float? - PullRequest
0 голосов
/ 26 июня 2018

мы получаем (через дейтаграмму UDP) значение с плавающей точкой, кодированное 4-байтовым шестнадцатеричным массивом.

Нам нужно преобразовать 4 шестнадцатеричных байта в число с плавающей запятой.

udp_data[0] = 'BE';
udp_data[1] = '7A';
udp_data[2] = 'E0';
udp_data[3] = 'F4';

В данном примере правильная эквивалентность после преобразования udp_data эквивалентна -0,24499:

Какое оптимальное преобразование в Twincat 3 PLC? может какая-нибудь библиотека? Нам нужно выполнить 52 преобразования одновременно этого типа.

Я приложил пример с примером, взятым из онлайн-калькулятора:

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вы можете использовать тип UNION, который по тому же адресу будет содержать байтовый массив (например, тот, который вы получаете из вашего UDP-соединения) и реальную переменную, в которую вы хотите преобразовать.
Когда вы меняете байтовый массив, реальный автоматически отражает его. Фактически, конверсия работает и наоборот.

TYPE U_Convert :  
UNION  
    arrUDP_Data: ARRAY [0 .. 3] OF BYTE; // Array must start with LSB  
    rReal : REAL;  
END_UNION  
END_TYPE  

В MAIN вы можете указать следующую переменную.

VAR
    uConvert: U_Convert;
    fValue : REAL;
END_VAR

А в теле MAIN обновите байтовый массив до запрошенных значений.

// Here we update the byte array
uConvert.arrUDP_Data[0] := 16#F4; // LSB
uConvert.arrUDP_Data[1] := 16#E0;
uConvert.arrUDP_Data[2] := 16#7A;
uConvert.arrUDP_Data[3] := 16#BE; // MSB

// Here we 'use' the converted value
fValue := uConvert.rReal;
0 голосов
/ 26 июня 2018

Я предполагаю, что у вас есть массив байтов. Заголовок (поместите его в свой функциональный блок, если хотите):

PROGRAM MAIN
VAR
    aByteArray : ARRAY[1..4] OF BYTE := [16#F4, 16#E0, 16#7A, 16#BE];
    pt : POINTER TO REAL;
    fRealValue : REAL;
END_VAR

Тело:

pt := ADR(aByteArray);
fRealValue := pt^;

Даст вам желаемый результат:

enter image description here

...