回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能

已锁定

坏笨笨

  • 帖子

    406
  • 精华

    4
  • 被关注

    48

论坛等级:侠士

注册时间:2010-03-17

白金 白金 如何晋级?

发布于 2022-08-04 13:07:55

48楼

展开查看
以下是引用坏笨笨在2022-08-04 13:05:37的发言 >47楼

虽然我觉得异步程序不是像楼主那样的调用法,,刚开始没理解楼主思路,后来想了下,写了一个,和楼主不同的是,电平触发。楼主也不需要藏着掖着,这个程序没必要加个密

FUNCTION_BLOCK "PulseGen"

{ S7_Optimized_Access := 'TRUE' }

VERSION : 0.1

   VAR_INPUT 

      bIn : Bool;

      tDelay : Time;

   END_VAR


   VAR_OUTPUT 

      bDone : Bool;

      bBusy : Bool;

   END_VAR


   VAR 

      Ton {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;

      RTrigger {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;

      sout : Bool;

      sDelay : Time;

      STAT : UInt;

   END_VAR


   VAR CONSTANT 

      IDLE : UInt;

      BUSY : UInt := 1;

      DONE : UInt := 2;

   END_VAR



BEGIN

CASE #STAT OF

    #IDLE:

        IF #bIn THEN

            #sDelay := #tDelay;

            #STAT := #BUSY;

            #Ton(IN := false,

                  PT := #sDelay

            );

        END_IF;

        #bDone := false;

        #sout := false;

        #bBusy := false;

        ;

    #BUSY:

        #bBusy := true;

        #Ton(IN := true,

              PT := #sDelay,

              Q => #sout);

        IF #sout THEN

            #bBusy := false;

            #bDone := #tDelay =#sDelay;

            IF #bDone THEN

                #STAT := #IDLE;

            END_IF;

        END_IF;

        ;

END_CASE;

   

//#bOut := #sout;

END_FUNCTION_BLOCK



同时,这个程序最大的问题是需要判断参数,这在真正的异步中是不可以这样做得。 当然,还是强调下,楼主的这种调用异步是有问题的,异步需要配合外部状态机,分层次构筑程序,而不是葫芦串调用。

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有10590条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。