s7 indirekte adressierung in einem parametrierbarem fc

volker

Supermoderator
Teammitglied
Beiträge
5.805
Reaktionspunkte
1.027
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo

irgendwie will es mir nicht gelingen.

deklaration:
12.0 in_out Hilfsbyte BYTE

UN #Impuls_T
SPB c000
L #Hilfsbyte
L 0
==I
S #Hilfsbyte.0 <<<<====== so gehts natürlich nicht
c000: NOP 0


aber wie spreche ich dieses bit an ?

mfg
volker
 
Die im Bausteinkopf deklarierten Variablen kannst Du mit L-ansprechen:

L #Hilfsbyte // Adresse = 4.0
L 0
==I
S L 4.0

Die Adresse findest Du im Bausteinkopf.

Eine andere Variante ist das Hilfsbyte mit 00000001 zu "ver-UNDen":
L #Hilfsbyte
L 1
UW
T #Hilfsbyte

Gruss
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dein Beispiel sieht so aus, als wenn es nur darum ginge ein Bit im Hilfsbyte zu setzen. Dann kannst Du schreiben:
Code:
L #Hilfsbyte
L 1	 // 1 für .0, 2 für .1, 4 für .2 usw.
OB	// setzt bit im Muster, für Rücksetzen nimmst Du UB mit 
	// einem Muster aus 0 für das rückzusetzende Bit und 	// ansonsten Einsen.
T #Hilfsbyte
Wenn Du viel mit den Bits machen willst, ist das zu umständlich.
Dann hilft die alte Sache mit einem "Schmiermerker"-Wort:
Code:
L #Hilfsbyte
T MB1
S M 1.0
// Hier können nun viele weitere Dinge mit den Merkern 1.0 bis 1.7
// folgen. Am Ende:
L MB1
T #Hilfsbyte

Nun gäbe es noch die Möglichkeit, dass dein Hilfsbyte die Nummer des Bytes enthalten soll, dessen Bit 0 Du benutzen willst. Ich mache es hier mal mit Bit 3 stat 0, weil man dann besser sieht, wo es hingehört:

Code:
L #Hilfsbyte	
L 8		// 8 bits weiter
*D
L P#M0.3	// ein Zeiger auf (letztlich die Adresse von) 			//Merker 0.3
+D		// Zeiger sind Doppelworte bzw. ein DW lang.
T MD2		// irgenein Zwischenspeicher.
		// wenn Hilfsbyte den Wert 7 hatte enthält
		// er nun die Adresse von M7.3	
S M[MD2]	// setze den Merker, dessen Nummer in MD2 		// steht
 
Zottel schrieb:
Dein Beispiel sieht so aus, als wenn es nur darum ginge ein Bit im Hilfsbyte zu setzen. Dann kannst Du schreiben:
nein. ich muss mindestens 2 bits daraus ansprechen. das ganze wird ein schieberegister mit impuls/pause für das output-byte

mit code 1 könnte ich was machen.
da ich auf schmiermerker verzichten wollte kommen code 2 und 3 nicht in frage.

-------------------------------------------

aber die antwort vom gast finde ich recht gut. an genau sowas hatte ich gedacht.

L #Hilfsbyte // Adresse = 4.0
L 0
==I
S L 4.0

da bei mir die adresse im deklarationsbereich 12 ist gehe ich mal davon aus, dass ich S L 12.0 bzw U L 12.7 benutzen muss.

Da es schon fast 16.00 uhr ist werde ich das erst am montag testen.
Irgendwann muss man ja auch mal feierabend sein.

danke für eure hilfe.
ich melde mich dann nach dem test ;-)

mfg volker
 
mfg volker[/quote]

kurzer nachtrag.

bis jetzt habe ich das folgendermassen gelöst:

im deklarationsteil habe ich 8 temp-variablen angelegt (adr 0.0-0.7)
(Hilfsbyte_Bit_0 - ....._7)

L #Hilfsbyte
T LW 0

mit #Hilfsbyte_Bit_0 - 7 kann ich dann auch die Bits ansprechen.

bis montag

mfg
volker
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann (mehrere Bits) ist das Beispiel 2 das richtige, nur verwendest Du halt eine Reihe Bits im Bereich der Lokalvariablen.

Mit "indirekter Adressierung" hat das wenig zu tun.

Zum Schieben gibt es spezielle Befehle. Du must dann nicht jedes Bit "anfassen", sondern eventuell das erste und letzte, wenn Du etwas hineinschiebst oder Überträge in ein anderes Wort benötigst.

Das letzte Beispiel kann anstelle der Schmiermerker in ähnlicher Form auch mit den Adressregistern AR1 oder AR2 realisiert werden. (Siehe Hilfe zu STEP7)

Schmiermerker haben manchmal den Vorteil, das der Code 1:1 auf andere SPS (S5 oder ganz andere Hersteller übertragbar ist).
 
Hallo Volker,

probiers mal damit:

deklaration:
12.0 in_out Hilfsbyte BYTE

UN #Impuls_T
SPB c000

L P##Hilfsbyte //lädt einen Zeiger auf dein Hilfsbyte
LAR1
L #Hilfsbyte
L 0
==I
S [AR1,P#0.0] // Setzt Bit 0 von Hilfsbyte
c000: NOP 0


Gruss
loop
 
Hallo,

Loop2003 hat recht! So müsste es funktionieren.

@Loop: Grüße nach China. Das du auch überall Breitband haben musst, tztztztz...

B72
 
Zuviel Werbung?
-> Hier kostenlos registrieren
loop2003 schrieb:
Hallo Volker,

probiers mal damit:

deklaration:
12.0 in_out Hilfsbyte BYTE

UN #Impuls_T
SPB c000

L P##Hilfsbyte //lädt einen Zeiger auf dein Hilfsbyte
LAR1
L #Hilfsbyte
L 0
==I
S [AR1,P#0.0] // Setzt Bit 0 von Hilfsbyte
c000: NOP 0

Gruss
loop

Alles klar. hab ich eben getestet und läuft wunderbar.

bei der variante mit
L 14.0
usw
muss ich, wie in meiner variante, mehrmals schieben.

danke für eure hilfe
mfg
volker
 
Zurück
Oben