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
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken |
14.03.2013, 13:04:18
|
Anfänger
|
|
Registriert seit: Mar 2013
Alter: 34
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.
|
14.03.2013, 14:58:14
|
Anfänger
|
|
Registriert seit: Mar 2013
Alter: 34
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
|
14.03.2013, 19:24:54
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 76
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?"
|
15.03.2013, 06:59:19
|
Anfänger
|
|
Registriert seit: Mar 2013
Alter: 34
Beiträge: 11
|
|
AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut
Zitat:
Zitat von meikel
|
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
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.
|
20.03.2013, 09:28:49
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 76
Beiträge: 4.001
|
|
AW: Schreiben auf Simatic.net OPC Server (SOAP XML) polymorphes Attribut
Zitat:
Zitat von Datta90
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...
|
03.11.2013, 11:11:44
|
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
)
)
)
);
|
03.11.2013, 13:01:25
|
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;
}
|
03.11.2013, 14:06:05
|
SELFPHP Experte
|
|
Registriert seit: Jun 2008
Alter: 16
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?
|
04.11.2013, 09:39:26
|
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")
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
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.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 04:58:42 Uhr.
|