@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.