Problem mit S7-200 (Display/schnelle Zähler)

pinolino

Level-1
Beiträge
261
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ihr,

ich habe folgendes Problem:

Bei einer S7-200 ist ein schneller Zähler generiert, der Impulse eines Drehgebers zählt. Der Drehgeber ist an einem Motor montiert. An einem Panel (OP73micro) soll der Wert eingegeben werden, wie lange sich der Motor dreht (also die Schrittanzahl).

Dieser Wert wird in eine Variable (VD100) geschrieben und im schnellen Zähler ausgewertet. Bei erreichter Schrittanzahl wird ein Interrupt ausgelöst.

Soweit so gut - im Grunde funktioniert das Ganze auch.

ABER:

Sporadisch schaltet der Motor nicht ab. Offensichtlich gibt es ab und zu ein Zeitproblem zwischen dem schnellen Zähler und der Abfrage von VD100 aus dem Panel. Schreibe ich den Wert fest (also ohne Variable) in den Zähler, so schaltet der Motor immer zuverlässig ab.

Frage:

Gibt es eine Möglichkeit die Werte aus dem Panel (Variable) anders in den Zähler zu schreiben - so dass diese z.B. in der SPS zur Verfügung stehen und das zeitliche Problem nicht mehr auftritt?

Vielen Dank für einen Tipp!

Grüße
pinolino
 
Einstellen von aktuellen und voreingestellten Werten

Zurück zum Anfang

Jeder schnelle Zähler verfügt über einen aktuellen Wert und einen voreingestellten Wert mit jeweils 32 Bit. Beide sind ganzzahlige Werte mit Vorzeichen. Um einen neuen aktuellen Wert oder einen voreingestellten Wert in den schnellen Zähler zu laden, müssen Sie das Steuerbyte und die Bytes des Sondermerkers einrichten, die die aktuellen Werte und/oder die voreingestellten Werte enthalten. Führen Sie dann die Operation HSC aus, um die neuen Werte in den schnellen Zähler zu übertragen. Die folgende Tabelle beschreibt die Bytes der Sondermerker, die die neuen aktuellen und voreingestellten Werte enthalten.

Zusätzlich zu den Steuerbytes und den Bytes, die die neuen aktuellen und voreingestellten Werte enthalten, kann der aktuelle Wert eines schnellen Zählers auch gelesen werden, indem der Speicherbereich HC (aktueller Wert des schnellen Zählers) und die Nummer des Zählers (0, 1, 2, 3, 4 oder 5) angegeben werden. Auf diese Weise können Sie den aktuellen Wert direkt lesen. Zum Schreiben müssen Sie jedoch die oben beschriebene Operation HSC verwenden.


Zu ladender Wert HSC0 HSC1 HSC2 HSC3 HSC4 HSC5
Neuer aktueller Wert SMD38 SMD48 SMD58 SMD138 SMD148 SMD158
Neuer voreingestellter Wert SMD42 SMD52 SMD62 SMD142 SMD152 SMD162


Statusbyte

Zurück zum Anfang

Jeder schnelle Zähler besitzt ein Statusbyte, das Statusmerker zur Verfügung stellt. Diese Statusbits geben die aktuelle Zählrichtung an. Sie geben außerdem an, ob der aktuelle Wert gleich dem voreingestellten Wert oder größer als dieser ist. Die folgende Tabelle beschreibt die Statusbits für die schnellen Zähler.


Statusbits für HSC0, HSC1, HSC2, HSC3, HSC4 und HSC5
HSC0 HSC1 HSC2 HSC3 HSC4 HSC5 Beschreibung
SM36.0 SM46.0 SM56.0 SM136.0 SM146.0 SM156.0 Nicht verwendet.
SM36.1 SM46.1 SM56.1 SM136.1 SM146.1 SM156.1 Nicht verwendet.
SM36.2 SM46.2 SM56.2 SM136.2 SM146.2 SM156.2 Nicht verwendet.
SM36.3 SM46.3 SM56.3 SM136.3 SM146.3 SM156.3 Nicht verwendet.
SM36.4 SM46.4 SM56.4 SM136.4 SM146.4 SM156.4 Nicht verwendet.
SM36.5 SM46.5 SM56.5 SM136.5 SM146.5 SM156.5 Statusbit aktuelle Zählrichtung:
0 = rückwärts;
1 = vorwärts
SM36.6 SM46.6 SM56.6 SM136.6 SM146.6 SM156.6 Statusbit aktueller Wert gleich voreingestellter Wert:
0 - ungleich, 1 - gleich.
SM36.7 SM46.7 SM56.7 SM136.7 SM146.7 SM156.7 Statusbit aktueller Wert ist größer als voreingestellter Wert:
0 = kleiner als oder gleich;
1 = größer als
Hinweis:
Die Statusbits sind nur während der Bearbeitung des Interruptprogramms für den schnellen Zähler gültig. Wenn Sie die Zustände der schnellen Zähler überwachen, können Sie Interrupts für Ereignisse freigeben, die sich auf die bearbeitete Operation auswirken.



______________
 
Hallo verpolt,

weiß leider noch immer nicht worauf du hinaus willst...

Das mit den Steuerbytes habe ich doch eingerichtet - d.h. ich verlgeiche aktuellen Wert und voreingestellten Wert.

Das Problem ist jedoch, dass es wohl sporadisch zu einem zeitl. Problem kommt, wenn die Variable aus dem Display (voreingestellter Wert) im schnellen Zähler abgefragt wird.

Könnte mein Anhang Abhilfe schaffen - denn die Variable VD104 wäre dann doch fest in der SPS (und nicht im Panel) verfügbar, oder?

Danke!
 

Anhänge

  • Variable.jpg
    Variable.jpg
    6,3 KB · Aufrufe: 18
Zuviel Werbung?
-> Hier kostenlos registrieren
Zu ladender Wert HSC0 HSC1 HSC2 HSC3 HSC4 HSC5
Neuer aktueller Wert SMD38 SMD48 SMD58 SMD138 SMD148 SMD158
Neuer voreingestellter Wert SMD42 SMD52 SMD62 SMD142 SMD152 SMD162

Welchen HSC verwendest du?

Bspl.: HSC 3

Aktueller Wert = SMD138
voreingestelleter Wert = SMD62

eErgenis: SM136.6

Dann müßte VD100--->in den SMD62
 
Und ich würde auch nicht in jedem Zyklus (SM0.0) den voreingestellten Wert neu schreiben, sondern nur wenn der Wert sich ändert.
Dafür kannst Du entweder den bisherigen Wert und den neuen vergleichen oder vom Display ein Statusbit beim Verändern des Wertes setzen lassen, das nach der Übertragung in des HSC vom Programm zurück gesetzt wird.
 
Welchen HSC verwendest du?

Bspl.: HSC 3

Aktueller Wert = SMD138
voreingestelleter Wert = SMD62

eErgenis: SM136.6

Dann müßte VD100--->in den SMD62

Aber das ist ja NICHT das Problem! Evtl. habe ich mich noch immer nicht deutlich genug ausgedrückt... das habe ich alles schon am Laufen.

Die Benutzung einer Variablen (hier VD100) aus dem Panel stellt offensichtlich (sporadisch) ein zeitliches Problem dar, wenn ihr Wert im schnellen Zähler als voreingestellter Wert übernommen wird.

Insofern war meine Idee, bei einer Eingabeänderung (im Display) dieser Variablen ihren Wert in eine Variable in der SPS zu verschieben und dann diese neue "SPS-Variable" im schnellen Zähler zu verarbeiten... dann müssten doch zeitliche Probleme minimiert werden, oder?

@hucki:
Ja stimmt, du hast recht! Besser nicht in jedem Zyklus...

Ähm, ich weiß jetzt nur nicht, wie ich vom Display so ein Statusbit setzen lassen kann?

Geht das evtl. so:

Variable anklicken und dann Ereignisse > Aktivieren und dann SetzeBit???

Grüße
pinolino
 
Zuletzt bearbeitet:
...
Ähm, ich weiß jetzt nur nicht, wie ich vom Display so ein Statusbit setzen lassen kann?

Geht das evtl. so:

Variable anklicken und dann Ereignisse > Aktivieren und dann SetzeBit???
...
Ich geh' mal davon aus, das Du WinCC flexible benutzt:
- Kommunikation -> Variablen
- in der Liste der Variablen diejenige anwählen, deren Wertänderung Du registrieren willst
- dann in den Eigenschaften Ereignisse -> Wertänderung -> SetzeBit
 
VD100 ist auch in der SPS.

Hallo verpolt,

weiß leider noch immer nicht worauf du hinaus willst...

Das mit den Steuerbytes habe ich doch eingerichtet - d.h. ich verlgeiche aktuellen Wert und voreingestellten Wert.

Das Problem ist jedoch, dass es wohl sporadisch zu einem zeitl. Problem kommt, wenn die Variable aus dem Display (voreingestellter Wert) im schnellen Zähler abgefragt wird.

Könnte mein Anhang Abhilfe schaffen - denn die Variable VD104 wäre dann doch fest in der SPS (und nicht im Panel) verfügbar, oder?

Danke!

Hallo pinolino,

VD 100 ist genauso in der SPS wie VD 104.
Daher wird die das sicherlich nichts bringen.

Ich habe noch nicht mit schnellen Zählern gearbeitet, aber was Verpolt geschrieben hat, sieht echt verdächtig nach der Lösung für dein Problem aus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo pinolino,

VD 100 ist genauso in der SPS wie VD 104.
Daher wird die das sicherlich nichts bringen.

Ich habe noch nicht mit schnellen Zählern gearbeitet, aber was Verpolt geschrieben hat, sieht echt verdächtig nach der Lösung für dein Problem aus.
Das glaub' ich nicht, da der Zähler ja an und für sich schon (seit Threaderöffnung) funktioniert und nur sporadisch aussetzt.
Würde er den voreingestellten Wert an die falsche Stelle übertragen, hätte es m.M.n. noch gar nicht funktioniert.
Deshalb tippe ich auch eher auf eine zeitliche Überschneidung zwischen Wertübertragung und Vergleich, vor allem, wenn der Wert in jedem Zyklus neu übertragen wird.

@pinolino
vielleicht postest Du mal die zählerbetreffenden Ausschnitte (Zählereinrichtung, Wertübertragung, Auswertung und Interrupt) Deines Programmes, dann kann man sicher genaueres sagen.
 
Hallo pinolino,

VD 100 ist genauso in der SPS wie VD 104.
Daher wird die das sicherlich nichts bringen.

Ich habe noch nicht mit schnellen Zählern gearbeitet, aber was Verpolt geschrieben hat, sieht echt verdächtig nach der Lösung für dein Problem aus.

Also, zwar ist die VD100 auch in der SPS - aber sie wird ja bei Anforderung aus dem Panel geholt und genau das ist wohl das Problem. Im Zusammenhang mit den schnellen Zählern kommt es hier offensichtlich sporadisch zu einem zeitlichen Problem, so dass dann der Interrupt nicht ausgelöst wird...

Das lässt sich dadurch bestätigen, dass das Problem nicht auftritt, wenn ich (ich verwende den Zähler HSC0) einen festen Wert in SMD42 schreibe.

Der im Anhang dargestellte Interrupt INT_1 löst dann INT_2 aus, durch den der Motor abgeschaltet wird.


@hucki:

Danke für deine Hilfestellung - ich teste das Ganze noch nach deinem Vorschlag und gebe dann Bescheid!
 

Anhänge

  • Interrupt INT_1.jpg
    Interrupt INT_1.jpg
    21,2 KB · Aufrufe: 9
Hallo pinolino,

Dein Bild oben ist hoffentlich ein Unterprogramm und wird nur einmal zum Einrichten des schnellen Zählers aufgerufen, z.B. im ersten Zyklus.
Wenn das in jedem Zyklus aufgerufen wird, ist das sicher die Ursache für Dein Problem. Dann wird der Zähler dauernd neu eingerichtet und kann in der Zeit nicht richtig zählen.

Ich hab' mir noch mal die Hilfe angesehen. Das Übertragen des aktuellen Wertes muss dann noch aktiviert werden, das hab' ich oben vergessen:
Code:
LDD<>  HSC0_VW:SMD42, VD100
MOVD   VD100, HSC0_VW:SMD42
ORB    2#100000, HSC0_Strg:SMB37
HSC    1
http://www.bilder-hochladen.net/files/dj30-19-jpg-nb.html

PS: Hoffe, so ist's jetzt richtig. Ist schon 'ne Weile her, das ich das benutzt habe.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo pinolino,

Dein Bild oben ist hoffentlich ein Unterprogramm und wird nur einmal zum Einrichten des schnellen Zählers aufgerufen, z.B. im ersten Zyklus.

Hallo hucki,

also es ist ein Interruptprogramm, das nicht im ersten Zyklus, sondern immer bei Interruptauslösung aufgerufen wird...

ABER:

Wenn die Variable nicht direkt aus dem Panel ausgelesen wird, sondern nach deinem Vorschlag auf "Umwegen", so funktioniert das Ganze.


Grüße
pinolino
 
Hallo erzteufele...

Aber es gibt ja noch mehr Interrupts als den, der im ersten Zyklus eingerichtet ist. Es gibt in dem Programm insgesamt drei Interrupts!

Grüße
pinolino
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi,

1. du hast einen überlauf des zählers. d.h., wenn du einen neuen VW Wert in den zähler rein schreibst kann sein, dass dieser schon erreicht wurde, und deswegen zählt der zähler weiter ohne weitere interruptausführungen.

2. wenn du mit panels arbeitest ist die aktualisierung deiner variablen denke ich so 100ms (min. wert). dh. wenn du einen wert im panel eintippst, dann läuft der motor in dieser zeit weiter (zähler zählt weiter) und es könnte sein, dass der zähler überläuft.

3. wenn du den vw wert änderst, dann solltest du auch den aktuellen wert ändern. das ganze kannst du auch nicht nur mit sm0.1 (Atch) sondern auch im zur beliebigen zeit machen. wenn es um interrupts geht, mach immer vor einer Operation (schnelle zähler programmieren) einen DESI und danach einen ENI. (hilft immer, hatte vorm jahr deswegen eine riesige story, schaue in meiner history nach, hehe)



ich denke punkt 2 ist dein problem. dann machs wie hucki schon vorgeführt hat, mit vergleich vw wert und vd100. auf kleiner gleich.


ps: wenn du einen offset addieren willst, würde ich es so machen:

im MAIN machst du einen vergleicher:

sm0.0 -- DESI
-- vd100 <> ld_Temp = HSC Programmieren (mit aktualisierung des AV!! das heisst, bevor du den hc wert schreibst addierst du den vd zum akt. hc wert!)
in ld_temp vd 100 schreiben
ENI


Gruß com
 
Danke für deine Tipps com,

aber seltsamerweise tritt das Problem (Interrupt löst nicht aus) auch auf, wenn kein neuer Wert am Panel eingegeben wird - wenn also die Variable VD100 nicht neu beschrieben wird.

Zuverlässig klappen tut es im Grunde nur, wenn an SMD42 ein fester Wert steht... aber das lässt sich ja mit einem Panel nicht bewerkstelligen, oder?
 
Zurück
Oben