Pointer indirekt adressieren! Aber wie? FC 102 DEV MAT_FP

Matthias O.

Level-1
Beiträge
18
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!

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

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    := [B]?????[/B]
       OUT    := [B]?????[/B]
       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!
 
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
 
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    :=[B][COLOR=Red]DBD [ar1,p#14.0][/COLOR] [/B]// 14 Bytes später beginnt die Tabelle mit der Anzahl der Einträge und dann folgen die Einträge
       OUT    :=[COLOR=Red][B]DBD [ar1,p#0.0][/B][/COLOR]
       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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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    :=[B][COLOR=red]DB100.DBD10[/COLOR][/B]
       OUT    :=[COLOR=red][B]DB100.DBD24[/B][/COLOR]
       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
 
@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ß
 
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    :=[B][COLOR=Red]DBD [ar1,p#14.0][/COLOR] [/B]// 14 Bytes später beginnt die Tabelle mit der Anzahl der Einträge und dann folgen die Einträge
       OUT    :=[COLOR=Red][B]DBD [ar1,p#0.0][/B][/COLOR]
       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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

Genau das meine ich ja! Hab ja nicht geschrieben, dass Pointer falsch ist. Er ist meiner Meinung halt etwas irreführend. Jeder der Pointerformat liest, denkt doch gleich an SLW3 und P#... usw...
Das belegen auch die fix geposteten Links zum Thema "Pointer selber zusammenbauen" - welche aber nicht das eigentliche Prob mit dem FC102 aufklären...

Gruß
 
Zurück
Oben