PDA

Просмотр полной версии : REAL побитово в UDINT



zaychenko
29.10.2024, 12:43
Всем добрый день!

Есть ли у кого-нибудь идеи, как можно REAL преобразовать в набор бит (UDINT с побитовым доступом или массив) средствами OwenLogic?

Задача состоит в передаче вещественного значения по RS-485 двумя разными запросами (требование на стороне slave-датчика). Т.е. сначала запись в младший регистр, а следующим запросом старший регистр.

В CS3.5 задача решается разными способами: через указатели, через UNION или с помощью блока библиотеки OwenCommunication.

kondor3000
29.10.2024, 13:13
Всем добрый день!

Есть ли у кого-нибудь идеи, как можно REAL преобразовать в набор бит (UDINT с побитовым доступом или массив) средствами OwenLogic?

Задача состоит в передаче вещественного значения по RS-485 двумя разными запросами (требование на стороне slave-датчика). Т.е. сначала запись в младший регистр, а следующим запросом старший регистр.

В CS3.5 задача решается разными способами: через указатели, через UNION или с помощью блока библиотеки OwenCommunication.

По моему вы запутались, что вам надо, если у вас слейв датчик, то вам надо читать 2 регистра и собрать из них REAL.
Зачем побитово вам понадобилось, не понятно.
Что у вас за датчик такой, где в него надо записывать, да ещё и раздельно регистры?

zaychenko
29.10.2024, 13:50
По моему вы запутались, что вам надо, если у вас слейв датчик, то вам надо читать 2 регистра и собрать из них REAL.
Зачем побитово вам понадобилось, не понятно.
Что у вас за датчик такой, где в него надо записывать, да ещё и раздельно регистры?

Все правильно написано. Датчик вакуума с погрешностью 0.05% ВПИ, которому периодически необходимо делать коррекцию нуля. Эта коррекция хранится в slave-памяти в формате REAL. Но условие для приема (применения) этой коррекции датчиком состоит именно в записи двумя разными запросами.

Уже есть реализация под CS3.5, а сейчас стоит задача повторить успех для устройств, программируемых в OwenLogic.

melky
29.10.2024, 13:53
Киньте в сетевую переменную для слейва, а потом с каждым регистром делайте что хотите. А тю блин, ОЛ такого фокуса наверное не пропустит...

Может пробовать на ST ?

kondor3000
29.10.2024, 14:52
Все правильно написано. Датчик вакуума с погрешностью 0.05% ВПИ, которому периодически необходимо делать коррекцию нуля. Эта коррекция хранится в slave-памяти в формате REAL. Но условие для приема (применения) этой коррекции датчиком состоит именно в записи двумя разными запросами.

Уже есть реализация под CS3.5, а сейчас стоит задача повторить успех для устройств, программируемых в OwenLogic.

Собрать REAL из 2 WORD можно, есть ФБ, выкладывал capzap. https://owen.ru/forum/showthread.php?t=37203&page=10#95
Как разобрать REAL на 2 WORD в Лоджике пока никто не придумал.

zaychenko
29.10.2024, 20:29
Собрать REAL из 2 WORD можно, есть ФБ, выкладывал capzap. https://owen.ru/forum/showthread.php?t=37203&page=10#95
Как разобрать REAL на 2 WORD в Лоджике пока никто не придумал.

В том то и дело, что собрать из набора бит REAL легко, а вот в для преобразования в обратную сторону, подозреваю, очевидные инструменты типа MemMove отсутствуют.

zaychenko
29.10.2024, 20:30
Киньте в сетевую переменную для слейва, а потом с каждым регистром делайте что хотите. А тю блин, ОЛ такого фокуса наверное не пропустит...

Может пробовать на ST ?

ОЛ ругается при добавлении каналов Modbus с пересекающимися адресами

melky
29.10.2024, 21:18
похоже без преобразований в word никак, а в ОЛ их просто нет.

zaychenko
31.10.2024, 15:13
Слейв на Rs-2 и датчик.
Они оба прицеплены к мастеру на Rs-1

Мастер шлет real в слейв на Rs-2 где по этом адресам живет udint
Забирает этот udint, режет по-питерски и отправляет в датчик

Как вариант) Но может не подойти в ситуации, когда нужен второй RS-485 или для устройств с одним RS-485 типа ИПП120.

Валенок
31.10.2024, 18:18
Все правильно написано. Датчик вакуума с погрешностью 0.05% ВПИ, которому периодически необходимо делать коррекцию нуля.
какой диапазон значений ожидаемых коррекций?

zaychenko
04.11.2024, 11:37
какой диапазон значений ожидаемых коррекций?

Рандомный диапазон, например до 5кПа с дискретностью 1 Па.

В датчике отправляемое значение коррекции применяется в зависимости от выбранных единиц измерения (bar, Па, кПа и т.д., что также задаются через целочисленный ID по modbus).

На данный момент решили реализовать запись коррекции в Па без дробной части, т.к. проще преобразовать в два Word в соответствии с IEEE 754.

zaychenko
05.11.2024, 00:16
Всем спасибо! Вопрос успешно решен для любого REAL, в том числе и с дробной частью. Все достаточно несложно преобразуется инструментами OwenLogic. Для реализации достаточно написать формулу преобразования REAL из 32-х бит на листочке и все станет ясно.
79826

melky
05.11.2024, 06:14
И где собственно решение? :)

EFrol
05.11.2024, 15:08
Как вариант real в udint в формате IEEE754:


function IEEE754_: udint;
var_input
VAL : real; // Входное значение
end_var

var
i : udint;
Sign : bool; // true - если значение отрицательное
Ret : real; // Вспомогательное
Mantissa : udint; // Мантисса
Exponent : udint; // Порядок
end_var

Mantissa := 0; Exponent := 0;
if VAL = 0 then return; end_if

if VAL < 0 then // Выделяем знак числа
Sign := true; Ret := -VAL;
else
Ret := VAL;
end_if

if Ret >= 2 then // Нормируем
while Ret >= 2 do
Ret := Ret / 2; Exponent := Exponent + 1;
end_while
else
while Ret < 1 do
Ret := Ret * 2; Exponent := Exponent - 1;
end_while
end_if

Ret := Ret - 1; // Вычисляем мантиссу
for i := 0 to 22 do
Mantissa := shl(Mantissa, 1); Ret := Ret * 2;
if Ret > 1 then Ret := Ret - 1; Mantissa.0 := true; end_if
end_for
Ret := Ret *2; if Ret > 1 then Mantissa := Mantissa + 1; end_if
Exponent := Exponent + 127; // Вычисляем порядок

IEEE754_.31 := Sign; // Формируем в виде udint
IEEE754_ := IEEE754_ + shl(Exponent, 23);
IEEE754_ := IEEE754_ + Mantissa;

end_function

kondor3000
05.11.2024, 15:57
Как вариант real в udint в формате IEEE754:


EFrol, ну ты прям молоток, у меня всё сошлось)))79846

Выкладываю преобразования REAL_TO_DWORD_TO_REAL и REAL_TO__2Word_To_REAL 80809

С помощью capzap ___ https://owen.ru/forum/showthread.php?t=37203&page=10#95
и EFrol_____ (формат IEEE754) https://owen.ru/forum/showthread.php?t=40405&p=450141&viewfull=1#post450141

Roossel
16.11.2025, 18:30
спасиибо за помощь, я про формат формат IEEE754 не знал. а на EFrol постоянно ругался, кстати по WIN7 компилятор ругается на всё подряд изза отсутствия библиотек.