Как преобразовать тип данных массива данных mobus в тип данных REAL - PullRequest
1 голос
/ 27 июня 2019

Я работаю над регистрами Mod-Bus. Я новичок в этой области, поэтому я сталкиваюсь с некоторыми проблемами. Я получил данные в массиве из Mod-Bus, и он отображает мои значения в int, но я хочу данные в реальном типе данных. Жду вашего любезного ответа. П.С .: прошу игнорировать мои ошибки

// for automatically refreshing the page every one second
header('Refresh: 1'); 
//setting the time zone and getting the date and time
$timezone = "Asia/Calcutta";
if(function_exists('date_default_timezone_set')){
   date_default_timezone_set($timezone);
}
echo date('d-m-Y'). "</br>";
echo date('H:i:s'). "</br>";
//reference to ModbusMaster.php file where the modbus php protocol is defined
require_once dirname(__FILE__) . '/phpmodbus/Phpmodbus/ModbusMaster.php';
// Create Modbus object
$modbus = new ModbusMaster("192.168.1.49", "TCP");

//Energy Meter
// FC3 = Function Code 3 to read holding registers
/*Setting device ID = 5, Starting address as 100 and 
  number of registers to be read as 120
*/
try {
    // FC 3
    $recData = $modbus->readMultipleRegisters(2, 4000, 6);
}
catch (Exception $e) {
    // Print error information if any
    echo $modbus;
    echo $e;
    exit;
}

// Print status information
echo "</br>Status:</br>" . $modbus;

// Conversion
echo "<h2>EN8400</h2>\n";
print_r($recData);

// Chunk the data array to set of 4 bytes
$values = array_chunk($recData, 4);
print_r($values);
$energymeter_param = array();
$count = 1;
foreach($values as $bytes){   
      $temp = PhpType::bytes2unsignedint($bytes);
      $energymeter_param[$count] = $temp;

    $count++;
}
//Store the number of energy meter parameters in a variable
$num_energymeter_param = $count;
echo "<h3>Energy meter array</h3>\n";
//print array 
print_r ($energymeter_param)." </br>";

1 Ответ

0 голосов
/ 27 июня 2019

Это зависит от того, как ваши данные представлены. В Modbus вам нужно два регистра для хранения поплавка. Затем вам необходимо проверить в руководстве по вашему устройству порядковый номер этих регистров и порядок битов внутри.

Если вы читаете два регистра одновременно, вы можете использовать вспомогательную функцию, предоставляемую с phpModbus :

PhpType::bytes2float($recData, $endianness)

Или:

PhpType::bytes2float(array_reverse($recData), $endianness)

Где $endianness может быть 0 или 1.

РЕДАКТИРОВАТЬ: Зная ваше устройство и то, что вы пытаетесь прочитать тип long, форматом является 32-разрядное целое число без знака Верхние 16-разрядные (MSW) в младшем пронумерованный регистр (4001/4000 = тсв / лсв), поэтому вы вообще не можете использовать функцию bytes2float().

Вы были на правильном пути с PhpType::bytes2unsignedint($bytes), но, похоже, вам нужно изменить порядковый номер по умолчанию:

PhpType::bytes2unsignedint($bytes, 1)

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

...