Step 7 4 Binäreingänge in BCD

981GT5

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

ich möchte einen Füllstandssensor (IFM LR8000) in einen Öltank installieren, um den Füllstand des Öls zu ermitteln.
Die Informationen zum Füllstand wird mir über 4 Ausgänge, die 15 Stufen schalten, in meine SPS gegeben.
Nun versuche ich, aus diesen vier Eingängen in meiner SPS eine BCD Zahl zu erzeugen, bisher bin ich jedoch kläglich gescheitert. :neutral:

Hat jemand eventuell einen Tipp, der mich wieder auf die Bahn bringt?

Anbei das Datenblatt zum Sensor, mit den 15 Stufen beziehe ich mich auf Seiten 10,11.

https://www.ifm.com/mounting/704915DE.pdf


Grüße 981GT5
 
Zuletzt bearbeitet:
Die 4 Signalen auf ein freies Eingangsbyte anschliessen.
Da darf nichts anderes drauf sein.
Bit 0 bis 3 benutzen.

Du kannst diese jetzt als eingangsbyte EB abfragen und den wert des bytes benutzen.

Bram


Falls doch noch etwas auf dem Eingangsbyte angeschlossen sein sollte, musst du die 4 Eingänge einzeln auf Merker eines freien Merkerbytes schreiben und damit im Programm arbeiten.

Also E 0.0=M0.0, E0.1=M0.1 usw.
 
Falls doch noch etwas auf dem Eingangsbyte angeschlossen sein sollte, musst du die 4 Eingänge einzeln auf Merker eines freien Merkerbytes schreiben und damit im Programm arbeiten.

Also E 0.0=M0.0, E0.1=M0.1 usw.
Das ist eine eher sinnlose Tat. Wenn die höheren Bits mit anderen Signalen belegt sind, lädt man das Eingangsbyte in der Akku, maskiert mit wortweisem Und (UW) die überflüssigen Bits weg und wandelt dann mit ITB in BCD um.

Gruß
Erich
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Informationen zum Füllstand wird mir über 4 Ausgänge, die 15 Stufen schalten, in meine SPS gegeben.
Nun versuche ich, aus diesen vier Eingängen in meiner SPS eine BCD Zahl zu erzeugen, ...
Die 4 Bit können 16 verschiedene Zustände annehmen '0000' .. ' 1111', also dezimal '0' .. '15' bzw. hexadezimal '0' .. 'F'.
Um daraus eine BCD-Zahl zu machen, addierst Du 6 zu der angelieferten Zahl, wenn diese grösser als 9 ist.
Du erhältst dann hexadezimal dargestellt '00' .. '09' und (durch die Addition der 6 bei > 9) '10' .. '15'.

PS:
Brauchst Du wirklich eine BCD-Zahl? Z.B. um damit 7-Segment-Anzeigen anzusteuern?
Wenn Du mit dem Wert "nur" rechnen willst oder ihn im Programm z.B. in Vergleichen verwursten willst, dann bist Du mit der "normalen" Darstellung als INT- oder DINT-Zahl besser bedient.
 
Zuletzt bearbeitet:
Was für eine SPS hast Du denn?
Vermutlich willst Du gar keine BCD-Zahl, sondern einen Ganzzahlwert 0..15 erhalten?

Die allgemeine Formel für den 8-4-2-1-Binärcode ist:
Code:
Wert = OUT4 * 8 + OUT3 * 4 + OUT2 * 2 + OUT1 * 1
Weil OUT1..OUT4 nur die BOOL-Werte 0 oder 1 haben können, kann man die Formel auch mit 4 bedingten Additionen implementieren (siehe unten) Manche SPS (wie z.B. S7-200) oder SPS-Programmiersprachen (z.B. FUP/KOP) haben sogar VKE-abhängige ADD-Anweisungen, so daß keine Sprünge notwendig werden. Oder man kann die Bits einzeln zum Wert zusammenbasteln (mittels Bit-Slice-Zugriffen oder Word-OR oder schieben/rotieren).


Man kann aber auch cleverer vorgehen und OUT1..OUT4 gleich in 8-4-2-1-günstiger Weise an die SPS-Eingänge anschließen, dann gibt es Abkürzungen zur Wertermittlung ohne groß rechnen, z.B.
OUT1 ----> E0.0
OUT2 ----> E0.1
OUT3 ----> E0.2
OUT4 ----> E0.3

Nimm das Eingangsbyte EB0 und blende die oberen 4 Bits .4 bis .7 aus:
Code:
L  EB0
UW W#16#F    [COLOR="#008000"]//Bits 4 bis 7 auf 0 setzen, Bits 0 bis 3 beibehalten[/COLOR]
T  #Wert
Falls OUT1..OUT4 zusammenhängend, aber nicht ab Bit 0 sondern z.B. E0.2-E0.5 angeschlossen sind, dann müssen die Bits zunächst verschoben werden, so daß sie vor dem Ausblenden ab Bit 0 liegen:
Code:
L   EB0
SRW 2        [COLOR="#008000"]//Bits 0.2 bis 0.5 --> nach Bits 0 bis 3 verschieben[/COLOR]
UW  W#16#F
T   #Wert
Sind OUT1..OUT4 in beliebiger Reihenfolge an beliebigen Eingängen angeschlossen (auch einzeln mit Adresslücken), dann muß man halt den ausführlichen/universellen Weg zum zusammenbasteln nehmen. Oder falls man den Code öfters braucht, dann kann man sich eine kleine parametrierbare Function schreiben. Manche SPS haben auch Anweisungen für das zusammenbasteln von Bits, z.B. GATHER

Universelle Lösung mit bedingten Additionen
Code:
      L     0           [COLOR="#008000"]//AKKU auf Wert 0 initialisieren[/COLOR]
      U     #Bit_1      [COLOR="#008000"]//Sensor_OUT1[/COLOR]
      SPBN  M002
      +     1           [COLOR="#008000"]//oder "INC 1" oder "OW W#16#1"[/COLOR]
M002: U     #Bit_2      [COLOR="#008000"]//Sensor_OUT2[/COLOR]
      SPBN  M004
      +     2           [COLOR="#008000"]//oder "INC 2" oder "OW W#16#2"[/COLOR]
M004: U     #Bit_4      [COLOR="#008000"]//Sensor_OUT3[/COLOR]
      SPBN  M008
      +     4           [COLOR="#008000"]//oder "INC 4" oder "OW W#16#4"[/COLOR]
M008: U     #Bit_8      [COLOR="#008000"]//Sensor_OUT4[/COLOR]
      SPBN  M00E
      +     8           [COLOR="#008000"]//oder "INC 8" oder "OW W#16#8"[/COLOR]
M00E: T     #iWert

PS: Es gibt nicht nur einen Lösungsweg, den man implementieren "muß". Schon garnicht "muß" man mit Schmiermerkern arbeiten.

Harald
 
Zuletzt bearbeitet:
Oh weh, Harald, OW! ;)
Code:
      L     0           [COLOR=#008000]//AKKU auf Wert 0 initialisieren[/COLOR]
      U     #Bit_1      [COLOR=#008000]//Sensor_OUT1[/COLOR]
      SPBN  M002
      +     1           [COLOR=#008000]//oder "INC 1" oder "[/COLOR][COLOR=#ff0000]O[/COLOR][COLOR=#008000]W W#16#1"[/COLOR]
M002: U     #Bit_2      [COLOR=#008000]//Sensor_OUT2[/COLOR]
      SPBN  M004
      +     2           [COLOR=#008000]//oder "INC 2" oder "[/COLOR][COLOR=#ff0000]O[/COLOR][COLOR=#008000]W W#16#2"[/COLOR]
M004: U     #Bit_4      [COLOR=#008000]//Sensor_OUT3[/COLOR]
      SPBN  M008
      +     4           [COLOR=#008000]//oder "INC 4" oder "[/COLOR][COLOR=#ff0000]O[/COLOR][COLOR=#008000]W W#16#4"[/COLOR]
M008: U     #Bit_8      [COLOR=#008000]//Sensor_OUT4[/COLOR]
      SPBN  M00E
      +     8           [COLOR=#008000]//oder "INC 8" oder "[/COLOR][COLOR=#ff0000]O[/COLOR][COLOR=#008000]W W#16#8"[/COLOR]
M00E: T     #iWert
 
Zurück
Oben