Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 7 von 7

Thema: Multiinstanz Problem - FB Mittelwertbildung

  1. #1
    Registriert seit
    01.01.2008
    Beiträge
    104
    Danke
    43
    Erhielt 21 Danke für 19 Beiträge

    Standard


    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
    Gruß
    Da_Basco


    Ich kann über das Wasser laufen,
    weil ich weiß wo die Steine sind... (Rainald Grebe)
    Zitieren Zitieren Multiinstanz Problem - FB Mittelwertbildung  

  2. #2
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.626
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    Ich versteh gerade nicht, was Du im ersten Netzwerk machst. Ich glaube, da liegt der Hund begraben.
    Gruß
    Michael

  3. #3
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von M-Ott Beitrag anzeigen
    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
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  4. Folgender Benutzer sagt Danke zu vierlagig für den nützlichen Beitrag:

    Da_Basco (24.10.2011)

  5. #4
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.626
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    Wollte ich auch gerade schreiben.
    Da wo Du LAR1 machst, musst Du vorher immer noch AR2 addieren.
    Gruß
    Michael

  6. Folgender Benutzer sagt Danke zu M-Ott für den nützlichen Beitrag:

    Da_Basco (24.10.2011)

  7. #5
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von M-Ott Beitrag anzeigen
    Wollte ich auch gerade schreiben.
    Da wo Du LAR1 machst, musst Du vorher immer noch AR2 addieren.
    oder die ganze funktion mal darauf überprüfen, wieviel LAR überhaupt notwendig ist...
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  8. #6
    Avatar von Da_Basco
    Da_Basco ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    01.01.2008
    Beiträge
    104
    Danke
    43
    Erhielt 21 Danke für 19 Beiträge

    Standard

    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.
    Gruß
    Da_Basco


    Ich kann über das Wasser laufen,
    weil ich weiß wo die Steine sind... (Rainald Grebe)

  9. #7
    Avatar von Da_Basco
    Da_Basco ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    01.01.2008
    Beiträge
    104
    Danke
    43
    Erhielt 21 Danke für 19 Beiträge

    Lächeln


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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!
    Gruß
    Da_Basco


    Ich kann über das Wasser laufen,
    weil ich weiß wo die Steine sind... (Rainald Grebe)
    Zitieren Zitieren Ich glaub es nicht... Es funktioniert  

Ähnliche Themen

  1. Problem mit Multiinstanz und SFB4
    Von shephard im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 05.11.2010, 08:31
  2. Mittelwertbildung
    Von pinolino im Forum Simatic
    Antworten: 45
    Letzter Beitrag: 26.01.2010, 20:06
  3. Multiinstanz Problem
    Von Beren im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 13.05.2009, 12:42
  4. Mittelwertbildung S5-95U
    Von demo im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 28.08.2007, 21:10
  5. Mittelwertbildung
    Von Servomaster im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 18.10.2005, 06:42

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •