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

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

Модератор: immortal

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

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

Сообщение Lerych »

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

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

Сообщение xor »

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

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

Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am

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

Сообщение 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);
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm

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

Сообщение xor »

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
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am

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

Сообщение Chainik »

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

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

Сообщение xor »

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

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

Сообщение Lerych »

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

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

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

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

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

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

Сообщение xor »

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


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

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

Сообщение Lerych »

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

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

Сообщение xor »

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