# Hilfe-CPU314 Inkrementalgeber Zustandsabfrage



## Jeluca (25 November 2006)

Hallo,
ich bin neu hier und habe ein riesengroßes Problem.
Ich hoffe ich bekomme auch eine positive Antwort.
Bisher hatte ich mehr mit direkter in ASM programmierung von Atmel zu tun.

Ich habe eine CPU314 mit einem Integrierten Zähler (uvm) an dem ich A/B/N Leitung eines Inkrementalgebers angeschloßen habe.
Dieser hatt eine Auflösung von 360 Point.
Dieser wird duch die Mechanik bedingt nur in eine Richtung bewegt. (vorwährts=>aufwärts zählend).
Soweit funktioniert auch alles mit dem SFB47(Count).

Nun muß ich diverse Positionen des inkrementalgebers (zb: 0/30/180/240/359) abfragen und darauf reagieren.
Prinzipiell läft alles.
Doch nun habe ich natürlich auch eine gewisse Geschwindiglkeit in der sich alles bewegt.
Ab ca. 3 Umdrehungen /Sec verliert er mir seinen Zustand und führt die Aktionen nicht aus.
Ich hatte es schon mit aufruf des OB35(2ms) probiert. Alles über 2ms geht sowieso nicht.
Nun will ich es mittels Prozessalarm (OB40) probieren.

Doch dachte ich mir vieleicht liegt es an meiner Programmierstrategie.
Prinzipiell bin ich einen Ablauf      ==> Start ===> Programm mit Ereignissen.
gewöhnt und bin mir nicht ganz sicher ob ich das mit dem Zyklus verstanden habe.

zb. Hatt der atmega einen Integrierten HW-Zähler der unabhängig von der Software läuft(wenn man will).
Ist dies bei der SPS auch so?
Wie kann ich diese Zeitkritischen Zustände am besten programmieren??


Ich hoffe inständig das mir jemand helfen kann.

Nils


----------



## godi (25 November 2006)

Hallo!

Ist deine CPU eine 314C?

Hast du dir schon die Beschreibung 31xC Technologische Funktionen durchgelesen?
http://support.automation.siemens.c...nprim=3&lang=de&content=skm/search.asp?&Query
Suche nach: S7300C_tf_d

Lese dir mal den Punkt 5.5 durch. Dort ist beschrieben wie du einen Auftrag für nen Vergleicher machst. Und unter Punkt 5.5.9 ist das Verhalten des Ausganges des Counters beschrieben.

Der SFB47 ist Zyklusunabhängig sprich der Ausgang des Zählers wird bei Vergleichsergebniss sofort gesetzt.

Aja wenn du mit deiner Bewegung bei deinen Positionen zum Stillstand kommen willst dann kannst du mit der 314C auch Positionieren. (siehe Punkt 3&4)

godi


----------



## Jeluca (25 November 2006)

Vielen Dank fü die schnelle Antwort,

dieses Kapitel habe ich heute auch gelesen und mir gedacht das dies eine Art Interrupt ist.
Erstmal hilft es mir gedanklich sehr weiter das ich jetzt weiß, das der Zähler unabhängig vom Zyklus zählt.

Jedoch, bei einem Atmega kann ich mir ohne Probleme die maximale Auflösung und die noch vorhandenen Perioden(Takte==>max Anzahl Befehle)
berechnen. Bsp.: bei Prozessor 16MHz habe ich pro Takt des Prozessors eine Zeit von 62,5ns. Wenn sich nun mein Inkremntalgeber 5Mal pro sec dreht habe ich 1800 Impulse (360*5) dies wiederum ergibt eine Periodendauer von 0,55msec/Impuls. Daraus ergibt sich (1/16000000)/(1/1800)=8889 freie Takte pro Impuls.
Damit wiederum kann ich mir meinen Befehlssatz(die Menge derer) berechnen um keinen Impuls zu verlieren.

Wie verhält sich diese bei einer SPS von Siemens (CPU314C-PtP).

Also wieviel Zeit verstreicht für einen zb.:Call /CC/L/T.........Befehl im OB,FB oder FC?

Danke nochmal für die Gute Seitenangaben.

Nils


----------



## godi (25 November 2006)

Jeluca schrieb:


> Also wieviel Zeit verstreicht für einen zb.:Call /CC/L/T.........Befehl im OB,FB oder FC?
> 
> Nils


 
Die Zeit richtet sich nach dem wie lange die SPS braucht um das Programm im OB1 abzuarbeiten. (wenn dein SFB im OB1, oder einen Baustein der in OB 1 aufgerufen wird, aufgerufen wird)
die Zeit kannst du im OB1 mit den Lokalvariablen auslesen.

Wenn du jetzt den SFB im OB35 aufrufst dann wird er nach der Zeit die du eingestellt hast aufgerufen. Aber die Zeit muss immer so lange eingestellt sein das die SPS das ganze Programm im OB35 abarbeiten kann.

Noch mal zum SFB 47: Der arbeitet Zyklisch unabhängig. Bei einer 314C verlierst du keine Impulse wenn deine Frequenz vom Drehgeber nicht 60kHZ überschreitet. Die minimale Pause zwischen den impulsen muss 8µs sein.
Der Vergleicher vom SFB47 arbeitet auch Zyklusunabhängig. Sprich der Hardwareausgang wird sofort gesetzt.

godi


----------



## Jeluca (26 November 2006)

Danke vielmal,
mehr Informationen als ich Anfangs so dachte. Da ich kein großer Forum-Schreiber bin.
Das heißt aber, soweit ich SPS verstanden habe, daß  der "Interrupt" Ausgang  gesetzt wird, wie ich will, wen ich dies auch so in OB40 veranlasse.
Aber ich kann nicht acht verschiedene Ausgänge setzten da dies erst laut SPS nach dem Zyklus passiert.
Das heist wiederum selbst wenn ich mir Merker notiere und sie setzte es erst nach dem Ablauf pasiert. (der Ausgang gestzt wird)
Insofern kann ich eigentlich nur auf einen Ausgang setzten, der mir in meinem Fall nicht genug ist.
Auf diesen könnte ich mir auch Merker setzten die dann sowieso zu spät eingestzt werden.

Zitat: " Im Unterschied zu 'herkömmlichen' Computern arbeitet die SPS zyklisch: Sie liest die Werte aller Eingänge am Beginnund eines Zyklus ein, führt dann die gespeicherten Programme (auch 'Bausteine' oder 'Netzwerke' bezeichnetund) aus und setzt am Ende die Ausgänge. Dann startet der Zyklus von Frischeundm - ein Programmende gibt es nicht. Zustandsänderungen der an den Eingängen angeschlossenen Sensoren die sich währenddessen unddes Zyklusdurchlaufs ereignen, werden nicht erkannt. Abhängig von deren Werten werden die an ihren Ausgängen angeschlossenen Aktoren gemäß eingebautem Programm angesteuert. Dies geschieht einmal am Ende des Zyklus.": Zitat Ende



Wie soll ich dann auf solche Aktionen reagieren????
Kann man direkt den Prozessor programmieren?
Sorry, aber ich bin zur Zeit, nach Tagelangem Grübeln, ratlos da ich sehr auf SPS in dieser Anlage gebaut habe.
Mir scheint aber zu Unrecht und ich muß mir eine Lösung einfallen lassen.

Aber vieleicht???
Außenbeschaltung wäre auch möglich aber SPS muß sein wegen der Sicherheit!


Nils


----------



## Oberchefe (26 November 2006)

Wenn es spezieller und schneller wird brauchst Du eben spezieller Hardware, hier scheint mir ein Nockenschaltwerk in Frage zu kommen. Sowas in der Art:
http://www.digitronic.com/start.php?link=produkte/dc300.php


----------



## volker (26 November 2006)

das die cpu die eingänge am anfang liest hat schon seinen grund. 
es soll ja dem kompletten zyklus diese info zur verfügung stehen.

wenn du im zyklus den wahren zustand einlesen willst kannst du die peripherie direkt ansprechen
z.b. L PEW 0
es gibt auch eingangsbaugruppen mit alarm. bei einem flankenwechsel wird dann der alarmob angesprungen. ob deine eingänge das können findest du in der hw-config.

auch ausgänge lassen sich im zyklus direkt setzen.
z.b.
U e 0.0
= a 0.0
L AW 0
T PAW 0

in der regel ist sowas aber nicht nötig.
um was für eine anwendung handelt es sich, dass du so schnell reagieren musst?


----------



## Jeluca (26 November 2006)

Super und Danke,

Es ist ein Umbau einer Konfektionsanlage. Das heißt es war alles kaputt oder wurde durch Entwendung sehr unbrauchbar gemacht. 
Doch das Grundgerüßt ist sehr stabil. Daher kam meinem Boss die Idee diese Anlage wieder Instandzusetzten.
Da ich eine Umrüstung bei einer anderen Anlage auch schon gemacht hatte(mittels SPS-CPU312 damit auch der Elektriker Analysen machen kann), war der Gedanke da am besten dafür auch eine SPS einzusetzten.
Leider wollte mein Boss keinen Servomotor als Antrieb sondern weiterhin den guten alten 3Phasenmotor==>Schwungrad==>Mechanik (Zwecks Übersetzung).
Der Ablauf wurde früher mittels "Kurvenrad mit Schaltern" gesteuert. Da davon leider auch nichts mehr da war, kam ich auf die Idee dies mittels Inkrementalgeber(Auflösung 360) zu bewerkstelligen.
Bei der anderen Anlage lief dies ohne probleme doch weiß ich mittlerweile das diese auch nur mit max 40 Takten/min fährt(dh 0.6*drehungen pro secunde).
Die jetzige kann aber ohne Probleme bis zu 200 Takten laufen.

Nochmal kurz zur Eklährung: Ich will der Maschine mittels Zähler sagen das sie zb bei 
0 ==> Kupplung an
30 ==> Kühlluft aus
100 ==> Kupplung aus
101 ==>Bremse an
120 ==> Schweißen an
150 ==> Schweißen aus
usw
bis 359 ==> Takt vorbei

Um auf Nummer sicher zu gehen will ich 5U/sec sicher bewältigen.
Eigentlich sehr langsam aber doch habe ich Probleme damit.

Nils


----------



## godi (26 November 2006)

Du könntest das auch so lösen das du den OB35 alle 5ms aufrufst (max alle 11ms wegen Vergleicher da du für 20Impulse 11ms brauchst) und in dem OB35 dann den SFB47 aufrufst. Dann kannst du nacheinander die Vergleichswerte laden. 
Also am Anfang 0 wenn dann vom SFB47 der Ausgang STS_DO True ist dann deinen nächsten Wert (30) usw. Mit dem Impuls von STS_DO kannst du ja ein Merkerwort hochzählen lassen und dann mit einer SPL (Sprungleiste) deine Aktionen anspringen. In deiner 1Aktion setzt du dann den Ausgang x.0 (für Kupplung an) in der zweiten dann x.1(für Kühlluft aus) usw. Wenn der Vergleichswert 0 geladen wird dann setzt du dein MW für die SPL auch wieder auf 0.
Nach deiner SPL führst du den Code von Volker aus:
L AW x
T PAW x

wenn dein Programm im OB35 nicht allzu lange ist dann kannst du den auch in kürzeren Zeitabständen aufrufen. Damit werden deine Ausgänge noch schneller Aktualisiert. Aber Vorsicht: Die Zeit muss immer lange genug sein das die SPS das Programm vor dem nächsten OB35 aufruf abgearbeitet ist.

godi


----------



## Kalubrian (28 November 2006)

Die eleganteste Lösung ist ein elektronisches Nockenschaltwerk zu benutzen. Da kann man für jede Umdrehung verschiedene Nocken definieren die dann einen Ausgang schalten. Die Anzahl der Nocken und wie oft eine Nocke bei jeder Umdrehung schaltet ist dabei variabel. Für die Inbetriebnahme des Nockenschaltwerks muss man ein bischen Zeit einkalkulieren, aber es lohnt sich falls man öfters solche Anwendungen hat. Die Nockenbaugruppe von Siemens heißt FM352. Kostet ca. 680 Euro! Aber das ist eine saubere Lösung mit Perspektive.


----------

