今回の記事ではBeckhoff TF6421を利用しXML Fileを読み込み、結果をPLC 変数に転送します。さ、はじめよう!
Reference Video
Beckhoff.TF6421でXML Dataを読んでみよう
TF6421?
TwinCAT XML Server TF6421は、XMLファイルへの書き込みや読み取りの簡易なPLCライブラリを提供します。XML Serverを使用することにより、例えばマシンの起動時によく必要とされる初期化データのロードのような実装も可能になります。
またPLC 変数を、PLC コメントを含む XML ファイルにフォーマットして保存することもできます。XML 文書の変数構造は、PLC 変数の構造と一致します。
System Requirment
Structure
こちらはTF6421 XML Serverの構造です。
TwinCAT XML Server
TwinCAT XML ServerはTwinCATと共に起動/停止するサービスであり、TwinCATとXMLファイル間のリンクです。
PLC Library
PLCライブラリ PLCライブラリには4つのFunction Blockがあり、PLCライブラリからXMLファイルにデータを書き込んだり、XMLファイルから読み込んだりできます。変数をXMLファイルにフォーマットして保存し、XMLファイルからTwinCATで変数を初期化できます。
XML File
こちらはTwinCAT Runtimeに格納されたXML Fileになります。
Principle of operation
XMLサーバは、ADSを介してTwinCAT PLCと通信します。XML サーバが書き込むすべての変数はテキストに変換され、MSXML DOMパーサを介してXMLファイルに書き込まれます。XMLファイルにはデータ型に関する情報は一切含まれず、タグ名としての変数名と値のみが記述されます。
<variable name> value </variable name> |
逆に読み取り操作の間、読み取られる変数のデータ型はADSを介してXML Serverに転送され、XMLファイルからのテキストはそれに応じて変換される。
Data Type
こちらはTwinCAT PLC Runtimeの変数とXML Fileの対応例になります。
Function Block
FB_XmlSrvRead
こちらのFunction Block FB_XmlSrvRead を使用して、XML ファイルからのデータで PLC 変数を初期化できます。この場合は入力変数sXPathは、sFilePathで指定されたXMLファイルの有効なノードを指す必要があります。
VAR_INPUT
Variable | Data Type | Description |
sNetId | T_AmsNet_Id | TwinCAT 3 XMLサーバのネットワークアドレスであり、Local PCでは、空の文字列を指定してください。 |
ePath | E_OpenPath | ファイルを開くターゲットデバイス上のTwinCATシステムパスを指定する |
nMode | WORD | XMLファイルの評価方法を制御することができ、現在サポートするのはXMLSRV_SKIPMISSINGとXmlSrvReadのみになります。 |
pSymAddr | DWORD | XML ファイルからのデータを書き込む PLC 変数のアドレスOffset。 |
cbSymSize | UDINT | XML ファイルからのデータを書き込む PLC 変数のサイズ。 |
sFilePath | T_MaxString | FBが開くファイルのパスとファイル名を指定します。注意するのはパスはローカルコンピュータのファイルシステムのみで、ネットワークではパスは使用できません。 |
sXPath | T_MaxString | データアクセスする XML ドキュメント内のタグのアドレスになります。 |
bExecute | BOOL | 立ち上げ信号でFBを実行する |
tTimeout | TIME | FBの最大実行時間 |
VAR_OUTPUT
Variable | Data Type | Description |
bBusy | BOOL | True=FB実行中 |
bError | BOOL | True=FBエラーあり |
nErrId | UDINT | TC3 XML Serverから返答したエラーコード |
FB_XmlSrvReadByName
こちらのFB_XmlSrvReadByName を使用して、XML ファイルからのデータで PLC 変数を初期化できます。この場合は入力変数sXPathは、sFilePathで指定されたXMLファイルの有効なノードを指す必要があります。
VAR_INPUT
Variable | Data Type | Description |
sNetId | T_AmsNet_Id | TwinCAT 3 XMLサーバのネットワークアドレスであり、Local PCでは、空の文字列を指定してください。 |
ePath | E_OpenPath | ファイルを開くターゲットデバイス上のTwinCATシステムパスを指定する |
nMode | WORD | XMLファイルの評価方法を制御することができ、現在サポートするのはXMLSRV_SKIPMISSINGとXmlSrvReadのみになります。 |
sSymName | T_MaxString | XML ファイルからのデータを書き込む PLC シンボル名になります。 |
sFilePath | T_MaxString | FBが開くファイルのパスとファイル名を指定します。注意するのはパスはローカルコンピュータのファイルシステムのみで、ネットワークではパスは使用できません。 |
sXPath | T_MaxString | データアクセスする XML ドキュメント内のタグのアドレスになります。 |
bExecute | BOOL | 立ち上げ信号でFBを実行する |
tTimeout | TIME | FBの最大実行時間 |
VAR_OUTPUT
Variable | Data Type | Description |
bBusy | BOOL | True=FB実行中 |
bError | BOOL | True=FBエラーあり |
nErrId | UDINT | TC3 XML Serverから返答したエラーコード |
Installation
BeckhoffのHPからTF6421のXML ServerインストールFileをDownloadしてください。
TF6421のインストーラーを起動し、英語を選び>Okで進みます。
Next>ですすみます。
ライセンスに同意し、Next>で進みます。
個人情報を入力し、Next>で進みます。
Completeを選び、Next>で進みます。
Next>で進みます。
Installをスタートしましょう。
しばらく待ちます…
Done!
Implementation
これからTwinCAT3からTF6421のAPIを利用し、XML Fileのデータを読み取ります。
Add Library
Tc2_XMLDataSrvのライブラリをプロジェクトに追加してください。
DUT
次はXML Fileの構造に合わせて構造体を作成します。
DUT_MyXML
TYPE DUT_MyXML : STRUCT COMMON:STRING(30); BOTANICAL:STRING(30); ZONE:INT; LIGHT:STRING(30); PRICE:REAL; AVAILABILITY:BOOL; END_STRUCT END_TYPE |
DUT_MyXML_Books
TYPE DUT_MyXML_Books : STRUCT title:STRING(30); author:STRING(30); year:DINT; price:REAL; END_STRUCT END_TYPE |
DUT_MyXML とDUT_MyXML_Books は実際XML Fileとデータ・タイプと順番さえ合わせれば、変数名は特に気にする必要がありません。
Program
VAR
こちらはプログラムで使用する変数を定義します。
PROGRAM MAIN VAR fbXMLSrvRead:FB_XmlSrvRead; fbXmlSrvReadByName:FB_XmlSrvReadByName; bExecute:BOOL; bReset :BOOL; sFilePath:T_MaxString:=’C:\Users\threespc02\OneDrive\Desktop\plant_catalog-1.xml’; sXMLPath:T_MaxString:=’/CATALOG/PLANT’; sXMLPath2:T_MaxString:=’/CATALOG/book’; iState:INT:=0; myXMLValue:DUT_MyXML; myXMLValueReadByName:DUT_MyXML_Books; ErrorCode:UDINT; END_VAR |
こちらは今回記事で使用するXML Fileで、sFilePathなどの変数を該当する設定になります。
Code
こちらのプログラムはXML Fileを読み込んで、中のデータをfbXmlSrvReadByNameとfbXMLSrvRead Function Blockを使用しX読み取ります。
CASE iState OF 0: fbXMLSrvRead( pSymAddr:=ADR(myXMLValue) ,cbSymSize:=SIZEOF(myXMLValue) ,sFilePath:=sFilePath ,sXPath:=sXMLPath ,bExecute:=FALSE ); fbXmlSrvReadByName( sSymName:=’MAIN.myXMLValueReadByName’ ,sFilePath:=sFilePath ,sXPath:=sXMLPath2 ,bExecute:=FALSE ); ErrorCode:=0; IF NOT fbXMLSrvRead.bBusy AND NOT fbXMLSrvRead.bError AND NOT fbXmlSrvReadByName.bBusy AND NOT fbXmlSrvReadByName.bError AND bExecute THEN iState:=10; END_IF 10: fbXMLSrvRead( bExecute:=TRUE ); IF fbXMLSrvRead.bBusy AND NOT fbXMLSrvRead.bError THEN iState:=20; END_IF; IF fbXMLSrvRead.bError THEN iState:=900; END_IF 20: fbXMLSrvRead( bExecute:=FALSE ); IF NOT fbXMLSrvRead.bBusy THEN iState:=100; END_IF ; 100: fbXmlSrvReadByName( bExecute:=TRUE ); IF fbXmlSrvReadByName.bBusy AND NOT fbXmlSrvReadByName.bError THEN iState:=110; END_IF; IF fbXmlSrvReadByName.bError THEN iState:=910; END_IF 110: fbXmlSrvReadByName(bExecute:=FALSE); IF NOT fbXmlSrvReadByName.bBusy THEN iState:=120; END_IF 120: bExecute:=FALSE; iState:=0; 900: ErrorCode:=fbXMLSrvRead.nErrId; bExecute:=FALSE; IF bReset THEN iState:=0; END_IF 910: ErrorCode:=fbXmlSrvReadByName.nErrId; bExecute:=FALSE; IF bReset THEN iState:=0; END_IF ; END_CASE |
Error 1828
もしエラー1828が発生した場合、ライセンスを入力する必要があります。
SYSTEM>Licenseを開きます。
こちらはTwinCAT3のライセンス管理画面です。
TF6421をCheck入れます。
TF6421のライセンスがいまMissingの状態になり、もう1回Hardware ConfigurationをDownloadしてください。
Result
Done!XML Fileのデータを読み込みました。
Download
こちらのリンクから記事のプロジェクトをDownloadできます。
https://github.com/soup01Threes/TwinCAT3/blob/main/Project_TF6421_XML_ReadExample.rar