Die Funktionsbausteine
Die folgenden Beispiele zeigen den Umgang mit den Funktionsbausteinen der Tc2_XmlDataSrv-Bibliothek. Das SPS-Projekt, das die Beispiele enthält, können Sie hier herunterladen: TC3_XmlSrv_Samples.zip
Alle Beispiele arbeiten mit der Struktur ST_MYSTRUCT, die wiederum die Struktur ST_INNTERSTRUCT enthält. Die beiden Strukturen sind im Folgenden dargestellt:
Die Strukturen
TYPE ST_MYSTRUCT:
STRUCT
fReal : REAL;
bBool : ARRAY [0..2] OF BOOL;
stInner : ST_INNTERSTRUCT;
END_STRUCT
END_TYPE
TYPE ST_INNTERSTRUCT:
STRUCT
nInteger : INT;
sString : STRING;
END_STRUCT
END_TYPE
Sample 1: Schreibvorgang mit FB_XmlSrvWrite
Im ersten Schritt soll die Struktur ST_MyStruct in eine XML-Datei geschrieben werden. Der Modus wird auf XMLSRV_ADMISSING gesetzt, sodass die XML-Datei automatisch erstellt und die Struktur darin angelegt wird. Ordner werden nicht automatisch angelegt! Dieses Vorgehen empfiehlt sich bei größeren Strukturen auch dann, wenn die Datei später nur ausgelesen werden soll. So muss die XML-Datei nicht manuell angelegt werden, Fehler werden vermieden.
(* Sample1 creates an XML-file under the path C:\Test.xml and writes value1 to it.
FUNCTIONBLOCK: FB_XmlSrvWrite *)
PROGRAM Sample1
VAR
value1 : ST_MyStruct;
fbXmlSrvWrite : FB_XmlSrvWrite;
bExecute : BOOL;
sFilePath : T_MaxString := 'C:\Test.xml'; (* CE: '\Hard Disk\Test.xml' *)
sXPath : T_MaxString := '/dataentry/MAIN.value1';
END_VAR
fbXmlSrvWrite(
nMode := XMLSRV_ADDMISSING,
pSymAddr := ADR(value1),
cbSymSize := SIZEOF(value1),
sFilePath := sFilePath,
sXPath := sXPath,
bExecute := bExecute
);
bExecute:= TRUE;
Sample 2: Schreibvorgang mit FB_XmlSrvWriteByName
Sample 2 führt zum gleichen Ergebnis wie Sample 1, verwendet aber den FB_XmlSrvWriteByName-Baustein. Sample 1 ist jedoch performanter.
(* Sample2 creates an XML-file under the path C:\Test.xml and writes value1 to it.
FUNCTIONBLOCK: FB_XmlSrvWriteByName *)
PROGRAM Sample2
VAR
value1 : ST_MyStruct;
fbXmlSrvWrite : FB_XmlSrvWriteByName;
bExecute : BOOL;
sSymName : T_MaxString := 'Sample2.value1';
sFilePath : T_MaxString := 'C:\Test.xml'; (* CE: '\Hard Disk\Test.xml' *)
sXPath : T_MaxString := '/dataentry/MAIN.value1';
END_VAR
fbXmlSrvWrite(
nMode := XMLSRV_ADDMISSING,
sSymName := sSymName,
sFilePath := sFilePath,
sXPath := sXPath,
bExecute := bExecute
);
bExecute:= TRUE;
XML-Datei
Bei beiden Beispielen wird die folgende XML-Datei 'Test.xml' unter C:\ erstellt. Damit die XML-Datei bei beiden Varianten den gleichen Inhalt enthält, wird als sXPath der gleiche Pfad '/dataentry/MAIN.value1' gewählt, obwohl value1 nicht in der Main, sondern direkt in den entsprechenden Programmen liegt. sSymName (Sample 2) gibt hingegen den Ort der Variablen in TwinCAT an: 'Sample2.value1'!
<dataentry>
<MAIN.value1>
<fReal>0</fReal>
<bBool index="0">false</bBool>
<bBool index="1">false</bBool>
<bBool index="2">false</bBool>
<stInner>
<nInteger>0</nInteger>
<sString></sString>
</stInner>
</MAIN.value1>
</dataentry>
Sample 3: Lesevorgang mit FB_XmlSrvRead
Im Folgenden soll die Struktur aus der in Sample 1 bzw. Sample 2 erstellten XML-Datei wieder eingelesen werden. Sample 3 nutzt hierzu den FB_XmlSrvRead-Baustein.
(* Sample3 reads an XML-file (C:\Test.xml)
FUNCTIONBLOCK: FB_XmlSrvRead *)
PROGRAM Sample3
VAR
value1 : ST_MyStruct;
fbXmlSrvRead : FB_XmlSrvRead;
bExecute : BOOL;
sFilePath : T_MaxString := 'C:\Test.xml'; (* CE: '\Hard Disk\Test.xml' *)
sXPath : T_MaxString := '/dataentry/MAIN.value1';
END_VAR
fbXmlSrvRead(
pSymAddr := ADR(value1),
cbSymSize := SIZEOF(value1),
sFilePath := sFilePath,
sXPath := sXPath,
bExecute := bExecute
);
bExecute:= TRUE;
Sample 4: Lesevorgang mit FB_XmlSrvReadByName
Sample 4 zeigt den Lesevorgang unter Verwendung des FB_XmlSrvReadByName-Bausteins.
(* Sample4 reads an XML-file (C:\Test.xml)
FUNCTIONBLOCK: FB_XmlSrvReadByName *)
PROGRAM Sample4
VAR
value1 : ST_MyStruct;
fbXmlSrvRead : FB_XmlSrvReadByName;
bExecute : BOOL;
sSymName : T_MaxString := 'Sample4.value1';
sFilePath : T_MaxString := 'C:\Test.xml'; (* CE: '\Hard Disk\Test.xml' *)
sXPath : T_MaxString := '/dataentry/MAIN.value1';
END_VAR
fbXmlSrvRead(
sSymName := sSymName,
sFilePath := sFilePath,
sXPath := sXPath,
bExecute := bExecute
);
bExecute:= TRUE;
Bei Sample 4 ist erneut (wie bei Sample 2) zu beachten, dass sich sSymName und sXPath unterscheiden: sXPath gibt den Pfad innerhalb der XML-Datei an. Dieser wurde in Sample 1 bzw. Sample 2 festgelegt. sSymName hingegen gibt den Symbolnamen der TwinCAT-Variablen an und lautet deshalb 'Sample4.value1'.
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken |
---|---|---|
TwinCAT v3.1 Build 4011 | PC oder CX (x86, x64, ARM) | Tc2_XmlDataSrv |