Beckhoff#TwinCAT3 Tc3_JsonXml を使ってみよう

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を生成します。

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする