面向对象的定义
“面向对象的开发是一种软件设计方法,其中系统的分解基于对象的概念,对象是一个实体,其行为的特征在于它所遭受的行为以及对其他对象的要求。”
面向对象语言的最简单定义是它们允许程序员定义新类的能力,要归类为面向对象的语言,语言必须具有四个特征,许多高级语言被错误地称为面向对象的,因为它们没有展示所有的四个特征。
定义新数据类型或类的过程被称作为数据抽象,或抽象数据类型,这构成了使用这些技术开发控制系统软件的基础。
因此,数据只能由内部程序操作,功能允许有效地设计模块,这样模块内的内部变量就无法从模块外部访问,实际上,可以更改内部数据结构而不影响该实现中的其他模块。
信息隐藏可以在控制系统的安全方面发挥重要作用,工厂内某台设备的所有信息都可以隐藏起来,并且只能通过处理该设备的控制代码访问。
这将确保每段代码只处理与特定对象关联的内存和变量部分,这个区域被称为多态性,当需要将新的数据操作过程添加到程序中时,就会出现这种优势。
只需定义动态绑定的区域即可分配责任, “一个对象在运行时决定如何处理您发送给它的消息。”
软件设计对控制系统的运行
通常会有一个总体控制理念,该理念将定义设备和设备类型主要项目的基本操作规则,这通常被称为 MCC(电机控制中心)理念,它不涵盖每个单独的设备,而是涵盖设备类型的控制方面以及这些设备之间的相互作用。
控制系统原理将为程序员定义必要的类和子类,控制系统的功能规范将定义每台设备的具体要求以及物理数据。
一个简单的操作原理可以概括如下:在收到启动信号请求后,控制系统检查驱动器的跳闸和停止是否处于健康状态以及它是否正在运行。
如果这些条件成立,那么在最基本的情况下,会向驱动器发送一个信号以允许其启动,根据面向对象的设计原则,可以创建一个超类,可能是“驱动器”类型,这将是最简单的逻辑形式,下图显示了这个简单“驱动器”的逻辑。
当遇到每个不同的驱动器时,它与超类略有不同,可以创建一个新的子类来满足该类型的驱动器及其相关的额外逻辑,出于示例的目的,假设存在一个驱动器,当接收到启动信号请求时,该驱动器将直接落锁。
在大多数应用中,驱动器之间还会有许多互锁,这些将阻止系统的某些区域在安全之前启动,或者在设备跳闸的情况下,相关设备需要停止。
解决这个问题的方法是在一个名为 interlock 的类中有一个内部变量,然后可以创建此类联锁,这将满足每个驱动器的无限数量的联锁。
每个驱动例程都有一个特定的互锁对象,可以说,它向控制模块传递了一个清除信号,以允许它继续运行并停止驱动。
这也说明此逻辑的逻辑图在启动前的特定时间段内以警报声显示,该警报器称为安全启动警报器,用于警告区域内的人员即将启动。
在这种情况下,可以创建一个“带警报器的驱动器”的来满足这种驱动器实例,这种“带警报器的驱动器”的逻辑图如下图所示。
使用计时器,为警报器计时,计时周期结束后,定时器输出将变为 oo,并与图 3 的其余部分并联。
每个级别的驱动器将以不同的方式响应相同的 me$3ge,驱动器的超类只会启动驱动器,“带警报器的驱动器”将在启动驱动器之前发出警报器。
“带互锁的驱动器”在启动驱动器之前将首先获得许可,这种对同一命令引起不同反应的行为满足了面向对象的特性。
面向对象软件的开发与管理
必须考虑的主要领域之一是面向对象软件与物理 PLC 的比较,所有 PLC 系统的工作原理都是具有一系列输入/输出 (1/0) 机架,这些中的每一个都与要控制的设备建立了物理连接。
以前当输入信号的时候,这些指的是物理信号进入 I/0 机架中的其中一张 J/0 卡。
问题在于软件环境中定义 1/0,然后定义将这种 1/0 映射到现实世界的方法,对此的解决方案是创建许多称为 IO 的类。
这些代表物理 1/0 点,用于接收和发送信号到工厂和从工厂发送信号,这里有四种常见类型的与 PLC 相关的物理 1/0。
它们是:
数字输入 (Digl) 这将是进入 PLC 的二进制信号。
数字输出(DigO) 类似于输入,但从PLC 发送到被控制的设备。
模拟输入 (Ant) 这是从实际装置发送到 PLC 的模拟信号(例如水箱液位)。
模拟输出 (AnO) 这些是 PLC 发送到特定单元的模拟信号。
这些可用于控制阀门的开度或变速电机的速度,1hus 在最基本的层面上将定义两个类,这些将是 DigO 和 Oigl。
定义(在 C++ 中)将是:
class DigO
{
public:
};
class Digl
{
int state;
char* address;
OigOQ;
public:
intstate;
char* address;
Oi~IQ
;
void setDIQnt value);
int readDIO;};
这个定义需要一些解释,因为有一些领域使用了信息隐藏的原则,这样做是为了将有些做作的情况映射到现实世界中。
在大多数 PLC 中,与驱动器相关的数字输出信号是公共域,因此,它们可以通过在 PLC 范围内任何地方运行的任何程序进行修改。
稍后给出 I 0 机架的定义时将解决此问题,但是,只要注意类 OigO(数字输出)由两个成员变量和一个构造函数组成就足够了。
函数之间变量的构成
这两个成员变量包括该输出信号的状态和该数字输出的地址,后者指的是 PLC 程序员用来将物理 IO 点分配给内存位置的地址。
一般来说,物理 IO 被映射到 PLC 内存的一段,这有助于快速访问值,而不必从物理 IO 卡读取,构造函数用于在定义对象时初始化此类对象的状态。
数字输入 ( Dig ~ ) 的定义相当复杂,大量 PLC 不允许轻松访问数字输入值,这意味着程序本身不能覆盖内存的输入区域。
这种方法用于防止 PLC 写入错误值而不是物理输入的问题,为了满足此功能,Digl 的状态已定义为私有,如果正在为实际 PLC 开发程序,那么就会有不需要所有已经编写的成员函数。
有一个名为 SetDI 的空函数,用于将输入强制为特定值,这是因为没有可用的实际 IO 点。
整型函数 ReadOI 是用于确定私有变量状态的值,该功能通常也不存在,因为对输入值的访问通常在阅读模式下不受限制。
如前面所述,到 PLC 的 IO 信号被分组到 IO 卡和机架中,因此,下一个类定义是 IOrack,这仅仅是 IO 的“持有者”,1ne IOrack 类用作现实世界的一种接口,它包含通用电力驱动器运行所需的基本 IO。
class IOrack
{
};
public:
OigO start, localstart;
Oigl seqstart,fieldstart,tripshealthy,
stopshealthy, running;
IOrackO;
IOrack 文档定义的类不包含任何逻辑,它只是将 IO 组合在一起,并用于将特定 IO 点与特定驱动器相关联。
当定义了 IOrack 类的变量时,指定的 IO 也被定义,类定义的定义部分调用正确的 10 种类型并相应地初始化这 10 种类型。
启动时需要的构造函数 IOrackQ 以方便IOrack 类的新变量的定义。
这个函数的代码段是空的,因为当一个 IOrack 被调用时,它创建了所有初始化它们自己的变量,变量 localstart 用作超类和子类之间信息的临时载体。
基本类型的 IOrack 包含最基本的 IO,不适合任何新类型的驱动 IO。这些将成为新类本身的局部变量。
由于已经定义了最简单的必要类,现在可以定义基本的电力驱动操作,这些包含在 Generaldrive 类中。
代码的结构使得 Generaldrive 类构成了所有驱动器相关操作的核心,所有基本的 IO、过程和操作都在这个类中定义,所有实际运行的驱动类都派生自这个基类。
某些函数被定义为虚函数,这允许运算符重载,这也许是使用面向对象设计和相关语言的显着好处之一。
同一运算符可用于表示多个不同的操作,该语言将在运行时确定要使用的操作,这允许每个子类以基本不同的方式表现。
下面给出了类定义的清单,接下来是对类定义中每一行的简要描述。
class Generaldrive
{
};
public:
char namestr[20);
char typename[30);
Generaldrive * nextptr;
interlock inter-lock;
addinterlocksO;
delinterlocksQ;
int type;
virtual statusQ;
virtual addtolist(char name[20D;
setrunningO;
IOrack rack;
virtual operate( int value, Int error =0);
operate1Qnt value, Int error : O); /* basic
operations*/
GeneraldriveO;
namestr和typename这两个字符串用来定义驱动器的唯一性,类型名称主要应用于新驱动器类型的定义,其中形成驱动器列表并为用户列出类型。
指向名为nextptr 的类的指针是构成驱动器链表核心的指针,联锁是指工厂中的安全功能,除非满足联锁条件,否则不允许启动驱动器。
函数与整数类型的区别
Tue成员函数 add-interlaock 和 delinterlocks 在程序中用于设置和删除与驱动器关联的互锁。整数类型用于区分不同的类别,这主要用于在运行时创建驱动器。
Tue 功能是从选项列表中选择不同类型相关联的硬连线代码,需要成员函数 status 来生成与驱动相关的所有输入和输出变量的状态输出到屏幕。
这在需要这种性质显示的许多情况下使用,这也被定义为一个虚函数,因此它允许一个新的子类重新定义它的名为 status 的成员函数。
Addtolist 这个函数被每个子类以根本不同的方式使用,它的主要功能是将特定类型的新驱动器添加到驱动器链表中。
setrunning是所有子类共有的成员函数,用于判断驱动器是否运行,Rack 是 IOrack 类型的变量,它包含为特定类定义的基本 IO。
所有的 IO 操作都是使用这个 IOrack 进行的,1bis 是 PLC 编程中的一种可靠保护形式,因为程序员经常为变量输入不正确的助记符,因此很难找到错误。
与驱动器关联的 IO 只能由该驱动器访问这一事实使得无法访问与另一个驱动器关联的 IO。额外的好处是,在编程时所有变量的名称都是相同的。
两个成员函数 operate 和 operate1 构成了驱动操作的核心,Operate 是一个通用函数,它定义了所有必要的基本驱动操作。
结语
Operate1 特定于每种驱动器类型,并从操作中调用,仅使用一个虚拟功能并为每种驱动器类型定义独特的操作就可以达到相同的效果。
决定使用一个通用的操作核心,并允许每个 Clrivc 配置它自己的特定参数,因此,当驱动器传递消息操作时,它调用 operate1,然后 peeerform 基本驱动器操作。
这将在各种驱动器类型的描述中进一步讨论,1be IO点localstart作为程序间的传递机制,1be类Generaldrive的最后一个成员函数是构造函数。
文 | 奇迹末班车
编辑 | 奇迹末班车
版权声明:【控制系统软件开发方法有哪些,控制系统软件的面向对象】版权归原作者所有,本文由作者:【隔壁老王】用户自发贡献上传,该文观点仅代表作者本人,本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任,如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至举报,一经查实,本站将立刻删除,如若转载,请注明出处:https://www.intostarry.com/jrzy/1327.html