Programm realisieren mit Standardbausteine aus der IEC61131

Bobyfighter

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Community,

ich soll ein Programm schreiben, dass aus einer Zeitangabe (Zahlenwert ins Millisekunden) eine Bit Struktur erzeugt, die dem Datentyp TOD in Unity entspricht. Beispiel: aus 54630000 ms (seit Mitternacht) wird die Uhrzeit 15:10:30 in obiger Darstellung. Das Programm soll in der Programmiersprache FBD mit Hilfe der Standardbausteine aus der IEC61131 erstellt werden.

VAR
zeitwert : UDINT; (* Zeitwert in Millisekunden seit Mitternacht *) 

ergebnis : WORD; (* bitstruktur wie TOD in Unity *)
END_VAR 


Leider komme ich net wirklich weiter, bin Anfänger in dieser Materie :confused::confused::confused::confused:

Könnt mir da eventuell einer von euch weiterhelfen
 
Deine Antwort ist nicht hilfreich und damit gewinnst du hier keine Lorbeeren (= Unterstützung).

1) schau mal nach wie TOD definiert ist . Ich kann dir nur raten dir mal an mehreren Beispiel von z.B. 10 msec anzuschaeun wie die Bits definiert sind und was somit das Ergebnis sein müsste.
2) wenn 1) klar für dich ist dann ist es nur eine technische Umsetzung wie man ein (Bit)-Wert(e) vom Eingang in den Ausgang bringt. Dann darfst du dich gerne nochmal melden.

Guga
 
Mag sein des das nicht sehr hilfreich war, aber die Frage stellt sich meines Erachtens auch gar nicht von wem die Aufgabe kommt.

Ich hab mir mal folgendes ausgedacht, siehe Bild
Nun habe ich aber bedenken wegen dem or Baustein. Eigentlich möchte ich nen Baustein der mir diese tt1-3 variablen sortiert, so dass am Ende tt1 dann tt2 und dann tt3 als Ergebnis hintereinander aufgelistet werden

Bildschirmfoto 2016-05-17 um 17.00.26.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zu deiner Logik: Überleg es dir noch einmal. Soweit ich die Aufgabe verstehe sieht die Lösung anders aus.

Konkretes Feedback : Wenn ich so ein Ausdruck mal anschaue an einem Beispiel Ausgang des linken Sub:

Zeitwert - ( Zeitwert / 3600000 * 3600000) = Zeitwert - Zeitwert = 0.


Zur konkreten Frage um in ein Variable den Inhalt hineinzukopieren (z.B. in einem DWORD wo schon das High-Word belegt ist nun das Low-Word zu füllen.
x1:=x1 OR SHL(x2,Offset);// Kommentare hierzu SHL(x2, Offset) ist überall 0 mit ausnahme der x2 Bits


Und du wirst es nicht glauben.
Für manche Leute, auch mich eingeschlossen, ist es nicht irrelevant woher die Aufgabe kommt. Das Forum versteht sich nicht als Hausaufgabenlöser wo man Aufgaben outsourcen kann.
 
Aber der Zeitwert bei der ersten Division ändert sich doch. Ist ja ein UDINT, sprich nur ganzzahlig, d.h. doch z.b. Zeitwert=54630000ms/3600000=> 15std und nicht 15,175 da ja wie gesagt UDINT. Wenn ich dann wieder hoch multipliziere mache ich das ja nur mit der ganzen zahl im Beispiel also mit der 15. des wiederum gibt mir ja dann einen andere Millisekunden Anzahl. So sollte des laufen...

Das mit diesem SHL verstehe ich net wirklich. Ich möchte halt am ende ne Ausgabe haben wie oben gesagt 15:10:30 und die variablen dazu wären tt1=15 tt2=10 und tt3=30. Nur glaub ich halt nicht dass das mit dem OR Baustein so hinhaut...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
die bitstruktur lautet so:

Der Datentyp TOD (TIME_OF_DAY) ist für die Angabe einer Uhrzeit vorgesehen. In der Programmierumgebung Unity hat der Datentyp TOD folgenden Aufbau: Es handelt sich um einen 32bit Datentyp (vergleichbar mit DWORD). Zerlegt man die 32bit in 4byte, so ist im obersten Byte die Stunden, im nächsten Byte die Minuten und im nächsten Byte die Sekunden BCD-codiert abgelegt. Das niederwertigste Byte ist immer 0. Die Uhrzeit 15:10:30 (15Uhr-10Minuten-30Sekunden) ist also wie folgt abgelegt: 0001-0101-0001-0000-0011-0000-0000-0000
 
Da hast Du doch alles zitiert, was Du brauchst:
TIME zerlegen in in h, m, s und ms (die nicht benötigt werden), die Zwischenergebnisse jeweils in BCD umwandeln und alles an die richtigen Stellen ins DWORD eintragen.

TIME zerlegen wurde hier im Forum schon x-mal zerkaut.
 
So wie ich den Zeitwert zerlege in meiner Aufzeichnung ist also nicht möglich mit den verschiedenen Divisionen;Multiplikationen und Subtraktionen?? Diese BCD Umwandlung erfolgt doch von UDINT TO DWORD oder liege ich da falsch

Wie gesagt bin kompletter Neuling auf diesem Gebiet:confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zunächst solltest Du das Ganze mal nicht einfach so alles auf einen Haufen rotzen, sondern für jedes Zwischenergebnis ein eigenes, leicht lesbares Netzwerk anlegen. (PS: So wie das oben aussieht, entsteht so gar keine Lust, sich das anzusehen.) So bringst Du etwas Struktur in das Programm und den Ablauf.

Wie Mathematik Grundschule - die Gesamtaufgabe in kleine (leichter verdaubare) Häppchen zerlegen!
;)
 
Zuletzt bearbeitet:
So wie ich den Zeitwert zerlege in meiner Aufzeichnung ist also nicht möglich mit den verschiedenen Divisionen;Multiplikationen und Subtraktionen??
Das geht schon, aber so ganz wird es noch nicht funktionieren. Die 630000 bei der zweiten Subtraktion passen ja nur für Dein eingangs genanntes Zahlenbeispiel. Tatsächlich musst Du den Wert in einer Hilfsvariablen zwischenspeichern, und wenn Du die auch noch in das Netzwerk prügelst, schaut keiner mehr durch. Also erst mal
Huckis Ratschlag #12 berücksichtigen und für Ordnung sorgen. Dann schau Dir auch mal den MOD-Operator in der Hilfe an, der könnte einiges vereinfachen. Vielleicht ist es in FUP auch einfacher, das Pferd von hinten aufzuzäumen und nicht zuerst die Stunden, sondern die Millisekunden zu extrahieren.

Diese BCD Umwandlung erfolgt doch von UDINT TO DWORD oder liege ich da falsch
Da liegst du falsch. Das DWORD speichert die Zahl genauso binärcodiert wie das UDINT. Für die BCD-Umwandlung musst Du also auch selbst Hand anlegen, indem Du die
Variablen für Stunden, Minuten und Sekunden in die Zehner und Einer zerlegst. Und dann musst Du die so gewonnenen "Ziffern" auch noch an die passenden Stellen im DWORD-Ergebnis schieben, dafür ist die SHL-Funktion gedacht. Schau sie Dir einfach mal in der Hilfe an.
 
Zurück
Oben