ANY-Pointer

Human

Level-1
Beiträge
272
Reaktionspunkte
33
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich bin gerade dabei für mich einen kleinen FC zu schreiben, der mir einen Any-Pointer ausgeben soll.

Steht ja schon alles schön hier im Forum drin wie man sich einen Do-It-Yourself-AnyPointer strickt: http://www.sps-forum.de/showthread.php?t=12923

Den Pointer krieg ich auch soweit ich das beurteilen kann im TEMP-Bereich gut zusammen, nur ich krieg das Ding einfach nicht in den Out-Bereich reintransferiert, damit ich den weiterbenutzen kann. :confused:
 
Was hast denn genau damit vor, sehe an sich keinen Sinn darin einen Any Pointer auszugeben.

Aber ansonsten, transferiere die 10 Byte aus dem Temp Bereich in den Out Bereich, in dem du vorher einen Any Pointer deklariert hast.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also: Ich zeichne ein paar Messkurven auf und weil das ziemlich viele Werte sind kommen die nur in einen Ringpufferspeicherung und werden dann per DLL in mein Programm geschickt und als Kurve dargestellt.

Die Aufzeichnung mache ich im OB30, damit die Kommunikation im OB1 mir nicht die Messwerte zerhaut.

Wenn man jetzt eine DLL aus der WinAC aufruft muss man als Eingabeparameter zwei Any-Pointer angeben, einen für die Werte, die an die DLL weitergegeben werden, einer für die Werte, die aus der DLL zurückkommen. Da ich da schon ein paar mal einen Any-Pointer brauchen könnte, der ein bisschen dynamischer ist als der statische möchte ich das dann auch gleich mal in einen Standard-FC fassen.
 
@Human:
so wie ich das verstanden habe willst Du dir eine FC basteln die dir einen Any-Pointer zusammenbastelt und an deren Output Du dann eine weitere Temp-Variable ranschreibst um den Anypointer dann an verschiedenen Bausteinen benutzen zu können.
Ich habe mir vor Ewigkeiten dazu mal eine FC geschrieben (die funktioniert auch).
Der Witz an der ganzen Sache ist, dass die Deklaration der Out-Variable im FC nicht vom Datentyp Any sein darf, sondern ein ganz normaler Pointer ist.
Code:
FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1
 
VAR_INPUT
  DB_No : INT ; 
  DBB_No : INT ; 
  LEN : INT ; 
END_VAR
VAR_OUTPUT
  any_point : POINTER ; 
END_VAR
VAR_TEMP
  BZ : DWORD ; //Bereichzeiger auf den Zieldatenbereich
  AR1_sik : DWORD ; //Sicherung AR1
END_VAR
BEGIN
NETWORK
TITLE =
      TAR1  ; 
      T     #AR1_sik; 
      L     P##any_point; 
      LAR1  ; 
      L     D [AR1,P#2.0]; 
      T     #BZ; 
NETWORK
TITLE =
      L     #BZ; 
      LAR1  ; 
      L     W#16#1002; // Typ Byte
      T     W [AR1,P#0.0]; 
      L     #LEN; // Anzahl der Zeichen
      T     W [AR1,P#2.0]; 
      L     #DB_No; // DB-Nummer
      T     W [AR1,P#4.0]; 
      L     #DBB_No; // Byteadresse
      SLD   3; 
      OD    DW#16#84000000; 
      T     D [AR1,P#6.0]; 
      L     #AR1_sik; 
      LAR1  ; 
END_FUNCTION
Der Aufruf des Ganzen sieht dann beispielsweise so aus:
Code:
CALL FC 1
DB_No :=513                     //DB Nummer
DBB_No :=44                    //Byteadresse
LEN :=512                      //Länge in Byte
any_point:=P##temp_var        //Pointer auf die temporäre Anyvariable
Ich hoffe das ist in etwa das, was Du gemeint hattest.
 
Zuletzt bearbeitet:
Hallo Human,
ein ANY-Pointer ist nichts, was du von einem Baustein zurückgeliefert bekommen kannst sondern er ist so gedacht, dass man übergeben kann von wo ein Datenbereich gelesen oder nach wo er geschrieben werden soll.

Wenn du dir mit einem Baustein aus DB-Nr. + Start DBB + Anzahl Bytes (oder ähnlich) einen ANY zusammenbaust um ihn z.B. vom Blockmove (SFC20) verwenden zu lassen, so kannst du diesen doch auch gleich aus dem Baustein heraus aufrufen in dem der ANY erzeugt wird.

Gruß
LL


Edit:
Oder aber man macht es so wie von OHGN vorgeschlagen (der Vorschlag hat auch was) - man übergibt dem Baustein die Adresse, in die der ANY hineingeschrieben werden soll.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also: Ich zeichne ein paar Messkurven auf und weil das ziemlich viele Werte sind kommen die nur in einen Ringpufferspeicherung und werden dann per DLL in mein Programm geschickt und als Kurve dargestellt.

Die Aufzeichnung mache ich im OB30, damit die Kommunikation im OB1 mir nicht die Messwerte zerhaut.

Warum machst du mit dem Baustein, der die Werte aufzeichnet nicht auch die Übertragung ?
Du kannst im OB1 die gleiche Instanz deines FB (ich nehme mal an. dass es so etwas ist) nochmal aufrufen und durch eine entsprechend andere INPUT-Beschaltung den Daten-Transfer starten. Das hätte den Vorteil, dass du die Pointer nicht erst ausrechnen mußt, sondern sie dem FB ja schon bekannt sind und bei einer Änderung des FB gleich automatisch mit-korrigiert werden ...

Gruß
LL
 
ich bin gerade dabei für mich einen kleinen FC zu schreiben, der mir einen Any-Pointer ausgeben soll.

Den Pointer krieg ich auch soweit ich das beurteilen kann im TEMP-Bereich gut zusammen, nur ich krieg das Ding einfach nicht in den Out-Bereich reintransferiert, damit ich den weiterbenutzen kann.

Ein Programmbeispiel für einen ANY-Zeiger als OUT-Parameter an einer Funktion findest Du hier:

http://www.sps-forum.de/showpost.php?p=118914&postcount=10

Gruß Kai
 
ich habe in diesem fall einen fc "flexible blockmove" geschrieben, denn man nun an mehrerern stellen verwenden kann!´

das heißt 2 anypointer bauen, und in der fc den sfc20 damit füttern!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich habe in diesem fall einen fc "flexible blockmove" geschrieben, denn man nun an mehrerern stellen verwenden kann!´

das heißt 2 anypointer bauen, und in der fc den sfc20 damit füttern!

Wenn du die einen FC baust, warum übergibst du dann nicht DB-Nummer, Start und Länge für Quelle und Ziel und baust den Any in deinem FC zusammen?

So in der Art: http://www.sps-forum.de/showpost.php?p=6816&postcount=5
 
Zuletzt bearbeitet:
Zurück
Oben