Impulsfolge auswerten

SPS Andi

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ich bin relativ neu auf dem gebiet der SPS Programmierung und habe folgendes Problem:

An dem Eingang E0.0 kommt das Signal einer Kette (50 Impulse por min.) dieser Eingang soll die Zeit zwischen den Signalen erfassen und durch 4 teilen und als Impuls wieder ausgeben.

Beispiel: Wenn der Impuls der durch die Kette gegeben ist z.B. 100ms beträgt soll am Ausgang alle 25 ms ein kurzer Impuls erscheinen.

Gibt es in Step7 einen Impulsvergleicher oder ähnliches der dies bewerkstäligen kann?
 
Hallo aus der ferne :)

denke einmal Lösungen gibt es viele.

Vorschlag 1:
einen Zähler mit mit 4 vorbesetzen und mit der Pulsfolge zurückzählen.
Bei Zähler 0, impuls ausgeben und Zähler wieder setzen. Somit ergibt sich ein Divisor (der sogar variabel ist).

Vorschlag 2:
mit der Pulsfolge ein Bit im Byte rotieren lassen und entsprechend Bit 3 und 7 abfragen und ein Impuls daraus erzeugen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Boxy

Bist du sicher? Wenn du mit Pulsfolge den Eingang E0.0 meinst, dann wird das so nichts.

@SPS Andy

Du kannst natürlich immer nur nachfolgend deine Imulse teilen und ausgeben, will sagen die SPS kann nicht wissen wann der nächste Impuls kommt, also ist die Zeit die von der letzten Messung.

Es gibt natürlich, wie immer, mehrere Möglichkeiten.

1. Du kannst die Zeit mit einem Timer messen, daraus einen Integerwert machen, diesen durch 4 Teilen, daraus dann einen Zeitwert machen und mit diesem Zeitwert einen Blinker 4x blinken lassen. Danach wieder "aufsynchronisieren", und mit dem neuen "letzten" Zeitwert von E0.0 das ganze Spiel von vorne.

2. Du nimmst den OB35. Dieser wird alle 10 ms aufgerufen. Darin zählst du einen Integerwert (Zählwert) hoch. Wenn der E0.0 auf 1 geht, kopierst du den Integerwert in eine andere Variable (Impulszahl) und setzt den Integerwert wieder auf Null. Die Impulsfolge teilst du durch 4. Jetzt kannst du mit diesem Teiler im OB35 deinen Impuls setzen.

Bsp. 100ms zwischen E0.0-Impulsen ergeben bei 10ms OB35 im Zählwert eine 10. Das durch 4 ergibt 2,5 (also gerundet INT 2). Das heißt, daß du jeden 2. Zählwert im OB25 einen Impuls ausgebem mußt. Das ist leider etwas ungenau, aber bei 10ms Raster geht das nicht anders.

Du machst also 2 Dinge im OB35, einmal das Zählen der Aufrufe des OB 35 zwischen 2 positiven Flanken des E0.0 und dann bei jedem X-ten dieser Aufrufe (das X ergibt sich aus der Teilung des alten Wertes durch 4), die Ausgabe eines Impulses.
 
Er meint ne Frequenzvervierfachung, was ihr beschreibt läuft auf nen Frequentteiler raus.

Kann mit nur vorstellen, dass die Zeit gemessen wird, und vorrausgesetzt die Impulse sind konstant, jeweils ein Rect -generator wird damit parametriert.
 
@kistumpe

Genau darauf läuft mein Vorschlag 2 ja hinaus, oder verstehen wir uns da falsch?
 
@kistumpe

Kein Problem, ich hab nur auch gleich nochmal nachgesehen, erzähl ja nicht so gerne Mist ;), wer schon, gelle.

@SPS-Andy

Wenn im OB35 nicht allzuviel Code steht, kann man den vielleicht sogar mit 5 ms laufen lassen, dann wären die Intervalle genauer, das kann man dann später mal pobieren.
 
erst einmal vielen dank an alle für die schnellen Antworten.

@Ralle

dein erster Vorschlag überfordert mich sicherlich schon genug, deshalb denke ich ist dieser ersteinmal die bessere Wahl. Kannst du mir bitte dazu noch weitere Tips geben. Ich habe schon verstanden wie du das meinst aber bei der Ausführung hapert es leider etwas. Im vorraus vielen Dank
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS Andi,
kannst du deine Anfrage noch einmal genauer spezifizieren, weil sie für mich widersprüchlich ist.
Zitat: ... dieser Eingang soll die Zeit zwischen den Signalen erfassen und durch 4 teilen und als Impuls wieder ausgeben...
In deinem Beispiel gibst du aber vor, das Signal selbst durch 4 zu teilen.
Wenn ich diese Aufgabe lösen sollte, wüsste ich nicht genau, wass gemeint ist. Vielleicht stellst du es noch einmal klar.
 
@SPS-Andi

Ich hab die mal ein Beispiel mit dem OB 35 programmiert.
Allerdings mal ebend schnell. Wenn du das so verwenden willst, solltest du im OB 100 für MW 10,12,14 Startwerte vorgeben, damit am Anfang, bevor das 1. Mal der E0.0 betätigt wird, was sinnvolles herauskommt. Den Timer T1 habe ich mal auf 200ms Impuls gestellt, für den OB35 1000ms, damit man das mit dem Simulator beobachten kann. Diese Werte müssen dann kleiner gestellt werden. Auf Symbolik habe ich verzichtet, dafür alles beschriftet.

Code:
FUNCTION FC 35 : VOID
TITLE =
VERSION : 0.1
AUTHOR : Ralle


BEGIN
NETWORK
TITLE =M0.1 für OB35

      U     E      0.0;    //Max-Amplitude    
      FP    M      0.0; //HM Flanke
      S     M      0.1; //Startmerker setzen! Wird nach Bearbeitung im OB35 zurückgesetzt!
NETWORK
TITLE =

      U     M      0.2; //Impuls ausgeben
      L     S5T#200MS;  
      SV    T      1;   //Impulszeit, sonst sieht man beim Beobachten nichts
      U     T      1; 
      =     A      0.2; //Impuls-Ausgang

      U     M      0.2; //sofort wieder zurücksetzen
      R     M      0.2; 
END_FUNCTION

ORGANIZATION_BLOCK OB 35
TITLE = "Cyclic Interrupt"
VERSION : 0.1


VAR_TEMP
  OB35_EV_CLASS : BYTE ;    //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB35_STRT_INF : BYTE ;    //16#36 (OB 35 has started)
  OB35_PRIORITY : BYTE ;    //Priority of OB Execution
  OB35_OB_NUMBR : BYTE ;    //35 (Organization block 35, OB35)
  OB35_RESERVED_1 : BYTE ;    //Reserved for system
  OB35_RESERVED_2 : BYTE ;    //Reserved for system
  OB35_PHASE_OFFSET : WORD ;    //Phase offset (msec)
  OB35_RESERVED_3 : INT ;    //Reserved for system
  OB35_EXC_FREQ : INT ;    //Frequency of execution (msec)
  OB35_DATE_TIME : DATE_AND_TIME ;    //Date and time OB35 started
END_VAR
BEGIN
NETWORK
TITLE =

      U     M      0.1; //Startmerker Amplitide ist max
      SPB   NULL; //zum Null setzen von MW10 springen

      L     MW    10; //MW10 um 1 hochzählen
      L     1; 
      +I    ; 
      T     MW    10; 
      SPA   AMPT; //zum Test, ob ein Impuls ausgegeben werden soll

NULL: NOP   0; 
      L     MW    10; //Impulszähler
      T     MW    12; //Impulse merken

      L     MW    12; 
      L     4; //Teiler 4
      /I    ; 
      T     MW    14; //alle X (Mw14) Zähler (OB35-Aufrufe) einen Impuls ausgeben

      L     0; 
      T     MW    10; //Impulszähler zurücksetzen

      SET   ; 
      R     M      0.1; //zurücksetzen des Startmerkers, da Aktion ausgeführt

AMPT: NOP   0; 

//mit dem Teiler nachsehen, ob Ausgagsimpuls gebracht werden soll
      L     MW    10; //Ist-Zählwert
      ITD   ; 
      L     MW    14; //geteilter Wert
      ITD   ; 
      MOD   ; //Divisionsrest Ganzzahlen (32 Bit)
      L     0; //ist Null, also kein Rest, also ganzer Teiler, also Impuls ausgeben
      ==D   ; 
      SPBN  END2; //wenn nicht, kein Impuls

      S     M      0.2; //Impuls ausgeben

END2: NOP   0; 
END_ORGANIZATION_BLOCK
 
Zuletzt bearbeitet:
Zurück
Oben