Bug in BLIND_SET?

Begonnen von danielruetimann, 04. Januar 2013, 22:31:06

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

danielruetimann

Ich verwende in meiner App den BLIND_SET Baustein um Nachts die Jalousien zu schliessen. Manuell sollten aber die geschlossenen Jalousien jederzeit geöffnet werden können. Leider funktioniert aber der Manuelle Betrieb nicht. Habe mit Debugger die Signale an meinem BLIND_SET angeschaut:

UP = True
DN = False
IN = True
OVERRIDE_MANUAL = False

Jetzt sollte doch auch QU = True und QD = False sein. Ist aber nicht so, sondern es sind beide auf True! Ist das ein Bug im BLIND_SET oder verstehe ich hier etwas falsch?

danielruetimann

#1
Ich habe soeben herausgefunden, dass man sich die Sourcen downloaden kann und habe mir diese angeschaut. Wenn ich den Code richtig verstehe, dann hat es doch da wirklich einen Bug:


  • Wenn IN AND UP AND DOWN dann wird der Status auf 178 gesetzt.
  • Aus diesem Status 178 kommt man doch dann fälschlicherweise nur wieder raus, wenn IN = false wird
  • Der ELSE-Pfad, wo dann die Ausgänge wieder einfach transferiert würden, wird somit nicht erreicht, wenn man auf Manuellbetrieb wechselt (also wenn UP und DN nicht mehr beide True sind)

Kann dieser Bug bestätigt werden oder verstehe ich hier was falsch?

danielruetimann

Hallo...? Ist dieses Forum tot? Auch nach 3 Tagen noch keine Antwort auf meine Frage und meine Fehleranalyse. Schade....

danielruetimann

Schauen keine Entwickler oder Moderatoren in dieses Forum? Wenigstens eine kurze Bestätigung des gefundenen Bugs wäre eigentlich schon das Minimum, was ich erwarten würde.

martin.k

Hallo Daniel,

danke für Deine vier  Beiträge. Genau solche Leute wie Dich brauchen wir hier. Ich selbst bin Anwender, moderiere hier aber mal von Zeit zu Zeit.
Am Wochenende passiert hier im Forum nicht viel. Hugo, der Initiator von Oscat, ist beruflich viel in der Welt unterwegs, weshalb es durch die Zeitverschiebung und seine Dienstreisen auch mal länge Pausen gibt.
Ich werde ihm eine Nachicht schicken er möge doch bitte mal hier vorbeischauen.

Grüße
Martin
PS: Kennst Du das Forum auf www.sps-home.de.vu ?

martin.k

Hallo Daniel,

ich hatte mit Hugo kontakt. Er hat derzeit kein freie Minute. Da scheint ein wichtiges Projekt zu sein, weil er mir sagte, er hätte frühestens im Mai wieder Zeit für Oscat.
Deshalb hier die Bitte an DIE ANDEREN SPS FREAKS sich mal den Quelltext anzuschauen, ob da ein Fehler ist, was Daniel da gefunden hat.
Mehr kann ich hier leider nicht tun.
Viele Grüße
Martin

peewit

hallo

ich bin zwar mit dem BLIND Bausteinen überhaupt nicht vertraut, aber ich versuche mal dein fragen zu beantworten

funktionsweise vom BLIND_SET

dieser wird normalerweise in eine bestehende verschaltungskette der BLIND_* Bausteine zwischengeschaltet, um eine direkte beeinflussung bzw. vorgabe der positionen zu erzwingen.

folgende parameter werden standardmaessig nur durchgeschliffen

UP : BOOL (Eingang AUF)
DN : BOOL (Eingang AB)
S_IN : BYTE (ESR kompatibler Status Eingang)
PI : BYTE (Jalousiestellung im Automatikbetrieb)
AI : BYTE (Lamellenwinkel im Automatikbetrieb)

QU : BOOL (Motor Auf Signal)
QD : BOOL (Motor Ab Signal)
STATUS : BYTE (ESR kompatibler Status Ausgang)


folgende Parameter dienen deiner einflussnahme mittels BLIND_SET

Setup OVERRIDE_MANUAL : BOOL (erlaubt Manual Override wenn TRUE)
RESTORE_POSITION : BOOL (WENN TRUE wird alte Position wiederhergestellt)
RESTORE_TIME : TIME (Laufzeit zum Herstellen der Letzen Position Default = T#60s)

IN : BOOL (Eingang für Brandalarm)
PX : BYTE (Eingang für Windalarm)
AX : BYTE (Eingang für Einbruchsmeldung)


eines vorweg , die dokumentation ist fehlerhaft, bzw. auch für mich nicht ganz nachvollziehbar !

wenn du nun eine andere position ansteuern/vorgeben möchtest, dann gibst du bei PX die Position und bei AX den Lamellenwinkel vor, und sobald du IN=True machst dann werden deine vorgabewerte aktiv geschalten.
das passiert aber auch nur dann wenn UP und DN = True (also Automatikmodus) haben, oder du gibst OVERRIDE_MANUAL = true dann kannst du auch aktive ansteuerungen überstimmen.

wenn RESTORE_POSITION = true ist dann merkt sich der baustein die alte position und den winkel.
sobald du in=false machst also deine direkte psoitionsvorgabe beendest, wird die alte position wieder angefahren
die ansteuerung für die alte position wird gestoppt wenn diese wieder erreicht wurde, oder die parametrierte zeit ist abgelaufen.


bei dir ist aber

UP = True
DN = False
IN = True
OVERRIDE_MANUAL = False

UP=True das heisst du hast eine aktive richtungansteuerung
und IN=true bedeutet das du deine eigenen Position über BLIND_SET ansteuern möchtest
dies wird aber erst aktiv wenn entweder UP+DN = TRUE sind (automatikmodus) oder du OVERRIDE_MANUAL=TRUE
machst, um damit mitzuteilen das du manuell ein aktive ansteuerung übersteuerung übersteuern möchtest.


wenn das alles passt dann kommst du in den Schritt 178
diesen kann man nur wieder verlassen wenn du deine manuelle positionsansteuerung IN=False zurücknimmst


das ist für mich alles logisch nachvollziehbar, und somit kann man nicht von einem Fehler / Bug sprechen
ob das innerhalb des gesamtkonzeptes so sinnvoll ist, und funktionell praktisch ist, kann und will ich nicht bewerten
die doku ist hier aber auch etwas mangelhaft !


ich hoffe das ich dir ein wenig helfen konnte....

danielruetimann

Also wenn eine Software nicht das macht, was in der Bedienungsanleitung (oder Anwenderdokumentation) steht, dann spreche ich durchaus von einem Bug in der Software! Ansonten gäbe es ja eigentlich nie irgendwelche Bugs, oder?  ;)

peewit

hallo

du kannst es sehen wie du willst

mit meiner funktionsbeschreibung solltest du halbwegs damit umgehen können !

tobiaslochner

#9
Genau das gleiche Problem hatte ich heute auch. Der Fehler wurde von danielruetimann bereits sehr gut beschrieben.
Ist einmal der Status 178 aktiv, kann er durch den MANUAL-Betrieb nicht mehr zurück gesetzt werden.

Abhilfe bietet folgende Anpassung am Code:

Originalcode:

(* check inputs *)
IF IN THEN
IF override_manual OR (UP AND DN) THEN
status := 178;
END_IF;
END_IF;


Neuer Code:

(* check inputs *)
IF IN THEN
IF override_manual OR (UP AND DN) THEN
status := 178;
ELSE
status := s_in;
END_IF;
END_IF;


Viel Erfolg!


Ich habe auch noch eine weitere, nicht so schöne Sache entdeckt. Es ist nicht möglich zwei BLIND_SET Bausteine gleichzeitig zu verwenden,
da der Baustein nur nach Staus agiert. Unabhängig von der Freigabe IN. Wenn ich eine Lösung habe, teile ich sie hier.