Probleme bei CASE-Anweisung

Begonnen von PeterH, 04. November 2010, 11:42:40

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

PeterH

Hallo liebe Community,

ich habe ein Problem mit einer CASE-Anweisung.
Zugegebener Maßen meine Erste CASE-Anweisung überhaupt.

leider wird, obwohl "LABEL" auf 2 steht der 2. Fall nicht abgearbeitet.
Erkennbar daran, dass die Variable "Druck_eingestellt" nicht true wird.
Findet Ihr einen Fehler?


CASE LABEL of
0: Druckreglersoll := real#0.0;

1: Druckreglersoll := Druck;
Timer_start := true;

IF (Druck_ok and (not timer_on)) then
timer_start := false;
LABEL := int#2;
ELSE
IF (timer_on) then
timer_start := false;
Label := int#3;
END_IF;
END_IF;

2: timer_start := false;
Druck_eingestellt := true;
Druck_gehtnicht := true;

3: timer_start := false;
druck_eingestellt := false;
Druck_gehtnicht := true;
END_CASE;


Vielen Dank für eure Hilfe,
PeterH

peewit

ansich ist im programm kein direkter fehler erkennbar


1.
wird die case anweisung  auch wirklich zyklisch durchlaufen ?
wenn nicht dann wird dir zwar label = 2 angezeigt, aber der code wird nicht durchlaufen

2. weiters ist es möglich das an anderer stelle "Druck_eingestellt" wieder auf false gesetzt wird


du müsstet hier schon dein projekt zur verfügung stellen, um hier genauere analyse machen zu können

gruss peewit

PeterH

Hallo Peewit,

vielen Dank für deine schnelle Hilfe!

Der Codeschnippsel gehört zu einem funktionsbaustein, welcher in einem Programm verwendet wird was wiederum in einer zyklischen Task bearbeitet wird.

hier ist der komplette Code des Funktionsbausteins:
Tolob_ref := druck + (Pmax_referenz * Tol_referenz) + real#0.2;
Tolun_ref := druck - (Pmax_referenz * Tol_referenz) - real#0.2;

TON_1(IN:=Timer_Start,PT:=stellzeit);
timer_on:=TON_1.Q;

IF (Tolob_ref > P_ref) then
If (Tolun_ref < P_ref) then
Druck_ok := true;
Else
Druck_ok := false;
END_IF;
Else
Druck_ok := false;

END_IF;

If Start then
Label := int#1;
ELSE
LABEL := int#0;
END_IF;



CASE LABEL of
0: Druckreglersoll := real#0.0;

1: Druckreglersoll := Druck;
Timer_start := true;

IF (Druck_ok and (not timer_on)) then
timer_start := false;
LABEL := int#2;
ELSE
IF (timer_on) then
timer_start := false;
Label := int#3;
END_IF;
END_IF;

2: timer_start := false;
Druck_eingestellt := true;
Druck_gehtnicht := true;

3: timer_start := false;
druck_eingestellt := false;
Druck_gehtnicht := true;
END_CASE;


Meintest du eventuell etwas anderes mit zyklisch durchlaufen?

peewit

so kann man das nicht entdecken

1. entweder du gibst mir dein komplettes projekt
2. du machst in online modus eine bildschirmhardcopy vom case teil und von der variablentabelle und stellst sie online
3. du könntest zum testen auch einen varaible anlegen "count" von typ udint und an der stelle folgendes einfügen

2: timer_start := false;
  count := count + UDINT#1;
    Druck_eingestellt   := true;
    Druck_gehtnicht      := true;      



PeterH

Hallo Peewit,

entschuldige bitte, dass ich erst jetzt antworte... bei uns brennt leider die luft... da sag ich dir ja sicher nichts neues^^

also ich habe wie du empfohlen hast, den udint counter eingefügt. und da dieser nicht nochzählt, gehe ich ganz davon aus, dass er nicht in das 2. Label springt.

im Anhang liegt das projekt in dem ich den FB verwende, sowie die Anwenderbibliothek mit dem Baustein Druck_anlegen. (in dem die CASE-Anweisung liegt).

Vielen Dank,

Peter


[gelöscht durch Administrator]

peewit

#5
das problem ist, das ich die online zustände deiner signale nicht kenne, und somit den verlauf deiner schrittkette somit nicht erahnen kann

also bei meinem test mit null-werten wurde nach dem schritt 2 gleich zum schritt 3 gesprungen, was ja bedeutet das es ok ist !

was mich etwas stutzig macht ist folgendes

wenn du im schritt 2 ankommst und CNT_druck = anzahl_druecke dann gehts mit schritt 3 weiter, und sollte dann noch das startkriterium DI_START auf TRUE sein
dann wiederholt sich deine schrittkette sofort wieder. aber da ich den ablauf nicht kenne ,ist das auch vielleicht absicht !

mach doch auch hier den zähler rein !
   2:
      IF (CNT_druck = anzahl_druecke) then
         cnt_druck      := cnt_druck + int#1;
         durchlauf_cnt := int#3;
      ELSE
         cnt_druck      := cnt_druck + int#1;
         durchlauf_cnt   := int#1;
      END_IF;