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