Adressregister, indirekte Adressierung

qpec_hagen

Level-1
Beiträge
105
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,
habe mal eine Frage bezüglich indirekter Adressierung und dem Adressregister. Habe mir einen FB erstellt, welcher abhängig vom Eingang (Wort) am Ausgang einzelne Bits setzen soll. Dazu lade ich mir das Wort ins Adressregsiter. Die Frage ist nun: kann ich den Wert, welchen ich im Register habe direkt dazu nutzen, die passende Adresse der Lokaldaten (Out) zu setzen??
Code ist ungefähr so:
L #IN
T MD100
T MW[MD100]
LAR1
S L[AR1,P#0.0]
.....

Leider wird diese lokale Ausgangsadresse dann aber nicht gesetzt.

LG
 
:confused: mit dem Code kann ich gar nichts in Verbindung mit deiner Beschreibung anfangen.
Mach es doch bitte lieber so, dass du noch einmal und langsam beschreibst, was genau passieren soll.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Einfach gesagt möchte ich in Abhängigkeit von dem In ein Bit setzen. Habe als In ein Wort und als Out ein Wort (in dem verschieden Bits gesetzt werden sollen; im Prinzip fortlaufend mit steigenden Wert am In). So möchte ich mit dem Wert 1 am Eingang das erste Bit (0.0) am Out des Bausteins setzen (in meinem Falle Lokaladresse 4.0).
 
Vielen Dank Marcel,

jetzt habe ich im AR1 zb die Adresse 4.0 stehen und nutze den Befehl
= DIX[AR1,p#0.0]
Damit sollte doch eigentlich DBxx.DBX4.0 gesetzt werden oder? Das geschieht nämlich nicht
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja sollte eigentlich so sein. Es sei denn das Bit wird später im Programm wieder beschrieben.

Was genau steht im AR1 und im DB2 bei dir?

EDIT: Hast du auch VKE=1? Sonst wird das Bit nicht gesetzt ;)
Code:
L #IN
T MD100
T MW[MD100]
LAR1
[B]SET[/B]              // oder [B]U #bedingung[/B]
S DIX[AR1,P#0.0]
 
Zuletzt bearbeitet:
@Marcel: soweit schonmal danke. Leider wird kein Bit gesetzt auch nicht wenn ich mit SET....S DIX arbeite.

EDIT: habe im AR1 die Adresse 4.0 stehen und im DB wird nichts gesetzt
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Versuch mal:
Code:
L #Byte      // Byte Adresse
SLD 3
L #Bit     // Anzsuprechendes Bit (0-7)
+I
LAR1

Also für dein Fall

Code:
L 4 // Byte-Offset
SLD 3
L #IN // Bit
+I
LAR1
SET
S DIX [AR1, P#0.0]
 
Zuletzt bearbeitet:
@Marcel: habe das mal in einem neuen Projekt nachgebaut und gePLCSimt und nicht mal das klappt. Habe den Code 1:1 übernommen.
 
Das geht dann so nicht, du mußt erst die Adresse deiner Out herausfinden.
Hier mal ein Bespiel:

Code:
      CLR   
      =     #Bool_0
      =     #Bool_1
      =     #Bool_2


      L     P##Bool_0                   //Bool_0 ist dein erstes "Outbit", dass du adressieren willst
      L     #IN                         //für Bit 0 steht dort eine 0m für Bit 1 eine 1 usw. 
      +D    
      TAR2  
      +D    
      LAR1  
      SET   
      S     DIX [AR1,P#0.0]

Bool_0, Bool_1, Bool_2 sind als Out Bool definiert.
Wenn an #IN eine 0 steht, wird Bool_0 True, bei 1 Bool_1 usw.

TAR2
+D

dient dazu, den FB auch in einer Multiinstanz laufen zu lassen, wenn später mal gewünscht.

Am Anfang die Bool_... alle auf False, sonst werden di nirgends mehr gelöscht, wenn man das Bit umwählt.

Teste das mal und verändere es nach deinen Wünschen.
 
@Ralle: Danke aber klappt auch so bei mir jetzt.
L #IN
LAR1
+AR1 #Offset
SET
= DIX[AR1,P#0.0]

wobei das P#0.0 ja auch mein Offset sein könnte ;-)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Ralle: Danke aber klappt auch so bei mir jetzt.
L #IN
LAR1
+AR1 #Offset
SET
= DIX[AR1,P#0.0]

wobei das P#0.0 ja auch mein Offset sein könnte ;-)

Aber vorsicht, wenn du bei IN oder in OUT vor deinen Variablen etwas hinzufügst, kann dein Code auf falsche Variablen schreiben! Daher ist es u.U. sicherer, die Adresse wie oben gezeigt auszulesen.
 
Zurück
Oben