Minehunter
Level-1
- Beiträge
- 25
- Reaktionspunkte
- 3
-> Hier kostenlos registrieren
Hallo,
ich benötige einmal eure Hilfe bezüglich der Performance eines CP6606. (Beckhoff)
im Bezug auf eine Zeitmessung.
Situation:
an dem CP hängt eine EK1101 klemme welche über EtherCat angesprochen wird.
An dieser Klemme hängen wiederum Zählerkarten des Typs EL1512 (6 Karten)
Programm:
- Einlesen der Eingänge
- CASE
0: - speichere Time1: Systemzeit (GETSYSTEMTIME()) CASE=>1
1: - Berechne: Zählerdifferenz := (aktuellen Zählerstand) - (alten Zählerstand), Ist dieser Größer als 100, dann
- Speichere Time2 (Systemzeit) bereche differenz der beiden Zeiten, Time2-Time1,
- weitere Berechnungen mit der Zeit und des Zählers
- CASE=>2
Dieser Funktionsblock zur Berechnung der Zeiten wird am Anfang des Programms in ein Array initialisiert, sodass es für jeden Messkanal zur verfügung steht.
also für jeden Messkanal eine eigene Instanz.
Nun wird in einer FOR-schleife die einzelnen Funktionsblöcke abgearbeitet uind die Werte in eine Struktur geschrieben.
An sich funktioniert das ganze auch, bis auf diese Kleinigkeit.
Bis die einzelnen Zähler ca. den Wert 100 erreicht haben, vergehen ca. 5 Sekunden.
Der CPU leerlauf iegt bei ca. 15%.
Wenn nun die Berechnung erfolgt, liegt dieser bei 60%
Kann man an der Performance noch etwas verbessern?
Ziel ist es bis zu 100 solcher Karten abzufragen und zu berechnen.
Vielen Dank im Voraus
ich benötige einmal eure Hilfe bezüglich der Performance eines CP6606. (Beckhoff)
im Bezug auf eine Zeitmessung.
Situation:
an dem CP hängt eine EK1101 klemme welche über EtherCat angesprochen wird.
An dieser Klemme hängen wiederum Zählerkarten des Typs EL1512 (6 Karten)
Programm:
- Einlesen der Eingänge
- CASE
0: - speichere Time1: Systemzeit (GETSYSTEMTIME()) CASE=>1
1: - Berechne: Zählerdifferenz := (aktuellen Zählerstand) - (alten Zählerstand), Ist dieser Größer als 100, dann
- Speichere Time2 (Systemzeit) bereche differenz der beiden Zeiten, Time2-Time1,
- weitere Berechnungen mit der Zeit und des Zählers
- CASE=>2
Dieser Funktionsblock zur Berechnung der Zeiten wird am Anfang des Programms in ein Array initialisiert, sodass es für jeden Messkanal zur verfügung steht.
also für jeden Messkanal eine eigene Instanz.
Nun wird in einer FOR-schleife die einzelnen Funktionsblöcke abgearbeitet uind die Werte in eine Struktur geschrieben.
An sich funktioniert das ganze auch, bis auf diese Kleinigkeit.
Bis die einzelnen Zähler ca. den Wert 100 erreicht haben, vergehen ca. 5 Sekunden.
Der CPU leerlauf iegt bei ca. 15%.
Wenn nun die Berechnung erfolgt, liegt dieser bei 60%
Kann man an der Performance noch etwas verbessern?
Ziel ist es bis zu 100 solcher Karten abzufragen und zu berechnen.
MAIN
VAR
fbCalc: ARRAY [0..11] OF FB_Calc;
END_VAR
FOR idx := 0 TO 11 BY 1 DO
fbCalc[idx]()
END_FOR
FB_CALC
VAR
ActSystemTime1 : T_ULARGE_INTEGER ;
ActSystemTime2 : T_ULARGE_INTEGER ;
UInt64TimeDif : T_ULARGE_INTEGER ;
TimeDifSec : LREAL;
fbReadSystemTime: GETSYSTEMTIME;
END_VAR
CASE iState OF
0: // setze Zeit
fbReadSystemTime(timeLoDW=> ActSystemTime1.dwLowPart, timeHiDW=> ActSystemTime1.dwHighPart);
iMeas_PulsAlt := iPlsInputVal; // Speicher aktuellen Zählerstand
iState := 1;
1: //Lese Zählerstand bis differenz über 100 ist
iDifPuls := iPlsInputVal - iMeas_PulsAlt;
IF iDifPuls >= 100 THEN
fbReadSystemTime(timeLoDW=> ActSystemTime2.dwLowPart,timeHiDW=> ActSystemTime2.dwHighPart); // Speicher aktuelle Zeit in zweiten Speicher
UInt64TimeDif:= UInt64Sub64(ActSystemTime2, ActSystemTime1); // Berechne die Differenz
TimeDifSec:= UINT64_TO_LREAL(UInt64TimeDif) / LREAL#10000000; // errechne sekundenwerte bsp. 10.12
rMeas_Act := ( (UDINT_TO_REAL( iDifPuls) * LREAL_TO_REAL(TimeDifSec) ) / 100) ; // Berechnungen
// ....
iState :=0;
END_IF
END_CASE
Vielen Dank im Voraus