Einzelnen Beitrag anzeigen
  #2  
Alt 13.03.2013, 11:37:46
Datta90 Datta90 ist offline
Anfänger
 
Registriert seit: Mar 2013
Alter: 33
Beiträge: 11
Fatal error: Server was unable to process request. ---> Value cannot be null

Hallo Freunde der Programmiersprache PHP=)
Ich versuche verzweifelt Daten von einem OPC Server (Soap/xml) zu lesen und erhalte folgende Fehlermeldung:

Fatal error: Uncaught SoapFault exception: [soap:Server] Server was unable to process request. ---> Value cannot be null. Parameter name: Item List in B:\xampp\htdocs\meine\testb.php:22 Stack trace: #0 B:\xampp\htdocs\meine\testb.php(72): SoapClient->__soapCall('read', Array) #1 {main} thrown in B:\xampp\htdocs\meine\testb.php on line 33

Nun also erstmal mein bisschen PHP-Code:
<?php
error_reporting(-1);
ini_set('display_errors', TRUE);

$wsdl = 'http://192.168.38.1/OPC.Simatic.NET/SOPCWeb.asmx?WSDL';

$werte=array();
$werte["Options"]=array(
"RequestDeadline"=>"",
"ReturnErrorText"=>"",
"ReturnDiagnosticInfo"=>True,
"ReturnItemTime"=>"",
"ReturnItemPath"=>True,
"ReturnItemName"=>"",
"ClientRequestHandle"=>"",
"LocaleID"=>""
);
$werte["Itemlist"]=array(
"Items"=>array("ItemPath"=>"",
"ReqType"=>"",
"ItemName"=>"S7:[OPC_1]MX1.0",
"ClientItemHandle"=>"",
"MaxAge"=>""
),
"ItemPath"=>"",
"ReqType"=>"",
"MaxAge"=>""
);



$client = new SoapClient($wsdl);
$result = $client->__soapCall("read",$werte);

echo $result->RItemList->Items->Quality; /*DAS IST LINE 33*/

?>


Hier die zugerhörige wsdl(SOAP)-Datei: (könnt ihr erstmal überspringen unten stehts übersichtlicher)
POST /OPC.Simatic.NET/SOPCWeb.asmx HTTP/1.1
Host: localhost
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<Read xmlns="http://opcfoundation.org/webservices/XMLDA/1.0/">
<Options RequestDeadline="dateTime" ReturnErrorText="boolean" ReturnDiagnosticInfo="boolean" ReturnItemTime="boolean" ReturnItemPath="boolean" ReturnItemName="boolean" ClientRequestHandle="string" LocaleID="string" />
<ItemList ItemPath="string" ReqType="q1:QName" xmlns:q1="http://tempuri.org/SampleNamespace" MaxAge="int">
<Items ItemPath="string" ReqType="q1:QName" ItemName="string" ClientItemHandle="string" MaxAge="int" />
<Items ItemPath="string" ReqType="q1:QName" ItemName="string" ClientItemHandle="string" MaxAge="int" />
</ItemList>
</Read>
</soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<ReadResponse xmlns="http://opcfoundation.org/webservices/XMLDA/1.0/">
<ReadResult RcvTime="dateTime" ReplyTime="dateTime" ClientRequestHandle="string" RevisedLocaleID="string" ServerState="running or failed or noConfig or suspended or test or commFault" />
<RItemList Reserved="string">
<Items ItemPath="string" ItemName="string" ClientItemHandle="string" Timestamp="dateTime" ResultID="q1:QName" xmlns:q1="http://tempuri.org/SampleNamespace" ValueTypeQualifier="q1:QName">
<DiagnosticInfo>string</DiagnosticInfo>
<Value />
<Quality QualityField="bad or badConfigurationError or badNotConnected or badDeviceFailure or badSensorFailure or badLastKnownValue or badCommFailure or badOutOfService or badWaitingForInitialData or uncertain or uncertainLastUsableValue or uncertainSensorNotAccurate or uncertainEUExceeded or uncertainSubNormal or good or goodLocalOverride" LimitField="none or low or high or constant" VendorField="unsignedByte" />
</Items>
<Items ItemPath="string" ItemName="string" ClientItemHandle="string" Timestamp="dateTime" ResultID="q1:QName" xmlns:q1="http://tempuri.org/SampleNamespace" ValueTypeQualifier="q1:QName">
<DiagnosticInfo>string</DiagnosticInfo>
<Value />
<Quality QualityField="bad or badConfigurationError or badNotConnected or badDeviceFailure or badSensorFailure or badLastKnownValue or badCommFailure or badOutOfService or badWaitingForInitialData or uncertain or uncertainLastUsableValue or uncertainSensorNotAccurate or uncertainEUExceeded or uncertainSubNormal or good or goodLocalOverride" LimitField="none or low or high or constant" VendorField="unsignedByte" />
</Items>
</RItemList>
<Errors ID="q1:QName" xmlns:q1="http://tempuri.org/SampleNamespace">
<Text>string</Text>
</Errors>
<Errors ID="q1:QName" xmlns:q1="http://tempuri.org/SampleNamespace">
<Text>string</Text>
</Errors>
</ReadResponse>
</soap12:Body>
</soap12:Envelope>


Mal ein bisschen übersichtlicher dargestellt mit var_dump((client->_getFunctions()) bzw. getTypes:
Funktionen:
[0]=>
string(50) "GetStatusResponse GetStatus(GetStatus $parameters)"
[1]=>
string(35) "ReadResponse Read(Read $parameters)"
[2]=>
string(38) "WriteResponse Write(Write $parameters)"
(..... noch ein paar mehr....)


Typen:
(..... noch ein paar mehr....)
[6]=>
string(71) "struct Read {
RequestOptions Options;
ReadRequestItemList ItemList;
}"
[7]=>
string(231) "struct RequestOptions {
dateTime RequestDeadline;
boolean ReturnErrorText;
boolean ReturnDiagnosticInfo;
boolean ReturnItemTime;
boolean ReturnItemPath;
boolean ReturnItemName;
string ClientRequestHandle;
string LocaleID;
}"
[8]=>
string(101) "struct ReadRequestItemList {
ReadRequestItem Items;
string ItemPath;
QName ReqType;
int MaxAge;
}"
[9]=>
string(117) "struct ReadRequestItem {
string ItemPath;
QName ReqType;
string ItemName;
string ClientItemHandle;
int MaxAge;
}"
[10]=>
string(90) "struct ReadResponse {
ReplyBase ReadResult;
ReplyItemList RItemList;
OPCError Errors;
}"
[11]=>
string(60) "struct ReplyItemList {
ItemValue Items;
string Reserved;
}"
[12]=>
string(208) "struct ItemValue {
string DiagnosticInfo;
anyType Value;
OPCQuality Quality;
string ItemPath;
string ItemName;
string ClientItemHandle;
dateTime Timestamp;
QName ResultID;
QName ValueTypeQualifier;
}"
(..... noch ein paar mehr....)

Daraus wird erkennbar das die read Funktionen alles in arrayform (struct) serviert haben möchte.

Fällt euch was auf was ich falsch mache? (Vielleicht falscher Aufbau der arrays?) Werdet ihr aus den Fehlermeldungen schlauer oder könnt ihr mir anders weiterhelfen?
Vielen Dank im Voraus!