ANY Pointer aus Variablen und dann weiter mit dem SFC 20

gerdh

Level-2
Beiträge
103
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo !

Bisher habe ich den SFC 20 aufgerufen mit
SRCBLK:= P#EX.Y Byte 64
DSTBLK := #Variable_wo_das_zeug_reinpasst
(den RET_VAL schenke ich mir mal)
:)
Siemens Hilfe hab ich schon rauf und runter durch aber irgendwie krieg ich es nicht auf die Reihe....
jetzt will ich das Ganze multiinstanzfaehig gestalten
ich habe eine Boolsche IN variable nennen wir sie mal IN_BOOL und eine INT IN nenen wir die mal IN_INT (variable mit dem Wert 64)
ich will also quasi aus dem was ueber IN_BOOL und IN_INT reinkommt die Variable zusammenstellen...

Ich steh da komplett auf dem Schlauch :(


gruss gerd
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi !

Ja klar habe ich.... das mit dem zusammenbauen mal aussen vor zu lassen.. angenommen der any Pointer steht nun im AR1 wie rufe ich damit dem SFC20 auf ?
Wo kann ich AR1 hinkopieren damit ich es verwende kann....

Gruss gerd
 
ich mache das so:

Code:
   LAR1  P##ANY_PTR_Q                // Adresse des 1. lokalen Any- Zeigers
      L     W#16#1002                   // Kennung für Any - Zeiger
      T     LW [AR1,P#0.0]              // Syntax -ID und Typkennung eintragen
      L     #Laenge_in_Byte             // Länge in Bytes
      T     LW [AR1,P#2.0]              // Länge eintragen
      L     #Quelle_Anfang              // Anfangsadresse als Bytenummer
      SLD   3                           // in Byte - Adresse umwandeln
      OD    DW#16#84000000              // Bereichszeiger auf DB-Operanden bilden
      T     LD [AR1,P#6.0]              // und eintragen  
      L     #Quell_DB                   // DB - Nummer        
      T     LW [AR1,P#4.0]              // auch in ANY - Zeiger eintragen
      LAR1  P##ANY_PTR_Z                // Adresse des 2. lokalen Any- Zeigers
      L     W#16#1002                   // Kennung für Any - Zeiger
      T     LW [AR1,P#0.0]              // Syntax -ID und Typkennung eintragen
      L     #Laenge_in_Byte             // Länge in Bytes
      T     LW [AR1,P#2.0]              // Länge eintragen
      L     #Ziel_Anfang                // Anfangsadresse als Bytenummer
      SLD   3                           // in Byte - Adresse umwandeln
      OD    DW#16#84000000              // Bereichszeiger auf DB-Operanden bilden
      T     LD [AR1,P#6.0]              // und eintragen              
      L     #Ziel_DB                    // Ziel - DB Nummer
      T     LW [AR1,P#4.0]              // auch in ANY - Zeiger eintragen
      CALL  "BLKMOV"
       SRCBLK :=#ANY_PTR_Q
       RET_VAL:=#ERROR
       DSTBLK :=#ANY_PTR_Z

wobei hier Länge, Startrange und DB-Nummer als IN-Parameter hereingeführt werden. Die Pointer ist als TEMP angelegt.
 
Hi !

Soweit bin ich ja auch fast schon.... aber im Prinzip (wenn ich jetzt auf das Beispiel mit dem Eingang zureuckgreife => wie kriege ich die In Variable (bzw. was von aussen da drin steht) z.B. E256.0 in einen Any Pointer (der temporaer deklariert ist...
dann muesste ich nur noch die Anzahl der Bytes aendern und Voila => er passt :)

aber egal.... hier mal das bisherige
Adresse und Anzahl_Bytes sind in Variablen im Integer format
Code:
     L     P##Adresse_EKS
      L     B#16#02              //Typ BYTE
      T     %LB1
      L     #Anz_Bytes           //Anzahl (Wiederholungsfaktor)
      T     %LW2
      L     #Adresse             //Anfangsadresse
//Pointer bauen
      T     %LD6
      L     B#16#81              //Speicherbereich (Eingaenge)
      T     %LB6

      CALL  BLKMOV
         SRCBLK  :=#Adresse_EKS
         RET_VAL :=#RET_VAL_SFC20_1
         DSTBLK  :=#EKS_Daten

Gruss Gerd
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Na ja, der SFC 20 kann soweit ich weis nur BYTES übertragen.

Damit wäre Dein IN_BOOL hinfällig und IN_INT die Startadresse. Länge 1.
Oder IN_INT ist die Länge, dann brauchst Du noch die Startadresse.

War so was ähnliches nicht die Woche schon mal im Forum?
 
Was übersetzt heist: Mache einen Pointer auf Eingänge,ab dem Bit 256.0, 64 Bytes lang.

Noch mal auf Anfang:

WAS soll von WO kopiert werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi !

Soweit bin ich ja auch fast schon.... aber im Prinzip (wenn ich jetzt auf das Beispiel mit dem Eingang zureuckgreife => wie kriege ich die In Variable (bzw. was von aussen da drin steht) z.B. E256.0 in einen Any Pointer (der temporaer deklariert ist...
dann muesste ich nur noch die Anzahl der Bytes aendern und Voila => er passt :)

aber egal.... hier mal das bisherige
Adresse und Anzahl_Bytes sind in Variablen im Integer format
Code:
     L     P##Adresse_EKS
      L     B#16#02              //Typ BYTE
      T     %LB1
      L     #Anz_Bytes           //Anzahl (Wiederholungsfaktor)
      T     %LW2
      L     #Adresse             //Anfangsadresse
//Pointer bauen
      T     %LD6
      L     B#16#81              //Speicherbereich (Eingaenge)
      T     %LB6

      CALL  BLKMOV
         SRCBLK  :=#Adresse_EKS
         RET_VAL :=#RET_VAL_SFC20_1
         DSTBLK  :=#EKS_Daten

Gruss Gerd

Was steht denn in Adresse?
256
oder richtiger Weise
2048 (Pointerformat nach SLD 3)

Schau dir mal den Code von dtsclipper an, der ist besser.
Deine Zugriffe auf LB, LW, LD sind nicht zu empfehlen, das L P##Adresse_EKS ist dadurch bei dir auch ohne Wirkung. Mach das so wie im Beispiel, dann wird das vielleicht was. Deine Code funktioniert nur, wenn Adresse_EKS als Any an erster Stelle im Temp-Bereich steht, also bei LW 0 beginnt.
 
also so funktionierts (denb SFC 20 hab ich ins naexhste NW ausgelagert :)
Code:
M001: L     P##Adresse_EKS
      L     W#16#1002            // Kennung für Any - Zeiger
      T LW [ AR1 , P#0.0 ]
      L     #Anz_Bytes           //Anzahl (Wiederholungsfaktor)
      T     %LW2
      L     #Adresse             //Anfangsadresse
      SLD   3                    //Pointer bauen
      T     %LD6
      L     B#16#81              //Speicherbereich (Eingaenge)
      T     %LB6

Durch was sollte ich LW und LD "ersetzen" ?

so ?
Code:
M001: L     P##Adresse_EKS
      L     W#16#1002            // Kennung für Any - Zeiger
      T LW [ AR1 , P#0.0 ]
      L     #Anz_Bytes           //Anzahl (Wiederholungsfaktor)
      T  LW [ AR1 , P#2.0]
      L     #Adresse             //Anfangsadresse
      SLD   3                    //Pointer bauen
      T     LD [AR1, P#6.0 ]
      L     B#16#81              //Speicherbereich (Eingaenge)
      T LB [ AR1 , P#6.0 ]
Gruss Gerd
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gerd!

Wo lädst Du das AR1?
Vllt. solltest Du nach dem

L P##Adresse_EKS
ein
LAR1

einfügen. Sonst schreibst Du Deine Daten für den Pointer
sonst wohin.

Grüße
Gebs
 
Hm jetzt wo du es sagst.. aber komischerweise funktionierts :)
Code:
      L     P##Adresse_EKS
      L     W#16#1002            // Kennung für Any - Zeiger
      T LW [ AR1 , P#0.0 ]
      L     #Anz_Bytes           //Anzahl (Wiederholungsfaktor)
      T LW [ AR1 , P#2.0 ]
      L     #Adresse             //Anfangsadresse
      SLD   3                    //Pointer bauen
      T LD [ AR1 , P#6.0 ]
      L     B#16#81              //Speicherbereich (hier Eingaenge)
      T LB [ AR1 , P#6.0 ]

und danach ein
SRCBLK:=#Adresse_EKS
dann liest er das so we ich es will........

gruss gerd
 
Zurück
Oben