auf bestimmtes Bit zugreifen

Supervisor

Level-1
Beiträge
93
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich bin`s mal wieder!

Folgendes Problem:

Ist es möglich, von einem eingelesenen Byte ein bestimmtes Bit abzufragen?

Ich möchte beispielsweise diese Abfrage:
Code:
X     E [AR1,P#3.0]
X     A [AR2,P#3.0]       
=     #STATUS

mit diesen zwei Bytes machen
Code:
PEB [AR1,P#3.0]
PAB [AR2,P#3.0]

Gibt es eine Möglichkeit mit Pointern auf ein bestimmtes Bit eines Bytes zeigen zu lassen und dieses Bit dann mit den "normalen" Binäroperationen (U, X, O etc.) weiterzuverarbeiten?

Danke für die Hilfe! ;)
 
Sieht ganz gut aus.

Mit dem AR2 musst du aber bei FB´s mit Multiinstanzen aufpassen, am besten den Inhalt von AR2 speichern und hinterher direkt wieder zurückschreiben.

pt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Missverständnis?

Hallo plc_tippser,

ich glaube wir missverstehen uns. :confused:

Ich möchte diesen Code
Code:
[LEFT]X     E [AR1,P#3.0]
X     A [AR2,P#3.0]       
=     #STATUS[/LEFT]

so schreiben (funktioniert natürlich nicht)
Code:
[LEFT]X     PEB [AR1,P#3.0]
X     PAB [AR2,P#3.0]       
=     #STATUS[/LEFT]

Ich lese quasi ein Byte X mit PEB ein und möchte nun ein bestimmtes Bit von Byte X abfragen. Diese Bit möchte ich nun mit einem anderen Bit von dem Byte Y von PAB vergleichen. Über den Peripheriebereich sind ja, so viel ich weiß, keine Binäroperationen möglich. Es gibt doch nur PEB, PEW und PED bzw. PAB, PAW und PAD.
 
machst du in dem oberen codesegment doch
im ar steht die byteadresse.

nehmen wir an du hast eb124 und ab125

Code:
[LEFT]L 124
SLD3
LAR1 //ar1 verweist nun auf adresse 124
 
L     P#125.0
LAR2 //ar2 verweist nun auf adresse 125
 
X     E [AR1,P#0.2]  //das wäre jetzt e124.2[/LEFT]
 
[LEFT]X     A [AR2,P#0.2]  //a125.2
X     A [AR1,P#1.2]  //a125.2 so gehts auch[/LEFT]

was plc_tippser schreibt solltest du bedenken. da kann zu bösen überaschungen führen.​
 
Zuletzt bearbeitet:
Ihr habt recht und ich bin verwirrt!

Das ist ja alles richtig, was ihr da schreibt. Und dafür bin ich auch sehr dankbar, aber ich will (muss) den Peripheriebereich direkt ansprechen.
Wenn ich das so mache:
Code:
L 124
SLD3
LAR1 //ar1 verweist nun auf adresse 124
 
[LEFT]L 125
SLD3
LAR2 //ar2 verweist nun auf adresse 125[/LEFT]
 
[LEFT]X E [AR1,P#0.2] //das wäre jetzt e124.2[/LEFT]
 
[LEFT]X A [AR2,P#0.2] //a125.2[/LEFT]
X A [AR1,P#1.2] //a125.2 so gehts auch
dann greif ich doch auf das Prozessabbild zu, oder?
Das Problem ist aber, das die Daten über diesen Weg nicht schnell genug aktualisiert werden. Deswegen will ich die Daten über PEB einlesen!
 
Probleme über Probleme!

An so was hatte ich auch schon gedacht, aber da hätten wir das nächste Problem: Ich darf keine Merker benutzen und L PAB xy ist nicht erlaubt!

Ich dachte an so etwas:
Code:
L PEB 124
DW#16#1   //nicht gewünschte Bits ausmaskieren
UD
T #Merker_PEB
 
[COLOR=red][B]L PAB 125[/B][/COLOR]
DW#16#1
UD
T #_Merker_PAB
 
L #Merker_PEB
XOD
SPZ Sprungmarke

Momentan bin ich völlig ratlos?!
 
Ist das für die Uni oder wieso keine Merker?

Ich denke, du wirst nicht ohne Hilfsvariablen zum Ziel kommen.

PEB ist ja Lade Byte, deshalb klappt das mit der Bitoperation nicht.

Natürlich könntest du über eine Maske das Bit auskodieren, hast dann aber erst einmal wieder nur das Byte, hmm, so kompliziert musste ich in den letzten Jahren nicht mehr denken.

Grübel, pt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
natürlich geht l pad nicht. t pad geht.
die ausgänge kannst du ganz normal nutzen. die werden entweder durch t pad ausgegebn oder am ende des zyklus.

wieso darfst du keine merker nehmen? dann nimm ein datenwort

temp variablen würde ich nicht nehmen sonst musst du über das lokaldatum das ar beschreiben..
 
Zuletzt bearbeitet:
volker schrieb:
wieso darfst du keine merker nehmen? dann nimm ein datenwort
temp variablen würde ich nicht nehmen sonst musst du über das lokaldatum das ar beschreiben..

Ich nehm an, die Funktion soll ohne Schmiermerker / Schmierdatenbereich auskommen.
Da wäre es schon Sinnvoll, dar PE/PA Byte im Lokaldatenbereich - Array zu kopieren und mittesl P## auf die Bits zuzugreifen.
 
Zitat von plc_tippser
Ist das für die Uni oder wieso keine Merker?

Ich muss ein Baustein erstellen, der bibliotheksfähig sein muss. Deshalb dürf ich keine Merker verwenden.

Momentan hab ich das so gelöst:
Code:
L     #IN_1 
SLW   3
LAR1
L     #IN_2
SLW   3
LAR2
 
L     PEB [AR1,P#3.0]
SLD   31
[B][COLOR=red]L     AB [AR2,P#3.0][/COLOR][/B][COLOR=red]
[/COLOR]SLD   31
XOD   
SPZ   Sprungmarke
Is halt ein bischen Pfusch hoch drei. Wobei komischerweise L AB xy erlaubt ist!?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
L AB ist doch eigentlich sinnvoll, oder? Darin stehen die aktuellen Ausgänge, inkl. deiner im Programm vor diesem Aufruf gemachten Änderungen an diesem Ausgangsbyte.
Ich würde die entsprechenden Bytes auch in ein Temp-Array, oder in 8 (1 Byte) separat angelegte Bool-Var kopieren. Der Zugriff auf die Variable zum Schreiben wäre dann z.Bsp. T LB 2, wenn die 1. Bool-Var im Temp-Bereich bei 2.0 beginnt. Auch die Bool-Var könntest du dann mit dem symbolischen Namen aus der Deklaration zugreifen.
 
Fündig geworden!

Hallo an alle,
ich hab ein bischen im Forum gestöbert und hab folgenden Beitrag von "Peter Wahlen" gefunden:
http://www.sps-forum.de/showthread.php?t=1615

Da wurde ein sehr ähnliches Problem schon mal diskutiert. Ich denke, ich hab die Lösung auf mein Problem gefunden :-D .
Es ist euren Vorschlägen ähnlich, aber mit dem Vorteil, dass dieser mit Pointern hantiert und somit Adressenunabhängig ist, falls die Deklarationstabelle erweitert wird.

Code:
L #Eingangswert   //Byte, Word,...
T #Hilfsvariable
 
LAR1 P##Hilfsvariabe
 
U L [AR1, P#0.0]   //Abfrage Bit 0
= ...
 
U L [AR1, P#0.1]  //Abfrage Bit 1
= ...

Ich danke allen für ihre Mühe und Hilfe! :s17:
 
Zurück
Oben