SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Das Zend Framework

Das Zend Framework zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP für Fortgeschrittene und Experten

PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 14.03.2013, 14:04:18
Datta90 Datta90 ist offline
Anfänger
 
Registriert seit: Mar 2013
Alter: 33
Beiträge: 11
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.
Mit Zitat antworten
  #2  
Alt 14.03.2013, 15:58:14
Datta90 Datta90 ist offline
Anfänger
 
Registriert seit: Mar 2013
Alter: 33
Beiträge: 11
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
Mit Zitat antworten
  #3  
Alt 14.03.2013, 20:24:54
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
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?"
Mit Zitat antworten
  #4  
Alt 15.03.2013, 07:59:19
Datta90 Datta90 ist offline
Anfänger
 
Registriert seit: Mar 2013
Alter: 33
Beiträge: 11
AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut

Zitat:
Zitat von meikel Beitrag anzeigen
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 anzeigen
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.
Mit Zitat antworten
  #5  
Alt 20.03.2013, 10:28:49
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut

Zitat:
Zitat von Datta90 Beitrag anzeigen
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...
Mit Zitat antworten
  #6  
Alt 03.11.2013, 12:11:44
sommer sommer ist offline
Anfänger
 
Registriert seit: Nov 2013
Alter: 49
Beiträge: 3
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
                        
                    
)
                )
            )
        ); 
Mit Zitat antworten
  #7  
Alt 03.11.2013, 14:01:25
sommer sommer ist offline
Anfänger
 
Registriert seit: Nov 2013
Alter: 49
Beiträge: 3
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;
    } 
Mit Zitat antworten
  #8  
Alt 03.11.2013, 15:06:05
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
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?
Mit Zitat antworten
  #9  
Alt 04.11.2013, 10:39:26
sommer sommer ist offline
Anfänger
 
Registriert seit: Nov 2013
Alter: 49
Beiträge: 3
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"
Mit Zitat antworten
Antwort

Stichworte
fehlermeldung, opc, simatic, type, xml


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Fatal error: Server was unable to process request. ---> Value cannot be null Datta90 PHP Grundlagen 10 13.03.2013 14:51:03
Brauche Hilfe Partygirl MySQLi/PDO/(MySQL) 10 01.03.2011 09:18:11
Download via Speicherbox von extermen Server -wie? SirRobin PHP für Fortgeschrittene und Experten 3 28.01.2006 15:30:48
3 verschiedene SQL-DB-Systeme auf 1 Server Anyt MySQLi/PDO/(MySQL) 2 08.01.2005 10:59:43


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:16:27 Uhr.


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


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt