Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Uhrzeit vergleich in einer FC

  1. #1
    Registriert seit
    07.03.2012
    Beiträge
    6
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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[i] THEN
    IF warten[i] < CPU_DT THEN
    aktuelleZeit := warten[i];
    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
    Zitieren Zitieren Uhrzeit vergleich in einer FC  

  2. #2
    Registriert seit
    25.11.2008
    Ort
    Westpfalz
    Beiträge
    1.550
    Danke
    187
    Erhielt 212 Danke für 186 Beiträge

    Standard

    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
    and we all support the team (S.King - Die Arena)

  3. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    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

  4. #4
    Registriert seit
    25.11.2008
    Ort
    Westpfalz
    Beiträge
    1.550
    Danke
    187
    Erhielt 212 Danke für 186 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Hallo,
    ... oder einen der Siemens-Bausteine dafür nehmen ...

    Gruß
    Larry
    in der IEC-Bibliothek der FC9 EQ_DT
    and we all support the team (S.King - Die Arena)

  5. #5
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    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).

  6. #6
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    Zitat Zitat von rule Beitrag anzeigen
    ... 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:
    VAR_IN
       Warten : ARRAY [1..6] of Date_And_Time;
    END_VAR
    
    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[i] THEN
          IF warten[i] < CPU_DT THEN
             aktuelleZeit := warten[i];
             minAuftrag := i;
          END_IF;
       END_IF; 
    END_FOR;
    
    Reserviert := minAuftrag;
    Geändert von hucki (05.12.2012 um 20:31 Uhr) Grund: Edit

  7. #7
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Beitrag

    Zitat Zitat von hucki Beitrag anzeigen
    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;

  8. Folgender Benutzer sagt Danke zu nutellahase für den nützlichen Beitrag:

    hucki (05.12.2012)

  9. #8
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    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?

  10. #9
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    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!

  11. Folgender Benutzer sagt Danke zu nutellahase für den nützlichen Beitrag:

    hucki (05.12.2012)

  12. #10
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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.

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 08.05.2012, 11:40
  2. Genauigkeit der Uhrzeit einer 315er SPS
    Von slot23 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 25.04.2012, 13:53
  3. Uhrzeit bei einer S7-300
    Von steffen21m im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 25.09.2007, 06:00
  4. Variable laden bei einer bestimmten Uhrzeit
    Von noeppkes im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 18.01.2007, 15:22
  5. Antworten: 2
    Letzter Beitrag: 11.09.2005, 13:29

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •