Округление температуры из Modbus по TCP

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

AVB
Сообщения: 16
Зарегистрирован: Вт ноя 10, 2015 4:01 pm
Благодарил (а): 0
Поблагодарили: 3 раза

Округление температуры из Modbus по TCP

Сообщение AVB » Вт ноя 10, 2015 4:37 pm

Добрый день, Уважаемые форумчане!

Прошу помощи в настройки системы!.
Не могу понять почему не округляются показания температуры с 11 знаками после запятой, вот показания:
СпойлерПоказать
Изображение
Как мы видим, данные с контроллера поступают!

Далее созданный объект, его метод.
СпойлерПоказать
Изображение
СпойлерПоказать
Изображение
И собственно сам метод, в котором есть строки для округления данных строка 19 и 20
СпойлерПоказать
Изображение
Прошу помощи в решении проблемы, что Я не так сделал.
Спасибо!
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Помогите! Округление температуры из Modbus по TCP

Сообщение sergejey » Чт ноя 12, 2015 3:34 pm

Причина в том, метод не вызывается вовсе. Значение попадает напрямую "как есть". Чтобы при этом вызывался метод, нужно зайти в настройку свойства temp класса tempSensor и прописать название метода tempChanged в поле вызова метода при изменении значения свойства. Но и этого мало. Надо переделать сам код метода, чтобы сохранять округлённое значение -- лучше для этого использовать отдельное свойство, предположим мы его добавили в класс tempSensor и назвали tempRounded. Тогда в коде метода надо произвести следующе изменения:
1. Убрать строчки
if (!isset($params['t'])) {
return;
}
2. Заменить
$t=round($params['t'],2);
на
$t=round($old_temp,2);

3. заменить
$this->setProperty('temp',$t);
на
$this->setProperty('tempRounded',$t);

после чего в новом свойстве tempRounded будет округлённое значение
За это сообщение автора sergejey поблагодарили (всего 4):
ypiter2006 (Вт янв 02, 2018 10:14 pm) • dimabolt (Чт фев 08, 2018 5:12 pm) • piton_78 (Вс май 06, 2018 9:28 am) • juricks (Вт мар 12, 2019 9:49 pm)
Рейтинг: 4.65%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
AVB
Сообщения: 16
Зарегистрирован: Вт ноя 10, 2015 4:01 pm
Благодарил (а): 0
Поблагодарили: 3 раза

Re: Помогите! Округление температуры из Modbus по TCP

Сообщение AVB » Чт ноя 12, 2015 7:49 pm

Сергей, еще раз благодарю за оперативный ответ.

Сделал все как вы написали, данные записываются в tempRouded c округлением.
Вопрос Закрыт!

Огромное спасибо!
С Уважением, Александр!
dimabolt
Сообщения: 9
Зарегистрирован: Вс янв 07, 2018 11:22 pm
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Re: Помогите! Округление температуры из Modbus по TCP

Сообщение dimabolt » Ср фев 07, 2018 10:31 pm

Подскажите пожалуйста, сделал все как написано, но округляются только температуры имеющие вид 23.0
А температуры 22.9 записываются в tempRounded как есть без округления.
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Помогите! Округление температуры из Modbus по TCP

Сообщение nick7zmail » Чт фев 08, 2018 6:37 am

У вас в коде round($чтототам, 2); 2 - как раз округление до 2 десятичных знаков. Надо целые - ставьте 0.
За это сообщение автора nick7zmail поблагодарил:
dimabolt (Чт фев 08, 2018 5:12 pm)
Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
dimabolt
Сообщения: 9
Зарегистрирован: Вс янв 07, 2018 11:22 pm
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Re: Помогите! Округление температуры из Modbus по TCP

Сообщение dimabolt » Чт фев 08, 2018 5:12 pm

nick7zmail писал(а):У вас в коде round($чтототам, 2); 2 - как раз округление до 2 десятичных знаков. Надо целые - ставьте 0.
Спасибо за пояснение, помогло.
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Re: Помогите! Округление температуры из Modbus по TCP

Сообщение yden » Пт сен 21, 2018 8:25 pm

Добрый всем.
С разрешения ТС вклинюсь.
Такая же проблема как и у ТС.
Код метода объекта:

Код: Выделить всё

// Получаем данные от сенсора
$value = $params['temp'];
 
// Выполняем округление с точностью до одного знака
$value = round($value, 0);
 
// Сохраняем обработанное значение в свойство объекта
$this->setProperty('tempRounded', $value);
В tempRounded всегда 0.
Как округлить данные?

благодарю
Вложения
1.PNG
Свойство объекта
1.PNG (24.75 КБ) 6053 просмотра
За это сообщение автора yden поблагодарил:
juricks (Вт мар 12, 2019 9:49 pm)
Рейтинг: 1.16%
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Помогите! Округление температуры из Modbus по TCP

Сообщение Chainik » Пт сен 21, 2018 8:39 pm

Вообще то округление до одно знака должно выполняться кодом:

Код: Выделить всё

// Выполняем округление с точностью до одного знака
$value = round($value, 1);
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Re: Помогите! Округление температуры из Modbus по TCP

Сообщение yden » Пт сен 21, 2018 8:44 pm

Chainik писал(а):
Пт сен 21, 2018 8:39 pm
Вообще то округление до одно знака должно выполняться кодом:

Код: Выделить всё

// Выполняем округление с точностью до одного знака
$value = round($value, 1);
Это от примера осталось. мне целое и нужно.
Но не суть, все равно 0 пишет.
fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Помогите! Округление температуры из Modbus по TCP

Сообщение fandaymon » Пт сен 21, 2018 9:27 pm

yden писал(а):
Пт сен 21, 2018 8:44 pm
Chainik писал(а):
Пт сен 21, 2018 8:39 pm
Вообще то округление до одно знака должно выполняться кодом:

Код: Выделить всё

// Выполняем округление с точностью до одного знака
$value = round($value, 1);
Это от примера осталось. мне целое и нужно.
Но не суть, все равно 0 пишет.

Если этот метод вызывается при изменении, то там в параметрах
$params['PROPERTY']
$params['NEW_VALUE']
$params['OLD_VALUE']
$params['SOURCE']
никакого $params['temp'] нету, поэтому и получаем 0...
За это сообщение автора fandaymon поблагодарил:
yden (Пт сен 21, 2018 9:54 pm)
Рейтинг: 1.16%
Ответить