发布于 2004-11-22 13:14:27
0楼
显然,每个扫描周期都要调用两个子程序,当调用子程序0时,I0.0传到LO.0,I0.1传到LO.1,运算结果经L0.2传递到Q0.0,在调用子程序1时(假设I0.2没用闭合,I0.3没有断开),则L0.0的值保持在子程序0里的状态,Q0.2是否有输出,取决于I0.0是否闭合。显然这不是编程者的目的,为了解决这种情况,可以在子程序调用前把临时变量清零。其本质就是yanxiao说的L区的变量,先赋值,后使用。
具体这个程序,可以这样用,你试一下;
ORGANIZATION_BLOCK MAIN:OB1
TITLE=
//PROGRAM COMMENTS
//Press F1 for help and example program
//
BEGIN
NETWORK 1 //NETWORK TITLE (single line)
//
//NETWORK COMMENTS
//
LD SM0.0
= L60.0
LD I0.0
= L63.7
LDN I0.1
= L63.6
LD L60.0
CALL SBR_0 L63.7 L63.6 Q0.0
NETWORK 2
LD SM0.0
= L60.0
LD I0.2
= L63.7
LDN I0.3
= L63.6
LD L60.0
CALL SBR_1 L63.7 L63.6 Q0.1
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=
//SUBROUTINE COMMENTS
//Press F1 for help and example program
//
VAR_INPUT
light_on:BOOL;
light_off:BOOL;
END_VAR
VAR_OUTPUT
light:BOOL;
END_VAR
BEGIN
NETWORK 1
LD SM0.0
MOVB 0 LB0
NETWORK 2 //NETWORK TITLE (single line)
//
//NETWORK COMMENTS
//
LD #light_on
O #light
A #light_off
= #light
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_1:SBR1
TITLE=
//SUBROUTINE COMMENTS
//Press F1 for help and example program
//
VAR_INPUT
switch_on:BOOL;
switch_off:BOOL;
END_VAR
VAR_OUTPUT
light:BOOL;
END_VAR
BEGIN
NETWORK 1
LD SM0.0
MOVB 0 LB0
NETWORK 2 //NETWORK TITLE (single line)
//
//NETWORK COMMENTS
//
LD #switch_on
O #light
A #switch_off
= #light
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=
//INTERRUPT ROUTINE COMMENTS
//Press F1 for help and example program
//
BEGIN
NETWORK 1 //NETWORK TITLE (single line)
//
//NETWORK COMMENTS
//
END_INTERRUPT_BLOCK
把此文件保存为文本格式,改变扩展名为.awl格式,然后用FILE---import 导入
,下载到PLC中,试试看,结果怎样?
乐于助人