ANY Pointer aus Variablen und dann weiter mit dem SFC 20

gerdh

Well-known member
Beiträge
88
Punkte Reaktionen
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:
OP
G

gerdh

Well-known member
Beiträge
88
Punkte Reaktionen
0
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
 

dtsclipper

Well-known member
Beiträge
945
Punkte Reaktionen
219
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.
 
OP
G

gerdh

Well-known member
Beiträge
88
Punkte Reaktionen
0
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:

dtsclipper

Well-known member
Beiträge
945
Punkte Reaktionen
219
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?
 

dtsclipper

Well-known member
Beiträge
945
Punkte Reaktionen
219
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?
 

Ralle

Supermoderator
Teammitglied
Beiträge
15.103
Punkte Reaktionen
3.820
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.
 
OP
G

gerdh

Well-known member
Beiträge
88
Punkte Reaktionen
0
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:

Gebs

Well-known member
Beiträge
846
Punkte Reaktionen
245
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
 
OP
G

gerdh

Well-known member
Beiträge
88
Punkte Reaktionen
0
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
 
Oben