XML - Informationen
1. XML-Datei verwenden als Datenbank mit dem TwinCAT 3 Database Server
2. XPath Querries auf eine XML-Datei anwenden mit dem TwinCAT 3 Database Server
Nähere Informationen zu XML-Schemas finden Sie hier: http://www.edition-w3.de/TR/2001/REC-xmlschema-0-20010502/
1. XML als Datenbank
XSD-Schema für Standard-Tabellenstruktur:
<?xmlversion="1.0"?>
<xsd:schemaxmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleTypename="bigint">
<xsd:restrictionbase="xsd:long" />
</xsd:simpleType>
<xsd:simpleTypename="datetime">
<xsd:restrictionbase="xsd:dateTime" />
</xsd:simpleType>
<xsd:simpleTypename="ntext_80">
<xsd:restrictionbase="xsd:string">
<xsd:maxLengthvalue="80" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleTypename="float">
<xsd:restrictionbase="xsd:double" />
</xsd:simpleType>
<xsd:complexTypename="myTable_Double_Type">
<xsd:sequence>
<xsd:elementminOccurs="0"maxOccurs="unbounded"name="row">
<xsd:complexType>
<xsd:attributename="ID"type="bigint" />
<xsd:attributename="Timestamp"type="datetime" />
<xsd:attributename="Name"type="ntext_80" />
<xsd:attributename="Value" type="float" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:elementname="TestDB_XML">
<xsd:complexType>
<xsd:sequenceminOccurs="1"maxOccurs="1">
<xsd:elementname="myTable_Double"type="myTable_Double_Type" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XML-Datei für Standard-Tabellenstruktur (Beispiel):
<?xmlversion="1.0"encoding="UTF-8"?>
<TestDB_XMLxmlns:xs="http://www.w3.org/2001/XMLSchema-
nstance"xs:noNamespaceSchemaLocation="TestDB_XML.xsd">
<myTable_Double>
<rowID="1"Timestamp="2012-03-08T12:45:08"Name="TestValue1"Value="222.222" />
<rowID="2"Timestamp="2012-03-08T12:45:14"Name="TestValue1"Value="222.222" />
<rowID="3"Timestamp="2012-03-08T12:45:18"Name="TestValue1"Value="222.222" />
<rowID="4"Timestamp="2012-03-08T12:45:22"Name="TestValue1"Value="222.222" />
<rowID="5"Timestamp="2012-03-08T12:45:23"Name="TestValue1"Value="222.222" />
</myTable_Double>
</TestDB_XML>
Datatypes für XML-Tabellen:
<xsd:simpleTypename="bigint">
<xsd:restrictionbase="xsd:long" />
</xsd:simpleType>
<xsd:simpleTypename="datetime">
<xsd:restrictionbase="xsd:dateTime" />
</xsd:simpleType>
<xsd:simpleTypename="ntext_80"> //Länge kann individuell angegeben werden
<xsd:restrictionbase="xsd:string">
<xsd:maxLengthvalue="80" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleTypename="float">
<xsd:restrictionbase="xsd:double" />
</xsd:simpleType>
<xsd:simpleTypename="binary_1"> //Länge kann individuell angegeben werden
<xsd:restrictionbase="xsd:hexBinary">
<xsd:maxLengthvalue="1" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleTypename="bit">
<xsd:restrictionbase="xsd:boolean" />
</xsd:simpleType>
<xsd:simpleTypename="image_1"> //Länge kann individuell angegeben werden
<xsd:restrictionbase="xsd:hexBinary">
<xsd:maxLengthvalue="1" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleTypename="integer">
<xsd:restrictionbase="xsd:int" />
</xsd:simpleType>
<xsd:simpleTypename="money">
<xsd:restrictionbase="xsd:double" />
</xsd:simpleType>
<xsd:simpleTypename="nchar_50"> //Länge kann individuell angegeben werden
<xsd:restrictionbase="xsd:string">
<xsd:maxLengthvalue="50" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleTypename="nvarchar_50"> //Länge kann individuell angegeben
werden
<xsd:restrictionbase="xsd:string">
<xsd:maxLengthvalue="50" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleTypename="real">
<xsd:restrictionbase="xsd:double" />
</xsd:simpleType>
<xsd:simpleTypename="smallint">
<xsd:restrictionbase="xsd:short" />
</xsd:simpleType>
<xsd:simpleTypename="tinyint">
<xsd:restrictionbase="xsd:byte" />
</xsd:simpleType>
<xsd:simpleTypename="varbinary_1"> //Länge kann individuell angegeben werden
<xsd:restrictionbase="xsd:hexBinary">
<xsd:maxLengthvalue="1" />
</xsd:restriction>
</xsd:simpleType>
Datentyp-Mapping zwischen DB und SPS
E_ColumnTypes | XML | TwinCAT PLC |
---|---|---|
BigInt | bigint | T_ULARGE_INTEGER (TcUtilities.lib) |
Integer | integer | DINT |
SmallInt | smallint | INT |
TinyInt | tinyint | BYTE |
Bit_ | bit | BOOL |
Money | money | LREAL |
Float | float | LREAL |
Real_ | real | LREAL |
DateTime | datetime | DT |
NText | ntext | STRING |
NChar | nchar | STRING |
Image | image | ARRAY OF BYTE |
NVarChar | nvarchar | STRING |
Binary | binary | ARRAY OF BYTE |
VarBinary | varbinary | ARRAY OF BYTE |
Erzeugen/Auslesen von Datensätzen in/aus der XML-Datei
Zum Erzeugen von Datensätzen können Standard-SQL-Befehle verwendet werden. Die SQL‑INSERT‑Befehle werden vom TwinCAT Database Server interpretiert und auf die XML-Datei in Form von XML‑Nodes umgesetzt. Die SQL-SELECT-Befehle werden vom TwinCAT Database Server in Form von XPath Queries auf die XML-Datei umgesetzt.
Beispiele für unterstützte INSERT-Befehle:
- INSERT INTO myTable_Double (ID, Timestamp, Name, Value) VALUES(1, CURRENT_TIMESTAMP, 'TestValue1' , 1234.5678)
- INSERT INTO myTable_Double (Timestamp, Name) VALUES(CURRENT_TIMESTAMP, 'TestValue1');
- INSERT INTO myTable_Double VALUES(1, CURRENT_TIMESTAMP, 'TestValue1', 1234.5678);
- INSERT INTO myTable_Double VALUES(1, '2010-01-06 12:13:14', 'TestValue1', 1234.5678);
Beispiele für unterstützte SELECT-Befehle:
- SELECTID, Timestamp, Name, Value FROM myTable_Double;
- SELECT* FROM myTable_Double;
- SELECTTimestamp, Name FROM myTable_Double
- SELECT* FROM myTable_Double WHERE Name = 'TestValue1';
- SELECT* FROM myTable_Double WHERE ID > 1;
Unterstützte Funktionsbausteine:
- FB_DBCreate
- FB_DBCyclicRdWrt
- FB_DBRead
- FB_DBRecordArraySelect
- FB_DBRecordDelete
- FB_DBRecordInsert
- FB_DBRecordInsert_EX
- FB_DBRecordSelect
- FB_DBRecordSelect_EX
- FB_DBTableCreate
- FB_DBWrite
2. XML-Standard-XPath-Funktion
XPath-Typen
Die Syntax der Präfixe der XPaths im TwinCAT Database Server ist folgende: XPATH_[Type]<[Position]>#[Path]
Es gibt 4 verschiedene Typen des XPath:
- SEL
- Liest Daten aus der XML und liefert sie an die SPS zurück
- ADD
- Fügt die übergebenen Daten der XML an der gewählten Position an.
- UPD
- Ersetzt die vorhandene Information der XML an der gewählten Position mit den neuen Daten.
- DEL
- Löscht die Daten in der XML an der gewählten Position.
Für die Positionen stehen 3 verschiedene Angaben zur Verfügung:
- ATTR
- Betrifft alle Attributwerte vom ausgewählten XML-Tag.
- TAG
- Betrifft den InnerText-Wert des ausgewählten XML-Tag.
- SUBTAG
- Betrifft die InnerText-Werte aller SubTags des ausgewählten XML-Tag.
- Ist ein XML-Schema vorhanden, werden die Attribute in die richtigen Datentypen konvertiert.
Ist kein XML-Schema vorhanden, werden die Attribute als T_MaxString zurückgeliefert.
Beispiele:
XML-Datei:
<?xmlversion="1.0"encoding="utf-8" ?>
<TestXML>
<Nodeattr1="1"attr2="Node1">
<SubNode1>SubNodeWert1</SubNode1>
<SubNode2>200</SubNode2>
<SubNode3>SubNodeWert3</SubNode3>
<SubNode4>400.5</SubNode4>
<SubNode5>SubNodeWert5</SubNode5>
</Node>
<Nodeattr1="2"attr2="Node2">
<SubNode1>SubNodeWert1</SubNode1>
<SubNode2>200</SubNode2>
<SubNode3>SubNodeWert3</SubNode3>
<SubNode4>400.5</SubNode4>
<SubNode5>SubNodeWert5</SubNode5>
</Node>
</TestXML>
XML-Schema:
<?xmlversion="1.0"encoding="utf-8"?>
<xs:schemaattributeFormDefault="unqualified"elementFormDefault="qualified"xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:elementname="TestXML">
<xs:complexType>
<xs:sequence>
<xs:elementmaxOccurs="unbounded"name="Node">
<xs:complexType>
<xs:sequence>
<xs:elementname="SubNode1"type="xs:string" />
<xs:elementname="SubNode2"type="xs:short" />
<xs:elementname="SubNode3"type="xs:string" />
<xs:elementname="SubNode4"type="xs:double" />
<xs:elementname="SubNode5"type="xs:string" />
</xs:sequence>
<xs:attributename="attr1" type="xs:integer"use="required" />
<xs:attributename="attr2" type="xs:string"use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Beispiel für XPATH<ATTR>
XPath => XPATH_SEL<ATTR>#TestXML/Node[@attr1=2]
Zurückgelieferte Struktur, wenn kein Schema vorhanden ist:
TYPEST_Record :
STRUCT
attr1 : T_MaxString := '2';
attr2 : T_MaxString := 'Node2';
END_STRUCT
END_TYPE
Zurückgelieferte Struktur, wenn ein Schema vorhanden ist:
TYPEST_Record :
STRUCT
attr1 : DINT := 2;
attr2 : T_MaxString := 'Node2';
END_STRUCT
END_TYPE
Beispiel für XPATH<TAG>
XPath => XPATH_SEL<TAG>#TestXML/Node[@attr1=2]/SubNode2
Zurückgelieferter Wert, wenn kein Schema vorhanden ist: SubNode2 : T_MaxString := '200';
Zurückgelieferter Wert, wenn ein Schema vorhanden ist: SubNode2 : INT := 200;
Beispiel für XPATH<SUBTAG>
XPath => XPATH_SEL<SUBTAG>#TestXML/Node[@attr1=2]
Zurückgelieferte Struktur, wenn kein Schema vorhanden ist:
TYPEST_Record :
STRUCT
SubNode1 : T_MaxString := 'SubNodeWert1';
SubNode2 : T_MaxString := '200';
SubNode3 : T_MaxString := 'SubNodeWert3';
SubNode4 : T_MaxString := '400.5';
SubNode5 : T_MaxString := 'SubNodeWert5';
END_STRUCT
END_TYPE
Zurückgelieferte Struktur, wenn ein Schema vorhanden ist:
TYPEST_Record :
STRUCT
SubNode1 : T_MaxString := 'SubNodeWert1';
SubNode2 : INT := 200;
SubNode3 : T_MaxString := 'SubNodeWert3';
SubNode4 : LREAL := 400.5;
SubNode5 : T_MaxString := 'SubNodeWert5';
END_STRUCT
END_TYPE
Besonderheit unter der Verwendung des FB_PLCDBCmd:
Anders als bei der üblichen Implementierung der FB_PLCDBCmd werden über die eingestellten Parameter (ST_ExpParameter) nicht die Platzhalter für die jeweilige Anweisung angegeben, sondern das Schema der übergebenen oder zurückgelieferten Daten.
Unterstützte Funktionsbausteine
- FB_DBRecordSelect
- FB_DBRecordSelect_EX
- FB_DBRecordArraySelect