Soll Verhalten Blind_Input im Handbetrieb

Begonnen von Küftel, 26. Dezember 2012, 05:26:25

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 5 Gäste betrachten dieses Thema.

Küftel

Hallo zunächst mal großen dank an die Ersteller der Buildung lib!!! Ich bin begeistert...

Eine Frage hat sich mir bei meinen ersten Gehversuchen ergeben: Warum wir im Handbetrieb nicht auf das Erreichen der Endposition abgeschaltet?

In der Docu steht für Blind Input:
ZitatIst ein Tastendruck kürzer als CLICK_TIME so Fährt die Jalousie weiter bis ein weiterer Klick die Fahrt beendet oder eine Endstellung erreicht wird.

Dies funktioniert nicht. Bei mir fährt er immer bis zum Manual Timeout oder bis ein weiterer Klick die Fahrt beendet, jedoch schaltet er nicht selbständig aus wenn die Enstellung erreicht wird.

Wenn ich mir die Quelle anschaue scheint das in der Doku beschriebene Verhalten auch nicht berücksichtigt:
  134:  (* manual operation single click up *)
      QU := TRUE;
      QD := FALSE;
      PO := POS; AO := ANG;
      IF tx - last >= max_runtime THEN status := 131;END_IF;
     
  135:  (* manual operation single click dn *)
      QU := FALSE;
      QD := TRUE;
      PO := POS; AO := ANG;
      IF tx - last >= max_runtime THEN status := 131; END_IF;


Hier wird lediglich auf max_runtime abgefragt.

Ich stelle mir halt die Frage ob es für den User logisch ist wenn er bei geöffneter Jalousie den Taster öffnen versehentlich drückt (ohne Reaktion da Jalousie bereits oben) und nachfolgend zweimal den Taster zum herunterfahren betätigen muss (erster Tastendruck zum stoppen des Auf Befehls und zweiter zum Starten des manuellen Ab Befehls).

Vielen Dank vorab!

Omalik

Hallo Küftel

Hatte ich auch schon festgestellt. Wenn du keine Hardware Endschalter hast, hat das ganze auch einen Vorteil.  8) Wenn die ist Position der Storen nicht mit der Ist Position der SPS übereinstimmt machst du mit dem manuellen fahren einen "nullabgleich". ( Sicherung der Storen ausgefallen ist ist nicht istposition.)
Bei mir fahren die Storen fast immer automatisch nach Wetterstation oder mach Zeitschlatuhr.
Gruß


HopeITworks

Also das verstehe ich wirklich auch garnicht. Habe das soeben selbst hier in Betrieb genommen und habe genau dieses Verhalten.

Was macht die Rückführung der POS von Blind_Control dann für einen Sinn wenn diese bei 0 nicht die Fahrt beendet? Weiß da einer mehr dazu?

Was muss ich umschreiben um das so zum Laufen zu bekommen?

Er fährt so immer in den MAX_RUNTIME Timeout rein. Da kann es schon vorkommen, dass eben noch der Fahrbefehl anliegt und man diesen erst mit der Gegenrichtung beenden muss, bevor man wieder in die Gegenrichtung fahren kann. Genauso wie es der Threadersteller auch schon beschrieben hat.

DOD666

Habe ich auch noch nicht verstanden.
Ich dachte auch da der blind Control eine einstellbare nachfahrzeit hat die Sache erledigt.
Man kann ja auch einstellen wie dicht bei der endlage diese Zeit dann addiert werden soll.

Leider meldet sich nie einer der Leute die die Bausteine erstellt haben.


Gruß

Jens

HopeITworks

Wo bekommt man denn den Kontakt zu dem Ersteller des Bausteins? Wäre schon klasse wenn die Funktion auch so gegeben wäre :)

DOD666

Steht ja immer das Kürzel des erstellers unten in der Historie. :-D

Ansonsten ändern hier rein stellen und schauen wie das feedback ist.

Gruß

Jens

fu_zhou

Gibts hier keinen SCL Spezi, der sich der Sache mal annimmt? Ich teste dann gerne...

mattsches

Die Step 7-Variante der OSCAT Building habe ich gerade nicht greifbar, nur Codesys. Aber in SCL sollte das Ganze auch gehen.

1. Deklarationsteil: In Codesys gibt es VAR_INPUT CONSTANT bei Step 7 vermutlich VAR_INPUT:

PositionReachedDelay : TIME := t#5s;


2. Code (Auszug, logisch):

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

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


Das ergibt eine Nachlaufzeit von standardmäßig 5 Sekunden nach Erreichen der errechneten Endposition. Hab's nicht ausprobiert, sollte aber eigentlich gehen. Der Initialisierungslauf nach Neustart der SPS müsste auch weiterhin funktionieren. Soweit ich das sehe, wird der im Automatikmodus abgearbeitet und nicht über den Handbetrieb.

Grüße,
mattsches

fu_zhou

mattsches ist der Knüller, muss ich heute Abend mal probieren...

fu_zhou

Obwohl ich TimePositionReached: TIME; noch unter VAR definiert habe, kommt beim Übersetzen der Zeile
IF POS < 255 THEN TimePositionReached := tx; END_IF; (*1.8*)

"Unzulässige Operandentypen" und
"der Ausdruck mus vom Datentyp BOOL sein"




[gelöscht durch Administrator]

mattsches

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


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


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:
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


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:
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*)

fu_zhou

Wie kriegt man das mit dem STATUS=131 noch unter?
IF tx - last >= max_runtime THEN status := 131; END_IF
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


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


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

POS < BYTE#255

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:


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



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.