4 Commits
Author SHA1 Message Date
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
24 changed files with 1510 additions and 848 deletions
+2
View File
@@ -2,3 +2,5 @@ a88b5a87fb4cd49f16ce72062cce19d55f1fbf98 0.2
a7f90c18859d31922bdd8c61299e2790f5e2eb1a 0.3 a7f90c18859d31922bdd8c61299e2790f5e2eb1a 0.3
bdf8b3f414c4d08fc0edf9fd1953f55db26e4bac 0.4 bdf8b3f414c4d08fc0edf9fd1953f55db26e4bac 0.4
1e09b0da7d8c62a9a292ee51540feac9de4c1222 0.4.1 1e09b0da7d8c62a9a292ee51540feac9de4c1222 0.4.1
e1262f028e180c2719564f840ffa1a9f8672b6be 0.5
079f8ac1f49faf4e6bbb84d62c39eee1507805f2 0.6
+9 -9
View File
@@ -1,12 +1,12 @@
<?php <?php
/** /**
* Phpmodbus Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) * Phpmodbus Copyright (c) 2004, 2013 Jan Krakora
* *
* This source file is subject to the "PhpModbus license" that is bundled * This source file is subject to the "PhpModbus license" that is bundled
* with this package in the file license.txt. * with this package in the file license.txt.
* *
* @author Jan Krakora * @author Jan Krakora
* @copyright Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) * @copyright Copyright (c) 2004, 2013 Jan Krakora
* @license PhpModbus license * @license PhpModbus license
* @category Phpmodbus * @category Phpmodbus
* @package Phpmodbus * @package Phpmodbus
@@ -20,7 +20,7 @@
* data types to a IEC data type. * data types to a IEC data type.
* *
* @author Jan Krakora * @author Jan Krakora
* @copyright Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) * @copyright Copyright (c) 2004, 2010 Jan Krakora
* @package Phpmodbus * @package Phpmodbus
*/ */
class IecType { class IecType {
@@ -34,7 +34,7 @@ class IecType {
* @return value IEC BYTE data type * @return value IEC BYTE data type
* *
*/ */
function iecBYTE($value) { public static function iecBYTE($value) {
return chr($value & 0xFF); return chr($value & 0xFF);
} }
@@ -47,7 +47,7 @@ class IecType {
* @return value IEC-1131 INT data type * @return value IEC-1131 INT data type
* *
*/ */
function iecINT($value) { public static function iecINT($value) {
return self::iecBYTE(($value >> 8) & 0x00FF) . return self::iecBYTE(($value >> 8) & 0x00FF) .
self::iecBYTE(($value & 0x00FF)); self::iecBYTE(($value & 0x00FF));
} }
@@ -62,7 +62,7 @@ class IecType {
* @return value IEC-1131 INT data type * @return value IEC-1131 INT data type
* *
*/ */
function iecDINT($value, $endianness = 0) { public static function iecDINT($value, $endianness = 0) {
// result with right endianness // result with right endianness
return self::endianness($value, $endianness); return self::endianness($value, $endianness);
} }
@@ -76,7 +76,7 @@ class IecType {
* @param value endianness defines endian codding (little endian == 0, big endian == 1) * @param value endianness defines endian codding (little endian == 0, big endian == 1)
* @return value IEC-1131 REAL data type * @return value IEC-1131 REAL data type
*/ */
function iecREAL($value, $endianness = 0) { public static function iecREAL($value, $endianness = 0) {
// iecREAL representation // iecREAL representation
$real = self::float2iecReal($value); $real = self::float2iecReal($value);
// result with right endianness // result with right endianness
@@ -95,7 +95,7 @@ class IecType {
* @param float value to be converted * @param float value to be converted
* @return value IEC REAL data type * @return value IEC REAL data type
*/ */
private function float2iecReal($value) { private static function float2iecReal($value) {
// get float binary string // get float binary string
$float = pack("f", $value); $float = pack("f", $value);
// set 32-bit unsigned integer of the float // set 32-bit unsigned integer of the float
@@ -113,7 +113,7 @@ class IecType {
* @param bool $endianness * @param bool $endianness
* @return int * @return int
*/ */
private function endianness($value, $endianness = 0) { private static function endianness($value, $endianness = 0) {
if ($endianness == 0) if ($endianness == 0)
return return
self::iecBYTE(($value >> 8) & 0x000000FF) . self::iecBYTE(($value >> 8) & 0x000000FF) .
+224 -8
View File
@@ -25,7 +25,9 @@ require_once dirname(__FILE__) . '/PhpType.php';
* *
* Implemented MODBUS master functions: * Implemented MODBUS master functions:
* - FC 1: read coils * - FC 1: read coils
* - FC 2: read input discretes
* - FC 3: read multiple registers * - FC 3: read multiple registers
* - FC 6: write single register
* - FC 15: write multiple coils * - FC 15: write multiple coils
* - FC 16: write multiple registers * - FC 16: write multiple registers
* - FC 23: read write registers * - FC 23: read write registers
@@ -43,7 +45,7 @@ class ModbusMaster {
public $client_port = "502"; public $client_port = "502";
public $status; public $status;
public $timeout_sec = 5; // Timeout 5 sec public $timeout_sec = 5; // Timeout 5 sec
public $endianess = 0; // Endianess codding (little endian == 0, big endian == 1) public $endianness = 0; // Endianness codding (little endian == 0, big endian == 1)
public $socket_protocol = "UDP"; // Socket protocol (TCP, UDP) public $socket_protocol = "UDP"; // Socket protocol (TCP, UDP)
/** /**
@@ -96,6 +98,8 @@ class ModbusMaster {
$this->status .= "Bound\n"; $this->status .= "Bound\n";
} }
} }
// Socket settings
socket_set_option($this->sock, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 1, 'usec' => 0));
// Connect the socket // Connect the socket
$result = @socket_connect($this->sock, $this->host, $this->port); $result = @socket_connect($this->sock, $this->host, $this->port);
if ($result === false) { if ($result === false) {
@@ -175,8 +179,28 @@ class ModbusMaster {
* @return bool * @return bool
*/ */
private function responseCode($packet){ private function responseCode($packet){
if(($packet[7] & 0x80) > 0) { if((ord($packet[7]) & 0x80) > 0) {
throw new Exception("Modbus response error code:" . ord($packet[8])); // failure code
$failure_code = ord($packet[8]);
// failure code strings
$failures = array(
0x01 => "ILLEGAL FUNCTION",
0x02 => "ILLEGAL DATA ADDRESS",
0x03 => "ILLEGAL DATA VALUE",
0x04 => "SLAVE DEVICE FAILURE",
0x05 => "ACKNOWLEDGE",
0x06 => "SLAVE DEVICE BUSY",
0x08 => "MEMORY PARITY ERROR",
0x0A => "GATEWAY PATH UNAVAILABLE",
0x0B => "GATEWAY TARGET DEVICE FAILED TO RESPOND");
// get failure string
if(key_exists($failure_code, $failures)) {
$failure_str = $failures[$failure_code];
} else {
$failure_str = "UNDEFINED FAILURE CODE";
}
// exception response
throw new Exception("Modbus response error code: $failure_code ($failure_str)");
} else { } else {
$this->status .= "Modbus response error code: NOERROR\n"; $this->status .= "Modbus response error code: NOERROR\n";
return true; return true;
@@ -189,7 +213,7 @@ class ModbusMaster {
* Modbus function FC 1(0x01) - Read Coils * Modbus function FC 1(0x01) - Read Coils
* *
* Reads {@link $quantity} of Coils (boolean) from reference * Reads {@link $quantity} of Coils (boolean) from reference
* {@link $referenceRead} of a memory of a Modbus device given by * {@link $reference} of a memory of a Modbus device given by
* {@link $unitId}. * {@link $unitId}.
* *
* @param type $unitId * @param type $unitId
@@ -200,7 +224,7 @@ class ModbusMaster {
$this->status .= "readCoils: START\n"; $this->status .= "readCoils: START\n";
// connect // connect
$this->connect(); $this->connect();
// send FC 3 // send FC 1
$packet = $this->readCoilsPacketBuilder($unitId, $reference, $quantity); $packet = $this->readCoilsPacketBuilder($unitId, $reference, $quantity);
$this->status .= $this->printPacket($packet); $this->status .= $this->printPacket($packet);
$this->send($packet); $this->send($packet);
@@ -219,7 +243,7 @@ class ModbusMaster {
/** /**
* fc1 * fc1
* *
* Alias to {@link readMultipleCoils} method * Alias to {@link readCoils} method
* *
* @param type $unitId * @param type $unitId
* @param type $reference * @param type $reference
@@ -283,7 +307,7 @@ class ModbusMaster {
$di = 0; $di = 0;
foreach($data as $value){ foreach($data as $value){
for($i=0;$i<8;$i++){ for($i=0;$i<8;$i++){
if($di > $quantity) continue; if($di == $quantity) continue;
// get boolean value // get boolean value
$v = ($value >> $i) & 0x01; $v = ($value >> $i) & 0x01;
// build boolean array // build boolean array
@@ -298,6 +322,97 @@ class ModbusMaster {
return $data_bolean_array; return $data_bolean_array;
} }
/**
* readInputDiscretes
*
* Modbus function FC 2(0x02) - Read Input Discretes
*
* Reads {@link $quantity} of Inputs (boolean) from reference
* {@link $reference} of a memory of a Modbus device given by
* {@link $unitId}.
*
* @param type $unitId
* @param type $reference
* @param type $quantity
*/
function readInputDiscretes($unitId, $reference, $quantity){
$this->status .= "readInputDiscretes: START\n";
// connect
$this->connect();
// send FC 2
$packet = $this->readInputDiscretesPacketBuilder($unitId, $reference, $quantity);
$this->status .= $this->printPacket($packet);
$this->send($packet);
// receive response
$rpacket = $this->rec();
$this->status .= $this->printPacket($rpacket);
// parse packet
$receivedData = $this->readInputDiscretesParser($rpacket, $quantity);
// disconnect
$this->disconnect();
$this->status .= "readInputDiscretes: DONE\n";
// return
return $receivedData;
}
/**
* fc2
*
* Alias to {@link readInputDiscretes} method
*
* @param type $unitId
* @param type $reference
* @param type $quantity
* @return type
*/
function fc2($unitId, $reference, $quantity){
return $this->readInputDiscretes($unitId, $reference, $quantity);
}
/**
* readInputDiscretesPacketBuilder
*
* FC2 packet builder - read coils
*
* @param type $unitId
* @param type $reference
* @param type $quantity
* @return type
*/
private function readInputDiscretesPacketBuilder($unitId, $reference, $quantity){
$dataLen = 0;
// build data section
$buffer1 = "";
// build body
$buffer2 = "";
$buffer2 .= iecType::iecBYTE(2); // FC 2 = 2(0x02)
// build body - read section
$buffer2 .= iecType::iecINT($reference); // refnumber = 12288
$buffer2 .= iecType::iecINT($quantity); // quantity
$dataLen += 5;
// build header
$buffer3 = '';
$buffer3 .= iecType::iecINT(rand(0,65000)); // transaction ID
$buffer3 .= iecType::iecINT(0); // protocol ID
$buffer3 .= iecType::iecINT($dataLen + 1); // lenght
$buffer3 .= iecType::iecBYTE($unitId); //unit ID
// return packet string
return $buffer3. $buffer2. $buffer1;
}
/**
* readInputDiscretesParser
*
* FC 2 response parser, alias to FC 1 parser i.e. readCoilsParser.
*
* @param type $packet
* @param type $quantity
* @return type
*/
private function readInputDiscretesParser($packet, $quantity){
return $this->readCoilsParser($packet, $quantity);
}
/** /**
* readMultipleRegisters * readMultipleRegisters
* *
@@ -397,6 +512,107 @@ class ModbusMaster {
return $data; return $data;
} }
/**
* writeSingleRegister
*
* Modbus function FC6(0x06) - Write Single Register.
*
* This function writes {@link $data} single word value at {@link $reference} position of
* memory of a Modbus device given by {@link $unitId}.
*
*
* @param int $unitId usually ID of Modbus device
* @param int $reference Reference in the device memory (e.g. in device WAGO 750-841, memory MW0 starts at address 12288)
* @param array $data Array of values to be written.
* @param array $dataTypes Array of types of values to be written. The array should consists of string "INT", "DINT" and "REAL".
* @return bool Success flag
*/
function writeSingleRegister($unitId, $reference, $data, $dataTypes){
$this->status .= "writeSingleRegister: START\n";
// connect
$this->connect();
// send FC6
$packet = $this->writeSingleRegisterPacketBuilder($unitId, $reference, $data, $dataTypes);
$this->status .= $this->printPacket($packet);
$this->send($packet);
// receive response
$rpacket = $this->rec();
$this->status .= $this->printPacket($rpacket);
// parse packet
$this->writeSingleRegisterParser($rpacket);
// disconnect
$this->disconnect();
$this->status .= "writeSingleRegister: DONE\n";
return true;
}
/**
* fc6
*
* Alias to {@link writeSingleRegister} method
*
* @param int $unitId
* @param int $reference
* @param array $data
* @param array $dataTypes
* @return bool
*/
function fc6($unitId, $reference, $data, $dataTypes){
return $this->writeSingleRegister($unitId, $reference, $data, $dataTypes);
}
/**
* writeSingleRegisterPacketBuilder
*
* Packet builder FC6 - WRITE single register
*
* @param int $unitId
* @param int $reference
* @param array $data
* @param array $dataTypes
* @return string
*/
private function writeSingleRegisterPacketBuilder($unitId, $reference, $data, $dataTypes){
$dataLen = 0;
// build data section
$buffer1 = "";
foreach($data as $key=>$dataitem) {
$buffer1 .= iecType::iecINT($dataitem); // register values x
$dataLen += 2;
break;
}
// build body
$buffer2 = "";
$buffer2 .= iecType::iecBYTE(6); // FC6 = 6(0x06)
$buffer2 .= iecType::iecINT($reference); // refnumber = 12288
$dataLen += 3;
// build header
$buffer3 = '';
$buffer3 .= iecType::iecINT(rand(0,65000)); // transaction ID
$buffer3 .= iecType::iecINT(0); // protocol ID
$buffer3 .= iecType::iecINT($dataLen + 1); // lenght
$buffer3 .= iecType::iecBYTE($unitId); //unit ID
// return packet string
return $buffer3. $buffer2. $buffer1;
}
/**
* writeSingleRegisterParser
*
* FC6 response parser
*
* @param string $packet
* @return bool
*/
private function writeSingleRegisterParser($packet){
$this->responseCode($packet);
return true;
}
/** /**
* writeMultipleCoils * writeMultipleCoils
* *
@@ -414,7 +630,7 @@ class ModbusMaster {
$this->status .= "writeMultipleCoils: START\n"; $this->status .= "writeMultipleCoils: START\n";
// connect // connect
$this->connect(); $this->connect();
// send FC16 // send FC15
$packet = $this->writeMultipleCoilsPacketBuilder($unitId, $reference, $data); $packet = $this->writeMultipleCoilsPacketBuilder($unitId, $reference, $data);
$this->status .= $this->printPacket($packet); $this->status .= $this->printPacket($packet);
$this->send($packet); $this->send($packet);
+3 -3
View File
@@ -1,12 +1,12 @@
<?php <?php
/** /**
* Phpmodbus Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) * Phpmodbus Copyright (c) 2004, 2012 Jan Krakora
* *
* This source file is subject to the "PhpModbus license" that is bundled * This source file is subject to the "PhpModbus license" that is bundled
* with this package in the file license.txt. * with this package in the file license.txt.
* *
* @author Jan Krakora * @author Jan Krakora
* @copyright Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) * @copyright Copyright (c) 2004, 2012 Jan Krakora
* @license PhpModbus license * @license PhpModbus license
* @category Phpmodbus * @category Phpmodbus
* @package Phpmodbus * @package Phpmodbus
@@ -21,7 +21,7 @@
* (array of bytes) to the PHP data type, i.e. signed int, unsigned int and float. * (array of bytes) to the PHP data type, i.e. signed int, unsigned int and float.
* *
* @author Jan Krakora * @author Jan Krakora
* @copyright Copyright (c) 2004, 2010 Jan Krakora, WAGO Kontakttechnik GmbH & Co. KG (http://www.wago.com) * @copyright Copyright (c) 2004, 2012 Jan Krakora
* @package Phpmodbus * @package Phpmodbus
* *
*/ */
+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>";
+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;
?>
+2 -2
View File
@@ -1,10 +1,10 @@
The Phpmodbus License, Version 1 The Phpmodbus License, Version 1
============================ ============================
Copyright (c) 2004, 2011 Jan Krakora, Wago (http://www.wago.com) Copyright (c) 2004, 2013 Jan Krakora
All rights reserved. All rights reserved.
This license is a legal agreement between you and Jan Krakora, Wago (the "Author") 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 for the use of Phpmodbus (the "Software"). By obtaining, using and/or
copying the Software, you agree that you have read, understood, and will copying the Software, you agree that you have read, understood, and will
comply with the terms and conditions of this license. comply with the terms and conditions of this license.
+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.
+2 -2
View File
@@ -2,11 +2,11 @@ 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
try {
$recData = $modbus->readWriteRegisters(0, 12288, 6, 12288, $data, $dataTypes); $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,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);
+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);
+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.168.1.105";
$test_bind_client_ip = "192.192.15.113"; $test_bind_client_ip = "192.168.1.106";
?>
+20 -3
View File
@@ -22,7 +22,9 @@
The library implements: The library implements:
<itemizedlist> <itemizedlist>
<listitem><para>FC 1: read multiple coils</para></listitem> <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 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 15: write multiple coils</para></listitem>
<listitem><para>FC 16: write multiple registers</para></listitem> <listitem><para>FC 16: write multiple registers</para></listitem>
<listitem><para>FC 23: read write registers</para></listitem> <listitem><para>FC 23: read write registers</para></listitem>
@@ -32,9 +34,6 @@
For more about Modbus protocol see [{@link http://www.modbus.org}] or For more about Modbus protocol see [{@link http://www.modbus.org}] or
[{@link http://en.wikipedia.org/wiki/Modbus Wiki}] [{@link http://en.wikipedia.org/wiki/Modbus Wiki}]
</para> </para>
<note>
Developed with support of <graphic fileref="wago_logo.png"/> {@link http://www.wago.com}.
</note>
</refsect1> </refsect1>
<refsect1 id="{@id install}"> <refsect1 id="{@id install}">
<title>Install</title> <title>Install</title>
@@ -104,6 +103,15 @@ catch (Exception $e) {
{@example example_fc1.php} {@example example_fc1.php}
</para> </para>
</refsect2> </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}"> <refsect2 id="{@id example_fc3}">
<title>FC3 - read mutliple registers</title> <title>FC3 - read mutliple registers</title>
<para> <para>
@@ -113,6 +121,15 @@ catch (Exception $e) {
{@example example_fc3.php} {@example example_fc3.php}
</para> </para>
</refsect2> </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}"> <refsect2 id="{@id example_fc15}">
<title>FC15 - write mutliple coils</title> <title>FC15 - write mutliple coils</title>
<para> <para>