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

浙公網(wǎng)安備 33010602011771號