结构变量(Structure)就像我们把人群按家族、组织、爱好划分为一个个群体一样。当我们感兴趣一个群体或一个家族时,我们就可以单独用这个群体或家族的一个名字来找到这个名下的所有成员。例如:如图6-14所示,在MyStruct名下,有各种不同类型的变量,但找到它们都要通过MyStruct。
图6-14 结构变量
在命名一个结构变量时,我们要按如图6-15所示步骤进行。即先打开栏目菜单的工程(Project)选择添加对象;在添加对象条目中,选择DUT,并写上结构体变量名;打开结构体后,在声明区填写结构体名下的变量及类型。
图6-15 命名一个结构变量的步骤
编写完成后,就形成了在这个结构体下的一组或一个群体的变量。这个群体的代言就是结构体名。当在某一个程序组织单元POU中,要用到这组变量时,我们就可以在POU的变量声明区中把某一变量声明为这个结构体,然后这个变量就可以访问结构体变量下的元素了。
例1:在编写一个程序组织单元时,首先声明变量为编辑好的结构体变量(1)即声明变量tooldata为结构变量structure_1,如图6-16所示。然后在程序编辑区应用结构体变量时,先写出结构变量tooldata,然后在其后加“.”,就引导出结构体下的所有元素(2)。
图6-16 一个结构体变量下的所有元素
例2:在实际电动机轴的运动控制中,这个电动机轴可以做寻原点运动,也可以做速度运动,也可以做定长运动以及电子齿轮、电子凸轮等。因此,我们就可按电动机轴运动类型划分,假设在这个案例中,这个电动机轴AxisInterfaceType涵盖3种类型运动,即寻原点Home;速度运动Velocity,及定长运动Position。我们创建的结构体名为AxisInterfaceType,如图6-17所示。
图6-17 创建一个名为AxisInterfaceType的结构变量
打开后的编辑框和设备显示如图6-18所示。
图6-18 打开编辑结构变量
对结构体进行编辑,把元素寻原点Home、速度运动Velocity及定长运动Position加入结构体中,如图6-19所示。
图6-19 编辑结构体内元素组成
同理,再分别建立HomeType、VelocityType、PositionType的结构变量如下。在编辑HomeType结构变量时,我们看一下,我们在这个结构体下都需要什么元素。
寻原点功能块如图6-20所示。
图6-20 寻原点功能块
这样,我们知道这个功能块的输入和输出变量定义如下。
INPUT
Axis:Axis_Ref_LXM;
Execute:BOOL;
Position:DINT;
HomingMode:UINT;
VHome:DINT;
VOutHome:DINT;
POutHome:DINT;
PDisHome:DINT;
OUTPUT
Done:BOOL;
Busy:BOOL;
CommandAborted:BOOL;
Error:BOOL;
把变量复制到寻原点结构体下,如图6-21所示。
图6-21 编辑寻原点HomeType结构变量下包含的元素
速度运动功能块如图6-22所示。
图6-22 速度运动功能块
这样,我们知道这个功能块的输入和输出变量定义如下。
INPUT
Axis:Axis_Ref_LXM;
Execute:BOOL;
Velocity:DINT;
OUTPUT
InVelocity:BOOL;
Busy:BOOL;
CommandAborted:BOOL;
Error:BOOL;
把变量复制到速度运动结构体下,如图6-23所示。
图6-23 编辑速度运动VelocityType结构变量下包含的元素
定长运动功能块如图6-24所示。
(www.daowen.com)
图6-24 定长运动功能块
这样,我们知道这个功能块的输入和输出变量定义如下。
//INPUT
Axis:Axis Ref LXM;
Execute:BOOL;
Distance:DINT;
Velocity:DINT;
//OUTPUT
Done:BOOL;
Busy:BOOL;
CommandAborted:BOOL;
Error:BOOL;
把变量复制到定长运动结构体下,如图6-25所示。
图6-25 编辑定长运动PositionType结构变量下包含的元素
这样一来,当要编辑一个运动控制程序时,在变量声明区,我们定义一个轴控变量d3AxisInteface时,把它定义为结构体变量AxisInterfaceType,如图6-26所示。
图6-26 声明一个变量为已编辑完的结构变量
当运动模式为寻原点时,在变量“.”后缀选择Home,如图6-27所示。
图6-27 结构变量的首层导出
在Home“.”后缀出现更多变量元素,选择对应的即可,如图6-28所示。
最后,我们规范定义了所有变量,如图6-29所示。
图6-28 结构变量的第二层导出
图6-29 清晰的寻原点变量
并且,我们可以在程序中给这些变量赋值。比如给轴Axis赋值d3_AxisInterface.Home.Axis:=d3,即运动轴为d3,是你在硬件组态时配置好的,如图6-30所示。
图6-30 硬件组态好的电机轴
当你又加一个轴d4做寻原点运动时,你只需要在变量声明区把变量的声明再复制一次,然后把d3替换为d4,如图6-31所示。
图6-31 增加一个运动轴
在程序编辑区,复制图6-29中的程序一次,然后粘贴在程序编辑区,如图6-32所示。
图6-32 复制粘贴后的程序
然后利用编辑菜单中的查找&替换,如图6-33、图6-34所示,把复制程序块中的d3替换为d4。
图6-33 编辑菜单下的查找&替换
点击替换,则替换一步一步进行,直到把复制的功能块中的d3替换完毕,如图6-35所示。这里要注意:不能点击全部替换。
然后,在赋值程序中对新变量也进行复制,替换即可。例如:复制一条命令d3_AxisInterface.Home.Axis:=d3;把d3替换为d4,d4_AxisInterface.Home.Axis:=d4。当运动模式为速度运动时,调入速度运动功能块,在变量声明区增加一条对功能块名d3_velocity的声明,如图6-36所示。
图6-34 字符替换
图6-35 编辑好的程序
图6-36 新增功能块及声明
这时在变量“.”的后缀选择Vel,在Vel“.”的后缀选择相对应变量,如图6-37、图6-38所示。
图6-37 打开首层变量选择
图6-38 打开第二层变量选择
最后,我们规范定义了所有变量,如图6-39所示。
图6-39 对速度运动的程序编辑
并且,我们可以在程序中给这些变量赋值。比如给轴Axis赋值d3 AxisInterface.Vel.Axis:=d3,即运动轴为d3,是你在硬件组态时配置好的。
与编辑寻原点功能块一样,我们也可以通过复制,粘贴,再替换,编辑出更多轴的速度运动。也可以用同样的方法,编辑出更多轴的定长运动。从这个案例可以看到结构体变量对编程和程序带来的益处。也就是说:结构体这种编程架构,不仅对编程技巧有所研究,而且对程序开发的未来也包含有哲学方面的思考。它使每次编程都建立在已有的经验之上,不断构筑向上发展的大厦,使之日趋完善。而不是结构体的编程在开发新项目的时候总是推倒重来,总是在失去原有的经验和成熟工艺的情况下,使每一次的开发都成为新的探索。这无疑增加了风险和时间。而在程序设计和规划上就像一个好的作家,他不仅是熟识一种语言,更是能把这种语言组织成好的文章。不仅能使自己看懂,更重要的是使别人看懂。程序员也是一样。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。