PLC结构化文本(ST)——属性(Property)
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中的使用非常频繁,所以各位工程师需要好好研究学习。