61131程序的体系结构

时间:2017-09-01 08:21:35

标签: plc iec61131-3

在我的61131程序中,我有需要在不同程序部分之间共享的对象/信息。如果需要共享的对象在PRG POU中是VAR还是在GVL中是全局的,那么最佳实践是什么?

从“高级”编程我对全球数据持怀疑态度,但这可能是必要的?

感谢61131中有关最佳实践架构的任何意见。

2 个答案:

答案 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

我们可以添加PROPERTYFB_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,它是自动添加的。

enter image description here

这只是一个例子,真正的系统会有更多的代码和数据。可能(应该?)还有更多结构,每个结构用于命令,状态和参数。但这只是我的意见:))

答案 1 :(得分:0)

VAR中的PRG_POU相当于标准OOP类型语言中的局部变量。如果您想要一个可以在不同POU中使用的对象实例/信息,那么GVL(全局变量列表)就是您想要放置它的地方。但是,如果变量仅用于1 POU,那么您可能希望在VAR中将其设为POU。来自"最佳实践"通常,您通常希望将全局变量限制为尽可能小的数量,并尽可能使用更多本地VAR POU