# Gibt es einen Interrupt?????



## dennish23 (25 Oktober 2008)

Hallo liebe Forumgemeinde 

Ich habe mal eine Frage. Gibt es bei dem MFD4 Panel von Klöckner und Möller oder überhaupt bei einer SPS einen Interrupt den man Programmieren kann? Es geht mir darum das er bei einem bestimmten Zustand einer Variablen das Programm unterbricht und dann den Interrupt ausführt. 

z.Bsp. Wenn eine Bool Variable TRUE wird, dass er sofort als Vorrang eine Email absendet und wenn das erledigt ist in seinem Hauptprogramm wieder an der ausstiegsstelle einsteigt und es weiter abarbeitet. 

Ich weiß das es das bei Prozessoren gibt und die kann man durch eine Interrupt Service Routine einstellen und programmieren. 

Über Antworten würde ich mich sehr freuen. 


MFG Dennis


----------



## trinitaucher (25 Oktober 2008)

Wieso benötigst du einen Interrupt? Ein SPS-Programm wird ja eh zyklisch abgearbeitet ("von oben nach unten", jeden Zyklus von neuem).
Für deine E-Mail-Aufgabe würde ich einfach einen Abschnitt im Programm reservieren, in ST z.B.:

```
IF bVariable THEN
  (* -hier E-Mail Versand einfügen- *)
END_IF
```
und fertig is der Lack.

Wenn das restliche Programm während dieser Interrup-Bedingung absolut nicht weiter ausgeführt werden darf, kann man es z.B. so verriegeln:

```
IF NOT bVariable THEN
  (* - Hauptprogram *)
ELSE
  (* -hier E-Mail Versand einfügen- *)
END_IF
```
(Aber solche Verriegelungen bergen evtl. auch Gefahren!)


----------



## dennish23 (25 Oktober 2008)

Hallo Trinitaucher

Du verstehst jetzt nicht was ich meine. Jetzt stell dir mal vor du hast ein Programm in ST mit über 500 Zeilen Code. Deine IF Anweisung für das Abschalten einer Maschine steht jetzt in Zeile 125. Dein Programmablauf ist gerade drüberweggelaufen über diese Zeile 125 und jetzt drückt jemand den Schalter abschalten. Was würde passieren. Nichts weil er an der Stelle vorbei ist. erst wenn er wieder bei Zeile 125 angekommen ist wird er die IF Anweisung ausführen. Und so kann es zum Beispiel sein das lebensbedrohende Sachen zu spät ausgelöst werden. Darum meine Frage nach einem Interrupt bei der SPS. Diese gibt es zum Beispiel bei jedem Prozessor den du im Laden kaufen kannst. Zum Beispiel auch in deinem Computerprozessor.

MFG Dennis


----------



## zotos (25 Oktober 2008)

Als Interrupt ansatz kann man die Taskkonfiguration verwenden: 

Ressourcen->Taskkonfiguration (rechte Maustaste: Objekt bearbeiten)

Taskkonfiguration (rechte Maustaste: Task anhängen)

Namen vergeben
Typ auf Ereignisgesteuert ändern
Ereignis eintragen (Bool variable) 
Priorität vergeben (sollte dann höher sein als der zu unterbrechende Task)

---
Dies unterbricht aber noch nicht sicher den Ablauf Deines "Hauptprogramms". Was ich allerdings bei einer SPS eh als kritisch betrachte.


----------



## MSB (25 Oktober 2008)

@dennish
Sicherlich hast du recht, sicher ist aber auch, wenn deine Zykluszeit deutlich unter 100ms ist,
spielt das für derartige Funktionen (Stop Taster, E-Mail versenden) imho keine Rolle.

Bei Codesys generell gibt es ereignisgesteuerte Tasks,
mit denen sollte sich sowas realisieren lassen.

Mfg
Manuel


----------



## Larry Laffer (25 Oktober 2008)

dennish23 schrieb:


> ... Und so kann es zum Beispiel sein das lebensbedrohende Sachen zu spät ausgelöst werden. Darum meine Frage nach einem Interrupt bei der SPS.


 
Für lebensbedrohende Sachen ist dein Programm vielleicht auch nicht der zuständige Ansprechpartner ...
Ansonsten siehe MSB ... wie lang ist denn ein Zyklus bei deinem Programm, dass du da Probleme erwartest ...

Gruß
LL


----------



## Ralle (25 Oktober 2008)

dennish23 schrieb:


> Hallo Trinitaucher
> 
> Du verstehst jetzt nicht was ich meine. Jetzt stell dir mal vor du hast ein Programm in ST mit über 500 Zeilen Code. Deine IF Anweisung für das Abschalten einer Maschine steht jetzt in Zeile 125. Dein Programmablauf ist gerade drüberweggelaufen über diese Zeile 125 und jetzt drückt jemand den Schalter abschalten. Was würde passieren. Nichts weil er an der Stelle vorbei ist. erst wenn er wieder bei Zeile 125 angekommen ist wird er die IF Anweisung ausführen. Und so kann es zum Beispiel sein das lebensbedrohende Sachen zu spät ausgelöst werden. Darum meine Frage nach einem Interrupt bei der SPS. Diese gibt es zum Beispiel bei jedem Prozessor den du im Laden kaufen kannst. Zum Beispiel auch in deinem Computerprozessor.
> 
> MFG Dennis



Dazu muß ich aber sagen, daß du offensichtlich noch nicht so ganz verstanden hast, was eine SPS darstellt und wie sie genau arbeitet. Denn eines ist eine SPS nicht, ein Home-PC, auch wenn eine Beckhoff durchaus in einem drinstecken kann. Zusätzlich  kommt noch dazu, daß für lebensbedrohliche/lebensgefährlich Dinge ohnehin  spezielle zusätzliche Maßnahmen nötig sind, also Sicherheitsabschaltungen, PNOZ, Sicherheits-SPS etc. Bei den erreichbaren Zykluszeiten einer SPS, ich sag mal im schlechtesten Falle 100ms, wird also jede Zeile im SPS-Programm alle 100ms abgearbeitet. Das reicht für 98% der Anwendungen aus. Für den Rest benötigt man dann andere oder zusätzliche Hardware. Klar, ein schnell fahrender Servo, rasiert alles ab, was im Wege steht, aber dafür hat der Servo dann i.d.R. extra Sicherheitseingänge, um ihn zum stehen zu bringen und natürlich auch Endlagenüberwachung etc. Für die S7 gibt es noch spezielle E-Baugruppen die Interruptfähig sind. Damit kann man dann auch noch schneller reagieren. Aber zum Faxversand ???


----------



## dennish23 (25 Oktober 2008)

Danke erstmal für die Tatkräftige unterstützung bei meinem Problem.

Nun ist die Frage bei der Ereignisgesteuerten Variante, ob dort die Werte nur als BOOL Variable eingetragen werden können oder auch wenn ich ein bestimmtes BYTE oder INT habe.

Eine IF schleife kann ich ja einfach schreiben das ist nicht das problem nur ob das Ereignisgesteuerte auch für einen bestimmten Wert einer Variablen zutrifft zum Bespiel wenn ich den Wert 21 in einer Variable stehen habe soll dann ein Ereignis gesteuert werden. Auch habe ich eben mal festgestellt das die Variablen global sein müssen für eine Ereignisgesteuertes Ereignis.

MFG Dennis


----------



## zotos (25 Oktober 2008)

dennish23 schrieb:


> Danke erstmal für die Tatkräftige unterstützung bei meinem Problem.
> 
> Nun ist die Frage bei der Ereignisgesteuerten Variante, ob dort die Werte nur als BOOL Variable eingetragen werden können oder auch wenn ich ein bestimmtes BYTE oder INT habe.
> 
> ...



IF ist KEINE Schleife sondern eine Verzweigung.


```
IF myWert >= 21 THEN
  SchickeEmail();
  myWert := 0;
ELSE
  (* Haupprogramm *)
  ;
END_IF;
```


----------



## dennish23 (25 Oktober 2008)

Jetzt jeder nachdem anderen

@Ralle

Mein Panel ist eine Master SPS wo viele andere SPS-Anlage über TCP angeschlossen sind. Diese Varibalen von den SPS-Anlagen werden alle übermittelt zur Master SPS. Also als sogenanntes SCADA-System. Nun hat das Panel auch Aufgaben. Es ist zum Beispiel für die Uhrzeit verantwortlich das alle im System sich befindenen SPS-Anlage die gleiche zeit haben. Das heißt ich kann die Uhrzeit im Panel stellen mit der Hilfe der SysLibRtc. Dies braucht auch eine gewisse Zeit die ich ja in der Taskkonfiguration einstellen kann. Auch hat das Panel die Aufgabe eine Fehlerdatei zu erstellen und zu beschreiben. Auch dieses braucht seine Zeit. Nun ist das Panel mit einem der beiden Sachen beschäftigt und es kommt ein Fehler als Signal von einer SPS-Anlage. Nun ist eine SPS ja nicht Multitasting fähig wie manch Lebewesen. Zwinker. Das heißt es führt seine derzeitige Arbeit aus und macht dann weiter. Nun ist es mir aber Wichtig das die SPS sofort den Fehler abarbeitet und dann sich wieder ihrer Fehlerdatei zuwendet. Das ist ja das Problem warum es mir geht. Das Panel ist als Hauptinstrument in meiner Anlage für viel Dinge zuständig. Aber halt sind diese Dinge in Unterschiedlichen Prioritäten anzuarbeiten. Mit Hilfe der Taskkonfig kann ich allerdings ja nicht erreichen (zumindest ist es mir noch nicht bewußt) das wenn meine Variable 21 ist dann genau das der Befehl wäre für eine Handlung (z.Bsp. Email senden)


@Zotos

Das ist mir ja klar das ich das so machen kann mit der IF-Schleife nur wenn die IF Schleife erst in zeile 500 steht braucht das Programm eine Weile bis es dort ankommt. Und darum könnte es dafür mittlerweile wieder zu spät sein das das Signal dann wenn das Programm in der Zeile 500 ankommt nicht mehr da ist, aber zwischendurch da war und die SPS das nicht mitbekommen hat. Ist also eine Fehlerquelle meiner Meinung.


@ Larry Laffer

Was ist ein MSB. Hab es hier in der Suche eingegeben aber kein Erfolg außer mein Beitrag.


MFG "allen" Dennis


----------



## Larry Laffer (25 Oktober 2008)

Hallo Dennis,
ein *MSB *ist ein Forums-Mitglied, wie z.B. du auch. Ich habe mich auf den Beitrag bezogen, den er vor mir verfasst hatte.

Wegen der Ein- und Ausgänge musst du dir nicht so große Sorgen machen. Ich denke, dass die auch bei dem von dir eingesetzten System einmal im Zyklus aktualisiert werden und dann wird im Zyklus die ganze Zeit mit den Zuständen gearbeitet. Bei Siemens heißt das Prozessabbild und dieses wird einmal vor dem Start des Anwender-Programms geladen bzw. am Ende geschrieben.

Gruß
LL


----------



## Ralle (25 Oktober 2008)

Larry Laffer schrieb:


> Hallo Dennis,
> ein *MSB *ist ein Forums-Mitglied, wie z.B. du auch. Ich habe mich auf den Beitrag bezogen, den er vor mir verfasst hatte.
> 
> Wegen der Ein- und Ausgänge musst du dir nicht so große Sorgen machen. Ich denke, dass die auch bei dem von dir eingesetzten System einmal im Zyklus aktualisiert werden und dann wird im Zyklus die ganze Zeit mit den Zuständen gearbeitet. Bei Siemens heißt das Prozessabbild und dieses wird einmal vor dem Start des Anwender-Programms geladen bzw. am Ende geschrieben.
> ...



Das ist bei der Beckhoff genauso. Was allerdings mir Variablen passiert, die z.Bsp. per ADS kommen, weiß ich nicht so genau.


----------



## zotos (25 Oktober 2008)

dennish23 schrieb:


> ...
> Nun ist eine SPS ja nicht Multitasting fähig...


Doch die von Dir verwendete ist es. Was denkst Du für was die eine Taskkonfiguration besitzt?



dennish23 schrieb:


> ...
> mit der IF-Schleife
> ...


Wenn ich noch einmal IF-Schleife von Dir lese landest Du auf meiner Ignorliste!

----

Lies Dir noch mal den Beitrag von MSB und auch meinen obigen Beitrag noch mal durch. Dann Such mal in der Hilfe nach Taskkonfiguration und lese Dir das durch.


----------



## dennish23 (25 Oktober 2008)

Sorry. In meinem Microprozessor Unterricht redet der Dozent immer bei IF von einer Schl...... Darum sag ich das hier auch weil ich immer gedacht habe da gibt es keinen Unterschied. IF ist bei mir bis jetzt immer IF.

Wie genau habe ich in der Ereignisgesteuerten Eingabe die Möglichkeit auch BYTE und INT Variable zu nehmen? Hab mir das mal angeschaut und kann bis jetzt nur eine Variable eintragen. Allerdings nicht wie ich ereignisgesteuert schreiben kann wenn das Byte 15 enthält soll der Task asugeführt werden.

MFG Dennis


----------



## zotos (25 Oktober 2008)

Möglichkeiten gibt es viele.

Du könntest auch einen Zeit gesteuerten Task nehmen (anstell des Ereignisgesteuerten) der alle 5ms den Wert (mittel IF Verzweigung) überprüft.


----------



## dennish23 (25 Oktober 2008)

Und wie muss ich das ganze dann schreiben? Hast du da ein Beispiel?

MFG Dennis


----------



## zotos (25 Oktober 2008)

Konfiguriere erst mal die Tasks (Siehe Bild im Anhang) einen der das PLC_PRG aufruft und einen der Dein hochwichtiges Programm aufruft.


Dann musst Du nur noch in das Programm Deine Verzweigung einfügen.

Zur Abwechslung ein Beispiel mit CASE:


```
CASE myWert OF

21: ; (*Schick die Mail oder mach was Du willst*)
        myWert := 0;

ELSE
    ; 
END_CASE
```


----------



## dennish23 (25 Oktober 2008)

Schau mal bitte in das Prog ob ich alles richtig verstanden habe?


----------



## zotos (25 Oktober 2008)

Du rufst ja mit zwei verschiedenen Tasks jeweils das Programm PLC_PRG auf. 

Dann sollten die Priritäten angepasst werden der "Interrupt" Task sollte ja die höchste Prio bekommen.

Zu Deinen Fragen im Programm ;o) 
Die CASE Verzweigung ist recht gut in der Hilfe erklärt und ja an der Stelle solltest Du dann alles reinschreiben was Du gerne bei dem "Interrupt" machen möchtest.

Was soll der Interrupt Aufruf im PLC_PRG? Das soll doch der extra Task machen.


----------



## trinitaucher (26 Oktober 2008)

dennish23 schrieb:


> Das ist mir ja klar das ich das so machen kann mit der IF-Schleife nur wenn die IF Schleife erst in zeile 500 steht braucht das Programm eine Weile bis es dort ankommt. Und darum könnte es dafür mittlerweile wieder zu spät sein das das Signal dann wenn das Programm in der Zeile 500 ankommt nicht mehr da ist, aber zwischendurch da war und die SPS das nicht mitbekommen hat. Ist also eine Fehlerquelle meiner Meinung.


Schau mal: Jede "moderne" und halbwegs schnelle SPS benötigt für die Programmabarbeitung weniger als 20 ms. Wenn's länger dauert, sollte man über ne stärkere CPU nachdenken, allein schon aus Gründen der Prozessgüte (finde ich).
Das Drücken eines Tasters dauert bis zur Erkennung i.d.R. auch diese Zeit.
Also im Normalfall sollte in jedem Zyklus das "wichtige" Signal erkannt werden.
Wenn ein Eingangssignal wirklich mal so schnell sein sollte, dass es weniger als die Zykluszeit anstehen kann (und daher die Gefahr besteht, das Signal "zu verpassen"), dann spendieren wir dem Programm eine schnelle Task. Bei unseren IPC-Steuerungen (Beckhoff TwinCAT) lassen wir die immer mit 250..500µs laufen. Die erfasst bloß den Eingang und setzt einen Merker, der im Hauptprogramm ausgewertet wird.

Interrupts, also Aktionen, die ein Programm richtig unterbrechen, halt ich bei SPSen für nicht sinnvoll. Die Vorhersagbareit der restlichen Aktionen wird sonst zu nichte gemacht (meine Meinung).


----------

