УкраїнськаEnglishmRussian
Вход/Новый
В теме много сообщений

modbus и числа с плавающей точкой


Автор Сообщение
Сообщение создано: 08. 05. 2009 [19:49]
linuxoid
Андрей Никифоров
Создатель темы
Зарегистрирован(а) с: 29.04.2009
Сообщения: 4
Разрабатываю устройство с интерфейсом RS485 и доступом по протоколу Modbus/RTU.
Планируется что устройство помимо целочисленных данных должно выдавать числа
с плавающей точкой. Для этого можно задействовать 2 соседних 16 битных регистра.
Но возник вопрос как заставить openscada интерпретировать пару соседних регистров
например
R:40000:r:var0:Var0
R:40001:r:var1:Var1
как вещественное число.
Сообщение создано: 11. 05. 2009 [10:01]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
Пока никак. Думаю в течении пары дней добавлю функции пользовательского API для разделения на слова и объединения из слов в float.

Learn, learn and learn better than work, work and work.
Сообщение создано: 15. 05. 2009 [18:06]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
Добавил: http://wiki.oscada.org.ua/Doc/FLibSYS?v=kaz#h378-40

Learn, learn and learn better than work, work and work.
Сообщение создано: 18. 05. 2009 [10:53]
linuxoid
Андрей Никифоров
Создатель темы
Зарегистрирован(а) с: 29.04.2009
Сообщения: 4
Хорошо.
Сообщение создано: 18. 05. 2009 [13:31]
linuxoid
Андрей Никифоров
Создатель темы
Зарегистрирован(а) с: 29.04.2009
Сообщения: 4
Попробовал. Но результат неверный.
В комментариях написано "Merge float (8 byte) from words (4 byte).". Как это следует трактовать?
входные параметры функции целые 2х байтные или 4х байтные и какой размер у результата?

если смотреть исодный код
void calc( TValFunc *val )
{
float vl;
*((ui16*)&vl) = val->getI(1);
*(((ui16*)&vl)+1) = val->getI(2);
val->setR(0,vl);
}
то результат 4 байта, а входные данные 2х байтные

код функции контроллера модуля javalikecalc:
res=Special.FLibSYS.floatMergeWord(ModBus.IcpCon.1.var2, ModBus.IcpCon.1.var3);

ModBus.IcpCon.1.var2 и ModBus.IcpCon.1.var3 регистры устройства modbus

на входе числа: var2=62915 var3=16456 (передается число 3.14)
результат res=-2.94399269478163e-05

[Сообщение редактировалось 1 раз(а), в последний раз 18.05.2009 в 13:32.]
Сообщение создано: 18. 05. 2009 [14:31]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
linuxoid wrote:

Попробовал. Но результат неверный.
В комментариях написано "Merge float (8 byte) from words (4 byte).". Как это следует трактовать?
входные параметры функции целые 2х байтные или 4х байтные и какой размер у результата?

Просто ошибся в описании. Имеется в виду Merge float (4 byte) from words (2 byte).

linuxoid wrote:

код функции контроллера модуля javalikecalc:
res=Special.FLibSYS.floatMergeWord(ModBus.IcpCon.1.var2, ModBus.IcpCon.1.var3);

ModBus.IcpCon.1.var2 и ModBus.IcpCon.1.var3 регистры устройства modbus

на входе числа: var2=62915 var3=16456 (передается число 3.14)
результат res=-2.94399269478163e-05

А в тесте работает:
w1=62915;
w2=16456;
rez=3.14;

И в коде работает:
test = Special.FLibSYS.floatMergeWord(62915,16456);
3.14

Learn, learn and learn better than work, work and work.
Сообщение создано: 18. 05. 2009 [20:14]
linuxoid
Андрей Никифоров
Создатель темы
Зарегистрирован(а) с: 29.04.2009
Сообщения: 4
Проверил на одноядерной системе - работает.
Какие-то проблемы с 2х ядерной конфигурацией. Это уже не первая ошибка.
Буду разбираться.
Сообщение создано: 18. 05. 2009 [22:24]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
AMD 64 x2 - всегда считается нормально.

Learn, learn and learn better than work, work and work.
Сообщение создано: 03. 08. 2009 [17:34]
Unaie
Unai Ezta
Зарегистрирован(а) с: 30.06.2009
Сообщения: 42
roman wrote:

linuxoid wrote:

Попробовал. Но результат неверный.
В комментариях написано "Merge float (8 byte) from words (4 byte).". Как это следует трактовать?
входные параметры функции целые 2х байтные или 4х байтные и какой размер у результата?

Просто ошибся в описании. Имеется в виду Merge float (4 byte) from words (2 byte).

linuxoid wrote:

код функции контроллера модуля javalikecalc:
res=Special.FLibSYS.floatMergeWord(ModBus.IcpCon.1.var2, ModBus.IcpCon.1.var3);

ModBus.IcpCon.1.var2 и ModBus.IcpCon.1.var3 регистры устройства modbus

на входе числа: var2=62915 var3=16456 (передается число 3.14)
результат res=-2.94399269478163e-05

А в тесте работает:
w1=62915;
w2=16456;
rez=3.14;

И в коде работает:
test = Special.FLibSYS.floatMergeWord(62915,16456);
3.14



Привет, это не так для меня, я получаю это:
(Hi, this is not right for me, I get this)

v=Special.FLibSYS.floatMergeWord(62915,16456);
v=>-2.90823e-05

v=3.14;
Special.FLibSYS.floatSplitWord(v,a,b);
=>
a=20240
b=16456

Прежде с Oscada 0.6.3.3 и Fedora 11.
Ниже с Oscada SVN и Ubuntu.
(Above is with Oscada 0.6.3.3 and Fedora 11.
Bellow is with Oscada SVN and Ubuntu.)

v=>2.0843e-38

a=4244
b=226

Не право, а машина или версии зависит?
(is it not right and machine dependent?)

Сообщение создано: 03. 08. 2009 [21:00]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
Оказывается это какие-то бока при работе с мат-сопроцессором на x86_64. Потому как тривиальное преобразование не работает.

Learn, learn and learn better than work, work and work.



21139