Beckhoff TwinCAT PLC ライブラリ Tc3_JsonXml を使用すると、JSON および XML ドキュメントを作成できます。今回の例ではTc3_JsonXml を使用しJSON Objectを作成する例を紹介します。
さ、はじめよう!
SAX (simple API for XML)
SAXはもともとXML文書を扱うために開発されたが、JSONなど他のデータ形式にも使用できます。
DOM (Document Object Model)
DOMはXML文書にアクセスするための仕様ですが、HTMLやJSONなど他のデータ形式にも使用できます。
JSON document
こちらはJSONドキュメントの例です。
{ “VariableNameX”: 0.0, “VariableNameY”: 0.0, “VariableNameZ”: 0.0 } |
Metadata
Tc3_JsonXml ライブラリには、 FB_JsonReadWriteDataType が含まれており、PLC 属性によるメタデータの自動生成が可能です。
{ “Values”: { “VariableNameX”: 0.0, “VariableNameY”: 0.0, “VariableNameZ”: 0.0 }, “MetaData”: { “VariableNameX”: { “Unit”: “A” }, “VariableNameY”: { “Unit”: “V” }, “VariableNameZ”: { “Unit”: “mA” } } } |
Function Block
FB_JsonSaxWriter
このFunction Blockでここで使用される STRING 型の変数は、UTF-8 フォーマットに基づいて、JSON ドキュメントと同様に MQTT 通信でも一般的です。
AddKey
このメソッドは、SAXライターの現在位置に新しいプロパティ・キーを追加します。新しいプロパティの値は通常、その後に設定されます。
例えば、以下のようなMethodを使用します。
- AddBase64
- AddBool
- AddDateTime
- AddDcTime
- AddDint
- AddFileTime
- AddHexBinary
- AddLint
- AddLreal
- AddNull
- AddRawArray
- AddRawObject
- AddReal
- AddString
- AddUdint
- AddUlint.
Syntax
Inputパラメータは文字列で、現在位置に新しいプロパティ・キーを追加します。
METHOD AddKey VAR_IN_OUT CONSTANT key : STRING; END_VAR |
Example
下記の例では現在位置に新しいプロパティ・キー”‘PropertyName'”を追加します。
fbJson.AddKey(‘PropertyName’); |
AddReal
このメソッドは、データ型 REAL の値をプロパティに追加します。注意するのはメソッド AddKey() で事前に作成する必要があります。
Syntax
InputパラメータはREALの変数で、現在位置に新しい値を追加します。
METHOD AddReal VAR_INPUT value : REAL; END_VAR |
Example
下記の例では現在位置に新しいプロパティ・キー”‘PropertyName'”と42.42値を追加します。
fbJson.AddKey(‘PropertyName’); fbJson.AddReal(42.42); |
AddDint
このメソッドは、DINT データ型の値をプロパティに追加します。通常、対応するプロパティは、メソッド AddKey() で事前に作成されています。
Syntax
InputパラメータはDINTの変数で、現在位置に新しい値を追加します。
METHOD AddDint VAR_INPUT value : DINT; END_VAR |
Example
下記の例では現在位置に新しいプロパティ・キー”‘nNumber'”と42値を追加します。
fbJson.AddKey(‘nNumber’); fbJson.AddDint(42); |
StartArray
このメソッドは、新しいJSON配列の開始位置配列記号[ ]を生成し、SAXライターの現在の位置に挿入する。
Syntax
InputパラメータはREALの変数で、現在位置に新しい配列を追加します。
METHOD StartArray : HRESULT |
Example
下記の例では現在位置に新しい配列を追加します。
fbJson.StartArray(); |
AddRawArray
このメソッドは、指定されたプロパティにJSON 配列を値として追加します。また、SAX ライターが対応する有効な位置にあることが必要です。
- AddKey() の直後、
- StartArray() の直後
- ResetDocument() の後
Syntax
METHOD AddRawArray VAR_IN_OUT CONSTANT rawJson : STRING; END_VAR |
Example
下記の例では現在位置に新しいJson配列”’PropertyName’”を追加し、Elementsは1,2,4になります。
fbJson.AddKey(‘PropertyName’); fbJson.AddRawArray(‘1, 2, 4’); |
EndArray
このメソッドは、開始されたJSON配列の最後に”]”を生成し、SAXライターの現在の位置に挿入します。
Syntax
METHOD EndArray : HRESULT Sample call: |
Example
下記はEndArra()の使用例です。
fbJson.EndArray(); |
StartObject
このメソッドは、新しいJSONオブジェクト” { ”を生成し、それをSAXライターの現在の位置に挿入します。
Syntax
METHOD StartObject : HRESULT |
Sample call
下記の例ではStartObject()の使用例です。
fbJson.StartObject(); |
EndObject
このメソッドは、開始されたJSONオブジェクト” } ”を生成しを生成し、SAXライターの現在の位置に挿入します。
Syntax
METHOD EndObject : HRESULT |
Sample call
下記の例でEndObject()の使用例です。
fbJson.EndObject(); |
ResetDocument
このメソッドは、SAXライターで現在作成されているJSONオブジェクトをリセットします。
Syntax
METHOD ResetDocument : HRESULT |
Sample call
下記の例ResetDocument()の使用例です。
fbJson.ResetDocument(); |
GetDocument
このメソッドは、SAX Writerで現在作成されているJSONオブジェクトをデータ型STRING(255)として返答します。
注意するのGetDocument()が返す文字列の最大サイズは255文字です。それ以上の文字列では、このメソッドは NULL 文字列を返すので、CopyDocument() メソッドを使用する必要があります。
Syntax
METHOD GetDocument : STRING(255) VAR_OUTPUT hrErrorCode: HRESULT; END_VAR |
Sample call
下記のGetDocument()の使用例です。
sTargetString := fbJson.GetDocument(); |
Example1
Example1では実数1つだけのJSON Objectを作成します。
Program
VAR fbJson : FB_JsonSaxWriter; jsonDoc ,jsonDoc1 :SJsonValue; bnew:BOOL; Examples:ARRAY[0..99]OF BOOL; sJsonDoc:STRING(2000); r32:REAL; END_VAR IF Examples[1] THEN r32:=r32+0.0002; IF r32 > 10000 THEN r32:=0.0; END_IF fbJson.StartObject(); fbJson.AddKey(‘Sensor1’); fbJson.AddReal(r32); fbJson.EndObject(); sJsonDoc := fbJson.GetDocument(); fbJson.ResetDocument(); END_IF |
Result
Methodが実行し続ければ、JSON Objectが常に更新されています。
sJSONDocという文字列はJSON OBJECTに変換でき、なおかつ更新し続けています。
実際StartObjectなどはこのMethodを使ってこのようにJSON Objectを生成します。
Example2 Array
Example2では実数1つ・実数配列と整数配列のJSON Objectを作成します。
Program
IF Examples[2] THEN r32:=r32+0.0002; IF r32 > 10000 THEN r32:=0.0; END_IF fbJson.StartObject(); fbJson.AddKey(‘Sensor1’); r32:=r32+0.0002; fbJson.AddReal(r32); fbJson.AddKey(‘r32Array’); fbJson.StartArray(); fbJson.AddRawArray(‘123.1,444.5,512.3’); fbJson.EndArray(); fbJson.AddKey(‘iArray’); fbJson.StartArray(); fbJson.AddRawArray(‘123,1,5,6,7,8,9,0,111’); fbJson.EndArray(); fbJson.EndObject(); sJsonDoc := fbJson.GetDocument(); fbJson.ResetDocument(); END_IF |
Result
sJSONDocという文字列はJSON OBJECTに変換でき、なおかつ更新し続けています。
実際StartObjectなどはこのMethodを使ってこのようにJSON Objectを生成します。
Exmaple3 Add Object
Example3では実数1つ・実数配列・整数配列だけではなく、Object1つが含まれているJSON Objectを作成します。
Program
IF Examples[3] THEN r32:=r32+0.0002; IF r32 > 10000 THEN r32:=0.0; END_IF fbJson.StartObject(); fbJson.AddKey(‘Sensor1’); fbJson.AddReal(r32); fbJson.AddKey(‘r32Array’); fbJson.StartArray(); fbJson.AddRawArray(‘123.1,444.5,512.3’); fbJson.EndArray(); fbJson.AddKey(‘iArray’); fbJson.StartArray(); fbJson.AddRawArray(‘123,1,5,6,7,8,9,0,111’); fbJson.EndArray(); fbJson.AddKey(‘MotorData’); fbJson.StartObject(); fbJson.AddKey(‘Speed’); fbJson.AddReal(123.4); fbJson.AddKey(‘Position’); fbJson.AddReal(512.1); fbJson.AddKey(‘ErrorCode’); fbJson.AddDint(1234); fbJson.EndObject(); fbJson.EndObject(); sJsonDoc := fbJson.GetDocument(); fbJson.ResetDocument(); END_IF; |
Result
sJSONDocという文字列はJSON OBJECTに変換でき、なおかつ更新し続けています。
実際StartObjectなどはこのMethodを使ってこのようにJSON Objectを生成します。