Step 7 Verschiedene Datenbausteine mit Pointer beschreiben

Elektro Wolf

Level-1
Beiträge
38
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Leute,

ich habe gerade ein ziemliches Problem, wo ich langsam mit meinem Latein am Ende bin.

Ich möchte ein Integer in verschiedene Datenbaustein beschreiben, dass sich aller 100 Byte wiederholt.
z.B. DB1.DBW32, DB1.DBW132, DB1.DBW232, DB2.DBW32, DB2.DBW132 usw.

Mit folgendem Code konnte ich es teilweise lösen:

L #Laufvariable //Start mit 1
+ -1
L 100
*I
+ 32
SLD 3
LAR1
AUF DB1
L DBW [AR1,P#0.0]
L 1
+I
T DBW [AR1,P#0.0]

Damit kann ich aber nur die DB1 beschreiben. Ich muss irgendwie mit einer Eingangs Variable von einer Funktione auf verschiedene Datenbausteine zugreifen.
Dies ist zwar mit einem Any-Pointer möglich, aber mit BLKMOV kann ich nur Datenbausteine beschreiben und nicht den Wert laden, diese +1 erhöhen und wieder beschreiben.

Ich hoffe ihr könnt mir weiterhelfen :|

Gruß Wolf
 
Hallo,
mal ungeachtet von deinem Vorhaben - in deinem geposteten Code befinden sich noch einige Ungereimtheiten. Dein Pointer wird so nicht funktionieren und eine Schleife sehe ich da auch nicht wirklich.
Wie auch immer - du kannst natürlích auch einen DB indirekt adressieren.
Wenn du immer gleich große Datenbereiche kopieren willst dann würde sich der Blockmove gegenüber einer Schleife anbieten - alleine wegen der Laufzeit. Von Fehlersuche mal ganz zu schweigen. Einen ANYPointer zu bauen ist nicht wirklich ein Hexenwerk.

Auf der anderen Seite habe ich aus deiner Beschreibung nicht wirklich verstanden, was du machen willst ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Nur interessehalber, Dein besagtes Integer, an wie viele verschiedene Ziele soll das denn transferiert werden?
Wenn es nur 10 oder 20 Ziele sind und der Abstand von 100 Wörtern konstant bleibt,
dann würde ich auch nicht davor zurückschrecken das direkt zu adressieren (dann taucht das wenigstens in den Querverweisen auf)
Wenn es natürlich hunderte von Zielen werden sieht die Sache wieder anders aus........
 
Hallo Larry,

es ist auch nur ein Programmschnipsel. Und der funktioniert, ich habe es ja selber beobachten können.

Any-Pointer ist auch kein Hexenwerk.
Es ging darum den Wert zu Laden, es um 1 zu erhöhen und wieder reinschreiben.

Also das mit dem Aufzählen ist jetzt so kein Problem mehr. Dafür habe ich eine andere Idee gehabt.
Jetzt habe ich ein anderes Problem, und zwar kann ich eine einzelne Bit Adresse nicht mehr beschreiben.

Ein weiterer Schnipsel die es evtl. näher erläutert:

SET
= "Error_Count".KOMM_IO

LAR1 P##P_ANY
L B#16#10 //Syntax ID
T LB [AR1,P#0.0]
L B#16#1 //Typ Bool
T LB [AR1,P#1.0]
L W#16#8 //Länge in Byte
T LW [AR1,P#2.0]
L #DB_NR //DB
T LW [AR1,P#4.0]

L #UMG_NR //Start
+ -1
L 100
*I
+ 34
SLD 3
T LD [AR1,P#6.0]
L B#16#84 //Bereichskennung DB
T LB [AR1,P#6.0]

CALL "BLKMOV"
SRCBLK :="Error_Count".KOMM_IO
RET_VAL:=#RET_VAL_SFC20
DSTBLK :=#P_ANY

Hast du vielleicht eine Ahnung, wie man über Any Pointer einen einzelnen Bit beschreibt?
 
Hallo
Nur interessehalber, Dein besagtes Integer, an wie viele verschiedene Ziele soll das denn transferiert werden?
Wenn es nur 10 oder 20 Ziele sind und der Abstand von 100 Wörtern konstant bleibt,
dann würde ich auch nicht davor zurückschrecken das direkt zu adressieren (dann taucht das wenigstens in den Querverweisen auf)
Wenn es natürlich hunderte von Zielen werden sieht die Sache wieder anders aus........

Maximale Ziele sind 247 :|
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast du vielleicht eine Ahnung, wie man über Any Pointer einen einzelnen Bit beschreibt?

Genau so ...
Der Pointer, wie von dir gebildet, adressiert in Wahrheit die Bitadresse.
Dadurch, dass du dein '134' drei mal nach links schiebst (du hättest hier auch * 8 schreiben können) erzeugst du die Adresse des ersten Bits in dem Byte.
Allerdings kommt die Bit-Geschichte in Verbindung mit dem Blockmove nicht so richtig ...

Gruß
Larry
 
Sind die "Ziele" vielleicht Instanz-DB's, oder Multi-Instanz-DB's ?
Wenn ja, dann einfach den Inkrementierung in die dazuhörige FB's programmieren. Dann hast du kein Bedarf über Pointer zu programmieren. Und alles ist symbolisch usw. usw.
 
Zurück
Oben