한 유닛에 대한 인터럽트 프로그램 활성화 제어
이 FP 명령은 s_Control에서 지정한 데이터에 따라, d_Slot에서 지정한 슬롯에 설치된 유닛에 대한 인터럽트 프로그램의 활성화를 제어합니다.
입력
슬롯 번호: 1-16
지정된 슬롯에 설치된 유닛의 인터럽트 번호를 활성화하는 제어 워드: 16#0–FF
특정 인터럽트 번호에 대해 실행되어야 하는 인터럽트 프로그램(INTPG 0-7)을 해당 번호의 인터럽트 태스크에 할당할 수 있습니다.
인터럽트 번호는 다음과 같이 슬롯 번호를 사용하여 계산할 수 있습니다. <슬롯 번호> * 10 + INTPG.
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
인덱스 한정자를 사용하여 지정한 영역이 제한을 초과하는 경우.
글로벌 변수 리스트에서 프로젝트의 모든 POU에서 액세스할 수 있는 변수를 정의합니다.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR
bEnable_Interrupt: BOOL:=FALSE;
bComparisonMatchMonitor: BOOL:=FALSE;
bDisableHscUnit: BOOL:=FALSE;
bDisable_Interrupt: BOOL:=FALSE;
bReset_interruptValue: BOOL:=FALSE;
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 14 ;
NETWORK_BODY
B(B_COMMENT,,Program behavior:ø^- with first scan all interrups are disabled (or via bDisable_interrupt by hand)ø^ø^- g_Count_up ONCE a second --> if EQ 5 Interrupt 10 will be activated (NW 11) --> but isn't enabled jet!!!ø^ø^- g_Count_up = 10 the interrupts will be enabled ø^ø^- the interrupt program is activated in Interrupt 10 (Slot 1 Channel 0)ø^ø^- if g_bCount_interrupt EQ 16 --> Interrupt 10 (only) is deactivated againø^ø^- wait until g_iCount_up GE 25 --> Reset of g_iCount_up and g_iCount_interruptø^,4,1,52,14,);
L(1,0,1,14);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,sys_bIsFirstScan,6,1,8,3,F);
B(B_COIL,,g_bHscUnitEnable,29,1,31,3,);
B(B_CONTACT,,g_bHscUnitEnable,6,4,8,6,);
B(B_CONTACT,,bDisableHscUnit,16,1,18,3,N);
L(18,2,29,2);
L(8,2,16,2);
L(1,2,6,2);
L(1,5,6,5);
L(8,5,11,5);
L(11,2,11,5);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,g_bHscUnitEnable,6,1,8,3,R);
B(B_COIL,,g_bHscUnitEnableCounting,29,1,31,3,);
B(B_CONTACT,,g_bHscUnitEnableCounting,6,4,8,6,);
B(B_CONTACT,,bDisableHscUnit,16,1,18,3,N);
L(18,2,29,2);
L(1,5,6,5);
L(13,2,13,5);
L(8,5,13,5);
L(13,2,16,2);
L(8,2,13,2);
L(1,2,6,2);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 3 ;
NETWORK_BODY
B(B_CONTACT,,g_bHscUnitComparisonMatchFlag,7,1,9,3,);
B(B_COIL,,bComparisonMatchMonitor,29,1,31,3,);
L(9,2,29,2);
L(1,2,7,2);
L(1,0,1,3);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 7 ;
NETWORK_BODY
B(B_F,FP_INTERRUPT_DISABLE!,,12,2,24,5,,?DEN?AENO);
B(B_CONTACT,,sys_bIsFirstScan,4,3,6,5,);
B(B_COIL,,bEnable_Interrupt,29,3,31,5,E);
B(B_CONTACT,,bDisable_Interrupt,4,5,6,7,);
B(B_COMMENT,,Disables all Interrupts: no activation with the FB- FP_INTERRUPT_ENABLE possible,1,0,25,2,);
L(6,4,12,4);
L(6,6,11,6);
L(11,4,11,6);
L(24,4,29,4);
L(1,6,4,6);
L(1,4,4,4);
L(1,0,1,7);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_COMMENT,,For monitoring the counter variable in the interrupt 10,2,0,26,2,);
B(B_VARIN,,g_iCount_interrupt,9,3,11,5,);
B(B_VAROUT,,g_iCount_interrupt,11,3,13,5,);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_COMMENT,,Interrupt 10 is activated,2,1,26,3,);
B(B_F,FP_INTERRUPT_ACTIVATE!,,18,3,31,8,,?DEN?Dd_Slot?Ds_Control?AENO);
B(B_VARIN,,1,16,5,18,7,);
B(B_VARIN,,16#0001,16,6,18,8,);
B(B_F,@EQ-2!,,8,4,13,7,,?D?D?C);
B(B_VARIN,,g_iCount_up,6,4,8,6,);
B(B_VARIN,,5,6,5,8,7,);
L(13,5,18,5);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 4 ;
NETWORK_BODY
B(B_F,@EQ-2!,,9,1,14,4,,?D?D?C);
B(B_VARIN,,g_iCount_up,7,1,9,3,);
B(B_VARIN,,10,7,2,9,4,);
B(B_COIL,,bEnable_Interrupt,33,1,35,3,S);
L(14,2,33,2);
L(1,0,1,4);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 10 ;
NETWORK_BODY
B(B_F,FP_INTERRUPT_ENABLE!,,19,5,31,8,,?DEN?AENO);
B(B_CONTACT,,bEnable_Interrupt,10,6,12,8,);
B(B_COMMENT,,Interrupts are possible,2,1,26,3,);
L(12,7,19,7);
L(1,7,10,7);
L(1,0,1,10);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 11 ;
NETWORK_BODY
B(B_VARIN,,g_iCount_interrupt,7,6,9,8,);
B(B_VARIN,,15,7,7,9,9,);
B(B_F,FP_INTERRUPT_ACTIVATE!,,19,5,32,10,,?DEN?Dd_Slot?Ds_Control?AENO);
B(B_VARIN,,1,17,7,19,9,);
B(B_VARIN,,16#0000,17,8,19,10,);
B(B_F,@GT-2!,,9,6,14,9,,?D?D?C);
B(B_F,E_GE-2!,,39,5,45,10,,?DEN?D?D?AENO?C);
B(B_VARIN,,g_iCount_up,37,7,39,9,);
B(B_VARIN,,25,37,8,39,10,);
B(B_COIL,,bReset_interruptValue,49,7,51,9,);
B(B_COMMENT,,Deactivate interrupt 10 again if g_iCount_interrupt is higher than 15ø^ø^if g_iCount_Up > 25 g_iCount_interrupt will be set to Zero,2,0,31,3,);
L(14,7,19,7);
L(32,7,39,7);
L(45,8,49,8);
L(1,0,1,11);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 4 ;
NETWORK_BODY
B(B_F,E_MOVE!,,19,0,25,4,,?DEN?D?AENO?C);
B(B_VAROUT,,g_iCount_interrupt,25,2,27,4,);
B(B_VARIN,,0,17,2,19,4,);
B(B_CONTACT,,bReset_interruptValue,7,1,9,3,R);
B(B_F,E_MOVE!,,39,0,45,4,,?DEN?D?AENO?C);
B(B_VAROUT,,g_iCount_up,45,2,47,4,);
B(B_VARIN,,0,37,2,39,4,);
L(1,2,7,2);
L(25,2,39,2);
L(9,2,19,2);
L(1,0,1,4);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 9 ;
NETWORK_BODY
B(B_F,FP_INC!,,19,4,25,8,,?DEN?Dd?Ad?AENO);
B(B_VARIN,,g_iCount_up,17,6,19,8,);
B(B_CONTACT,,sys_bPulse1s,7,5,9,7,R);
B(B_COMMENT,,Increment the main counter every second by one,3,1,27,3,);
L(9,6,19,6);
L(1,6,7,6);
L(1,0,1,9);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
(* Initiation *)
g_bHscUnitEnable := (DFN(sys_bIsFirstScan) OR g_bHscUnitEnable) AND NOT bDisableHscUnit ;
g_bHscUnitEnableCounting := (DF(g_bHscUnitEnable) OR g_bHscUnitEnableCounting) AND NOT bDisableHscUnit ;
(* Monitoring *)
bComparisonMatchMonitor := g_bHscUnitComparisonMatchFlag ;
g_iCount_up := g_iCount_up; (* is counted in the main project *)
g_iCount_interrupt := g_iCount_interrupt; (* is counted in the interrupt program 1_0*)
(* Interrupt expressions *)
if (sys_bIsFirstScan OR bDisable_Interrupt) then
FP_INTERRUPT_DISABLE();
bEnable_Interrupt := FALSE;
end_if;
case g_iCount_up of
5: FP_INTERRUPT_ACTIVATE(d_Slot := 1 , s_Control := 16#0001 ); (* Activate interrupt 1_0 *)
10: bEnable_Interrupt := True; (* set bEnable_Interrupt *)
16: FP_INTERRUPT_ACTIVATE(d_Slot := 1, s_Control := 16#0000); (* Deactivate interrupt 1_0 *)
20: g_iCount_up := 0; (* Reset countervariables *)
g_iCount_interrupt := 0;
end_case;
if (bEnable_Interrupt) then
FP_INTERRUPT_ENABLE(); (* Enabel all interrupts *)
end_if;
(* 1 second counting pulse *)
if (DF(sys_bPulse1s)) then
FP_INC(d := g_iCount_up);
end_if;