我是PHP新手,我正在编写一个PHP代码,使用PHPModbus库从modbus设备获取数据。我需要能够每秒显示数据,然后每分钟将数据写入CSV文件。
我如何克服这个问题?
<?php
// 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.105", "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(5, 100, 120);
}
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";
// Chunk the data array to set of 4 bytes
$values = array_chunk($recData, 4);
//Create an array and set first two values as date and time
$energymeter_param = array();
$energymeter_param[0] = date('Y-m-d H:i:s');
//$energymeter_param[1] = date('H:i:s');
$count = 1;
// Get float from REAL interpretation
//echo "<h3>Energy meter</h3>\n";
//get each parmeter from energy meter and store in the array
foreach($values as $bytes){
/*Since load hours is unsigned long we are converting it
to unsigned long type and scaling to get correct value */
if($count == 59) {
$temp = PhpType::bytes2unsignedint($bytes);
$temp = $temp/3932160;
}
else {
$temp = PhpType::bytes2float($bytes);
//Converting Wh to Kwh
if($count == 31) {
$temp = $temp/1000;
}
}
//store the values in an array
$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>";
//write the values to a csv file every time seconds becomes 00
if((date('s')) == 00) {
$temprow = implode(',',$energymeter_param);
$temprow.="\n";
$file = 'H:\Appserv\www\Log.csv';
file_put_contents($file, $temprow, FILE_APPEND );
}
答案 0 :(得分:0)
考虑一个AJAX解决方案,其中计时器变量由浏览器在JavaScript中处理。
在document.ready()上,您可以使用setTimeout(以获取最新数据)启动Ajax调用回到php并跟踪上次写入的时间。如果自上次写入以来的时间&gt; 59秒,然后写一个。
答案 1 :(得分:0)
你有两件事正在进行(状态和完全匹配)。
首先,apache + PHP(我假设apache,但同样适用于IIS和其他无状态设置)不会一直运行您的脚本,但仅在请求时运行。这会导致您看到的不一致,浏览器可能无法在您需要时完全提出请求(太多因素导致这种情况发生)。
通过运行PHP守护程序来处理1分钟的日志记录可以更好地处理这个问题。
但是,如果要继续使用此路由,则必须处理不一致的查询。
您可以使用涵盖“大于”而非完全匹配表达式的方式。特别是,您可以通过stat函数(mtime值)检查上次更改CSV文件的时间:http://php.net/manual/en/function.stat.php,然后如果文件长度超过59秒,则会附加到文件中。
众所周知,浏览器是不可靠的计时方式,所以我仍然推荐一个守护进程。
答案 2 :(得分:0)
使用ssh
watch -n 1 php /yourphpscript.php
这样你的脚本每秒都会运行