Beckhoff(倍福)PLC 顺控程序转换条件解读
一、请求机器人上件步
二、程序代码解释:1、程序代码1:
1、程序代码:
fbVar_TonDelay2(IN := (bInPartPresentLeft AND bInPartPresentRight), PT := T#100MS);(* Go to the next step *)
stVar_SEQ.bTOK := stVar_SEQ.bRELEASE AND(stGV_SYS_ELEMENTS.arstELEMENT[idxProtectionSlider].stFeedBack.stSTATE.bIN_HPOR bEmptyModeInProgress(* Single part with delay *)OR fbVar_TonDelay.Q(* Two parts loaded *)OR fbVar_TonDelay2.Q);
1.1、代码解释:
第一部分:定时器控制逻辑
fbVar_TonDelay2(IN := (bInPartPresentLeft AND bInPartPresentRight), PT := T#100MS);
- 功能:启动一个 100 毫秒的定时器(
fbVar_TonDelay2
)。 - 触发条件:当左右两侧的零件检测传感器(
bInPartPresentLeft
和bInPartPresentRight
)同时检测到零件时,定时器开始计时。 - 输出结果:
fbVar_TonDelay2.Q
:定时器计时完成后变为TRUE
,表示 "两个零件均已到位且稳定"。
第二部分:步骤转换条件
stVar_SEQ.bTOK := stVar_SEQ.bRELEASE AND(stGV_SYS_ELEMENTS.arstELEMENT[idxProtectionSlider].stFeedBack.stSTATE.bIN_HPOR bEmptyModeInProgressOR fbVar_TonDelay.QOR fbVar_TonDelay2.Q);
- 核心逻辑:当满足以下所有条件时,设置
bTOK
(步骤完成标志)为TRUE
,触发状态机进入下一步:- 释放条件满足:
stVar_SEQ.bRELEASE
必须为TRUE
(通常表示当前步骤允许结束)。 - 或条件满足其一:
- 保护滑块到位:
bIN_HP
为TRUE
,表示机械防护装置已正确定位。 - 空运行模式:
bEmptyModeInProgress
为TRUE
,允许跳过零件检测直接执行。 - 单零件延迟完成:
fbVar_TonDelay.Q
为TRUE
(代码中未显示该定时器的触发逻辑,但推测为单侧零件检测的延迟)。 - 双零件延迟完成:
fbVar_TonDelay2.Q
为TRUE
(即左右零件同时到位并稳定 100ms)。
- 保护滑块到位:
- 释放条件满足:
1.2 整体逻辑解析
- 双零件检测:当左右两侧同时检测到零件时,启动 100ms 定时器(防抖动或稳定检测)。
- 步骤放行条件:
- 优先检查保护装置状态(安全机制)。
- 支持空运行模式(调试或维护需求)。
- 兼容单零件和双零件处理:
- 单零件:依赖
fbVar_TonDelay
(单侧检测延迟)。 - 双零件:依赖
fbVar_TonDelay2
(双侧检测延迟)。
- 单零件:依赖
- 状态转换:当
bTOK
被置为TRUE
时,通常会触发 SFC(顺序功能图)的步骤转换
2、程序代码2
2.1 代码
stvar_seq.bDisableTimeout := TRUE;stGV_Rotary_To_Mitsubishi.bRequestLoad := NOT bEmptyModeInProgress AND NOT bGV_FirstPartBuilded AND NOT bInPartPresentLeft ;IF PRG_Cell2.st_SHOW.bFirstPart_Active AND stGV_Rotary_From_Mitsubishi.bPartPlaced THEN // 首件已选择 终止Roller3# 请求抓取bGV_FirstPartBuilded:=TRUE;END_IF//stVar_SEQ.bTOK:= GVL_Robot.stGV_ABBRobotIF.IN.i_bLoadEnd_ToNest1 OR bEmptyModeInProgress ;stVar_SEQ.bTOK:= stGV_Rotary_From_Mitsubishi.bPartPlacedOR (PRG_Cell2.st_SHOW.bFirstPart_Active AND bGV_FirstPartBuilded ) OR bEmptyModeInProgress ;
2.2 代码解释
第一部分:禁用超时与装载请求
stvar_seq.bDisableTimeout := TRUE;
stGV_Rotary_To_Mitsubishi.bRequestLoad := NOT bEmptyModeInProgress AND NOT bGV_FirstPartBuilded AND NOT bInPartPresentLeft;
-
禁用超时功能:
stvar_seq.bDisableTimeout := TRUE
:在当前步骤中禁用超时检测,防止因操作时间较长而触发超时错误。
-
请求零件装载:
- 触发条件:当以下三个条件同时满足时,向三菱控制器发送装载请求:
- 非空运行模式:
NOT bEmptyModeInProgress
(空运行模式下跳过实际装载)。 - 非首件已建立:
NOT bGV_FirstPartBuilded
(首件产品的处理流程不同)。 - 左侧无零件:
NOT bInPartPresentLeft
(确保左侧工位为空,避免重复装载)。
- 非空运行模式:
- 触发条件:当以下三个条件同时满足时,向三菱控制器发送装载请求:
第二部分:首件产品状态更新
IF PRG_Cell2.st_SHOW.bFirstPart_Active AND stGV_Rotary_From_Mitsubishi.bPartPlaced THENbGV_FirstPartBuilded := TRUE;
END_IF
- 功能:标记首件产品已成功放置。
- 触发条件:
- 首件激活:
PRG_Cell2.st_SHOW.bFirstPart_Active
为TRUE
(表示当前正在处理首件产品)。 - 零件已放置:
stGV_Rotary_From_Mitsubishi.bPartPlaced
为TRUE
(旋转台已成功放置零件)。
- 首件激活:
- 结果:设置
bGV_FirstPartBuilded
为TRUE
,后续流程将不再按首件处理。
第三部分:步骤完成条件
stVar_SEQ.bTOK := stGV_Rotary_From_Mitsubishi.bPartPlacedOR (PRG_Cell2.st_SHOW.bFirstPart_Active AND bGV_FirstPartBuilded)OR bEmptyModeInProgress;
- 功能:设置步骤完成标志(
bTOK
),触发状态机进入下一步。 - 触发条件(满足任一即可):
- 零件已放置:
stGV_Rotary_From_Mitsubishi.bPartPlaced
为TRUE
(正常装载完成)。 - 首件处理完成:
PRG_Cell2.st_SHOW.bFirstPart_Active
为TRUE
(首件模式激活)。bGV_FirstPartBuilded
为TRUE
(首件已成功建立)。
- 空运行模式:
bEmptyModeInProgress
为TRUE
(调试模式下直接跳过)。
- 零件已放置:
2.3 整体逻辑解析
-
首件产品特殊处理:
- 首件需要人工干预或特殊配置(通过
bFirstPart_Active
标记)。 - 首件成功放置后,系统自动切换为正常生产模式(
bGV_FirstPartBuilded
)。
- 首件需要人工干预或特殊配置(通过
-
防重复装载:
- 通过
NOT bInPartPresentLeft
确保左侧工位无零件时才请求装载。 - 首件建立后(
bGV_FirstPartBuilded
)不再发送装载请求,可能依赖其他供料方式。
- 通过
-
模式兼容:
- 支持正常生产(零件装载)、首件生产(特殊流程)和空运行(调试)三种模式。
- 通过
bTOK
统一触发步骤转换,简化状态机逻辑。
三、ST01 工位程序
3.1 ST01 FB_SYS_SEQ_CONTROL_SFC_V1_0 功能块内程序
3.2 代码
stInOut_SEQ.stStep.enResultTransition := TNOK;(*Next Step*)
IF NOT bIn_SFCTransDoneAND ((stInOut_SEQ.bTOKOR stInOut_SEQ.bWOT)AND ( NOT bIn_CMD_Sequence_StepOR ( bIn_CMD_Sequence_StepAND ( bVar_IP_Step_ButtonOR stInOut_SEQ.bWOT))))THEN // 解析: SFCTrans =0 + SEQ.bTok/ SEQ.bWOT + Sequence_Step =0 /Sequence_Step =1 + Step触发 /SEQ.bWOT <===> // SFC 执行中 把 LabelA =1 赋值到 enResultTransition 结果中 (即 stInOut_SEQ.bTOK = 1 时 赋值 过渡结果值 LabelA=1)(*Reset Binary Flags*)stInOut_SEQ.bTOK := FALSE;stInOut_SEQ.bDisableTimeout := FALSE;stInOut_SEQ.bIP_Release := FALSE;(* *)stInOut_SEQ.stStep.enResultTransition := stInOut_SEQ.stStep.enNextTransition;(*write next step to actual step*)stInOut_SEQ.stStep.enNextTransition := labelA;END_IF
3.3 代码解释
第一部分:初始状态设置
st
stInOut_SEQ.stStep.enResultTransition := TNOK;
- 功能:将当前步骤的执行结果设为未完成(TNOK 通常表示 "Transition Not OK")。
- 作用:在进入条件判断前初始化状态,防止脏数据影响后续逻辑。
第二部分:步骤转换条件判断
st
IF NOT bIn_SFCTransDoneAND ((stInOut_SEQ.bTOK OR stInOut_SEQ.bWOT)AND (NOT bIn_CMD_Sequence_StepOR (bIn_CMD_Sequence_Step AND (bVar_IP_Step_Button OR stInOut_SEQ.bWOT)))) THEN
- 触发条件(需同时满足):
- SFC 转换未完成:
NOT bIn_SFCTransDone
- 步骤激活条件:
stInOut_SEQ.bTOK
为TRUE
(当前步骤完成)或stInOut_SEQ.bWOT
为TRUE
(无需令牌,强制执行下一步)
- 步骤执行模式:
- 自动模式:
NOT bIn_CMD_Sequence_Step
(允许自动切换步骤)或 - 手动模式:
bIn_CMD_Sequence_Step
为TRUE
且满足:bVar_IP_Step_Button
为TRUE
(手动按钮触发)或stInOut_SEQ.bWOT
为TRUE
(强制跳过手动确认)
- 自动模式:
- SFC 转换未完成:
第三部分:状态重置与步骤更新
(*Reset Binary Flags*)
stInOut_SEQ.bTOK := FALSE;
stInOut_SEQ.bDisableTimeout := FALSE;
stInOut_SEQ.bIP_Release := FALSE;(*Update Transition*)
stInOut_SEQ.stStep.enResultTransition := stInOut_SEQ.stStep.enNextTransition;
stInOut_SEQ.stStep.enNextTransition := labelA;
-
状态重置:
bTOK
:清除步骤完成标志,准备下一次触发bDisableTimeout
:重新启用超时检测(防止长时间阻塞)bIP_Release
:重置资源释放标志
-
步骤转换:
enResultTransition := enNextTransition
:将预定义的下一步(enNextTransition
)设为当前执行结果enNextTransition := labelA
:将后续目标步骤设为labelA
(通常是流程中的特定分支)
3.3 整体逻辑解析
这段代码实现了一个双缓冲状态机机制:
- 初始状态:将当前步骤标记为未完成(TNOK)
- 条件检查:验证是否满足步骤转换的所有条件(自动 / 手动模式、完成标志等)
- 状态迁移:
- 使用
enResultTransition
作为当前执行状态 - 使用
enNextTransition
作为预定义的下一步 - 通过
labelA
实现分支跳转(类似 GOTO,但更安全)
- 使用
- 安全机制:
- 自动重置关键标志,防止状态滞留
- 支持手动干预和自动运行两种模式
-
超时检测机制(通过
bDisableTimeout
控制)