s7 indirekte adressierung in einem parametrierbarem fc

volker

Supermoderator
Teammitglied
Registriert
20 Juni 2003
Beiträge
5.468
Punkte Reaktionen
935
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
 
A

Anonymous

Guest
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
 

Zottel

Well-known member
Registriert
19 Juni 2003
Beiträge
2.299
Punkte Reaktionen
277
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
 
A

Anonymous

Guest
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
 
OP
volker

volker

Supermoderator
Teammitglied
Registriert
20 Juni 2003
Beiträge
5.468
Punkte Reaktionen
935
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
 

Zottel

Well-known member
Registriert
19 Juni 2003
Beiträge
2.299
Punkte Reaktionen
277
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).
 
L

loop2003

Guest
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
 

B72

Member
Registriert
2 Juli 2003
Beiträge
17
Punkte Reaktionen
0
Hallo,

Loop2003 hat recht! So müsste es funktionieren.

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

B72
 
OP
volker

volker

Supermoderator
Teammitglied
Registriert
20 Juni 2003
Beiträge
5.468
Punkte Reaktionen
935
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
 
Oben