Interruptzuweisung, schnelle Zähler bei S7-200

petzi

Level-1
Beiträge
255
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ihr,
ich habe folgendes Problem:

In einer Steuerungsaufgabe soll programmiert werden, nach wie vielen Umdrehungen (z.B. 360 = eine Umdrehung) ein Motor wieder anhält. Das wird über einen Drehimpulsgeber bewerkstelligt. So weit so gut.

Dazu habe ich folgendes Programm geschrieben:

LD SM0.0
MOVB 16#F8, SMB37
MOVD +0, SMD38 //CV laden
MOVD VD76, SMD42 //PV laden
HDEF 0, 0
ATCH INT_0, 12
ENI
HSC 0

Das heißt, wenn also CV=PV, dann wird INT_0 ausgelöst.

Wie schaffe ich es nun, dass ich dem Programm mitteile, dass der schnelle Zählereingang E0.1 (positive Flanke) zum Zählen der Impulse verwendet werden soll?

Die AWL hierzu würde ja z.B. lauten:

LD SM0.0
ATCH INT_4, 2
ENI

Aber dann hätte ich ja auch zwei Interruptanweisungen. Kann ich das irgendwie in der oben dargestellten AWL integrieren - und evtl. den gleichen Interrupt verwenden?

Vielen Dank für eure Tipps!

petzi
 
Hallo Ihr,
ich habe folgendes Problem:

In einer Steuerungsaufgabe soll programmiert werden, nach wie vielen Umdrehungen (z.B. 360 = eine Umdrehung) ein Motor wieder anhält. Das wird über einen Drehimpulsgeber bewerkstelligt. So weit so gut.

Dazu habe ich folgendes Programm geschrieben:

LD SM0.0
MOVB 16#F8, SMB37
MOVD +0, SMD38 //CV laden
MOVD VD76, SMD42 //PV laden
HDEF 0, 0
ATCH INT_0, 12
ENI
HSC 0

Das heißt, wenn also CV=PV, dann wird INT_0 ausgelöst.

Wie schaffe ich es nun, dass ich dem Programm mitteile, dass der schnelle Zählereingang E0.1 (positive Flanke) zum Zählen der Impulse verwendet werden soll?

Die AWL hierzu würde ja z.B. lauten:

LD SM0.0
ATCH INT_4, 2
ENI

Aber dann hätte ich ja auch zwei Interruptanweisungen. Kann ich das irgendwie in der oben dargestellten AWL integrieren - und evtl. den gleichen Interrupt verwenden?

Vielen Dank für eure Tipps!

petzi
Wenn du mittels HDEF dem Zähler eine bestimmte Funktion zuweist, so steht bereits fest, welche Eingänge was tun. Das Systemhandbuch enthält eine Tabelle, der du die Details entnehmen kannst. Man findet sie auch in der Hilfe zu den schnellen Zählbefehlen (eventuell Links verfolgen).
Das heißt, der obere Programmblock sollte völlig ausreichen.

Die Befehlsfolge
LD SM0.0
ATCH INT_4, 2
ENI
weist dem Interrupt 2 das Unterprogramm INT_4 zu.
ENI schaltet Interrupts allgemein frei.
Ohne die Dokumentation weiß ich nicht, wer oder was Interrupt 2 generiert.
Du brauchst aber keine zwei Interrupts. Die Zählfunktion selbst ist in Hardware realisiert und läuft autonom ab. Sie benötigt KEINEN Interrupt durch den Zähleingang.
Mit einem Interrupteingang könntest du die Funktion eines (mittelschnellen?) Zählers in Software realisieren, falls du das aus irgendwelchen Gründen vorziehst. Dann brauchst du aber HDEF usw. nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke schon mal für deine Antwort Zottel!

Aber eines ist mir nicht ganz klar.

Lt. Beschreibung im Handbuch steht das EVENT 2 für eine steigende Flanke am schnellen Zählereingang E0.1 - das ist aber doch in dem oberen Programmblock niergends definiert!

Woher soll nun die Steuerung wissen, welchen Eingang sie als schnellen Zähler verwenden soll?

Oder in welcher Funktion (im oberen Programmblock) steckt denn der Hinweis darauf, dass der schnelle Zähler E0.1 (positive Flanke) verwendet werden soll?

Die Befehlsfolge
LD SM0.0
ATCH INT_4, 2
ENI
weist dem Interrupt 2 das Unterprogramm INT_4 zu.

Ja, und der Interrupt 2 definiert hier doch eine steigende Flanke an E0.1

Siehe Hilfebeschreibung:

NETWORK 1 // Hauptprogramm
// Im ersten Zyklus, Interruptprogramm INT_0 als
// Interrupt Fallende Flanke an E0.0 definieren und alle
// Interrupts freigeben
LD SM0.1
ATCH INT_0 1
ENI


petzi
 
Zuletzt bearbeitet:
Hallo Petzi,
es ist schon so wie Zottel geschrieben hat.

Die HDEF-Anweisung in deinem Programmblock

LD SM0.0
MOVB 16#F8, SMB37
MOVD +0, SMD38 //CV laden
MOVD VD76, SMD42 //PV laden
HDEF 0, 0
ATCH INT_0, 12
ENI
HSC 0

sagt ja aus, dass der schnelle Zähler HSC0 in dem Modus 0 betrieben wird. Das bedeutet, dass es sich um einen Einphasen-Vorwärts-/Rückwärtszähler mit interner Zählrichtung handelt.

Dabei stellt der Eingang E0.0 den Taktgeber dar - das ist also der Eingang, an den der Drehimpulsgeber angeschlossen werden muss.


Frage an die Allgemeinheit:

Wie könnte ich denn nun bestimmen, dass der Eingang E0.0 nur auf eine fallende Flanke reagiert?

Grüße

pinolino
 
Frage an die Allgemeinheit:

Wie könnte ich denn nun bestimmen, dass der Eingang E0.0 nur auf eine fallende Flanke reagiert?
Als Zähler: Dazu müßte es einen anderen Modus des Zählers geben, der das beinhaltet. Ob es den gibt, weiß ich jetzt nicht.

Als Interrupteingang: Dazu müßte es unterschiedliche Interrupt-Modi geben, so daß der Interrupt bei steigender/fallender und vielleicht beiden Flanken ausgelöst wird.

Wenn es nichts vordefiniertes gibt, einen Inverter vorschalten, läßt sich z.B. mit einer Optokoppler-Klemme machen.

Der Betrieb als Interrupteingang hat nichts mit der Zählfunktion zu tun.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Als Interrupteingang: Dazu müßte es unterschiedliche Interrupt-Modi geben, so daß der Interrupt bei steigender/fallender und vielleicht beiden Flanken ausgelöst wird.

Lt. Systemhandbuch gibt es für die einzelnen Eingänge Interruptereignisse.

Beispiel:

EVENT 0 = steigende Flanke an E0.0

Aber wie kann ich das in den oben genannten Programmblock integrieren - oder müssen hier wie folgt zwei Interruptereignisse programmiert werden?

1. Ereignis für steigende Flanke (E0.0):


LD SM0.0
ATCH INT_1, 0
ENI


Und dann, wenn das Interruptereignis INT_1 ausgelöst wird - also wenn an E0.0 eine steigende Flanke erkannt wird, den bekannten Programmblock im Interrupt 1 programmieren:

Interrupt 1:

LD SM0.0
MOVB 16#F8, SMB37
MOVD +0, SMD38 //CV laden
MOVD VD76, SMD42 //PV laden
HDEF 0, 0
ATCH INT_0, 12
ENI
HSC 0

Im Interruptprogramm 0 wird dann programmiert, was beim Auslösen von Interrupt 0 passieren soll...

Kann das so programmiert werden?

Danke

pinolino
 
Zurück
Oben