/** * 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); } }
public function setReferencedType(PhpType $type) { if (!$type->isObjectType()) { throw new \LogicException('The referenced type must be an object type.'); } if ($type->isNoObjectType()) { throw new \LogicException('The referenced type must not be the generic object type.'); } parent::setReferencedType($type); $this->resolved = true; }
public function __construct($resourcesDir = null, $indexFilename = 'README', $filesExtension = 'md') { if (null === $resourcesDir) { $resourcesDir = __DIR__ . '/Resources/markdown'; } parent::__construct($resourcesDir, $indexFilename, $filesExtension); }
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; }
public function testForEquality(PhpType $that) { if (null !== ($rs = parent::testForEquality($that))) { return $rs; } if ($that->isIntegerType() || $that->isDoubleType() || $that->isNullType() || $that->isResourceType() || $that->isNullType() || $that->isBooleanType()) { return TernaryValue::get('false'); } return TernaryValue::get('unknown'); }
public function equals(PhpType $that) { if (parent::equals($that)) { return true; } if ($that->isUnknownType()) { return true; } return false; }
public function testForEquality(PhpType $that) { if (null !== ($rs = parent::testForEquality($that))) { return $rs; } if ($that->isObjectType() || $that->isNoObjectType() || $that->isArrayType() || $that->isNullType() || $that->isCallableType()) { return TernaryValue::get('false'); } return TernaryValue::get('unknown'); }
public function isSubTypeOf(PhpType $type) { if (parent::isSubTypeOf($type)) { return true; } if ($type->isCallableType()) { return true; } return false; }
public function testForEquality(PhpType $that) { $rs = parent::testForEquality($that); if ($rs !== null) { return $rs; } if ($that->isUnknownType() || $that->isNullType() || $that->isStringType() || $that->isIntegerType() || $that->isResourceType() || $that->isDoubleType()) { return TernaryValue::get('unknown'); } return TernaryValue::get('false'); }
public function testForEquality(PhpType $that) { $rs = parent::testForEquality($that); if (null !== $rs) { return $rs; } if ($that->isUnknownType() || $that->isSubTypeOf($this->registry->getNativeType('scalar')) || $that->isNullType() || $that->isResourceType() || $that->isObjectType()) { return TernaryValue::get('unknown'); } return TernaryValue::get('false'); }
public function testForEquality(PhpType $that) { $rs = parent::testForEquality($that); if ($rs !== null) { return $rs; } if ($that->isNullType()) { return TernaryValue::get('true'); } if ($that->isUnknownType() || $that->isNullable()) { return TernaryValue::get('unknown'); } return TernaryValue::get('false'); }
public function getLeastSuperType(PhpType $that) { if ($that->isArrayType()) { if ($this->isSubtypeOf($that)) { // We have a special case, that is if we compare array<unknown> to array<all>. Although, both types are // subtypes of each other, we always must have a predictable outcome of this method regardless of the // order of types, i.e. $a->getLeastSuperType($b) === $b->getLeastSuperType($a). if ($this->elementType->isUnknownType() && $that->elementType->isAllType()) { return $this; } if ($that->elementType->isUnknownType() && $this->elementType->isAllType()) { return $that; } return parent::getLeastSuperType($that); } $genericArrayType = $this->registry->getNativeType('array'); if ($this === $genericArrayType) { return $this; } if ($that === $genericArrayType) { return $that; } // If both arrays have different item types defined, we keep them as // separate arrays in a union type. It can be used as an indication // that a key is not always defined. if (count($this->itemTypes) !== count($that->itemTypes) || (bool) array_diff_key($this->itemTypes, $that->itemTypes)) { return parent::getLeastSuperType($that); } $keyType = $this->registry->createUnionType(array($this->keyType, $that->keyType)); $elementType = $this->registry->createUnionType(array($this->elementType, $that->elementType)); $itemTypes = array(); foreach ($this->itemTypes as $name => $itemType) { $itemTypes[$name] = $this->registry->createUnionType(array($itemType, $that->itemTypes[$name])); } return $this->registry->getArrayType($elementType, $keyType, $itemTypes); } return parent::getLeastSuperType($that); }
<?php require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php'; // Received bytes interpreting 3 REAL values (6 words) $data = array(0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x0, 0x61, 0x61); // Print string interpretation of the values echo PhpType::bytes2string($data) . "<br>"; echo PhpType::bytes2string($data, true) . "<br>";
<?php require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php'; // Received bytes interpreting Mixed values $data = array("0" => 125, "1" => 98, "2" => 0, "3" => 0, "4" => 0, "5" => 0, "6" => 0, "7" => 0, "8" => 0, "9" => 0, "10" => 0, "11" => 0, "12" => 255, "13" => 255, "14" => 255, "15" => 255, "16" => 158, "17" => 88, "18" => 97, "19" => 168); // Print mixed values echo PhpType::bytes2unsignedInt(array_slice($data, 0, 4)) . "<br>"; echo PhpType::bytes2signedInt(array_slice($data, 4, 4)) . "<br>"; echo PhpType::bytes2signedInt(array_slice($data, 8, 4)) . "<br>"; echo PhpType::bytes2signedInt(array_slice($data, 12, 4)) . "<br>"; echo PhpType::bytes2signedInt(array_slice($data, 16, 2)) . "<br>"; echo PhpType::bytes2signedInt(array_slice($data, 18, 2)) . "<br>";
<?php require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php'; // Received bytes interpreting DINT values $data = array(0xff, 0xff, 0xff, 0xff, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0x80, 0x0, 0xff, 0xff, 0x7f, 0xff); $dword = array_chunk($data, 4); // Print float interpretation of the real value foreach ($dword as $value) { var_dump(PhpType::bytes2unsignedInt($value)); echo "<br>"; } ?>
<?php require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php'; // Received bytes interpreting DINT values $data = array(0xff, 0xff, 0xff, 0xff, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0x80, 0x0, 0xff, 0xff, 0x7f, 0xff); $dword = array_chunk($data, 4); // Print float interpretation of the real value foreach ($dword as $value) { echo PhpType::bytes2signedInt($value) . "<br>"; } ?>
function test($modbus, $id, $start, $points) { $recData = $modbus->readMultipleRegisters($id, $start, $points); // Print read data echo "</br>Data:</br>"; var_dump($recData); echo "</br>"; // Received data echo "<b>Received Data</b>\n"; print_r($recData); // Conversion echo "<h2>32 bits types</h2>\n"; // Chunk the data array to set of 4 bytes $values = array_chunk($recData, 4); // Get float from REAL interpretation echo "<b>REAL to Float</b>\n"; foreach ($values as $bytes) { echo PhpType::bytes2float($bytes) . "</br>"; } // Get integer from DINT interpretation echo "<b>DINT to integer </b>\n"; foreach ($values as $bytes) { echo PhpType::bytes2signedInt($bytes) . "</br>"; } // Get integer of float from DINT interpretation echo "<b>DWORD to integer (or float) </b>\n"; foreach ($values as $bytes) { echo PhpType::bytes2unsignedInt($bytes) . "</br>"; } echo "<h2>16 bit types</h2>\n"; // Chunk the data array to set of 4 bytes $values = array_chunk($recData, 2); // Get signed integer from INT interpretation echo "<b>INT to integer </b>\n"; foreach ($values as $bytes) { echo PhpType::bytes2signedInt($bytes) . "</br>"; } // Get unsigned integer from WORD interpretation echo "<b>WORD to integer </b>\n"; foreach ($values as $bytes) { echo PhpType::bytes2unsignedInt($bytes) . "</br>"; } // Get string from STRING interpretation echo "<b>STRING to string </b>\n"; echo PhpType::bytes2string($recData) . "</br>"; }
<?php /* * To change this template, choose Tools | Templates * and open the template in the editor. */ require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php'; // Received bytes interpreting Mixed values $data = array("0" => 100, "1" => "e", "2" => 0, "3" => 0); // Print mixed values try { echo PhpType::bytes2unsignedInt(array_slice($data, 0, 4)); } catch (Exception $e) { echo "Exception 'Data are not numeric'"; }
$i = $i + 1; } } else { try { // FC 3 // read 10 words (20 bytes) from device ID=0, address=12288 $recData = $modbus->readMultipleRegisters(0, mysql_result($result1, 0, "start") + mysql_result($result, $w, "start"), mysql_result($result, $w, "anzahl")); } catch (Exception $e) { // Print error information if any echo $modbus; echo $e; exit; } $values = array_chunk($recData, 2); $i = 0; foreach ($values as $bytes) { $text1 = mysql_result($result, $w, "art"); $text2 = mysql_result($result, $w, "start") + $i; $recData1["" . $text1 . $text2 . ""] = PhpType::bytes2signedInt($bytes); $i = $i + 1; } } $w++; } $current = json_encode($recData1); $file = 'https/read/read.html'; file_put_contents($file, $current); } // Shut down the daemon nicely // This is ignored if the class is actually running in the foreground System_Daemon::stop();
<?php require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php'; // Received bytes interpreting 3 REAL values (6 words) $data = array(0 => 0, 1 => 0, 2 => 68, 3 => 122, 4 => 0, 5 => 0, 6 => 68, 7 => 250, 8 => 0, 9 => 0, 10 => 63, 11 => 160); $dword = array_chunk($data, 4); // Print float interpretation of the real value echo PhpType::bytes2float($dword[0]) . "<br>"; echo PhpType::bytes2float($dword[1]) . "<br>"; echo PhpType::bytes2float($dword[2]) . "<br>";
public function isSubTypeOf(PhpType $that) { if ($that->isUnknownType()) { return true; } if ($that->isAllType()) { return true; } foreach ($this->alternates as $element) { if (!$element->isSubTypeOf($that)) { return false; } } return true; }
/** * Returns whether the given type may be passed for the given expected type. * * @param PhpType $expectedType * @param PhpType $actualType * * @return boolean */ public function mayBePassed(PhpType $expectedType, PhpType $actualType) { // This effectively disables all type checks for mock objects. // TODO: Remove this once we have support for parameterized types, and // anonymous classes. if (null !== ($objType = $actualType->toMaybeObjectType()) && $objType->getName() === 'PHPUnit_Framework_MockObject_MockObject') { return true; } if ($actualType instanceof ProxyObjectType && $actualType->getReferenceName() === 'PHPUnit_Framework_MockObject_MockObject') { return true; } // If the actual type is not yet resolved, then we need to let it go through // in favor of avoiding false positives. This indicates a non-existent class, // but that is handled in a different pass. if ($actualType->isNoResolvedType()) { return true; } if ($expectedType->isCallableType()) { return $actualType->canBeCalled(); } // Allow an object that is implementing __toString to be passed where a // string is expected. This should work in most cases unless users perform // some sort of is_??? check, but then they probably also expect non strings. if ($expectedType->isStringType() && null !== ($objType = $actualType->toMaybeObjectType()) && $objType->hasMethod('__toString')) { return true; } if ($actualType->isSubtypeOf($expectedType)) { return true; } // If we are in strict mode, it's already over here. if (self::LEVEL_LENIENT !== $this->level) { return false; } // If the actual type is an all-type, we will not make any fuzz in lenient mode. Simply, because there are a lot // of cases where "all" should really rather mean "unknown" type. if ($actualType->isAllType()) { return true; } switch (true) { case $expectedType->isArrayType(): // If the generic array type is passed in places where a more specific // array type is required, we will let this go through in lenient mode. if ($actualType === $this->typeRegistry->getNativeType('array')) { return true; } if (!$actualType->isArrayType()) { return false; } return $this->mayBePassed($expectedType->getElementType(), $actualType->getElementType()); case $expectedType->isDoubleType(): case $expectedType->isStringType(): case $expectedType->isIntegerType(): $actualType = $actualType->restrictByNotNull(); return $actualType->isSubTypeOf($this->typeRegistry->createUnionType(array('string', 'integer', 'double'))); // For unions we let the check pass if the actual type may be passed for any // of the union's alternates. // For unions we let the check pass if the actual type may be passed for any // of the union's alternates. case $expectedType->isUnionType(): assert($expectedType instanceof UnionType); foreach ($expectedType->getAlternates() as $alt) { if ($this->mayBePassed($alt, $actualType)) { return true; } } return false; default: return false; } }
* and open the template in the editor. */ require_once dirname(__FILE__) . '/../../Phpmodbus/ModbusMasterUdp.php'; // Received bytes interpreting Mixed values $data = array("0" => 100, "1" => 2, "2" => 0, "3" => 0, "4" => 100, "5" => 2); // Print mixed values try { echo PhpType::bytes2unsignedInt(array_slice($data, 0, 1)) . "<br>"; } catch (Exception $e) { echo "Exception 'Data are not in array 2 or 4 bytes'" . "<br>"; } try { echo PhpType::bytes2unsignedInt(array_slice($data, 0, 2)) . "<br>"; } catch (Exception $e) { echo "Exception 'Data are not in array 2 or 4 bytes'" . "<br>"; } try { echo PhpType::bytes2unsignedInt(array_slice($data, 0, 3)) . "<br>"; } catch (Exception $e) { echo "Exception 'Data are not in array 2 or 4 bytes'" . "<br>"; } try { echo PhpType::bytes2unsignedInt(array_slice($data, 0, 4)) . "<br>"; } catch (Exception $e) { echo "Exception 'Data are not in array 2 or 4 bytes'" . "<br>"; } try { echo PhpType::bytes2unsignedInt(array_slice($data, 0, 5)) . "<br>"; } catch (Exception $e) { echo "Exception 'Data are not in array 2 or 4 bytes'" . "<br>"; }
/** * ReceiveData * @param string $JSONString */ public function ReceiveData($JSONString) { // Empfangene Daten $Data = json_decode($JSONString); //IPS_LogMessage("ReceiveData", utf8_decode($JSONString)); if ($Data->DataID === "{449015FB-6717-4BB6-9F95-F69945CE1272}") { $Data = json_decode($Data->Buffer, true); if ($this->ReadPropertyInteger("DataType") === 0) { if ($this->ReadPropertyBoolean("ReadOnly")) { $Value = @$Data["FC2"][$this->ReadPropertyInteger("Address")]; } else { $Value = @$Data["FC1"][$this->ReadPropertyInteger("Address")]; } if (isset($Value)) { if (GetValue($this->GetIDForIdent("Value")) != $Value) { SetValueBoolean($this->GetIDForIdent("Value"), $Value); } } } else { if ($this->ReadPropertyBoolean("ReadOnly")) { $Bytes = @$Data["FC4"][$this->ReadPropertyInteger("Address")]; } else { $Bytes = @$Data["FC3"][$this->ReadPropertyInteger("Address")]; } if (isset($Bytes)) { switch ($this->ReadPropertyInteger("DataType")) { case 1: case 2: case 3: $Value = PhpType::bytes2unsignedInt($Bytes); break; case 4: case 5: case 6: case 8: $Value = PhpType::bytes2signedInt($Bytes); break; case 7: case 9: $Value = PhpType::bytes2float($Bytes); break; } if (GetValue($this->GetIDForIdent("Value")) != $Value) { SetValue($this->GetIDForIdent("Value"), $Value); } if ($this->ReadPropertyString("Math") != "" and $this->ReadPropertyBoolean("ReadOnly")) { $Value = $this->Math($Value . $this->ReadPropertyString("Math")); if (GetValue($this->GetIDForIdent("ValueMath")) != $Value) { SetValue($this->GetIDForIdent("ValueMath"), $Value); } } } } } }
public function testForEquality(PhpType $that) { if ($this->isNoResolvedType() && ($that->isObjectType() || $that->isNoObjectType())) { return TernaryValue::get('unknown'); } return $this->referencedType->testForEquality($that); }
echo "<h3>REAL to Float</h3>\n"; foreach ($values as $bytes) { echo PhpType::bytes2float($bytes) . "</br>"; } // Get integer from DINT interpretation echo "<h3>DINT to integer </h3>\n"; foreach ($values as $bytes) { echo PhpType::bytes2signedInt($bytes) . "</br>"; } // Get integer of float from DINT interpretation echo "<h3>DWORD to integer (or float) </h3>\n"; foreach ($values as $bytes) { echo PhpType::bytes2unsignedInt($bytes) . "</br>"; } echo "<h2>16 bit types</h2>\n"; // Chunk the data array to set of 4 bytes $values = array_chunk($recData, 2); // Get signed integer from INT interpretation echo "<h3>INT to integer </h3>\n"; foreach ($values as $bytes) { echo PhpType::bytes2signedInt($bytes) . "</br>"; } // Get unsigned integer from WORD interpretation echo "<h3>WORD to integer </h3>\n"; foreach ($values as $bytes) { echo PhpType::bytes2unsignedInt($bytes) . "</br>"; } // Get string from STRING interpretation echo "<h3>STRING to string </h3>\n"; echo PhpType::bytes2string($recData) . "</br>";