/** * Title * * Description * * @access public */ function poll_device($id) { $rec = SQLSelectOne("SELECT * FROM modbusdevices WHERE ID='" . (int) $id . "'"); if (!$rec['ID']) { return; } $rec['CHECK_LATEST'] = date('Y-m-d H:i:s'); $rec['CHECK_NEXT'] = date('Y-m-d H:i:s', time() + (int) $rec['POLLPERIOD']); SQLUpdate('modbusdevices', $rec); if ($rec['LINKED_OBJECT'] && $rec['LINKED_PROPERTY'] && ($rec['REQUEST_TYPE'] == 'FC5' || $rec['REQUEST_TYPE'] == 'FC6' || $rec['REQUEST_TYPE'] == 'FC15' || $rec['REQUEST_TYPE'] == 'FC16' || $rec['REQUEST_TYPE'] == 'FC23')) { $rec['DATA'] = getGlobal($rec['LINKED_OBJECT'] . '.' . $rec['LINKED_PROPERTY']); } require_once dirname(__FILE__) . '/ModbusMaster.php'; $modbus = new ModbusMaster($rec['HOST'], $rec['PROTOCOL']); if ($rec['PORT']) { $modbus->port = $rec['PORT']; } if ($rec['REQUEST_TYPE'] == 'FC1') { //FC1 Read coils try { $recData = $modbus->readCoils($rec['DEVICE_ID'], $rec['REQUEST_START'], $rec['REQUEST_TOTAL']); if (is_array($recData)) { foreach ($recData as $k => $v) { $recData[$k] = (int) $v; } } } catch (Exception $e) { // Print error information if any $rec['LOG'] = date('Y-m-d H:i:s') . " FC1 Error: {$modbus} {$e}\n" . $rec['LOG']; } } elseif ($rec['REQUEST_TYPE'] == 'FC2') { //FC2 Read input discretes try { $recData = $modbus->readInputDiscretes($rec['DEVICE_ID'], $rec['REQUEST_START'], $rec['REQUEST_TOTAL']); if (is_array($recData)) { foreach ($recData as $k => $v) { $recData[$k] = (int) $v; } } } catch (Exception $e) { // Print error information if any $rec['LOG'] = date('Y-m-d H:i:s') . " FC2 Error: {$modbus} {$e}\n" . $rec['LOG']; } } elseif ($rec['REQUEST_TYPE'] == 'FC3') { //FC3 Read holding registers try { $recData = $modbus->readMultipleRegisters($rec['DEVICE_ID'], $rec['REQUEST_START'], $rec['REQUEST_TOTAL']); } catch (Exception $e) { // Print error information if any $rec['LOG'] = date('Y-m-d H:i:s') . " FC3 Error: {$modbus} {$e}\n" . $rec['LOG']; } } elseif ($rec['REQUEST_TYPE'] == 'FC4') { //FC4 Read holding input registers try { $recData = $modbus->readMultipleInputRegisters($rec['DEVICE_ID'], $rec['REQUEST_START'], $rec['REQUEST_TOTAL']); } catch (Exception $e) { // Print error information if any $rec['LOG'] = date('Y-m-d H:i:s') . " FC4 Error: {$modbus} {$e}\n" . $rec['LOG']; } } elseif ($rec['REQUEST_TYPE'] == 'FC5') { //FC5 Write single coil if ((int) $rec['DATA']) { $data_set = array(TRUE); } else { $data_set = array(FALSE); } try { $modbus->writeSingleCoil($rec['DEVICE_ID'], $rec['REQUEST_START'], $data_set); } catch (Exception $e) { $rec['LOG'] = date('Y-m-d H:i:s') . " FC5 Error: {$modbus} {$e}\n" . $rec['LOG']; } } elseif ($rec['REQUEST_TYPE'] == 'FC6') { //FC6 Write single register try { $data_set = array((int) $rec['DATA']); if ($rec['RESPONSE_CONVERT'] == 'r2f') { $dataTypes = array("REAL"); $swapregs = false; } elseif ($rec['RESPONSE_CONVERT'] == 'r2fs') { $dataTypes = array("REAL"); $swapregs = true; } elseif ($rec['RESPONSE_CONVERT'] == 'd2i' || $rec['RESPONSE_CONVERT'] == 'dw2i') { $dataTypes = array("DINT"); $swapregs = false; } elseif ($rec['RESPONSE_CONVERT'] == 'd2is' || $rec['RESPONSE_CONVERT'] == 'dw2is') { $dataTypes = array("DINT"); $swapregs = true; } else { $dataTypes = array("INT"); $swapregs = false; } $recData = $modbus->writeSingleRegister($rec['DEVICE_ID'], $rec['REQUEST_START'], $data_set, $dataTypes, $swapregs); } catch (Exception $e) { // Print error information if any $rec['LOG'] = date('Y-m-d H:i:s') . " FC6 Error: {$modbus} {$e}\n" . $rec['LOG']; } } elseif ($rec['REQUEST_TYPE'] == 'FC15') { //FC15 Write multiple coils $data_set = explode(',', $rec['DATA']); foreach ($data_set as $k => $v) { $data_set[$k] = (bool) $v; } try { $modbus->writeMultipleCoils($rec['DEVICE_ID'], $rec['REQUEST_START'], $data_set); } catch (Exception $e) { $rec['LOG'] = date('Y-m-d H:i:s') . " FC15 Error: {$modbus} {$e}\n" . $rec['LOG']; } } elseif ($rec['REQUEST_TYPE'] == 'FC16') { //FC16 Write multiple registers try { $data_set = explode(',', $rec['DATA']); $dataTypes = array(); foreach ($data_set as $k => $v) { if ($rec['RESPONSE_CONVERT'] == 'r2f') { $dataTypes[] = "REAL"; $data_set[$k] = (double) $v; $swapregs = false; } elseif ($rec['RESPONSE_CONVERT'] == 'r2fs') { $dataTypes[] = "REAL"; $data_set[$k] = (double) $v; $swapregs = true; } elseif ($rec['RESPONSE_CONVERT'] == 'd2i' || $rec['RESPONSE_CONVERT'] == 'dw2i') { $dataTypes[] = "DINT"; $data_set[$k] = (int) $v; $swapregs = false; } elseif ($rec['RESPONSE_CONVERT'] == 'd2is' || $rec['RESPONSE_CONVERT'] == 'dw2is') { $dataTypes[] = "DINT"; $data_set[$k] = (int) $v; $swapregs = true; } else { $data_set[$k] = (int) $v; $dataTypes[] = "INT"; $swapregs = false; } } $recData = $modbus->writeMultipleRegister($rec['DEVICE_ID'], $rec['REQUEST_START'], $data_set, $dataTypes, $swapregs); } catch (Exception $e) { // Print error information if any $rec['LOG'] = date('Y-m-d H:i:s') . " FC16 Error: {$modbus} {$e}\n" . $rec['LOG']; } } elseif ($rec['REQUEST_TYPE'] == 'FC23') { //FC23 Read/Write multiple registers //TO-DO } //echo $rec['LOG'];exit; if ($rec['REQUEST_TYPE'] == 'FC1' || $rec['REQUEST_TYPE'] == 'FC2' || $rec['REQUEST_TYPE'] == 'FC3' || $rec['REQUEST_TYPE'] == 'FC4' && is_array($recData)) { // PROCESS RESPONSE if ($rec['RESPONSE_CONVERT'] == 'r2f') { //REAL to Float $values = array_chunk($recData, 4); $recData = array(); foreach ($values as $bytes) { echo $recData[] = PhpType::bytes2float($bytes, false); } } elseif ($rec['RESPONSE_CONVERT'] == 'r2fs') { //REAL to Float (swap regs) $values = array_chunk($recData, 4); $recData = array(); foreach ($values as $bytes) { echo $recData[] = PhpType::bytes2float($bytes, true); } } elseif ($rec['RESPONSE_CONVERT'] == 'd2i') { //DINT to integer $values = array_chunk($recData, 4); $recData = array(); foreach ($values as $bytes) { echo $recData[] = PhpType::bytes2signedInt($bytes, false); } } elseif ($rec['RESPONSE_CONVERT'] == 'd2is') { //DINT to integer (swap regs) $values = array_chunk($recData, 4); $recData = array(); foreach ($values as $bytes) { echo $recData[] = PhpType::bytes2signedInt($bytes, true); } } elseif ($rec['RESPONSE_CONVERT'] == 'dw2i') { //DWORD to integer $values = array_chunk($recData, 4); $recData = array(); foreach ($values as $bytes) { $recData[] = PhpType::bytes2unsignedInt($bytes, false); } } elseif ($rec['RESPONSE_CONVERT'] == 'dw2is') { //DWORD to integer (swap regs) $values = array_chunk($recData, 4); $recData = array(); foreach ($values as $bytes) { $recData[] = PhpType::bytes2unsignedInt($bytes, true); } } elseif ($rec['RESPONSE_CONVERT'] == 'i2i') { //INT to integer $values = array_chunk($recData, 2); $recData = array(); foreach ($values as $bytes) { $recData[] = PhpType::bytes2signedInt($bytes, false); } } elseif ($rec['RESPONSE_CONVERT'] == 'w2i') { //WORD to integer $values = array_chunk($recData, 2); $recData = array(); foreach ($values as $bytes) { $recData[] = PhpType::bytes2unsignedInt($bytes, false); } } elseif ($rec['RESPONSE_CONVERT'] == 's') { //String $recData = array(PhpType::bytes2string($recData)); } else { // } $result = implode(',', $recData); if ($result && $result != $rec['DATA']) { $rec['LOG'] = date('Y-m-d H:i:s') . " " . $result . "\n" . $rec['LOG']; } $rec['DATA'] = $result; SQLUpdate('modbusdevices', $rec); if ($rec['LINKED_OBJECT'] && $rec['LINKED_PROPERTY']) { setGlobal($rec['LINKED_OBJECT'] . '.' . $rec['LINKED_PROPERTY'], $rec['DATA'], array($this->name => '0')); } } else { SQLUpdate('modbusdevices', $rec); } }
function getModbusRegisters($modbusHostname, $slaveAddress, $startRegister, $nRegisters) { /* printf("# getModbusRegisters(modbusHostname=%s, slaveAddress=%s, startRegister=%s, nRegisters=%s\n", $modbusHostname, $slaveAddress, $startRegister, $nRegisters ); */ $modbus = new ModbusMaster($modbusHostname, "TCP"); /* read registers */ try { $result = $modbus->readMultipleRegisters($slaveAddress, $startRegister, $nRegisters); } catch (Exception $e) { printf("Exception: %s\n", $e); return array(); } /* split into 1 word (2 byte) chunks */ $result = array_chunk($result, 2); /* word results */ $r = array(); for ($i = 0; $i < sizeof($result); $i++) { $r[$i + $startRegister] = PhpType::bytes2unsignedInt($result[$i]); } return $r; }
/** * 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"); }
<?php require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMaster.php'; require_once dirname(__FILE__) . '/../config.php'; // Create Modbus object $modbus = new ModbusMaster($test_host_ip, "TCP"); // Data to be writen $data = array(1000, 2000, 1.25, 1.25); $dataTypes = array("REAL", "REAL", "REAL", "REAL"); // FC23 $recData = $modbus->readWriteRegisters(0, 12288, 6, 12288, $data, $dataTypes); if (!$recData) { // Print error information if any echo "</br>Error:</br>" . $modbus->errstr . "</br>"; // exit; } // Print status information echo "writeMultipleRegister (FC26): DONE";
<?php require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; // Create Modbus object $ip = "192.192.15.51"; $modbus = new ModbusMaster($ip, "UDP"); try { // FC 3 $moduleId = 0; $reference = 12288; $mw0address = 12288; $quantity = 6; $recData = $modbus->readMultipleRegisters($moduleId, $reference, $quantity); } catch (Exception $e) { echo $modbus; echo $e; exit; } ?> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title>WAGO 750-841 M-memory dump</title> </head> <body> <h1>Dump of M-memory from WAGO 750-84x series coupler.</h1> <ul> <li>PLC: 750-84x series</li> <li>IP: <?php echo $ip;
<?php require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; // Create Modbus object $modbus = new ModbusMaster("192.192.15.51", "UDP"); try { // FC 3 $recData = $modbus->readMultipleRegisters(0, 12288, 6); } 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>"; print_r($recData); echo "</br>";
<?php require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMaster.php'; require_once dirname(__FILE__) . '/../config.php'; // Create Modbus object $modbus = new ModbusMaster($test_host_ip, "UDP"); // Data to be writen - BYTE $data = array(0, 1, 1, pow(2, 8) - 1, pow(2, 8) - 1); $dataTypes = array("BYTE", "BYTE", "BYTE", "BYTE", "BYTE"); // Write data - FC 16 $modbus->writeMultipleRegister(0, 12288, $data, $dataTypes); // Read data - FC3 $recData = $modbus->readMultipleRegisters(0, 12288, 5); print_r($recData); // Data to be writen - INT $data = array(0, 1, -1, pow(2, 15) - 1, -pow(2, 15)); $dataTypes = array("INT", "INT", "INT", "INT", "INT"); // Write data - FC 16 $modbus->writeMultipleRegister(0, 12288, $data, $dataTypes); // Read data - FC3 $recData = $modbus->readMultipleRegisters(0, 12288, 5); print_r($recData); // Data to be writen - DINT $data = array(0, 1, -1, pow(2, 31) - 1, -pow(2, 31)); $dataTypes = array("DINT", "DINT", "DINT", "DINT", "DINT"); // Write data - FC 16 $modbus->writeMultipleRegister(0, 12288, $data, $dataTypes); // Read data - FC3 $recData = $modbus->readMultipleRegisters(0, 12288, 10); print_r($recData); // Data to be writen - REAL
<?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(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); try { // FC15 $modbus->writeMultipleCoils(0, 12288, $data); } catch (Exception $e) { // Print error information if any echo $modbus; echo $e; exit; } // Print status information echo $modbus;
<?php require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; // Create Modbus object $modbus = new ModbusMaster("192.192.15.51", "UDP"); try { // FC 2 $recData = $modbus->readInputDiscretes(0, 12288, 12); } 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>";
<?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>";
<?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;
<?php require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php'; // Create Modbus object $modbus = new ModbusMaster("192.192.15.51", "UDP"); try { // FC 1 $recData = $modbus->readCoils(0, 12288, 12); } 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>";
<?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(10, -1000, 2000, 3.0); $dataTypes = array("WORD", "INT", "DINT", "REAL"); try { // FC16 $modbus->writeMultipleRegister(0, 12288, $data, $dataTypes); } catch (Exception $e) { // Print error information if any echo $modbus; echo $e; exit; } // Print status information echo $modbus;
<?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 = 0x0 ^ 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;