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

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

Модератор: immortal

AVB
Сообщения: 16
Зарегистрирован: Вт ноя 10, 2015 4:01 pm

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

Сообщение AVB »

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

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

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

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

Сообщение sergejey »

Причина в том, метод не вызывается вовсе. Значение попадает напрямую "как есть". Чтобы при этом вызывался метод, нужно зайти в настройку свойства 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 будет округлённое значение

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

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

Сообщение AVB »

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

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

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

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

Сообщение dimabolt »

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

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

Сообщение nick7zmail »

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

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

Сообщение dimabolt »

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

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

Сообщение yden »

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

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

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

благодарю
Вложения
Свойство объекта
Свойство объекта
1.PNG (24.75 КБ) 7820 просмотров
Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am

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

Сообщение Chainik »

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

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

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

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

Сообщение yden »

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

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

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

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

Сообщение fandaymon »

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...
Ответить