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
) ",若还有其它的引证类型,欢迎大神留言评论。