转换为用户自定义功能的功能块

将功能块转换为用户自定义功能以节省程序步骤

常规用途

这些功能的主要目的是简化功能(FUN)替换功能块(FB)的操作。单独子例行程序中的多个FB实例替换为某个子例行程序中的某个功能。

实例

功能块

转换后的功能

限制:

并非所有的Panasonic指令都可以在一个常用功能中使用。不能在一个常用功能中使用的指令示例:

  • 一些高速计数器指令,如F166_HighSpeedCounter_SetF165_HighSpeedCounter_Cam

  • 一些定位指令,如F166_PulseOutput_SetF171_PulseOutput_Trapezoidal

必须仔细检查此项。

优点:

  • 需要的程序代码少得多

  • 需要的中继(R)少得多

  • 可在使用内存DUT数组的循环中使用

缺点:

  • 需要额外的开发和维护工作

  • 必须很仔细地测试转换后的功能

  • 需要用户执行更多操作

  • 监控更加困难,因为您没有可监控的实例,只监控上一个调用

  • 可能需要更多数据寄存器(DT)

  • PLC性能降低,扫描时间增加

注释
  • 与定时器FB相比,定时器功能的行为可能略有不同。

  • 很仔细地测试新功能的行为是否与FB的行为相对应,特别是在多次调用新功能时。

使用建议:

  • 应仅在确实需要时使用功能而不是功能块。

  • 应仅在确实需要时尽量使用功能而不是功能块。

  • 很仔细地分析应转换哪个功能块,以最小的工作量获得最大的效益。

  • 决定是否应转换某功能块的主要标准是:该功能块多久调用一次?该功能块需要多少步骤?

估算可节省的程序代码步骤

这是计算可以节省多少程序代码步的公式。

当前情况如下:

  • 一个给定的功能块

  • 调用X次

  • 使用Y步=>总步数:X*Y步

  • 使用TONSR、脉冲标志

给定的FB可以替换为需要以下步数的功能:

  • 调用X次来复制两次内存DUT数据的额外步数,即大约X*2*7步(例如对于两个FP10_BKMV

  • Y*一个常用功能调用的2步(假设有一些额外步骤)

  • 以下项的常用调用:

    • TON_FUN使用xxx步

    • SR_FUN使用xxx步

    • R_TRIG_FUN使用xxx步

FP0H的计算示例

此计算示例只给出大概数字。

  • 一个给定的功能块

  • 调用30次

  • 使用750步=>总步数:30*750步=22500步

  • 使用TONSR、脉冲标志

给定的FB可以替换为需要以下步数的功能:

  • 调用30次来复制两次内存DUT数据的额外步数,即30*2*7步=420步(例如对于两个FP10_BKMV)

  • 750*一个常用功能调用的2步=1500步(假设有一些额外的步骤)

  • 以下项的常用调用:

    • TON_FUN使用200步

    • SR_FUN使用35步

    • R_TRIG_FUN使用35步

总步数:420步+1500步+200步+35步+35步=2190步

结果:使用此功能节省了大约22500步-2190步=20310步。

如何将功能块转换为用户自定义功能

从用户功能块XXX转换为功能XXX_FUN的过程

建议保留命名约定。

  1. 复制FBXXX并将其命名为XXX_FUN

    请保留FBXXX,不要删除它!

  2. 使用[POU属性]对话框将FB副本更改为功能
  3. 定义内存DUT,例如XXX_FUN_INSTANCE_DUT,它包含所有内存变量和其他名为function-of-FB功能的所有内存DUT
  4. 使用此内存DUT定义输入/输出变量VAR_IN_OUT,例如数据类型XXX_FUN_INSTANCE_DUTdutXXX
  5. 在功能体中,对所有需要内存的变量执行以下操作(例如由于在SET/RESET线圈、条件计算或增加/减少变量值中使用而需要内存):
    1. 在内存DUTXXX_FUN_INSTANCE_DUT中定义相同的变量
    2. 用相应的内存DUT成员替换变量
    3. 如果内存DUT中由内存变量替换的某些变量是功能末尾的输出,则必须将它们赋给相应的输出变量。
  6. 将所有FB实例替换为相应功能的内存DUT,此功能必须在内存DUTXXX_FUN_INSTANCE_DUT中定义
  7. 使用相应的内存DTU将所有FB实例调用替换为相应的功能调用

    如果必须替换具有EN/ENO的标准FB,请将相应的功能放入EN/ENO功能并调用此功能。例如,将功能TON_FUN放入EN/ENO功能E_TON_FUN并调用它。

  8. 将所有脉冲标志替换为相应的RTRIG_FUN/FTRIG_FUN调用
  9. 很仔细地测试新功能的行为是否与FB的行为相对应,特别是在多次调用新功能时

对话示例LD/FBD

假设:具有数据类型XXX_FUN_INSTANCE_DUTVAR_IN_OUTdutXXX的函数XXX在所有示例中使用

操作

原始的编程示例

转换后的编程示例

 

调用

 

FB POU头

FUN POU头

   

DUT XXX_FUN_INSTANCE_DUT

置位(S)

复位(R)

KEEP

条件赋值,计算

增加/减少变量值

脉冲标志

在功能末尾:如果需要,将一些内存变量赋给相应的输出变量:

SR

RS

TON

TM_100ms

转换示例ST

假设:具有数据类型XXX_FUN_INSTANCE_DUTVAR_IN_OUTdutXXX的函数XXX在所有示例中使用

操作

原始的编程示例

转换后的编程示例

置位(S)

复位(R)

if (bSet) then
	bSR1:=true;
elsif (bReset) then
	bSR1:=false;
end_if;
if (bSet) then
	dutInstance.bSR1:=true;
elsif (bReset) then
	dutInstance.bSR1:=false;
end_if;

KEEP

bRS1 := KEEP(SetTrigger := bSet,
             ResetTrigger := bReset);
dutInstance.bRS1 := KEEP(SetTrigger := bSet,
                         ResetTrigger := bReset);

条件赋值,计算

if (bReset) then
	di1:=0;
end_if;
if (bTrig) then
	w1 := ROL(IN := w1, N := 1);
end_if;
if (bReset) then
	dutInstance.di1 :=0;
end_if;
if (bTrig) then
	dutInstance.w1 := ROL(IN := dutInstance.w1, N := 1);
end_if;

增加/减少变量值

di1:=di1+1;
w2:=w2 OR w1;
dutInstance.di1:=dutInstance.di1+1;

dutInstance.w2:=dutInstance.w2 OR dutInstance.w1;

脉冲标志

if (DF(bSet) OR DFN(bSet)) then
	di2:=di2+1;
end_if;
R_TRIG_FUN(CLK := bSet,
           dutInstance := dutInstance.dutRTrig1,
           Q => bQTemp1);
F_TRIG_FUN(CLK := bSet,
           dutInstance := dutInstance.dutFTrig1,
           Q => bQTemp2);
if (bQTemp1 OR bQTemp2) then
    dutInstance.di2:=dutInstance.di2+1;
end_if;

在功能末尾:如果需要,将一些内存变量赋给相应的输出变量:

bSR1:=dutInstance.bSR1;
bRS1:=dutInstance.bRS1;
di1:=dutInstance.di1;
di2:=dutInstance.di2;
w1:=dutInstance.w1;
w2:=dutInstance.w2;

SR

SR_1(S1 := bSet,
     R := bReset,
     Q1 => bSR2);
SR_FUN(Set := bSet,
        Reset := bReset,
        dutInstance := dutInstance.dutSR_1, Q1 => bSR2);

RS

RS_1(S := bSet,
      R1 := bReset,
      Q1 => bRS2);
RS_FUN(Set := bSet,
        Reset := bReset,
        dutInstance := dutInstance.dutRS_1,
        Q1 => bRS2);

TON

TON1(IN := bIN,
      PT := T#10S,
      Q => bQ1, ET => tET1);
TON_FUN(IN := bIN,
        PT := T#10s,
        dutInstance := dutInstance.dutTon1,
        Q => bQ1, ET => dutInstance.tET1);

TM_100ms

TM_100ms_1(start := bIN,
            SV := 100,
            T => bT1,
            EV => iEV1);
TM_100ms_FUN(start := bIN,
              SV := 100,
              dutInstance := dutInstance.dutTM_100ms_1,
              T => bT1, EV => dutInstance.iEV1);

最后更新日期: 2021-05-13此页面上的反馈松下热线