20个信号做先入先出,那位高手可以帮我写一个STL程序

20个信号做先入先出,那位高手可以帮我写一个STL程序
谢谢
我的QQ 819115643

问题补充:
阿鸣,我打开你的博客看了,按照你的博客里面去写了,但是我发现,我做好的FB00在OB1中调用,填地址不会填,还有做DB200的时候,有一些地址问题,我的QQ819115643
如果可以,你把你的程序发给我看看。

最佳答案

FUNCTION_BLOCK FB 100
TITLE =
//此功能块完成20字节的FIFO功能
AUTHOR : 
VERSION : 0.1

VAR_INPUT
  SOURCE_DB : BLOCK_DB ; 
  INPUT : BOOL ;   
  OUTPUT : BOOL ;      
  SIZE : INT ;    
END_VAR

VAR_OUTPUT
  DONE_IN : BOOL ;    
  DONE_OUT : BOOL ;       
  ERROR : BOOL ; 
  FULL : BOOL ;     
  EMPTY : BOOL ;  
END_VAR

VAR_IN_OUT
  LOCATION : INT ;      
END_VAR

VAR
  IN_START : BOOL ;    
  IN_ACTIVE : BOOL ; 
  OUT_START : BOOL ;       
  OUT_ACTIVE : BOOL ;    
  COUNT : INT ;     
  RET_VAL1 : INT ;       
END_VAR

BEGIN
NETWORK
TITLE =
      A     #INPUT; 
      AN    #IN_ACTIVE; 
      =     #IN_START; 
      A     #INPUT; 
      =     #IN_ACTIVE; 
      A     #OUTPUT; 
      AN    #OUT_ACTIVE; 
      =     #OUT_START; 
      A     #OUTPUT; 
      =     #OUT_ACTIVE; 
      AN    #INPUT; 
      AN    #OUTPUT; 
      JC    END1; 
NETWORK
TITLE =OUTPUT FIFO
//20字节的数据从FIFO存储区域中读出
      AN    #OUTPUT; 
      O     #DONE_OUT; 
      JC    IN_1; 
      AN    #OUT_START; 
      JC    OP_1; 
      OPN   #SOURCE_DB; 
      L     DW#16#0; 
      T     DBD   40; 
      T     DBD   44; 
      T     DBD   48; 
      T     DBD   52; 
      T     DBD   56; 
      T     DBD   60; 
      T     DBD   64; 
      T     DBD   68; 
      T     DBD   72; 
      T     DBD   76; 
      L     #LOCATION; 
      L     0; 
      <=I   ; 
      S     #EMPTY; 
      JC    EROR; 
      OPN   #SOURCE_DB; 
      CALL "BLKMOV" (
           SRCBLK                   := P#DBX 80.0 BYTE 40,
           RET_VAL                  := #RET_VAL1,
           DSTBLK                   := P#DBX 40.0 BYTE 40);
      L     #RET_VAL1; 
      L     0; 
      <>I   ; 
      JC    EROR; 
      L     0; 
      T     #COUNT; 
OP_1: L     #LOCATION; 
      L     0; 
      <=I   ; 
      JC    EROR; 
      L     #LOCATION; 
      L     #COUNT; 
      <=I   ; 
      JC    OP_3; 
      L     #COUNT; 
      L     2; 
      +I    ; 
      ITD   ; 
      L     P#40.0; 
      *D    ; 
      LAR1  ; 
      OPN   #SOURCE_DB; 
      L     DBD [AR1,P#40.0]; 
      T     DBD [AR1,P#0.0]; 
      L     DBD [AR1,P#44.0]; 
      T     DBD [AR1,P#4.0]; 
      L     DBD [AR1,P#48.0]; 
      T     DBD [AR1,P#8.0]; 
      L     DBD [AR1,P#52.0]; 
      T     DBD [AR1,P#12.0]; 
      L     DBD [AR1,P#56.0]; 
      T     DBD [AR1,P#16.0]; 
      L     DBD [AR1,P#60.0]; 
      T     DBD [AR1,P#20.0]; 
      L     DBD [AR1,P#64.0]; 
      T     DBD [AR1,P#24.0]; 
      L     DBD [AR1,P#68.0]; 
      T     DBD [AR1,P#28.0]; 
      L     DBD [AR1,P#72.0]; 
      T     DBD [AR1,P#32.0]; 
      L     DBD [AR1,P#76.0]; 
      T     DBD [AR1,P#36.0]; 
      L     #COUNT; 
      L     1; 
      +I    ; 
      T     #COUNT; 
      L     #SIZE; 
      L     -1; 
      +I    ; 
      L     #COUNT; 
      <=I   ; 
      JC    OP_2; 
      JU    END2; 
OP_2: L     W#16#0; 
      T     DBD [AR1,P#40.0]; 
      T     DBD [AR1,P#44.0]; 
      T     DBD [AR1,P#48.0]; 
      T     DBD [AR1,P#52.0];
      T     DBD [AR1,P#56.0]; 
      T     DBD [AR1,P#60.0]; 
      T     DBD [AR1,P#64.0]; 
      T     DBD [AR1,P#68.0]; 
      T     DBD [AR1,P#72.0]; 
      T     DBD [AR1,P#76.0]; 
OP_3: SET   ; 
      S     #DONE_OUT; 
      L     #LOCATION; 
      L     -1; 
      +I    ; 
      T     #LOCATION; 
      JU    END2; 
NETWORK
TITLE =INPUT FIFO
//20字节的数据写入FIFO存储区表中
IN_1: AN    #IN_START; 
      JC    END2; 
      L     #LOCATION; 
      L     #SIZE; 
      >=I   ; 
      S     #FULL; 
      JC    EROR; 
      L     #LOCATION; 
      L     2; 
      +I    ; 
      ITD   ; 
      L     P#40.0; 
      *D    ; 
      LAR1  ; 
      OPN   #SOURCE_DB; 
      L     DBD    0; 
      T     DBD [AR1,P#0.0]; 
      L     DBD    4; 
      T     DBD [AR1,P#4.0]; 
      L     DBD    8; 
      T     DBD [AR1,P#8.0]; 
      L     DBD   12; 
      T     DBD [AR1,P#12.0]; 
      L     DBD   16; 
      T     DBD [AR1,P#16.0]; 
      L     DBD   20; 
      T     DBD [AR1,P#20.0]; 
      L     DBD   24; 
      T     DBD [AR1,P#24.0]; 
      L     DBD   28; 
      T     DBD [AR1,P#28.0]; 
      L     DBD   32; 
      T     DBD [AR1,P#32.0]; 
      L     DBD   36; 
      T     DBD [AR1,P#36.0]; 
      L     #LOCATION; 
      L     1; 
      +I    ; 
      T     #LOCATION; 
      SET   ; 
      S     #DONE_IN; 
      JU    END2; 
NETWORK
TITLE =
EROR: SET   ; 
      =     #ERROR; 
      JU    END2; 
END1: CLR   ; 
      =     #DONE_IN; 
      =     #DONE_OUT; 
      =     #ERROR; 
      =     #EMPTY; 
      =     #FULL; 
END2: NOP   0; 
END_FUNCTION_BLOCK

提问者对于答案的评价:
谢谢

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc307614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年11月1日 下午1:56
下一篇 2020年11月1日 下午1:57

相关推荐