Beckhoff#TwinCAT3 Tc3_JsonXml的使用教學_1

Beckhoff TwinCAT PLC 函式庫 Tc3_JsonXml 可用於建立 JSON 和 XML 文件。在本範例中,我們將向您展示如何使用 Tc3_JsonXml 建立 JSON 物件。

Let’s start!

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

這個Functio Block中使用的 STRING 類型變數是基於 UTF-8 格式,是在MQTT 通訊中與 JSON 文件常見的格式之一。

AddKey

這個METHOD在 SAX Writer的目前位置新增一個新的屬性 。

例如,我們可以使用以下方法在變數中設定新屬性。

  • 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

這個METHOD在將一個 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

這個METHOD將一個 DINT 資料類型的值加到一個屬性中。請注意,該值必須使用 AddKey() 方法預先建立鍵。

Syntax

Input參數是一個 DINT 變量,用於為目前位置新增一個新值。

METHOD AddDint
VAR_INPUT
value : DINT;
END_VAR

Example

下面的範例為目前位置新增了一個新的屬性鍵”‘nNumber'”和 42 個值。

fbJson.AddKey(‘nNumber’);
fbJson.AddDint(42);

StartArray

這個METHO會產生一個新的 JSON ARRAY陣列符號 [ ,並將其插入 SAX 寫入器的目前位置。

Syntax

Input參數是一個 REAL 變量,用於在目前位置新增一個新數組。

METHOD StartArray : HRESULT

Example

下面的範例在目前位置新增了一個新數組。

fbJson.StartArray();

AddRawArray

這個METHOD會將一個 JSON 陣列作為值加到指定的屬性中。你需要確定其寫入位置是 有效的。

  • 緊接著 AddKey() 之後
  • 緊接在 StartArray() 之後
  • ResetDocument() 之後

Syntax

METHOD AddRawArray
VAR_IN_OUT CONSTANT
rawJson : STRING;
END_VAR

Example

在下面的範例中,在目前位置新增了一個新的 Json 陣列”‘PropertyName'”,其元素為 1、2 和 4。

fbJson.AddKey(‘PropertyName’);
fbJson.AddRawArray(‘1, 2, 4’);

EndArray

這個METHO會在 JSON 陣列最後產生一個”]”,並將其插入 SAX 寫入器的目前位置。

Syntax

METHOD EndArray : HRESULT
Sample call:

Example

下面是 EndArra() 的使用範例。

fbJson.EndArray();

StartObject

這個METHO會在產生一個新的 JSON 物件 ” { ” 並將其插入 SAX 寫入器的目前位置。

Syntax

METHOD StartObject : HRESULT

Sample call

下面的範例顯示了 StartObject() 的使用。

fbJson.StartObject();

EndObject

這個METHO會產生JSON 物件 ” }”,並將其插入 SAX 寫入器的目前位置。

Syntax

METHOD EndObject : HRESULT

Sample call

EndObject() 的使用示例如下。

fbJson.EndObject();

ResetDocument

這個METHOD會重置 SAX 寫入器目前建立的 JSON 物件。

Syntax

METHOD ResetDocument : HRESULT

Sample call

下面是 ResetDocument() 的示例。

fbJson.ResetDocument();

GetDocument

這個METHOD可以取得目前在 SAX Writer 中建立的 JSON 對象,類型為 STRING (255)。

請注意,GetDocument() 傳回字串的最大SIZE為 255 個字元。如果字串長度超過此值,則方法將傳回一個 NULL 字串,必須使用 CopyDocument() 方法。

Syntax

METHOD GetDocument : STRING(255)
VAR_OUTPUT
  hrErrorCode: HRESULT;
END_VAR

Sample call

下面是 GetDocument() 的使用示例。

sTargetString := fbJson.GetDocument();

Example1

我們會在例1 建立了一個只有一個實數的 JSON 物件。

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 物件就會不斷更新。

字串 sJSONDoc 可以轉換為 JSON OBJECT,並且仍在更新中。

實際上,StartObject等等都是使用以下的METHOD來產生 JSON 物件。

Example2 Array

我們會在例1 建立了一個 JSON 對象,其中包含一個實數、一個實數數組和一個整數數組。

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 物件。

Exmaple3 Add Object

我們會在例 3 中建立了一個 JSON 對象,其中包含一個實數、一個實數數組、一個整數數組和一個對象。

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 物件。


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

シェアする

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

フォローする