Uhrzeit vergleich in einer FC

rule

Member
Beiträge
6
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo und Guten Morgen,

habe ein kleines Problem. Ich möchte gernen einen Vergleich innerhalb einer Funktion anwenden.
Dabei wird von "aussen" ein wartearray [1..6] gefüllt. dabei soll dann über einen vergleich mit dem aktuellen datum das kleinste datum gespeichert und weiter verwendet werden. habe das ganze bisher so aufgeführt :
VAR_IN
Warten : ARRAY [1..6] of Date_And_Time

VAR_OUTPUT
Reserviert : INT :=0;
END_ VAR
VAR_TEMP
aktuelleZeit : DATE_AND_TIME;
Akt_Datum : DATE_AND_TIME;
CPU_DT : DATE_AND_TIME;
END_VAR



aktuelleZeit := SFC1(CDT := CPU_DT);

FOR i := 1 TO 6 DO
IF anfrage THEN
IF warten < CPU_DT THEN
aktuelleZeit := warten;
minAuftrag := i;
END_IF;

END_IF;
END_FOR;
Reserviert := minAuftrag;

bekomme jetzt immer die meldung ungültiger datentyp oder falsche parameterzuweisung.
habt ihr ne idee an was es hängt?


Viele Danke schonmal!

Viele Grüße
 

Sinix

Well-known member
Beiträge
1.588
Punkte Reaktionen
216
An welcher Stelle bekommst du die Meldung?

Sind Variablen minAuftrag und anfrage[] irgendwo deklariert?
Du vergleichst zwei Variablen vom Typ Date_and_Time, die sind aber jeweils 8 Byte groß.Vielleicht hier Datum und Uhrzeit seperat vergleichen.

MfG MK
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,
ich denke, dass hier das Problem liegt : Du kannst nur elementare Datentypen miteinander vergleichen. Für den DT-Vergleich mußt du dir entweder etwas selber erstellen oder einen der Siemens-Bausteine dafür nehmen ...

Gruß
Larry
 

nutellahase

Well-known member
Beiträge
180
Punkte Reaktionen
28
Also was ich sehe ist, dass deine Variable "aktuelle Zeit" als RET_VAL für die SFC1 dienen soll. Diese hast du aber als DT deklariert, was schon mal nicht gehen kann, denn die SFC1 verlangt als RET_VAL eine Integer Variable!
Ansonsten müsste es sehr wohl gehen zwei DT's in SCL zu vergleichen. Beim Übersetzen wird dann automatisch der von Mäuseklavier genannte FC eingefügt (sieht man halt nur nicht in SCL).
 

hucki

User des Jahres 2014
Beiträge
5.957
Punkte Reaktionen
1.855
Zuviel Werbung?
->Hier kostenlos registrieren
... habt ihr ne idee an was es hängt? ...
Wenn Dein Programm in real auch so aussieht, wie hier, dann an so Einigem. Das fällt sogar mir als SCL-Laien auf:

- VAR_IN ist nicht mit VAR_END abgeschlossen.
- die Deklaration von Warten ist nicht mit ; abgeschlossen
- beim VAR_END von VAR_Output hat sich ein Leerzeichen eingeschlichen
- anfrage und minAuftrag sind nicht deklariert
- (an die Cracks -) kann SCL "If anfrage(i)" als true oder false erkennen, wie die meisten Hochsprachen, oder muß da noch explizit z.B. "= true" hinter?
[Edit] das ist also ok, solange es sich bei anfrage(i) um einen boolschen Wert handelt. [/Edit]


Hast Du das hier alles per Hand eingetippt? Sieht nämlich so aus. Wenn ja, warum nimmst Du nicht Copy & Past (Strg+C & Strg+V)?
Wenn doch verwendet, dann erklärt das die Fehlermeldungen (siehe oben)

Und zum Schluß: In der Symbolleiste über dem Editierfeld ist in der 2. Reihe ganz am Ende das Code-Symbol #, das die Code-Tags erzeugt. Den Code im SCL-Editor kopieren, hier einfügen, markieren und dann auf das Symbol drücken (am Besten noch in der Schriftart "Courier New" formatieren und auch sonst 'n bißchen in Form gebracht) und schon ist der Code hier auch besser erkenn-/lesbar. ;)

Beispiel:
Code:
[FONT=courier new][COLOR=#3E3E3E]VAR_IN[/COLOR]
[COLOR=#3E3E3E]   Warten : ARRAY [1..6] of Date_And_Time;[/COLOR]
[COLOR=#3E3E3E]END_VAR

VAR_OUTPUT[/COLOR]
[COLOR=#3E3E3E]   Reserviert : INT :=0;[/COLOR]
[COLOR=#3E3E3E]END_VAR[/COLOR]
[COLOR=#3E3E3E]
VAR_TEMP[/COLOR]
[COLOR=#3E3E3E]   aktuelleZeit : DATE_AND_TIME;[/COLOR]
[COLOR=#3E3E3E]   Akt_Datum : DATE_AND_TIME;[/COLOR]
[COLOR=#3E3E3E]   CPU_DT : DATE_AND_TIME;[/COLOR]
[COLOR=#3E3E3E]END_VAR[/COLOR]



[COLOR=#3E3E3E]aktuelleZeit := SFC1(CDT := CPU_DT);[/COLOR]

[COLOR=#3E3E3E]FOR i := 1 TO 6 DO[/COLOR]
[COLOR=#3E3E3E]   IF anfrage[i] THEN[/COLOR]
[COLOR=#3E3E3E]      IF warten[i] < CPU_DT THEN[/COLOR]
[COLOR=#3E3E3E]         aktuelleZeit := warten[i];[/COLOR]
[COLOR=#3E3E3E]         minAuftrag := i;[/COLOR]
[COLOR=#3E3E3E]      END_IF;[/COLOR]
[COLOR=#3E3E3E]   END_IF; [/COLOR]
[COLOR=#3E3E3E]END_FOR;[/COLOR]
[COLOR=#3E3E3E]
Reserviert := minAuftrag;[/COLOR][/FONT]
 
Zuletzt bearbeitet:

nutellahase

Well-known member
Beiträge
180
Punkte Reaktionen
28
kann SCL "If anfrage(i)" als true oder false erkennen, wie die meisten Hochsprachen, oder muß da noch explizit z.B. "= true" hinter?

Generell können Bool Variablen einfach mit

Code:
IF myBool THEN // Abfrage auf "1"
   Anweisungen
END_IF;

oder mit

Code:
IF NOT myBool THEN // Abfrage auf "0"
   Anweisungen
END_IF;
abgefragt werden.

Möchtest du nur eine Zuweisung machen (z.B. myBool ist nur solange "1" solang myInteger > 3) dann schreibst du:

Code:
myBool := myInteger > 3;
 

hucki

User des Jahres 2014
Beiträge
5.957
Punkte Reaktionen
1.855
OKay, danke. Also wie bei anderen Hochsprachen auch.

Setzt aber zumindest voraus, dass das Array abfrage auch als BOOL deklariert ist, was beim TE nicht sicher gestellt ist.


Zusatzfrage: Bei anderen Hochsprachen wird z.B. ein Integerwert von <>0 oder explizit -1 (bzw. 0) auch als TRUE (bzw. FALSE) erkannt. Ist das bei SCL auch so?
 

nutellahase

Well-known member
Beiträge
180
Punkte Reaktionen
28
Zuviel Werbung?
->Hier kostenlos registrieren
Ja auch das geht! Wenn nicht dann schreibt der Compiler "Der Ausdruck muss vom Datentyp Bool sein!" oder so ähnlich. Meistens helfen hier dann Klammern.
Der zu überprüfende Ausdruck muss also immer "Wahr" oder "Falsch" sein (also im Prinzip wieder ein Bool: Ausdruck = "1" oder Ausdruck = "0").

Im Prinzip kannst du (fast) alles miteinander vergleichen (ich habe z.B. schon mal Strings auf Ungleichheit überprüft). Deswegen sollte es auch mit den Datentypen Date and Time gehen.

Habe leider momentan kein Step7 hier aber im Prinzip sollte das auch funktionieren:

Code:
IF ((myString1 <> myString2) AND (myDT1 = myDT2)) OR (myInteger > 12) OR myBool THEN ...

Die nachfolgenden Anweisungen werden ausgeführt wenn die beiden Strings unterschiedlich und die DTs gleich sind, oder wenn die Integervariable größer als 12 ist oder einfach myBool "1" ist.
Und bei den Strings und DTs werden dann automatisch die IEC Funktionen eingefügt.

EDIT: Meistens muss man aber noch eine Typwandlung durchführen, damit es geht. Eine als WORD deklarierte Variable kann nicht einfach auf >, <, <>, >=, <= einer Ganzzahl verglichen werden!
 

hucki

User des Jahres 2014
Beiträge
5.957
Punkte Reaktionen
1.855
Hab' mich vlt. nicht ganz klar ausgedrückt.
Was alles ein boolsches Ergebnis durch die Operation bzw. den Vergleich ergibt, ist mir schon klar.

Aber - Bsp.:
Funktioniert
Code:
IF MyINT Then ...
oder muss ich den Vergleich ausschreiben:
Code:
IF MyINT <> 0 Then
Sorry, hab' gerade nichts zum selber Testen hier. :(
 

nutellahase

Well-known member
Beiträge
180
Punkte Reaktionen
28
Achso... das habe ich eigentlich noch nie probiert. Muss ich selber morgen mal ausprobieren! Aber ich vermute, dass es ohne zusätzliche Vergleichsoperation nicht gehen wird.

@TE: Bitte poste doch mal deinen kompletten Baustein/Code! Die Schleife müsste u.U. auch noch mal überarbeitet werden. Wozu benötigst du 6 Anfragebits?? z.B. i=1; wenn Anfrage[1] = True dann wird allerdings auch nur warten[1] mit der Systemzeit verglichen was aber nicht unbedingt die kleinste Zeit sein muss! Sind Anfrage[2]...Anfrage[6] = FALSE dann werden die Zeiten warten[2] ... warten[6] gar nicht verglichen.
 

hucki

User des Jahres 2014
Beiträge
5.957
Punkte Reaktionen
1.855
Zuviel Werbung?
->Hier kostenlos registrieren
Im Moment wird nicht das kleinste Datum, sondern das letzte Datum, das kleiner der CPU-Zeit ist, gefunden.

Wenn das Array aber nach Größe sortiert (Größte zuerst) ist und mit dem Array Anfrage auf gültige Zeitwerte im Array warten verwiesen wird, dann sollte es der kleinste Wert sein und z.B. nachfolgende Nullwerte sollten ignoriert werden.
 

nutellahase

Well-known member
Beiträge
180
Punkte Reaktionen
28
@hucki: Also heute hab ich das mal getestet und eine Integervariable abgefragt:

If myInteger Then ....

Es kommt dann die Fehlermeldung "Der Ausdruck muss vom Datentyp BOOL sein!" ... man muss also eine zusätzliche Vergleichsoperation mit durchführen!

mfg
 
Oben