TIA Char in Baustein schreiben

S_Liner

Level-2
Beiträge
365
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, ich möchte gewisse Daten Schichtweise (Früh-, Spät und Nachtschicht) in einen DB schreiben um sie dann später auszuwerten.

Nun stehe ich vor einem kleinen Problem. Zu den Daten möchte ich beim Schichtwechsel noch einen Buchstaben für die Schicht schreiben. Also F = Früh, S = Spät und N = Nacht.
Wenn ich nun aber nach dem Schichtwechsel in den Baustein schaue, wurden alle Werte geschrieben, nur der Buchstabe nicht. Die Zeilen sind leer, bzw ''.

Beispiel.PNG

Im zu schreibenden DB habe ich einen Array[1..6] of Char angelegt. Ich benutze das TIA V16.

Über eure Hilfe wäre ich sehr dankbar.

Beste Grüße
 
Wenn der Imp_Schichtwechsel genau bei #Früh, #Spät, #Nacht erzeugt wird, dann kann es sein, dass keine der 3 Bedingungen zudrifft.
Du fragst immer > oder < ab, was aber wenn in diesem Moment = zutrifft? Dann wird nichts in Scicht geschrieben. (hängt dann von der Vorbelegung und Variablenart ab, bei Temp wäre Schicht leer.)
Es sollte also in jeder Bedingung in einer Abfrage z.B >= oder <= stehen, je nachdem wann Imp-Schichtwechsel erzeugt wird, so daß immer eine der 3 Abfragen True wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn dass genau auf der zeit der Schichtwechsel aufgerufenen wurde is der vergleich false.
Sei vergleichen > schicht und < folgende schicht.
Ich denke das sie das anderen musste in >= und <

Edit
Zu Spat Ralle war schneller
 
Reichlich spät und dennoch völlig ungetestet und ohne Gewähr, aber mit "AngstKlammern" und hoffentlich verständlich ;):
Code:
// Für SchichtLängen < 12h (wegen "Kriterium bN", s.u.).
// aShift[0..2] : ARRAY OF STRUCT, z.B. 0=Früh, 1=Spät, 2=Nacht,
// .from : AnfangsZeit, .thru : EndeZeit, .char : z.B. 'F', 'S' oder 'N' - je nach Schicht,
// .actual : dieses Bit kann bei Bedarf (wie hier gezeigt) im Array "geparkt" werden, 
// muss aber nicht.
//
// bN ist das Kriterium dafür, ob die beiden Vergleiche der aktuellen Zeit mit Anfangs- 
// und EndeZeiten der Schichten mit UND (wenn Anfang < Ende) oder mit ODER 
// (wenn Anfang > Ende) verknüpft werden müssen.
// Es wirkt über die "bedingten Negationen" namens XOR an den Eingängen und am 
// Ausgang der UND-Verknüpfung - Stichwort "DeMorgan". 

iCntShift := 3; // Anzahl Schichten, alternativ als Konstante anlegen
bN := aShift[idx].from > aShift[idx].thru;                     // Alternative MIT .thru
bN := aShift[idx].from > aShift[(idx + 1) MOD iCntShift].from; // Alternative OHNE .thru
bV := (Now >= aShift[idx].from) XOR bN;
bB := (Now < aShift[idx].thru) XOR bN;                         // Alternative MIT .thru
bB := (Now < aShift[(idx + 1) MOD iCntShift].from) XOR bN;     // Alternative OHNE .thru
aShift[idx].actual := (bV AND bB) XOR bN;                   // diese Zeile nur "bei Bedarf"
IF (bV AND bB) XOR bN THEN // wenn identifiziert
    chr := aShift[idx].char; // z.B. 'F', 'S' oder 'N' - je nach Schicht
ELSE // ansonsten weitersuchen
    idx := (idx + 1) MOD iCntShift; // idx muss unverändert im nächsten Zyklus ankommen (static)
    chr := ' '; // Leerzeichen, solange noch gesucht wird
END_IF;

// Zu den Alternativen MIT bzw. OHNE '.thru':

// OHNE: Als EndeZeit einer Schicht wird die AnfangsZeit der folgenden genommen.
// Die EndeZeiten werden deshalb nicht eigens abgespeichert - '.thru' entfällt.
// Falls gewünscht, können "PseudoSchichten" als "Pausen" zwischen den Schichten
// eingefügt werden - dazu die Anzahl Schichten (iCntShift) und ArrayGrösse anpassen!

// MIT: Die EndeZeiten der Schichten müssen eigens in '.thru' abgespeichert werden.
// Der Eindeutigkeit halber sollten sich die Schichten nicht überschneiden!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... ich denke mal, dass er vergleicht ob LastSchicht <> aktSchicht ist - so würde ich es machen. Du merkst dir also in einer statischen Variable welches deine letzte Schicht (also die beim letzten Durchlauf) war ...

Gruß
Larry
 
Zurück
Oben