在我的61131程序中,我有需要在不同程序部分之间共享的对象/信息。这方面的最佳实践是什么,需要共享的对象是PRG POU中的VAR还是GVL中的全局对象?
从“高级”编程来看,我对全球数据持怀疑态度,但这也许是必要的?
感谢您对61131年度最佳实践架构的任何投入。
发布于 2017-09-04 04:32:05
我会为全局变量创建一个STRUCT,该变量拥有一个组件的所有全局数据,例如,一个名为ST_CoolingSystem的结构,它具有程序处理冷却系统所需的全局数据等。
其他方法是PROGRAMPOU的方法/属性。当然,它需要Codesys 3或类似功能。通过这种方式,您可以为程序或函数块本身创建变量/结构的getter,例如PRG_CoolingSystem.GetData(),它返回结构或对其的引用。
更新:
使用OOP特性的一种方法是添加一个返回数据结构引用的属性。注意:这适用于IEC 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添加的属性的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,它是自动添加的。

这只是一个例子,一个真正的系统将有更多的代码和数据。可以(应该吗?)也是更多的结构,每个结构用于命令、状态和参数。但我的看法是:)
发布于 2017-09-01 15:41:00
VAR中的PRG_POU相当于标准OOP类型语言中的局部变量。如果您想要一个可以在不同的used中使用的对象实例/信息,那么GVL (全局变量列表)就是您想要放置它的地方。但是,如果一个变量只在1 POU中使用,那么您将希望在该POU中将它变成一个VAR。从“最佳实践”的角度来看,您通常总是希望将全局变量限制在尽可能小的数目上,并尽可能地对POU使用更多的本地POU。
https://stackoverflow.com/questions/45996013
复制相似问题