Hallo ihr Wissenden,
ich möchte mittels php auf meinen Simatic net OPC Server schreibend zugreifen. Das lesen von Variablen bekomm ich soweit hin nur beim Schreibversuch kommt folgende Fehlermeldung:
Code:
Text=> The Server cannot convert the value to the requestet type. [ID]=> E_BADTYPE
In der von Siemens gegebenen Anleitung steht als Erklärung dieses Fehlers folgendes:
Code:
The server cannot convert the data between the specified format and/or requested data type and the canonical data type.
Nun mal mein Code zum schreiben:
PHP-Code:
<?php
error_reporting(-1);
ini_set('display_errors', TRUE);
$wsdl = 'http://192.168.38.1/OPC.Simatic.NET/SOPCWeb.asmx?WSDL';
//$zahl=1;
//$test=new SoapParam((int)$zahl,"Value"); sowas verrücktes habe ich auch schon probiert
$werte=array();
$werte["Options"]=array(
//"RequestDeadline"=>"",
//"ReturnErrorText"=>"",
//"ReturnDiagnosticInfo"=>47,
//"ReturnItemTime"=>"",
//"ReturnItemPath"=>"",
//"ReturnItemName"=>True,
//"ClientRequestHandle"=>"teeest",
//"LocaleID"=>""
);
$werte["ItemList"]=array(
"Items"=>array(//"DiagnosticInfo"=>"",
//"Value"=>array(xsi:type="xsd:bool"=>True), //erfolgloser versuch
//new SoapVar(2,XSD_INT,'xsd:int',Value), //erfolgloser versuch
//new SoapParam((int)$zahl,Value), //erfolgloser versuch
//"Value" => $test, //erfolgloser versuch
"Value"=>4, //1. Versuch von dem ich dachte das er klappen könnte - erfolglos
"Quality"=>array(//"QualityField"=>"",
//"LimitField"=>"",
//"VendorField"=>""
),
//"ItemPath"=>"",
"ItemName"=>"S7:[OPC_1]MINT12,9", //integer Variable deren wert ich schreiben möchte
//"ClientItemHandle"=>"",
//"Timestamp"=>"",
//"ResultID"=>"",
//"ValueTypeQualifier"=>"",
//"ItemPath"=>"",
));
$werte["ReturnValuesOnReply"]=False;
$client = new SoapClient($wsdl);
$result = $client->write($werte);
print_r ($result); //Alles ausgeben
?>
Zur Erklärung des Value-Attributes von Siemens entnehme ich folgendes:
Code:
Value: Der Wert des Items. Da es sich bei diesem Attribut um eine
polymorphe Angabe handelt, ist das zusätzliche Attribut xsi:type
notwendig (zum Beispiel: xsi:type=xsd:float).
Und hier liegt evtl. auch schon der Hund begraben. Wie ist es möglich dieses zusätzliche Atribut in meinem Code unterzubringen? Habe auch schon ein wenig mit dem SoapVar constructor rumgespielt...ohne Ergebnis.
Vielleicht hat von euch einer ne Idee.
Vielen Dank im Voraus.