Если знаешь как преобразовать 2 WORD в FLOAT, то почему не знаешь как сделать обратное преобразование ?
Если знаешь как преобразовать 2 WORD в FLOAT, то почему не знаешь как сделать обратное преобразование ?
Текст word-> float скопировал с другого примера.
На java никогда не приходилось ничего делать.
Мне и это несколько странным кажется.
Принимая по modbus переменную float в виде 4-х байт почему нельзя разместить ее в памяти как 4 байта и через ссылку обратиться к этой области памяти как к переменной float. Собственно и обратно так же.
Предполагаю, что это особенности java.
На яву не надо гнать, то что Вы привели это совсем не ява, какой то скриптовый код, к тому же не преобразование системными функциями языка, а просто алгоритм представления флоат из массива байт
таким образом описываются правила обработки в openhab.
зы. есть какая либо особенность в реализации запросов по modbus?
Поясню: Выполняю функцию чтения 2-ух регистров. Успешно.
Выполняю функцию чтения и записи значения бита - успешно.
Т.е. когда эти запросы по одному - все норм.
Как только выполняю эти два запроса последовательно (в openhab описываю два binding) выдается ошибка на мастере (openhab).
Последний раз редактировалось Smith2007; 26.10.2014 в 17:41.
в примерах в принципе показано что ява код вставляется, преобразование туда и обратно выполняется двумя функциями Float.floatToIntBits(float value) и Float.intBitsToFloat(int bits), в Вашем приведенном коде var temp как раз получает этот bits чтоб его преобразовать во флоат
А по поводу двух запросов, видимо надо дожидаться ответа на первый чтоб послать второй
добавте java.lang.Float.intBitsToFloat(int bits)
PS скорее всего более точным будет
в верху скрипта import java.lang.Float
а в коде как то так myTemperature = Float::intBitsToFloat(bits)
Последний раз редактировалось capzap; 26.10.2014 в 20:11.
Все получилось. Значение, которое меняю на слейве верно отображается в интерфейсе.Код:import java.lang.Float import org.openhab.core.library.types.* import org.openhab.core.persistence.* import org.openhab.model.script.actions.* rule "_float1" when Item var1 changed or Item var2 changed then var n2 = (var1.state as DecimalType).intValue var n1 = (var2.state as DecimalType).intValue var temp = n1 * 256 * 256 + n2 var result = Float::intBitsToFloat(temp) _float1.sendCommand(result) end
Теперь необходимо проделать обратное.
В интерфейсе полученное значение можно изменить (+/- на шаг = step). В случае изменения значения генерируется событие по которому сработает еще одно правило rule, где нужно сделать обратное преобразование и заполнение двух word.
var result = Float::floatToIntBits(temp), где temp это флоат, должен получится массив из четырех байт, из этих байт можно получить два инта по принципу var temp = n1 * 256 + n2,
Вроде и понятно, что нужно сделать. Но какими конкретными методами или функциями....
Результат:var temp = Float::floatToIntBits(_float1)
var res1 = temp/256
var res2 = temp-res1
var1.sendCommand(res1)
var2.sendCommand(res2)
00:40:35.041 DEBUG o.o.m.r.i.engine.RuleEngine[:285] - Executing rule 'FloatToInt'
00:40:35.042 INFO runtime.busevents[:22] - _float1 received command 15.4
00:40:35.064 ERROR o.o.c.s.ScriptExecutionThread[:50] - Error during the execution of rule 'FloatToInt': Could not invoke method: java.lang.Float.floatToIntBits(float) on instance: null
Последний раз редактировалось Smith2007; 26.10.2014 в 21:42.