Codesys 3.5
Подключил счетчик энергии, в нем полная активная энергия представлена в Int64 - 4 байта информации (т.е. 4 WORD числа, если смотреть в регистрах), как преобразовать в REAL (число с плавающей запятой)?
Codesys 3.5
Подключил счетчик энергии, в нем полная активная энергия представлена в Int64 - 4 байта информации (т.е. 4 WORD числа, если смотреть в регистрах), как преобразовать в REAL (число с плавающей запятой)?
Не зная броду, не суйся в воду. (Пословица.)
Век живи, век учись(а умрешь дураком).
Опыт растет прямо пропорционально выведенному из строя оборудованию.
Вы запросите у них точный формат.
Обычно так:
A5: DWORD;
A5: REAL;
pt: POINTER TO REAL;
pt :=ADR(A5); (*Копируем в префикс*)
A6:=pt^; (*Превращение в реал(флоат)*)
а что конкретно смущает?
у меня так с расходомера уже 7 лет пересчитывает из 2х ворд, в одном из которых мантиса, в другом экспонента.
сложение в дворд я опустил, а результат такой.
я с адресациями не очень
Не зная броду, не суйся в воду. (Пословица.)
Век живи, век учись(а умрешь дураком).
Опыт растет прямо пропорционально выведенному из строя оборудованию.
FUNCTION two_word_TO_real : REAL
VAR_INPUT
IN_Data: POINTER TO ARRAY[0..1] OF DWORD; (*Указатель на массив регистров для Float*)
END_VAR
VAR
p1: POINTER TO BYTE;
p2: POINTER TO BYTE;
END_VAR
------------------------------------------------------------
p1:=ADR(two_word_to_real);
p2:=ADR(IN_Data^[1]);
p1^:=p2^;
p1:=p1+1;
p2:=p2+1;
p1^:=p2^;
p1:=p1+1;
p2:=ADR(IN_Data^[0]);
p1^:=p2^;
p1:=p1+1;
p2:=p2+1;
p1^:=p2^;
---------------------------
этот код, работает для 2х байтов, но как преобразовать в 4 не пойму.
Не зная броду, не суйся в воду. (Пословица.)
Век живи, век учись(а умрешь дураком).
Опыт растет прямо пропорционально выведенному из строя оборудованию.
не нужно так усложнять.
в прг. складываю регистры, вам это не нужно.
что нужно я написал в первом сообщении.
программа такая.
Что-то не совсем в сообщении задание понимаю.
Int64 это же 8 байт, 4 слова, два двойных слова. А предлагают обычное преобразование в 4 -х байт в Real?
Нужно 8 байт в Real?
Может быть такой вариант только он не для Codesys делался. Функция WORD_TO_REAL не знаю есть ли в Codesys. Codesys оперирует указателями, у меня не было возможности их использовать поэтому решение получилось такое:
FUNCTION FourWords2Real
VAR_INPUT
WORD1: WORD;
WORD2: WORD;
WORD3: WORD;
WORD4: WORD;
END_VAR
VAR
Temp1: REAL;
Temp2: REAL;
Temp3: REAL;
Temp4: REAL;
END_VAR
Temp1:=WORD_TO_REAL(WORD1);
Temp2:=WORD_TO_REAL(WORD2);
Temp3:=WORD_TO_REAL(WORD3);
Temp4:=WORD_TO_REAL(WORD4);
Temp2:=Temp2*(2.0**16); (*сдвиг на 16 бит влево умножая на 2 в степени 16*)
Temp3:=Temp3*(2.0**32);
Temp4:=Temp4*(2.0**48);
Temp4:=TEMP1 + TEMP2 + TEMP3 + TEMP4; (*сложение разрядов в общее значение*)
FourWords2Real:= Temp4;
END_FUNCTION