Int-Wert aus Bits bilden

testuser

Level-2
Beiträge
139
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
ich programmiere zur zeit eine paternoster-steuerung. diese soll am anfang nur einen paternoster steuern, aber erweiterbar sein (über profibus mit et200-modulen). jeder paternoster wird gleich aufgebaut sein, in diesen liegen wellen (jeweils 15 stück) mit gewickeltem material drauf. diese wellen sind binär codiert (4bit).

soweit kein problem. wenn ich es als fc programmiere geht alles (wird zur zeit nur über plcsim simuliert). da es nun aber erweiterbar sein soll, habe ich mir gedacht es als fb zumachen. habe mir als in-variblen 4 bool eingänge für die codierung der wellen gemacht und ein statische variabe pos_ist als int. diese will ich nun mit den 4 bits die werte 1..15 als istposition zuweisen. über
Code:
U #welle_bit0
= L7.0  //lowbyte(?!?)

U #welle_bit1
= L7.1

U #welle_bit2
= L7.2

U #welle_bit3
= L7.3
funktioniert es leider nicht. kann mir jemand evtl einen tipp geben?!?
 
Hallo!
Sinngemässes Zitat
Lokaldaten sind eine scheissgefährliche Sache. Alle Bausteine greifen darauf zu. Die Anzahl der Lokaldaten sind CPU abhängig begrenzt, wenn man die Lokaldaten überschreitet, geht die CPU in Stop. Selbst wenn man im FC1 L0.0 setzt, und dies im FC2 zufällig das gleiche Bit ist, hatt man Probleme, wenn zwischendurch ein OB aufgerufen wird, der auch dieses Bit benutzt. Ich bevorzuge die Programmierung von FBs und Multiinstanzen. Man sollte auch wissen, dass S7 bei graphischer Programmierung auch auf die Lokaldaten greift ohne das dies deklariert wird

Am Rande:

Vertrau der Sim NICHT bedingungslos!

Ich hab schon erlebt, dass eine FC sich Sachen merkt, die sie sich "im wirklichen Leben" nicht merkt!
eben wegen dem Unterschied FC - FB!!

viel Erfolg
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ich programmiere zur zeit eine paternoster-steuerung. diese soll am anfang nur einen paternoster steuern, aber erweiterbar sein (über profibus mit et200-modulen). jeder paternoster wird gleich aufgebaut sein, in diesen liegen wellen (jeweils 15 stück) mit gewickeltem material drauf. diese wellen sind binär codiert (4bit).

soweit kein problem. wenn ich es als fc programmiere geht alles (wird zur zeit nur über plcsim simuliert). da es nun aber erweiterbar sein soll, habe ich mir gedacht es als fb zumachen. habe mir als in-variblen 4 bool eingänge für die codierung der wellen gemacht und ein statische variabe pos_ist als int. diese will ich nun mit den 4 bits die werte 1..15 als istposition zuweisen. über
Code:
U #welle_bit0
= L7.0  //lowbyte(?!?)
 
U #welle_bit1
= L7.1
 
U #welle_bit2
= L7.2
 
U #welle_bit3
= L7.3
funktioniert es leider nicht. kann mir jemand evtl einen tipp geben?!?
Ob das hier schön ist oder nicht sei mal dahingestellt.:rolleyes:
Funktionieren sollte es eigentlich so.
Du müsstest aber Deinem Codeschnippsel noch hinzufügen:
Code:
L  LW6
T #pos_ist
 
Code:
*
//adressregister sichern

      TAR1  
      T     #dAR1Save
      TAR2  
      T     #dAR2Save

//nummer schreiben
      L     P##welle_bit0
      LAR1  
      L     P##nummer
      LAR2  

      L     4
next: T     #loop_count
      U      [AR1,P#0.0]
      =      [AR2,P#1.0]
      +AR1  P#0.1
      +AR2  P#0.1
      L     #loop_count
      LOOP  next

//adressregister zurückschreiben
      L     #dAR1Save
      LAR1  
      L     #dAR2Save
      LAR2
 
Zuletzt bearbeitet:
Int-Wert aus Bits

Hallo Testuser

Die vier Bits stehen also als Inparameter direkt hintereinander. Auch wenn nur vier Bits als In-Parameter definiert sind, so werden immer 16 Bit durch S7 reserveiert.

Diese vier Bits stellen nun eine Zahl von 0 bis 15 dar. OK. Die Statische Variable pos_ist soll diesen Wert aufnehmen.

Folgende Programmzeilen im FB liefern die Lösung:

LAR1 P#w1 // Adressregister auf erstes Eingangsbit
L B[AR1,P#0.0] // Alle Bits laden
T pos_ist

Wenn am FBEingang nach den vier Bits noch weitere anders benutzte Bits kommen, dann vor den Transferbefehl diese Bits ausmaskieren mit

UW W#16#F

Das wars.

Gruß Puddl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Puddls Lösung setzt aber vorraus, dass die erste bit-adresse Lx.0 ist ansonsten kommt beim laden des bytes ein ausrichtungsfehlerchen und der OB 121 wird aufgerufen oder, wenn nicht vorhanden, die CPU geht in stop

bei meiner lösung ist das nicht so :rolleyes:
 
danke an alle für die umgehenden antworten. habe mich für die variante von OHGN entschieden. funktioniert so wie ich es mir (zur zeit) vorstelle.

OHGN schrieb:
..
Ob das hier schön ist oder nicht sei mal dahingestellt.:rolleyes:
..

da ich in der programmierung noch voll im lernen bin, würde ich gerne mal wissen was du damit meinst! sicherlich gibt es elegantere wege (siehe 4L).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
....
da ich in der programmierung noch voll im lernen bin, würde ich gerne mal wissen was du damit meinst! sicherlich gibt es elegantere wege (siehe 4L).
Naja, ich finde der Kollege vierlagig neigt mittlerweile ein bischen zum verkomplizieren...:ROFLMAO:

Ich persönlich würde es so machen:
Code:
      L     P##pos_ist
      LAR1 
 
      U     #welle_bit0
      =     [AR1,P#1.0]
      U     #welle_bit1
      =     [AR1,P#1.1]
      U     #welle_bit2
      =     [AR1,P#1.2]
      U     #welle_bit3
      =     [AR1,P#1.3]
 
Dann programmiert man halt noch einen SRW x nach dem Laden der Bits.

Code:
*
      LAR1  P##welle_bit0
      L     B [AR1,P#0.0]
      T     #nummer

an welcher stelle willst du schieben, der fehler kommt beim lesen!

@OHGN:

ja, bißchen verkompliziert ist es, aber es ist auch eine grundtechnik um größere zahlen umzuwandeln, weil 32 mal deinen zweizeiler wäre mir zuviel tipparbeit

ABER: schön ist deine lösung!

@testuser:

das absolute adressieren von lokaldaten gilt gemeinhin als unsauber, da man sich den auswirkungen nicht immer bewußt sein kann und aber auch eine kleine änderung der schnittstelle sehr viel tipparbeit bedeuten kann - nämlich dann, wenn sich die adressen verschieben.
 
Eben getestet: meine obige Lösung funktioniert zwar, ist aber nicht "multiinstanzfähig"

besser:
Code:
      L     0
      T     #pos_ist_tmp
 
      L     P##pos_ist_tmp
      LAR1  
 
      U     #welle_bit0
      =      [AR1,P#1.0]
      U     #welle_bit1
      =      [AR1,P#1.1]
      U     #welle_bit2
      =      [AR1,P#1.2]
      U     #welle_bit3
      =      [AR1,P#1.3]
 
      L     #pos_ist_tmp
      T     #pos_ist

@vierlagig:
Ich dachte schon Dir wäre das aufgefallen, als ich Deine Antwort gesehen habe.:oops:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@vierlagig:
Ich dachte schon Dir wäre das aufgefallen, als ich Deine Antwort gesehen habe.:oops:

an die multiinstanzfähigkeit hab ich nicht gedacht, sorry ;)

meine lösung müßte dementsprechend auch angepasst werden!

Code:
*
//nummer schreiben

      L     P##welle_bit0
      LAR1  
      TAR2  
      +AR1  
      L     P##nummer
      +AR2
 
Zuletzt bearbeitet:
Zurück
Oben