建云 2026-4-20 10:23:28 | 显示全部楼层 | 阅读模式

『7x24小时有问必答』

整体结构思路

典型结构分层大概是:

OB 层:

OB1 主循环,调用各功能块(FB),处理模式切换、报警汇总等。

FB 层:• FB_ModeManager:模式管理(手动/自动/半自动/调试等)。

FB_Interlock:联锁与安全逻辑。

FB_Sequence:顺序控制/步进控制(工艺流程)。

FB_Alarm:报警处理与记录。

FB_IOHandler:I/O 采集与输出缓冲(可选)。

DB 层:每个 FB 对应一个实例 DB(保存状态)。

全局配置 DB(参数、配方、系统配置等)。

下面用一个“设备单元”的框架来示例:一个设备有模式管理、联锁、顺控、报警。

全局数据块示例(配置与状态)

// DB_GlobalConfig:全局配置与状态(示例)

DATA_BLOCK "DB_GlobalConfig"

   VAR

      // 设备模式

      Mode_Auto         : BOOL := TRUE;    // 自动模式允许

      Mode_Manual      : BOOL := TRUE;    // 手动模式允许

      Mode_SemiAuto   : BOOL := FALSE;   // 半自动模式允许

      // 报警相关

      Alarm_Enable    : BOOL := TRUE;

      Alarm_ResetCmd : BOOL := FALSE;

      // 工艺参数示例

      Param_CycleTime       : TIME := T#5S;    // 一个节拍时间

      Param_Timeout_Move   : TIME := T#10S;   // 运动超时

      Param_Timeout_Clamp : TIME := T#3S;    // 夹紧超时

      // 系统状态

      SystemReady       : BOOL := FALSE;

      SystemError       : BOOL := FALSE;

      SystemWarning    : BOOL := FALSE;

   END_VAR

BEGIN

END_DATA_BLOCK

OB1 主程序框架(核心调度)

// OB1:主循环

ORGANIZATION_BLOCK "Main_OB1"

   VAR_TEMP

      // 临时变量

   END_VAR

   VAR

      // 实例 DB 变量(也可以在外部单独建 DB)

      ModeMgr_Inst    : "FB_ModeManager";

      Interlock_Inst : "FB_Interlock";

      Seq_Inst          : "FB_Sequence";

      Alarm_Inst       : "FB_Alarm";

   END_VAR

BEGIN

   // 1. 模式管理

   ModeMgr_Inst(

      iStartAuto         := "I_StartAuto",

      iStartManual      := "I_StartManual",

      iStop                := "I_Stop",

      iReset               := "I_Reset",

iModeAutoEnable:= "DB_GlobalConfig".Mode_Auto,

iModeManEnable:= "DB_GlobalConfig".Mode_Manual,

iModeSemiEnable:= "DB_GlobalConfig".Mode_SemiAuto,

      qModeAuto          => "M_ModeAuto",

      qModeManual       => "M_ModeManual",

      qModeSemiAuto    => "M_ModeSemiAuto",

      qSystemRun         => "M_SystemRun",

      qSystemStop       => "M_SystemStop",

      qSystemReset      => "M_SystemReset"

   );

   // 2. 联锁与安全

   Interlock_Inst(

      iEStop               := "I_EStop",

      iSafetyDoor       := "I_SafetyDoor",

      iAirPressureOK   := "I_AirOK",

      iSystemRun         := "M_SystemRun",

      qInterlockOK      => "M_InterlockOK",

      qSafetyError      => "M_SafetyError"

   );

   // 3. 顺序控制(工艺流程)

   Seq_Inst(

      iModeAuto          := "M_ModeAuto",

      iModeManual       := "M_ModeManual",

      iSystemRun         := "M_SystemRun",

      iInterlockOK      := "M_InterlockOK",

      iStartCycle       := "I_StartCycle",

      iManualStepFwd   := "I_ManualStepFwd",

      iManualStepBwd   := "I_ManualStepBwd",

      qCycleActive      => "M_CycleActive",

      qStepNumber       => "MW_StepNumber",

      qProcessDone      => "M_ProcessDone",

      qProcessError    => "M_ProcessError"

   );

   // 4. 报警处理

   Alarm_Inst(

iAlarmEnable:= "DB_GlobalConfig".Alarm_Enable,

iAlarmResetCmd:= "DB_GlobalConfig".Alarm_ResetCmd,

      iSafetyError      := "M_SafetyError",

      iProcessError    := "M_ProcessError",

      qAnyAlarm          => "M_AnyAlarm",

      qAlarmCode         => "MW_AlarmCode"

   );

   // 5. 系统状态汇总

"DB_GlobalConfig".SystemReady:= M_InterlockOK AND NOT M_AnyAlarm;

"DB_GlobalConfig".SystemError:= M_AnyAlarm;

   "DB_GlobalConfig".SystemWarning := FALSE; // 可扩展

END_ORGANIZATION_BLOCK

注:"I_..."、"M_..."、"Q_..." 只是示意,你可以按自己项目的 Tag 命名规范来。

FB_ModeManager:模式与运行控制

FUNCTION_BLOCK "FB_ModeManager"

   VAR_INPUT

      iStartAuto         : BOOL;

      iStartManual      : BOOL;

      iStop                : BOOL;

      iReset               : BOOL;

      iModeAutoEnable : BOOL;

      iModeManEnable   : BOOL;

      iModeSemiEnable : BOOL;

   END_VAR

   VAR_OUTPUT

      qModeAuto      : BOOL;

      qModeManual   : BOOL;

      qModeSemiAuto: BOOL;

      qSystemRun    : BOOL;

      qSystemStop   : BOOL;

      qSystemReset : BOOL;

   END_VAR

   VAR

      rTrigStartAuto    : R_TRIG;

      rTrigStartManual : R_TRIG;

      rTrigStop            : R_TRIG;

      rTrigReset          : R_TRIG;

   END_VAR

BEGIN

   // 上升沿检测

   rTrigStartAuto(CLK := iStartAuto);

   rTrigStartManual(CLK := iStartManual);

   rTrigStop(CLK := iStop);

   rTrigReset(CLK := iReset);

   // 模式切换逻辑(示例:互斥模式)

   IF rTrigStartAuto.Q AND iModeAutoEnable THEN

      qModeAuto       := TRUE;

      qModeManual    := FALSE;

      qModeSemiAuto := FALSE;

   END_IF;

   IF rTrigStartManual.Q AND iModeManEnable THEN

      qModeAuto       := FALSE;

      qModeManual    := TRUE;

      qModeSemiAuto := FALSE;

   END_IF;

   // 半自动模式可根据需要增加按键或条件

   // ...

   // 运行/停止逻辑

   IF (qModeAuto OR qModeManual OR qModeSemiAuto) AND NOT iStop THEN

      qSystemRun := TRUE;

      qSystemStop := FALSE;

   END_IF;

   IF rTrigStop.Q THEN

      qSystemRun := FALSE;

      qSystemStop := TRUE;

   END_IF;

   // 复位逻辑

   IF rTrigReset.Q THEN

      qSystemRun    := FALSE;

      qSystemStop   := FALSE;

      qSystemReset := TRUE;

   ELSE

      qSystemReset := FALSE;

   END_IF;

END_FUNCTION_BLOCK

FB_Interlock:安全与联锁

FUNCTION_BLOCK "FB_Interlock"

   VAR_INPUT

      iEStop             : BOOL;

      iSafetyDoor      : BOOL;    // TRUE = 门关好

      iAirPressureOK : BOOL;

      iSystemRun       : BOOL;

   END_VAR

   VAR_OUTPUT

      qInterlockOK : BOOL;

      qSafetyError : BOOL;

   END_VAR

   VAR

      SafetyError_Int : BOOL;

   END_VAR

BEGIN

   // 联锁条件:急停未按下、门关好、气压正常

   qInterlockOK := (NOT iEStop) AND iSafetyDoor AND iAirPressureOK;

   // 安全错误:系统要求运行但联锁不满足

   SafetyError_Int := iSystemRun AND NOT qInterlockOK;

   qSafetyError := SafetyError_Int;

END_FUNCTION_BLOCK

FB_Sequence:顺序控制(步进/状态机)这里用一个简单的步进顺控示例(Step 0~3),你可以扩展为更复杂的状态机。

FUNCTION_BLOCK "FB_Sequence"

   VAR_INPUT

      iModeAuto         : BOOL;

      iModeManual      : BOOL;

      iSystemRun       : BOOL;

      iInterlockOK    : BOOL;

      iStartCycle      : BOOL;

      iManualStepFwd : BOOL;

      iManualStepBwd : BOOL;

   END_VAR

   VAR_OUTPUT

      qCycleActive : BOOL;

      qStepNumber   : INT;

      qProcessDone : BOOL;

      qProcessError: BOOL;

   END_VAR

   VAR

      rTrigStartCycle : R_TRIG;

      rTrigStepFwd      : R_TRIG;

      rTrigStepBwd      : R_TRIG;

      Step                  : INT;

      Timer_Step         : TON;

   END_VAR

BEGIN

   rTrigStartCycle(CLK := iStartCycle);

   rTrigStepFwd(CLK := iManualStepFwd);

   rTrigStepBwd(CLK := iManualStepBwd);

   // 自动模式:从 Step 0 开始

   IF iModeAuto AND iSystemRun AND iInterlockOK THEN

      IF rTrigStartCycle.Q AND (Step = 0) THEN

         Step := 1;

         qCycleActive := TRUE;

         qProcessDone := FALSE;

         qProcessError := FALSE;

      END_IF;

   END_IF;

   // 手动模式:允许步进前后

   IF iModeManual THEN

      IF rTrigStepFwd.Q THEN

         Step := Step + 1;

      END_IF;

      IF rTrigStepBwd.Q THEN

         Step := Step - 1;

         IF Step < 0 THEN

            Step := 0;

         END_IF;

      END_IF;

   END_IF;

   // 简单顺控示例

   CASE Step OF

      0: // 待机

         qCycleActive := FALSE;

      1: // 步骤1:例如夹紧

         // Q_Clamp := TRUE;   // 在 IO 处理 FB 中实现

         Timer_Step(IN := TRUE, PT := "DB_GlobalConfig".Param_Timeout_Clamp);

         IF Timer_Step.Q THEN

            Step := 2;

            Timer_Step(IN := FALSE);

         END_IF;

      2: // 步骤2:例如移动

         // Q_Move := TRUE;

         Timer_Step(IN := TRUE, PT := "DB_GlobalConfig".Param_Timeout_Move);

         IF Timer_Step.Q THEN

            Step := 3;

            Timer_Step(IN := FALSE);

         END_IF;

      3: // 步骤3:完成

         qProcessDone := TRUE;

         qCycleActive := FALSE;

         Step := 0;

      ELSE

         // 异常步号

         qProcessError := TRUE;

         qCycleActive   := FALSE;

         Step := 0;

   END_CASE;

   qStepNumber := Step;

   // 若联锁丢失或系统停止,强制回到安全状态

   IF (NOT iInterlockOK) OR (NOT iSystemRun) THEN

      Step := 0;

      qCycleActive := FALSE;

   END_IF;

END_FUNCTION_BLOCK

FB_Alarm:报警处理框架

FUNCTION_BLOCK "FB_Alarm"

VAR_INPUT

      iAlarmEnable    : BOOL;

      iAlarmResetCmd : BOOL;

      iSafetyError    : BOOL;

      iProcessError   : BOOL;

   END_VAR

   VAR_OUTPUT

      qAnyAlarm   : BOOL;

      qAlarmCode : INT;    // 简单示例:1=安全报警,2=工艺报警...

   END_VAR

   VAR

      AlarmCode_Int : INT;

   END_VAR

BEGIN

   IF NOT iAlarmEnable THEN

      qAnyAlarm   := FALSE;

      qAlarmCode := 0;

      RETURN;

   END_IF;

   // 报警优先级示例:安全 > 工艺

   AlarmCode_Int := 0;

   IF iSafetyError THEN

      AlarmCode_Int := 1;

   ELSIF iProcessError THEN

      AlarmCode_Int := 2;

   END_IF;

   IF AlarmCode_Int > 0 THEN

      qAnyAlarm   := TRUE;

      qAlarmCode := AlarmCode_Int;

   ELSE

      qAnyAlarm   := FALSE;

      qAlarmCode := 0;

   END_IF;

   // 复位命令

   IF iAlarmResetCmd THEN

      qAnyAlarm   := FALSE;

      qAlarmCode := 0;

   END_IF;

END_FUNCTION_BLOCK

如何在项目中落地使用

1. 先定规范:I/O 命名规则(I_, Q_, M_, DB_…)。

模式定义、报警编码表、步进号含义表。

2. 建立基础 FB:模式、联锁、顺控、报警作为“通用模块”,多个设备单元可复用。

3. 每个设备单元一个“设备 FB”:内部再调用这些通用 FB,并加上本设备的专用逻辑。

4. OB1 只做“调度与汇总”:调用各设备 FB,做系统级状态与报警汇总。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码