在我的61131程序中,我有需要在不同程序部分之间共享的对象/信息。如果需要共享的对象在PRG POU中是VAR还是在GVL中是全局的,那么最佳实践是什么?
从“高级”编程我对全球数据持怀疑态度,但这可能是必要的?
感谢61131中有关最佳实践架构的任何意见。
答案 0 :(得分:1)
我会为全局变量创建一个STRUCT
,其中包含一个组件的所有全局数据,例如一个名为ST_CoolingSystem
的结构,它具有处理冷却系统的程序所需的全局数据。
其他方法是PROGRAM
POU的方法/属性。它当然需要Codesys 3或类似的。这样你就可以为程序或函数块本身创建一个get / struct的getter,例如PRG_CoolingSystem.GetData()
,它返回结构或对它的引用。
更新:
使用OOP功能的一种方法是添加一个返回对data struct的引用的属性。 注意:这适用于TwinCAT 3,也适用于具有新功能的其他IEC 61131-3系统。
假设我们有一个结构ST_Cooling
TYPE ST_Cooling :
STRUCT
//Commands
RunCooling : REAL;
TemperatureSetpoint : REAL;
//Status
MotorRunning : BOOL;
CurrentTemperature : REAL;
END_STRUCT
END_TYPE
我们还有一个功能块FB_Cooling
FUNCTION_BLOCK FB_Cooling
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
MotorRunCmd AT %Q* : BOOL;
Data_ : ST_Cooling; //"Private" of data struct
END_VAR
IF Data_.RunCooling THEN
//Do something
MotorRunCmd := TRUE;
//Update status
Data_.MotorRunning := TRUE;
ELSE
//Do something
MotorRunCmd := FALSE;
//Update status
data_.MotorRunning := FALSE;
END_IF
我们可以添加PROPERTY
到FB_Cooling
,可以用来检索结构并读取和编辑它。因为它返回一个引用(如指针),我们可以删除属性的Set方法。
财产类型:
PROPERTY Data : REFERENCE TO ST_Cooling
添加的PROPERTY的代码Get():
//FB_Cooling.Data (Get)
//Return reference to the data struct
Data REF= Data_;
现在可以从可以访问功能块实例的任何地方读取和编辑数据。
PROGRAM PRG_Test
VAR
CoolingSystem : FB_Cooling;
END_VAR
//This is how we read
IF CoolingSystem.Data.CurrentTemperature > 40.0 THEN
//This is how to write (because it is a reference)
CoolingSystem.Data.RunCooling := TRUE;
END_IF
//Run the block
CoolingSystem();
也许这张图片也解释了它在项目中的样子。请参阅Data属性,它是Get,它是自动添加的。
这只是一个例子,真正的系统会有更多的代码和数据。可能(应该?)还有更多结构,每个结构用于命令,状态和参数。但这只是我的意见:))
答案 1 :(得分:0)
VAR
中的PRG_POU
相当于标准OOP类型语言中的局部变量。如果您想要一个可以在不同POU中使用的对象实例/信息,那么GVL(全局变量列表)就是您想要放置它的地方。但是,如果变量仅用于1 POU
,那么您可能希望在VAR
中将其设为POU
。来自"最佳实践"通常,您通常希望将全局变量限制为尽可能小的数量,并尽可能使用更多本地VAR
POU
。