Adressierungs Problem im DB

MarioDisketti

Level-1
Beiträge
47
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich, als SPS "Spielkind", habe ein Problem mit der
indirekten Adressierung.
Komischerweise scheint es so wie es jetzt da steht zu
funktionieren, aber ich weiß nicht genau warum :|

Zugegeben ist das was jetzt kommt sicherlich recht
verwirrend aber es wäre schön wenn Sich jemand die
Mühe machen könnte mir zu erklären warum (siehe Unten,
ab Hier kommt's) ich dort ein SLD 4 anstatt des SLD 3
angeben muß ? Eigentlich muß man doch nur um 3 nach
links schieben, aber dann funktioniert's nicht.

Was versuche ich:

Ein FC bekommt als Parameter 2 Word's
1. DB Nummer des DB's mit allgemeinen Merkern
2. DB Nummer des DB's der Device abhängige Parameter enthält.

Da es mehrere Devices gibt wird der FC immmer mit der gleichen
DB Nummer der allgemeinen Merker und immer mit der DB Nummer
des entsprechenden Devices aufgerufen:

CALL FC3
DB_Merker:=W#16#4E -- DB allgemeine Merker
DB_Device:=W#16#1 -- DB des Device

CALL FC3
DB_Merker:=W#16#4E
DB_Device:=W#16#2


Die Aufgabe des FC's besteht darin die Uhrzeit aus
dem aktuellen Merker DB zu lesen, temporär zu speichern
und dann mit einer von 30 Zeiten zu vergleichen.
Bei Übereinstimmung einer Zeit wird im Device DB ein
Offset (0-3) (ab 112.0) gelesen. Dieser bestimmt die
Speicherstelle (10.0 + Offset (0-3)) deren Zeit nach
18.0 kopiert wird.
Gleichzeitig wird ein Bit gesetzt.
Dabei Sind die Zeiten wie folgt im Device DB gespeichert:

:
1.1 Start Bit
:
10.0 Zeit (10.0 + Zeit Offset 0) S5Time S5T#3S
12.0 Zeit (10.0 + Zeit Offset 1) S5Time S5T#5S
14.0 Zeit (10.0 + Zeit Offset 2) S5Time S5T#10S
16.0 Zeit (10.0 + Zeit Offset 3) S5Time S5T#18S
18.0 SollZeit S5Time
:
22.0 - 51.0 Stunden als Byte
52.0 - 81.0 Minuten als Byte
82.0 - 111.0 Sekunden als Byte
112.0 - 141.0 Offset (0-3) als Byte
:

Also so sieht der Anfang aus


L #DB_Merker
T #DB_Merker_temp
LAR1 P#0.0 // AR1 als Zeiger auf ersten Speicherplatz

AUF DB [#DB_Merker_temp]

L DBB [AR1,P#1.0] // umkopieren der Zeit
T #Akt_Tag
L DBB [AR1,P#2.0]
T #Akt_Stunde
L DBB [AR1,P#3.0]
T #Akt_Minute
L DBB [AR1,P#4.0]
T #Akt_Sekunde
L DBB [AR1,P#6.0]
T #ArrayIndex // Index der gewünschte Zeit 0-29



Dann folgen die Device Informationen

L #DB_Device
T #DB_Device_Temp
LAR1 P#0.0 // AR1 als Zeiger auf ersten Speicherplatz des Device

AUF DB [#DB_Device_Temp]

TAR1 AR2 // AR2 sollte wie AR1 jetzt auf ersten Speicherplatz des Devices zeigen
L #ArrayIndex // ArrayIndex = Zeit dies es zu testen gilt
SLD 3 // Shift um auf Byte Adressierung zu kommen
+AR2 // und zum Zeiger AR2 addieren, damit sollte AR2 um ArrayIndex Bytes
// im DB versetzt "zeigen"


Jetzt Zeit vergleichen


// ACHTUNG: Da AR2 ja um ArrayIndex versetzt im DB zeigt ergibt
// für ArrayIndex 10 L DBB[AR2,P#22.0] real L DBB[P#32.0]


L DBB [AR2,P#22.0] // ************** Stunde prüfen ***************
L #Akt_Stunde // Aktuelle Stunde laden
==I // Stunde gleich ?
SPB An1 // Ja, weiter bei Minute
SPA end // Nein, ende

An1: L DBB [AR2,P#52.0] // ************** Minute prüfen ***************
L #Akt_Minute
==I
SPB An2
SPA end

An2: L DBB [AR2,P#82.0] // ************** Sekunden prüfen ***************
L #Akt_Sekunde
==I
SPB An3
SPA end

An3: SET
= DBX [AR1,P#1.1] // ************** Bit setzen (AR1 bezieht sich ja noch auf 0.0 ohne ArrayIndex
L DBB [AR2,P#112.0] // Offset für die Zeit in Akku laden
SPA Sav



////////////////////////////////
Hier kommt's
////////////////////////////////


Sav: TAR1 AR2 // Offset ist Akku, AR2 auf Array Anfang (AR1 zeigt ja noch auf 0.0) setzen
SLD 4 // WARUM 4 nach links, eigentlich 3 um auf Byte zu kommen und 4 um Wortadressen zu erzeugen
+AR2 // Offset zu AR2 addieren

L DBW [AR2,P#10.0] // Die Zeit laden und (AR2 ist ja um Offset verschoben also 10.0+Offset)
T DBW [AR1,P#18.0] // ins Soll Feld schreiben

end: BE


Ach ja, falls jemand einen Vorschlag hat wie ich die
Zeiten lesbarer speichern und besser vergleichen kann
bin ich dafür dankbar.

PS: Ach und bitte nicht wieder sowas wie SUCHFUNKTION, Danke !
 
Der Offset enthält 0-3

Du willst dorthin:

10.0 Zeit (10.0 + Zeit Offset 0) S5Time S5T#3S
12.0 Zeit (10.0 + Zeit Offset 1) S5Time S5T#5S
14.0 Zeit (10.0 + Zeit Offset 2) S5Time S5T#10S
16.0 Zeit (10.0 + Zeit Offset 3) S5Time S5T#18S

Um dahin zu kommen, muß der angegebene Offset mit 2 multipliziert werden.

also:

SLD 3 für die Bildung des Pointers
SLD 1 für die Multiplikation mit 2 (nichts anderes ist ein SLD 1)

macht zusammen

SLD 4
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ralle,

Danke Dir, klar Brett vor Kopf !!!

Logisch, danke Dir !!! So spät, so schnell !

Hätte ich garnicht soviel schreiben müssen :ROFLMAO:

Kleine Anmerkung, es muß natürlich SLD und nicht SRD sein ;-)
 
Hi Ralle,

Danke Dir, klar Brett vor Kopf !!!

Logisch, danke Dir !!! So spät, so schnell !

Hätte ich garnicht soviel schreiben müssen :ROFLMAO:

Kleine Anmerkung, es muß natürlich SLD und nicht SRD sein ;-)

Ja voll korrekt, du hast Recht, ich editiere das mal, damit sich niemand etwas falsches merkt ;)!
 
Zurück
Oben