Step 7 Takte pro Minute ermitteln

EMZ

Level-2
Beiträge
232
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute,

ich würde gerne über ein digitales Signal die Takte pro Minute mit einer 300er S7 ermitteln und Auswerten. Frage ist wie ich das programmiertechnisch realisier? Ich Frage mich wie es ermöglicht wird, dass mit 2 Signalen die Taktanzahl pro Minute ermittelt werden kann.
Kann mir jemand ein Programmierbeispiel in FUP zeigen?

Wäre über jegliche Hilfe sehr dankbar


LG
EMZ
 
Lies doch die Systemzeit aus und solange Minute gleich Minute ist zählst Du und wenn sich die Minute ändert schreibst Du den Zählwert weg zur Bearbeitung, löschst den Zähler und fängst von vorne an.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da kann ich dir leider nicht ganz folgen wie das dann in FUP aussehen soll. Könntest du mir bitte mal ein Screenshot hochladen, oder mal genauer erklären wie ich das machen soll? Bauteile etc.
Ich bin ein Neuling auf dem Gebiet
 
Was machst du denn genau mit 2 Signalen?
Wenn es nicht hochgenau sein muss kannst du die positiven Flanken des schnellsten Taktmerkers(0,1s) zählen ab Signal 1 zählen und bei Signal 2 stoppen und bei >600 in einer zweiten Variable rücksetzen, archivieren u.ä
 
Hallo,

die Zeitgenartorbausteine hat die CPU schon integriert.
In der HW-Konfiguration Taktmerker ankreuzen(Häkchen) und MB vergeben.

Dann mit dem s-Takt bis 60 zählen, vergleichen, usw.
Mit F1-beim FUP-Element wird Dir die Funktion erklärt.

Jede Menge Beispiele schlummern tief im Forum.

LG, jb
 
Hi, mein Problem liegt vermutlich zuerst mal in der Hardware. Also ich will das ganze über PLCSIM simulieren. Dafür muss ich die Hardware ja laden. Ich hab aber keine Ahnung warum es nicht funktioniert.
Da kommt diese Meldung und ich weiß nicht was ich dort eingeben soll.


Hardware.jpg

Ich bräuchte dafür dringend Hilfe.

Ich würde es glaube ich so lösen.
Ich würde "Ganze Zahlen multiplizieren (16-Bit)" dann würde ich die Takte auf einen Zähler für z.B. 2 Sekunden zählen lassen. Diesen Zählwert dann mal 30 multiplizieren dann hätte ich die Takte pro Minute. Das Problem liegt aber darin, dass mein Taktmerker nicht läuft. Ich weiß nicht was ich bei dem obigen Bild ausfüllen muss, damit ich meine Hardware laden kann.

LG
EMZ
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schau mal Im SIMATIC Manager unter EXTRAS -> PG/PC-Schnittstelle einstellen welche Zugangsart ist.

habe schon länger nicht mehr simuliert, die müsste aber "PLCSIM... irgendwas" heissen. diese dann auswählen dann sollte es funktionieren.
 
Ich würde es glaube ich so lösen.
Ich würde "Ganze Zahlen multiplizieren (16-Bit)" dann würde ich die Takte auf einen Zähler für z.B. 2 Sekunden zählen lassen. Diesen Zählwert dann mal 30 multiplizieren dann hätte ich die Takte pro Minute. Das Problem liegt aber darin, dass mein Taktmerker nicht läuft. Ich weiß nicht was ich bei dem obigen Bild ausfüllen muss, damit ich meine Hardware laden kann.

LG
EMZ

Und wenn die Pulse nun nur alle drei Sekunden kommen?

Wie wäre es wenn Du einen Timer eine Minute lang laufen lässt und dann mit dem Timersignal und dem Signaleingang hochzählst?
 
Warum öffnest du nicht erst PLCSIM im Simatic Manager, dann lädst du die Systemdaten, dann das Programm
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie wäre es wenn Du einen Timer eine Minute lang laufen lässt und dann mit dem Timersignal und dem Signaleingang hochzählst?
Er will ja nicht ne ganze Minute warten bis Taktänderungen angezeigt werden:
Gibt es denn eine andere Lösung, die Taktzahl über ein digitales Signal anzeigen zu lassen, ohne immer 1 Minte zu warten?
Jetzt muss er nur 2 Sekunden warten:
Ich würde es glaube ich so lösen.
Ich würde "Ganze Zahlen multiplizieren (16-Bit)" dann würde ich die Takte auf einen Zähler für z.B. 2 Sekunden zählen lassen. Diesen Zählwert dann mal 30 multiplizieren dann hätte ich die Takte pro Minute.
wobei bei dieser Lösung die gleichen Einschränkungen wie bei der Logo gelten:
... wird mit abnehmender Erfassungszeit durch den höheren Faktor ungenauer):

... auch weil sie nur in [Anpassung] 30er [/Anpassung] Schritten zählt
 
Also ich habe es so gelöst wie oben beschrieben, aber es funktioniert nicht so ganz. Da muss ich hucki Recht geben.

Habe einen Takt genommen, der wird über einen Zähler ausgewertet und nach 4s zählt der Zähler nicht mehr. Den Zählwert multiplizier ich mit 15 und komme so auf einen Wert.
Gibt es denn keine andere möglichkeit die Taktanzeige so zu programmieren (in FUP), dass ich nach 1-2 sekunden eine Taktzahl pro Minute bekomme, ohne 1 Minute lang zu warten, bis der Zähler 1 Minute den Takt gezählt hat??

LG EMZ

Danke für eure ganzen Antworten.
 
Um welche Taktraten handelt es sich denn überhaupt?

Du hast ja bestimmt in Deinem dazugehörigen Logo-Thread gesehen, das es da min. 2 verschiedene Lösungsansätze gibt, die halt je nach Taktzahl Vor- und Nachteile haben.
Hast Du das da mal simuliert? Bei der V2 kann man ja einfach mal 'nen Impulsgeber als Eingang nehmen, um etwas Kontrolle zu haben.

Die 2. Variante müsste man bei S7 mit weniger Schwankungen hinbekommen, wenn man zum Messen des Zeitabstands zwischen 2 Signalen einen Hardwareinterrupt nimmt. Ich hab' das aber bei 'ner 300er noch nicht mal simuliert, bin da also keine große Hilfe. Aber definitiv ist der Zeitabstand zw. 2 Takten das Minimum, was zur Berechnung und Anzeige einer neuen Taktzahl benötigt wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur mal so als Ablauf für die Interrupt-Geschichte:

Interrupt bei positiver Flanke am Eingang, ich glaub' OB40:
1. gespeicherte "Systemzeit neu" zu "Systemzeit alt" kopieren.
2. aktuelle Systemzeit als "Systemzeit neu" speichern

Im Zyklus (oder gleich im Interrupt, hängt von der Taktzahl ab):
1. Zeitdifferenz "Systemzeit neu" minus "Systemzeit alt" berechnen -> Ergebnis sollte irgendwas im ms-Bereich sein
2. 60.000 (ms = 1 min) geteilt durch den berechneten ms-Zeitabstand zwischen den beiden letzten Signalen = Taktzahl/min


Das Ganze berechnet nach den letzten 2 Takten (und ohne Zyklusungenauigkeit) -> schneller geht es nicht.
:)
 
Interrupt bei positiver Flanke am Eingang, ich glaub' OB40:
1. gespeicherte "Systemzeit neu" zu "Systemzeit alt" kopieren.
2. aktuelle Systemzeit als "Systemzeit neu" speichern


Wo finde ich das ganze?? Bzw. wie mache ich das.
Und wie speicher ist die Systemzeit ab?

kannst du es mir bitte bisschen genauer erklären?


Schaut, so habe ich es gelöst. In Netzwerk zwei habe in nen Zähler und Timer nur zur Kontrolle reingebaut, ob die Taktzahl die mir im Netzwerk 3 angegeben wird richtig ist.
Bis jetzt Stimmt die Taktzahl jedesmal, egal wie schnell ich den Taktmerker laufen lass. Würde es so fachgerecht gehen wie ich es programmiert habe? Die Eingänge E124.0 und E124.1 sind nicht zu beachten, sind nur zum Rücksetzen der Bauteile gedacht mehr nicht.


Takt_min.jpg


LG
EMZ
 
Zuletzt bearbeitet:
So könnte auch gehen, Freigaben z.B Masch. läuft und Bereichsgrenzen sollten vielleicht noch rein.

Kannst ja mal ausprobieren wenn du Lust hast.


Code:
FUNCTION_BLOCK "Leistung"
TITLE =
VERSION : 0.1


VAR_INPUT
  e_Freigabe : BOOL ;	
  e_Takt : BOOL ;	
END_VAR
VAR_OUTPUT
  a_Leistung : DINT ;	
END_VAR
VAR
  s_Flk_Takt : BOOL ;	
  s_Messung_laeuft : BOOL ;	
  s_TaktZeit_Time : TIME ;	
  s_SFB04_TOF_Messzeit : "TOF";	
END_VAR
VAR_TEMP
  t_Imp_Takt : BOOL ;	
  t_HV_Reset_Messung : BOOL ;	
  t_TaktZeit_Dint : DINT ;	
END_VAR
BEGIN
NETWORK
TITLE =Takt-Impuls aus Eingangs-Takt generieren

      U     #e_Takt; 
      FP    #s_Flk_Takt; 
      =     #t_Imp_Takt; 
NETWORK
TITLE = Messung läuft

      U     #t_Imp_Takt; 
      U     #s_Messung_laeuft; 
      =     #t_HV_Reset_Messung; 
      R     #s_Messung_laeuft; 

      U     #t_Imp_Takt; 
      UN    #t_HV_Reset_Messung; 
      UN    #s_Messung_laeuft; 
      S     #s_Messung_laeuft; 

NETWORK
TITLE =Messzeit Zwischenspeichen

      L     #s_TaktZeit_Time; 
      T     #t_TaktZeit_Dint; 

NETWORK
TITLE =Messzeit 

      CALL #s_SFB04_TOF_Messzeit (
           IN                       := #t_Imp_Takt,
           PT                       := T#2M,                                     //Max. Messzeit (0.5St/min.)
           ET                       := #s_TaktZeit_Time);

NETWORK
TITLE =Messzeit Prüfen

      L     L#0;                                                   //Wenn Messzeit<=0 dann auf 1       
      L     #t_TaktZeit_Dint;                               // wegen Div/0
      >=D   ; 
      SPBN  Nb01; 
      L     L#1; 
      T     #t_TaktZeit_Dint; 
Nb01: NOP   0; 
NETWORK
TITLE =Leistung berechnen

      U     #t_Imp_Takt; 
      UN    #s_Messung_laeuft; 
      SPBN  Nc01; 
      L     #t_TaktZeit_Dint; 
      L     L#0;                                                     //Zyklus add bzw. konst. multipl.
      +D    ; 
      L     L#60000; 
      L     #t_TaktZeit_Dint; 
      /D    ; 
      T     #a_Leistung; 
Nc01: NOP   0; 
END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@andy033,
eine ähnlich Lösung hab' ich ihm im Logo-Thread vorgeschlagen. Allerdings läuft der Timer dabei halt durch die zyklische Abfrage asynchron zum Eingang, wodurch es bei hohen Taktraten zu Schwankungen in der Taktzahl kommt, auch wenn diese absolut gleichmäßig ist. (Ich hatte den Eingang einfach mal an einen Taktgeber gehangen). Ein paar Millisekunden machen halt bei der Berechnung jedesmal einen Unterschied. Ich vermute aber mal, dass die Schwankungen hier geringer sind, als bei der Logo. Hast Du das mal irgendwie getestet?

Noch 'ne Frage:
Code:
 [COLOR=#FF0000]     L     #t_TaktZeit_Dint; 
      L     L#0;                                                     //Zyklus add bzw. konst. multipl.
      +D    ;[/COLOR] 
      L     L#60000; 
      L     #t_TaktZeit_Dint; 
      /D    ; 
      T     #a_Leistung;
Wozu dient die rote markierte Addition, wenn das Ergebnis weder gespeichert wird noch in die nächste Rechnung eingeht. (Mal davon abgesehen, das sich eh nichts ändert, weil nur Null addiert wird. Aber das ist sicher auch nur ein Platzhalter für den Wert im Kommentar)





Interrupt bei positiver Flanke am Eingang, ich glaub' OB40:
1. gespeicherte "Systemzeit neu" zu "Systemzeit alt" kopieren.
2. aktuelle Systemzeit als "Systemzeit neu" speichern
Wo finde ich das ganze?? Bzw. wie mache ich das.
Und wie speicher ist die Systemzeit ab?

kannst du es mir bitte bisschen genauer erklären?

Das Programm im OB40 zur Taktberechnung würde ungefähr so aussehen:
Code:
[FONT=Courier New]      L     "SpeicherDB".Systemzeit_neu        //Systemzeit vom letzten Aufruf OB40
      T     "SpeicherDB".Systemzeit_alt        //als "Systemzeit_alt" abspeichern

      CALL  "DT_TOD"                           //Systemzeit vom jetzigen Aufruf OB40 extrahieren
       IN     :=#OB40_DATE_TIME                //Standard Libary -> IEC Function Blocks -> FC8
       RET_VAL:="SpeicherDB".Systemzeit_neu    //und als "Systemzeit_neu" speichern

      L     "SpeicherDB".Systemzeit_neu        //von der neuen Systemzeit
      L     "SpeicherDB".Systemzeit_alt        //die vorige Systemzeit
      -D                                       //abziehen
      T     "SpeicherDB".Differenz             //und speichern
      L     L#60000                            //60.000(ms) laden
      TAK                                      //Dividend und Divisor tauschen für die richtige Reihenfolge zur
      /D                                       //Division (60.000 / Differenz)
      T     "SpeicherDB".Takt                  //Ergebnis Taktzahl[/FONT]
Womit ich mich nicht auskenne, ist die Einrichtung des Interrupts bzw. die Abfrage, was den OB40 ausgelöst hat.
Soweit ich weiß, benötigst Du Hardware, die diese Prozessalarme unterstützt. Leider wieder nicht mein Gebiet.
Bin mehr bei der 200er zuhause und mach' mich jetzt langsam mit der 1200er vertraut.



Schaut, so habe ich es gelöst.
Bis jetzt Stimmt die Taktzahl jedesmal, egal wie schnell ich den Taktmerker laufen lass. Würde es so fachgerecht gehen wie ich es programmiert habe? Die Eingänge E124.0 und E124.1 sind nicht zu beachten, sind nur zum Rücksetzen der Bauteile gedacht mehr nicht.



Anhang anzeigen 21208
Dieser Code kann halt die Taktzahl immer nur in 15er Schritten (durch den Faktor 15) anzeigen. Wenn das für Dich genau genug ist, dann ist's doch OK.



Ich muss Dich jetzt aber auch mal tadeln.
Du erwartest hier Hilfe, schaffst es aber nicht, auf Fragen zu antworten. Jeder Helfer macht das hier in seiner Freizeit. Da ist das ja wohl das Wenigste, das vom TE auf gestellte Fragen geantwortet wird.
Im Logo-Thread weiß ich jetzt 2 Tage später noch nicht, ob Du die 2 Lösungen überhaupt gesehen hast. Trotzdem ich das hier schon 2 mal angesprochen und verlinkt habe. Wenn Du nicht antworten möchtest, klicke entweder auf Danke oder auf Beitrag melden und beschwer' Dich darüber. Aber keine Reaktion vom TE ist einfach nur ...

Nur nehmen ist einfach nicht fair.
:mad:
 
Zuletzt bearbeitet:
HI hucki,
erstmals möchte ich mich entschuldigen für die ganze Verzögerung. Aber da ich leider keine LOGO-Software auf der Arbeit habe und momentan auch nicht in der Schule bin, kann ich deine Lösung nicht testen. Deshalb möchte ich diese erst in der Schule ausprobieren und anschließend dir eine Antwort geben.
Trotzdem danke.


Jetzt zu den anderen Lösungen:

Es ist echt nett und super toll von euch, aber ich habe mehrmals erwähnt das dass ganze bitte in FUP realisiert werden sollte. Ich bin ein ziemlicher Neuling und habe erst mit FUP angefangen. Ich komme irgendwie mit den ganzen AWL/SCL Sachen nicht ganz klar. Das liegt wahrscheinlich an den Befehlen.

Also geht das bitte bitte auch in FUP ?

LG
EMZ
 
HI hucki,
erstmals möchte ich mich entschuldigen für die ganze Verzögerung. Aber da ich leider keine LOGO-Software auf der Arbeit habe und momentan auch nicht in der Schule bin, kann ich deine Lösung nicht testen. Deshalb möchte ich diese erst in der Schule ausprobieren und anschließend dir eine Antwort geben.
Trotzdem danke.
Kurze Antwort, man kann das erst später testen, und schon weiß man, woran man ist.
;)




Jetzt zu den anderen Lösungen:
...
Also geht das bitte bitte auch in FUP ?
Geht schon.
Ist aber gerade bei Berechnungen oft viel, viel umständlicher, da dauernd zwischen irgendwelchen Dateiformaten konvertiert werden muss, obwohl sich intern überhaupt nichts ändert. In meinem Beispiel wäre das z. B. von Time_of_Day zu DINT nötig, obwohl das vom gespeichertem Bitmuster her eigentlich genau das Gleiche ist.
Aus dem Grund bin ich bei AWL geblieben und hab' für Dich jeden Befehl kommentiert. Die Hilfe F1 gibt dann weiteren Aufschluss.
Auch hier ist es meiner Meinung nach nicht zuviel verlangt, sich die paar Befehle im Editor mal anzusehen.


Mal davon abgesehen, läßt sich Text viel einfacher posten, während FUP/KOP noch zusätzliche Arbeit erfordert.

Trotzdem hier mein Programm in FUP (in AWL kopieren/einfügen und zu FUP umschalten):
Code:
[FONT=courier new]Netzwerk 1
[/FONT][FONT=courier new]      L     "SpeicherDB".Systemzeit_neu[/FONT]
[FONT=courier new]      T     "SpeicherDB".Systemzeit_alt[/FONT]
[FONT=courier new]      NOP   0[/FONT]
[FONT=courier new]
Netzwerk 2
[/FONT][FONT=courier new]      CALL  "DT_TOD"[/FONT]
[FONT=courier new]       IN     :=#OB40_DATE_TIME[/FONT]
[FONT=courier new]       RET_VAL:="SpeicherDB".Systemzeit_neu[/FONT]
[FONT=courier new]      NOP   0[/FONT]
[FONT=courier new]
Netzwerk 3
[/FONT][FONT=courier new]      L     "SpeicherDB".Systemzeit_neu[/FONT]
[FONT=courier new]      T     #diNeu[/FONT]
[FONT=courier new]      NOP   0[/FONT]
[FONT=courier new]
Netzwerk 4
[/FONT][FONT=courier new]      L     "SpeicherDB".Systemzeit_alt[/FONT]
[FONT=courier new]      T     #diAlt[/FONT]
[FONT=courier new]      NOP   0[/FONT]
[FONT=courier new]
Netzwerk 5
[/FONT][FONT=courier new]      L     #diNeu[/FONT]
[FONT=courier new]      L     #diAlt[/FONT]
[FONT=courier new]      -D    [/FONT]
[FONT=courier new]      T     #diDiff[/FONT]
[FONT=courier new]      NOP   0[/FONT]
[FONT=courier new]
Netzwerk 6
[/FONT][FONT=courier new]      L     L#60000[/FONT]
[FONT=courier new]      L     #diDiff[/FONT]
[FONT=courier new]      /D    [/FONT]
[FONT=courier new]      T     #diTakt[/FONT]
[FONT=courier new]      NOP   0[/FONT]
[FONT=courier new]
Netzwerk 7
[/FONT][FONT=courier new]      L     #diTakt[/FONT]
[FONT=courier new]      T     "SpeicherDB".Takt[/FONT]
[FONT=courier new]      NOP   0[/FONT]

PS: Da ist noch keinerlei Fehlerkorrektur dabei, die da z.B. wären - Division durch 0, Differenz der beiden Time_of_Day bei Tagesübergang (neu kleiner als alt), Aufruf OB40 durch andere Ereignisse ...
Es ging einfach erst mal um's Prinzip.
:)
 

Anhänge

  • OB40.pdf
    20,4 KB · Aufrufe: 31
Zuletzt bearbeitet:
Zurück
Oben