首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >61131程序体系结构

61131程序体系结构
EN

Stack Overflow用户
提问于 2017-09-01 08:21:34
回答 2查看 673关注 0票数 1

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

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

感谢您对61131年度最佳实践架构的任何投入。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-04 04:32:05

我会为全局变量创建一个STRUCT,该变量拥有一个组件的所有全局数据,例如,一个名为ST_CoolingSystem的结构,它具有程序处理冷却系统所需的全局数据等。

其他方法是PROGRAMPOU的方法/属性。当然,它需要Codesys 3或类似功能。通过这种方式,您可以为程序或函数块本身创建变量/结构的getter,例如PRG_CoolingSystem.GetData(),它返回结构或对其的引用。

更新:

使用OOP特性的一种方法是添加一个返回数据结构引用的属性。注意:这适用于IEC 3,也适用于其他具有新功能的IEC 61131-3系统。

假设我们有一个结构ST_Cooling

代码语言:javascript
复制
TYPE ST_Cooling :
STRUCT
    //Commands
    RunCooling          : REAL;
    TemperatureSetpoint : REAL;

    //Status
    MotorRunning        : BOOL;
    CurrentTemperature  : REAL;
END_STRUCT
END_TYPE

我们还有一个函数块FB_Cooling

代码语言:javascript
复制
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方法。

财产类型:

代码语言:javascript
复制
PROPERTY Data : REFERENCE TO ST_Cooling

添加的属性的Get()代码:

代码语言:javascript
复制
//FB_Cooling.Data (Get)

//Return reference to the data struct
Data REF= Data_;

现在可以从可以访问函数块实例的任何地方读取和编辑数据。

代码语言:javascript
复制
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,它是自动添加的。

这只是一个例子,一个真正的系统将有更多的代码和数据。可以(应该吗?)也是更多的结构,每个结构用于命令、状态和参数。但我的看法是:)

票数 2
EN

Stack Overflow用户

发布于 2017-09-01 15:41:00

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45996013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档