2. PLCopen基础
在进入PLCopen状态编程的实战之前,必须先厘清三个支撑性的知识支柱:IEC 61131-3标准定义了PLC编程语言的语法与软件模型,PLCopen运动控制规范在IEC 61131-3之上抽象出统一的运动控制功能块接口,而状态机则是我们将复杂运动过程分解为稳定、可管理状态的核心思维工具。这三者并非彼此孤立——IEC 61131-3提供了“容器”,PLCopen提供了“接口”,状态机提供了“行为逻辑”。理解它们之间的关系,是后续编写可维护、可诊断的运动控制程序的前提。
IEC 61131-3标准:PLC编程的“语法底座”
IEC 61131-3是国际电工委员会制定的PLC编程语言标准,它统一了此前各大厂商各自为政的编程风格。对于运动控制工程师而言,该标准最重要的贡献在于定义了软件模型和编程语言两个维度。软件模型从上到下依次为:配置(Configuration)、资源(Resource)、任务(Task)、程序(Program)、功能块(Function Block)和函数(Function)。运动控制程序通常运行在周期性任务中,而PLCopen功能块正是以功能块的形式嵌入到这个模型中的。
在语言层面,IEC 61131-3规定了五种语言:结构化文本(ST)、梯形图(LD)、功能块图(FBD)、顺序功能图(SFC)和指令表(IL)。在PLCopen状态编程实践中,ST语言因其类似高级语言的语法,最适合编写状态机逻辑;而SFC语言本身具备状态转移的图形化表达,适合描述顺序流程,但在处理复杂运动控制的状态诊断时,ST的灵活性更胜一筹。需要强调的是,标准本身并不强制使用哪种语言,但PLCopen功能块的调用、状态枚举的比较、转移条件的判断,在ST中表达最为清晰。
核心要点:IEC 61131-3的软件模型决定了PLCopen功能块必须被组织在程序(PRG)中,并由任务(Task)周期性调用。运动控制程序通常使用“固定周期任务”来保证位置环和速度环的实时性,而状态机逻辑可以放在同一任务或较低优先级的任务中,但必须保证状态转移的响应时间满足设备节拍要求。
PLCopen运动控制规范:标准化的“运动指令库”
PLCopen运动控制规范(通常指Part 1)定义了一组标准的功能块,用于控制单轴和多轴运动。这些功能块包括:MC_Power(使能轴)、MC_Home(回原点)、MC_MoveAbsolute(定位)、MC_MoveRelative(相对定位)、MC_MoveVelocity(速度模式)、MC_Stop(停止)、MC_Halt(暂停)等。每个功能块都有标准的输入(Execute、Position、Velocity等)和输出(Done、Busy、CommandAborted、Error等)。
PLCopen规范还定义了轴状态机,这是PLCopen状态编程中必须理解的核心概念。轴状态包括:Disabled(未使能)、Standstill(静止)、Homing(回原点中)、Discrete Motion(离散运动)、Continuous Motion(连续运动)、Synchronized Motion(同步运动)和 Stopping(停止中)。这些状态由PLCopen功能块的执行自动驱动,但用户程序中的状态机必须与轴状态机协同工作。例如,当轴处于Stopping状态时,用户状态机不应发出新的运动指令,否则会导致CommandAborted。
| PLCopen轴状态 | 触发条件 | 用户状态机对应动作 |
|---|---|---|
| Disabled | MC_Power使能输入为FALSE | 禁止发送任何运动指令 |
| Standstill | 上电完成或运动结束 | 允许执行回原点或定位指令 |
| Homing | MC_Home的Execute上升沿 | 等待HomeDone,期间禁止其他运动 |
| Discrete Motion | MC_MoveAbsolute/MoveRelative执行中 | 监控Busy和Done,处理中断条件 |
| Stopping | MC_Stop执行或故障触发 | 进入停止流程,等待轴静止 |
状态机基本概念:从“流程图思维”到“状态思维”
状态机(State Machine)是一种描述系统在离散时间点上行为变化的模型。它由四个要素组成:状态(State)、转移(Transition)、事件(Event)和动作(Action)。在PLCopen状态编程中,我们通常使用“有限状态机”(FSM),即状态数量有限且可枚举。例如,一个简单的搬运轴程序可以划分为:IDLE(空闲)、HOMING(回零)、READY(就绪)、MOVING(移动中)、COMPLETE(完成)和 FAULT(故障)六个状态。
状态机的核心价值在于强制逻辑的确定性。在传统的梯形图编程中,工程师往往使用M继电器和SET/RST指令组合,当程序规模增大时,线圈的置位/复位顺序极易产生竞争和遗漏。而状态机通过“当前状态+转移条件”的唯一组合来决定下一状态,从结构上消除了逻辑歧义。在ST语言中,一个典型的状态机实现通常采用CASE语句:
CASE state OF
IDLE:
IF bStart THEN
state := HOMING;
bStart := FALSE;
END_IF;
HOMING:
IF MC_Home.Done THEN
state := READY;
ELSIF MC_Home.Error THEN
state := FAULT;
END_IF;
READY:
IF bMoveReq THEN
state := MOVING;
bMoveReq := FALSE;
END_IF;
MOVING:
IF MC_MoveAbsolute.Done THEN
state := COMPLETE;
ELSIF bStopReq THEN
state := FAULT;
END_IF;
COMPLETE:
IF bReset THEN
state := IDLE;
END_IF;
FAULT:
IF bReset AND bFaultAck THEN
state := IDLE;
END_IF;
END_CASE;
案例拆解:从轴状态到用户状态机的映射
下面通过一个具体的工程场景来理解三者的协同。假设我们有一台贴标机,需要控制一个旋转工作台每次旋转90度。设备要求:上电后先回原点,然后等待启动信号,每收到一次启动信号旋转90度,旋转到位后输出完成信号。若中途按下急停,轴必须立即停止并进入故障状态,复位后重新回原点。
初始现象与目标:使用PLCopen功能块实现旋转控制,但程序中出现“轴在运动过程中收到新指令导致CommandAborted”的偶发故障。目标是通过状态机重构,彻底消除指令冲突。
分析过程:检查PLCopen轴状态,发现当轴处于Discrete Motion时,如果用户程序再次调用MC_MoveAbsolute,前一个指令会被Abort。原程序没有检查轴状态,直接在每个扫描周期都触发Execute,导致冲突。
解决方案:设计用户状态机,将“轴状态”作为转移条件的一部分。在MOVING状态中,仅当MC_MoveAbsolute.Busy为FALSE且轴状态为Standstill时,才允许发起新的运动。同时,在FAULT状态中,先执行MC_Stop并等待轴状态变为Standstill,再执行MC_Reset清除错误。
结果对比:重构后,指令冲突完全消除。通过监控状态机的当前状态,调试人员可以直观地看到设备处于“等待回零”、“旋转中”还是“故障复位”,排障时间缩短约60%。
风险提示:状态机并非万能。如果状态划分过细,会导致程序冗长且转移条件复杂;如果状态划分过粗,又无法有效隔离异常。建议以“设备功能阶段”为粒度划分状态,每个状态内的动作应具有内聚性。另外,务必在FAULT状态中考虑“急停复位后是否需要重新回原点”等安全逻辑,避免设备在位置丢失的情况下继续运行。
常见误区与总结复盘
在PLCopen状态编程的入门阶段,工程师常犯以下错误:第一,将PLCopen轴状态与用户状态机混为一谈。轴状态是PLCopen功能块内部自动维护的,用户状态机是应用程序自己定义的,两者必须通过功能块的输出(如Busy、Done、Error)进行桥接,而不是直接读取轴状态变量。第二,在多个地方对同一状态变量赋值。状态机必须遵循“单点写入”原则,即状态变量只能在CASE语句的转移逻辑中被修改,其他逻辑只能读取。第三,忽略状态转移的“事件”属性。PLCopen功能块的Execute输入需要上升沿触发,如果使用电平触发,会导致指令重复执行。
总结来看,IEC 61131-3提供了编程的语法和任务模型,PLCopen提供了标准化的运动控制接口,而状态机则是将这些接口组织成可靠业务逻辑的架构方法。三者的关系可以类比为:IEC 61131-3是“语法书”,PLCopen是“标准零件库”,状态机是“装配图纸”。只有将图纸画清晰,零件才能发挥应有的作用。在后续章节中,我们将深入探讨如何利用PLCopen的轴状态和功能块输出,设计出健壮且易于调试的状态转移条件。
实战建议:在编写第一个状态机程序时,建议先在纸上画出状态转移图,标注每个状态的进入条件、退出条件和执行的动作。然后为每个状态分配一个枚举常量(如TYPE_STATE_IDLE := 0),并在ST程序中用CASE语句实现。调试时,将当前状态值映射到一个整型变量并放到HMI上显示,可以极大提升现场调试效率。