[西门子] 西门子单控气缸_带2个传感器FB块封装

[复制链接]
查看63110 | 回复0 | 2025-4-1 07:48:55 | 显示全部楼层 |阅读模式
西门子单控气缸带有两个传感器,并使用FB(功能块)进行封装,通常是指在自动化控制系统中用于实现特定动作或过程控制的一种组件。这里提到的“单控”指的是该气缸由单一信号控制其伸缩动作,“带2个传感器”则意味着有两个位置检测装置,通常用于检测气缸活塞的位置状态,比如完全伸出和完全缩回两种状态。


有需要交流学习的可以扫码加微信   备注加“交流群” 程序在文章最底部    唯一联系方式:15325623428(微信同号)

一、FB块封装的意义



    简化编程:通过将对气缸及其传感器的操作逻辑封装在一个功能块(FB)内,可以大大简化PLC程序的设计。这样做的好处是使得主程序更加清晰简洁,易于维护。

    提高复用性:一旦定义好这个FB,可以在不同的项目或者同一项目的不同地方重复使用它,只需调整输入输出参数即可适应不同的应用场景。

    增强可读性:对于其他工程师来说,看到一个专门的功能块比直接看复杂的梯形图或语句表更容易理解其设计意图。

    便于调试与维护:当需要修改某个气动元件的工作逻辑时,只需要在对应的FB内部进行修改,而不需要在整个程序中逐一查找相关的代码段。
二、应用场合



    自动化生产线:在自动化生产线上,气缸常用于搬运、分拣、组装等操作。通过传感器反馈,确保每个步骤准确无误地完成。

    包装机械:在包装过程中,用于纸箱折叠、封口等操作,确保包装过程的高效和精确。

    物料处理系统:如在仓库管理系统中,用于货物的自动存取,通过气缸的精准控制提升工作效率。

    质量检测设备:某些情况下,气缸也用来推动测试头接触待测物以进行物理性质的检测,传感器则用于确认是否达到了预定位置。

综上所述,西门子单控气缸带2个传感器的FB块封装是一种针对工业自动化领域中的执行机构及其检测手段的有效整合方式,旨在提供更便捷、高效的解决方案。
三、FB块封装






REGION Read the Data

    // manual control of the cylinder on

    IF #数据.Dataword.%X1 THEN

        #数据.Dataword.%X1 := false;

        IF (#移动面板_手动模式 OR #手动模式)

            AND (#允许去工作位 OR #屏蔽允许信号)

        THEN

            #S_bHmManual := true;

            #S_bManual := #S_bHmManual XOR #模式激活;

        END_IF;

    END_IF;

    // manual control of the cylinder off

    IF #数据.Dataword.%X0 THEN

        #数据.Dataword.%X0 := false;

        IF (#移动面板_手动模式 OR #手动模式)

            AND (#允许回原位 OR #屏蔽允许信号)

        THEN

            #S_bHmManual := false;

            #S_bManual := #S_bHmManual XOR #模式激活;

        END_IF;

    END_IF;

END_REGION

REGION Mode Control and reset Manual

    // different mode control

    IF (#S_bManual OR #移动面板_手动模式) AND NOT #归位模式 THEN

        #S_bHmY := #S_bHmManual;

    ELSIF #S_bManual AND #归位模式 THEN

        #模式激活 := #S_bHmManual;

    ELSE

        #S_bHmManual := #模式激活;

        #S_bHmY := #模式激活;

    END_IF;

    // reset manual control

    IF #S_bManual AND (#模式激活 = #S_bHmManual) AND NOT #移动面板_手动模式 THEN

        #S_bManual := false;

    END_IF;

END_REGION

REGION Timers and watch dog

    //Delay time for sensor A in position

    #S_tonDelayTimeSensorA(IN := #原位传感器,

                           PT := #原位传感器感应时间);

    //Delay time for sensor B in position

    #S_tonDelayTimeSensorB(IN := #工作位传感器,

                           PT := #工作位传感器感应时间);

    // Watch-dog

    #S_tonWd(IN :=#电磁阀OK AND ((#电磁阀输出 AND NOT #S_tonDelayTimeSensorB.Q) OR (NOT #电磁阀输出 AND NOT #S_tonDelayTimeSensorA.Q)),

             PT := #看门狗延时时间,

             Q => #S_bWdq);

    // Store old state of cylinder

    #S_bHmStoreY := #S_bHmY;

    // turn on

    IF #S_bHmY AND NOT #S_tonDelayTimeSensorB.Q THEN

        #数据.Time_WorkingPosition := TIME_TO_INT(#S_tonInPosOn.ET);

    END_IF;

    #S_tonInPosOn(IN := #S_bHmY AND NOT #S_tonDelayTimeSensorB.Q,

                  PT := t#10s);

    // turn off

    IF NOT #S_bHmY AND NOT #S_tonDelayTimeSensorA.Q THEN

        #数据.Time_HomePosition := TIME_TO_INT(#S_tonInPosOff.ET);

    END_IF;

    #S_tonInPosOff(IN := NOT #S_bHmY AND NOT #S_tonDelayTimeSensorA.Q,

                   PT := t#10s);

END_REGION

REGION Error Message   

    // Local Cylinder In Position manual and auto mode

    #S_bPosLocal := (

    #S_tonDelayTimeSensorA.Q

    AND NOT #S_tonDelayTimeSensorB.Q

    AND NOT #S_bHmY

    ) OR (

    NOT #S_tonDelayTimeSensorA.Q

    AND #S_tonDelayTimeSensorB.Q

    AND #S_bHmY

    );

    // Info Message for Manual Mode

    #手动错误 := #S_bManual;

    // error sensor A

    IF #S_bWdq AND (#S_tonDelayTimeSensorA.Q AND #电磁阀输出 OR NOT #S_tonDelayTimeSensorA.Q AND NOT #电磁阀输出) THEN

        #原位传感器故障 := true;

    END_IF;

    // error sensor B

    IF #S_bWdq AND (#S_tonDelayTimeSensorB.Q AND NOT #电磁阀输出 OR NOT #S_tonDelayTimeSensorB.Q AND #电磁阀输出) THEN

        #工作位传感器故障 := true;

    END_IF;

    // transfer error to output

    #气缸错误 := #原位传感器故障

            OR #工作位传感器故障

            OR #手动错误;

END_REGION

REGION Write the Data   

    // transfer error to screen block

    #数据.Dataword.%X10 := #气缸错误;

    // transfer the enable bit to the screen block in the panel or mobile panel

    #数据.Dataword.%X12 := (#移动面板_手动模式 OR #手动模式) AND (#允许回原位 OR #屏蔽允许信号);

    #数据.Dataword.%X13 := (#移动面板_手动模式 OR #手动模式) AND (#允许去工作位 OR #屏蔽允许信号);

    #数据.Dataword.%X14 := (#移动面板_手动模式 OR #手动模式) AND (#允许回原位 OR #屏蔽允许信号);

    #数据.Dataword.%X15 := (#移动面板_手动模式 OR #手动模式) AND (#允许去工作位 OR #屏蔽允许信号);

    // animation of the F-button on the mobile panel

    #测试按钮led灯 := #移动面板_手动模式 AND (#允许去工作位 AND NOT #S_bHmManual OR #允许回原位 AND #S_bHmManual OR #屏蔽允许信号);

    // rising trig for the F-button

    #S_rtFbutton(CLK := #气缸测试按钮);

    // activation over F-button

    IF #S_rtFbutton.Q

        AND #移动面板_手动模式

        AND (#允许去工作位 OR #允许回原位 OR #屏蔽允许信号)

    THEN

        IF #S_bHmManual THEN

            #数据.Dataword.%X0 := true;

        ELSE

            #数据.Dataword.%X1 := true;

        END_IF;

    END_IF;

    // show activation on HMI

    #数据.Dataword.%X9 := #S_bHmY;

    // cylinder in position auto mode

    #气缸就位 := #S_tonDelayTimeSensorA.Q

    AND NOT #S_tonDelayTimeSensorB.Q

    AND NOT #S_bHmY

    AND NOT #模式激活

    OR NOT #S_tonDelayTimeSensorA.Q

    AND #S_tonDelayTimeSensorB.Q

    AND #S_bHmY

    AND #模式激活;

    // show cylinder in position on HMI

    #数据.Dataword.%X7 := #气缸就位;

    // transfer sensor state to HMI screen block

    #数据.Dataword.%X2 := #S_tonDelayTimeSensorA.Q;

    #数据.Dataword.%X3 := #S_tonDelayTimeSensorB.Q;

    // transfer valve state to output

    #电磁阀输出 := #S_bHmY;

    #手动模式输出 := #S_bManual;

    #数据.Dataword.%X11 := #S_bManual;

    #原位输出 := NOT #电磁阀输出 AND #电磁阀OK; //AND (#I_bEnableHp OR #I_bEnableByPass);

    #工作位输出 := #电磁阀输出 AND #电磁阀OK; //AND (#I_bEnableWp OR #I_bEnableByPass);


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则