15 Commits
Author SHA1 Message Date
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
John Long 83d9baa9f6 0.7 release 2013-06-14 07:43:45 -05:00
John Long 753bff38ec Added tag 0.6 for changeset 079f8ac1f49f 2013-06-14 07:43:03 -05:00
John Long 5f069276eb 0.6 release 2013-06-14 07:43:00 -05:00
John Long 7f4c4f2af1 Added tag 0.5 for changeset e1262f028e18 2013-06-14 07:42:20 -05:00
40 changed files with 2555 additions and 1565 deletions
+4
View File
@@ -0,0 +1,4 @@
/vendor
composer.lock
*~
-2
View File
@@ -1,2 +0,0 @@
vendor
.svn
-4
View File
@@ -1,4 +0,0 @@
a88b5a87fb4cd49f16ce72062cce19d55f1fbf98 0.2
a7f90c18859d31922bdd8c61299e2790f5e2eb1a 0.3
bdf8b3f414c4d08fc0edf9fd1953f55db26e4bac 0.4
1e09b0da7d8c62a9a292ee51540feac9de4c1222 0.4.1
+89 -62
View File
@@ -1,62 +1,89 @@
The Phpmodbus License, Version 1 +---------------------------------------------------------+
============================ | ACKNOWLEDGEMENTS |
+---------------------------------------------------------+
Copyright (c) 2004, 2011 Jan Krakora, Wago (http://www.wago.com)
All rights reserved. This project is based on work by Jan Krákora, (c) 2004-2013.
The original license is reproduced below.
This license is a legal agreement between you and Jan Krakora, Wago (the "Author")
for the use of Phpmodbus (the "Software"). By obtaining, using and/or https://code.google.com/archive/p/phpmodbus/
copying the Software, you agree that you have read, understood, and will
comply with the terms and conditions of this license. Further improvements - John S. Long and other contributors
https://github.com/adduc/phpmodbus
PERMITTED USE
------------- Cleanup and namespaces - Ondřej Hruška, 2016
You are permitted to use, copy, modify, and distribute the Software and its https://github.com/MightyPork/phpmodbus
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. | ORIGINAL LICENSE |
+---------------------------------------------------------+
2. Redistributions of source code must retain the above copyright notice in
all source code files.
The Phpmodbus License, Version 1
3. Redistributions in binary form must reproduce the above copyright notice ============================
in the documentation and/or other materials provided with the distribution.
Copyright (c) 2004, 2013 Jan Krakora
4. Products derived from the Software must include an acknowledgment that All rights reserved.
they are derived from "Phpmodbus" in their documentation and/or other
materials provided with the distribution. 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
5. The name "Phpmodbus" must not be used to endorse or promote products copying the Software, you agree that you have read, understood, and will
derived from the Software without prior written permission from Author. comply with the terms and conditions of this license.
6. Products derived from the Software may not be called "Phpmodbus",
nor may "Phpmodbus" appear in their name, without prior written PERMITTED USE
permission from Author. -------------
You are permitted to use, copy, modify, and distribute the Software and its
INDEMNITY documentation, with or without modification, for any purpose, provided that
--------- the following conditions are met:
You agree to indemnify and hold harmless the Author and any contributors 1. A copy of this license agreement must be included with the distribution.
for any direct, indirect, incidental, or consequential third-party claims,
actions or suits, as well as any related expenses, liabilities, damages, 2. Redistributions of source code must retain the above copyright notice in
settlements or fees arising from your use or misuse of the Software, all source code files.
or a violation of any terms of this license.
3. Redistributions in binary form must reproduce the above copyright notice
in the documentation and/or other materials provided with the distribution.
DISCLAIMER OF WARRANTY
---------------------- 4. Products derived from the Software must include an acknowledgment that
they are derived from "Phpmodbus" in their documentation and/or other
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND materials provided with the distribution.
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 5. The name "Phpmodbus" must not be used to endorse or promote products
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR derived from the Software without prior written permission from Author.
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 6. Products derived from the Software may not be called "Phpmodbus",
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON nor may "Phpmodbus" appear in their name, without prior written
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT permission from Author.
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
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.
+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", "name": "MightyPork/phpmodbus",
"description": "Composer version of PhpModBus", "keywords": ["phpmodbus","modbus"],
"license": "LGPL", "description": "PhpModbus with namespaces and updated to PHP 7",
"authors": [ "license": "LGPL",
{ "require": {
"name": "Honza Krakora", "php": "^5.3.2 || ^7.0",
"email": "krakora.jan@googlemail.com" "ext-sockets": "*"
} },
], "authors": [
"autoload": { {
"classmap": [ "Phpmodbus" ] "name": "Honza Krakora",
}, "email": "krakora.jan@googlemail.com"
"require": {
"ext-sockets": "*"
} }
],
"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.
+26
View File
@@ -0,0 +1,26 @@
<?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php';
// Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP");
try {
// FC 2
// read 2 input bits from address 0x0 (Wago input image)
$recData = $modbus->readInputDiscretes(0, 0, 2);
}
catch (Exception $e) {
// Print error information if any
echo $modbus;
echo $e;
exit;
}
// Print status information
echo "</br>Status:</br>" . $modbus;
// Print read data
echo "</br>Data:</br>";
var_dump($recData);
echo "</br>";
+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;
}
+26
View File
@@ -0,0 +1,26 @@
<?php
require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php';
// Create Modbus object
$modbus = new ModbusMaster("192.192.15.51", "UDP");
// Data to be writen
$data = array(-1000);
$dataTypes = array("INT");
try {
// FC6
$modbus->writeSingleRegister(0, 12288, $data, $dataTypes);
}
catch (Exception $e) {
// Print error information if any
echo $modbus;
echo $e;
exit;
}
// Print status information
echo $modbus;
?>
+135 -132
View File
@@ -1,133 +1,136 @@
<?php <?php
/**
* Phpmodbus Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) namespace PHPModbus;
*
* This source file is subject to the "PhpModbus license" that is bundled /**
* with this package in the file license.txt. * Phpmodbus Copyright (c) 2004, 2013 Jan Krakora
* *
* @author Jan Krakora * This source file is subject to the "PhpModbus license" that is bundled
* @copyright Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) * with this package in the file license.txt.
* @license PhpModbus license *
* @category Phpmodbus * @author Jan Krakora
* @package Phpmodbus * @copyright Copyright (c) 2004, 2013 Jan Krakora
* @version $id$ * @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. * IecType
* *
* @author Jan Krakora * The class includes set of IEC-1131 data type functions that converts a PHP
* @copyright Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) * data types to a IEC data type.
* @package Phpmodbus *
*/ * @author Jan Krakora
class IecType { * @copyright Copyright (c) 2004, 2010 Jan Krakora
* @package Phpmodbus
/** */
* iecBYTE class IecType {
*
* Converts a value to IEC-1131 BYTE data type /**
* * iecBYTE
* @param value value from 0 to 255 *
* @return value IEC BYTE data type * Converts a value to IEC-1131 BYTE data type
* *
*/ * @param value value from 0 to 255
function iecBYTE($value) { * @return value IEC BYTE data type
return chr($value & 0xFF); *
} */
public static function iecBYTE($value) {
/** return chr($value & 0xFF);
* iecINT }
*
* Converts a value to IEC-1131 INT data type /**
* * iecINT
* @param value value to be converted *
* @return value IEC-1131 INT data type * Converts a value to IEC-1131 INT data type
* *
*/ * @param value value to be converted
function iecINT($value) { * @return value IEC-1131 INT data type
return self::iecBYTE(($value >> 8) & 0x00FF) . *
self::iecBYTE(($value & 0x00FF)); */
} 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 /**
* * iecDINT
* @param value value to be converted *
* @param value endianness defines endian codding (little endian == 0, big endian == 1) * Converts a value to IEC-1131 DINT data type
* @return value IEC-1131 INT data type *
* * @param value value to be converted
*/ * @param value endianness defines endian codding (little endian == 0, big endian == 1)
function iecDINT($value, $endianness = 0) { * @return value IEC-1131 INT data type
// result with right endianness *
return self::endianness($value, $endianness); */
} 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. /**
* * iecREAL
* @param value value to be converted *
* @param value endianness defines endian codding (little endian == 0, big endian == 1) * Converts a value to IEC-1131 REAL data type. The function uses function @use float2iecReal.
* @return value IEC-1131 REAL data type *
*/ * @param value value to be converted
function iecREAL($value, $endianness = 0) { * @param value endianness defines endian codding (little endian == 0, big endian == 1)
// iecREAL representation * @return value IEC-1131 REAL data type
$real = self::float2iecReal($value); */
// result with right endianness public static function iecREAL($value, $endianness = 0) {
return self::endianness($real, $endianness); // 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. /**
* * float2iecReal
* 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 * This function converts float value to IEC-1131 REAL single precision form.
* [{@link http://www.php.net/manual/en/function.pack.php PHP pack/unpack functionality}] *
* * For more see [{@link http://en.wikipedia.org/wiki/Single_precision Single precision on Wiki}] or
* @param float value to be converted * [{@link http://de.php.net/manual/en/function.base-convert.php PHP base_convert function commentary}, Todd Stokes @ Georgia Tech 21-Nov-2007] or
* @return value IEC REAL data type * [{@link http://www.php.net/manual/en/function.pack.php PHP pack/unpack functionality}]
*/ *
private function float2iecReal($value) { * @param float value to be converted
// get float binary string * @return value IEC REAL data type
$float = pack("f", $value); */
// set 32-bit unsigned integer of the float private static function float2iecReal($value) {
$w = unpack("L", $float); // get float binary string
return $w[1]; $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 * endianness
* *
* @param int $value * Make endianess as required.
* @param bool $endianness * For more see http://en.wikipedia.org/wiki/Endianness
* @return int *
*/ * @param int $value
private function endianness($value, $endianness = 0) { * @param bool $endianness
if ($endianness == 0) * @return int
return */
self::iecBYTE(($value >> 8) & 0x000000FF) . private static function endianness($value, $endianness = 0) {
self::iecBYTE(($value & 0x000000FF)) . if ($endianness == 0)
self::iecBYTE(($value >> 24) & 0x000000FF) . return
self::iecBYTE(($value >> 16) & 0x000000FF); self::iecBYTE(($value >> 8) & 0x000000FF) .
else self::iecBYTE(($value & 0x000000FF)) .
return self::iecBYTE(($value >> 24) & 0x000000FF) .
self::iecBYTE(($value >> 24) & 0x000000FF) . self::iecBYTE(($value >> 16) & 0x000000FF);
self::iecBYTE(($value >> 16) & 0x000000FF) . else
self::iecBYTE(($value >> 8) & 0x000000FF) . return
self::iecBYTE(($value & 0x000000FF)); 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
@@ -1,49 +1,50 @@
<?php <?php
/**
* Phpmodbus Copyright (c) 2004, 2012 Jan Krakora namespace PHPModbus;
*
* This source file is subject to the "PhpModbus license" that is bundled /**
* with this package in the file license.txt. * Phpmodbus Copyright (c) 2004, 2012 Jan Krakora
* *
* * This source file is subject to the "PhpModbus license" that is bundled
* @copyright Copyright (c) 2004, 2012 Jan Krakora * with this package in the file license.txt.
* @license PhpModbus license *
* @category Phpmodbus *
* @tutorial Phpmodbus.pkg * @copyright Copyright (c) 2004, 2012 Jan Krakora
* @package Phpmodbus * @license PhpModbus license
* @version $id$ * @category Phpmodbus
* * @tutorial Phpmodbus.pkg
*/ * @package Phpmodbus
* @version $id$
require_once dirname(__FILE__) . '/ModbusMaster.php'; *
*/
/**
* ModbusMasterTcp /**
* * ModbusMasterTcp
* This class deals with the MODBUS master using TCP. Extends ModbusMaster class. *
* * This class deals with the MODBUS master using TCP. Extends ModbusMaster class.
* Implemented MODBUS functions: *
* - FC 1: read coils * Implemented MODBUS functions:
* - FC 3: read multiple registers * - FC 1: read coils
* - FC 15: write multiple coils * - FC 3: read multiple registers
* - FC 16: write multiple registers * - FC 15: write multiple coils
* - FC 23: read write registers * - FC 16: write multiple registers
* * - FC 23: read write registers
* @author Jan Krakora *
* @copyright Copyright (c) 2004, 2012 Jan Krakora * @author Jan Krakora
* @package Phpmodbus * @copyright Copyright (c) 2004, 2012 Jan Krakora
* * @package Phpmodbus
*/ *
class ModbusMasterTcp extends ModbusMaster { */
/** class ModbusMasterTcp extends ModbusMaster {
* ModbusMasterTcp /**
* * ModbusMasterTcp
* This is the constructor that defines {@link $host} IP address of the object. *
* * 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". *
*/ * @param String $host An IP address of a Modbus TCP device. E.g. "192.168.1.1".
function ModbusMasterTcp($host){ */
$this->host = $host; function ModbusMasterTcp($host){
$this->socket_protocol = "TCP"; $this->host = $host;
} $this->socket_protocol = "TCP";
} }
}
@@ -1,50 +1,51 @@
<?php <?php
/**
* Phpmodbus Copyright (c) 2004, 2012 Jan Krakora namespace PHPModbus;
*
* This source file is subject to the "PhpModbus license" that is bundled /**
* with this package in the file license.txt. * Phpmodbus Copyright (c) 2004, 2012 Jan Krakora
* *
* * This source file is subject to the "PhpModbus license" that is bundled
* @copyright Copyright (c) 2004, 2012 Jan Krakora * with this package in the file license.txt.
* @license PhpModbus license *
* @category Phpmodbus *
* @tutorial Phpmodbus.pkg * @copyright Copyright (c) 2004, 2012 Jan Krakora
* @package Phpmodbus * @license PhpModbus license
* @version $id$ * @category Phpmodbus
* * @tutorial Phpmodbus.pkg
*/ * @package Phpmodbus
* @version $id$
require_once dirname(__FILE__) . '/ModbusMaster.php'; *
*/
/**
* ModbusMasterUdp /**
* * ModbusMasterUdp
* This class deals with the MODBUS master using UDP stack. *
* * This class deals with the MODBUS master using UDP stack.
* Implemented MODBUS master functions: *
* - FC 1: read coils * Implemented MODBUS master functions:
* - FC 3: read multiple registers * - FC 1: read coils
* - FC 15: write multiple coils * - FC 3: read multiple registers
* - FC 16: write multiple registers * - FC 15: write multiple coils
* - FC 23: read write registers * - FC 16: write multiple registers
* * - FC 23: read write registers
* @author Jan Krakora *
* @copyright Copyright (c) 2004, 2012 Jan Krakora * @author Jan Krakora
* @package Phpmodbus * @copyright Copyright (c) 2004, 2012 Jan Krakora
* * @package Phpmodbus
*/ *
class ModbusMasterUdp extends ModbusMaster { */
class ModbusMasterUdp extends ModbusMaster {
/**
* ModbusMasterUdp /**
* * ModbusMasterUdp
* This is the constructor that defines {@link $host} IP address of the object. *
* * 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". *
*/ * @param String $host An IP address of a Modbus UDP device. E.g. "192.168.1.1".
function ModbusMasterUdp($host){ */
$this->host = $host; function ModbusMasterUdp($host){
$this->socket_protocol = "UDP"; $this->host = $host;
} $this->socket_protocol = "UDP";
} }
}
+251 -248
View File
@@ -1,249 +1,252 @@
<?php <?php
/**
* Phpmodbus Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) namespace PHPModbus;
*
* This source file is subject to the "PhpModbus license" that is bundled /**
* with this package in the file license.txt. * Phpmodbus Copyright (c) 2004, 2012 Jan Krakora
* *
* @author Jan Krakora * This source file is subject to the "PhpModbus license" that is bundled
* @copyright Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) * with this package in the file license.txt.
* @license PhpModbus license *
* @category Phpmodbus * @author Jan Krakora
* @package Phpmodbus * @copyright Copyright (c) 2004, 2012 Jan Krakora
* @version $id$ * @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. * PhpType
* *
* @author Jan Krakora * The class includes set of methods that convert the received Modbus data
* @copyright Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) * (array of bytes) to the PHP data type, i.e. signed int, unsigned int and float.
* @package Phpmodbus *
* * @author Jan Krakora
*/ * @copyright Copyright (c) 2004, 2012 Jan Krakora
class PhpType { * @package Phpmodbus
*
/** */
* bytes2float class PhpType {
*
* The function converts array of 4 bytes to float. The return value /**
* depends on order of the input bytes (endianning). * bytes2float
* *
* @param array $values * The function converts array of 4 bytes to float. The return value
* @param bool $endianness * depends on order of the input bytes (endianning).
* @return float *
*/ * @param array $values
public static function bytes2float($values, $endianness = 0) { * @param bool $endianness
$data = array(); * @return float
$real = 0; */
public static function bytes2float($values, $endianness = 0) {
// Set the array to correct form $data = array();
$data = self::checkData($values); $real = 0;
// Combine bytes
$real = self::combineBytes($data, $endianness); // Set the array to correct form
// Convert the real value to float $data = self::checkData($values);
return (float) self::real2float($real); // 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). * bytes2signedInt
* *
* @param array $values * The function converts array of 2 or 4 bytes to signed integer.
* @param bool $endianness * The return value depends on order of the input bytes (endianning).
* @return int *
*/ * @param array $values
public static function bytes2signedInt($values, $endianness = 0) { * @param bool $endianness
$data = array(); * @return int
$int = 0; */
// Set the array to correct form public static function bytes2signedInt($values, $endianness = 0) {
$data = self::checkData($values); $data = array();
// Combine bytes $int = 0;
$int = self::combineBytes($data, $endianness); // Set the array to correct form
// In the case of signed 2 byte value convert it to 4 byte one $data = self::checkData($values);
if ((count($values) == 2) && ((0x8000 & $int) > 0)) { // Combine bytes
$int = 0xFFFF8000 | $int; $int = self::combineBytes($data, $endianness);
} // In the case of signed 2 byte value convert it to 4 byte one
// Convert the value if ((count($values) == 2) && ((0x8000 & $int) > 0)) {
return (int) self::dword2signedInt($int); $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). * bytes2unsignedInt
* *
* @param array $values * The function converts array of 2 or 4 bytes to unsigned integer.
* @param bool $endianness * The return value depends on order of the input bytes (endianning).
* @return int|float *
*/ * @param array $values
public static function bytes2unsignedInt($values, $endianness = 0) { * @param bool $endianness
$data = array(); * @return int|float
$int = 0; */
// Set the array to correct form public static function bytes2unsignedInt($values, $endianness = 0) {
$data = self::checkData($values); $data = array();
// Combine bytes $int = 0;
$int = self::combineBytes($data, $endianness); // Set the array to correct form
// Convert the value $data = self::checkData($values);
return self::dword2unsignedInt($int); // 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. * bytes2string
* *
* @param array $values * The function converts an values array to the string. The function detects
* @param bool $endianness * the end of the string by 0x00 character as defined by string standards.
* @return string *
*/ * @param array $values
public static function bytes2string($values, $endianness = 0) { * @param bool $endianness
// Prepare string variable * @return string
$str = ""; */
// Parse the received data word array public static function bytes2string($values, $endianness = 0) {
for($i=0;$i<count($values);$i+=2) { // Prepare string variable
if ($endianness) { $str = "";
if($values[$i] != 0) // Parse the received data word array
$str .= chr($values[$i]); for($i=0;$i<count($values);$i+=2) {
else if ($endianness) {
break; if($values[$i] != 0)
if($values[$i+1] != 0) $str .= chr($values[$i]);
$str .= chr($values[$i+1]); else
else break;
break; if($values[$i+1] != 0)
} $str .= chr($values[$i+1]);
else { else
if($values[$i+1] != 0) break;
$str .= chr($values[$i+1]); }
else else {
break; if($values[$i+1] != 0)
if($values[$i] != 0) $str .= chr($values[$i+1]);
$str .= chr($values[$i]); else
else break;
break; if($values[$i] != 0)
} $str .= chr($values[$i]);
} else
// return string break;
return $str; }
} }
// return string
/** return $str;
* real2float }
*
* This function converts a value in IEC-1131 REAL single precision form to float. /**
* * real2float
* 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 * This function converts a value in IEC-1131 REAL single precision form to float.
* [{@link http://www.php.net/manual/en/function.pack.php PHP pack/unpack functionality}] *
* * For more see [{@link http://en.wikipedia.org/wiki/Single_precision Single precision on Wiki}] or
* @param value value in IEC REAL data type to be converted * [{@link http://de.php.net/manual/en/function.base-convert.php PHP base_convert function commentary}, Todd Stokes @ Georgia Tech 21-Nov-2007] or
* @return float float value * [{@link http://www.php.net/manual/en/function.pack.php PHP pack/unpack functionality}]
*/ *
private static function real2float($value) { * @param value value in IEC REAL data type to be converted
// get unsigned long * @return float float value
$ulong = pack("L", $value); */
// set float private static function real2float($value) {
$float = unpack("f", $ulong); // get unsigned long
$ulong = pack("L", $value);
return $float[1]; // set float
} $float = unpack("f", $ulong);
/** return $float[1];
* dword2signedInt }
*
* Switch double word to signed integer /**
* * dword2signedInt
* @param int $value *
* @return int * Switch double word to signed integer
*/ *
private static function dword2signedInt($value) { * @param int $value
if ((0x80000000 & $value) != 0) { * @return int
return -(0x7FFFFFFF & ~$value)-1; */
} else { private static function dword2signedInt($value) {
return (0x7FFFFFFF & $value); if ((0x80000000 & $value) != 0) {
} return -(0x7FFFFFFF & ~$value)-1;
} } else {
return (0x7FFFFFFF & $value);
/** }
* dword2signedInt }
*
* Switch double word to unsigned integer /**
* * dword2signedInt
* @param int $value *
* @return int|float * Switch double word to unsigned integer
*/ *
private static function dword2unsignedInt($value) { * @param int $value
if ((0x80000000 & $value) != 0) { * @return int|float
return ((float) (0x7FFFFFFF & $value)) + 2147483648; */
} else { private static function dword2unsignedInt($value) {
return (int) (0x7FFFFFFF & $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 /**
* * checkData
* @param int $data *
* @return int * Check if the data variable is array, and check if the values are numeric
*/ *
private static function checkData($data) { * @param int $data
// Check the data * @return int
if (!is_array($data) || */
count($data)<2 || private static function checkData($data) {
count($data)>4 || // Check the data
count($data)==3) { if (!is_array($data) ||
throw new Exception('The input data should be an array of 2 or 4 bytes.'); count($data)<2 ||
} count($data)>4 ||
// Fill the rest of array by zeroes count($data)==3) {
if (count($data) == 2) { throw new Exception('The input data should be an array of 2 or 4 bytes.');
$data[2] = 0; }
$data[3] = 0; // Fill the rest of array by zeroes
} if (count($data) == 2) {
// Check the values to be number $data[2] = 0;
if (!is_numeric($data[0]) || $data[3] = 0;
!is_numeric($data[1]) || }
!is_numeric($data[2]) || // Check the values to be number
!is_numeric($data[3])) { if (!is_numeric($data[0]) ||
throw new Exception('Data are not numeric or the array keys are not indexed by 0,1,2 and 3'); !is_numeric($data[1]) ||
} !is_numeric($data[2]) ||
!is_numeric($data[3])) {
return $data; 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 /**
* * combineBytes
* @param int $data *
* @param bool $endianness * Combine bytes together
* @return int *
*/ * @param int $data
private static function combineBytes($data, $endianness) { * @param bool $endianness
$value = 0; * @return int
// Combine bytes */
if ($endianness == 0) private static function combineBytes($data, $endianness) {
$value = (($data[3] & 0xFF)<<16) | $value = 0;
(($data[2] & 0xFF)<<24) | // Combine bytes
(($data[1] & 0xFF)) | if ($endianness == 0)
(($data[0] & 0xFF)<<8); $value = (($data[3] & 0xFF)<<16) |
else (($data[2] & 0xFF)<<24) |
$value = (($data[3] & 0xFF)<<24) | (($data[1] & 0xFF)) |
(($data[2] & 0xFF)<<16) | (($data[0] & 0xFF)<<8);
(($data[1] & 0xFF)<<8) | else
(($data[0] & 0xFF)); $value = (($data[3] & 0xFF)<<24) |
(($data[2] & 0xFF)<<16) |
return $value; (($data[1] & 0xFF)<<8) |
} (($data[0] & 0xFF));
}
return $value;
}
}
?> ?>
+256
View File
@@ -0,0 +1,256 @@
(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '' *)
(* @OBJECTFLAGS := '0, 8' *)
(* @SYMFILEFLAGS := '2048' *)
PROGRAM PLC_PRG
VAR
(* BOOL, COIL *)
COIL1 AT %MX0.0 : BOOL := 0;
COIL2 AT %MX0.1 : BOOL := 0;
COIL3 AT %MX0.2 : BOOL := 0;
COIL4 AT %MX0.3 : BOOL := 0;
COIL5 AT %MX0.4 : BOOL := 0;
COIL6 AT %MX0.5 : BOOL := 0;
COIL7 AT %MX0.6 : BOOL := 0;
COIL8 AT %MX0.7 : BOOL := 0;
(* BYTE *)
BYTE1 AT %MB0 : BYTE := 0;
BYTE2 AT %MB1 : BYTE := 0;
BYTE3 AT %MB2 : BYTE := 0;
BYTE4 AT %MB3 : BYTE := 0;
BYTE5 AT %MB4 : BYTE := 0;
(* INT *)
INT1 AT %MW0 : INT := 0;
INT2 AT %MW1 : INT := 0;
INT3 AT %MW2 : INT := 0;
INT4 AT %MW3 : INT := 0;
INT5 AT %MW4 : INT := 0;
(* WORD *)
WORD1 AT %MW0 : WORD := 0;
WORD2 AT %MW1 : WORD := 0;
WORD3 AT %MW2 : WORD := 0;
WORD4 AT %MW3 : WORD := 0;
WORD5 AT %MW4 : WORD := 0;
(* DINT *)
DINT1 AT %MD0 : DINT := 0;
DINT2 AT %MD1 : DINT := 0;
DINT3 AT %MD2 : DINT := 0;
DINT4 AT %MD3 : DINT := 0;
DINT5 AT %MD4 : DINT := 0;
(* DWORD *)
DWORD1 AT %MD0 : DWORD := 0;
DWORD2 AT %MD1 : DWORD := 0;
DWORD3 AT %MD2 : DWORD := 0;
DWORD4 AT %MD3 : DWORD := 0;
DWORD5 AT %MD4 : DWORD := 0;
(* REAL *)
REAL1 AT %MD0 : REAL := 0;
REAL2 AT %MD1 : REAL := 0;
REAL3 AT %MD2 : REAL := 0;
REAL4 AT %MD3 : REAL := 0;
REAL5 AT %MD4 : REAL := 0;
(* String *)
STRING1 AT %MW0 : STRING := 'Hello word!!!';
END_VAR
(* @END_DECLARATION := '0' *)
(* Something to do *)
;
END_PROGRAM
(* @NESTEDCOMMENTS := 'Yes' *)
(* @GLOBAL_VARIABLE_LIST := 'Global_Variables' *)
(* @PATH := '' *)
(* @OBJECTFLAGS := '0, 8' *)
(* @SYMFILEFLAGS := '2048' *)
VAR_GLOBAL
END_VAR
(* @OBJECT_END := 'Global_Variables' *)
(* @CONNECTIONS := Global_Variables
FILENAME : ''
FILETIME : 0
EXPORT : 0
NUMOFCONNECTIONS : 0
*)
(* @NESTEDCOMMENTS := 'Yes' *)
(* @GLOBAL_VARIABLE_LIST := 'Variable_Configuration' *)
(* @PATH := '' *)
(* @OBJECTFLAGS := '0, 8' *)
(* @SYMFILEFLAGS := '2048' *)
VAR_CONFIG
END_VAR
(* @OBJECT_END := 'Variable_Configuration' *)
(* @CONNECTIONS := Variable_Configuration
FILENAME : ''
FILETIME : 0
EXPORT : 0
NUMOFCONNECTIONS : 0
*)
_ALARMCONFIG
_ALARMCONFIGNEXTTEXTID : 10002
_ALARMCONFIGFORMATS : 'HH$':$'mm$':$'ss','dd$'-$'MM$'-$'yyyy'
_ALARMCLASSLIST : 1
_ALARMCLASSID : 0
_ALARMCLASSACKTYPE : 0
_ALARMCLASSNAME : 'DEFAULT'
_ALARMCLASSDESCRIPTION : ''
_ALARMCLASSBGCOLORS : 16777215,16777215,16777215
_ALARMCLASSTEXTCOLORS : 3394560,255,16711680
_ALARMCLASSBITMAPS : '','',''
_ALARMACTIONLIST : 0
(* @ALARMCLASSRESETCOLORS := '_ALARMCLASSRESETCOLORS: 33023,16777215' *)
(* @ALARMCLASSRESETBITMAP := '_ALARMCLASSRESETBITMAP: $'$'' *)
_ALARMGROUPLISTNAME : 'System'
_ALARMGROUPPATH : 'System'
_ALARMGROUPLIST : 0
_VISUALSETTINGSFLAGS : 0,0,0,0
_VISUALSETTINGSFLAGS : '','',''
_VISUALSETTINGSDYNTEXTFILECOUNT : 0
(* @ALARMCONFIGFLAGS := '_ALARMCONFIGFLAGS: 0' *)
(* @ALARMCONFIGGLOBALDB_STR := '_ALARMCONFIGGLOBALDB_STRINGS: $'$',$'$',$'$',$'$'' *)
(* @ALARMCONFIGGLOBALDB_NUM := '_ALARMCONFIGGLOBALDB_NUMBERS: 0,0' *)
_END_ALARMCONFIG
LIBRARY
Standard.lib 2.12.10 14:48:34
(* @LIBRARYSYMFILEINFO := '0' *)
NumOfPOUs: 26
ASCIIBYTE_TO_STRING: 2048
CONCAT: 0
CTD: 0
CTU: 0
CTUD: 0
DELETE: 0
F_TRIG: 0
FIND: 0
INSERT: 0
LEFT: 0
LEN: 0
MID: 0
R_TRIG: 0
REAL_STATE: 2048
REPLACE: 0
RIGHT: 0
RS: 0
RTC: 0
SEMA: 0
SR: 0
STANDARD_VERSION: 2048
STRING_COMPARE: 2048
STRING_TO_ASCIIBYTE: 2048
TOF: 0
TON: 0
TP: 0
NumOfGVLs: 1
'Global Variables 0': 0
END_LIBRARY
LIBRARY
SYSLIBCALLBACK.LIB 2.12.10 14:48:32
(* @LIBRARYSYMFILEINFO := '0' *)
NumOfPOUs: 2
SysCallbackRegister: 0
SysCallbackUnregister: 0
NumOfGVLs: 2
Globale_Variablen: 0
Version: 0
END_LIBRARY
PLC_CONFIGURATION
_GLOBAL
_VERSION: 3
_AUTOADR: 0
_CHECKADR: 0
_SAVECONFIGFILESINPROJECT: 0
_END_GLOBAL
_MODULE: '3S'
_SECTION_NAME: 'Root'
_INDEX_IN_PARENT: '-1'
_MODULE_NAME: 'Hardware configuration'
_NODE_ID: -1
_IECIN: %IB0
_IECOUT: %QB0
_IECDIAG: %MB0
_DOWNLOAD: 1
_EXCLUDEFROMAUTOADR: 0
_COMMENT: ''
_MODULE: '3S'
_SECTION_NAME: 'K_Bus'
_INDEX_IN_PARENT: '1'
_MODULE_NAME: 'K-Bus'
_NODE_ID: 0
_IECIN: %IB0
_IECOUT: %QB0
_IECDIAG: %MB0
_DOWNLOAD: 1
_EXCLUDEFROMAUTOADR: 0
_COMMENT: ''
_END_MODULE
_MODULE: '3S'
_SECTION_NAME: 'FB_VARS'
_INDEX_IN_PARENT: '2'
_MODULE_NAME: 'Fieldbus variables'
_NODE_ID: 1
_IECIN: %IB0
_IECOUT: %QB0
_IECDIAG: %MB0
_DOWNLOAD: 1
_EXCLUDEFROMAUTOADR: 0
_COMMENT: ''
_END_MODULE
_END_MODULE
PLC_END
RESOURCE
{event_task : 'start','Called when program starts','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,1,11986}
{event_task : 'stop','Called when program stops','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,2,11986}
{event_task : 'before_reset','Called before reset takes place','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,3,11986}
{event_task : 'after_reset','Called after reset took place','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,4,11986}
{event_task : 'shutdown','Called before shutdown is performed (Firmware update over ethernet)','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,5,11986}
{event_task : 'excpt_watchdog','Software watchdog of IEC-task expired','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,7,11986}
{event_task : 'excpt_fieldbus','Fieldbus error','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,9,11986}
{event_task : 'excpt_ioupdate','KBus error','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,10,11986}
{event_task : 'excpt_dividebyzero','Division by zero. Only integer operations!','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,18,11986}
{event_task : 'excpt_noncontinuable','Exception handler','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,20,11986}
{event_task : 'after_reading_inputs','Called after reading of inputs','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,28,11986}
{event_task : 'before_writing_outputs','Called before writing of outputs','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,29,11986}
{event_task : 'debug_loop','Debug loop at breakpoint','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,31,11986}
{event_task : 'online_change','Is called after CodeInit() at Online-Change','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,33,11986}
{event_task : 'before_download','Is called before the Download starts','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,34,11986}
{event_task : 'event_login','Is called before the login service is performed','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,501,11986}
{event_task : 'eth_overload','Ethernet Overload','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,750,11986}
{event_task : 'eth_network_ready','Is called directly after the Network and the PLC are initialised','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,751,11986}
{event_task : 'blink_code','New blink code / Blink code cleared ( Call STATUS_GET_LAST_ERROR for details )','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,752,11986}
{event_task : 'interrupt_0','Interrupt Real Time Clock (every second)','','FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}{event_task_info : 0,1000,11986}
END_RESOURCE
_WORKSPACE
_GLOBALVISUALSETTINGS
_VISUALSETTINGSFLAGS : 0,0,0,0
_VISUALSETTINGSFLAGS : '','',''
_VISUALSETTINGSDYNTEXTFILECOUNT : 0
_VISUALBITMAPLISTCOUNT : 0
_END_GLOBALVISUALSETTINGS
_END_WORKSPACE
+15
View File
@@ -0,0 +1,15 @@
rem Create Codesys EXP file
rem Build cmd file
set CODESYS="c:\Program Files (x86)\WAGO Software\CoDeSys V2.3\codesys.exe"
set PROJECT=test
del %PROJECT%.EXP
echo file open %PROJECT%.pro >> codesys_cmd_file.cmd
echo project export %PROJECT%.EXP >> codesys_cmd_file.cmd
rem echo file saveas %PROJECT%.lib internallib >> codesys_cmd_file.cmd
echo file close >> codesys_cmd_file.cmd
echo file quit >> codesys_cmd_file.cmd
%CODESYS% /noinfo /cmd codesys_cmd_file.cmd
rem Clean all when finished
del codesys_cmd_file.cmd
Binary file not shown.
+12 -12
View File
@@ -1,12 +1,12 @@
Endianing off <hr> Endianing off <hr>
0 --> Packet: 0000_0000_<br> 0 --> Packet: 0000_0000_<br>
1 --> Packet: 0000_3f80_<br> 1 --> Packet: 0000_3f80_<br>
-2 --> Packet: 0000_c000_<br> -2 --> Packet: 0000_c000_<br>
0.333333333333 --> Packet: aaaa_3eaa_<br> 0.333333333333 --> Packet: aaab_3eaa_<br>
25 --> Packet: 0000_41c8_<br> 25 --> Packet: 0000_41c8_<br>
Endianing on <hr> Endianing on <hr>
0 --> Packet: 0000_0000_<br> 0 --> Packet: 0000_0000_<br>
1 --> Packet: 3f80_0000_<br> 1 --> Packet: 3f80_0000_<br>
-2 --> Packet: c000_0000_<br> -2 --> Packet: c000_0000_<br>
0.333333333333 --> Packet: 3eaa_aaaa_<br> 0.333333333333 --> Packet: 3eaa_aaab_<br>
25 --> Packet: 41c8_0000_<br> 25 --> Packet: 41c8_0000_<br>
+1 -1
View File
@@ -7,7 +7,7 @@ $data = Array (
"0" => 0, // -> 0000 0000 "0" => 0, // -> 0000 0000
"1" => 1, // -> 3f80 0000 "1" => 1, // -> 3f80 0000
"2" => -2, // -> c000 0000 "2" => -2, // -> c000 0000
"3" => 1/3, // -> 3eaa aaab "3" => 0.333333333333, //1/3 -> 3eaa aaab
"4" => 25 // -> 41c8 0000 "4" => 25 // -> 41c8 0000
); );
@@ -1,7 +1 @@
Caught exception: Unknown socket protocol, should be 'TCP' or 'UDP'
Fatal error: Uncaught exception 'Exception' with message 'Unknown socket protocol, should be 'TCP' or 'UDP'' in D:\Projects\20081010_phpmodbus\src\trunk\Phpmodbus\ModbusMaster.php:87
Stack trace:
#0 D:\Projects\20081010_phpmodbus\src\trunk\Phpmodbus\ModbusMaster.php(654): ModbusMaster->connect()
#1 D:\Projects\20081010_phpmodbus\src\trunk\tests\ModbusMaster\test.tcp.socket_protocol_mismatch.php(13): ModbusMaster->readWriteRegisters(0, 12288, 6, 12288, Array, Array)
#2 {main}
thrown in D:\Projects\20081010_phpmodbus\src\trunk\Phpmodbus\ModbusMaster.php on line 87
@@ -10,9 +10,13 @@ $data = array(1000, 2000, 1.250, 1.250);
$dataTypes = array("REAL", "REAL", "REAL", "REAL"); $dataTypes = array("REAL", "REAL", "REAL", "REAL");
// FC23 // FC23
$recData = $modbus->readWriteRegisters(0, 12288, 6, 12288, $data, $dataTypes); try {
$recData = $modbus->readWriteRegisters(0, 12288, 6, 12288, $data, $dataTypes);
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
exit();
}
// Should through an Exception // Should through an Exception
// Print status information // Print status information
echo "Something wrong!"; echo "Should never reach this line!";
@@ -0,0 +1,66 @@
array(32) {
[0]=>
bool(true)
[1]=>
bool(false)
[2]=>
bool(true)
[3]=>
bool(true)
[4]=>
bool(false)
[5]=>
bool(true)
[6]=>
bool(true)
[7]=>
bool(true)
[8]=>
bool(true)
[9]=>
bool(true)
[10]=>
bool(true)
[11]=>
bool(true)
[12]=>
bool(false)
[13]=>
bool(false)
[14]=>
bool(false)
[15]=>
bool(false)
[16]=>
bool(false)
[17]=>
bool(false)
[18]=>
bool(false)
[19]=>
bool(false)
[20]=>
bool(true)
[21]=>
bool(true)
[22]=>
bool(true)
[23]=>
bool(true)
[24]=>
bool(true)
[25]=>
bool(true)
[26]=>
bool(true)
[27]=>
bool(true)
[28]=>
bool(true)
[29]=>
bool(true)
[30]=>
bool(true)
[31]=>
bool(true)
}
@@ -62,7 +62,7 @@ Array
[10] => 192 [10] => 192
[11] => 0 [11] => 0
[12] => 170 [12] => 170
[13] => 170 [13] => 171
[14] => 62 [14] => 62
[15] => 170 [15] => 170
[16] => 0 [16] => 0
@@ -0,0 +1,7 @@
Test should pass when %IX0.0==FALSE and %IX0.1==TRUE
array(2) {
[0]=>
bool(false)
[1]=>
bool(true)
}
@@ -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
)
@@ -0,0 +1,5 @@
Array
(
[0] => 207
[1] => 199
)
+5 -5
View File
@@ -12,11 +12,11 @@ $data = array(1, 0, TRUE, TRUE, 0, 1, TRUE, TRUE,
1, 1, TRUE, TRUE, 1, 1, TRUE, TRUE); 1, 1, TRUE, TRUE, 1, 1, TRUE, TRUE);
// Write data - FC 15 // Write data - FC 15
$modbus->writeMultipleCoils(0, 12288, $data); $modbus->writeMultipleCoils(0, 12288, $data);
echo $modbus->status; //echo $modbus->status;
$modbus->status = ""; //$modbus->status = "";
echo "\n\n"; //echo "\n\n";
// Read data - FC 1 // Read data - FC 1
$recData = $modbus->readCoils(0, 12288, 32); $recData = $modbus->readCoils(0, 12288, 32);
echo $modbus->status; //echo $modbus->status;
echo "\n\n"; //echo "\n\n";
var_dump($recData); var_dump($recData);
+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 2
$recData = $modbus->readInputDiscretes(0, 0, 2);
var_dump($recData);
+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);
+15
View File
@@ -0,0 +1,15 @@
<?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 - INT
$data = array(-12345);
$dataTypes = array("INT");
// Write data - FC6
$modbus->writeSingleRegister(0, 12288, $data, $dataTypes);
// 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.
+1 -1
View File
@@ -1,4 +1,4 @@
set php=c:\Program_Files\xampplite\php\php.exe set php=c:\Program_Files\xampp\php\php.exe
rem set php=C:\PHP\versions\php-5.2.6-Win32\php.exe -d auto_prepend_file=C:\PHP\locale.php rem set php=C:\PHP\versions\php-5.2.6-Win32\php.exe -d auto_prepend_file=C:\PHP\locale.php
set diff="diff.exe" set diff="diff.exe"
rem set testUri=http://localHost/nette/_trunk/tests rem set testUri=http://localHost/nette/_trunk/tests
+2 -3
View File
@@ -1,4 +1,3 @@
<?php <?php
$test_host_ip = "192.192.15.51"; $test_host_ip = "192.192.1.10";
$test_bind_client_ip = "192.192.15.113"; $test_bind_client_ip = "192.192.1.100";
?>
-173
View File
@@ -1,173 +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 3: read multiple registers</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>
<note>
Developed with support of <graphic fileref="wago_logo.png"/> {@link http://www.wago.com}.
</note>
</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_fc3}">
<title>FC3 - read mutliple registers</title>
<para>
FC3 functionality example
</para>
<para>
{@example example_fc3.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