PLC Structured Text Object Oriented Programming
PLC結構化文字(ST)——屬性(Property)
屬性的定義
C# 中的屬性(Property)是類和結構體中用於封裝資料的成員。它們提供了一種方式來定義類成員的訪問和設定規則,通常用於隱藏欄位(Fields)的內部實現細節,同時提供控制資料訪問的機制。---C#屬性
在PLC ST中屬性的定義與高階語言相同,或者說ST中屬性這一概念就是仿照高階語言中屬性設計的。此處引入一個概念欄位(Fields
),在POU
內部宣告的成員變數可以統稱為欄位(Fields
)這是高階語言中的概念,同樣適用於PLC ST。
屬性的特點
- 屬性可以看作是對欄位的包裝器,通常由 get 和 set 訪問器組成。
- 屬性(Property)不會確定儲存位置。相反,它們具有可讀寫或計算它們值的 訪問器(accessors)。
- 例如,有一個名為 Student 的類,帶有 age、name 和 code 的私有域。我們不能在類的範圍以外直接訪問這些域,但是我們可以擁有訪問這些私有域的屬性。---C#屬性
Tips :
IEC61131-3
並沒有對OOP支援的很完善,例如POU內部宣告的變數在例項化之後仍然可以透過“物件.元件”訪問POU內部成員,這表明POU內部宣告的變數預設是Public
且Readonly
。這點目前與高階語言C#稍有不同。
屬性實現方式
C#程式碼示例:
public class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
或者
public class Person
{
public string Name { get; set; }
}
TwinCAT3 ST程式碼示例:
// 建立類(FB)
FUNCTION_BLOCK FB_Person
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
name : STRING;
END_VAR
-------------------------
// 建立屬性
PROPERTY Name : STRING
-------------------------
// Get方法(訪問器)
VAR
END_VAR
-------------
Name := name;
------------------------
// Set方法(訪問器)
VAR
END_VAR
-------------
name := Name;
與C#屬性相比,只是結構上有點區別,程式本質上沒有任何區別。若想實現屬性的只讀或只寫刪除對應的Get
或Set
方法即可。
Tips : PLC經常線上監控變數當前值,但是屬性變數並不顯示當前狀態值,需要使用斷點來監控及其不方便。官方提供了兩種特性來解決這個問題。
{attribute 'monitoring' := 'variable'}
和{attribute 'monitoring' := 'call'}
詳細使用方法查閱官方文件:https://content.helpme-codesys.com/zh-CHS/CODESYS Development System/_cds_pragma_attribute_monitoring.html
總結
C#中屬性與PLC ST屬性並無太大區別,都是對內部欄位的包裝,都有get
和Set
訪問器,屬性在OOP中的使用非常頻繁。