Автор |
Сообщение |
Сообщение создано: 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.
|