Waelder
Level-2
- Beiträge
- 964
- Reaktionspunkte
- 117
-> Hier kostenlos registrieren
Hallo Leute,
ich habe mir einen FC gemacht, der intern bei einem fallenden signal ein Integer hochzählen soll.
Der FC wird ca 100x aufgerufen. Die Daten für den FC übergebe ich via pointer und teilweise direkt.
An und für sich funktioniert mein FC aber der Counter zählt permanent mit. Ich bin momentan leider
am ende meines verständnisses ich habe den quellcode mal angeklemmt.
Das problem entsteht im Netzwerk "Countup"
Vermutlich lässt sich das im FC gar nicht realisieren.
Das Signal "IL_ITEM" ist der ausschlaggebende punkt, ist das auf false soll der counter einen hochzählen.
ich habe mir einen FC gemacht, der intern bei einem fallenden signal ein Integer hochzählen soll.
Der FC wird ca 100x aufgerufen. Die Daten für den FC übergebe ich via pointer und teilweise direkt.
An und für sich funktioniert mein FC aber der Counter zählt permanent mit. Ich bin momentan leider
am ende meines verständnisses ich habe den quellcode mal angeklemmt.
Das problem entsteht im Netzwerk "Countup"
Vermutlich lässt sich das im FC gar nicht realisieren.
Das Signal "IL_ITEM" ist der ausschlaggebende punkt, ist das auf false soll der counter einen hochzählen.
Code:
FUNCTION "FC_IL" : VOID
TITLE =
{ S7_language := '9(2) Englisch (Großbritannien) 03.11.2011 16:17:49' }
VERSION : 0.1
VAR_INPUT
IL_ITEM : BOOL ; //1=interlock OK
BR_OFF : BOOL ; //bridge off
END_VAR
VAR_IN_OUT
IL_NO : POINTER ; //Startadress of interlock db/bit
BR_SIGNAL : BOOL ; //Interlock bridget signal
COUNTUP : INT ; //Alarmcounter
END_VAR
VAR_TEMP
DB_NR : WORD ; //DB Nummer
ADDR : DWORD ; //DB.ADRR Nummer
IL_INACTIVE : BOOL ;
IL_OK : BOOL ;
FLANK : BOOL ;
VALUE : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =Pointer Read
L P##IL_NO;
LAR1 ;
L W [AR1,P#0.0];
T #DB_NR;
AUF DB [#DB_NR];
L D [AR1,P#2.0];
T #ADDR;
LAR1 ;
U [AR1,P#1.1];
= #IL_INACTIVE;
U [AR1,P#1.3];
= #FLANK;
L W [AR1,P#0.0];
T #VALUE;
NETWORK
TITLE =delete Bridged signal
U #BR_OFF;
R #IL_INACTIVE;
R #BR_SIGNAL;
NETWORK
TITLE =
O #IL_ITEM;
O #IL_INACTIVE;
= #IL_OK;
NETWORK
TITLE =
U #IL_INACTIVE;
S #BR_SIGNAL;
NETWORK
TITLE =Countup
[B]//#IL_OK
U #IL_OK; //<- der hier zählt ständig hoch soll aber nur bei fallender flanke zählen
FN #FLANK;
SPBNB _001;
L 1;
L #COUNTUP;
+I ;
T #COUNTUP;
_001: NOP 0; [/B]
NETWORK
TITLE =Reset Counter
U( ;
L #COUNTUP;
L 32000;
>I ;
) ;
SPBNB _002;
L 0;
T #COUNTUP;
_002: NOP 0;
NETWORK
TITLE =
//Schreibe Adressbereiche
L P##IL_NO;
LAR1 ;
L W [AR1,P#0.0];
T #DB_NR;
AUF DB [#DB_NR];
L D [AR1,P#2.0];
T #ADDR;
LAR1 ;
U #IL_OK;
= [AR1,P#1.0];
U #IL_INACTIVE;
UN #IL_ITEM;
= [AR1,P#1.2];
U #IL_INACTIVE;
= [AR1,P#1.1];
U #FLANK;
= [AR1,P#1.3];
SET ;
R [AR1,P#0.0];
R [AR1,P#0.1];
R [AR1,P#0.2];
R [AR1,P#0.3];
R [AR1,P#0.4];
R [AR1,P#0.5];
R [AR1,P#0.6];
R [AR1,P#0.7];
R [AR1,P#1.4];
R [AR1,P#1.5];
R [AR1,P#1.6];
R [AR1,P#1.7];
END_FUNCTION