Scl-Programmierung Dualzahlen erechnen u.schreiben

Hallo wer-weiss-waser,

vielleicht kann mir/uns ja einer von euch helfen :smile:
Wir haben eine aufgabe zu lösen in der es darum ging im simatic manager mit scl eine Waage zu programmieren …
Diese Waage ist für LKW#s gedacht, wenn sie beladen werden ändert sich ihr gewicht was das programm erkennt undsoweiter … nach einem gewissen geladenen wert stoppt das Förderband und eine signalleuchte zeigt an das der LKW „voll“ ist …
die erste erweiterung war es mithilfe von signalleuchten anzuzeigen WIE VOLL der LKW bereits beladen ist… alles kein problem…
doch die nächste erweiterung verlangt es das jedem dieser 9 leuchten ein Dualzahl wert zugewiesen wird…( 1, 2, 4, 8, 16, …) bis 256…
nun das ist die erste frage wie ist sowas machbar?
Und die Zweite frage diese leuchten sollen ja nun auch auf die Waage reagieren …
0001 (1) steht für 100kg auf der waage (waage bis 50000kg) wie kann ich das programmieren?
Ich wäre euch zu tausend Dank verpflichtet wenn mir dabei jemand helfen könnte

MFG
MR.OB1

Hallo wer-weiss-waser,

vielleicht kann mir/uns ja einer von euch helfen :smile:
Wir haben eine aufgabe zu lösen in der es darum ging im
simatic manager mit scl eine Waage zu programmieren …
Diese Waage ist für LKW#s gedacht, wenn sie beladen werden
ändert sich ihr gewicht was das programm erkennt undsoweiter
… nach einem gewissen geladenen wert stoppt das Förderband
und eine signalleuchte zeigt an das der LKW „voll“ ist …
die erste erweiterung war es mithilfe von signalleuchten
anzuzeigen WIE VOLL der LKW bereits beladen ist… alles kein
problem…
doch die nächste erweiterung verlangt es das jedem dieser 9
leuchten ein Dualzahl wert zugewiesen wird…( 1, 2, 4, 8, 16,
…) bis 256…
nun das ist die erste frage wie ist sowas machbar?

Ich muss gestehen, ganz klar wird mir aus Deiner Beschreibung noch nicht Dein Problem. Ich nehme an, die Signalleuchten geben Dir bisher in einer Art Balkendiagramm den Füllstatus wieder. Der Füllstatus ist also nur eine relative Anzeige zum geladenen Maximalwert.

Ich vermute jetzt soll also das Gewicht in kg durch die Signalleuchten Binärcodiert angezeigt werden. Also eine absolute Anzeige.
Soweit richtig?
Mit 9 Leuchten (binären=dualen Zustandsvariablen) kannst Du 2 hoch 9 Zahlen/Zustände = 512 darstellen. Inklusive der Null. Also maximal die Zahl 511. Das entspräche dann 51100kg bei Dir. Jede Leuchte realisiert ein Bit.

Das Gewicht als dezimale Zahl wird nun also nur Binär dargestellt.
Dezimalzahl = b_0*2^0 + b_1*2^1 + b_2*2^2 + … + b_(n-1)*2^(n-1)
n gibt die Anzahl der Zustandsvariablen also deine Leuchten.
b_(n-1) ist das (n-1)'te Bit.

Bsp:
die dezimalzahl 203=001100101 Binär mit 9 Bit dargestellt.
das kleinste Bit (Bit 0, man spricht von LSB)ist rechts.
also 1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 + 0*2^4 + 1*2^5 + 1*2^6 + 0*2^7 + 0*2^8

Was Du jetzt nur machen musst, ist dir zu überlegen, welche der Leuchte den kleinsten Wert anzeigen soll. Diese ist die erste Leuchte erhält durch Dich zugewiesen den Wert 2^0=1 (sie ist das erste/kleinste Bit 0). Die anderen werden der Reihe nach hochgezählt also bis 8. Die letzte Leuchte bekommt also den dezimalen Wert 1*2^8, wenn sie leuchtet, ansonsten 0*2^8=0. 1 steht für Leuchte an, 0 für aus.

Und die Zweite frage diese leuchten sollen ja nun auch auf die
Waage reagieren …
0001 (1) steht für 100kg auf der waage (waage bis 50000kg) wie
kann ich das programmieren?
Ich wäre euch zu tausend Dank verpflichtet wenn mir dabei

um das größte Bit 8 (MSB) zu erhalten musst du das aktuelle Gewicht als dezimale Zahl durch 2^8 teilen. Ist das Ergebnis größer gleich 1 dann ist Bit 8 also Leuchte 9 an, ansonsten aus.

Um den zu erfahren, ob alle anderen Leuchten an oder aus sein müssen musst du das aktuelle Gewicht nehmen und den Dezimalwert des aktuellen und aller größeren Bits abziehen, wenn sie gesetzt wurden und durch den Dezimalwert des nächstkleineren=gesuchten Bits teilen.
Also den Status von Lampe 8=Bit 7 bekommst du in dem Du prüfst ob das Ergebnis: (aktuelles Gewicht-b8*2^8)/ 2^7 kleiner gleich eins ist. Wenn ja dann ist Lampe 7 an, ansonsten aus. b8 gibt den binären Wert der Lampe 9 an, also ob sie an (1) oder aus (0) war.

Genauso prüfst du die anderen Lampen.
Lampe 4:
(aktuelles Gewicht-b8*2^8-b7*2^7-b6*2^6-b5*2^5-b4*2^4-b3*)>=1

Überprüfen kannst du das einfach mit dem Windowstaschenrechner oder jedem anderen der die Umwandlung Dezimal nach Binär und zur Kontrolle auch umgekehrt beherrscht.

Ich kenne die Programmiersprache, die du verwendest nicht. Es gibt auf jedenfall noch einfachere Methoden zum Beispiel kann man mit Binärmasken und boolschen Verknüpfungen arbeiten.

Lampe9 = Bit 8 = akutellesGewichtAlsDezimalzahl AND 2^8 = akutellesGewichtAlsDezimalzahl AND 256.
Lampe8 = Bit 7 = akutellesGewichtAlsDezimalzahl AND 2^7 = akutellesGewichtAlsDezimalzahl AND 128

usw.

Viele Grüße
RotoR

Hallo MR.OB1,
als erstes möchte ich dazu sagen, dass ich Ihnen hier kein fertiges Programm liefere.
Um das Ganze zu lösen, würde ich wie folgt vorgehen:

  1. den eingehenden Messwert in den Anzeigewert umwandeln (Messbereich -> Anzeigebereich).
  2. den Anzeigewert in das gewünschte Datenformat wandeln.

Suchen Sie im Internet mal unter „Oscat“, dort finden Sie genügend Standard Bausteine. Eventuell ist eine Lösung für Sie gleich vorhanden.
mfg
Hans Fleischmann

Hallo,

leider kann ich nicht sagen wie das in SCL programmiert werden muss.
Die Dualzahl würde ich Binär laden und mit dem Eingangswert der Waage vergleichen. Wenn die Werte gleich sind, wird der Ausgang eingeschaltet und die Leuchte leuchtet. Das muss für jede der 9 Leuchten programmiert werden.

In AWL könnte das so aussehen:

U(
L MD10 (Wert Waage)
L 2#0000_0000_0000_0001 (Binärzahl)
==D
)
= A12.0 (Leuchte 1)

MfG
Elektronenschubser

Also ich versuche mal die Aufgabenstellung zusammenzufassen:

Eine Wage liefert ein analoges Signal. Das Signal soll linear in 256 Schritten dem Gewicht von 0 bis 5000kg entsprechen. Proportional zu dem Gewicht werden neun Leuchten angesteuert. 0kg = keine Leuchte brennt, 5t = alle Leuchten brennen.
Ist das richtig?

Grüsse
Oliver

Die Leuchten sollen doch wohl einen Bereich signalisieren. Du musst deinen Messwert mit einem def. Bereich vergleichen: 0…256/9 dann LED 1 an.

zur frage 2 musst du etwas rechenen: 1 bit steht für 100 kg, der gesamte Messbereich geht bis 50.0000. mit 256 bit lässt sich 256*100kg darstellen. D.h. deine waage fängt nicht bei null an, sonst würdest du nicht den Endwert erreichen.
du musst jetzt einer dualzahl von 0…256 wieder durch vergleich einen wertebereich zuorden.

Hallo MR.OB1,
leider bin ich in SCL nicht mehr so fit, um Euch direkt den Code dafür zu liefern.

Die 9 Lampen entsprechen 9 Bit. Mit neun Bit können Dezimalzahlen von 0 bis 511 dargestellt werden. In eurem Fall braucht Ihr aber nur 0 bis 500.

0 = 000000000 entspricht 0 bis 99 kg
1 = 000000001 entspricht 100 bis 199 kg
2 = 000000010 entspricht 200 bis 299 kg
3 = 000000011 entspricht 300 bis 399 kg
4 = 000000100 entspricht 400 bis 499 kg

500 = 001011111 entspricht 50000 und mehr kg

Jedes Bit entspricht also einer Lampe. Um mit den Lampen z.B. die Zahl 3 anzuzeigen muss die Lampe 1 und 2 leuchten = 000000011
Für die Zahl 4 muss die Lampe 3 leuchten = 000000100

Für die Zahl 89 müssen die Lampen 1, 4,5 und 7 leuchten = 001011001
usw.

Ihr müsst also die Dezimalzahl in einen Binärcode umwandeln und dann jedes Bit einer Lampe zuordnen.

Viel Erfolg
Charro

Hallo OB1,

zunächst entschuldige bitte die späte Antwort.
Leider bin ich eher in der FUP-Sprache zu Hause.
Ich kann dir leider nicht weiter Helfen, da ich im Bezug auf SCL nicht genügend Kenntnisse habe.

Solltes du im Bezug auf FUP Fragen haben, kannst du mich gerne ernbeut anschreiben. Ich werde mich auch bemühen, zukünftig schneller zu Antworten.

Mit freundlichem Gruß

SPS-Jan