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

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

Модератор: immortal

Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

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

Сообщение Lerych » Ср мар 13, 2019 8:02 pm

Господа!
А если данные приходят в виде, например, частота - 5001; напряжение - 2201
Как выделить в первом случае 50.01, во втором - 220.1?
Описанный выше вариант будет работать?
Спасибо!
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Ср мар 13, 2019 8:21 pm

Lerych писал(а):Господа!
А если данные приходят в виде, например, частота - 5001; напряжение - 2201
Как выделить в первом случае 50.01, во втором - 220.1?
Описанный выше вариант будет работать?
Спасибо!
Конечно, хоть в квадрат возводи. /100, /10 в строке, где округление

Отправлено с моего Redmi 4X через Tapatalk

За это сообщение автора xor поблагодарил:
Lerych (Ср мар 13, 2019 8:52 pm)
Рейтинг: 1.16%
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Ср мар 13, 2019 8:25 pm

Lerych писал(а):
Ср мар 13, 2019 8:02 pm
Господа!
А если данные приходят в виде, например, частота - 5001; напряжение - 2201
Как выделить в первом случае 50.01, во втором - 220.1?
Описанный выше вариант будет работать?
Спасибо!
Строковые функции не подойдут?

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

$x="5001";
    $y=substr($x,0,2);
    $z=substr($x,-2);
    echo($y.".".$z);
и

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

$x="2201";
    $y=substr($x,0,3);
    $z=substr($x,-1);
    echo($y.".".$z);
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Ср мар 13, 2019 8:28 pm

Chainik писал(а):
Lerych писал(а):
Ср мар 13, 2019 8:02 pm
Господа!
А если данные приходят в виде, например, частота - 5001; напряжение - 2201
Как выделить в первом случае 50.01, во втором - 220.1?
Описанный выше вариант будет работать?
Спасибо!
Строковые функции не подойдут?

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

$x="5001";
    $y=substr($x,0,2);
    $z=substr($x,-2);
    echo($y.".".$z);
и

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

$x="2201";
    $y=substr($x,0,3);
    $z=substr($x,-1);
    echo($y.".".$z);
Изврат, извините (

Отправлено с моего Redmi 4X через Tapatalk

Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Ср мар 13, 2019 8:38 pm

xor писал(а):
Ср мар 13, 2019 8:28 pm
Изврат, извините (
Согласен, ступил (хотя и работает).
Ну не ищет наш человек легких путей... Природа у нас такая...
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Ср мар 13, 2019 8:43 pm

Chainik писал(а):
Ср мар 13, 2019 8:38 pm
xor писал(а):
Ср мар 13, 2019 8:28 pm
Изврат, извините (
Согласен, ступил (хотя и работает).
Ну не ищет наш человек легких путей... Природа у нас такая...
))
работает, пока напряжение больше 99В,
частота, да, так не меняется, если только не упадет до 0
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

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

Сообщение Lerych » Чт мар 14, 2019 8:56 pm

Спасибо за подсказки.
Использую этот код для получения данных от ModBUS устройств.

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

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

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

// Фильтруем данные
if ($value > 60 || $value < -60) return;
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Чт мар 14, 2019 8:58 pm

Lerych писал(а):Спасибо за подсказки.
Использую этот код для получения данных от ModBUS устройств.

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

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

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

// Фильтруем данные
if ($value > 60 || $value < -60) return;
Конечно, но обычно на правильность данные проверяют в самом начале, чтобы не тратить время на деление, округление и тд

Отправлено с моего Redmi 4X через Tapatalk


За это сообщение автора xor поблагодарил:
Lerych (Чт мар 14, 2019 9:07 pm)
Рейтинг: 1.16%
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

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

Сообщение Lerych » Чт мар 14, 2019 9:07 pm

А какой оператор сравнения правильнее использовать?
1. if ($value = '0') return;
2. if ($value == 0) return;
3. if ($value <= 0) return;
4. if ($value = null) return;
5. ещё что-то
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Чт мар 14, 2019 10:01 pm

Lerych писал(а):
Чт мар 14, 2019 9:07 pm
А какой оператор сравнения правильнее использовать?
1. if ($value = '0') return;
2. if ($value == 0) return;
3. if ($value <= 0) return;
4. if ($value = null) return;
5. ещё что-то

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

if(!isset($params['NEW_VALUE'])||( $params['NEW_VALUE']<=0)) return; //не установлено (нулл) или меньше и равно 0 -- выходим
$this->setProperty('value', round($params['NEW_VALUE']/100,1));
За это сообщение автора xor поблагодарили (всего 2):
Lerych (Чт мар 14, 2019 10:13 pm) • ~220v (Чт июл 02, 2020 10:03 am)
Рейтинг: 2.33%
Ответить