oscat.lib > oscat.lib fuer Step 7

Soll Verhalten Blind_Input im Handbetrieb

<< < (3/4) > >>

mattsches:
Wie ist POS denn deklariert? Als BYTE? Dann kann es sein, dass Zeile 18 so lauten muss:


--- Code: ---IF POS < BYTE#255 THEN TimePositionReached := tx; END_IF;

--- Ende Code ---

Zeile 20 entsprechend.

Falls es das nicht ist? Als was sind denn tx und last deklariert?

Im Zweifel kopiere doch mal bitte den ganzen Deklarations- und Codeteil hier rein. Wie gesagt, habe S7-Lib und SCL-Editor gerade nicht greifbar.

fu_zhou:
Ja, POS ist als Byte definiert, hier die Deklaration:

--- Code: ---VAR_INPUT
  POS, ANG : BYTE;
  S1, S2 : BOOL;
  IN : BOOL;
  PI, AI : BYTE;
END_VAR
VAR_INPUT   
  SINGLE_SWITCH : BOOL;
  CLICK_EN : BOOL := TRUE;
  CLICK_TIME : TIME := T#500ms;
  MAX_RUNTIME : TIME := T#60s;
  PositionReachedDelay : TIME := t#3s; (*1.8*)
  MANUAL_TIMEOUT: TIME := T#1h;
  DEBOUNCE_TIME : TIME := T#20ms;
  DBL_CLK1 : BOOL := FALSE;
  DBL_POS1 : BYTE;
  DBL_ANG1 : BYTE;
  DBL_CLK2 : BOOL := FALSE;
  DBL_POS2 : BYTE := 255;
  DBL_ANG2 : BYTE := 255;
  D1_TOGGLE : BOOL := TRUE;
  D2_TOGGLE : BOOL := TRUE;
  MASTER_MODE : BOOL;
END_VAR
VAR_OUTPUT
  QU : BOOL := TRUE;
  QD : BOOL := TRUE;
  STATUS : BYTE;
  PO : BYTE := 255;
  AO : BYTE := 255;
  D1, D2 : BOOL;
END_VAR
VAR
  s1e, s2e : TOF;
  s1d, s2d : CLICK_MODE;
  dir : BOOL;
  tx: TIME;
  last: TIME;
  TimePositionReached: TIME; (*1.8*)
END_VAR
VAR_TEMP
  TOP_SI: STRUCT
    EV_CLASS: BYTE;
    EV_NUM:   BYTE;
    PRIORITY: BYTE;
    NUM:      BYTE;
    TYP2_3:   BYTE;
    TYP1:     BYTE;
    ZI1:      WORD;
    ZI2_3:    DWORD;
  END_STRUCT;
  START_UP_SI: STRUCT
    EV_CLASS: BYTE;
    EV_NUM:   BYTE;
    PRIORITY: BYTE;
    NUM:      BYTE;
    TYP2_3:   BYTE;
    TYP1:     BYTE;
    ZI1:      WORD;
    ZI2_3:    DWORD;
  END_STRUCT;
  ERR : INT;
END_VAR
--- Ende Code ---

Die Fehlermeldung bleibt trotz  POS <  BYTE#255 die gleiche:
1. unzulässige Operandentypen, 2. Der Ausdruck muss vom Datentyp Bool sein. Der Code sieht so aus:

--- Code: ---134:  (* manual operation single click up *)
      QU := TRUE;
      QD := FALSE;
      PO := POS; AO := ANG;
      //IF tx - last >= max_runtime THEN status := 131; END_IF; (*1.8*)
      IF POS < BYTE#255 THEN TimePositionReached := tx; END_IF; (*1.8*)
      IF tx - last >= max_runtime OR tx - TimePositionReached >= PositionReachedDelay THEN status := 131; END_IF; (*1.8*)

  135:  (* manual operation single click dn *)
      QU := FALSE;
      QD := TRUE;
      PO := POS; AO := ANG;
      //IF tx - last >= max_runtime THEN status := 131; END_IF; (*1.8*)
      IF POS > BYTE#0 THEN TimePositionReached := tx; END_IF; (*1.8*)
      IF tx - last >= max_runtime OR tx - TimePositionReached >= PositionReachedDelay THEN status := 131; END_IF; (*1.8*)

--- Ende Code ---

fu_zhou:
Wie kriegt man das mit dem STATUS=131 noch unter?

--- Code: ---IF tx - last >= max_runtime THEN status := 131; END_IF
--- Ende Code ---
Das IF soll ja im Prinzip erweitert werden, so dass es neben der "max_runtime" auch die berechneten Positionen mit der "PositionReachedDelay"-Nachlaufzeit dazu verwendet, den Ausgang für AUF oder Zu zurückzusetzen, ohne dass ein Tastendruck die Zeit bis zum Erreichen der "max_runtime" unterbrechen muss.

mattsches:
Naja, genau über die von mir vorgeschlagene Erweiterung


--- Code: ---[...] OR tx - TimePositionReached >= PositionReachedDelay THEN [...]

--- Ende Code ---

Damit führt eine zweite Bedingung neben dem Ablauf von max_runtime dazu, dass Status 131 gesetzt wird und der Schließ-/Öffnungsvorgang als beendet betrachtet wird.

Was mich etwas ratlos macht ist die Fehlermeldung des Compilers zur (neuen) Zeile darüber. Ich kann mir keinen Reim darauf machen, was an


--- Code: ---POS < BYTE#255
--- Ende Code ---

falsch sein sollte.

Zur Erklärung: Diese neue Abfrage kopiert die aktuelle Systemzeit auf einen Zwischenspeicher, solange die Jalousie rechnerisch noch nicht voll geöffnet ist. Sobald die Offenposition erreicht ist, bleibt die gespeicherte Zeit stehen. In der erweiterten Zeile darunter wird diese dann mit der aktuellen Systemzeit verglichen, wobei die Nachlaufzeit aufaddiert wird. Ist die Systemzeit also größer als gespeicherte Zeit + Nachlaufzeit, wird die Bedingung wahr und der Baustein schaltet durch auf Status 131. Soweit die Theorie...

Vielleicht bekomme ich morgen mal einen SCL-Editor zu greifen und kann das Ganze selbst ausprobieren. Hier und jetzt bin ich gerade am Ende meines Lateins.

mattsches:
Ok, ich hab's. Bitte mal ändern:


--- Code: ---134:  (* manual operation single click up *)
      QU := TRUE;
      QD := FALSE;
      PO := POS; AO := ANG;
      //IF tx - last >= max_runtime THEN status := 131; END_IF; (*1.8*)
      IF BYTE_TO_INT(POS) < 255 THEN TimePositionReached := tx; END_IF; (*1.8*)
      IF tx - last >= max_runtime OR tx - TimePositionReached >= PositionReachedDelay THEN status := 131; END_IF; (*1.8*)

  135:  (* manual operation single click dn *)
      QU := FALSE;
      QD := TRUE;
      PO := POS; AO := ANG;
      //IF tx - last >= max_runtime THEN status := 131; END_IF; (*1.8*)
      IF BYTE_TO_INT(POS) > 0 THEN TimePositionReached := tx; END_IF; (*1.8*)
      IF tx - last >= max_runtime OR tx - TimePositionReached >= PositionReachedDelay THEN status := 131; END_IF; (*1.8*)


--- Ende Code ---

SCL lässt - im Gegensatz zu Codesys - keine größer/kleiner-Vergleiche von BYTE-Variablen zu. Nur Vergleiche auf Gleichheit und Ungleichheit werden akzeptiert. Mit BYTE_TO_INT lässt sich das umschiffen.

Probier' mal, ob es damit nun tut. Sollte es eigentlich.

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln