13 Commits
Author SHA1 Message Date
MightyPork dd5a892fb6 Cleaned up the code, fixed broken phpdoc tags, formatting 2016-03-11 23:08:00 +01:00
MightyPork 7d058ee526 changed name for packagist because it doesnt like uppercase 2016-03-11 22:33:11 +01:00
MightyPork 0ac0018444 foo 2016-03-11 22:30:00 +01:00
MightyPork 5300b2a867 added a namespace 2016-03-11 22:27:10 +01:00
John S Long c676c06e2e Merge pull request #1 from FabrizioC/master
Added FC 22 Mask Write Register support
2014-12-11 14:38:09 -06:00
FabrizioC 697daedba3 Update ModbusMaster.php 2014-11-21 10:38:17 +01:00
FabrizioC cd52263b8e Added FC22 Mask Write Register example 2014-11-21 10:31:45 +01:00
FabrizioC a2bde03574 Added FC 22 Mask Write Register function 2014-11-21 10:08:44 +01:00
FabrizioC 24d16bc1aa Added FC 22 Mask Write Register function 2014-11-21 10:07:38 +01:00
John Long bb0cdd467a 0.8 release 2013-11-29 22:27:16 -06:00
John Long 9ef8e72f3e Add syntax declaration to code block in README.md 2013-06-14 09:03:03 -04:00
John Long ad507ed46c Create README.md 2013-06-14 08:01:51 -05:00
John Long 5bb5dfe654 Added tag 0.7 for changeset 5885b1a0d0dc 2013-06-14 07:43:52 -05:00
28 changed files with 2178 additions and 1771 deletions
+5
View File
@@ -0,0 +1,5 @@
/vendor
composer.lock
.idea/
*~
-2
View File
@@ -1,2 +0,0 @@
vendor
.svn
-6
View File
@@ -1,6 +0,0 @@
a88b5a87fb4cd49f16ce72062cce19d55f1fbf98 0.2
a7f90c18859d31922bdd8c61299e2790f5e2eb1a 0.3
bdf8b3f414c4d08fc0edf9fd1953f55db26e4bac 0.4
1e09b0da7d8c62a9a292ee51540feac9de4c1222 0.4.1
e1262f028e180c2719564f840ffa1a9f8672b6be 0.5
079f8ac1f49faf4e6bbb84d62c39eee1507805f2 0.6
+89 -62
View File
@@ -1,62 +1,89 @@
The Phpmodbus License, Version 1
============================
Copyright (c) 2004, 2013 Jan Krakora
All rights reserved.
This license is a legal agreement between you and Jan Krakora (the "Author")
for the use of Phpmodbus (the "Software"). By obtaining, using and/or
copying the Software, you agree that you have read, understood, and will
comply with the terms and conditions of this license.
PERMITTED USE
-------------
You are permitted to use, copy, modify, and distribute the Software and its
documentation, with or without modification, for any purpose, provided that
the following conditions are met:
1. A copy of this license agreement must be included with the distribution.
2. Redistributions of source code must retain the above copyright notice in
all source code files.
3. Redistributions in binary form must reproduce the above copyright notice
in the documentation and/or other materials provided with the distribution.
4. Products derived from the Software must include an acknowledgment that
they are derived from "Phpmodbus" in their documentation and/or other
materials provided with the distribution.
5. The name "Phpmodbus" must not be used to endorse or promote products
derived from the Software without prior written permission from Author.
6. Products derived from the Software may not be called "Phpmodbus",
nor may "Phpmodbus" appear in their name, without prior written
permission from Author.
INDEMNITY
---------
You agree to indemnify and hold harmless the Author and any contributors
for any direct, indirect, incidental, or consequential third-party claims,
actions or suits, as well as any related expenses, liabilities, damages,
settlements or fees arising from your use or misuse of the Software,
or a violation of any terms of this license.
DISCLAIMER OF WARRANTY
----------------------
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------+
| ACKNOWLEDGEMENTS |
+---------------------------------------------------------+
This project is based on work by Jan Krákora, (c) 2004-2013.
The original license is reproduced below.
https://code.google.com/archive/p/phpmodbus/
Further improvements - John S. Long and other contributors
https://github.com/adduc/phpmodbus
Cleanup and namespaces - Ondřej Hruška, 2016
https://github.com/MightyPork/phpmodbus
+---------------------------------------------------------+
| ORIGINAL LICENSE |
+---------------------------------------------------------+
The Phpmodbus License, Version 1
============================
Copyright (c) 2004, 2013 Jan Krakora
All rights reserved.
This license is a legal agreement between you and Jan Krakora (the "Author")
for the use of Phpmodbus (the "Software"). By obtaining, using and/or
copying the Software, you agree that you have read, understood, and will
comply with the terms and conditions of this license.
PERMITTED USE
-------------
You are permitted to use, copy, modify, and distribute the Software and its
documentation, with or without modification, for any purpose, provided that
the following conditions are met:
1. A copy of this license agreement must be included with the distribution.
2. Redistributions of source code must retain the above copyright notice in
all source code files.
3. Redistributions in binary form must reproduce the above copyright notice
in the documentation and/or other materials provided with the distribution.
4. Products derived from the Software must include an acknowledgment that
they are derived from "Phpmodbus" in their documentation and/or other
materials provided with the distribution.
5. The name "Phpmodbus" must not be used to endorse or promote products
derived from the Software without prior written permission from Author.
6. Products derived from the Software may not be called "Phpmodbus",
nor may "Phpmodbus" appear in their name, without prior written
permission from Author.
INDEMNITY
---------
You agree to indemnify and hold harmless the Author and any contributors
for any direct, indirect, incidental, or consequential third-party claims,
actions or suits, as well as any related expenses, liabilities, damages,
settlements or fees arising from your use or misuse of the Software,
or a violation of any terms of this license.
DISCLAIMER OF WARRANTY
----------------------
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
End of file.
-133
View File
@@ -1,133 +0,0 @@
<?php
/**
* Phpmodbus Copyright (c) 2004, 2013 Jan Krakora
*
* This source file is subject to the "PhpModbus license" that is bundled
* with this package in the file license.txt.
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2013 Jan Krakora
* @license PhpModbus license
* @category Phpmodbus
* @package Phpmodbus
* @version $id$
*/
/**
* IecType
*
* The class includes set of IEC-1131 data type functions that converts a PHP
* data types to a IEC data type.
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2010 Jan Krakora
* @package Phpmodbus
*/
class IecType {
/**
* iecBYTE
*
* Converts a value to IEC-1131 BYTE data type
*
* @param value value from 0 to 255
* @return value IEC BYTE data type
*
*/
public static function iecBYTE($value) {
return chr($value & 0xFF);
}
/**
* iecINT
*
* Converts a value to IEC-1131 INT data type
*
* @param value value to be converted
* @return value IEC-1131 INT data type
*
*/
public static function iecINT($value) {
return self::iecBYTE(($value >> 8) & 0x00FF) .
self::iecBYTE(($value & 0x00FF));
}
/**
* iecDINT
*
* Converts a value to IEC-1131 DINT data type
*
* @param value value to be converted
* @param value endianness defines endian codding (little endian == 0, big endian == 1)
* @return value IEC-1131 INT data type
*
*/
public static function iecDINT($value, $endianness = 0) {
// result with right endianness
return self::endianness($value, $endianness);
}
/**
* iecREAL
*
* Converts a value to IEC-1131 REAL data type. The function uses function @use float2iecReal.
*
* @param value value to be converted
* @param value endianness defines endian codding (little endian == 0, big endian == 1)
* @return value IEC-1131 REAL data type
*/
public static function iecREAL($value, $endianness = 0) {
// iecREAL representation
$real = self::float2iecReal($value);
// result with right endianness
return self::endianness($real, $endianness);
}
/**
* float2iecReal
*
* 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
* [{@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}]
*
* @param float value to be converted
* @return value IEC REAL data type
*/
private static function float2iecReal($value) {
// get float binary string
$float = pack("f", $value);
// set 32-bit unsigned integer of the float
$w = unpack("L", $float);
return $w[1];
}
/**
* endianness
*
* Make endianess as required.
* For more see http://en.wikipedia.org/wiki/Endianness
*
* @param int $value
* @param bool $endianness
* @return int
*/
private static function endianness($value, $endianness = 0) {
if ($endianness == 0)
return
self::iecBYTE(($value >> 8) & 0x000000FF) .
self::iecBYTE(($value & 0x000000FF)) .
self::iecBYTE(($value >> 24) & 0x000000FF) .
self::iecBYTE(($value >> 16) & 0x000000FF);
else
return
self::iecBYTE(($value >> 24) & 0x000000FF) .
self::iecBYTE(($value >> 16) & 0x000000FF) .
self::iecBYTE(($value >> 8) & 0x000000FF) .
self::iecBYTE(($value & 0x000000FF));
}
}
?>
File diff suppressed because it is too large Load Diff
-49
View File
@@ -1,49 +0,0 @@
<?php
/**
* Phpmodbus Copyright (c) 2004, 2012 Jan Krakora
*
* This source file is subject to the "PhpModbus license" that is bundled
* with this package in the file license.txt.
*
*
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @license PhpModbus license
* @category Phpmodbus
* @tutorial Phpmodbus.pkg
* @package Phpmodbus
* @version $id$
*
*/
require_once dirname(__FILE__) . '/ModbusMaster.php';
/**
* ModbusMasterTcp
*
* This class deals with the MODBUS master using TCP. Extends ModbusMaster class.
*
* Implemented MODBUS functions:
* - FC 1: read coils
* - FC 3: read multiple registers
* - FC 15: write multiple coils
* - FC 16: write multiple registers
* - FC 23: read write registers
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @package Phpmodbus
*
*/
class ModbusMasterTcp extends ModbusMaster {
/**
* ModbusMasterTcp
*
* This is the constructor that defines {@link $host} IP address of the object.
*
* @param String $host An IP address of a Modbus TCP device. E.g. "192.168.1.1".
*/
function ModbusMasterTcp($host){
$this->host = $host;
$this->socket_protocol = "TCP";
}
}
-50
View File
@@ -1,50 +0,0 @@
<?php
/**
* Phpmodbus Copyright (c) 2004, 2012 Jan Krakora
*
* This source file is subject to the "PhpModbus license" that is bundled
* with this package in the file license.txt.
*
*
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @license PhpModbus license
* @category Phpmodbus
* @tutorial Phpmodbus.pkg
* @package Phpmodbus
* @version $id$
*
*/
require_once dirname(__FILE__) . '/ModbusMaster.php';
/**
* ModbusMasterUdp
*
* This class deals with the MODBUS master using UDP stack.
*
* Implemented MODBUS master functions:
* - FC 1: read coils
* - FC 3: read multiple registers
* - FC 15: write multiple coils
* - FC 16: write multiple registers
* - FC 23: read write registers
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @package Phpmodbus
*
*/
class ModbusMasterUdp extends ModbusMaster {
/**
* ModbusMasterUdp
*
* This is the constructor that defines {@link $host} IP address of the object.
*
* @param String $host An IP address of a Modbus UDP device. E.g. "192.168.1.1".
*/
function ModbusMasterUdp($host){
$this->host = $host;
$this->socket_protocol = "UDP";
}
}
-249
View File
@@ -1,249 +0,0 @@
<?php
/**
* Phpmodbus Copyright (c) 2004, 2012 Jan Krakora
*
* This source file is subject to the "PhpModbus license" that is bundled
* with this package in the file license.txt.
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @license PhpModbus license
* @category Phpmodbus
* @package Phpmodbus
* @version $id$
*
*/
/**
* PhpType
*
* The class includes set of methods that convert the received Modbus data
* (array of bytes) to the PHP data type, i.e. signed int, unsigned int and float.
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @package Phpmodbus
*
*/
class PhpType {
/**
* bytes2float
*
* The function converts array of 4 bytes to float. The return value
* depends on order of the input bytes (endianning).
*
* @param array $values
* @param bool $endianness
* @return float
*/
public static function bytes2float($values, $endianness = 0) {
$data = array();
$real = 0;
// Set the array to correct form
$data = self::checkData($values);
// Combine bytes
$real = self::combineBytes($data, $endianness);
// Convert the real value to float
return (float) self::real2float($real);
}
/**
* bytes2signedInt
*
* The function converts array of 2 or 4 bytes to signed integer.
* The return value depends on order of the input bytes (endianning).
*
* @param array $values
* @param bool $endianness
* @return int
*/
public static function bytes2signedInt($values, $endianness = 0) {
$data = array();
$int = 0;
// Set the array to correct form
$data = self::checkData($values);
// Combine bytes
$int = self::combineBytes($data, $endianness);
// In the case of signed 2 byte value convert it to 4 byte one
if ((count($values) == 2) && ((0x8000 & $int) > 0)) {
$int = 0xFFFF8000 | $int;
}
// Convert the value
return (int) self::dword2signedInt($int);
}
/**
* bytes2unsignedInt
*
* The function converts array of 2 or 4 bytes to unsigned integer.
* The return value depends on order of the input bytes (endianning).
*
* @param array $values
* @param bool $endianness
* @return int|float
*/
public static function bytes2unsignedInt($values, $endianness = 0) {
$data = array();
$int = 0;
// Set the array to correct form
$data = self::checkData($values);
// Combine bytes
$int = self::combineBytes($data, $endianness);
// Convert the value
return self::dword2unsignedInt($int);
}
/**
* bytes2string
*
* The function converts an values array to the string. The function detects
* the end of the string by 0x00 character as defined by string standards.
*
* @param array $values
* @param bool $endianness
* @return string
*/
public static function bytes2string($values, $endianness = 0) {
// Prepare string variable
$str = "";
// Parse the received data word array
for($i=0;$i<count($values);$i+=2) {
if ($endianness) {
if($values[$i] != 0)
$str .= chr($values[$i]);
else
break;
if($values[$i+1] != 0)
$str .= chr($values[$i+1]);
else
break;
}
else {
if($values[$i+1] != 0)
$str .= chr($values[$i+1]);
else
break;
if($values[$i] != 0)
$str .= chr($values[$i]);
else
break;
}
}
// return string
return $str;
}
/**
* real2float
*
* 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
* [{@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}]
*
* @param value value in IEC REAL data type to be converted
* @return float float value
*/
private static function real2float($value) {
// get unsigned long
$ulong = pack("L", $value);
// set float
$float = unpack("f", $ulong);
return $float[1];
}
/**
* dword2signedInt
*
* Switch double word to signed integer
*
* @param int $value
* @return int
*/
private static function dword2signedInt($value) {
if ((0x80000000 & $value) != 0) {
return -(0x7FFFFFFF & ~$value)-1;
} else {
return (0x7FFFFFFF & $value);
}
}
/**
* dword2signedInt
*
* Switch double word to unsigned integer
*
* @param int $value
* @return int|float
*/
private static function dword2unsignedInt($value) {
if ((0x80000000 & $value) != 0) {
return ((float) (0x7FFFFFFF & $value)) + 2147483648;
} else {
return (int) (0x7FFFFFFF & $value);
}
}
/**
* checkData
*
* Check if the data variable is array, and check if the values are numeric
*
* @param int $data
* @return int
*/
private static function checkData($data) {
// Check the data
if (!is_array($data) ||
count($data)<2 ||
count($data)>4 ||
count($data)==3) {
throw new Exception('The input data should be an array of 2 or 4 bytes.');
}
// Fill the rest of array by zeroes
if (count($data) == 2) {
$data[2] = 0;
$data[3] = 0;
}
// Check the values to be number
if (!is_numeric($data[0]) ||
!is_numeric($data[1]) ||
!is_numeric($data[2]) ||
!is_numeric($data[3])) {
throw new Exception('Data are not numeric or the array keys are not indexed by 0,1,2 and 3');
}
return $data;
}
/**
* combineBytes
*
* Combine bytes together
*
* @param int $data
* @param bool $endianness
* @return int
*/
private static function combineBytes($data, $endianness) {
$value = 0;
// Combine bytes
if ($endianness == 0)
$value = (($data[3] & 0xFF)<<16) |
(($data[2] & 0xFF)<<24) |
(($data[1] & 0xFF)) |
(($data[0] & 0xFF)<<8);
else
$value = (($data[3] & 0xFF)<<24) |
(($data[2] & 0xFF)<<16) |
(($data[1] & 0xFF)<<8) |
(($data[0] & 0xFF));
return $value;
}
}
?>
+49
View File
@@ -0,0 +1,49 @@
# phpmodbus
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/
> **What's new**
>
> 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:
* Modbus master
* FC1 - Read coils
* FC2 - Read input discretes
* FC3 - Read holding registers
* FC4 - Read holding input registers
* FC5 - Write single coil
* FC6 - Write single register
* FC15 - Write multiple coils
* FC16 - Write multiple registers
* FC23 - Read/Write multiple registers
Example:
```php
require_once dirname(__FILE__) . '/Phpmodbus/ModbusMaster.php';
// Modbus master UDP
$modbus = new ModbusMaster("192.168.1.1", "UDP");
// Read multiple registers
try {
$recData = $modbus->readMultipleRegisters(0, 12288, 5);
}
catch (Exception $e) {
// Print error information if any
echo $modbus;
echo $e;
exit;
}
// Print data in string format
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].
Note:
* The PHP extension php_sockets.dll should be enabled (server php.ini file)
+18 -14
View File
@@ -1,17 +1,21 @@
{
"name": "adduc/phpmodbus",
"description": "Composer version of PhpModBus",
"license": "LGPL",
"authors": [
{
"name": "Honza Krakora",
"email": "krakora.jan@googlemail.com"
}
],
"autoload": {
"classmap": [ "Phpmodbus" ]
},
"require": {
"ext-sockets": "*"
"name": "mightypork/phpmodbus",
"keywords": ["phpmodbus","modbus"],
"description": "PhpModbus with namespaces and updated to PHP 7",
"license": "LGPL",
"require": {
"php": "^5.3.2 || ^7.0",
"ext-sockets": "*"
},
"authors": [
{
"name": "Honza Krakora",
"email": "krakora.jan@googlemail.com"
}
],
"autoload": {
"psr-4": {
"PHPModbus\\": "src/"
}
}
}
+3
View File
@@ -0,0 +1,3 @@
Those examples have not been updated to use namespaces.
They may not work. Just for reference.
+28
View File
@@ -0,0 +1,28 @@
<?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php';
// Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP");
// Data to be writen
$bitValue = true;
$bitNumber = 2;
$andMask = 0xFFFF ^ pow(2, $bitNumber) ;
$orMask = 0x0000 ^ (pow(2, $bitNumber) * $bitValue ) ;
try {
// FC22
$modbus->maskWriteRegister(0, 12288, $andMask, $orMask);
}
catch (Exception $e) {
// Print error information if any
echo $modbus;
echo $e;
exit;
}
// Print status information
echo $modbus;
?>
+19
View File
@@ -0,0 +1,19 @@
<?php
require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php';
// Create Modbus object
$modbus = new ModbusMasterUdp("192.192.15.51");
try {
// Read input discretes - FC 4
$recData = $modbus->readMultipleInputRegisters(0, 0, 2);
}
catch (Exception $e) {
// Print error information if any
echo $modbus;
echo $e;
exit;
}
var_dump($recData);
+24
View File
@@ -0,0 +1,24 @@
<?php
require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php';
// Create Modbus object
$modbus = new ModbusMasterUdp("192.192.15.51");
// Data to be writen - TRUE, FALSE
$data_true = array(TRUE);
$data_false = array(FALSE);
try {
// Write single coil - FC5
$modbus->writeSingleCoil(0, 12288, $data_true);
$modbus->writeSingleCoil(0, 12289, $data_false);
$modbus->writeSingleCoil(0, 12290, $data_true);
$modbus->writeSingleCoil(0, 12291, $data_false);
}
catch (Exception $e) {
// Print error information if any
echo $modbus;
echo $e;
exit;
}
+141
View File
@@ -0,0 +1,141 @@
<?php
namespace PHPModbus;
/**
* Phpmodbus Copyright (c) 2004, 2013 Jan Krakora
*
* This source file is subject to the "PhpModbus license" that is bundled
* with this package in the file license.txt.
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2013 Jan Krakora
* @license PhpModbus license
* @category Phpmodbus
* @package Phpmodbus
* @version $id$
*/
/**
* IecType
*
* The class includes set of IEC-1131 data type functions that converts a PHP
* data types to a IEC data type.
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2010 Jan Krakora
* @package Phpmodbus
*/
class IecType
{
/**
* iecBYTE
*
* Converts a value to IEC-1131 BYTE data type
*
* @param int $value from 0 to 255
* @return int IEC BYTE data type
*
*/
public static function iecBYTE($value)
{
return chr($value & 0xFF);
}
/**
* iecINT
*
* Converts a value to IEC-1131 INT data type
*
* @param int $value to be converted
* @return int IEC-1131 INT data type
*
*/
public static function iecINT($value)
{
return self::iecBYTE(($value >> 8) & 0x00FF) .
self::iecBYTE(($value & 0x00FF));
}
/**
* iecDINT
*
* Converts a value to IEC-1131 DINT data type
*
* @param int $value to be converted
* @param int $bigEndian defines endian codding (little endian == 0, big endian == 1)
* @return int IEC-1131 INT data type
*
*/
public static function iecDINT($value, $bigEndian = 0)
{
// result with right endianness
return self::endianness($value, $bigEndian);
}
/**
* iecREAL
*
* Converts a value to IEC-1131 REAL data type. The function uses function @use float2iecReal.
*
* @param int $value to be converted
* @param bool $bigEndian defines endian codding (little endian == 0, big endian == 1)
* @return int IEC-1131 REAL data type
*/
public static function iecREAL($value, $bigEndian = 0)
{
// iecREAL representation
$real = self::float2iecReal($value);
// result with right endianness
return self::endianness($real, $bigEndian);
}
/**
* float2iecReal
*
* 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
* [{@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}]
*
* @param float $value to be converted
* @return int IEC REAL data type
*/
private static function float2iecReal($value)
{
// get float binary string
$float = pack("f", $value);
// set 32-bit unsigned integer of the float
$w = unpack("L", $float);
return $w[1];
}
/**
* endianness
*
* Make endianess as required.
* For more see http://en.wikipedia.org/wiki/Endianness
*
* @param int $value
* @param bool $bigEndian
* @return int
*/
private static function endianness($value, $bigEndian = 0)
{
if ($bigEndian == 0) {
return
self::iecBYTE(($value >> 8) & 0x000000FF) .
self::iecBYTE(($value & 0x000000FF)) .
self::iecBYTE(($value >> 24) & 0x000000FF) .
self::iecBYTE(($value >> 16) & 0x000000FF);
} else {
return
self::iecBYTE(($value >> 24) & 0x000000FF) .
self::iecBYTE(($value >> 16) & 0x000000FF) .
self::iecBYTE(($value >> 8) & 0x000000FF) .
self::iecBYTE(($value & 0x000000FF));
}
}
}
+1376
View File
File diff suppressed because it is too large Load Diff
+51
View File
@@ -0,0 +1,51 @@
<?php
namespace PHPModbus;
/**
* Phpmodbus Copyright (c) 2004, 2012 Jan Krakora
*
* This source file is subject to the "PhpModbus license" that is bundled
* with this package in the file license.txt.
*
*
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @license PhpModbus license
* @category Phpmodbus
* @tutorial Phpmodbus.pkg
* @package Phpmodbus
* @version $id$
*
*/
/**
* ModbusMasterTcp
*
* This class deals with the MODBUS master using TCP. Extends ModbusMaster class.
*
* Implemented MODBUS functions:
* - FC 1: read coils
* - FC 3: read multiple registers
* - FC 15: write multiple coils
* - FC 16: write multiple registers
* - FC 23: read write registers
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @package Phpmodbus
*
*/
class ModbusMasterTcp extends ModbusMaster
{
/**
* ModbusMasterTcp
*
* This is the constructor that defines {@link $host} IP address of the object.
*
* @param String $host An IP address of a Modbus TCP device. E.g. "192.168.1.1".
*/
public function __construct($host)
{
parent::__construct($host, "TCP");
}
}
+51
View File
@@ -0,0 +1,51 @@
<?php
namespace PHPModbus;
/**
* Phpmodbus Copyright (c) 2004, 2012 Jan Krakora
*
* This source file is subject to the "PhpModbus license" that is bundled
* with this package in the file license.txt.
*
*
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @license PhpModbus license
* @category Phpmodbus
* @tutorial Phpmodbus.pkg
* @package Phpmodbus
* @version $id$
*
*/
/**
* ModbusMasterUdp
*
* This class deals with the MODBUS master using UDP stack.
*
* Implemented MODBUS master functions:
* - FC 1: read coils
* - FC 3: read multiple registers
* - FC 15: write multiple coils
* - FC 16: write multiple registers
* - FC 23: read write registers
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @package Phpmodbus
*
*/
class ModbusMasterUdp extends ModbusMaster
{
/**
* ModbusMasterUdp
*
* This is the constructor that defines {@link $host} IP address of the object.
*
* @param String $host An IP address of a Modbus UDP device. E.g. "192.168.1.1".
*/
public function __construct($host)
{
parent::__construct($host, "UDP");
}
}
+266
View File
@@ -0,0 +1,266 @@
<?php
namespace PHPModbus;
use Exception;
/**
* Phpmodbus Copyright (c) 2004, 2012 Jan Krakora
*
* This source file is subject to the "PhpModbus license" that is bundled
* with this package in the file license.txt.
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @license PhpModbus license
* @category Phpmodbus
* @package Phpmodbus
* @version $id$
*
*/
/**
* PhpType
*
* The class includes set of methods that convert the received Modbus data
* (array of bytes) to the PHP data type, i.e. signed int, unsigned int and float.
*
* @author Jan Krakora
* @copyright Copyright (c) 2004, 2012 Jan Krakora
* @package Phpmodbus
*
*/
class PhpType
{
/**
* bytes2float
*
* The function converts array of 4 bytes to float. The return value
* depends on order of the input bytes (endianning).
*
* @param array $values
* @param bool $bigEndian
* @return float
*/
public static function bytes2float($values, $bigEndian = 0)
{
// Set the array to correct form
$data = self::checkData($values);
// Combine bytes
$real = self::combineBytes($data, $bigEndian);
// Convert the real value to float
return (float)self::real2float($real);
}
/**
* bytes2signedInt
*
* The function converts array of 2 or 4 bytes to signed integer.
* The return value depends on order of the input bytes (endianning).
*
* @param array $values
* @param bool $bigEndian
* @return int
*/
public static function bytes2signedInt($values, $bigEndian = 0)
{
$data = array();
$int = 0;
// Set the array to correct form
$data = self::checkData($values);
// Combine bytes
$int = self::combineBytes($data, $bigEndian);
// In the case of signed 2 byte value convert it to 4 byte one
if ((count($values) == 2) && ((0x8000 & $int) > 0)) {
$int = 0xFFFF8000 | $int;
}
// Convert the value
return (int)self::dword2signedInt($int);
}
/**
* bytes2unsignedInt
*
* The function converts array of 2 or 4 bytes to unsigned integer.
* The return value depends on order of the input bytes (endianning).
*
* @param array $values
* @param bool $bigEndian
* @return int|float
*/
public static function bytes2unsignedInt($values, $bigEndian = 0)
{
$data = array();
$int = 0;
// Set the array to correct form
$data = self::checkData($values);
// Combine bytes
$int = self::combineBytes($data, $bigEndian);
// Convert the value
return self::dword2unsignedInt($int);
}
/**
* bytes2string
*
* The function converts an values array to the string. The function detects
* the end of the string by 0x00 character as defined by string standards.
*
* @param array $values
* @param bool $bigEndian
* @return string
*/
public static function bytes2string($values, $bigEndian = 0)
{
// Prepare string variable
$str = "";
// Parse the received data word array
for ($i = 0; $i < count($values); $i += 2) {
if ($bigEndian) {
if ($values[$i] != 0) {
$str .= chr($values[$i]);
} else {
break;
}
if ($values[$i + 1] != 0) {
$str .= chr($values[$i + 1]);
} else {
break;
}
} else {
if ($values[$i + 1] != 0) {
$str .= chr($values[$i + 1]);
} else {
break;
}
if ($values[$i] != 0) {
$str .= chr($values[$i]);
} else {
break;
}
}
}
// return string
return $str;
}
/**
* real2float
*
* 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
* [{@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}]
*
* @param int $value in IEC REAL data type to be converted
* @return float float value
*/
private static function real2float($value)
{
// get unsigned long
$ulong = pack("L", $value);
// set float
$float = unpack("f", $ulong);
return $float[1];
}
/**
* dword2signedInt
*
* Switch double word to signed integer
*
* @param int $value
* @return int
*/
private static function dword2signedInt($value)
{
if ((0x80000000 & $value) != 0) {
return -(0x7FFFFFFF & ~$value) - 1;
} else {
return (0x7FFFFFFF & $value);
}
}
/**
* dword2signedInt
*
* Switch double word to unsigned integer
*
* @param int $value
* @return int|float
*/
private static function dword2unsignedInt($value)
{
if ((0x80000000 & $value) != 0) {
return ((float)(0x7FFFFFFF & $value)) + 2147483648;
} else {
return (int)(0x7FFFFFFF & $value);
}
}
/**
* checkData
*
* Check if the data variable is array, and check if the values are numeric
*
* @param int[] $data
* @return int
* @throws Exception
*/
private static function checkData($data)
{
// Check the data
if (!is_array($data) ||
count($data) < 2 ||
count($data) > 4 ||
count($data) == 3
) {
throw new Exception('The input data should be an array of 2 or 4 bytes.');
}
// Fill the rest of array by zeroes
if (count($data) == 2) {
$data[2] = 0;
$data[3] = 0;
}
// Check the values to be number
if (!is_numeric($data[0]) ||
!is_numeric($data[1]) ||
!is_numeric($data[2]) ||
!is_numeric($data[3])
) {
throw new Exception('Data are not numeric or the array keys are not indexed by 0,1,2 and 3');
}
return $data;
}
/**
* combineBytes
*
* Combine bytes together
*
* @param int $data
* @param bool $bigEndian
* @return int
*/
private static function combineBytes($data, $bigEndian)
{
$value = 0;
// Combine bytes
if ($bigEndian == 0) {
$value = (($data[3] & 0xFF) << 16) |
(($data[2] & 0xFF) << 24) |
(($data[1] & 0xFF)) |
(($data[0] & 0xFF) << 8);
} else {
$value = (($data[3] & 0xFF) << 24) |
(($data[2] & 0xFF) << 16) |
(($data[1] & 0xFF) << 8) |
(($data[0] & 0xFF));
}
return $value;
}
}
@@ -0,0 +1,11 @@
Test should pass when %IX0.0==FALSE and %IX0.1==TRUE
array(4) {
[0]=>
int(0)
[1]=>
int(2)
[2]=>
int(0)
[3]=>
int(0)
}
@@ -0,0 +1,5 @@
Array
(
[0] => 0
[1] => 5
)
+14
View File
@@ -0,0 +1,14 @@
<?php
require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php';
require_once dirname(__FILE__) . '/../config.php';
// Create Modbus object
$modbus = new ModbusMasterUdp($test_host_ip);
// Test requirements
echo "Test should pass when %IX0.0==FALSE and %IX0.1==TRUE\n";
// Read input discretes - FC 4
$recData = $modbus->readMultipleInputRegisters(0, 0, 2);
var_dump($recData);
+23
View File
@@ -0,0 +1,23 @@
<?php
require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php';
require_once dirname(__FILE__) . '/../config.php';
// Create Modbus object
$modbus = new ModbusMasterUdp($test_host_ip);
// Data to be writen - TRUE, FALSE
$data_true = array(TRUE);
$data_false = array(FALSE);
// Reset target WORD
$modbus->writeSingleRegister(0, 12288, array(0), array('WORD'));
// Write single coil - FC5
$modbus->writeSingleCoil(0, 12288, $data_true);
$modbus->writeSingleCoil(0, 12289, $data_false);
$modbus->writeSingleCoil(0, 12290, $data_true);
$modbus->writeSingleCoil(0, 12291, $data_false);
// Read data - FC3
$recData = $modbus->readMultipleRegisters(0, 12288, 1);
print_r($recData);
+3
View File
@@ -0,0 +1,3 @@
Probably broken and dubious.
Left from the original repo.
+2 -2
View File
@@ -1,3 +1,3 @@
<?php
$test_host_ip = "192.168.1.105";
$test_bind_client_ip = "192.168.1.106";
$test_host_ip = "192.192.1.10";
$test_bind_client_ip = "192.192.1.100";
-190
View File
@@ -1,190 +0,0 @@
<refentry id="{@id}">
<refnamediv>
<refname>Phpmodbus user's guide</refname>
<refpurpose>Phpmodbus How-to</refpurpose>
</refnamediv>
<refsynopsisdiv>
<author>
Jan Krakora
<authorblurb>
{@link mailto:krakora.jan@googlemail.com email}
</authorblurb>
</author>
</refsynopsisdiv>
{@toc}
<refsect1 id="{@id intro}">
<title>Introduction</title>
<para>
Phpmodbus is a PHP library for the Modbus protocol. The library implements
Modbus TCP/UDP master class with subset of the most used Modbus commands.
</para>
<para>
The library implements:
<itemizedlist>
<listitem><para>FC 1: read multiple coils</para></listitem>
<listitem><para>FC 2: read input discretes</para></listitem>
<listitem><para>FC 3: read multiple registers</para></listitem>
<listitem><para>FC 6: write single register</para></listitem>
<listitem><para>FC 15: write multiple coils</para></listitem>
<listitem><para>FC 16: write multiple registers</para></listitem>
<listitem><para>FC 23: read write registers</para></listitem>
</itemizedlist>
</para>
<para>
For more about Modbus protocol see [{@link http://www.modbus.org}] or
[{@link http://en.wikipedia.org/wiki/Modbus Wiki}]
</para>
</refsect1>
<refsect1 id="{@id install}">
<title>Install</title>
<para>
At the first, it is supposed an PHP solution has been already installed on
your server (LAMP, WAMP, MSS+CGI etc.).
</para>
<para>
Copy the Phpmodbus library to your PHP project folder.
</para>
<para>
Create a PHP script and assign the library using require_once() command
<programlisting role="c">
<![CDATA[require_once dirname(__FILE__) . '/Phpmodbus/ModbusMaster.php'; ]]>
</programlisting>
</para>
<para>
To create UDP Modbus master object communicating to an modbus slave
e.g. at IP address 192.168.1.1 write
<programlisting role="c" linenumbering="numbered" startinglinenumber="2">
<![CDATA[ $modbus = new ModbusMaster("192.168.1.1", "UDP"); ]]>
</programlisting>
</para>
<para>
To create TCP Modbus master use
<programlisting role="c" linenumbering="numbered" startinglinenumber="2">
<![CDATA[ $modbus = new ModbusMaster("192.168.1.1", "TCP"); ]]>
</programlisting>
</para>
<para>
To read 5 words (10 bytes) from the device ID=0 and its memory address 12288
use try-catch method call
<programlisting role="c" linenumbering="numbered" startinglinenumber="3">
<![CDATA[try {
// Function processing
$recData = $modbus->readMultipleRegisters(0, 12288, 5);
}
catch (Exception $e) {
// Exception processing, e.g. print error information
echo $modbus;
echo $e;
exit;
}]]>
</programlisting>
</para>
<para>
To process the function byte stream, use conversion to PHP types in
</para>
<programlisting role="c" linenumbering="numbered" startinglinenumber="15">
<![CDATA[echo PhpType::bytes2string($recData); ]]>
</programlisting>
<para>
For other examples see sections bellow.
</para>
</refsect1>
<refsect1 id="{@id examples}">
<title>Examples</title>
<para>
This section presents library features and examples
</para>
<refsect2 id="{@id example_fc1}">
<title>FC1 - read mutliple coils</title>
<para>
FC1 functionality example
</para>
<para>
{@example example_fc1.php}
</para>
</refsect2>
<refsect2 id="{@id example_fc2}">
<title>FC2 - read input discretes</title>
<para>
FC2 functionality example
</para>
<para>
{@example example_fc2.php}
</para>
</refsect2>
<refsect2 id="{@id example_fc3}">
<title>FC3 - read mutliple registers</title>
<para>
FC3 functionality example
</para>
<para>
{@example example_fc3.php}
</para>
</refsect2>
<refsect2 id="{@id example_fc6}">
<title>FC6 - write single register</title>
<para>
FC6 functionality example
</para>
<para>
{@example example_fc6.php}
</para>
</refsect2>
<refsect2 id="{@id example_fc15}">
<title>FC15 - write mutliple coils</title>
<para>
FC15 functionality example
</para>
<para>
{@example example_fc15.php}
</para>
</refsect2>
<refsect2 id="{@id example_fc16}">
<title>FC16 - write mutliple registers</title>
<para>
FC16 functionality example
</para>
<para>
{@example example_fc16.php}
</para>
</refsect2>
<refsect2 id="{@id example_fc23}">
<title>FC23 - read write registers</title>
<para>
FC23 functionality example
</para>
<para>
{@example example_fc23.php}
</para>
</refsect2>
<refsect2 id="{@id wago_example}">
<title>Dump of M-memory from WAGO 750-84x series coupler.</title>
<para>
Dump of M-memory from WAGO 750-84x series coupler.
</para>
<para>
{@example example_750841_Mmemory.php}
</para>
</refsect2>
<refsect2 id="{@id datatype}">
<title>Data conversion to PHP types.</title>
<para>
Conversion of the data bytes, received from Modbus, to a PHP type.
</para>
<para>
{@example example_datatype.php}
</para>
</refsect2>
</refsect1>
<refsect1 id="{@id back_comp}">
<title>Back compatibility</title>
<para>
This version is back compatible to the last versions. Just use
<programlisting role="c">
<![CDATA[require_once dirname(__FILE__) . '/Phpmodbus/ModbusMasterUdp.php';
$modbus = new ModbusMasterUdp("192.168.1.1");
// ... ]]>
</programlisting>
</para>
</refsect1>
</refentry>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB