XML Datenbanktyp - XPath Beispiel für TwinCAT PLC Visualisierung

Mit Hilfe des Funktionsbausteins FB_DBRecordSelect können XPath Kommandos abgesetzt werden und XML-Tags aus einer beliebigen XML Datei gelesen werden. In diesem Beispiel wird demonstriert, wie man mit Hilfe des TwinCAT Database Servers, Einträge aus den dynamischen Textlisten (XML-Datei) für die TwinCAT PLC Visualisierung lesen kann.

 

Download "Beispiel mit XPath und TargetVisu" sample10.zip

XML Datenbanktyp - XPath Beispiel für TwinCAT PLC Visualisierung 1:

Verwendeter Datenbanktyp

XML

Kompatible Datenbanktypen

XML

Verwendete Funktionsbausteine

FB_DBRecordSelect

Einzubindende Bibliotheken

"TcDatabase.lib", "TcSystem.lib", "TcBase.lib", "STANDARD.lib",  "TcUtilities.lib"

Download Dateiliste

XPath_GetText.pro, CurrentConfigDatabase.xml, VisuTest.xml

Dynamische Textliste für TwinCAT PLC Visualisierung

<?xml version="1.0" encoding="ISO-8859-1"?>
<dynamic-text>
  <header>
   <default-language>deutsch</default-language>
    <default-font>
      <language>deutsch</language>
      <font-name>Arial </font-name>
      <font-color>0,0,0</font-color>
      <font-height>-13</font-height>
      <font-weight>700</font-weight>
      <font-italic>false</font-italic>
      <font-underline>false</font-underline>
     <font-strike-out>false</font-strike-out>
      <font-char-set>0</font-char-set>
    </default-font>
    <default-font>
      <language>english</language>
      <font-name>Arial </font-name>
      <font-color>0,0,0</font-color>
     <font-height>-13</font-height>
      <font-weight>700</font-weight>
      <font-italic>false</font-italic>
      <font-underline>false</font-underline>
     <font-strike-out>false</font-strike-out>
      <font-char-set>0</font-char-set>
    </default-font>
     <default-font>
      <language>francais</language>
      <font-name>Arial </font-name>
      <font-color>0,0,0</font-color>
     <font-height>-13</font-height>
      <font-weight>700</font-weight>
      <font-italic>false</font-italic>
      <font-underline>false</font-underline>
     <font-strike-out>false</font-strike-out>
      <font-char-set>0</font-char-set>
    </default-font>
  </header>
  <text-list>
   <text prefix="A" id="1">
      <deutsch>Datei öffnen...</deutsch>
     <english>File open...</english>
      <francais>Fichier ouvrir...</francais>
    </text>
    <text prefix="B" id="2">
     <deutsch>Datei schließen</deutsch>
      <english>File close...</english>
     <francais>Fermer le fichier...</francais>
    </text>
    <text prefix="C" id="3">
     <deutsch>Deutschland</deutsch>
      <english>England</english>
     <francais>France</francais>
    </text>
  </text-list>
</dynamic-text>

Functionsbaustein "FB_GetText" (zum auslesen der XML-Tags)

FUNCTION_BLOCK FB_GetText
VAR_INPUT
    dwID: DWORD;
    stPrefix: T_MaxString;
    stLanguage : T_MaxString;
    bExecute : BOOL;
END_VAR
VAR_OUTPUT
    bBusy : BOOL;
    bError : BOOL;
    nResultLength : INT;
    stResult : STRING(256);
END_VAR
VAR
    R_TRIG1: R_TRIG;
    state: BYTE;
    FB_DBRecordSelect1: FB_DBRecordSelect;
    FB_FormatString1: FB_FormatString;
END_VAR
R_TRIG1(CLK:=bExecute);
IF R_TRIG1.Q THEN
    state := 1;
    bBusy := TRUE;
    bError := FALSE;
    FB_DBRecordSelect1(bExecute:=FALSE);
END_IF
CASE
state OF
    0:
        ;
    1:
        FB_FormatString1(
            sFormat:= 'XPATH<TAG>#/dynamic-text/text-list/text[@prefix=$'%s$' and @id=%d]/%s',
            arg1:= F_STRING(stPrefix),
            arg2:= F_DWORD(dwID),
            arg3:= F_STRING(stLanguage),
            sOut=> FB_DBRecordSelect1.sSelectCmd);

        FB_DBRecordSelect1(
            sNetID:= ,
            hDBID:= 1,
            nRecordIndex:= 0,
            cbRecordSize:= SIZEOF(stResult),
            pDestAddr:= ADR(stResult),
            bExecute:= TRUE,
            tTimeout:= T#10s);

        IF NOT FB_DBRecordSelect1.bBusy THEN
            IF NOT FB_DBRecordSelect1.bError THEN
                nResultLength := LEN(stResult);
            ELSE
                bError := TRUE;
            END_IF
            bBusy := FALSE;
            state := 0;
        END_IF
END_CASE

MAIN Programm

PROGRAM MAIN
VAR
    FB_GetText1: FB_GetText;
    startstop: BOOL;
    busy: BOOL;
    err: BOOL;
    resultLen: INT;
    result: STRING(256);
END_VAR
FB_GetText1(
    dwID:= 1,
    stPrefix:= 'A',
    stLanguage:= 'deutsch',
    bExecute:= startstop,
    bBusy=> busy,
    bError=> err,
    nResultLength=> resultLen,
    stResult=> result); 

Mit einer Positiven Flanke am Eingang bExecute des Funktionsbaustein FB_GetText wird das XPath Kommando abgesetzt. Der ausgelesene Text wird im Ausgang stResult zurückgeliefert. Zusätzlich wird die Länge des Textes am Ausgang nResultLength angegeben.