我正在研究Mod-bus寄存器。我是这个领域的新手,所以我面临一些问题。 我已经从mod总线获取了数组中的数据,并且将我的值显示为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>";
答案 0 :(得分:0)
这取决于您的数据表示方式。在Modbus中,您需要两个寄存器来存储浮点数。然后,您需要查看设备手册上的这些寄存器的endianness以及其中的位顺序。
如果一次读取两个寄存器,则可以使用 phpModbus 随附的帮助器功能:
PhpType::bytes2float($recData, $endianness)
或者:
PhpType::bytes2float(array_reverse($recData), $endianness)
$endianness
可以为0或1。
编辑:知道您的device并尝试读取long
类型的格式是:无符号32位整数高16位(MSW)最低编号的寄存器(4001/4000 = MSW / LSW),因此根本无法使用bytes2float()
功能。
使用PhpType::bytes2unsignedint($bytes)
使您处在正确的位置,但似乎您必须更改默认的字节序:
PhpType::bytes2unsignedint($bytes, 1)
抱歉,我想您正在读浮游物。