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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Pointer indirekt adressieren! Aber wie? FC 102 DEV MAT_FP

  1. #1
    Registriert seit
    30.06.2006
    Beiträge
    18
    Danke
    0
    Erhielt 2 Danke für 1 Beitrag

    Unglücklich


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen!

    Ich tüftle jetzt schon 2 Tage an einem Problem.

    Ich bastle mir gerade einen Wertespeicher dieser zeichnet 100 Werte auf (der erste Wert ist immer der aktuellste und alle nachfolgenden werden eine Zelle weitergerückt) soweit sogut! Das funktioniert noch.

    Weiters erreichne ich mir den kleinsten Wert (MIN) den größten (MAX) und den Mittelwert. Das funktioniert auch noch!

    Jetzt aber zu meinem Problem:
    Ich möchte zur statistischen Auswertung die Standartabweichung ausrechnen. Ich rufe im FB die Funktion "FC 102 DEV MAT_FP" (zu finden in der Standard Library TI-S7 Converting Blocks) auf.

    Da ich meinen Wertespeicher FB 3mal in einen anderen FB als Multiinstanz aufrufe (Aufrufhirachie: OB1 ruft FB99; FB99 ruft FB100-Wertespeicher) muss ich zuerst die Pointeradressen für TBL und OUT errechnen und indirekt dressieren, aber wie?
    Bzw. wie übergebe ich der FC102 den errechneten Pointer?
    Der Datentyp Pointer steht bei den Temp variablen nicht zur verfügung?

    Ich verwende übrigens eine 315-F 2 DP CPU

    Code:
          CALL  FC   102
           TBL    := ?????
           OUT    := ?????
           E_TYPE :=B#16#8
           RET_VAL:=#ret_val_sdev
    Übrigens wenn ich direkt die absolute Adresse des Instanz DBs eingebe (P#DB99.dbx460.0) funktioniert die Funktion!

    Bitte um Hilfe!
    Besten Dank im Voraus!
    Zitieren Zitieren Pointer indirekt adressieren! Aber wie? FC 102 DEV MAT_FP  

  2. #2
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard

    Hallo Matthias,

    schau mal hier nach:
    http://www.sps-forum.de/showthread.php?t=12923

    Grüße
    Gebs

  3. #3
    Registriert seit
    16.12.2008
    Ort
    Fürth
    Beiträge
    146
    Danke
    32
    Erhielt 21 Danke für 19 Beiträge

    Standard

    Und natürlich das hier für den Offset in der Multiinstanz

    http://www.sps-forum.de/showthread.php?t=29262
    -A+B=15=21 Klingt komisch - ist aber so!
    -It's not a bug, it's a feature!
    -Es gibt nur 3 Feinde im Leben eines Programmierers: Sonnenlicht, Frischluft und das unerträgliche Gebrüll der Vögel ...!

  4. #4
    Registriert seit
    16.05.2007
    Ort
    im Stahlwerk...
    Beiträge
    1.178
    Danke
    120
    Erhielt 429 Danke für 236 Beiträge

    Standard

    Hallo Matthias,

    so wie ich das verstanden habe, willst Du aus deinen 100 "fliessenden" Messwerten die Standardabweichung bilden.
    Der Parameter "TBL" und "OUT" sind zwar durch das Format "Pointer" definiert. Aber ich habe dort in einem meiner Programme lediglich für "TBL" ein Datenwort im Format WORD im Messwert-DB mit voradressiertem Inhalt deklariert (in Deinem Fall #64 für 100dez) diesen kannst Du dann an den Baustein legen. Für "OUT" gilt das Gleiche, nur habe ich dort das Format REAL am Ende der Messwerte angelegt.
    Also:
    Code:
    DBxy.DBW0 = TBL FC102
    DBxy.DBD2 //Messwert 1 (gleitend beschrieben)
    DBxy.DBD6 //Messwert 2               "
    .
    .
    .
    DBxy.DBD398 //Messwert 100         "
    DBxy.DBD402 //OUT FC102
    Das mit dem Pointer ist meiner MEinung nach nur etwas irreführend.
    Gruß Approx
    Nihil est in cpu, quod non fuerit in intellectu" - Nichts ist in der CPU, was nicht (zuvor) im Verstand war.

  5. #5
    Matthias O. ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.06.2006
    Beiträge
    18
    Danke
    0
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Danke für die raschen Antworten!

    Aber ich komm nicht weiter!

    meiner meinung solte es ja irgendwie so funktionieren:

    Code:
     L     DINO
          T     #DINO_WORD
          AUF   DB [#DINO_WORD]
    ...
    ....
    ....
    
     TAR2  
          UD    DW#16#FFFFFF
          LAR1  P##SDEV_WERT      // #sdev_wert zeigt auf die zelle wo der 
          +AR1                    // errechnete Wert hingeschrieben werden soll
    
    
          CALL  FC   102
           TBL    :=DBD [ar1,p#14.0] // 14 Bytes später beginnt die Tabelle mit der Anzahl der Einträge und dann folgen die Einträge
           OUT    :=DBD [ar1,p#0.0]
           E_TYPE :=B#16#8
           RET_VAL:=#ret_val_sdev
    Aber wie übergebe ich die ermittelten Adressen den Anschlüssen TBL und OUT?
    Wie bekomme ich die DB Nunmmer in den Zeiger?

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.800
    Danke
    399
    Erhielt 2.418 Danke für 2.014 Beiträge

    Standard

    Hallo,
    das wird wohl so nichts.
    Du müßtest hier die Variable im Klartext (symbolisch oder absolut) übergeben - also z.B. :
    Code:
         CALL  FC   102
           TBL    :=DB100.DBD10
           OUT    :=DB100.DBD24
           E_TYPE :=B#16#8
           RET_VAL:=#ret_val_sdev
    aber ...
    Wenn du die bisherige Auswertung deiner Daten schon erstellt hast ... warum machst du dann die Statistik nicht auch in dem FB ?

    Gruß
    LL

  7. #7
    Registriert seit
    16.05.2007
    Ort
    im Stahlwerk...
    Beiträge
    1.178
    Danke
    120
    Erhielt 429 Danke für 236 Beiträge

    Standard

    @Larry: richtig! Ich glaube, die Hilfe des FC102 verwirrt etwas, wegen des Pointerformates der Parameter TBL und OUT. In Wirklichkeit reicht ein direktes Adressieren. Wobei bei mir der TBL eine DB-Variable vom TYP WORD ausreicht (z.B. DB100.DBW0). Dort muss die Anzahl der Messwerte im hex-Format drinstehen. Die berechnete Standardabweichung "OUT" des FC102 war bei mir vom TYP REAL (z.B. DB100.DBD402). Dazwischen hatte ich die 100 gleitenden Messwert-REALs.

    @Matthias: Du hast doch schon geschrieben:
    Übrigens wenn ich direkt die absolute Adresse des Instanz DBs eingebe (P#DB99.dbx460.0) funktioniert die Funktion!
    Was ich noch nicht ganz verstanden habe ist das "wer ruft wen wie auf und wo in welchem DB sind die 100 Messwerte"

    Gruß
    Nihil est in cpu, quod non fuerit in intellectu" - Nichts ist in der CPU, was nicht (zuvor) im Verstand war.

  8. #8
    Registriert seit
    05.11.2009
    Beiträge
    42
    Danke
    1
    Erhielt 6 Danke für 5 Beiträge

    Standard

    Zitat Zitat von Matthias O. Beitrag anzeigen
    Danke für die raschen Antworten!

    Aber ich komm nicht weiter!

    meiner meinung solte es ja irgendwie so funktionieren:

    Code:
     L     DINO
          T     #DINO_WORD
          AUF   DB [#DINO_WORD]
    ...
    ....
    ....
    
     TAR2  
          UD    DW#16#FFFFFF
          LAR1  P##SDEV_WERT      // #sdev_wert zeigt auf die zelle wo der 
          +AR1                    // errechnete Wert hingeschrieben werden soll
    
    
          CALL  FC   102
           TBL    :=DBD [ar1,p#14.0] // 14 Bytes später beginnt die Tabelle mit der Anzahl der Einträge und dann folgen die Einträge
           OUT    :=DBD [ar1,p#0.0]
           E_TYPE :=B#16#8
           RET_VAL:=#ret_val_sdev
    Aber wie übergebe ich die ermittelten Adressen den Anschlüssen TBL und OUT?
    Wie bekomme ich die DB Nunmmer in den Zeiger?
    das hatte oben schon jemand geschrieben .. der erste Link zeigt den Aufbau eines Any-Zeigers. IM Wort 4 steht die DB Nummer glaube ich. Habe den Link gerade nicht.
    Den Anyzeiger kannst du dann auf den Bajustein legen. Ansonsten würde ich empfeheln den DB (Nr.) und den AdressPointer getrennt an den BAustein zu übergeben wenn du keinen Anyzeiger basteln willst. Das ist evtl einfacher für dich.

    IN: DBNr
    IN: TempAdress


    oderso.... und noch ein Tipp: Finger weg vom AR2 !! das sschreibt das System drin rum. (Bei 300er CPUs auf jeden Fall)


    Gruß Philip

  9. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.803
    Danke
    144
    Erhielt 1.712 Danke für 1.242 Beiträge

    Standard

    Zitat Zitat von Approx Beitrag anzeigen
    Das mit dem Pointer ist meiner MEinung nach nur etwas irreführend.
    Das mit dem Pointer stimmt schon, nur baut dir den der S7-Editor automatisch passend zusammen.
    Das ist auch der Grund warum sich dieser Pointer nicht händisch zusammenstellen und dann an den Baustein anschalten lässt. Zumindest würde mir nichts einfallen.
    Die Datenbausteinnummer könnte man jedoch mit einem kleinen Hack variabel gestalten.

    Bevor ich da 2 Tage dran rumtüftel, würde ich vielleicht in 1 Stunde einen eigenen Baustein schreiben.

  10. #10
    Registriert seit
    05.11.2009
    Beiträge
    42
    Danke
    1
    Erhielt 6 Danke für 5 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Das mit dem Pointer stimmt schon, nur baut dir den der S7-Editor automatisch passend zusammen.
    Das ist auch der Grund warum sich dieser Pointer nicht händisch zusammenstellen und dann an den Baustein anschalten lässt.
    nö falsch ausser wir reden aneiander vorbei. AnyZeiger kann man von hand zusammenbasteln. Steht auch immernoch im 1. Link des Threads. Sind ja auch nur 10Byte mit Adresse, Datentyp Länge und startadresse.
    IN FCs kann man die Anyzeiger nur im Temp Bereich erstellen. Sie werden dort mit L für Lokadtaen adresiert. Bsp: LB 0 = LokaldatenByte 0

    Wenn du einfach den ZEiger als Temp erstellst und dann in die Byte und Wörter nach vorgabe wie im Link deine Daten schreibst gehts das.

    Gruß Philip

Ähnliche Themen

  1. Pointer indirekt zu adressieren
    Von Erich04 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 26.05.2011, 07:54
  2. UDT Indirekt Adressieren
    Von EULANER im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 14.11.2010, 19:30
  3. SFC 20 indirekt adressieren
    Von drmicha im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 19.10.2009, 09:24
  4. DB-Pointer indirekt Adressieren
    Von Anonymous im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 19.03.2004, 16:59
  5. ANY-Pointer indirekt adressieren
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 14.02.2004, 15:41

Stichworte

Lesezeichen

Berechtigungen

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