Waelder
Level-2
- Beiträge
 - 978
 
- Reaktionspunkte
 - 122
 
-> 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