8 Commits
20 changed files with 1992 additions and 1845 deletions
+1
View File
@@ -1,4 +1,5 @@
/vendor /vendor
composer.lock composer.lock
.idea/
*~ *~
+23 -10
View File
@@ -2,15 +2,15 @@
Implementation of the basic functionality of the Modbus TCP and UDP based protocol using PHP. Implementation of the basic functionality of the Modbus TCP and UDP based protocol using PHP.
This is a fork of the original project at https://code.google.com/p/phpmodbus/ **NOTE: This is a fork to fix & update the library code (and code alone). Notably, the tests are probably all broken.**
> **What's new** > **What's new**
> >
> This fork adds a namespace and fixes issues encountered when porting to PHP 7 > This fork adds a namespace and fixes issues encountered when porting to PHP 7
**WARNING: Everything except the actual code in this repo may be broken and outdated.**
Implemented features: ## Implemented features
* Modbus master * Modbus master
* FC1 - Read coils * FC1 - Read coils
* FC2 - Read input discretes * FC2 - Read input discretes
@@ -22,18 +22,24 @@ Implemented features:
* FC16 - Write multiple registers * FC16 - Write multiple registers
* FC23 - Read/Write multiple registers * FC23 - Read/Write multiple registers
Example:
## Requirements
* The PHP extension php_sockets.dll should be enabled (server php.ini file)
## Example
```php ```php
require_once dirname(__FILE__) . '/Phpmodbus/ModbusMaster.php'; use PHPModbus/ModbusMaster;
use PHPModbus/PhpType;
// Modbus master UDP // Modbus master UDP
$modbus = new ModbusMaster("192.168.1.1", "UDP"); $modbus = new ModbusMaster("192.168.1.1", "UDP");
// Read multiple registers // Read multiple registers
try { try {
$recData = $modbus->readMultipleRegisters(0, 12288, 5); $recData = $modbus->readMultipleRegisters(0, 12288, 5);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
@@ -43,7 +49,14 @@ catch (Exception $e) {
echo PhpType::bytes2string($recData); echo PhpType::bytes2string($recData);
``` ```
For more see [http://code.google.com/p/phpmodbus/downloads/list documentation] or [http://code.google.com/p/phpmodbus/wiki/FAQ FAQ]. Use the `setTimeout($seconds)` and `setSocketTimeout($read_timeout_sec, $write_timeout_sec)` methods to adjust wait times.
Most of the code is (to some extent) commented and documented with PhpDoc. You should get useful tooltips in your IDE.
## GoogleCode legacy docs & downloads
This project was originally hosted on (now defunct) Google Code. It's still archived here:
* [GoogleCode Archived Repo](http://code.google.com/p/phpmodbus)
Note:
* The PHP extension php_sockets.dll should be enabled (server php.ini file)
+5 -1
View File
@@ -1,5 +1,5 @@
{ {
"name": "MightyPork/phpmodbus", "name": "mightypork/phpmodbus",
"keywords": ["phpmodbus","modbus"], "keywords": ["phpmodbus","modbus"],
"description": "PhpModbus with namespaces and updated to PHP 7", "description": "PhpModbus with namespaces and updated to PHP 7",
"license": "LGPL", "license": "LGPL",
@@ -11,6 +11,10 @@
{ {
"name": "Honza Krakora", "name": "Honza Krakora",
"email": "krakora.jan@googlemail.com" "email": "krakora.jan@googlemail.com"
},
{
"name": "Ondřej Hruška",
"email": "ondra@ondrovo.com"
} }
], ],
"autoload": { "autoload": {
+12 -14
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; use PHPModbus\ModbusMaster;
// Create Modbus object // Create Modbus object
$ip = "192.192.15.51"; $ip = "192.192.15.51";
@@ -13,8 +13,7 @@ try {
$mw0address = 12288; $mw0address = 12288;
$quantity = 6; $quantity = 6;
$recData = $modbus->readMultipleRegisters($moduleId, $reference, $quantity); $recData = $modbus->readMultipleRegisters($moduleId, $reference, $quantity);
} } catch (Exception $e) {
catch (Exception $e) {
echo $modbus; echo $modbus;
echo $e; echo $e;
exit; exit;
@@ -31,10 +30,10 @@ catch (Exception $e) {
<h1>Dump of M-memory from WAGO 750-84x series coupler.</h1> <h1>Dump of M-memory from WAGO 750-84x series coupler.</h1>
<ul> <ul>
<li>PLC: 750-84x series</li> <li>PLC: 750-84x series</li>
<li>IP: <?php echo $ip?></li> <li>IP: <?php echo $ip ?></li>
<li>Modbus module ID: <?php echo $moduleId?></li> <li>Modbus module ID: <?php echo $moduleId ?></li>
<li>Modbus memory reference: <?php echo $reference?></li> <li>Modbus memory reference: <?php echo $reference ?></li>
<li>Modbus memory quantity: <?php echo $quantity?></li> <li>Modbus memory quantity: <?php echo $quantity ?></li>
</ul> </ul>
<h2>M-memory dump</h2> <h2>M-memory dump</h2>
@@ -46,12 +45,12 @@ catch (Exception $e) {
<td>value</td> <td>value</td>
</tr> </tr>
<?php <?php
for($i=0;$i<count($recData);$i+=2) { for ($i = 0; $i < count($recData); $i += 2) {
?> ?>
<tr> <tr>
<td><?php echo $i+$reference?></td> <td><?php echo $i + $reference ?></td>
<td>MW<?php echo ($i + $reference - $mw0address)/2?></td> <td>MW<?php echo ($i + $reference - $mw0address) / 2 ?></td>
<td><?php echo ($recData[$i] << 8)+ $recData[$i+1]?></td> <td><?php echo ($recData[$i] << 8) + $recData[$i + 1] ?></td>
</tr> </tr>
<?php <?php
} }
@@ -59,9 +58,8 @@ catch (Exception $e) {
</table> </table>
<h2>Modbus class status</h2> <h2>Modbus class status</h2>
<?php
echo $modbus; <pre><?= $modbus ?></pre>
?>
</body> </body>
</html> </html>
+8 -9
View File
@@ -1,6 +1,7 @@
<?php <?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; use PHPModbus\ModbusMaster;
use PHPModbus\PhpType;
// Create Modbus object // Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP"); $modbus = new ModbusMaster("192.192.15.51", "UDP");
@@ -9,8 +10,7 @@ try {
// FC 3 // FC 3
// read 10 words (20 bytes) from device ID=0, address=12288 // read 10 words (20 bytes) from device ID=0, address=12288
$recData = $modbus->readMultipleRegisters(0, 12288, 10); $recData = $modbus->readMultipleRegisters(0, 12288, 10);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
@@ -28,17 +28,17 @@ $values = array_chunk($recData, 4);
// Get float from REAL interpretation // Get float from REAL interpretation
echo "<h3>REAL to Float</h3>\n"; echo "<h3>REAL to Float</h3>\n";
foreach($values as $bytes) foreach ($values as $bytes)
echo PhpType::bytes2float($bytes) . "</br>"; echo PhpType::bytes2float($bytes) . "</br>";
// Get integer from DINT interpretation // Get integer from DINT interpretation
echo "<h3>DINT to integer </h3>\n"; echo "<h3>DINT to integer </h3>\n";
foreach($values as $bytes) foreach ($values as $bytes)
echo PhpType::bytes2signedInt($bytes) . "</br>"; echo PhpType::bytes2signedInt($bytes) . "</br>";
// Get integer of float from DINT interpretation // Get integer of float from DINT interpretation
echo "<h3>DWORD to integer (or float) </h3>\n"; echo "<h3>DWORD to integer (or float) </h3>\n";
foreach($values as $bytes) foreach ($values as $bytes)
echo PhpType::bytes2unsignedInt($bytes) . "</br>"; echo PhpType::bytes2unsignedInt($bytes) . "</br>";
echo "<h2>16 bit types</h2>\n"; echo "<h2>16 bit types</h2>\n";
@@ -47,15 +47,14 @@ $values = array_chunk($recData, 2);
// Get signed integer from INT interpretation // Get signed integer from INT interpretation
echo "<h3>INT to integer </h3>\n"; echo "<h3>INT to integer </h3>\n";
foreach($values as $bytes) foreach ($values as $bytes)
echo PhpType::bytes2signedInt($bytes) . "</br>"; echo PhpType::bytes2signedInt($bytes) . "</br>";
// Get unsigned integer from WORD interpretation // Get unsigned integer from WORD interpretation
echo "<h3>WORD to integer </h3>\n"; echo "<h3>WORD to integer </h3>\n";
foreach($values as $bytes) foreach ($values as $bytes)
echo PhpType::bytes2unsignedInt($bytes) . "</br>"; echo PhpType::bytes2unsignedInt($bytes) . "</br>";
// Get string from STRING interpretation // Get string from STRING interpretation
echo "<h3>STRING to string </h3>\n"; echo "<h3>STRING to string </h3>\n";
echo PhpType::bytes2string($recData) . "</br>"; echo PhpType::bytes2string($recData) . "</br>";
?>
+2 -3
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; use PHPModbus\ModbusMaster;
// Create Modbus object // Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP"); $modbus = new ModbusMaster("192.192.15.51", "UDP");
@@ -8,8 +8,7 @@ $modbus = new ModbusMaster("192.192.15.51", "UDP");
try { try {
// FC 1 // FC 1
$recData = $modbus->readCoils(0, 12288, 12); $recData = $modbus->readCoils(0, 12288, 12);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
+9 -8
View File
@@ -1,21 +1,22 @@
<?php <?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; use PHPModbus\ModbusMaster;
// Create Modbus object // Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP"); $modbus = new ModbusMaster("192.192.15.51", "UDP");
// Data to be writen // Data to be written - supports both 0/1 and booleans (true, false)
$data = array(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, $data = array(
TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, 1, 0, 1, 1, 0, 1, 1, 1,
FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, 1, 1, 1, 1, 0, 0, 0, 0,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); 0, 0, 0, 0, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
);
try { try {
// FC15 // FC15
$modbus->writeMultipleCoils(0, 12288, $data); $modbus->writeMultipleCoils(0, 12288, $data);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
+2 -3
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; use PHPModbus\ModbusMaster;
// Create Modbus object // Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP"); $modbus = new ModbusMaster("192.192.15.51", "UDP");
@@ -12,8 +12,7 @@ $dataTypes = array("WORD", "INT", "DINT", "REAL");
try { try {
// FC16 // FC16
$modbus->writeMultipleRegister(0, 12288, $data, $dataTypes); $modbus->writeMultipleRegister(0, 12288, $data, $dataTypes);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
+2 -3
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; use PHPModbus\ModbusMaster;
// Create Modbus object // Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP"); $modbus = new ModbusMaster("192.192.15.51", "UDP");
@@ -9,8 +9,7 @@ try {
// FC 2 // FC 2
// read 2 input bits from address 0x0 (Wago input image) // read 2 input bits from address 0x0 (Wago input image)
$recData = $modbus->readInputDiscretes(0, 0, 2); $recData = $modbus->readInputDiscretes(0, 0, 2);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
+4 -7
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; use PHPModbus\ModbusMaster;
// Create Modbus object // Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP"); $modbus = new ModbusMaster("192.192.15.51", "UDP");
@@ -8,14 +8,13 @@ $modbus = new ModbusMaster("192.192.15.51", "UDP");
// Data to be writen // Data to be writen
$bitValue = true; $bitValue = true;
$bitNumber = 2; $bitNumber = 2;
$andMask = 0xFFFF ^ pow(2, $bitNumber) ; $andMask = 0xFFFF ^ pow(2, $bitNumber);
$orMask = 0x0000 ^ (pow(2, $bitNumber) * $bitValue ) ; $orMask = 0x0000 ^ (pow(2, $bitNumber) * $bitValue);
try { try {
// FC22 // FC22
$modbus->maskWriteRegister(0, 12288, $andMask, $orMask); $modbus->maskWriteRegister(0, 12288, $andMask, $orMask);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
@@ -24,5 +23,3 @@ catch (Exception $e) {
// Print status information // Print status information
echo $modbus; echo $modbus;
?>
+2 -5
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; use PHPModbus\ModbusMaster;
// Create Modbus object // Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP"); $modbus = new ModbusMaster("192.192.15.51", "UDP");
@@ -12,8 +12,7 @@ $dataTypes = array("WORD", "INT", "DINT", "REAL");
try { try {
// FC23 // FC23
$recData = $modbus->readWriteRegisters(0, 12288, 6, 12288, $data, $dataTypes); $recData = $modbus->readWriteRegisters(0, 12288, 6, 12288, $data, $dataTypes);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
@@ -27,5 +26,3 @@ echo "</br>Status:</br>" . $modbus;
echo "</br>Data:</br>"; echo "</br>Data:</br>";
print_r($recData); print_r($recData);
echo "</br>"; echo "</br>";
?>
+2 -4
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; use PHPModbus\ModbusMaster;
// Create Modbus object // Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP"); $modbus = new ModbusMaster("192.192.15.51", "UDP");
@@ -8,8 +8,7 @@ $modbus = new ModbusMaster("192.192.15.51", "UDP");
try { try {
// FC 3 // FC 3
$recData = $modbus->readMultipleRegisters(0, 12288, 6); $recData = $modbus->readMultipleRegisters(0, 12288, 6);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
@@ -23,4 +22,3 @@ echo "</br>Status:</br>" . $modbus;
echo "</br>Data:</br>"; echo "</br>Data:</br>";
print_r($recData); print_r($recData);
echo "</br>"; echo "</br>";
?>
+2 -3
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php'; use PHPModbus\ModbusMasterUdp;
// Create Modbus object // Create Modbus object
$modbus = new ModbusMasterUdp("192.192.15.51"); $modbus = new ModbusMasterUdp("192.192.15.51");
@@ -8,8 +8,7 @@ $modbus = new ModbusMasterUdp("192.192.15.51");
try { try {
// Read input discretes - FC 4 // Read input discretes - FC 4
$recData = $modbus->readMultipleInputRegisters(0, 0, 2); $recData = $modbus->readMultipleInputRegisters(0, 0, 2);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
+4 -5
View File
@@ -1,13 +1,13 @@
<?php <?php
require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php'; use PHPModbus\ModbusMasterUdp;
// Create Modbus object // Create Modbus object
$modbus = new ModbusMasterUdp("192.192.15.51"); $modbus = new ModbusMasterUdp("192.192.15.51");
// Data to be writen - TRUE, FALSE // Data to be writen - TRUE, FALSE
$data_true = array(TRUE); $data_true = array(true);
$data_false = array(FALSE); $data_false = array(false);
try { try {
// Write single coil - FC5 // Write single coil - FC5
@@ -15,8 +15,7 @@ try {
$modbus->writeSingleCoil(0, 12289, $data_false); $modbus->writeSingleCoil(0, 12289, $data_false);
$modbus->writeSingleCoil(0, 12290, $data_true); $modbus->writeSingleCoil(0, 12290, $data_true);
$modbus->writeSingleCoil(0, 12291, $data_false); $modbus->writeSingleCoil(0, 12291, $data_false);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
+3 -7
View File
@@ -1,19 +1,17 @@
<?php <?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; use PHPModbus\ModbusMaster;
// Create Modbus object // Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP"); $modbus = new ModbusMaster("192.192.15.51", "UDP");
// Data to be writen // Data to be writen
$data = array(-1000); $data = array(-1000);
$dataTypes = array("INT");
try { try {
// FC6 // FC6
$modbus->writeSingleRegister(0, 12288, $data, $dataTypes); $modbus->writeSingleRegister(0, 12288, $data);
} } catch (Exception $e) {
catch (Exception $e) {
// Print error information if any // Print error information if any
echo $modbus; echo $modbus;
echo $e; echo $e;
@@ -22,5 +20,3 @@ catch (Exception $e) {
// Print status information // Print status information
echo $modbus; echo $modbus;
?>
+34 -29
View File
@@ -26,18 +26,19 @@ namespace PHPModbus;
* @copyright Copyright (c) 2004, 2010 Jan Krakora * @copyright Copyright (c) 2004, 2010 Jan Krakora
* @package Phpmodbus * @package Phpmodbus
*/ */
class IecType { class IecType
{
/** /**
* iecBYTE * iecBYTE
* *
* Converts a value to IEC-1131 BYTE data type * Converts a value to IEC-1131 BYTE data type
* *
* @param value value from 0 to 255 * @param int $value from 0 to 255
* @return value IEC BYTE data type * @return int IEC BYTE data type
* *
*/ */
public static function iecBYTE($value) { public static function iecBYTE($value)
{
return chr($value & 0xFF); return chr($value & 0xFF);
} }
@@ -46,11 +47,12 @@ class IecType {
* *
* Converts a value to IEC-1131 INT data type * Converts a value to IEC-1131 INT data type
* *
* @param value value to be converted * @param int $value to be converted
* @return value IEC-1131 INT data type * @return int IEC-1131 INT data type
* *
*/ */
public static function iecINT($value) { public static function iecINT($value)
{
return self::iecBYTE(($value >> 8) & 0x00FF) . return self::iecBYTE(($value >> 8) & 0x00FF) .
self::iecBYTE(($value & 0x00FF)); self::iecBYTE(($value & 0x00FF));
} }
@@ -60,14 +62,15 @@ class IecType {
* *
* Converts a value to IEC-1131 DINT data type * Converts a value to IEC-1131 DINT data type
* *
* @param value value to be converted * @param int $value to be converted
* @param value endianness defines endian codding (little endian == 0, big endian == 1) * @param int $bigEndian defines endian codding (little endian == 0, big endian == 1)
* @return value IEC-1131 INT data type * @return int IEC-1131 INT data type
* *
*/ */
public static function iecDINT($value, $endianness = 0) { public static function iecDINT($value, $bigEndian = 0)
{
// result with right endianness // result with right endianness
return self::endianness($value, $endianness); return self::endianness($value, $bigEndian);
} }
/** /**
@@ -75,15 +78,16 @@ class IecType {
* *
* Converts a value to IEC-1131 REAL data type. The function uses function @use float2iecReal. * Converts a value to IEC-1131 REAL data type. The function uses function @use float2iecReal.
* *
* @param value value to be converted * @param int $value to be converted
* @param value endianness defines endian codding (little endian == 0, big endian == 1) * @param bool $bigEndian defines endian codding (little endian == 0, big endian == 1)
* @return value IEC-1131 REAL data type * @return int IEC-1131 REAL data type
*/ */
public static function iecREAL($value, $endianness = 0) { public static function iecREAL($value, $bigEndian = 0)
{
// iecREAL representation // iecREAL representation
$real = self::float2iecReal($value); $real = self::float2iecReal($value);
// result with right endianness // result with right endianness
return self::endianness($real, $endianness); return self::endianness($real, $bigEndian);
} }
/** /**
@@ -92,13 +96,15 @@ class IecType {
* This function converts float value to IEC-1131 REAL single precision form. * This function converts float value to IEC-1131 REAL single precision form.
* *
* For more see [{@link http://en.wikipedia.org/wiki/Single_precision Single precision on Wiki}] or * For more see [{@link http://en.wikipedia.org/wiki/Single_precision Single precision on Wiki}] or
* [{@link http://de.php.net/manual/en/function.base-convert.php PHP base_convert function commentary}, Todd Stokes @ Georgia Tech 21-Nov-2007] or * [{@link http://de.php.net/manual/en/function.base-convert.php PHP base_convert function commentary}, Todd Stokes
* @ Georgia Tech 21-Nov-2007] or
* [{@link http://www.php.net/manual/en/function.pack.php PHP pack/unpack functionality}] * [{@link http://www.php.net/manual/en/function.pack.php PHP pack/unpack functionality}]
* *
* @param float value to be converted * @param float $value to be converted
* @return value IEC REAL data type * @return int IEC REAL data type
*/ */
private static function float2iecReal($value) { private static function float2iecReal($value)
{
// get float binary string // get float binary string
$float = pack("f", $value); $float = pack("f", $value);
// set 32-bit unsigned integer of the float // set 32-bit unsigned integer of the float
@@ -113,24 +119,23 @@ class IecType {
* For more see http://en.wikipedia.org/wiki/Endianness * For more see http://en.wikipedia.org/wiki/Endianness
* *
* @param int $value * @param int $value
* @param bool $endianness * @param bool $bigEndian
* @return int * @return int
*/ */
private static function endianness($value, $endianness = 0) { private static function endianness($value, $bigEndian = 0)
if ($endianness == 0) {
if ($bigEndian == 0) {
return return
self::iecBYTE(($value >> 8) & 0x000000FF) . self::iecBYTE(($value >> 8) & 0x000000FF) .
self::iecBYTE(($value & 0x000000FF)) . self::iecBYTE(($value & 0x000000FF)) .
self::iecBYTE(($value >> 24) & 0x000000FF) . self::iecBYTE(($value >> 24) & 0x000000FF) .
self::iecBYTE(($value >> 16) & 0x000000FF); self::iecBYTE(($value >> 16) & 0x000000FF);
else } else {
return return
self::iecBYTE(($value >> 24) & 0x000000FF) . self::iecBYTE(($value >> 24) & 0x000000FF) .
self::iecBYTE(($value >> 16) & 0x000000FF) . self::iecBYTE(($value >> 16) & 0x000000FF) .
self::iecBYTE(($value >> 8) & 0x000000FF) . self::iecBYTE(($value >> 8) & 0x000000FF) .
self::iecBYTE(($value & 0x000000FF)); self::iecBYTE(($value & 0x000000FF));
} }
}
} }
?>
+418 -290
View File
File diff suppressed because it is too large Load Diff
+5 -4
View File
@@ -35,7 +35,8 @@ namespace PHPModbus;
* @package Phpmodbus * @package Phpmodbus
* *
*/ */
class ModbusMasterTcp extends ModbusMaster { class ModbusMasterTcp extends ModbusMaster
{
/** /**
* ModbusMasterTcp * ModbusMasterTcp
* *
@@ -43,8 +44,8 @@ class ModbusMasterTcp extends ModbusMaster {
* *
* @param String $host An IP address of a Modbus TCP device. E.g. "192.168.1.1". * @param String $host An IP address of a Modbus TCP device. E.g. "192.168.1.1".
*/ */
function ModbusMasterTcp($host){ public function __construct($host)
$this->host = $host; {
$this->socket_protocol = "TCP"; parent::__construct($host, "TCP");
} }
} }
+5 -5
View File
@@ -35,8 +35,8 @@ namespace PHPModbus;
* @package Phpmodbus * @package Phpmodbus
* *
*/ */
class ModbusMasterUdp extends ModbusMaster { class ModbusMasterUdp extends ModbusMaster
{
/** /**
* ModbusMasterUdp * ModbusMasterUdp
* *
@@ -44,8 +44,8 @@ class ModbusMasterUdp extends ModbusMaster {
* *
* @param String $host An IP address of a Modbus UDP device. E.g. "192.168.1.1". * @param String $host An IP address of a Modbus UDP device. E.g. "192.168.1.1".
*/ */
function ModbusMasterUdp($host){ public function __construct($host)
$this->host = $host; {
$this->socket_protocol = "UDP"; parent::__construct($host, "UDP");
} }
} }
+71 -57
View File
@@ -1,6 +1,7 @@
<?php <?php
namespace PHPModbus; namespace PHPModbus;
use Exception;
/** /**
* Phpmodbus Copyright (c) 2004, 2012 Jan Krakora * Phpmodbus Copyright (c) 2004, 2012 Jan Krakora
@@ -28,8 +29,8 @@ namespace PHPModbus;
* @package Phpmodbus * @package Phpmodbus
* *
*/ */
class PhpType { class PhpType
{
/** /**
* bytes2float * bytes2float
* *
@@ -37,19 +38,17 @@ class PhpType {
* depends on order of the input bytes (endianning). * depends on order of the input bytes (endianning).
* *
* @param array $values * @param array $values
* @param bool $endianness * @param bool $bigEndian
* @return float * @return float
*/ */
public static function bytes2float($values, $endianness = 0) { public static function bytes2float($values, $bigEndian = 0)
$data = array(); {
$real = 0;
// Set the array to correct form // Set the array to correct form
$data = self::checkData($values); $data = self::checkData($values);
// Combine bytes // Combine bytes
$real = self::combineBytes($data, $endianness); $real = self::combineBytes($data, $bigEndian);
// Convert the real value to float // Convert the real value to float
return (float) self::real2float($real); return (float)self::real2float($real);
} }
/** /**
@@ -59,22 +58,23 @@ class PhpType {
* The return value depends on order of the input bytes (endianning). * The return value depends on order of the input bytes (endianning).
* *
* @param array $values * @param array $values
* @param bool $endianness * @param bool $bigEndian
* @return int * @return int
*/ */
public static function bytes2signedInt($values, $endianness = 0) { public static function bytes2signedInt($values, $bigEndian = 0)
{
$data = array(); $data = array();
$int = 0; $int = 0;
// Set the array to correct form // Set the array to correct form
$data = self::checkData($values); $data = self::checkData($values);
// Combine bytes // Combine bytes
$int = self::combineBytes($data, $endianness); $int = self::combineBytes($data, $bigEndian);
// In the case of signed 2 byte value convert it to 4 byte one // In the case of signed 2 byte value convert it to 4 byte one
if ((count($values) == 2) && ((0x8000 & $int) > 0)) { if ((count($values) == 2) && ((0x8000 & $int) > 0)) {
$int = 0xFFFF8000 | $int; $int = 0xFFFF8000 | $int;
} }
// Convert the value // Convert the value
return (int) self::dword2signedInt($int); return (int)self::dword2signedInt($int);
} }
/** /**
@@ -84,16 +84,17 @@ class PhpType {
* The return value depends on order of the input bytes (endianning). * The return value depends on order of the input bytes (endianning).
* *
* @param array $values * @param array $values
* @param bool $endianness * @param bool $bigEndian
* @return int|float * @return int|float
*/ */
public static function bytes2unsignedInt($values, $endianness = 0) { public static function bytes2unsignedInt($values, $bigEndian = 0)
{
$data = array(); $data = array();
$int = 0; $int = 0;
// Set the array to correct form // Set the array to correct form
$data = self::checkData($values); $data = self::checkData($values);
// Combine bytes // Combine bytes
$int = self::combineBytes($data, $endianness); $int = self::combineBytes($data, $bigEndian);
// Convert the value // Convert the value
return self::dword2unsignedInt($int); return self::dword2unsignedInt($int);
} }
@@ -105,35 +106,39 @@ class PhpType {
* the end of the string by 0x00 character as defined by string standards. * the end of the string by 0x00 character as defined by string standards.
* *
* @param array $values * @param array $values
* @param bool $endianness * @param bool $bigEndian
* @return string * @return string
*/ */
public static function bytes2string($values, $endianness = 0) { public static function bytes2string($values, $bigEndian = 0)
{
// Prepare string variable // Prepare string variable
$str = ""; $str = "";
// Parse the received data word array // Parse the received data word array
for($i=0;$i<count($values);$i+=2) { for ($i = 0; $i < count($values); $i += 2) {
if ($endianness) { if ($bigEndian) {
if($values[$i] != 0) if ($values[$i] != 0) {
$str .= chr($values[$i]); $str .= chr($values[$i]);
else } else {
break;
if($values[$i+1] != 0)
$str .= chr($values[$i+1]);
else
break; break;
} }
else { if ($values[$i + 1] != 0) {
if($values[$i+1] != 0) $str .= chr($values[$i + 1]);
$str .= chr($values[$i+1]); } else {
else
break; break;
if($values[$i] != 0) }
} else {
if ($values[$i + 1] != 0) {
$str .= chr($values[$i + 1]);
} else {
break;
}
if ($values[$i] != 0) {
$str .= chr($values[$i]); $str .= chr($values[$i]);
else } else {
break; break;
} }
} }
}
// return string // return string
return $str; return $str;
} }
@@ -144,13 +149,15 @@ class PhpType {
* This function converts a value in IEC-1131 REAL single precision form to float. * This function converts a value in IEC-1131 REAL single precision form to float.
* *
* For more see [{@link http://en.wikipedia.org/wiki/Single_precision Single precision on Wiki}] or * For more see [{@link http://en.wikipedia.org/wiki/Single_precision Single precision on Wiki}] or
* [{@link http://de.php.net/manual/en/function.base-convert.php PHP base_convert function commentary}, Todd Stokes @ Georgia Tech 21-Nov-2007] or * [{@link http://de.php.net/manual/en/function.base-convert.php PHP base_convert function commentary}, Todd Stokes
* @ Georgia Tech 21-Nov-2007] or
* [{@link http://www.php.net/manual/en/function.pack.php PHP pack/unpack functionality}] * [{@link http://www.php.net/manual/en/function.pack.php PHP pack/unpack functionality}]
* *
* @param value value in IEC REAL data type to be converted * @param int $value in IEC REAL data type to be converted
* @return float float value * @return float float value
*/ */
private static function real2float($value) { private static function real2float($value)
{
// get unsigned long // get unsigned long
$ulong = pack("L", $value); $ulong = pack("L", $value);
// set float // set float
@@ -167,9 +174,10 @@ class PhpType {
* @param int $value * @param int $value
* @return int * @return int
*/ */
private static function dword2signedInt($value) { private static function dword2signedInt($value)
{
if ((0x80000000 & $value) != 0) { if ((0x80000000 & $value) != 0) {
return -(0x7FFFFFFF & ~$value)-1; return -(0x7FFFFFFF & ~$value) - 1;
} else { } else {
return (0x7FFFFFFF & $value); return (0x7FFFFFFF & $value);
} }
@@ -183,11 +191,12 @@ class PhpType {
* @param int $value * @param int $value
* @return int|float * @return int|float
*/ */
private static function dword2unsignedInt($value) { private static function dword2unsignedInt($value)
{
if ((0x80000000 & $value) != 0) { if ((0x80000000 & $value) != 0) {
return ((float) (0x7FFFFFFF & $value)) + 2147483648; return ((float)(0x7FFFFFFF & $value)) + 2147483648;
} else { } else {
return (int) (0x7FFFFFFF & $value); return (int)(0x7FFFFFFF & $value);
} }
} }
@@ -196,15 +205,18 @@ class PhpType {
* *
* Check if the data variable is array, and check if the values are numeric * Check if the data variable is array, and check if the values are numeric
* *
* @param int $data * @param int[] $data
* @return int * @return int
* @throws Exception
*/ */
private static function checkData($data) { private static function checkData($data)
{
// Check the data // Check the data
if (!is_array($data) || if (!is_array($data) ||
count($data)<2 || count($data) < 2 ||
count($data)>4 || count($data) > 4 ||
count($data)==3) { count($data) == 3
) {
throw new Exception('The input data should be an array of 2 or 4 bytes.'); throw new Exception('The input data should be an array of 2 or 4 bytes.');
} }
// Fill the rest of array by zeroes // Fill the rest of array by zeroes
@@ -216,7 +228,8 @@ class PhpType {
if (!is_numeric($data[0]) || if (!is_numeric($data[0]) ||
!is_numeric($data[1]) || !is_numeric($data[1]) ||
!is_numeric($data[2]) || !is_numeric($data[2]) ||
!is_numeric($data[3])) { !is_numeric($data[3])
) {
throw new Exception('Data are not numeric or the array keys are not indexed by 0,1,2 and 3'); throw new Exception('Data are not numeric or the array keys are not indexed by 0,1,2 and 3');
} }
@@ -229,24 +242,25 @@ class PhpType {
* Combine bytes together * Combine bytes together
* *
* @param int $data * @param int $data
* @param bool $endianness * @param bool $bigEndian
* @return int * @return int
*/ */
private static function combineBytes($data, $endianness) { private static function combineBytes($data, $bigEndian)
{
$value = 0; $value = 0;
// Combine bytes // Combine bytes
if ($endianness == 0) if ($bigEndian == 0) {
$value = (($data[3] & 0xFF)<<16) | $value = (($data[3] & 0xFF) << 16) |
(($data[2] & 0xFF)<<24) | (($data[2] & 0xFF) << 24) |
(($data[1] & 0xFF)) | (($data[1] & 0xFF)) |
(($data[0] & 0xFF)<<8); (($data[0] & 0xFF) << 8);
else } else {
$value = (($data[3] & 0xFF)<<24) | $value = (($data[3] & 0xFF) << 24) |
(($data[2] & 0xFF)<<16) | (($data[2] & 0xFF) << 16) |
(($data[1] & 0xFF)<<8) | (($data[1] & 0xFF) << 8) |
(($data[0] & 0xFF)); (($data[0] & 0xFF));
}
return $value; return $value;
} }
} }
?>