近日由于做了个小手术,需要休息一段时间就刚好有时间让我可以再继续研究一下西门子新推出的这个SIMATIC AX。对于一个基于嵌入式背景的IT工程师而言,把面向对象的思想用于我们运动控制的自动化程序是梦寐以求的。
常言道一天不练手生脚慢;两天不练功夫减半;三天不练成了门外汉。理想和现实间总有很长一段路要去跨越,由于本人太久没基于OO做过项目了,折腾了半天还不得法,我也懒得再去尝试,转而去补习一些基础知识。
我们都知道现代PLC语言都是基于IEC61131-3这个标准的,61131-3是PLCopen这个组织主要推出的,当然大名鼎鼎的Motion Control也是PLCopen这个组织的重要成果。我们做舞台控制的核心其实就是运动控制,故最终选择了《Application Examples for Motion Control Porting “Function blocks for motion control” into OOP》来消磨时光,我把学习过程中顺带翻译的内容也贴出,供日后参阅。
运动控制应用示例 - 将“运动控制功能块”移植到OOP中 V1.0
1、本文件介绍
随着 “运动控制功能块(原第1部分和第2部分)”规范的发布,PLCopen运动控制工作组提供了一套标准化功能块,以简化运动控制软件的模块化和重复使用。本文件介绍了运动控制规范的面向对象实现,可与程序标准功能块(FB)集相结合。建议的面向对象(OO)实现的总体设计是用一个轴的类将不同功能作为方法来实现,而不是以前使用的多个FB。该软件设计的一个优点是与程序化运动控制FB兼容:标准运动控制库可以在内部调用轴类,将两种方法结合到一个应用程序中。因此,通过OO实现的用户无需熟悉详细的OO原理或语言元素即可使用。
正如面向对象编程(OOP)中常见的那样,接口用于定义动作标准,因为它描述了一个类对外展示的方法(有时包括行为)。更确切地说,接口是一个类可实现的功能的定义。类是所定义功能的实际实现,包括供应商特定的方面。相应地,本文件对运动接口进行了标准化。要使用这一标准,需要实现一个轴类,该轴类遵循(“实现”)这一标准化运动接口。简而言之:该接口定义了功能,但没有定义如何实现这些功能(其内容),这些功能在轴类中由特定供应商实现。
1.1 本工作组的目标
在本文档中,我们使用了三个应用实例:
- (1) 贴标签示例:将标签贴在传送带上的产品上
- (2) 仓储示例:将托盘从仓库货架上移出
- (3) 多轴组合的FB: CamIn 和 GearIn。
通过这些示例,我们可以看到如何通过使用下面介绍的标准化接口itfAxis,将PLCopen运动控制规范中的标准化FB移植到OOP中。为了在供应商特定的实现中应用该标准,程序员开发了一个类,该类实现了itfAxis接口,因此无需自己去实现即可拥有itfAxis中标准化的所有功能。然后,再对这些功能的具体实施进行编程。
该itfAxis接口的优势在于,用户可以自行决定编程方式:一方面,可以使用标准FB,它们可以在内部调用itfAxis方法。另一方面,也可以使用定义的方法来启动新命令、获取轴的状态、更新或终止命令,从而以OOP方式进行编程。
下文将详细介绍相应的接口、包含的方法以及几种用户定义的数据类型。
本文档仅关注轴的运动控制部分。在实际项目中,轴类还有许多其他属性和方法,用于通信、硬件配置和其他方面。为简单起见,本文档不对这些内容进行解释。
2、OOP运动控制库的元素
将运动FB移植到OOP的起点是定义itfAxis接口,作为PLCopen运动控制规范中轴类的标准化表示。首先,定义了几个ENUMS,在itfAxis接口中使用(参见图1)。
2.1. 参考REF
在本文档中,我们将不会看到AXIS_REF、CAM_REF、MC_INPUT_REF、MC_OUTPUT_ REF等属性,因为它们是供应商特定的属性,不用作任何“Method”的输入。
我们希望供应商以特定的方式在接口中添加ID属性。
2.2. 命令Commands
为了描述命令,定义了itfCommand接口及其用于运动控制的各种扩展。itfCommand包含用于查询命令状态的“Getter Functions”。为符合IEC61131-3标准,“Getter Function”以Methods的形式来实现。(注:实际值可以作为属性实现,与 “Getter函数”(方法)相比,属性可以更简洁。因此,使用起来更简单。读取链接变量的当前值只需要这些属性的Get-Method )。为取消正在运行的命令,定义了一个Abort方法。为了适应未来的控制策略(例如IEC0-61499所定义的事件驱动编程),还定义了Wait方法。在事件驱动编程情况下,同步调用是可能的,该命令可用于等待命令结束或超时。当前的运动控制规范中未包含该命令,但它代表了一种扩展,可用于事件驱动架构中的同步调用函数。
itfAxisCommand接口对itfCommand进行了扩展,该接口添加一个更新方法,该方法可在移动的输入发生变化时调用。该方法模仿了经典FB的ContinuousUpdate输入功能。它用于更新MoveAbsolute等命令的调用参数(位置、加速度等)。
总之,已定义的命令(如itfCommand、itfAxisCommand等)都是通用命令,可用于所有API(应用编程接口)(绝对移动、相对移动、速度移动、停止或停止)。这样就可以使用调度程序、错误处理程序等
2.3 Axis接口定义
itfAxis接口分为不同的子文件夹,根据类别对功能进行分组(参见图1中部)。这些类别与运动控制规范中的FB相对应。第一个文件夹是ActualValues 文件夹,其中包含用于查询轴实际状态的ActualPosition、ActualTorque 和 ActualVelocity “Getter Functions”。
在第二个文件夹“Control”中,包含九种用于轴控制的方法,如电源、重置和设置位置。通过 Stop / Gear / Cam 命令,轴被移动到特定状态:Stop 或 Synchronized_Motion。由于将Execute 设置为FALSE在OOP中没有意义,因此添加了一个Release Method(释放方法),以便将轴返回到StandStill(静止)状态。
第三个和第四个文件夹包含运动方法,例如MoveAbsolute 方法,用于轴的绝对运动。该方法包含输入参数,但没有输出。其状态通过itfAxisCommand类型的返回变量返回,该变量包含与运动相关的变量和命令的参考编号。用户可以调整该接口,使其包含所有必要的附加信息。调用MoveAbsolute等方法时,将返回命令状态。简单的程序可以忽略返回值,而使用轴的状态来检查触发的运动何时完成(轴返回到静止状态)。有了返回值,就可以使用itfAxisCommand接口的方法对命令进行后续处理。
最后,文件夹Status包含13个属性(参见第5.2.2章Status),用于观察轴的状态。运动控制规范为此定义了四个FB,即MC_ReadStatus、MC_ReadAxisInfo、MC_ReadAxisError 和 MC_ReadMotionState。这些标准FB的返回值被转化为属性,如Status 属性。在OOP中,将所有轴状态(如静止、错误、停止等)作为单独的布尔属性是不现实的。为了简化操作,我们定义了一个ENUM类型的属性。轴的所有可能状态都合并在ENUM AXIS_STATUS(参见图 1 和第 5.1 章 ENUM)中。属性 Status 返回一个 ENUM AXIS_STATUS 类型的变量。MotionStatus 属性的定义与此类似。
图1 :OOP运动控制库的ENUMS、接口和STRUCTS的项目树
3、Command接口定义
3.1 itfCommand接口基础
图2:同步方法返回的命令类需实现的接口
这是任何供应商均需实现的命令类的接口。该类包含运行中命令的状态,并不局限于运动控制。
3.1.1 属性Properties
名字 | 访问权限 | 类型 |
---|---|---|
Done | Read | BOOL |
Busy | Read | BOOL |
Active | Read | BOOL |
CommandAborted | Read | BOOL |
Error | Read | BOOL |
ErrorId | Read | MC_ERROR |
有关属性的说明,请参阅PLCopen运动控制第1部分。
InVelocity和InSync属性是该基本类型的扩展,参见下文第3.3和3.4章。
3.1.2 方法Methods
该处未列出命令类需实现的接口,但是命令类必须实现一个内部Get Method,该方法用于更新属性。其他方法如下:
METHOD Abort : MC_ERROR
VAR_INPUT
END_VAR
END_METHOD
以下的等待方法是IEC-61499标准中需要的
METHOD Wait : MC_ERROR
VAR_INPUT
Timeout : TIME;
AbortOnTimeout : BOOL;
END_VAR
END_METHOD
3.2 itfAxisCommand:Extends itfCommand
针对轴运动方法的itfCommand扩展。
3.2.1 Update Methods
METHOD Update : MC_ERROR
VAR_INPUT
Position : REAL;
Velocity : REAL;
EndVelocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
END_VAR
END_METHOD
3.3 itfContinuousAxisCommand:Extends itfAxisCommand
用于将轴设置为ContinuousMotion(连续运动)状态的移动。
3.3.1 Added Properties
名字 | 访问权限 | 类型 |
---|---|---|
InVelocity | Read | BOOL |
3.4 itfSynchronizedAxisCommand:Extends itfAxisCommand
用于将轴设置为SynchronizedMotion(同步移动)状态的移动。
3.4.1 Added Properties
名字 | 访问权限 | 类型 |
---|---|---|
InSync | Read | BOOL |
4、itfCamTable 接口定义
4.1 Select Methods
METHOD Select : itfCommand
VAR_INPUT
Periodic : BOOL;
MasterAbsolute: BOOL;
SlaveAbsolute: BOOL;
CamTable: MC_CAM_REF;
END_VAR
END_METHOD
5、itfAxis接口定义
5.1 ENUMs
No. | MC_AXIS_STATUS |
---|---|
0 | mcErrorStop |
1 | mcDisabled |
2 | mcStandstill |
3 | mcHoming |
4 | mcStopping |
5 | mcDiscreteMotion |
6 | mcContinuousMotion |
7 | mcSynchronizedMotion |
No. | MC_MOTION_STATUS |
---|---|
0 | mcConstantVelocity |
1 | mcAccelerating |
2 | mcDecelerating |
No. | MC_AXIS_DIRECTION |
---|---|
0 | mcDirectionPositive |
1 | mcDirectionNegative |
有关状态的说明,请参阅PLCopen运动控制第1部分。
5.2 属性Properties
5.2.1 Actual values
名字 | 访问权限 | 类型 |
---|---|---|
ActualPosition | Read | REAL |
ActualTorque | Read | REAL |
ActualVelocity | Read | REAL |
有关属性的说明,请参阅PLCopen运动控制第1部分。
5.2.2 Status
名字 | 访问权限 | 类型 |
---|---|---|
AxisWarning | Read | BOOL |
CommunicationReady | Read | BOOL |
Direction | Read | MC_AXIS_DIRECTION |
ErrorId | Read | MC_ERROR |
HomeAbsSwitch | Read | BOOL |
IsHomed | Read | BOOL |
LimitSwitchNegative | Read | BOOL |
LimitSwitchPositive | Read | BOOL |
MotionStatus | Read | MC_MOTION_STATUS |
PowerOn | Read | BOOL |
ReadyForPowerOn | Read | BOOL |
Simulation | Read | BOOL |
Status | Read | MC_AXIS_STATUS |
有关属性的说明,请参阅PLCopen运动控制第1部分。
5.3 方法Methods
5.3.1 Control
METHOD Power : itfCommand
VAR_INPUT
Enable : BOOL;
EnablePositive : BOOL;
EnableNegative : BOOL;
END_VAR
END_METHOD
METHOD ReadBoolParameter : MC_ERROR
VAR_INPUT
ParameterNumber : INT;
END_VAR
VAR_OUTPUT
Value : BOOL;
END_VAR
END_METHOD
METHOD ReadParameter : MC_ERROR
VAR_INPUT
ParameterNumber : INT;
END_VAR
VAR_OUTPUT
Value : INT;
END_VAR
END_METHOD
METHOD Release : MC_ERROR
VAR_INPUT
END_VAR
END_METHOD
METHOD Reset : MC_ERROR
VAR_INPUT
END_VAR
END_METHOD
METHOD SetOverride : MC_ERROR
VAR_INPUT
VelFactor : REAL;
AccFactor : REAL;
JerkFactor : REAL;
END_VAR
END_METHOD
METHOD SetPosition : itfCommand
VAR_INPUT
Position : REAL;
Relative : BOOL;
ExecutionMode : MC_EXECUTION_MODE;
END_VAR
END_METHOD
METHOD WriteBoolParameter: MC_ERROR
VAR_INPUT
ParameterNumber : INT;
Value : BOOL;
END_VAR
END_METHOD
METHOD WriteParameter: MC_ERROR
VAR_INPUT
ParameterNumber : INT;
Value : REAL;
END_VAR
END_METHOD
METHOD DigitalCamSwitch : itfCommand
VAR_INPUT
Switches : MC_CAMSWITCH_REF;
Outputs : MC_OUTPUT_REF;
TrackOptions : MC_TRACK_REF;
Enable : BOOL;
EnableMask : DWORD;
ValueSource : MC_SOURCE;
END_VAR
END_METHOD
METHOD TouchProbe : itfCommand
VAR_INPUT
TriggerInput : MC_TRIGGER_REF;
WindowOnly : BOOL;
FirstPosition : REAL;
LastPosition : REAL;
END_VAR
END_METHOD
METHOD AbortTrigger : itfCommand
VAR_INPUT
TriggerInput : MC_TRIGGER_REF;
END_VAR
END_METHOD
5.3.2 Single Axis Motion
METHOD Home : itfAxisCommand
VAR_INPUT
Position : REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD Stop : itfAxisCommand
VAR_INPUT
Deceleration : REAL;
Jerk : REAL;
END_VAR
END_METHOD
METHOD Halt : itfAxisCommand
VAR_INPUT
Deceleration : REAL;
Jerk : REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD MoveAbsolute : itfAxisCommand
VAR_INPUT
Position : REAL;
Velocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
Direction : MC_DIRECTION;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD MoveRelative : itfAxisCommand
VAR_INPUT
Distance : REAL;
Velocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD MoveAdditive : itfAxisCommand
VAR_INPUT
Distance : REAL;
Velocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD MoveSuperimposed : itfAxisCommand
VAR_INPUT
Distance : REAL;
VelocityDiff : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
END_VAR
END_METHOD
METHOD HaltSuperimposed : itfAxisCommand
VAR_INPUT
Deceleration : REAL;
Jerk : REAL;
END_VAR
END_METHOD
METHOD MoveVelocity : itfContinousAxisCommand
VAR_INPUT
Velocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD MoveContinuousAbsolute : itfContinousAxisCommand
VAR_INPUT
Position : REAL;
EndVelocity : REAL;
Velocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
Direction : MC_DIRECTION;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD MoveContinuousRelative : itfContinousAxisCommand
VAR_INPUT
Distance : REAL;
EndVelocity : REAL;
Velocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
Direction : MC_DIRECTION;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD TorqueControl : itfAxisCommand
VAR_INPUT
Torque : REAL;
TorqueRamp : REAL;
Velocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
Direction : MC_DIRECTION;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD PositionProfile : itfCommand
VAR_INPUT
TimeScale : REAL;
PositionScale : REAL;
Offset : REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD VelocityProfile : itfCommand
VAR_INPUT
TimeScale : REAL;
VelocityScale : REAL;
Offset : REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD AccelerationProfile : itfCommand
VAR_INPUT
TimeScale : REAL;
AccelerationScale : REAL;
Offset : REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
5.3.3 Multi-Axes Motion
METHOD CamIn : itfSynchronizedCommand
VAR_INPUT
Master : itfAxis;
MasterOffset : REAL;
SlaveOffset : REAL;
MasterScaling : REAL;
SlaveScaling : REAL;
MasterStartDistance : REAL;
MasterSyncPosition : REAL;
StartMode : MC_START_MODE;
MasterValueSource : MC_SOURCE;
CamTable : itfCamTable;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD GearIn : itfSynchronizedCommand
VAR_INPUT
Master : itfAxis;
RatioNumerator: REAL;
RatioDenominator: REAL;
MasterValueSource : MC_SOURCE;
Acceleration: REAL;
Deceleration: REAL;
Jerk: REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD GearInPos : itfSynchronizedCommand
VAR_INPUT
Master : itfAxis;
RatioNumerator : REAL;
RatioDenominator : REAL;
MasterValueSource : MC_SOURCE;
MasterSyncPosition : REAL;
SlaveSyncPosition : REAL;
SyncMode : MC_SYNC_MODE;
MasterStartDistance : REAL;
Velocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD PhasingAbsolute : itfSynchronizedCommand
VAR_INPUT
Master : itfAxis;
PhaseShift : REAL;
Velocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD PhasingRelative : itfSynchronizedCommand
VAR_INPUT
Master : itfAxis;
PhaseShift : REAL;
Velocity : REAL;
Acceleration : REAL;
Deceleration : REAL;
Jerk : REAL;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD
METHOD CombineAxes : itfSynchronizedCommand
VAR_INPUT
Master1 : itfAxis;
Master2 : itfAxis;
CombineMode : MC_COMBINE_MODE;
GearRatioNumeratorM1 : INT;
GearRatioDenominatorM1 : INT;
GearRatioNumeratorM2 : INT;
GearRatioDenominatorM2 : INT;
MasterValueSourceM1 : MC_SOURCE;
MasterValueSourceM2 : MC_SOURCE;
BufferMode : MC_BUFFER_MODE;
END_VAR
END_METHOD