Wieder Multiinstanz... Mittelwert Bildung

c.wehn

Level-2
Beiträge
609
Reaktionspunkte
47
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich würde gern aus meinem Mittelwert Baustein als Multiinstanz aufrufen.

Sobald ich das mache arbeitet er aber nichtmehr....

Ich find leider den Fehler nicht.

Code:
FUNCTION_BLOCK "Real_Mittelwert_bilden"
TITLE =
VERSION : 0.1


VAR_INPUT
  IN : REAL ;    //Messwert
  Anz_Werte : INT ;    //Anzahl der Messwerte [1-20]
END_VAR
VAR_OUTPUT
  OUT : REAL ;    
END_VAR
VAR
  Speicher : REAL ;    
  Zaehler : INT ;    
  Zaehler1 : INT ;    
  Wert_1 : REAL ;    
  Wert_2 : REAL ;    
  Wert_3 : REAL ;    
  Wert_4 : REAL ;    
  Wert_5 : REAL ;    
  Wert_6 : REAL ;    
  Wert_7 : REAL ;    
  Wert_8 : REAL ;    
  Wert_9 : REAL ;    
  Wert_10 : REAL ;    
  Wert_11 : REAL ;    
  Wert_12 : REAL ;    
  Wert_13 : REAL ;    
  Wert_14 : REAL ;    
  Wert_15 : REAL ;    
  Wert_16 : REAL ;    
  Wert_17 : REAL ;    
  Wert_18 : REAL ;    
  Wert_19 : REAL ;    
  Wert_20 : REAL ;    
END_VAR
VAR_TEMP
  Anzahl_Werte : INT ;    
  Adr_1 : DWORD ;    
  Adr_2 : DWORD ;    
END_VAR
BEGIN
NETWORK
TITLE =Anzahl Werte begrenzen

      L     #Anz_Werte; 
      L     1; 
      <I    ; 
      SPBN  _1; 
      L     1; 
      T     #Anzahl_Werte; 
      SPA   _3; 
_1:   L     #Anz_Werte; 
      L     20; 
      >I    ; 
      SPBN  _2; 
      L     20; 
      T     #Anzahl_Werte; 
      SPA   _3; 
_2:   L     #Anz_Werte; 
      T     #Anzahl_Werte; 
_3:   NOP   0; 
NETWORK
TITLE =Reset Zähler



      U(    ; 
      L     #Zaehler; 
      L     #Anzahl_Werte; 
      >=I   ; 
      )     ; 
      SPBNB _001; 
      L     0; 
      T     #Zaehler; 
_001: NOP   0; 
NETWORK
TITLE =Wert in Register schreiben

      L     #Zaehler; 
      L     32; 
      *I    ; 
      L     P#18.0; // Anfangsadresse Register
      +D    ; 
      T     #Adr_1; 

//   Wert in Speicherplatz
      L     #IN; 
      T     DID [#Adr_1]; 

// Zaehler erhöhen
      L     #Zaehler; 
      L     1; 
      +I    ; 
      T     #Zaehler; 
NETWORK
TITLE =Mittelwert bilden

      L     P#18.0; 
      T     #Adr_2; 

      L     0.000000e+000; 
      T     #Speicher; 

      L     #Anzahl_Werte; 
Anf:  T     #Zaehler1; 

// Werte summieren
      L     DID [#Adr_2]; 
      L     #Speicher; 
      +R    ; 
      T     #Speicher; 

// Adresse inkrementieren
      L     #Adr_2; 
      L     P#4.0; 
      +D    ; 
      T     #Adr_2; 

// Zaehler degrementieren
      L     #Zaehler1; 
      LOOP  Anf; 

// Mittelwert bilden
      L     #Speicher; 
      L     #Anzahl_Werte; 
      ITD   ; 
      DTR   ; 
      /R    ; 
      T     #OUT; 
END_FUNCTION_BLOCK

Gruß
 
Code:
NETWORK
TITLE =Wert in Register schreiben

      L     #Zaehler; 
      L     32; 
      *I    ; 
      L     [COLOR="#FF0000"]P##Wert_1[/COLOR]; // Anfangsadresse Register

[...]

NETWORK
TITLE =Mittelwert bilden

      L     [COLOR="#FF0000"]P##Wert_1[/COLOR]; 
      T     #Adr_2; 

[...]

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Okay, das sehe ich ein ist aufjedenfall schonmal ein Schritt in die richtige Richtung.
Leider funktioniert es immer noch nicht!
Man erkennt immernoch das der FB3 auf die Adressen des FB4's schreibt an der stelle wo du mich korrigiert hast!
 
OK, dann so:
Code:
VAR_TEMP
  Anzahl_Werte : INT ;    
  Adr_1 : DWORD ;    
  Adr_2 : DWORD ;    
  [COLOR="#FF0000"]Adr_Werte : DWORD ;[/COLOR]    
END_VAR
BEGIN

[...]

NETWORK
TITLE =Wert in Register schreiben
[COLOR="#FF0000"]//Adresse Werte-Array der Multiinstanz brechnen
      TAR2                              //Offset Multiinstanz
      UD    DW#16#FFFFFF                //Bereichskennung entfernen
      L     P##Wert_1                   //Adresse Werte-Array in dieser Instanz
      +D                                //dazuaddieren -> Adresse Array in Multiinstanz
      T     #Adr_Werte                  //merken[/COLOR]

      L     #Zaehler; 
      L     32; 
      *I    ; 
      L     [COLOR="#FF0000"]#Adr_Werte[/COLOR]; // Anfangsadresse Register

[...]

NETWORK
TITLE =Mittelwert bilden

      L     [COLOR="#FF0000"]#Adr_Werte[/COLOR]; 
      T     #Adr_2; 

[...]

Harald
 
Sollte nicht bei einer Multiinstanz noch das AR2 dazu addiert werden, das ja den Offset für den jeweiligen Multiinstanz-FB enthält oder lädt man diesen Offset mit L P##... gleich mit? Das würde ich mal ausprobieren.

Edit: Ah, ich seh grad Harald schlägt das auch vor.
 
Zurück
Oben