Вход

Просмотр полной версии : ПЛК110 - Перестановка байт в REAL



Move
12.03.2025, 09:27
Не совсем понимаю как переставить байты в переменной с типом REAL. Я забираю данные с плотномера модулем REAL input module(FLOAT), забираю байты в порядке 0 1 2 3, для получения читаемого значения мне необходимо их переставить в порядке 3 2 1 0, не совсем понимаю как правильно это сделать? Нужно использовать REAL_TO_DWORD, делать перестановку и потом использовать DWORD_TO_REAL или это так не работает? Буду благодарен любым подсказкам

Валенок
12.03.2025, 09:59
function swap : real
var_input
in : real;
order : int; //(2143,3412,4321);
var
x at %MW0 : real;
d at %MW0 : dword;
w0 at %MW0 : word;
w1 at %MW1 : word;
---
x := in;
case order of 3412,4321:
d := rol(d, 16);
end_case
case order of 2143,4321:
w0 := rol(w0, 8);
w1 := rol(w1, 8);
end_case
swap := x;


или

function swap : real
var_input
x at %MW0 : real;
order : int; //(2143,3412,4321);
var
{flag noinit on}
d at %MW0 : dword;
w0 at %MW0 : word;
w1 at %MW1 : word;
{flag off}
---
case order of 3412,4321:
d := rol(d, 16);
end_case
case order of 2143,4321:
w0 := rol(w0, 8);
w1 := rol(w1, 8);
end_case
swap := x;

----
читаемого значения := swap(данные с плотномера модулем REAL, 4321);

Move
12.03.2025, 10:02
Можете добавить комментарии не совсем понимаю что такое %MW0 и %MW1

Валенок
12.03.2025, 10:13
Адрес. Абсолютный.

Ваш ник без "e" подразумевает что такое - знакомо.

Move
12.03.2025, 10:40
Если я правильно понял это адрес модуля, допустим %QD6.4.3.0.0 , а где мне взять адреса для WORDов, или я не правильно понимаю работу функции?

kondor3000
12.03.2025, 10:56
Если я правильно понял это адрес модуля, допустим %QD6.4.3.0.0 , а где мне взять адреса для WORDов, или я не правильно понимаю работу функции?

Вот вариант проще

FUNCTION_BLOCK Swap_BYTE
VAR_INPUT
rIn:REAL; (*входная переменная типа REAL*)
END_VAR
VAR_OUTPUT
rOut:REAL; (*переменная rOut с переставленными местами БАЙТами*)
END_VAR
VAR
pInput : POINTER TO ARRAY[0..3] OF BYTE; (* указатели на массивы *)
pOutput : POINTER TO ARRAY[0..3] OF BYTE;
END_VAR
___________________________________________
pInput :=ADR(rIn);
pOutput := ADR(rOut); (* Обязательно объявить блок в разделе переменных и в теле программы PLC_PRG *)

pOutput^[ 0 ] := pInput^[ 3 ]; (* Перестановка байт *)
pOutput^[ 1 ] := pInput^[ 2 ];
pOutput^[ 2 ] := pInput^[ 1 ]; (* Перестановка байт *)
pOutput^[ 3 ] := pInput^[ 0 ];

Валенок
12.03.2025, 12:55
Вот вариант проще
А чем проще? Что только 1 вариант перестановки?

Тогда вот 4321

var
читаемого значения %MW0 : real;
d at %MW0 : dword;
w0 at %MW0 : word;
w1 at %MW1 : word;
end_var
-----
читаемого значения := данные с плотномера модулем REAL;
d := rol(d, 16);
w0 := rol(w0, 8);
w1 := rol(w1, 8);




а где мне взять адреса для WORDов,..
%M* не надо брать. Они просто есть

kondor3000
12.03.2025, 13:11
А чем проще? Что только 1 вариант перестановки?


Проще для новичков, в понимании как это работает)

Move
12.03.2025, 13:16
Все работает, спасибо!

Валенок
12.03.2025, 14:55
Работает - хорошо.

))
А насчет проще для новичков - так не надо перескакивать через основы и сразу колбасить указатели.
Все что привёл - база базовая:
-Всё есть набор битов
-Имя переменной - неявный адрес
-Формат хранения и формат представления real
-Преобразование (что-то_TO _ что-то) vs интерпретация набора битов
-Базовые операции с битовыми (сдвиг и ролинг)