全局变量-Main

//{attribute 'qualified_only'} 这句要注释掉,否则有范围限制,需要使用Main.变量
VAR_GLOBAL
//------2种报警功能声明-----------------------
    FB_启动报警 : YJ_BeepAlarm;
    FB_缺料报警 : YJ_BeepAlarm;
END_VAR

FB功能块-局部变量

    FB功能块中有输入变量部分,输出变量部分以及程序内使用到的局部变量

//--代码作者: 朱子文------------------
FUNCTION_BLOCK YJ_BeepAlarm
//---局部变量-------------------------
VAR_INPUT
    ib_报警启动        :    BOOL;
    ib_报警停止        :    BOOL;
    if_报警周期        :    REAL;//周期设置,单位ms
    if_报警占比        :    REAL;//0-1,代表周期中高低电平的占空比
    id_报警次数        :    DINT;//报警次数为0,则报警输出一直输出报警信号
END_VAR

//---输出变量-------------------------
VAR_OUTPUT
    ob_报警完成        :    BOOL;//如果报警次数为0,则报警完成无效
    ob_报警输出        :    BOOL;
END_VAR

//---程序自用局部变量------------------
VAR
    vt_Time            :    TON;
    vb_Out            :    BOOL;
    vr_RunTrig        :    R_TRIG;
    vr_AlarmTrig        :    R_TRIG;
    vr_StopTrig        :    R_TRIG;
    vd_报警次数        :    DINT;
    vb_报警启动        :    BOOL;
    vb_报警停止        :    BOOL;
END_VAR

FB功能块中的程序

//------参数设置------------------------
if_报警占比                := LIMIT(0,if_报警占比,1.0);
IF if_报警周期 <= 0 THEN
    if_报警周期            := 100;
END_IF

IF id_报警次数 < 0 THEN
    id_报警次数            := 0;
END_IF

vb_报警启动                S= ib_报警启动;
vb_报警停止                S= ib_报警停止;

//------上升沿复位报警完成标志位--------
vr_RunTrig(
    CLK:= vb_报警启动, 
    Q=> );
ob_报警完成                R= vr_RunTrig.Q;

vr_StopTrig(
    CLK:= ib_报警停止, 
    Q=> );
IF vr_StopTrig.Q AND vb_报警启动 THEN
    ob_报警完成            := FALSE;
    ob_报警输出            := FALSE;
    vb_报警启动            := FALSE;
    vb_Out                := FALSE;
    vd_报警次数            := 0;
END_IF

//------定时时间输出--------------------
vt_Time(
    IN:= vb_报警启动 AND (NOT vt_Time.Q), 
    PT:= REAL_TO_TIME(if_报警周期), 
    Q=> , 
    ET=> );
vb_Out                     := (vb_报警启动 AND (TIME_TO_REAL(vt_Time.ET) <= (if_报警周期 * if_报警占比)));

vr_AlarmTrig(
    CLK:= vb_Out, 
    Q=> );

//------报警输出------------------------
IF id_报警次数 = 0 THEN
    ob_报警输出            := vb_Out;
    ob_报警完成            := FALSE;
ELSE
    IF vr_AlarmTrig.Q AND (NOT ob_报警完成) THEN
        vd_报警次数        := vd_报警次数 + 1;
    END_IF
    IF vd_报警次数 <= id_报警次数 AND (NOT ob_报警完成) THEN
        ob_报警输出        := vb_Out;
    ELSE
        vd_报警次数        := 0;
        ob_报警输出        := FALSE;
        ob_报警完成        := TRUE;
        vb_报警启动        R= TRUE;
    END_IF
END_IF

PRG函数中局部变量

PROGRAM PLC_PRG
VAR
    gr_停止RTrig            : R_TRIG;
    vb_启动信号                : BOOL;
    vb_停止信号                : BOOL;
    vb_RunAlramDone            : BOOL;
    vb_RunAlarmOut            : BOOL;

    vf_启动报警周期            : REAL;
    vf_启动报警占空比        : REAL;
    vi_启动报警次数            : DINT;

    vb_缺料信号                : BOOL;
    vb_ShortageAlarmDone    : BOOL;
    vb_ShortageAlarmOut        : BOOL;
END_VAR

PRG程序内容

gr_停止RTrig(CLK:= vb_停止信号, Q=> );

vf_启动报警周期                := 1000;
vf_启动报警占空比            := 0.4;
vi_启动报警次数                := 5;

//------启动报警功能块的调用--------------------
FB_启动报警(
    ib_报警启动:= vb_启动信号,
    ib_报警停止:= gr_停止RTrig.Q,
    if_报警周期:= vf_启动报警周期,
    if_报警占比:= vf_启动报警占空比,
    id_报警次数:= vi_启动报警次数,
    ob_报警完成=> vb_RunAlramDone,
    ob_报警输出=> vb_RunAlarmOut);

//-------缺料报警停机功能--------------------------
FB_缺料报警(
    ib_报警启动:= vb_缺料信号,
    ib_报警停止:= gr_停止RTrig.Q,
    if_报警周期:= 500,
    if_报警占比:= 0.3,
    id_报警次数:= 3,
    ob_报警完成=> vb_ShortageAlarmDone,
    ob_报警输出=> vb_ShortageAlarmOut);

    本套程序麻雀虽小五脏俱全,包含了ST语言以及Codesys平台编程的大部分知识点。具体代码的解析,请见我们下回分解~

Copyright © www.yanjuntech.cn 2018-2025 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 23:30:34

results matching ""

    No results matching ""