Negative Flanke funktioniert nicht in FC ?

Waelder

Level-2
Beiträge
964
Reaktionspunkte
117
Zuviel Werbung?
-> 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.

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
 
Das Signal "IL_ITEM" ist der ausschlaggebende punkt, ist das auf false soll der counter einen hochzählen.

Code:
[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]

Das Bit FN #FLANK; -ist das eine temporäre Variable?

Wenn ja, solltest Du aus dem FC einen FB machen und das Ding als STATISCHE Variable definieren.
 
Danke Dir schonmal vorab aber meines wissens habe ich mir die Variable via Pointer aus einem Integer aus einem DB gezogen langt das nicht ? siehe mein code

Code:
VAR_INPUT
  IL_ITEM : BOOL ;    //1=interlock OK
  BR_OFF : BOOL ;    //bridge off
END_VAR
VAR_IN_OUT
[COLOR=#0000ff][B]  IL_NO : POINTER ;    //Startadress of interlock db/bit[/B][/COLOR]
  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; 

[COLOR=#0000ff][B]      U      [AR1,P#1.3]; 
      =     #FLANK; [/B][/COLOR]

      L     W [AR1,P#0.0]; 
      T     #VALUE;
 
Aber IL_OK ist ne temporäre Variable.

Das mit den temporären Variablen ist so eine Sache.
Da ist man sich nie sicher ob sie 0 oder 1 sind.

Vielleicht klappt das mit deinem Pointer auch nicht.
Das sieht man aber nicht.

Gruß wolder

Edit: übersehen. Die beschreibst IL_OK bevor du sie abfragst. Versuch das mal mit nem FB und leg die Flanke in den statischen Bereich.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Was übergibst du denn da an den Pointer ?
Das müßte, so wie ich es sehe, ja mindestens ein Wort sein ...?
Ich muss allerdings auch gestehen, dass ich diese Vorgehensweise für "ein wenig befremdlich" halte ...

Gruß
Larry
 
Befremdlich *ROFL*klaro geb ich zu .:smile: .. nun ja ich mach nicht so viel mit Pointers.
Der Baustein erfüllt(e) seinen Zweck voll und ganz bis dahin aber der Zähler wurde nun neu eingebaut und nervt mich nun halt.

Ja richtig ein Wort lese ich ein. Ich benutze dann die Bits im Wort um zu schalten usw. Die ganzen Resets
am ende sollen nur vermeiden, dass ein falscher wert angezeigt wird.

Er soll bei einem fallenden signal am Eingang +1 hochzählen an einer anderen stelle im Programm wird das ausgewertet ob sich der wert nach oben ändert und dann eine meldung ausgegeben.
Anderst müsste ich ca 100 Signale mit negativen Flanken auswerten und auf "oder" schalten das wäre mir dann zu blöd.
Die "Bitchen" sind halt leider nicht nebeneinander.
 
Er soll bei einem fallenden signal am Eingang +1 hochzählen an einer anderen stelle im Programm wird das ausgewertet ob sich der wert nach oben ändert und dann eine meldung ausgegeben.
Anderst müsste ich ca 100 Signale mit negativen Flanken auswerten und auf "oder" schalten das wäre mir dann zu blöd.
Die "Bitchen" sind halt leider nicht nebeneinander.

Sorry ... das verstehe ich nicht.
Erklär mal genauer. Im Moment sehe ich da nicht DEN Vorteil zu dem von z.B. M-Ott vorgeschlagenen Weg ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ganz schön viel Aufwand für ein einziges Bit, da gibt es auch andere Möglichkeiten.
Liegen die Bits in regelmäßigen Abständen oder unregelmäßig verteilt?
 
Ok ?

Alle Bits regelmässig, ich werd meinen FC wohl umbauen und dieses Bit direkt einlegen...
Anbei mal die struktur meines DBs, der ist mit UDTs aufgebaut und enthält ca
100 mal diese informationen.
Ich lese dann immer das erste bit via pointer ein

Der Aufbau des Wortes ist wie folgt :

Code:
TYPE "IL_UDT"
{ S7_language := '9(2) Englisch (Großbritannien)  13.10.2011  18:40:06' }
VERSION : 0.1


  STRUCT     
   IL_NO : BOOL ;    //Interlock number
   RES7 : BOOL ;    
   RES8 : BOOL ;    
   RES9 : BOOL ;    
   RES10 : BOOL ;    
   RES11 : BOOL ;    
   RES12 : BOOL ;    
   RES13 : BOOL ;    
   ON : BOOL ;    //IL OK
   INAKT : BOOL ;    //IL inactive
   BR_OK : BOOL ;    //IL bridged and not OK
[COLOR=#0000ff][B]   FL : BOOL ;    //Internal Bit Flanke[/B][/COLOR]
   RES2 : BOOL ;    
   RES3 : BOOL ;    
   RES4 : BOOL ;    
   RES5 : BOOL ;    
  END_STRUCT ;    
END_TYPE
 
Hi,

Dein Code funktioniert so wie er ist. Das Problem muss ausserhalb liegen.
Vll doppelte Zuweisung eines Pointers am Baustein.

Gruss Daniel

gesucht,gesucht ... keine doppelte belegung aber :

Uahhhhhhh :sm11:...... ich habs wir benutzen eine Simulation (Winmod) da gibt es einen Baustein der mir Ventile Simuliert. Dummerweise hat da einer den Eingang (da sollte ein Ausgang drauf) zum öffnen des Ventils mit dem Endschalter Ventil verbunden. Fakt : Blinki mit brutaler Frequenz.....

Schande über mich....

Danke noch an Euch.

Wälder
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für mich ist das wieder mal ein typisches Beispiel wie man Programme so gestaltet das es nicht jeder versteht.
Ich freue mich dann immer wieder wenn ein Progammierer dann später (etwas älter geworden) sein eigenes Programm nicht mehr richtig nachvollziehen kann.
 
Zurück
Oben