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