Forum: Mikrocontroller und Digitale Elektronik Programmablaufplan switch case richtig?


von Erhard (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Gemeinde,

ich habe versucht einen PAP für meine Arbeit anzufertigen... ich habe im 
Programm lediglich 3 switch case Anweisungen, diese funktionieren wie 
ein Stromstoßrelais.Steigende Flanke ---> Lampe leuchtet, erneute 
steigende Flanke ---> Lampe leuchtet nichtmehr... Wollte hier also mal 
nachfragen ob ich das so darstellen kann wie auf dem Bild?

LG

von Max M. (maxmicr)


Lesenswert?

Wie kann Sensor 1 gleichzeitig 0 und 1 sein?

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Erhard schrieb:
> Hallo Gemeinde,
>
> ich habe versucht einen PAP für meine Arbeit anzufertigen... ich habe im
> Programm lediglich 3 switch case Anweisungen,

Wo genau sollen die sein?
Ich seh da keine switch-case. Die Rauten sollen wohl ein paar if 
symbolisieren, die, na ja, so recht und schlecht da drinn sitzen.

> diese funktionieren wie
> ein Stromstoßrelais.Steigende Flanke ---> Lampe leuchtet, erneute
> steigende Flanke ---> Lampe leuchtet nichtmehr... Wollte hier also mal
> nachfragen ob ich das so darstellen kann wie auf dem Bild?

Darstellen kann man viel. Aber funktionieren wird das, was du da gemalt 
hast, so nicht.

: Bearbeitet durch User
von Haas (Gast)


Lesenswert?


von Erhard (Gast)


Lesenswert?

Das ist genau der punkt an dem ich nicht mehr weiter weis... ich habe 
jeweils 4 cases und er soll nach dem erfüllen eines cases beim nächsten 
programmdurchlauf direkt in den nächsten case springen...

von Erhard (Gast)


Lesenswert?

Das programm ist schon fertig und funktioniert auch problemlos... ich 
muss es also nurnoch verständlich als PAP darstellen

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> Darstellen kann man viel. Aber funktionieren wird das, was du da gemalt
> hast, so nicht.

(Und da ignorier ich erst mal sogar das noch auf dich zukommende Problem 
des Tastenprellens).

Vergiss man das explizite EInschalten bzw. Ausschalten.
Was du willst, das ist das bei der Erkennung eines Tastendrucks die 
Lampe in den jeweils anderen Zustand geschaltet wird. So eine Operation 
nennt man 'Togglen'.

Jetzt musst du nur noch rauskriegen, wie man einen Tastendruck erkennt. 
Du brauchst dazu für jede Taste eine Variable in der du dir den jetzigen 
Zustand merkst. WEnn du ein paar Millisekunden später wieder den Zustand 
der Taste ansiehst, dann vergleichst du mit dem gemerkten Zustand. Sind 
die beiden unterschiedlich (vorher war nicht gedrückt, jetzt ist 
gedrückt), dann  hat offenbar jemand in der Zwischenzeit auf die Taste 
gedrückt und du machst die Aktion, die du bei der Erkennung eines 
Tastendrucks machen willst. Der jetzt vorliegende Tastenzustand wird 
dann ausserdem noch in die Variable übertragen und fungiert dann als 
Vergleichswert in der nächsten Runde ein paar Millisekunden später.
Dann ist die Taste immer noch gedrückt, aber dein Vergleich ergibt, dass 
die Taste vorher gedrückt war, jetzt immer noch gedrückt ist, daher hat 
in der Zwischenzeit niemand die Taste gedrückt oder losgelassen -> keine 
Aktion erforderlich.


Sprich: dein ganzer Programmansatz ist komplett falsch. PAP hin oder 
her.

von Karl H. (kbuchegg)


Lesenswert?

Erhard schrieb:
> Das programm ist schon fertig und funktioniert auch problemlos .. ich
> muss es also nurnoch verständlich als PAP darstellen

Darauf kann es eigentlich nur eine SChlussfolgerung geben:
Das Programm ist nicht von dir.
Denn wenn das Programm auch nur den Hauch einer Ähnlichkeit mit dem PAP 
hat, dann kann es nicht problemlos funktionieren. Ausser deine 
Definition von 'problemlos' deckt sich nicht mit meiner.

von Falk B. (falk)


Lesenswert?

PAP a la PAP ;-)

von Erhard (Gast)


Lesenswert?

Doch dass programm ist von mir... es ist nur das erste mal dass ich 
einen PAP brauche...

von spontan (Gast)


Lesenswert?

Zeig doch mal...

von Erhard (Gast)


Lesenswert?

Kann das orginalprogramm nicht abbilden, da ich momentan zuhause 
sitze... abe ich kann es für einen case schildern
1
While (1)
2
{ 
3
Switch case (chanel)
4
Chanel1
5
        If rc2 = 1 (
6
        Portb rb1 = 1
7
        Chanel = 2 
8
                          )
9
10
Chanel2 
11
       If rc2 = 0 (
12
       Chanel = 3 
13
                        )
14
15
Chanel3
16
      If rc2 = 1 (
17
      Portb rb2 = 0
18
     Chanel = 4
19
                        )
20
21
Chanel4
22
        If rc2 = 0 (
23
        Chanel = 1
24
}

So oder so ähnlich sieht es im orginal aus ;)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Erhard schrieb:
> Kann das orginalprogramm nicht abbilden, da ich momentan zuhause
> sitze... abe ich kann es für einen case schildern

Ein switch-case wird aber so in einem PAP dargestellt
http://www.dr-seifert-online.de/Downloads/switchcase.pdf

> So oder so ähnlich sieht es im orginal aus ;)

Eher 'so ähnlich'.

Zum einen ähnelt das keiner mir bekannten Programmiersprache, was noch 
nicht viel heissen mag.
Zum anderen hat das hier skizzierte eine vollkommen andere Struktur als 
das, was du im Eröffnungsposting gezeigt hast. Eine Struktur, deren 
Quintessenz du überhaupt nicht verstanden zu haben scheinst.

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

Ich nehme an, der Hauptteil der europäischen IT-Technologie sowie der 
vorgeschaltenen Schulen, Berufsschulen, Fachhochschulen und 
Universitäten verdankt ihr Fortbestehen Herrn Karl Heinz B. :-)

von Erhard (Gast)


Angehängte Dateien:

Lesenswert?

Neuer Versuch neues Glück....

>Ein switch-case wird aber so in einem PAP dargestellt
>http://www.dr-seifert-online.de/Downloads/switchcase.pdf

das glaube ich hat mich auf die richtige bahn gebracht...

von Steffen R. (steffen_rose)


Lesenswert?

@Erhard:
Auch wenn du es im Eingangspost nicht dargestellt hast, gehe ich davon 
aus, dass du in deinen rechten Verzeigungen (sensor1=0, sensor1=1) auf 
den Wechsel wartest. Hierfür fehlt der nein-Zweig, welcher auf den 
Eingang verzweigt.

Ob du bei sensor 2 und 3 auch auf den Flankenwechsel von sensor1 
wartest, bewzeifle ich.

Dein PAP liest die Sensorwerte und verarbeitet diese direkt.

Dein späterer Codeschnipsel nutzt eine Zustandsmaschine (channel).

Da Du bereits ein Programm hast, kannst Du den PAP direkt dananch 
zeichnen. Ich würde vorab empfehlen, deinen Source um ggf. leere 
else-Zweige zu erweitern. Das hilft dir möglicherweise auch dabei, die 
nein-Zweige ordentlich einzuzeichnen.

von Karl H. (kbuchegg)


Lesenswert?

Erhard schrieb:
> Neuer Versuch neues Glück....

sieht schon besser aus.

* nur müssen von den grünen Aktionskästchen dann auch noch Pfeile 
rausgehen die zu der Stelle führen, an der die weitere 
Programmbearbeitung weiter geht.
Wenn du mit dem Finger ein PAP abfährst, dann darfst du dich nur an den 
Pfeilen lang tasten. Geht von einem Kästchen kein Pfeil zu einem anderen 
Kästchen, dann kannst du auch nicht mit dem Finger dort hin fahren.
In deinem Fall wärst du dann mit dem Finger in den grünen 
Aktionskästchen gefangen und kannst nicht mehr weiter

* es gibt kein Aktion 'Default'. Wirf den Kasten raus. Es ist vollkommen 
legal, wenn der 'falsch' Pfeil dann ganz einfach wieder zur Hauptlinie 
zurück führt. Pfeil ist Pfeil. Und wenn die Programmausführung (aka dein 
Finger) zu dieser Stelle kommt, dann fährt er einfach den Pfeil entlang.

* du solltest dich mit dir selbst einigen, ob du Vergleiche auf 
Gleichheit mit = oder mit == schreibst. Was die DIN fordert weiss ich 
nicht, aber dass sie nicht beides gleichzeitig zulassen kann, dass weiss 
ich ganz sicher.

von Steffen R. (steffen_rose)


Lesenswert?

Karl Heinz schrieb:
> * es gibt kein Aktion 'Default'. Wirf den Kasten raus. Es ist vollkommen
> legal, wenn der 'falsch' Pfeil dann ganz einfach wieder zur Hauptlinie
> zurück führt. Pfeil ist Pfeil. Und wenn die Programmausführung (aka dein
> Finger) zu dieser Stelle kommt, dann fährt er einfach den Pfeil entlang.

Wenn der Default Zweig leer ist stimme ich zu, dass das Kästchen weg 
kann. Ansonsten sollte es die default-Aktion beinhalten - also konkret 
benannt werden.

von Karl H. (kbuchegg)


Lesenswert?

Steffen Rose schrieb:
> Karl Heinz schrieb:
>> * es gibt kein Aktion 'Default'. Wirf den Kasten raus. Es ist vollkommen
>> legal, wenn der 'falsch' Pfeil dann ganz einfach wieder zur Hauptlinie
>> zurück führt. Pfeil ist Pfeil. Und wenn die Programmausführung (aka dein
>> Finger) zu dieser Stelle kommt, dann fährt er einfach den Pfeil entlang.
>
> Wenn der Default Zweig leer ist stimme ich zu, dass das Kästchen weg
> kann. Ansonsten sollte es die default-Aktion beinhalten - also konkret
> benannt werden.

In seinem Fall gibt es an dieser Stelle keine Default Aktion.
Die 'Variable1' kann nur Werte von 1 bis 4 annehmen. Das sind die 4 
Zustände, die die Zustandsvariable benötigt um 2 Tastendrücke 
abzuzählen.

Im Grunde genommen könnte man daher auch den Vergleich auf 4 komplett 
rausnehmen und die zugehörige Aktion auch in den 'falsch' Teil des 
Vergleichs auf 3 setzen (was im switch-case dann zum default wird)

: Bearbeitet durch User
von Steffen R. (steffen_rose)


Lesenswert?

Karl Heinz schrieb:
> In seinem Fall gibt es an dieser Stelle keine Default Aktion.

Ich stimme zu.
Ich bin nur immer geneigt bei Einsteigern weniger zu optimieren.

von Michael (Gast)


Lesenswert?

Da wird immernoch nicht klar, warum du ein Switch-Case brauchst...

PseudoCode
1
alterWert = 0;
2
neuerWert = Eingang;
3
Ausgang = 0;
4
5
Schleife
6
  neuerWert = Eingang; // Schalter, entprellt
7
  
8
  if (alterWert = 0 UND neuerWert = 1)
9
    Ausgang = Nicht Ausgang;
10
  ende_if
11
12
  alterWert = neuerWert;
13
Ende_Schleife

Da kommt man ohne aus und ist mMn sinnvoller?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.