发布于 2006-01-14 21:44:01
0楼
采用SFC64 只做了一个阀门的控制的FB 其他的一样就可以了
ORGANIZATION_BLOCK "main"
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1
VAR_TEMP
OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
OB1_PRIORITY : BYTE ; //Priority of OB Execution
OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
OB1_RESERVED_1 : BYTE ; //Reserved for system
OB1_RESERVED_2 : BYTE ; //Reserved for system
OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =
A M 0.0; //开阀给定信号
= L 20.0;
BLD 103;
A M 0.1; //关阀给定信号
= L 20.1;
BLD 103;
A I 0.0; //阀门开到位信号
= L 20.2;
BLD 103;
A I 0.1; //阀门关到位信号
= L 20.3;
BLD 103;
CALL "FMCtrl" , DB 1 (
Open := L 20.0,
Close := L 20.1,
OpenLimit := L 20.2,
CloseLimit := L 20.3,
QOpen := Q 0.0,//开阀
QClose := Q 0.1,//关阀
QOAlarm := Q 0.2,//开阀报警
QCAlarm := Q 0.3);//关阀报警
NOP 0;
END_ORGANIZATION_BLOCK
FUNCTION_BLOCK "FMCtrl"
TITLE ="阀门开关+报警"
VERSION : 0.1
VAR_INPUT
Open : BOOL ; //开阀信号
Close : BOOL ; //关阀信号
OpenLimit : BOOL ; //阀门开到位信号
CloseLimit : BOOL ; //阀门关到位信号
END_VAR
VAR_OUTPUT
QOpen : BOOL ; //开阀输出
QClose : BOOL ; //关阀输出
QOAlarm : BOOL ; //开阀超时报警
QCAlarm : BOOL ; //关阀超时报警
END_VAR
VAR
OP1 : BOOL ; //中间变量1
OP2 : BOOL ; //中间变量2
P_1 : BOOL ; //中间脉冲变量1
P_2 : BOOL ; //中间脉冲变量2
Openretnow : TIME ; //开阀的现在时间
Openretstart : TIME ; //开阀的起始时间
Closeretnow : TIME ; //关阀的现在时间
Closeretstart : TIME ; //关阀的起始时间
END_VAR
VAR_TEMP
Opentempnow : DINT ; //转换后开阀的现在时间
Opentempstart : DINT ;//转换后开阀的起始时间
Opentempsub : DINT ; //转换后开阀输出的时间
Closetempnow : DINT ; //转换后关阀的现在时间
Closetempstart : DINT ;//转换后关阀的起始时间
Closetempsub : DINT ; //转换后关阀输出的时间
END_VAR
BEGIN
NETWORK
TITLE =Temporary placeholder variable
A #Open;
AN #OpenLimit;
= L 24.0;
A L 24.0;
= #OP1;
A #OP1;
= #QOpen;
A L 24.0;
FP #P_1;
JNB _001;
CALL "TIME_TCK" (
RET_VAL := #Openretstart);
_001: NOP 0;
NETWORK
TITLE =
A #OP1;
= L 24.0;
A L 24.0;
JNB _002;
CALL "TIME_TCK" (
RET_VAL := #Openretnow);
_002: NOP 0;
A L 24.0;
JNB _003;
L #Openretstart;
T #Opentempstart;
_003: NOP 0;
A L 24.0;
JNB _004;
L #Openretnow;
T #Opentempnow;
_004: NOP 0;
A L 24.0;
JNB _005;
L #Opentempnow;
L #Opentempstart;
-D ;
T #Opentempsub;
_005: NOP 0;
A L 24.0;
A( ;
L #Opentempsub;
L L#3000;
>D ;
) ;
= #QOAlarm;
NETWORK
TITLE =Temporary placeholder variable
A #Close;
AN #CloseLimit;
= L 24.0;
A L 24.0;
= #OP2;
A #OP2;
= #QClose;
A L 24.0;
FP #P_2;
JNB _006;
CALL "TIME_TCK" (
RET_VAL := #Closeretstart);
_006: NOP 0;
NETWORK
TITLE =
A #OP2;
= L 24.0;
A L 24.0;
JNB _007;
CALL "TIME_TCK" (
RET_VAL := #Closeretnow);
_007: NOP 0;
A L 24.0;
JNB _008;
L #Closeretstart;
T #Closetempstart;
_008: NOP 0;
A L 24.0;
JNB _009;
L #Closeretnow;
T #Closetempnow;
_009: NOP 0;
A L 24.0;
JNB _00a;
L #Closetempnow;
L #Closetempstart;
-D ;
T #Closetempsub;
_00a: NOP 0;
A L 24.0;
A( ;
L #Closetempsub;
L L#3000;
>D ;
) ;
= #QCAlarm;
END_FUNCTION_BLOCK
怎么论坛改成这样了??