PLC結構化文字(ST)——屬性(Property)

J_Sheng發表於2024-09-03

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內部宣告的變數預設是PublicReadonly。這點目前與高階語言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#屬性相比,只是結構上有點區別,程式本質上沒有任何區別。若想實現屬性的只讀只寫刪除對應的GetSet方法即可。

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屬性並無太大區別,都是對內部欄位的包裝,都有getSet訪問器,屬性在OOP中的使用非常頻繁。

相關文章