PLC Structured Text Object Oriented Programming PLC結構化文本(ST)——介面(Interface) 介面定義 介面定義了所有類繼承介面時應遵循的語法合同。介面定義了語法合同 "是什麼" 部分,派生類定義了語法合同 "怎麼做" 部分。 介面定義了屬性 ...
PLC Structured Text Object Oriented Programming
PLC結構化文本(ST)——介面(Interface)
介面定義
介面定義了所有類繼承介面時應遵循的語法合同。介面定義了語法合同 "是什麼" 部分,派生類定義了語法合同 "怎麼做" 部分。
介面定義了屬性、方法和事件,這些都是介面的成員。介面只包含了成員的聲明。成員的定義是派生類的責任。介面提供了派生類應遵循的標準結構。---C# 介面(Interface)|菜鳥教程
介面特點
- 介面使得實現介面的類或結構在形式上保持一致。---C# 介面(Interface)|菜鳥教程
- 介面本身並不實現任何功能,它只是和聲明實現該介面的對象訂立一個必須實現哪些行為的契約。---C# 介面(Interface)|菜鳥教程
- 介面可以繼承介面,一個介面可以繼承多個不同的介面。
- 介面成員預設是Public,也必須是Public。
- 介面變數可以接收實現該介面類型的類的對象。
介面與抽象類區別
- 抽象類在某種程度上與介面類似,但是,它們大多只是用在當只有少數方法由基類聲明由派生類實現時。---C# 介面(Interface)|菜鳥教程
- 抽象類不能直接實例化,但允許派生出具體的,具有實際功能的類。---C# 介面(Interface)|菜鳥教程
- 抽象類的成員不一定都是抽象的,但如果有一個類的成員是抽象的,那麼這個類一定是抽象類。
Tips : 以上關於介面和抽象定義、特點和區別,在
IEC61131-3
PLC
編程標準中同樣適用。
介面的實現
// 定義一個介面
INTERFACE I_StringBuilder EXTENDS __SYSTEM.IQueryInterface
// 介面的方法 Append
METHOD Append : I_StringBuilder
VAR_INPUT
sText : STRING;
END_VAR
// 介面的方法 Clear
METHOD Clear : I_StringBuilder
VAR_INPUT
END_VAR
// 介面的方法 ToString
METHOD ToString : STRING
VAR_INPUT
END_VAR
// 功能塊 FB_StringBuilder 實現 介面 I_StringBuilder
FUNCTION_BLOCK FB_StringBuilder IMPLEMENTS I_StringBuilder
VAR
sContent : STRING; // Store temporary strings;
END_VAR
// 添加介面方法的實現 Append
METHOD Append : I_StringBuilder
VAR_INPUT
sText : STRING;
END_VAR
--------
sContent := CONCAT(STR1 := sContent, STR2 := sText);
Append := THIS^;
// 添加介面方法的實現 Clear
METHOD Clear : I_StringBuilder
VAR_INPUT
END_VAR
--------
sContent := '';
Clear := THIS^;
// 添加介面方法的實現 ToString
METHOD ToString : STRING
VAR_INPUT
END_VAR
--------
ToString := sContent; // return internal content
定義一個介面I_StringBuilder
包含三個方法:Append
(作用:在字元串後面添加新字元)、Clear
(作用:清空當前字元串)、ToString
(作用:輸出字元串)。
定義一個功能塊FB_StringBuilder
實現介面I_StringBuilder
並給方法添加具體實現細節。
Tips : 示例介面
I_StringBuilder
繼承了__SYSTEM.IQueryInterface
,其中__SYSTEM.IQueryInterface
為系統內置介面,無其它成員,主要作用是為了可以做介面與介面的轉換或者介面與指針的轉換,所以在PLC ST OOP中一般以它作為介面的基類(最小粒度)以此派生。關於__SYSTEM.IQueryInterface
介面詳細用法可查閱官方資料。
1.Codesys運算符__QUERYPOINTER
2.倍福線上幫助系統
使用介面實現Fluent
在Main(PRG)
程式中聲明FB_StringBuilder
,I_StringBuilder
兩個對象,然後聲明sResult1
,sResult2
用來接收結果。
PROGRAM MAIN
VAR
// 字元拼接,輸出'Hello world'
fbStringBuilder : FB_StringBuilder;
iStringBuilder : I_StringBuilder := fbStringBuilder;
sResult1 : STRING;
sResult2 : STRING;
bTest : BOOL;
END_VAR
介面對象iStringBuilder
在初始化時傳入的是fbStringBuilder
對象。
- 1.使用對象實現Fluent
IF bTest THEN
// Function Block Instance
sResult1 := fbStringBuilder.Clear()
.Append('H')
.Append('e')
.Append('l')
.Append('l')
.Append('o')
.Append(' ')
.Append('W')
.Append('o')
.Append('r')
.Append('l')
.Append('d')
.ToString();
bTest := FALSE;
END_IF
- 2.使用介面實現Fluent
IF bTest THEN
// Interface
sResult2 := iStringBuilder.Clear()
.Append('H')
.Append('e')
.Append('l')
.Append('l')
.Append('o')
.Append(' ')
.Append('W')
.Append('o')
.Append('r')
.Append('l')
.Append('d')
.ToString();
bTest := FALSE;
END_IF
方法Clear()
和Append()
返回值是I_StringBuilder
介面,因此可以使用“.
”訪問介面內部定義的成員。
這種編程方式實現的方法不只這一種,還有其它方式也能實現這種效果,後續文章會有詳細介紹。
Tips : 作者喜歡稱這種編程方式為流式編程或鏈式編程,老外習慣的叫法為"
Fluent
"或者"Work Flow
",具體怎麼形容看個人喜好吧。
總結
介面(Interface)是引用類型,與IEC61131-3
定義的另一種類型(REFERENCE
)相似,目前筆者想到的" 引用類型 "在IEC61131-3中只有兩個" 介面(INTERFACE
) "和" 引用(REFERENCE
) ",若還有其它的引用類型,歡迎大神留言討論。