Hallo wer-weiss-waser,
vielleicht kann mir/uns ja einer von euch helfen
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