INT konvertieren in Booleans

Reto

Level-1
Beiträge
158
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Bei einem FC (geschrieben in AWL) muss ich einen übergebenen Integer umwandeln und in 5 Binären "Leitungen" wieder ausgeben.

Eine möglichkeit wäre ja, mit ==I da jede einzelne Zahl zu überprüfen. Ich denke aber, dass es da eine etwas schönere Möglichkeit geben müsste.

Der Integer kann die Werte von 0 - 31 annehmen.

Jemand ne Idee?

Danke schon im Voraus
Gruss Reto
 
Wo ist das Problem?

00 00000
01 00001
02 00010
03 00011
04 00100
05 00101
06 00110
07 00111
08 01000
09 01001
10 01010
11 01011
12 01100
13 01101
14 01110
15 01111
16 10000
17 10001
18 10010
19 10011
20 10100
21 10101
22 10110
23 10111
24 11000
25 11001
26 11010
27 11011
28 11100
29 11101
30 11110
31 11111

Musst ja nur für jede Zahl aus dem Byte das entsprechende Bit nach außen führen.
 
Das ist doch eine Schulaufgabe ;o)

Also Du hast ein Byte und die ersten 5 Bit des Bytes sind die die Du auch nach Außen führen musst. Da gibt es verschiedene Möglichkeiten.

Zeig mal Deinen Ansatz und dann helfe ich auch gerne weiter.
 
Nicht die eleganteste Lösung aber um mal eine zu zeigen ;o)

(Es gibt einfachere Wege an die Bits zu kommen)

inZahl ist als Input und Bit0..4 sind die Output:

Code:
      L     #inZahl
      L     1
      UW    
      L     0
      >I    
      =     #Bit0

      L     #inZahl
      L     2
      UW    
      L     0
      >I    
      =     #Bit1

      L     #inZahl
      L     4
      UW    
      L     0
      >I    
      =     #Bit2

      L     #inZahl
      L     8
      UW    
      L     0
      >I    
      =     #Bit3

      L     #inZahl
      L     16
      UW    
      L     0
      >I    
      =     #Bit4
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hm ... Danke für diese Lösung

Ich hab daran rumgesucht, ob ich dieses Byte (was ich aus dem Int habe) irgend wie in ein Boolean-Array kriege ... aber das geht (zumindest so wie ich's versucht haben) irgend wie nicht. ;) oder doch ?

Gruss Reto
 
Btw. Schulaufgabe isses ned ganz ...
Ich arbeite viel mit der Java / C++-Programmierung und greife so teils auf SPSen zu.

Was ich zurzeit mache ist ne "selbststudium", wenn man dem so sagen kann.
Angesteuert wird damit nen FU ... Positionsnummer angeben und der fährt dann dort hin. Das aber nur als Hintergrundinfo.

Ne andere Lösung wär die Pfahlbauermethode *g*
prüfen, ob 1,3,5,7,9 ... dann Bit 1
prüfen ob 2,3,6,7 ... dann Bit 2, etz.

Etwas was mir auch noch innen Sinn gekommen war ist, dass ich's ganze innen MW (z.B. mw100) hätte schreiben kommen und anschliessend mit m100.3 (z.B.) das bit auslesen.

Nachteil davon ist, dass ich extra nen MW dem FC übergeben muss. Wenn's mir recht ist, geht das ja so nicht direkt im FC drinnen ... oder?

Gruss Reto
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier auch noch eine Lösung:

Code:
      L     P##WERT_IN
      LAR1  

      U      [AR1,P#0.0]
      =     #Bit_0

      U      [AR1,P#0.1]
      =     #Bit_1

      U      [AR1,P#0.2]
      =     #Bit_2

      U      [AR1,P#0.3]
      =     #Bit_3

      U      [AR1,P#0.4]
      =     #Bit_4

Wert_IN ist deine interne Integer-Variable,
die Adresse lädst du in das Adressregister,
und greifst mit dem Pointer dann auf die Bits des Wertes zu.

Mfg
Manuel
 
Das is nen Interessanter ansatz ;)
Gefällt mir ...

ist LAR zu verlgeichen mit dem Akku eines uCs (oder ist er das sogar) ?
 
Man sollte erst denken, dann F1 drücken und erst dann posten :D
AR = Adressregister, welches mit LAR1 den Akku1 lädt ^^

Danke trotzdem *pfeif*
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
Etwas was mir auch noch innen Sinn gekommen war ist, dass ich's ganze innen MW (z.B. mw100) hätte schreiben kommen und anschliessend mit m100.3 (z.B.) das bit auslesen.

Die Aufgabe ist an sich ja wirklich simpel. Aber wenn man es komplett kapseln will und keine globalen Variablen (wie Merker in dem FC) verwenden will ist sie schon etwas komplexer.

Ich bin wohl zu misstrauisch und will niemandem für die Schule fertige Lösungen geben. Darum war meine Lösung bewusst etwas Aufwendig aber sauber gehalten.

Die Lösung vom Kollegen MSB ist schön hat aber noch einen kleinen Schönheitsfehler. Der Kollege HDD hat gerade im Chat bemerkt das man besser das AR1 "retten" sollte. Also zuerst das AR1 in eine Temp-Variable sichern und am ende des Bausteins zurück schreiben.
 
Wozu retten?

Wird das für System-Dinge gebraucht? Oder was wird damit normalerweise verarbeitet?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,
also das stimmt nicht ganz es gibt schon Situationen bei denen man es Retten muss.
Berger schreibt hierzu:
AWL verwendet das AR1 um auf Bausteinparameter zuzugreifen, die als DB-Zeiger übergeben werden. Bei Funktionen sind dies alle Bausteinparameter mit zusammengesetztem Datentyp und bei Funktionsbausteinen Durchgangsparameter mit zusammengesetztem Datentyp.

Wenn Sie also auf einen derartigen Bausteinparameter zugreifen, z.B. um eine Bitkomponente einer Struktur abzufragen oder einen INT-Wert zu einer Feldkomponente zu schreiben, wird der Inhalt des AR1 verändert, und nebenbei bemerkt auch der Inhalt des DB-Registers.
Dies trifft auch zu, wenn Sie Bausteinparameter mit diesem Datentyp an aufgerufene Bausteine „weiterreichen“.

Verwenden Sie das AR1, so darf zwischen dem Laden des AR1 und der indirekten Adressierung kein oben beschriebener Zugriff auf einen Bausteinparameter erfolgen. Andernfalls müssen Sie den Inhalt des AR1 retten.

HDD
 
Bits

Moin!

Also wenns in einem komplett eigenständigen FC gemacht werden soll dann versteh ich den ganzen Aufwand mit Adressregister usw gar nicht. Da würde ich das über Lokaldaten machen. Wenn man der Meinung ist in den Lokaldaten nachträglich rumzuschieben muss man eben die Zuweisungen nachziehen - Aber wer schiebt noch in so nem simplen Baustein rum?

L #IN
T LW0

U L1.0
= #BIT0

U L1.1
= #BIT1

U L1.2
= #BIT2

U L1.3
= #BIT3

U L1.4
= #BIT4

André
 
Zuletzt bearbeitet:
...
Also wenns in einem komplett eigenständigen FC gemacht werden soll dann versteh ich den ganzen Aufwand mit Adressregister usw gar nicht. Da würde ich das über Lokaldaten machen.
...

Manche Programmierer halten die Variante mit den Lokaldaten allerdings für sehr unsauber (zu recht).

Die Lösung mit dem AR1 plus Sichern und Rückschreiben ist IMHO die beste Variante.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bits

ich halte das nicht für unsauber solange es in einem abgeschlossenen Baustein passiert. Das mit dem Adressregister halte ich in dem konkreten Fall für "mit Kanonen auf Spatzen geschossen". Aber jeder hat seine eigenen Ansichten. Manche halten ja auch KOP für sittenwidrig....

André
 
Sittenwidrig?

Weder das verwenden von Lokalen Daten noch der Einsatz von KOP ist sittenwidrig. In KOP lässt sich alles Lösen un zwar so das es jeder versteht.
Wer einen Schaltplan lesen kann versteht auch KOP. Dabei kann man doch so schön bei KOP den Überblick behalten. Ich fahre oft auch die Linien mit dem Finger nach damit ich nicht in der Zeile verrutsche.
Die Herren Programmierer sind einfach zu elitär. AWL und Pointer das hat nichts mit spsprogrammieren zu tun. Nur leute die studiert haben nutzen so einen Mist.

KOP klappt immer und auf allen Steuerungen.

Die Beste Lösung von allen! :
 

Anhänge

  • bestelösungvonallen.gif
    bestelösungvonallen.gif
    4,3 KB · Aufrufe: 170
Weder das verwenden von Lokalen Daten noch der Einsatz von KOP ist sittenwidrig. In KOP lässt sich alles Lösen un zwar so das es jeder versteht.
Wer einen Schaltplan lesen kann versteht auch KOP. Dabei kann man doch so schön bei KOP den Überblick behalten. Ich fahre oft auch die Linien mit dem Finger nach damit ich nicht in der Zeile verrutsche.
Die Herren Programmierer sind einfach zu elitär. AWL und Pointer das hat nichts mit spsprogrammieren zu tun. Nur leute die studiert haben nutzen so einen Mist.

KOP klappt immer und auf allen Steuerungen.

Die Beste Lösung von allen! :

Recht hast du!
Das garstige AWL oder noch garstigere SCL ist was für Querdenker die nichts andre s im kopf haben.
 
Zurück
Oben