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_HP
		OR 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_HP
    OR bEmptyModeInProgress
    OR fbVar_TonDelay.Q
    OR 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.bPartPlaced
           OR (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 THEN
    bGV_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.bPartPlaced
              OR (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_SFCTransDone
	AND ((stInOut_SEQ.bTOK
		OR stInOut_SEQ.bWOT)
		AND	(	NOT bIn_CMD_Sequence_Step
			OR (	bIn_CMD_Sequence_Step
				AND (	bVar_IP_Step_Button
					OR	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_SFCTransDone
    AND ((stInOut_SEQ.bTOK OR stInOut_SEQ.bWOT)
    AND (NOT bIn_CMD_Sequence_Step
        OR (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(强制跳过手动确认)

第三部分:状态重置与步骤更新
(*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 控制)

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容