Sprungbefehl

Bollmann

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
Ich habe ein dynamischen Wert, welcher steigen und fallen kann. Für verschiedene Schwellwerte sollen entsprechende Programmabläufe initiiert werden. Wie kann ich es einrichten, dass innerhalb eines Funktionsbausteins (FC) ein Sprung von der Bedingung zum jeweiligen Programm erfolgt?

Also beispielsweise:
Wenn

L L#25000
L MW1
>I

Dann

= A 9.0

und wenn

U(
L L#25000
L MW1
<I
)
U(
L L#20000
L MW1
>I
)

dann

= A 9.1

...wenn ich das mit dem SPB-Befehl mache, laufen alle Programme gleichzeitig ab. Also beispielsweise:

L L#25000
L MW1
>I
SPB OFM

...

OFM: = A 9.0

..alles was dazwischen liegt, läuft in diesem Fall trotzdem ab.
Würde mich über Anregungen freuen.
Viele Grüße, Tom
 
dein Programm "springt" nur wenn der Inhalt von MW1 kleiner als 25000 ist.

MW ist übrigens ein WORD oder INT. L#25000 meint eigentlich eine Zahl im Format LONGINT (32 Bit breit statt 16). Das funktioniert hier zwar - ist aber nicht schön ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hm, also wenn ich das so mache:

L L#25000
L MW1
>I
SPB OFM

U(
L L#25000
L MW1
<I
)
U(
L L#20000
L MW1
>I
)
SPB DIM

OFM: = A 9.0
DIM: = A 9.1

Dann liegt an beiden Ausgängen ein Signal an, obwohl ja eigentlich nur an einem Ausgang ein Signal anliegen sollte.
 
Das würde ich nicht so programmieren.
Es kann passieren, dass Du in einem Zyklus auf OFM springst und einige Zeit später über OFM drüber, da bleibt der A9.0 gesetzt... weil den Ausgang nimmt niemend mehr zurück.

Besser ist:

L L#25000
L MW1
>I
= A9.0

U(
L L#25000
L MW1
<I
)
U(
L L#20000
L MW1
>I
)
= A9.1

lG
Karl
 
Abgesehen davon wird bei dem Sprung nach OFM das VKE für den Ausgang 9.0 gleich für den Ausgabng 9.1 mitbenutzt ...
 
... dann müßtest du schon folgendes machen :
Code:
OFM: = A9.0
SPA Exit
DIM: = A9.1
SPA Exit
 
 
Exit: NOP 0
 
... dann müßtest du schon folgendes machen :
Code:
OFM: = A9.0
SPA Exit
DIM: = A9.1
SPA Exit
 
 
Exit: NOP 0

Ändert aber nichts, dass der Ausgang trotzdem bleibt wenn einmal die Sprungbedingung erfüllt ist.
Man könnte nur vor dem Abfragen, also am Anfang:

CLR
= A9.0
= A9.1

hinzufügen, dann klappts auch mit dem "Exit".

lG
Karl
 
Nochmal ganz generell zu SPB, also zu den ursprünglichen Ansätzen von Bollmann:

Nach einem SPB ist das VKE immer auf 1!
Das heißt, ein dann angesprungenes =A x.y setzt diesen Ausgang auf jeden Fall.

(nur damit's nicht in Vergessenheit gerät ...)
 
Hey, erstmal vielen Dank für die Antworten!
So wie es borromeus im 4. Beitrag gemacht hat, hatte ich es auch schon. Allerdings sollte das "= A 9.x" nur stellvertretend sein. Ich möchte ja eigentlich ein Programm initiieren, wenn die jeweiligen Vergleichsbedingungen zutreffen. Daher dachte ich, dass ich auf die jeweilige Programmschleife mit einem Sprungbefehl zugreife. Nach Ablauf des Programms sollte dann wieder verglichen werden und erneut eine Programmentscheidung stattfinden.
 
Oh, das könnte klappen, danke!
Kann man auch irgendwie verhindern, dass sich die Programmabläufe, die durch die Merker initiiert werden, überschneiden? Denn wenn sich während des Programms das dynamische Eingangssignal ändert, werden die Merker ja trotzdem gesetzt. :-/
Also geht es, dass eine neue Vergleichsoperation erst stattfindet, nachdem das Programm abgelaufen ist?
 
Das Eingangssignal ist während einer Bearbeitung des OB1 (ausser du arbeitest mit TPA.. vermutlich nicht) immer gleich.
Bevor ein OB1 Zyklus beginnt wird die Peripherie in das sogenannte Eingangsabbild geschrieben... auf das greifst Du zu.
War das Deine Frage?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, also ich habe einen analogen dynamischen Eingangswert den ich in das Merkerwort 1 (MW 1) transferiere. Das ist so eine AI/AO-Baugruppe, der lässt sich im Bereich von +/- 10V regeln.
Der Eingangswert wird also ständig ins MW 1 transferiert. Das MW1 wird dann mit definierten Schwellwerten verglichen und die Programmentscheidung getroffen.
 
Okay, und wie kann ich diesen Zyklus per Programmbefehl definieren bzw. eingrenzen?

Zur Zeit Ist am Anfang nur die Sprungmarke und am Ende ein absoluter Sprungbefehl SPA Exit -> Exit: NOP 0. Muss man das mit "Loop" als Zyklus definieren oder ist das jetzt schon ein Programmzyklus?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Bollmann,
du brauchst diesen Zyklus nicht einzugrenzen und einen "LOOP" brauchst du dort auch nicht, das regelt alles schon die SPS für dich.
Vielleicht hast du schonmal was von dem EVA-Prinzip gehört?
Eingabe - Verarbeitung - Ausgabe

Das heißt wenn deine SPS sich im "RUN"-Zustand befindet passiert vereinfacht gesagt folgendes:
1. Eingabe: Eingänge werden gelesen (digital und analog)
2. Verarbeitung: Der OB1 wird abgearbeitet (natürlich auch alle Aufrufe und Funktionen die du reingeschrieben hast - ganz normal von oben nach unten)
3. Ausgabe: Nach der Verarbeitung erfolgt die Ausgabe von dem was du programmiert hast an die Ausgänge (auch digital und analog)

Das heißt also das wenn du z.B. ganz oben im OB1 einen Ausgang setzt und ihn ganz unten im OB1 wieder zurücksetzt, wird dieser Ausgang nicht angesteuert, da die Ausgabe erst nach der gesamten Abarbeitung des OB1 gemacht wird.
Die Zyklusgeschwindigkeit hängt von der Länge des von dir geschriebenen Codes ab. Je mehr Operationen, Berechnungen, Zuweisungen etc. du durchführst, desto länger braucht die SPS für einen EVA-Zyklus. Es gibt auch noch die Möglichkeit einer "Mindestzykluszeit". Diese kann man bei den Objekteigenschaften der CPU in der Hardwarekonfiguration machen, jedoch denke ich nicht das du das benötigen wirst.
 
Hm, ich glaub ich mein was anderes. *g*
Also. Im OB1 steht bei mir nur drin:

Call FC1
NOP 0

Und im Funktionsbaustein FC1 sind dann Vergleichsoperationen.
Diese weisen je nach Ergebnis den jeweiligen Merkern das VKE 1 zu.
Und mit diesen Merkern wird der Sprungbefehl zu einem "Programm" gegeben.

Es soll ein Scheibenwischerprogramm werden.. also beispielsweise erfolgt nach einer bestimmten Vergleichsoperation der Sprungbefehl zum Programm "Intervall Wischen". Das besteht aus zahlreichen Und-Verknüpfungen und Merker-Abfolgen. Nun soll erst nachdem dieses Programm zu Ende ausgeführt wurde, also der Scheibenwischer wieder in Ausgangsposition ist, die nächste Vergleichsoperation stattfinden und den entsprechenden Merker setzen, der den Sprungbefehl zu einem entsprechenden Programm setzt. Also falls inzwischen das Eingangssignal gefallen ist auf "Dauerwischen".

Diese Unterprogramme erst durchlaufen zu lassen und dann erst die nächste Programmentscheidung treffen zu lassen, mag mir nicht recht gelingen. :-/
 
okay, das könnte man recht einfach lösen in dem du mit der Vergleichsoperation und einem Hilfsmerker deine FCs nur bedingt aufrufst.

z.B.

O(
L EW0
L 1
==I
)
O M10.0
UN M10.1
UN M10.2
CC FC1

O(
L EW0
L 2
==I
)
O M10.1
UN M10.0
UN M10.2
CC FC2

O(
L EW0
L 3
==I
)
O M10.2
UN M10.0
UN M10.1
CC FC3

Im FC1:
SET
S M10.0
.
.
Dein Programm
.
.
Wenn Dein Programm fertig ist:
R M10.0

Im FC2:
SET
S M10.1
.
.
Dein Programm
.
.
Wenn Dein Programm fertig ist:
R M10.1

Im FC3:
SET
S M10.2
.
.
Dein Programm
.
.
Wenn Dein Programm fertig ist:
R M10.2
 
Zuletzt bearbeitet:
Zurück
Oben