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