这段代码实现了一个典型的步骤顺序控制逻辑,常用于自动化流程或状态机的编程。其核心思想是根据输入的步骤号、完成信号、延时和模式等条件,自动或手动推进流程步骤,并在特定时机触发进入、退出事件和暂停状态。
首先,代码初始化了一些关键变量,如 ENO(功能块使能输出)、bOutExitEvent(退出事件)、bOutEnterEvent(进入事件),都被设为 false,确保每次循环开始时状态清晰。
接下来,代码判断当前输入步骤号(iInStep)是否等于当前步骤(iCurrentStep)。如果相等,说明流程处于该步骤。此时,如果是首次进入该步骤(bAlreadyInThisStep 为 false),则触发进入事件(bOutEnterEvent 设为 true),并标记已进入该步骤,防止重复触发。
当步骤完成信号(bInStepDone)为真时,启动步骤延时定时器(TON_StepDelay),并判断是否需要延时(tInStepDelay 是否大于 0)。如果延时到达或无需延时,并且满足“自动模式”或“手动模式下已推进”的条件,且不是刚进入步骤(防止刚进入时立即切换),则切换到下一个步骤(iCurrentStep 赋值为 iInNextStep),重置定时器,触发退出事件,并清除已进入标志,为下一个步骤做准备。
此外,代码还判断是否处于暂停状态:只有在步骤完成、延时到达(或无需延时)、且为手动模式但未推进时,才会输出暂停信号(bOutPaused)。如果流程处于正确步骤,ENO 设为 true,表示功能块正常工作。
最后,若收到初始化信号(bInit),则将当前步骤重置为初始步骤(iInitStep),并清除初始化和已进入标志,确保初始化只执行一次。所有循环结束后,当前步骤号输出到外部变量(iOutCurrentStep),并将步骤延时重置为零,为下一次循环做好准备。