Step 7 S7-300 CpK-Wert Berechnung für Durchmesser --Kabelindustrie--

Xplosion

Level-1
Beiträge
202
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe eine Frage bezüglich einer CpK-Wert-Berechnung an unseren Extrusionslinien bzw. bin mir nicht sicher, ob das so richtig ist.

Um eine CpK-Wert-Berechnung zu machen benötige ich ja folgende Daten: (Kabeldurchmesser während der Produktion)

- obere Toleranzgrenze
- untere Toleranzgrenze
- Mittelwert
- Standardabweichung

Wenn diese Werte bekannt sind, kann ich doch mit folgender Formel meinen Cpk-Wert ausrechnen:

(obere Toleranzgrenze - Mittelwert ) / 3x Standardabweichung = CpK OTG
(Mittelwert - untere Toleranzgrenze) / 3x Standardabweichung = CpK UTG

Danach ermittle ich nur noch den kleineren Wert und erhalte somit das CpK-Ergebnis.


Ich hab bei Siemens einen schönen Baustein gefunden, der mir Mittelwert und Standardabweichung berechnet.
Dieser ist so aufgebaut, dass kein Speicher benötigt wird.
Mit jedem Eingangsignal (bei mir ein Wert pro Meter) wird der Durchmesser zum letzten Wert dazu addiert und ein Counter um 1 erhöht.
Dadurch kann der Baustein Mittelwert und Standardabweichung berechnen.

Die CpK-Wert-Aufzeichnung beginnt immer bei einem Spulenwechsel und endet mit dem nächsten Spulenwechsel. Die Daten werden weggeschrieben und der Baustein wieder auf 0 gesetzt.
Der Wert wird dann auf ein Spulenetikett gedruckt.

Jetzt ist es aber schon desöfteren passiert, dass beim Ausdruck kein Wert erscheint sondern z.b. "nan".
Ich habe die Werte im Baustein beobachtet. Vor dem Befehl SQRT steht eine negative REAL-Zahl. Dies scheint der Grund zu sein, warum ich beim Ausdruck einen Fehler erhalte.


Meine Fragen an euch:

- ist die Berechnung grundsätzlich richtig?
- wie kommt vor der Quadratwurzel die negative Zahl zustande?

Unsere Durchmesser-Messgeräte können unter Umständen mal einen kurzen 0-Wert liefern. Um diesen Fehler aus den Weg zu gehen habe ich folgendes gemacht:

Sobald ein "Aufzeichnungsimpuls" an den Baustein in der SPS gegeben wird, überprüfe ich, ob der Istwert des Durchmessers innerhalb des Sollwertes +/- der eingestellen Toleranz liegt. Nur dann wird der Messwert auch aufgezeichnet. Sollte also durch Verschmutzung oder ähnliches das Messgerät kurz einen 0-Wert bzw. falschen Wert liefern, wird dieser nicht beachtet.
Somit kann ich zumindest ausschliessen, dass ein Durchmesseristwert aufgezeichnet wird, der nicht innerhalb des Sollwertes mit zulässiger Toleranz liegt.


Hier ist noch der Funktionsbaustein, den ich verwende:


(* ============================================================================= *)
(* Zweck: Diese Funktion dient dazu, die Kenngrößen Minimum, Maxiumum, *)
(* Durchschnitt und Standardabweichung aus einer Reihe von Eingangs- *)
(* Werten zu messen und zu speichern. *)
(* *)
(* Anwendung:Wenn der FB aufgerufen wird, muss der bool'sche Eingangsparameter *)
(* 'Rec_On' auf 'true' gesetzt sein um das Erfassen und Berechnen der *)
(* Daten zu aktivieren. *)
(* Ist 'Rec_On' auf 'false', werden alle Daten auf 0.0 gesetzt. Ist es *)
(* erforderlich, die Daten zu speichern, bis eine neue Berechnung *)
(* erfolgt, ist 'Rec_On' auf 'true' zu lassen. Statt dessen ist der *)
(* Aufruf des Funkionsbausteines zu unterbinden. Das führt zu einer *)
(* Unterbrechung der Berechnung, behält jedoch die Daten im Instanz- *)
(* datenbaustein. Wird der Funktionsaufruf reaktiviert, setzt die *)
(* Berechnung auf die bereits gespeicherten Daten auf. Das bedeudet, *)
(* dass je nach Aufruflogik, der Funktionsbaustein gleichermaßen für *)
(* kontinuierliche oder für zeitdiskrete Datenverarbeitung verwendet *)
(* werden kann. *)
(* *)
(* ============================================================================= *)
(* PURPOSE : To measure and record the highes & lowest values achieved by *)
(* an incoming variable, and calculate the moving average and standard *)
(* deviation of the variable. *)
(* *)
(* USAGE : When the FB is called, the Boolean input parameter 'Rec_On' *)
(* must be set 'true' to enable the collection and calculation of data.*)
(* When this parameter is cleared to 'false', all the data values *)
(* are reset to zero. If the data are required to be stored until a *)
(* new operation begins, leave 'Rec_On' as 'true' and disable the *)
(* call to the block. This will pause the processing, but leave *)
(* the data held in the Instance DB. Whenever the block call is *)
(* reactivated, processing will begin again from these stored values. *)
(* This means that by using the correct pattern of calling logic, *)
(* the block can be used equally for continuous process measurement *)
(* or for discrete items such as boxes etc. *)
(* *)
(* ============================================================================= *)


FUNCTION_BLOCK FB1035

TITLE = 'SPC01'
VERSION : '1.0'
AUTHOR : KenMuir
NAME : SPC01
FAMILY : SPC


(* ----------------------------- *)
(* DEFINITION OF LOCAL VARIABLES *)
(* ----------------------------- *)


VAR_INPUT
PV : REAL; // Prozessvariable am Eingang / Incoming Process Variable to be recorded.
Rec_On : BOOL; // 'true' um Werte aufzuzeichenen. 'false' Ausgang folgt PV / Must be 'true' to record values. 'False' means outputs track 'PV' input
END_VAR

VAR
Count : REAL; // Anzahl aufgezeichnete PV / Number of 'PV' values recorded for 'Mean' calculation
Total : REAL; // Summe über alle PV / Sum of 'PV' values recorded since last 'false' to 'true' transition of 'Rec_On'
SqrsTotal : REAL; // Summe aller PV^2 / Sum of the squares (PV^2) of the PV values
END_VAR

VAR_OUTPUT
Hi : REAL; // Maximalwert seit Aufzeichnungsbegin / Highest value achieved since last 'false' to 'true' transition of 'Rec_On'
Lo : REAL; // Minimalwert seit Aufzeichnungsbegin / Lowest value achieved since last 'false' to 'true' transition of 'Rec_On'
Mean : REAL; // Arithmetischer Mittelwert seit Aufzeichnungsbegin / Arithmetic average of PV values since last 'false' to 'true' transition of 'Rec_On'
StdDev : REAL; // Standardabweichung der PV / Standard Deviation of PV values
END_VAR


(* ------------------------------- *)
(* START DES PROGRAMMCODES *)
(* ------------------------------- *)
(* START OF CODE SECTION *)
(* ------------------------------- *)


BEGIN

IF Rec_On = false THEN // Wenn 'Rec_on' false ist / If 'Rec_On' signal is false ...
Hi := PV; // \
Lo := PV; // ...alle 3 Ausgänge folgen PV / ... set all 3 outputs to follow 'PV' input.
Mean := PV; // /
Count := 0.0; // Alten Zählerstand löschen / Reset previous 'Count' value to zero
Total := 0.0; // Alte Gesamtsumme löschen / Reset previous 'Total' value to zero
SqrsTotal := 0.0;
StdDev := 0.0;

ELSE // Wenn 'Rec_On' true ist / If 'Rec_On' signal is true ...

IF PV > Hi THEN // Ist PV größer las aktuelles Maximum / If PV is greater than current 'Hi'...
Hi := PV; // Maximum aktualisieren / ... update 'Hi' output with 'PV'
END_IF;

IF PV < Lo THEN // Ist PV kleiner als aktuelels Minimum / If PV is less than current 'Lo'...
Lo := PV; // ...aktualisiere / ... update 'Lo' output with 'PV'
END_IF;

Count := Count + 1.0; // Zähler erhöhen / ... increment 'Count'...,
Total := Total + PV; // Gesamtsumme berechnen / ... update 'Total'...,
SqrsTotal := SqrsTotal + SQR(PV); // Summe über PV^2 bilden / ... update 'SqrsTotal...,
Mean := Total / Count; // Arith. Mittelwert neu berechnen / ... recalculate 'Ave'...
StdDev := SQRT(((Count * SqrsTotal) - SQR(Total)) / SQR(Count)); // Standardabweichung neu berechnen / ... and recalculate StdDev.

END_IF;

END_FUNCTION_BLOCK
 
- wie kommt vor der Quadratwurzel die negative Zahl zustande?

Was meinst du mit "vor der Quadratwurzel"? Der Wert innerhalb der Klammer nach StdDev :=?

Die Summe der Quadrate ist eigentlich immer größer als das Quadrat der Summe, wenn alles richtig läuft dürfte der Wert in der Klammer nicht negativ werden. Ich würde mir mal die Einzelwerte ansehen.
Wenn Count auf Null gesetzt würde, ergäbe des ebenfalls NaN. Aber dann müsste schon von extern auf den Instanz-DB geschrieben werden.
 
Hallo Xplosion könntest du bitte mal einen Screen Posten wo du den Idb beobachtest so das ich mal alle Aktuallwerte da hätte

Gruß Tia
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Erste was mir auffällt ist das REAL Additionsproblem.
Total, SqrsTotal, und Count sind REAL Werte, zu welchen immer relativ kleine
addiert werden.

Jetzt ist es so, dass ein REAL in S7 nur 6 Stellen nach dem hat (1.123456+E00).
D.h. ab einem Wert von 10 hoch 6 (1.000.000) hast du ein großes Problem, da alles <1
unter die Rundung fällt und weg ist.

Das Problem bei PV ist noch größer, gehen wir davon aus, dass du für PV X.yyy mit 3 Stellen
nach dem Komma haben möchtest.

Wenn nun Total = Total +PV ist, dann fällt ab einem Wert von Total = 10.000, deine letzte Kommastelle weg
ab 100.000 die Vorletzte usw.

Bei deinen Werteberechnung musst du extrem aufpassen, dass da nicht grundsätzlich Quatsch rauskommt.
 
Zurück
Oben