PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut (http://www.selfphp.de/forum/showthread.php?t=24894)

Datta90 14.03.2013 14:04:18

Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut
 
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.

Datta90 14.03.2013 15:58:14

AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut
 
Habe noch was interessantes gefunden. Im Netz hat jemand das selbe Problem und darauf antwortete jemand:
Zitat:

In OPC kennt man 2 Datentypen für eine Variable
1) den Canonical Data Type
2) den Requested Data Type

Der kanonische Datentyp ist der "Urdatentyp" den eine Variable besitzt. Eine Lichtschranke hätte beispielsweise den kanonischen Datentyp "Boolean", das liegt in der "Natur" einer Lichtschranke. Ein "S7:[Verb1]DB1,W4,1" ist ein Word (VT_UI2) im Datenbaustein 1 ab der Byteoffsettadresse 4, dessen cannonical DT ist "VT_UI2". Wenn auf diese Adresse ein Symbol gelegt wird z.B. "MeineTemperaturImKessel2" dann hat auch das Symbol den cannonical Datatype VT_UI2 (16 Bit unsigned integer)

Ein OPC Client kann nun beim Hinzufügen der Variable zu einer Gruppe (AddItems) angeben dass der Server diese Variable bitte in einem anderen Datentyp liefern soll. Der Requested Data Type könnte also beispielsweise als String (VT_Bstr) angefordert werden. Nun wird der Server jedes mal wenn er die Variable an den Client sendet dessen Wert konvertieren und als String liefern. Umgekehrt muss der Client beim Schreiben den Wert als String angeben. Viele Clients, die Daten in der Oberfläche in z.B. "TextBox" anzeigen, machen das so, denn dann kann der Wert direkt zugewiesen werden. Das funktioniert rückwärts (beim Schreiben) aber nur dann wenn der String auch in einen VT_UI2 konvertierbar ist. Wenn du also den Wert "klaus" auf die Variable schreibst dann würde es nicht konvertierbar sein. Auch "-12" würden nicht klappen oder "65536".

Ein spezifikationskonformer OPC Server muss alle Konvertierungen entsprechend der Windowsfunktion "VariantChangeType" beherrschen. Wird bei AddItems der Requested Data Type mit VT_Empty (0) angegeben, dann liefert der Server die Variable in ihrem Cannonical Data Type, das ist bei den vielen Clients auch der Default.

Also prüfe zunächst wie die Variable bei AddItems angefordert wird, anschließend prüfe wie die Variable vom Client tatsächlich geschrieben wird. Bei "fertigen" Clients dessen Code man nicht hat, ist das nätürlich schwer. Da bleibt dann nur noch der Trace "Data" des Servers, um zu sehen was wirklich passiert.
So richtig schlau werde ich daraus aber auch nicht. Wie soll ich jetzt meinen Value in welchen Typ konvertieren?! Oo

meikel (†) 14.03.2013 20:24:54

AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut
 
Grundsätzlich unterscheiden sich Deine Versuche schon erheblich von dem, was php.net dazu schreibt:
http://www.php.net/manual/de/class.soapclient.php

Außerdem vermisse ich bei Deinen Versuchen die Authentifizierung. Ich habe keine Ahnung, um welche Maschinen es da geht, bezweifle aber, daß dort jeder Anonymous schreiben darf.

btw: Volker Pispers sagt über den Hersteller: "Muß es funktionieren oder darfs auch was von Siemens sein?"

Datta90 15.03.2013 07:59:19

AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut
 
Zitat:

Zitat von meikel (Beitrag 144620)
Grundsätzlich unterscheiden sich Deine Versuche schon erheblich von dem, was php.net dazu schreibt:
http://www.php.net/manual/de/class.soapclient.php

Da hast du Recht, dürfte aber keine große Rolle spielen. Diverse Funktionen wie "soapCall(funktion,parameter)" lassen sich auch einfach durch "funktion(parameter)" ersetzen. Ich habe unten mal meinen Code zum Lesen gepostet, welcher funktioniert.
Zitat:

Zitat von meikel (Beitrag 144620)
Außerdem vermisse ich bei Deinen Versuchen die Authentifizierung. Ich habe keine Ahnung, um welche Maschinen es da geht, bezweifel aber, daß dort jeder Anonymous schreiben darf.

Es geht um den Simatic net OPC Server, welcher mir Prozessdaten eienr SPS zur Verfügung stellt. Mein Zugriff erfolgt nicht über Internet sondern über ein LAN bzw. sogar lokal. Der von Simatic net mitgelieferte OPC Client (OPC Scout) sagt mir auch das die ITEMAccessRights der jeweiligen Items auf 'RW' (Read and Write) gestellt sind. Von der Seite dürfte es also auch keine Probleme geben.

Wie geschrieben - ich vermute stark das ich den Value nur im richtigen Format übergeben muss, wie ich das mache weiß ich nur nicht. Der OPC Scout sagt übrigens das mein Item 'MINT12..' den Canonical Data Type 'short' besitzt.

Hier mal mein Read-Code:
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"=>"",
         //"ReturnItemTime"=>"",
         //"ReturnItemPath"=>,
         //"ReturnItemName"=>"",
         //"ClientRequestHandle"=>"teeeeeest",
         //"LocaleID"=>""
);
$werte["ItemList"]=array(
         
"Items"=>array(//"ItemPath"=>"",
                        //"ReqType"=>"",
                        
"ItemName"=>"S7:[OPC_1]MINT12",
                        
//"ClientItemHandle"=>"",
                       //"MaxAge"=>""
                        
),
        
// "ItemPath"=>"",
        // "ReqType"=>"",
        // "MaxAge"=>""
 
);


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


print_r ($result);                             //Alles ausgeben

?>

Ich hoffe ihr habt noch Ideen. Danke.

meikel (†) 20.03.2013 10:28:49

AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut
 
Zitat:

Zitat von Datta90 (Beitrag 144621)
Ich hoffe ihr habt noch Ideen. Danke.

Die Ideen werden sich in Grenzen halten. Ich kenne noch nicht mal ansatzweise das Simens-Monster. Frag doch mal den Hersteller...

sommer 03.11.2013 12:11:44

AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut
 
Hallo
Ich habe das selbe Problem.

<Items ItemName="[P1N_IP]WebOPCHmiTestVars" >
<Value xsi:type="xsd:int">150</Value>
</Items>

Kann als Array schlecht dargestellt werden.
Hast du schon eine Lösung ?


Erfolglos --> Mann muss den "xsi:type"=>"xsd:int" irgendwie verpacken.
PHP-Code:

  /**
     * @param $item
     * @param $value
     * @return mixed
     */
    
public function WriteItem($item,$value){
        
$soapReg[] = array(
            
"ReturnValuesOnReply" => "true",
            
"Options" => $this->_soapWriteOptions,
            
"ItemList" => array(
                
"RegType" => "string",
                
"Items" => array(
                    
"ItemName" => $item,
                    
"Value" => array(
                        
"xsi:type"=>"xsd:int",
                        
"Value" => $value
                        
                    
)
                )
            )
        ); 


sommer 03.11.2013 14:01:25

AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut
 
Hallo
So jetzt hab ich's

Request XML
HTML-Code:

<ItemList ReqType="string">
  <Items
      ItemName="[P1_IP]WebOPCHmiTestVars">

    <Value xsi:type="xsd:int">12</Value>
  </Items>
 </ItemList>


Der XML Request von Value wird über SoapVar erzeugt.


PHP-Code:


    
public function Write(){
        
$soapReg[] = array(
            
"ReturnValuesOnReply" => "true",
            
"Options" => array(
                
"ReturnErrorText"=>"true",
                
"ReturnDiagnosticInfo"=>"true",
                
"ReturnItemTime"=>"true",
                
"ReturnItemPath"=>"true",
                
"ReturnItemName"=>"true",
                
"ClientRequestHandle"=>"XYZ",
                
"LocaleID"=>""
            
),
            
"ItemList" => array(
                
"RegType" => "string",
                
"Items" => array(
                    
"ItemName" => "[P1_IP]WebOPCHmiTestVars",
                    
"Value" => new SoapVar("12345",XSD_INT"int")
                )
            )
        );

        
$client = new SoapClient("http://xx.x.x.x:xxxx/opcxmlda/opcserver?WSDL");
        
$result $client->__soapCall("Write",$soapReg);
     return 
$result;
    } 


DokuLeseHemmung 03.11.2013 15:06:05

AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut
 
Zitat:

PHP-Code:

     $result $client->__soapCall("Write",$soapReg); 


Ist doch das gleiche wie:
PHP-Code:

     $result $client->Write($soapReg); 

Oder?

sommer 04.11.2013 10:39:26

AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut
 
Hallo

Gibt es Verbesserungspotential im angeführten Code ?

Das Problem mit OPC XML DA Servern und PHP ist es die Value Eigenschaft zu verpacken.

Vorgabe
HTML-Code:

<Value xsi:type="xsd:int">12</Value>
Lösung
PHP-Code:

"Value" => new SoapVar(12,XSD_INT"int"



Alle Zeitangaben in WEZ +2. Es ist jetzt 19:16:51 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.