Funktionsbausteine

Wolflesch

Level-1
Beiträge
45
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe ein Problem, ich will in einem Programm einen FB 2mal aufrufen (2 IDB's) in Ihnen wird auf einen Globalen Datenbaustein(beim 2.Aufruf ein anderer als beim 1.Aufruf)über indirekte Adressierung zugegriffen (Block_DB Eingangsparameter),jetzt wird der 2.Auruf vom 1. beeinflußt bzw. der 2. Aufruf wird bearbeitet obwohl
Enabel 0 ist,
und im AR2 steht plötzlich der Bereich DB (84000000) obwohl ich AR2 gar nicht benütze, dann geht PCLSIM in stop

Wolfgang
 
Die Frage wäre mit Sicherheit deutlich einfacher zu beantworten wenn du den FB anhängst.

Zu AR2, das wird von Step7 zur Adressierung von FB-Parametern verwendet.

Mfg
Manuel
 
hier ist der FB (Auswertung eines Zufallgenerators)
ein einmaliger Aufruf funktioniert,
das mit dem AR2 passiert nur bei einem FB nichtmultiinstanzfähig, ich habe dem FB als FC mit INOUT Parmeter (für statische Variablen) und en 2mal aufgerufen das funktioniert


Code:
FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1


VAR_INPUT
  Zahl : INT ;    
  Takt : BOOL ;    
  DB_NR : BLOCK_DB ;    
END_VAR
VAR_OUTPUT
  Wert : DINT ;    
  trigger : BOOL ;    
END_VAR
VAR
  index1 : INT ;    
  index2 : INT ;    
  hilf : BOOL ;    
  zaehler : INT ;    
END_VAR
VAR_TEMP
  s_zaehler : INT ;    
END_VAR
BEGIN
NETWORK
TITLE =

      CLR   ; 
      =     #trigger; 
      L     #zaehler; 
      +     1; 
      T     #zaehler; 
      L     1; 
      >I    ; 
      SPB   ind1; 
      AUF   #DB_NR; 
      LAR1  P#DBX 0.0; 
      L     49; 
next: T     #s_zaehler; //zurüccksetzen
      L     0; //der Zählerstände
      T     W [AR1,P#2.0]; 
      L     4; 
      SLD   3; 
      +AR1  ; 
      L     #s_zaehler; 
      LOOP  next; 
/////////////////////////////////////////////
ind1: L     #Zahl; 
      U     #hilf; 
      SPB   ind2; 
      S     #hilf; 
      T     #index1; 
      BEA   ; 
ind2: T     #index2; 
/////////////////////////////////////////////
      LAR1  P#DBX 0.0; 
      L     #index1; 
      +     -1; //Umwandlung der 2 Dimensionen
      L     7; 
      *I    ; //in eine Dimension
      L     #index2; 
      +I    ; 
      L     4; //Berechnen
      *I    ; //der Adressen
      +     -4; 
      ITD   ; 
      SLD   3; 
      +AR1  ; 
      L     D [AR1,P#0.0]; //wenn unbeschrieben
      L     0; //schreiben der Vektoren
      ==D   ; //in High Word von sortier
      SPN   sld1; 
      L     #index1; 
      ITD   ; 
      SLD   16; 
      L     #index2; 
      ITD   ; 
      SLD   24; 
      OD    ; 
      T     D [AR1,P#0.0]; 
sld1: NOP   0; 
      L     W [AR1,P#2.0]; 
      +     1; //zählen der Zahlenfolge
      T     W [AR1,P#2.0]; //schreiben in Globalen DB
      L     D [AR1,P#0.0]; //in das low Word
      T     #Wert; 
      L     #index2; 
      T     #index1; 
      S     #hilf; 
      L     #zaehler; 
      L     3070; 
      <I    ; 
      SPB   end; 
      L     0; 
      T     #zaehler; 
      SET   ; 
      =     #trigger; 
end:  BE    ; 

END_FUNCTION_BLOCK
 
Zuletzt bearbeitet:
ja danke, da hab ich aus versehen etwas geändert(bei dem ganzen ausprobieren)
es ist so das der 2. Aufruf des FB's erst durchgeführt wird wenn der 1. Aufruf
3070 erreicht hat, ich glaube das dann der 2. Aufruf die Zählwerte des 1.Aufrufes mit negativen Vorzeichen als Anfangswert übernimmt, also in dem DB des 2.Aufrufes,obwohl der 1. Aufruf gar keine Verbindung zu dem DB hat, aber das Zählen des 2. Aufrufens funktioniert wieder, dann von minus nach plus,

Wolfgang
 
Jetzt scheint es doch noch zu funtionieren ich habe den Zaehler rausgenommen und triggere das Zurücksetzen der Zählerstände von Außen

Wolfgang
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... bei Bausteinen mit vergleichbaren Funktionen verwende ich ganz gerne INPUT-Parameter (und ggf. OUTPUT-Rückmeldungen) für diese Zwecke ... also "Baustein Init" , "Start Auswertung" etc.

Gruß
LL
 
Zurück
Oben