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 не пойму.:confused:
не нужно так усложнять.
в прг. складываю регистры, вам это не нужно.
что нужно я написал в первом сообщении.
программа такая.
Что-то не совсем в сообщении задание понимаю.
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
тема называлась так:
4 байта в число с плавающей запятой
4 байта это DWORD или 32 бита.
По байтно смотрю значения:
А0 = 0 (WORD)
А1 = 66 (WORD)
А2 = 6293 (WORD)
А3 = 0 (WORD)
так идут значения.
В итоге преобразования получается фигня по lara197a рекомендации.
Я, не знаю, но что-то я делаю точно не так. Помню в институте, на delphi мы как-то переводили, но сейчас что-то не доходит до меня.
у меня пример для 32 бита, исходя из названия темы.
В примере, в ручную собирается двойное слово из знака, мантисы и экспоненты.
Я вам писал, уточните у производителя, как у них размещены эти элементы и
по аналогии соберите.
Считывать регистры с 3204 размер 4 слова.
А0 = 0 (WORD)
А1 = 66 (WORD)
А2 = 6293 (WORD)
А3 = 0 (WORD)
по середине значения,
порядок нулевой, мантисса большая.
А1 увеличивается на 1, когда А2 достигает 65535.
там где-то знак должен быть.
А если только А1 и А2 взять?
Там счетчик, там нужно считывать активную энергию, сколько кВт/ч накрутило, в принципе это самое главное значение, которое не считывается толком.
Это значение 4 СЛОВА, ток и активная мощность 2 СЛОВА, их получилось преобразовать по вышеуказанному коду. Но вот это никак не получается. Если брать только два средних слова, то тоже получается какая то билеберда, пробовал и так и сяк.
Знак, по идее всегда +.
Вложение 32865
Вот слова, их видно побитно все, так что знаков нет не снизу не сверху )))
Знак- лишняя единица.
ее нужно отделять.
может байты местами менять нужно.
у меня примерно такая же ситуация была с расходомером К300.
Методом кручения байт и с помощью описания типа данных в википедии.
Вот так вот изменил и вроде заработало. Но не знаю что будет показывать, когда появятся значения в А1 и А4.
Т.к. У меня последовательность (адресация в программе):Код:FUNCTION int64_to_real : REAL
VAR_INPUT
A1,A2:WORD;
A3,A4:WORD;
END_VAR
VAR
DL,DH : DWORD;
M : BOOL;
END_VAR
----------------------------
M := DH.31;
DH := A4 * 65536 + A3; DL := A1 * 65536 +A2;
IF M THEN
DH := (NOT DH) + SEL(DL = 0,0,1);
DL := (NOT DL) + 1;
END_IF
int64_to_real:= (DH * 65536.0 + DL) * SEL(M,1,-1);
int64_to_real:=int64_to_real /1000;
А1(3204)=0;
А2(3205)=88;
А3(3206)=17500;
А4(3207)=0;
Так видны значения в CoDeSys. Как там дальше будет, посмотрим.
Валенок, благодарю очень сильно за полезную помощь.
И всем остальным ребятам огромное спасибо.
Здравствуйте, сам сейчас столкнулся с проблемой чтения мощности из PM3250. Дело в том, что у них сдвинута нумерация регистров на 2. Т.е. ожидаемые данные регистра 3204 будут находится в регистре 3206. И так практически во всей таблице, кроме начальных. Причем несовпадение может быть как в одну, так и в другую сторону. Я, обычно, для наглядности, в конфигурации ПЛК читаю 3 регистра: один, который указан в таблице, и смежные, потом выбираю нужный. Подскажите пожалуйста как мне преобразовать Int64 в REAL. Программа написана на CFC. Спасибо
Вопрос решился проще, в техподдержка Scheider дали ответ : "В PM3250 имеется регистры энергии представлены как в формате int64, так и в Float32 (начиная с рег 45166)." стр. 60 руководства пользователя.
Здравствуйте. Как 32bit input module переделать в число с плавающей запятой, т.е. в REAL? Выше перечисленными методами не получается.
Здравствуйте. Как 32bit input module переделать в число с плавающей запятой, т.е. в REAL? Выше перечисленными методами не получается.
как DWORD разбить на два WORD?
В настройках Universal Modbus Device измените параметр Byte Sequence.
Нюанс - повлияет на все слэйвы в данном мастере.
Через точку должно работать dword.word0 и dword.word1 что-то в этом плане.