Tools & Thoughts
Translations:
de
This page allows you to convert between the decimal representation of numbers (like «1.02») and the binary format used by all modern CPUs (IEEE 754 floating point).
Update
There has been an update in the way the number is displayed. Previous version would give you the represented value as a possibly rounded decimal number and the same number with the increased precision
of a 64-bit double precision float. Now the original number is shown (either as the number that was entered, or as a possibly rounded decimal string) as
well as the actual full precision decimal number that the float value is representing. Entering «0.1» is — as always — a nice example to see this behaviour. The difference between both values is shown as well,
so you can easier tell the difference between what you entered and what you get in IEEE-754.
This webpage is a tool to understand IEEE-754 floating point numbers. This is the format in which almost all CPUs represent non-integer numbers. As this format is using base-2,
there can be surprising differences in what numbers can be represented easily in decimal and which numbers can be represented in IEEE-754. As an example, try «0.1». The conversion is limited to 32-bit single precision numbers, while the
IEEE-754-Standard contains formats with increased precision.
-
Usage:
You can either convert a number by choosing its binary representation in the button-bar, the other fields will be updated immediately. Or you can enter a binary number, a hexnumber or the decimal representation into the corresponding textfield and press return to update
the other fields. To make it easier to spot eventual rounding errors, the selected float number is displayed after conversion to double precision. -
Special Values:
You can enter the words «Infinity», «-Infinity» or «NaN» to get the corresponding special values for IEEE-754. Please note there are two kinds of zero: +0 and -0.
-
Conversion:
The value of a IEEE-754 number is computed as:
sign 2exponent mantissa
The sign is stored in bit 32. The exponent can be computed from bits 24-31 by subtracting 127. The mantissa (also known as significand or fraction) is stored in bits 1-23.
An invisible leading bit (i.e. it is not actually stored) with value 1.0 is placed in front, then bit 23 has a value of 1/2, bit 22 has value 1/4 etc. As a result, the mantissa
has a value between 1.0 and 2. If the exponent reaches -127 (binary 00000000), the leading 1 is no longer used to enable gradual underflow. -
Underflow:
If the exponent has minimum value (all zero), special rules for denormalized values are followed. The exponent value is set to 2-126 and the «invisible» leading bit for the mantissa is no longer used.
The range of the mantissa is now [0:1).
Note: The converter used to show denormalized exponents as 2-127 and a denormalized mantissa range [0:2). This is effectively identical to the values above, with a factor of two shifted between exponent and mantissa.
However this confused people and was therefore changed (2015-09-26). -
Rounding errors:
Not every decimal number can be expressed exactly as a floating point number. This can be seen when entering «0.1» and examining its binary representation which is either slightly smaller or larger, depending on the last bit.
-
Other representations:
The hex representation is just the integer value of the bitstring printed as hex. Don’t confuse this with true hexadecimal floating point values in the style of 0xab.12ef.
-
FAQ (Frequently Asked Questions):
-
Can you send me the source code? I need to convert format x to format y.:
This source code for this converter doesn’t contain any low level conversion routines. The conversion between a floating point number (i.e. a 32 bit area in memory) and the bit representation isn’t actually a conversion, but just a reinterpretation of the same data in memory. This can be easily done with typecasts in C/C++ or with some bitfiddling via java.lang.Float.floatToIntBits in Java. The conversion between a string containing the textual form of a floating point number (e.g. «3.14159», a string of 7 characters) and a 32 bit floating point number is also performed by library routines. If you need to write such a routine yourself, you should have a look at the sourecode of a standard C library (e.g. GNU libc, uclibc or the FreeBSD C library — please have a look at the licenses before copying the code) — be aware, these conversions can be complicated.
-
Can you add support for 64-bit float/16-bit float/non-IEEE 754 float?.:
This page relies on existing conversion routines, so formats not usually supported in standard libraries cannot be supported with reasonable effort.
Double-precision (64-bit) floats would work, but this too is some work to support alongside single precision floats.
As the primary purpose of this site is to support people learning about these formats, supporting other formats is not really a priority. -
I’ve converted a number to floating point by hand/some other method, and I get a different result. Your converter is wrong!
Possible, but unlikely. The conversion routines are pretty accurate (see above). Until now, checking the results always proved the other conversion less accurate.
First, consider what «correct» means in this context — unless the conversion has no rounding error, there are two reasonable results, one slightly smaller the entered value and one slightly bigger.
The best result is usually the one closer to the value that was entered, so you should check for that.
Please check the actual represented value (second text line) and compare the difference to the expected decimal value while toggling the last bits.
-
Note: If you find any problems, please report them here.
Где это встречается?
Большинство программистов в наше время пишут код без понятия, что происходит там «под капотом», банально как хранятся в памяти те или иные типы переменных и у них это не вызывает никаких проблем. А что будет, если оставить только базовые операторы?
Дано: некий измерительный преобразователь отправляет float по протоколу modbus в виде двух регистров word, мы их получаем на ПЛК.
Задача: полученные два слова сконвертировать обратно в float.
Float по стандарту IEE754
Стандарт IEE754 определяет как представлять отрицательные и положительные числа с плавающей точкой. Множество статей в интернете описывает тонкости это стандарта с приложенными математическими формулами и подробным описаниям.
Самое главное, что нам нужно знать из этого стандарта:
- float это 32 бита
- где 1-й бит — знак, следующие 8 — порядок, последние 23 — мантисса
- зная эти данные и подставив их в формулу можно получить искомое значение
Как обычно это решается?
Обычно это решается быстро и легко через указатели или через встроенные функции конвертации. Что в принципе не требует знаний о стандарте.
Я же за неимением онного использовал битовые операции.
Решение с помощью битовых операций
Зная формат, несложно получить знак, порядок и мантиссу из битового представления числа. Делается это с помощью нескольких битовых масок. Затем полученные числа подставляются в формулу и вычисляется результат.
PROGRAM PLC_PRG
VAR real_dword, sign, mant, expb, bmask1, bmask2, bmask3: DWORD;
word1_input, word2_input: WORD;
float_output, signf, expf: REAL;
mantf: REAL;
END_VAR
word1_input := 11047;
word2_input := 16964;
bmask1 := 16#FF;
bmask2 := 16#7FFFFF;
bmask3 := 16#800000;
(* Складываем два слова в одно двойное *)
real_dword := SHL(WORD_TO_DWORD(word2_input), 16) + WORD_TO_DWORD(word1_input);
(* Находим знак *)
sign := SHR(real_dword, 31);
IF sign > dword#0 THEN
signf := -1.0;
ELSE
signf := 1.0;
END_IF;
(* Находим порядок *)
expb := SHR(real_dword, 23) AND bmask1;
(* Находим мантиссу *)
IF(expb <> dword#0 ) THEN
mant := (real_dword AND bmask2) OR bmask3;
ELSE
mant := SHL((real_dword AND bmask2), 1);
END_IF;
(* Подставляем полученные данные в формулу *)
mantf := (DWORD_TO_REAL(mant)) * (EXPT(REAL#2.0, DINT#-23));
expf := expt(real#2.0 , dword_to_dint(expb - dword#127));
float_output := signf * expf * mantf;
Этот код немного отличается от изначального, который я писал для AXC 1050 в PC Worx, из-за невозможности протестировать его на сегодняшний день нигде кроме эмулятора в CodeSys.
Это несущественно, разница лишь в способе объявления переменных
Чем можно проверить свое решение
Пока гуглил все эти стандарты и способы решений, нашел один интересный Excel документ от Schneider Electric. С его помощью вы можете быстро проверить свое решение.
Javascript Online Compiler
Write, Run & Share Javascript code online using OneCompiler’s JS online compiler for free. It’s one of the robust, feature-rich online compilers for Javascript language. Getting started with the OneCompiler’s Javascript editor is easy and fast. The editor shows sample boilerplate code when you choose language as Javascript and start coding.
About Javascript
Javascript(JS) is a object-oriented programming language which adhere to ECMA Script Standards. Javascript is required to design the behaviour of the web pages.
Key Features
- Open-source
- Just-in-time compiled language
- Embedded along with HTML and makes web pages alive
- Originally named as LiveScript.
- Executable in both browser and server which has Javascript engines like V8(chrome), SpiderMonkey(Firefox) etc.
Syntax help
variable declaration
Keyword | Description | Scope |
---|---|---|
var | Var is used to declare variables(old way of declaring variables) | Function or global scope |
let | let is also used to declare variables(new way) | Global or block Scope |
const | const is used to declare const values. Once the value is assigned, it can not be modified | Global or block Scope |
Backtick Strings
Interpolation
let greetings = `Hello ${name}`
Multi line Strings
const msg = `
hello
world!
`
Arrays
An array is a collection of items or values.
Syntax:
let arrayName = [value1, value2,..etc];
// or
let arrayName = new Array("value1","value2",..etc);
Example:
let mobiles = ["iPhone", "Samsung", "Pixel"];
// accessing an array
console.log(mobiles[0]);
// changing an array element
mobiles[3] = "Nokia";
Arrow functions
Arrow Functions helps developers to write code in concise way, it’s introduced in ES6.
Arrow functions can be written in multiple ways. Below are couple of ways to use arrow function but it can be written in many other ways as well.
Syntax:
() => expression
Example:
const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
const squaresOfEvenNumbers = numbers.filter(ele => ele % 2 == 0)
.map(ele => ele ** 2);
console.log(squaresOfEvenNumbers);
De-structuring
Arrays
let [firstName, lastName] = ['Foo', 'Bar']
Objects
let {firstName, lastName} = {
firstName: 'Foo',
lastName: 'Bar'
}
rest(…) operator
const {
title,
firstName,
lastName,
...rest
} = record;
Spread(…) operator
//Object spread
const post = {
...options,
type: "new"
}
//array spread
const users = [
...adminUsers,
...normalUsers
]
Functions
function greetings({ name = 'Foo' } = {}) { //Defaulting name to Foo
console.log(`Hello ${name}!`);
}
greet() // Hello Foo
greet({ name: 'Bar' }) // Hi Bar
Loops
1. If:
IF is used to execute a block of code based on a condition.
Syntax
if(condition){
// code
}
2. If-Else:
Else part is used to execute the block of code when the condition fails.
Syntax
if(condition){
// code
} else {
// code
}
3. Switch:
Switch is used to replace nested If-Else statements.
Syntax
switch(condition){
case 'value1' :
//code
[break;]
case 'value2' :
//code
[break;]
.......
default :
//code
[break;]
}
4. For
For loop is used to iterate a set of statements based on a condition.
for(Initialization; Condition; Increment/decrement){
//code
}
5. While
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while (condition) {
// code
}
6. Do-While
Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.
do {
// code
} while (condition);
Classes
ES6 introduced classes along with OOPS concepts in JS. Class is similar to a function which you can think like kind of template which will get called when ever you initialize class.
Syntax:
class className {
constructor() { ... } //Mandatory Class method
method1() { ... }
method2() { ... }
...
}
Example:
class Mobile {
constructor(model) {
this.name = model;
}
}
mbl = new Mobile("iPhone");
Введите число в десятичной записи. | ||
Decimal: |
+ | 0 | . | 875 | * 10^0 |
Учитываем порядок
С учетом порядка: x = + 0.875
Нормализация
Нормализуем мантиссу (приведем к виду 1.xxx…x * 2^exp)
Шаг | Мантисса | * 2^двоичный порядок |
0 | 0.875 | * 2^0 |
1 | 1.75 | * 2^-1 |
x = +1.75 * 2^-1
Перевод в двоичный вид
Переводим нормализованную мантиссу в двоичный вид (p = 23)
Шаг i | Двоичная мантисса | остаток * 2^-i |
0 | 1. | + 0.75 * 2^-0 |
1 | 1.1 | + 0.5 * 2^-1 |
2 | 1.11 | + 0.0 * 2^-2 |
3 | 1.110 | + 0.0 * 2^-3 |
4 | 1.1100 | + 0.0 * 2^-4 |
5 | 1.11000 | + 0.0 * 2^-5 |
6 | 1.110000 | + 0.0 * 2^-6 |
7 | 1.1100000 | + 0.0 * 2^-7 |
8 | 1.11000000 | + 0.0 * 2^-8 |
9 | 1.110000000 | + 0.0 * 2^-9 |
10 | 1.1100000000 | + 0.0 * 2^-10 |
11 | 1.11000000000 | + 0.0 * 2^-11 |
12 | 1.110000000000 | + 0.0 * 2^-12 |
13 | 1.1100000000000 | + 0.0 * 2^-13 |
14 | 1.11000000000000 | + 0.0 * 2^-14 |
15 | 1.110000000000000 | + 0.0 * 2^-15 |
16 | 1.1100000000000000 | + 0.0 * 2^-16 |
17 | 1.11000000000000000 | + 0.0 * 2^-17 |
18 | 1.110000000000000000 | + 0.0 * 2^-18 |
19 | 1.1100000000000000000 | + 0.0 * 2^-19 |
20 | 1.11000000000000000000 | + 0.0 * 2^-20 |
21 | 1.110000000000000000000 | + 0.0 * 2^-21 |
22 | 1.1100000000000000000000 | + 0.0 * 2^-22 |
23 | 1.11000000000000000000000 | + 0.0 * 2^-23 |
Округление (ieee-754)
Шаг | Мантисса | Бит p + 1 (=24) | Остаток (sticky) |
24 | 1.11000000000000000000000 | 0 | 0.0 * 2^-24 |
Остаток = 0
Результат
Экспонента со смещением: -1 + 127 = 126
Знак | Смещенный порядок (e + 127) | Дробная часть мантиссы |
0 | 01111110 | 11000000000000000000000 |
x = 0x3f600000
Проверка
3f600000
-
Pavel_17
Word to float
Здравствуйте, скажите, есть такая проблема, с частотника 312 получаем данные типа Word, необходимо перевести в число с плавающей запятой.
-
admin
- Администратор
- Сообщения: 578
- Зарегистрирован: 05 сен 2010, 00:51
Re: Word to float
Сообщение
admin » 12 фев 2015, 12:14
В устройстве данные лежат в каком формате (Word или Float) ?
Размер Float 4 байта или 8 байт ?
-
admin
- Администратор
- Сообщения: 578
- Зарегистрирован: 05 сен 2010, 00:51
Re: Word to float
Сообщение
admin » 12 фев 2015, 13:48
Это настраивается в SCADA системе.
SCADA при подключении указывает к какому типу преобразовать значение.
Сервер выполняет это преобразование, если возможно.
-
Pavel_17
Word to float
Сообщение
Pavel_17 » 12 фев 2015, 13:57
Мы выбрали Simple Scada, а она с урезанным функционалом, не получится такое сделать. А в самом Lectus преобразование можно сделать? Спасибо
-
admin
- Администратор
- Сообщения: 578
- Зарегистрирован: 05 сен 2010, 00:51
Re: Word to float
Сообщение
admin » 12 фев 2015, 14:35
Можно с использованием составной переменной.
В скрипте которой произвести простое присвоение значения Modbus переменной.
-
TEC-3
- Сообщения: 5
- Зарегистрирован: 26 дек 2016, 10:39
Re: Word to float
Сообщение
TEC-3 » 26 дек 2016, 10:42
Скажите пожалуйста каким образом сделать это присвоение? у меня есть два числа 17421 и 49152, каждый из них word 2 байта, их нужно собрать что бы получить float 4 байта, на выходе должно получиться 567. Как это сделать в составной переменной скажите пожалуйста, я давно не могу решить эту проблему! Заранее благодарен!
-
admin
- Администратор
- Сообщения: 578
- Зарегистрирован: 05 сен 2010, 00:51
Re: Word to float
Сообщение
admin » 26 дек 2016, 11:15
1) Не нужно использовать составную переменную
2) Используйте типизированную Modbus переменную типа Single Float.
Пробуйте разный порядок байт (4 варианта). Задается в дополнительных свойствах узла.
Скорее всего нужно установить старшим байтом вперед и установить старшим регистром вперед.
-
TEC-3
- Сообщения: 5
- Зарегистрирован: 26 дек 2016, 10:39
Re: Word to float
Сообщение
TEC-3 » 26 дек 2016, 11:47
Понимаете, LECTUS каждую созданную переменную связывает только с одной переменной. В моем случае, нужно брать две переменные т.е. два слова word и объединять во float. Значит нужно создать две переменной в лектусе, каждая из них принимает по одному word`у, и создать третью переменную составную, которая будет брать значения из двух переменных и совмещать их во float.
-
TEC-3
- Сообщения: 5
- Зарегистрирован: 26 дек 2016, 10:39
Re: Word to float
Сообщение
TEC-3 » 26 дек 2016, 11:57
Первая переменная Item1 принимает значение 17421, вторая переменная Item2 принимает значение 49152, нужно создать третью составную переменную Item3 которая берет значения Item1 и Item2 и объединяет во float 4 байта. На делфи я написал так работает. Но лектус не понимает такой синтаксис, ему надо написать через разрядные сдвиги >> <<.
var
a,b:Word; //Исходные данные, 2 ячейки по 2 байта
c:Single; //Результирующая ячейка, действительное число 4 байта
d:^Cardinal; //Указатель на целочисленную 4х байтовую переменную
begin
a:=64; //Для примера
b:=16440;
d:=@c; // Присваиваем целочисленной 4х байтовой переменной тот же адрес что и действительной
d^:=MakeLong(a,b); // Объединяем 2 слова в одно 4х байтовое
Caption:=FloatToStr(c); // Получаем результат 2.875015259
end
- Обязательно представиться на русском языке кириллицей (заполнить поле «Имя»).
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему — вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома — бан без предупреждения.
- Рекламу и частные объявления «куплю/продам/есть халтура» мы не размещаем ни на каких условиях.
- Перед тем как что-то написать — читать здесь и здесь.
-
RoninX
- здесь недавно
- Сообщения: 8
- Зарегистрирован: 08 авг 2018, 21:27
- Имя: Павел
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 3 раза
Склеить два Word и получить Real
Сообщение
RoninX » 08 авг 2018, 21:46
Здравствуйте!
Измеритель выдает значение влажности в формате Real IEEE754 двумя Word. Связь с измерителем по интерфейсу RS485 Modbus RTU. Контроллер S7-1200. Как в TIA portal преобразовать эти два регистра WORD в REAL? (CD AB). На контроллерах Овен задача решается путем создания типа FLoat в списке регистров Модбас и контроллер сам преобразовывает два регистра в Реал. Как данная задача решается в tia portal v4.2?
-
pkl58
- не первый раз у нас
- Сообщения: 347
- Зарегистрирован: 19 мар 2012, 20:04
- Имя: Павел
- Страна: Россия
- Благодарил (а): 5 раз
- Поблагодарили: 43 раза
Склеить два Word и получить Real
Сообщение
pkl58 » 09 авг 2018, 12:41
Как у Сименса не знаю. Но в общем случае есть команды преобразования целых чисел в вещественные. Возможно потребуется поменять местами исходные WORD.
-
NewOrdered
- осмотрелся
- Сообщения: 153
- Зарегистрирован: 24 янв 2018, 11:18
- Имя: Антон
- Страна: Россия
- город/регион: Калининград
- Благодарил (а): 25 раз
- Поблагодарили: 25 раз
Склеить два Word и получить Real
Сообщение
NewOrdered » 09 авг 2018, 13:49
RoninX писал(а): ↑08 авг 2018, 21:46
Здравствуйте!Измеритель выдает значение влажности в формате Real IEEE754 двумя Word. Связь с измерителем по интерфейсу RS485 Modbus RTU. Контроллер S7-1200. Как в TIA portal преобразовать эти два регистра WORD в REAL? (CD AB). На контроллерах Овен задача решается путем создания типа FLoat в списке регистров Модбас и контроллер сам преобразовывает два регистра в Реал. Как данная задача решается в tia portal v4.2?
Определите область памяти длиной 4 байта как REAL. В первые два байта загрузите 1 слово, во вторые — второе слово. Далее работайте с вашим значением в формате REAL.
-
RoninX
- здесь недавно
- Сообщения: 8
- Зарегистрирован: 08 авг 2018, 21:27
- Имя: Павел
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 3 раза
Склеить два Word и получить Real
Сообщение
RoninX » 14 авг 2018, 10:30
NewOrdered писал(а): ↑09 авг 2018, 13:49
Определите область памяти длиной 4 байта как REAL. В первые два байта загрузите 1 слово, во вторые — второе слово. Далее работайте с вашим значением в формате REAL.
Добрый день! Получилось, спасибо!
-
djonm
- новенький
- Сообщения: 1
- Зарегистрирован: 07 фев 2018, 15:04
- Имя: Евгений
- город/регион: Ростов
Склеить два Word и получить Real
Сообщение
djonm » 22 авг 2018, 13:53
RoninX писал(а): ↑14 авг 2018, 10:30
Добрый день! Получилось, спасибо!
У меня похожая задача и что то не фига не получается. По modbus читаю значение измеренного напряжения float32 (real). MB_Master читает в переменную REAL, но значение получаются совсем левые. Может надо читать Word- дами а потом переставлять биты и конвертировать в REAL?
-
petr2off
- эксперт
- Сообщения: 1356
- Зарегистрирован: 06 янв 2016, 19:45
- Имя: Петров В.Л.
- Страна: Россия
- город/регион: Красноярск
- Благодарил (а): 56 раз
- Поблагодарили: 139 раз
Склеить два Word и получить Real
Сообщение
petr2off » 22 авг 2018, 16:33
Какая разница как читать, Вы уже считали 4 байта. К этой области памяти можно обратится как 4-х байтовому полю, как к 2 16-ти битовым словам и как к 4 байтовым адресам. А еще добавляя точку можно и к битам обратится. Как вариант поменяйте слова местами. Очень часто при чтении Modbas 16 разрядные слова не в том порядке принимаются.
-
RoninX
- здесь недавно
- Сообщения: 8
- Зарегистрирован: 08 авг 2018, 21:27
- Имя: Павел
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 3 раза
Склеить два Word и получить Real
Сообщение
RoninX » 24 дек 2018, 14:44
[/quote] У меня похожая задача и что то не фига не получается. По modbus читаю значение измеренного напряжения float32 (real). MB_Master читает в переменную REAL, но значение получаются совсем левые. Может надо читать Word- дами а потом переставлять биты и конвертировать в REAL?
[/quote]
Попробуйте применить функцию SWAP
-
Serg_G
- здесь недавно
- Сообщения: 59
- Зарегистрирован: 04 авг 2018, 07:02
- Имя: Сергей
- Благодарил (а): 8 раз
- Поблагодарили: 2 раза
Склеить два Word и получить Real
Сообщение
Serg_G » 21 янв 2019, 18:45
Попробуйте так. В классике это работало. Только надо правильно выбрать байты из слова.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Вернуться в «Simatic TIA Portal»
Перейти
- Работа форума
- База знаний (Knowledge Exchange)
- ↳ Eplan Electric P8
- ↳ Общий F.A.Q.
- ↳ Общие вопросы
- ↳ Новости
- ↳ Ошибки
- ↳ Проект
- ↳ Изделия
- ↳ Устройства
- ↳ Соединения
- ↳ Кабели
- ↳ Клеммы
- ↳ ПЛК
- ↳ Компоновка 2D
- ↳ Макросы
- ↳ Eplan API
- ↳ Сценарии (Только готовые решения)
- ↳ Внешняя обработка
- ↳ ProPanel
- ↳ Инструкции ProPanel (Только готовые решения)
- ↳ Прочие направления Eplan
- ↳ FieldSys (Топология)
- ↳ Preplanning
- ↳ Harness proD
- ↳ EEC One
- ↳ Advantech
- ↳ F.A.Q., Инструкции
- ↳ Allen Bradley
- ↳ Общие вопросы
- ↳ ПЛК
- ↳ Операторские панели
- ↳ B&R Automation
- ↳ F.A.Q.
- ↳ Danfoss
- ↳ DEIF A/S
- ↳ Общие вопросы
- ↳ UNI-LINE
- ↳ MULTI-LINE
- ↳ MULTI-LINE 300
- ↳ Emerson
- ↳ Общие вопросы
- ↳ КИП и регуляторы
- ↳ DeltaV
- ↳ ОВЕН
- ↳ Прософт-Системы
- ↳ Общие вопросы
- ↳ ПЛК REGUL
- ↳ Schneider Electric
- ↳ Общие вопросы
- ↳ ПЛК
- ↳ Панели оператора
- ↳ SCADA
- ↳ Электротехника
- ↳ Приводная техника
- ↳ SIEMENS
- ↳ Общие вопросы
- ↳ LOGO!
- ↳ ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
- ↳ Simatic Step7
- ↳ Simatic TIA Portal
- ↳ Simatic PCS 7
- ↳ Операторские панели
- ↳ WinCC
- ↳ Приводная техника (Sinamics, Micromaster, Masterdrive, Simoreg, Simotics)
- ↳ SmartGen
- ↳ Общие вопросы
- ↳ Промышленные (береговые) контроллеры
- ↳ Морские контроллеры и устройства
- ↳ WEINTEK (операторские панели)
- ↳ F.A.Q., Инструкции
- ↳ Архив
- ↳ Микроконтроллеры и электроника
- ↳ Arduino
- ↳ Raspberry
- ↳ Другие микроконтроллеры
- ↳ Электроника
- Общие вопросы АСУТП
- ↳ Общие вопросы
- ↳ Вопросы от студентов
- ↳ Литература
- ↳ Новости и отчётность
- ↳ Нормативы, ГОСТы, стандарты
- ↳ Информационная безопасность
- ↳ Проектирование и САПР
- ↳ Системная интеграция
- ↳ Разбор полетов
- ↳ Работа
- ↳ Заготовки для базы знаний
- ↳ Производство и технология
- ↳ MES — Системы автоматизации управления производством
- ↳ Метрология, КИП и датчики
- ↳ Исполнительные устройства, регуляторы
- ↳ Средний уровень автоматизации (управляющий)
- ↳ Алгоритмы
- ↳ Операторские панели
- ↳ Верхний уровень автоматизации (отображение)
- ↳ GE iFix
- ↳ Wonderware Intouch
- ↳ MasterScada
- ↳ SCADA+
- ↳ Альфа платформа
- ↳ Интерфейсы, протоколы, связь
- ↳ Радиосвязь
- ↳ Полезное ПО
- ↳ Электротехника, энергетика и электропривод
- ↳ Генераторы, электростанции и силовые агрегаты
- ↳ Теплотехника
- ↳ Подбор аналогов
- F.A.Q. (краткая выжимка из некоторых сообщений форума)
- ↳ Документация (вариант 1)
- ↳ Документация (вариант 2)
- ↳ Электротехника и электроэнергетика
- ↳ F.A.Q. по программируемым логическим контроллерам (PLC)
- ↳ Обсуждение F.A.Q. по PLC
- ↳ F.A.Q. по выбору PLC
- ↳ F.A.Q. по аппаратной части PLC
- ↳ F.A.Q. по языкам программирования
- ↳ F.A.Q. по структуре программ
- ↳ F.A.Q. по взаимодействию PLC с HMI
- О жизни
- ↳ Для дома, для семьи
- ↳ Комната смеха
- ↳ Электродвижение
32 bit – float
64 bit – double
{{base.name|ucFirst}} ({{base.explanation}})
Decimal
32 bit – float
Decimal (exact)
Binary
Hexadecimal
64 bit – double
Decimal (exact)
Binary
Hexadecimal
Два слова в флоат
-
Knskey
- Сообщения: 9
- Зарегистрирован: 24 мар 2018, 18:42
Два слова в флоат
Считываю по модбас. На внешнем устройстве данные хранятся как float. Я считываю два слова. -13756 и 16820. Каким образом преобразовать полученное в float? Получиться должно порядка 22,…. Я понимаю что там 1 бит это видимо знак. Потом 7 бит экспонента и 24 бита мантисса. Так? Но как мне получить в итоге float? Есть ли функция и т.п.
К гуглу просьба не отсылать. Гугл отослал сюда.
-
Ryzhij
- Сообщения: 1026
- Зарегистрирован: 26 авг 2012, 19:25
- Откуда: Россия Рязань
Re: Два слова в флоат
Сообщение
Ryzhij » 27 мар 2018, 05:13
Начнём с того, что существует несколько форматов представления числа с плавающей запятой. Если форматы для внешнего устройства и для ПЛК совпадают, то всё просто — считанное укладываем в ячейки памяти с учётом свопинга, а потом адресуемся к содержимому получившегося массива, как к числу в формате с плавающей запятой, используя младший адрес группы ячеек.
Если форматы не совпадают, то преобразовываем. И да, тут нам понадобится Гугл
__________________________
Помощь — понятие растяжимое, всяк трактует его в меру своего эгоизма…
-
tvent
- Сообщения: 971
- Зарегистрирован: 11 янв 2011, 17:02
Re: Два слова в флоат
Сообщение
tvent » 27 мар 2018, 06:00
Knskey писал(а):
К гуглу просьба не отсылать. Гугл отослал сюда.
Правильно отослал.
Команда XCH ставит слова числа в правильной последовательности.
Далее. Есть формат с десятичной плавающей точкой, а есть двоичной. Обычно формат указывается в описании регистров устройства, с которого читаются данные.
Косвенно это можно определить по значению чисел в HEX формате. Если их значения не больше 9 — то, скорее всего, это десятичный формат.
Ну и про разрядность преобразования.
Число 1.2345 Float преобразуется DINT в 1, 12.3456 — в 12, а 0,1234 — в 0.
В ISP и WPL результат будет одинаков.
Проблема решается предварительным умножением числа на константу (масштаб).
DMOVR 1000,0 D0
DEMUL D0 D2 D4
DINT D4 D6
Если D2 = 0.0234, то в D6 будет 23
-
Knskey
- Сообщения: 9
- Зарегистрирован: 24 мар 2018, 18:42
Re: Два слова в флоат
Сообщение
Knskey » 27 мар 2018, 07:55
Ryzhij писал(а):Начнём с того, что существует несколько форматов представления числа с плавающей запятой. Если форматы для внешнего устройства и для ПЛК совпадают, то всё просто — считанное укладываем в ячейки памяти с учётом свопинга, а потом адресуемся к содержимому получившегося массива, как к числу в формате с плавающей запятой, используя младший адрес группы ячеек.
Если форматы не совпадают, то преобразовываем. И да, тут нам понадобится Гугл
А можно поподробнее. Ну т.е как это сделать. Если я адресуюсь как к флоат то просто добавляется запятая и два нуля. Проще говоря, если я смотрю модсканом каким нибудь то если читаю как слова то вижу такие же числа. Если же читаю как флоат32 то читает правильное число флоат 22,… Как это сделать в дельта. Можно только не образно пожалуйста. То что тут все умные я понял и не выражаю сомнений. Рассчитываю просто на помощь.) спасибо за понимание.
-
Ryzhij
- Сообщения: 1026
- Зарегистрирован: 26 авг 2012, 19:25
- Откуда: Россия Рязань
Re: Два слова в флоат
Сообщение
Ryzhij » 27 мар 2018, 11:09
Коллега, если Вы ждёте конкретного ответа, то потрудитесь сформулировать конкретный вопрос.
Итак, что нам известно?
1. Вам известен формат представления числа в приборе? Вы его установили? Какой он, этот формат?
2. Этот формат совпадает с принятым в Дельта?
3. У Вас есть трудности с тем, чтобы принять из прибора и уложить принятое число в регистры Дельта?
4. У Вас трудности с преобразованием форматов?
5. В какой формат и зачем Вам надо преобразовать полученное из прибора число?
Кого тут на форуме нет, так это экстрасенсов.
__________________________
Помощь — понятие растяжимое, всяк трактует его в меру своего эгоизма…
-
Knskey
- Сообщения: 9
- Зарегистрирован: 24 мар 2018, 18:42
Re: Два слова в флоат
Сообщение
Knskey » 27 мар 2018, 13:09
1. Формат представления числа — флоатинг пойнт 32 бита.
2. В дельта я читаю два слова по 16 бит соответственно.
3. Трудностей принять 32 бита из прибора нет. Укладываю их в дельта тоже в два последовательных слова.
4. Возможно. Я хочу моих два слова последовательных прочитать как флоат 32. И чтобы на выходе было число с плавающей точкой а не перевод дворда путем добавления к нему запятой и нулей после неё.
5. В формат флоат 32 мне надо. А у меня выходит только два слова и одно двойное.
В приборе температура. Порядка 22,5 градусов. Если её читать как слова то выходит два числа как я описал в самом начале. Такие же числа и в модбас сканер любом. Но там есть и возможность прочитать и как дворд и как флоат 32. И когда модсканом я читаю как флоат 32 то он нормально считывает и я вижу 22,5 условно. Как мне этого же добиться в дельта.
Функцией ХСН как я понимаю могу просто поменять два слова местами. Но это мне ничего же не даст. Мне надо прочитать два слова как флоат а не как два слова или как дворд.
-
Knskey
- Сообщения: 9
- Зарегистрирован: 24 мар 2018, 18:42
Re: Два слова в флоат
Сообщение
Knskey » 27 мар 2018, 14:24
tvent писал(а):Дельта хранит Float в нормализованном виде. То есть ваши 22.5 будут 0.225х10^2
Прошу прощения. Что мне нужно умножить на 100? У меня два числа больших в вордах. Если я буду представлять их как флоат. То у меня просто добавляется запятая и все.
Не знаю как ещё спросить.) вверху ответил на уточняющие вопросы.
-
Ryzhij
- Сообщения: 1026
- Зарегистрирован: 26 авг 2012, 19:25
- Откуда: Россия Рязань
Re: Два слова в флоат
Сообщение
Ryzhij » 27 мар 2018, 14:25
Взгляните на 3-й пример к инструкции FLT / DFLT (API-49) в руководстве DELTA_IA-PLC_DVP-ES2-EX2-SS2-SA2-SX2-SE-TP_PM_EN_20170426.pdf начиная с 216 страницы файла.
Там как раз пример преобразования форматов описан. В том числе из плавающей двоичной точки в плавающую десятичную (наоборот легко и самому сообразить будет).
Для 32-разрядных чисел надо будет использовать 32-разрядную форму инструкции DFLT.
__________________________
Помощь — понятие растяжимое, всяк трактует его в меру своего эгоизма…
-
Knskey
- Сообщения: 9
- Зарегистрирован: 24 мар 2018, 18:42
Re: Два слова в флоат
Сообщение
Knskey » 27 мар 2018, 14:40
Рассматривал я этот пример. Но честно говоря не совсем понял что там делают.. В основном на втором шаге.