Any-Pointer ohne SFC20 verwenden

RONIN

Level-3
Beiträge
2.518
Reaktionspunkte
765
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute

Ich möchte aus einem größeren Datenfeld innerhalb eines DB's gezielt 2 INT auslesen und dann in den Temp-Bereich eines FC's schreiben

Als Vorgabe kann ich anbieten:
AD_DbNr (Datenbaustein-Nummer)
AD_ByteNr (Byte Nummer innerhalb des Datenbausteins an dem die 2 INT beginnen)

Jetzt kann ich mir mit diesen Angaben einen Any-Pointer auf meine Daten bauen, und könnte dann mittels eines Ziel-Any-Zeigers und dem SFB20(Blockmove) diese 4 Byte verschieben.

Jetzt erscheint es aber ein wenig aufwendig und unschön wegen 2 Int-Werten, 2-Anyzeiger zu erzeugen und dann auch noch den SFC20 zu verwenden.

Gibst da ne einfachere Lösung
 
Versuche es mal so:

Code:
      L     #AD_DBNr
      T     #My_Word                    //Temp Word
      AUF   DB [#My_Word]

      L     #AD_ByteNr
      T     #My_Dword                   //Temp DWord
      SLD   3
      L     DBD [#My_Dword]
      T     #MyTemp_001                 //Temp DWord
 
Zuletzt bearbeitet:
Jetzt kann ich mir mit diesen Angaben einen Any-Pointer auf meine Daten bauen, und könnte dann mittels eines Ziel-Any-Zeigers und dem SFB20(Blockmove) diese 4 Byte verschieben.

Jetzt erscheint es aber ein wenig aufwendig und unschön wegen 2 Int-Werten, 2-Anyzeiger zu erzeugen und dann auch noch den SFC20 zu verwenden.
Hallo Ronin,
ich verstehe Deine Frage nicht.
Du kannst Any Zeiger erstellen, weißt aber nicht wie auf zwei Int zugreifst?
L DB x DBW y

Also wenn Dein Datenfeld Symbolisch geschrieben ist, sollte das doch absolut kein Problem sein.
L "Daten".Sollwert_1
L "Daten".Sollwert_2
 
Code:
L  AD_DbNr
T  LW0   //DB Nummer in Lokaldaten umspeichern, sonst kann auf nicht verw. werden
AUF DB [LW0]
L AD_ByteNr
SLD 3
LAR1
L DBD[AR1,P#0.0]
etzt hast du beide ints im akku...

sofern sie zusammenhängend drin stehen ^^

aber die fragestellung an sich versteh ich so ganz auch nicht ... wenn du doch db und byte-adresse hast kann man doch mit DBx.DBWy ansprechen :rolleyes:
 
Hallo Ronin,
ich verstehe Deine Frage nicht.
Du kannst Any Zeiger erstellen, weißt aber nicht wie auf zwei Int zugreifst?
L DB x DBW y

Also wenn Dein Datenfeld Symbolisch geschrieben ist, sollte das doch absolut kein Problem sein.
L "Daten".Sollwert_1
L "Daten".Sollwert_2

L DB x DBW y, dass behersche ich gerade so noch. Das Problem ist dass nicht jedesmal die 2 selben Interger aus dem Datenfeld hole, sondern je nach ergebnis einer Berechnung hole ich ein anderer Integerpaar aus dem Datenfeld. Das Feld ist über 200 Byte lang, also über 100 Integerpaare, wenn ich diese Fallabhängig mit direkter Adressierung lade fall ich wegen Altersschwäche vom Stuhl bevor ich das Netzwerk fertig habe.


Code:
L  AD_DbNr
T  LW0   //DB Nummer in Lokaldaten umspeichern, sonst kann auf nicht verw. werden
AUF DB [LW0]
L AD_ByteNr
SLD 3
LAR1
L DBD[AR1,P#0.0]

jetzt hast du beide ints im akku...

OHA.... Das ist interessant. Das war eigentlich mein hauptproblem bei der Addressierung über einen Pointer. Da die DB_Nr als Variable konnte ich den AUF-Befehl nicht verwenden. Ich wusste nicht dass es über die Lokaldaten geht. Werde das morgen gleich ausprobieren.

Warum geht das mit dem AUF-Befehl ausgerechnet über die Lokaldaten.
 
Zuletzt bearbeitet:
integer-paar? aha? wie ist dein DB aufgebaut? ich behaupte, dass su da mit indirekter adressierung genau richtig bist ... es gibt eine abhängigkeit zwischen ergebnis der berechnung und dem wertepaar, welches du abholst, das ist ein klassischer fall für indirekte adressierung!
 
Das fragst du besser Siemens, aber nimm nicht LW0, sondern eine symbolisch im Temp definierte Word, das ist sicherer und besser.

Das ist wirklich interessant. Bin schon öfters vor dem Problem gestanden das wenn ich mit Pointern gearbeitet habe, das es daran gescheitert ist das ich eine Variable DB-Nummer hatte und damit der AUF-Befehl ausschied.

Bin dann immer auf händisch zusammengebaute Any-Pointer ausgewichen. Toll das ich den Trick jetzt auch kenne.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
integer-paar? aha? wie ist dein DB aufgebaut? ich behaupte, dass su da mit indirekter adressierung genau richtig bist ... es gibt eine abhängigkeit zwischen ergebnis der berechnung und dem wertepaar, welches du abholst, das ist ein klassischer fall für indirekte adressierung!

Es ist genau so wie du schreibst.
Natürlich ist damit der klassische Fall für indirekt Adressierung, deshalb habe ich es ja auch von Anfang an damit versucht.

Und an dieser indirekten Adressierung ist es gescheitert (Wegen der Variablen DB-Nr) , oder ich hätts extrem umständlich über 2 Any-Pointer und SFC20 machen müssen.
 
Zuletzt bearbeitet:
Zurück
Oben