TIA Programmierung Terrarium

Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht kann mir einer sagen was ich falsch mache.
Ich habe am Baustein "zeitvariable vergleichen" am Eingang 1 den Ausgang vom baustein "uhrzeit lesen". Am Eingang zwei wollte ich eine festen Wert eintragen. Laut TIA Hilfe ist das Format "DT#2021-01-17-14:51:00:122"
Dieses Format funktioniert aber nicht
 
Ich habe am Baustein "zeitvariable vergleichen" am Eingang 1 den Ausgang vom baustein "uhrzeit lesen". Am Eingang zwei wollte ich eine festen Wert eintragen. Laut TIA Hilfe ist das Format "DT#2021-01-17-14:51:00:122"
Dieses Format funktioniert aber nicht
Ist denn der Ausgang des Bausteins "uhrzeit lesen" vom Typ DATE_AND_TIME alias DT (dann müsste es mit einer Konstante in der Form 'DT#2021-01-17-14:51:00.122' funktionieren) oder vom Typ TIME_OF_DAY alias TOD (dann müsstest Du z.B. 'TOD#14:51:00.122' schreiben)?
In beiden Fällen aber den ':' nur als Trennzeichen zwischen Stunden und Minuten und zwischen Minuten und Sekunden verwenden. Zwischen Sekunden und MilliSekunden mit '.' trennen!
Was funktioniert nicht? Ein Vergleich auf '=='? Der würde nur Gleichheit erkennen, wenn Datum und Uhrzeit auf die ms genau gleich sind.

@heipo
Wozu die Konvertierungen BCD->INT bei Stunden und Minuten?
Ist bei TIA der DatenTyp DT nicht ...
Der Datentyp DATE_AND_TIME definiert einen Bereich mit 64 Bits (8 Byte) für die
Angabe von Datum und Uhrzeit.
... ?
 
Zuletzt bearbeitet:
Ja super. dank dir. habe es auch geöffnet bekommen. Aber ich stehe gerade irgendwie auf den Schlauch wie ich da Ein- und Auschaltzeiten definieren kann
kann mir da einer einen Tipp geben
 
Ja die hatte ich auch schon durch gestöbert und dort stand was von einem FB den man anlegen soll. Aber muss halt sagen das vieles für mich Neuland ist.
 
Zuletzt bearbeitet:
Hallo Heinileini hier ein Auszug aus der Tia Hilfe




Der Datentyp DT (DATE_AND_TIME) speichert Angaben zu Datum und Uhrzeit im BCD-Format.
Die folgende Tabelle zeigt die Eigenschaften des Datentyps DT:


[TABLE="class: table_default"]
[TR]
[TH] Länge (Byte)[/TH]
[TH] Format[/TH]
[TH] Wertebereich[/TH]
[TH] Beispiel für Werteingabe[/TH]
[/TR]
[TR]
[TD] 8[/TD]
[TD] Datum und Uhrzeit
(Jahr-Monat-Tag-Stunde:Minute:Sekunde:Millisekunde [SUP]3)[/SUP])[/TD]
[TD] Min.: DT#1990-01-01-00:00:00.000
Max.: DT#2089-12-31-23:59:59.999[/TD]
[TD] DT#2008-10-25-08:12:34.567, DATE_AND_TIME#2008-10-25-08:12:34.567[/TD]
[/TR]
[/TABLE]

Die folgende Tabelle zeigt die Struktur des Datentyps DT:


[TABLE="class: table_default"]
[TR]
[TH] Byte[/TH]
[TH] Inhalt[/TH]
[TH] Wertebereich[/TH]
[/TR]
[TR]
[TD][/TD]
[TD] Jahr[/TD]
[TD] 0 bis 99
(Jahre 1990 bis 2089)
BCD#90 = 1990
...
BCD#0 = 2000
...
BCD#89 = 2089[/TD]
[/TR]
[TR]
[TD] 1[/TD]
[TD] Monat[/TD]
[TD] BCD#1 bis BCD#12[/TD]
[/TR]
[TR]
[TD] 2[/TD]
[TD] Tag[/TD]
[TD] BCD#1 bis BCD# 31[/TD]
[/TR]
[TR]
[TD] 3[/TD]
[TD] Stunde[/TD]
[TD] BCD#0 bis BCD#23[/TD]
[/TR]
[TR]
[TD] 4[/TD]
[TD] Minute[/TD]
[TD] BCD#0 bis BCD#59[/TD]
[/TR]
[TR]
[TD] 5[/TD]
[TD] Sekunde[/TD]
[TD] BCD#0 bis BCD#59[/TD]
[/TR]
[TR]
[TD] 6[/TD]
[TD] Die beiden höchstwertigen Ziffern von MSEC[/TD]
[TD] BCD#0 bis BCD#999[/TD]
[/TR]
[TR]
[TD] 7 (4MSB) [SUP]1)[/SUP][/TD]
[TD] Die niederwertige Ziffer von MSEC[/TD]
[TD] BCD#0 bis BCD#9[/TD]
[/TR]
[TR]
[TD] 7 (4LSB) [SUP]2)[/SUP][/TD]
[TD] Wochentag[/TD]
[TD] BCD#1 bis BCD#7
BCD#1 = Sonntag
...
BCD#7 = Samstag[/TD]
[/TR]
[TR]
[TD="colspan: 3"] [SUP]1) [/SUP]MSB: Most Significant Bit
[SUP]2) [/SUP]LSB: Least Significant Bit
[SUP]3)[/SUP] Festpunktzahl[/TD]
[/TR]
[/TABLE]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Weiß halt nicht was in diesem FB kommt und wie der benannt werden soll usw.
Zusätzlich habe ich gerade noch an dem Projekt ein paar warnungen die ich nicht weiß zu beseitigen. Siehe Bild sind ein paar mehr.

20210118_204316.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ist das trotzdem alles richtig?
Kann mir einer helfen was in den neuen FB kommt und welche Nummer der bekommen muss um vier bis fünf weitere ein und ausschaltzeiten der tageszeitschaltuhr zu bekommen?
 
... um vier bis fünf weitere ein und ausschaltzeiten der tageszeitschaltuhr zu bekommen?
Mit TAGESZEITschaltuhr ist doch gemeint, dass nur die Tageszeit zählt, egal zu welchem Datum? Und vermutlich soll es auch möglich sein, erst zu der angegeben Zeit am folgenden Tag auszuschalten (z.B. EIN um 21:00 und AUS um 03:00)? Und EinschaltDauern von maximal 23h59m[59s] sollten ausreichen?

Ich würde dafür keinen FB machen, sondern einen FC mit den Eingängen EinschaltZeit, AusschaltZeit und aktuelleTageszeit. Das Ergebnis des FC wäre die BOOLesche Information, ob EIN bzw. AUS.

Den FC kannst Du für beliebig viele Ein-/AusschaltZeitenPaare aufrufen, ohne Dich um (Multi-)Instanzen kümmern zu müssen.

Dieser FC enthält allerdings 3 ZeitVergleiche:
Code:
bInv := iEinschaltZeit > iAusschaltZeit ;
bEin := iAktuelleTageszeit >= iEinschaltZeit ;
bNichtAus := iAktuelleTageszeit < iAusschaltZeit ; 
obErgebnis := bInv XOR ((bInv XOR bEin) AND (bInv XOR bNichtAus)) ;
Ich würde möglichst nicht den DatenTyp DT (DATE_AND_TIME) verwenden, sondern viel lieber TOD (TIME_OF_DAY), der kein Datum enthält, das man noch "unschädlich machen" müsste.

Hinweise zum Verständnis der Vergleichereien und "XORgien":

Wenn EinschaltZeit < AusschaltZeit ist, dann gilt Ergebnis := (aktuelleTageszeit >= EinschaltZeit) AND (aktuelleTageszeit < AusschaltZeit) ;
aber,
wenn EinschaltZeit > AusschaltZeit ist, dann gilt Ergebnis := (aktuelleTageszeit >= EinschaltZeit) OR (aktuelleTageszeit < AusschaltZeit) ;

Diese FallUnterscheidung kann man mit IF ... Then ... Else ... erschlagen. Muss man aber nicht, man kann stattdessen auch das If-Then-Else-Konstrukt erschlagen und DeMorgan bemühen, kombiniert mit einer Nutzung der XOR-Verknüpfung als bedingte Negation.

DeMorgan:
- negiert/invertiert man an einer UND-Verknüpfung alle Eingänge und den Ausgang, so verhält sie sich wie eine ODER-Verknüpfung
bzw. (der Vollständigkeit halber)
- negiert/invertiert man an einer ODER-Verknüpfung alle Eingänge und den Ausgang, so verhält sie sich wie eine UND-Verknüpfung
also x OR y = NOT(NOT x AND NOT y).

XOR als bedingte Negation:
x XOR FALSE = x
bzw.
x XOR TRUE = NOT x
bzw.
x XOR y = x, wenn y = FALSE und x XOR y = NOT x, wenn y = TRUE.
 
Also die Zeiten gehen nicht über 0 Uhr hinaus. Benötige nur ein und ausschaltzeiten am gleichen Tag. Leider verstehe ich davon gerade null wie ich sowas im fc oder fb programmieren soll. Dazu habe ich leider zu wenig Erfahrung. Ich weiß nur das in der siemens Anleitung steht das ein fb erstellt werden soll
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tatsächlich, passt! :s12:

PS:
Am interessantesten finde ich ja das Byte 0. Der Nachfolger vom Y2K-Bug ist uns also gesichert! :ROFLMAO: ;)

Anscheinend geht da keiner davon aus, dass 2089 dieses System noch läuft. Das haben sie ja in den 60érn auch gedacht
und dann lief es doch ins Y2K. Aber ich glaube diesmal haben sie recht mit ihrer Vermutung :ROFLMAO:
 
Zuletzt bearbeitet:
Anscheinend geht da keiner davon aus, dass 2089 dieses System noch läuft.
Ich werde es auch nicht mehr erleben. Positiver ausgedrückt, ich muss es auch nicht mehr ertragen/durchleiden.

Ob "dieses System" 2089 noch (oder böse Zungen würden sagen 'schon') läuft, ist doch völlig egal, Michael.
Aus KompatibilitätsGründen wird das DatenFormat / der DatenTyp eisern durchgezogen ... es sei denn, Siemens trennt sich vor 2090 auch noch von der SPS-Sparte. ;)

Das haben sie ja in den 60érn auch gedacht
In den 60ern konnte man sich so manches noch nicht vorstellen, was heute selbstverständlich ist oder zumindest sein sollte. Insbesondere nicht, 1 zusätzliches (schweineteueres) Byte für vermeintlich Selbstverständliches zu spendieren/verschwenden.
KernSpeicher, gefädelte PROMs, 8''-Disketten, 64-KWort- oder noch schlimmer 64-KByte-Grenzen beim ArbeitsSpeicher waren KO-Argumente, gegen die spinnende (weil vorausschauende) Programmierer nichts ausrichten konnten.
 
Zuletzt bearbeitet:
Zurück
Oben