Multiinstanz Problem - FB Mittelwertbildung

Da_Basco

Level-1
Beiträge
104
Reaktionspunkte
21
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich habe von einem Vorgänger dessen selbergebastelten FB für eine Gleitende Mittelwertbildung mit max. 50 Werten übernommen. Wenn ich diesen mehrmals mit jeweils eigenen Instanz-DB aufrufe funktioniert er wunderbar. Nur hab ich Probleme mit einer Multiinstanz. Dann funktioniert gar nichts mehr.
Nun hab ich mich hier schon umgesehen zwecks Sicherung der Adressregisters, Offset des Adressregisters 2, usw. und auch diverse Tipps hier angewendet. Leider krieg ich das Ding trotzdem nicht zum laufen und steh schon völlig auf dem Schlauch. Weiss einer wo der Fehler steckt?

Danke vielmals!

Code:
FUNCTION_BLOCK "Mittelwertbildung"
TITLE =Gleitende Mittelwertbildung
VERSION : 0.1
 
VAR_INPUT
  In : REAL ; 
  Anzahl : INT ; 
  Trigger : BOOL ; 
  Reset : BOOL ; 
END_VAR
VAR_OUTPUT
  Out : REAL ; 
END_VAR
VAR
  Messwert : ARRAY  [1 .. 50 ] OF REAL ; 
  hm_1 : BOOL ; 
  hm_2 : BOOL ; 
  hm_3 : BOOL ; 
  hm_4 : BOOL ; 
  Zeiger_1 : DWORD ; 
  Zaehler_1 : INT ; 
  Zeiger_2 : DWORD ; 
  Zaehler_2 : INT ; 
END_VAR
VAR_TEMP
  hmdw_1 : REAL ; 
  RETTAR1 : DWORD ; 
  RETTAR2 : DWORD ; 
END_VAR
BEGIN
NETWORK
TITLE =Inhalt der Adressregister sichern
      LAR1  P##In; 
      TAR2  ; 
      +AR1  ;                       
      TAR1  #RETTAR1; 
      TAR2  #RETTAR2; 
NETWORK
TITLE =
 
      U     #Reset; 
      SPBN  M001; 
      L     1; 
      T     #Zaehler_1; 
      L     P#0.0; 
      T     #Zeiger_1; 
      L     0; 
      T     #Out; 
M001: NOP   0; 
      U     #Reset; 
      FP    #hm_1; 
      SPBN  M002; 
      L     P#0.0; 
      T     #Zeiger_2; 
      L     50; 
S002: T     #Zaehler_2; 
      L     #Zeiger_2; 
      LAR1  ; 
      L     0; 
      T     DID [AR1,P#12.0]; 
      L     P#4.0; 
      L     #Zeiger_2; 
      +D    ; 
      T     #Zeiger_2; 
      L     #Zaehler_2; 
      LOOP  S002; 
M002: NOP   0; 
      U     #Reset; 
      FN    #hm_2; 
      SPBN  M003; 
 
M003: NOP   0; 
      U     #Reset; 
      SPB   ENDE; 
      U     #Trigger; 
      FP    #hm_3; 
      SPB   M004; 
      SPA   ENDE; 
M004: NOP   0; 
NETWORK
TITLE =Meßwerte schreiben
 
      L     #Zeiger_1; 
      LAR1  ; 
      L     #In; 
      T     DID [AR1,P#12.0]; 
      L     #Zaehler_1; 
      +     1; 
      L     #Anzahl; 
      >I    ; 
      SPBN  M005; 
      L     1; 
      T     #Zaehler_1; 
      L     P#0.0; 
      T     #Zeiger_1; 
      SPA   M006; 
M005: NOP   0; 
      TAK   ; 
      T     #Zaehler_1; 
      L     #Zeiger_1; 
      L     P#4.0; 
      +D    ; 
      T     #Zeiger_1; 
M006: NOP   0; 
NETWORK
TITLE =Meßwertergebis ausgeben
      L     0.000000e+000; 
      T     #hmdw_1; 
      L     P#0.0; 
      T     #Zeiger_2; 
      L     #Anzahl; 
S001: T     #Zaehler_2; 
      L     #Zeiger_2; 
      LAR1  ; 
      L     DID [AR1,P#12.0]; 
      L     #hmdw_1; 
      +R    ; 
      T     #hmdw_1; 
      L     #Zeiger_2; 
      L     P#4.0; 
      +D    ; 
      T     #Zeiger_2; 
      L     #Zaehler_2; 
      LOOP  S001; 
      L     #hmdw_1; 
      L     #Anzahl; 
      ITD   ; 
      DTR   ; 
      /R    ; 
      T     #Out; 
NETWORK
TITLE =Adressregister wiederherstellen
ENDE: NOP   0; 
      LAR1  #RETTAR1; 
      LAR2  #RETTAR2; 
END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich versteh gerade nicht, was Du im ersten Netzwerk machst. Ich glaube, da liegt der Hund begraben.

nein, das ist die stelle, die den offset macht...

das problem sind die stellen, wo LAR1 ausgeführt wird ohne eben diesen offset zu berücksichtigen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da soll eigentlich der Offset des AR2 für den Multiinstanzaufruf aufaddiert und zudem die beiden Adressregister gesichert werden.
Den Code gab es im Ursprungs FB nicht. Habe die Methode beim Durchforsten des Forums gefunden und dachte die könnte die Lösung meines Problems sein. Leider NOT. Auch wenn ich ihn weglasse habe ich dasselbe Problem.
 
Ich glaub es nicht... Es funktioniert

Vielen Dank für eure Antworten. Ihr habt Recht. Das Addieren des Offsets hat gefehlt. Jetzt funktioniert alles wunderbar.
Hier der Code:

Code:
FUNCTION_BLOCK "Mittelwertbildung"
TITLE =Gleitende Mittelwertbildung
VERSION : 0.1
 
VAR_INPUT
  In : REAL ; 
  Anzahl : INT ; 
  Trigger : BOOL ; 
  Reset : BOOL ; 
END_VAR
VAR_OUTPUT
  Out : REAL ; 
END_VAR
VAR
  Messwert : ARRAY  [1 .. 50 ] OF REAL ; 
  hm_1 : BOOL ; 
  hm_2 : BOOL ; 
  hm_3 : BOOL ; 
  hm_4 : BOOL ; 
  Zeiger_1 : DWORD ; 
  Zaehler_1 : INT ; 
  Zeiger_2 : DWORD ; 
  Zaehler_2 : INT ; 
END_VAR
VAR_TEMP
  hmdw_1 : REAL ; 
  RETTAR1 : DWORD ; 
  RETTAR2 : DWORD ; 
END_VAR
BEGIN
NETWORK
TITLE =Inhalt der Adressregister sichern
      TAR1  #RETTAR1; 
      TAR2  #RETTAR2; 
 
      TAR2  ; 
      UD    DW#16#FFFFFF; 
      L     P##Zaehler_1; 
      +D    ; 
      LAR1  ; 
NETWORK
TITLE =Reset-Routine
 
      U     #Reset; 
      SPBN  M001; 
      L     1; 
      T     #Zaehler_1; 
      L     P#0.0; 
      T     #Zeiger_1; 
      L     0; 
      T     #Out; 
M001: NOP   0; 
      U     #Reset; 
      FP    #hm_1; 
      SPBN  M002; 
      L     P#0.0; 
      T     #Zeiger_2; 
      L     50; 
S002: T     #Zaehler_2; 
      L     #Zeiger_2; 
      LAR1  ; 
      TAR2  ; 
      +AR1  ; 
      L     0; 
      T     DID [AR1,P#12.0]; 
      L     P#4.0; 
      L     #Zeiger_2; 
      +D    ; 
      T     #Zeiger_2; 
      L     #Zaehler_2; 
      LOOP  S002; 
M002: NOP   0; 
      U     #Reset; 
      FN    #hm_2; 
      SPBN  M003; 
 
M003: NOP   0; 
      U     #Reset; 
      SPB   ENDE; 
      U     #Trigger; 
      FP    #hm_3; 
      SPB   M004; 
      SPA   ENDE; 
M004: NOP   0; 
NETWORK
TITLE =Meßwerte schreiben
 
      L     #Zeiger_1; 
      LAR1  ; 
      TAR2  ; 
      +AR1  ; 
      L     #In; 
      T     DID [AR1,P#12.0]; 
      L     #Zaehler_1; 
      +     1; 
      L     #Anzahl; 
      >I    ; 
      SPBN  M005; 
      L     1; 
      T     #Zaehler_1; 
      L     P#0.0; 
      T     #Zeiger_1; 
      SPA   M006; 
M005: NOP   0; 
      TAK   ; 
      T     #Zaehler_1; 
      L     #Zeiger_1; 
      L     P#4.0; 
      +D    ; 
      T     #Zeiger_1; 
M006: NOP   0; 
NETWORK
TITLE =Meßwertergebis ausgeben
      L     0.000000e+000; 
      T     #hmdw_1; 
      L     P#0.0; 
      T     #Zeiger_2; 
      L     #Anzahl; 
S001: T     #Zaehler_2; 
      L     #Zeiger_2; 
      LAR1  ; 
      TAR2  ; 
      +AR1  ; 
      L     DID [AR1,P#12.0]; 
      L     #hmdw_1; 
      +R    ; 
      T     #hmdw_1; 
      L     #Zeiger_2; 
      L     P#4.0; 
      +D    ; 
      T     #Zeiger_2; 
      L     #Zaehler_2; 
      LOOP  S001; 
      L     #hmdw_1; 
      L     #Anzahl; 
      ITD   ; 
      DTR   ; 
      /R    ; 
      T     #Out; 
NETWORK
TITLE =Adressregister wiederherstellen
ENDE: NOP   0; 
      LAR1  #RETTAR1; 
      LAR2  #RETTAR2; 
END_FUNCTION_BLOCK

Geht mit Sicherheit einfacher und schöner, aber ich bin jetzt schon glücklich! :D
 
Zurück
Oben