整体结构思路典型结构分层大概是: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_VARBEGINEND_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_VARBEGIN // 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_VARBEGIN // 上升沿检测 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 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_VARBEGIN // 联锁条件:急停未按下、门关好、气压正常 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_VARBEGIN 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_BLOCKFB_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_VARBEGIN 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,做系统级状态与报警汇总。 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |