
Ich stoße auf ein Problem, bei dem ich sehen möchte, wie meine alten Eingriffsgrenzen im Verhältnis zu den aktuellen oder neuen festen Eingriffsgrenzen für eine Reihe von Regelkarten aussehen würden. Normalerweise würde ich jedem Diagramm Referenzlinien hinzufügen, aber ich denke, es könnte einen besseren Weg geben, eine längst vergessene (zumindest für mich) Plattformnachricht zu verwenden.
Anfang dieses Jahres habe ich mit der Idee herumgespielt, wie es aussehen würde, eine neue Spalteneigenschaft hinzuzufügen, in diesem Fall Aktions- und Warngrenzen für Umgebungsüberwachungsdiagramme, und diese Spalteneigenschaft dann als Referenzlinie in Kontrolldiagrammen zu verwenden. Link zum EM-Blog
Als ich im Scripting Index nach etwas ganz anderem gesucht habe, bin ich auf eine Funktion namens „Add Limits“ gestoßen. Soweit ich das beurteilen kann, gibt es diese Funktion schon lange, zumindest vor v14, und sie kann verwendet werden, um obere und untere Kontrollgrenzen an eine Regelkarte zu senden. Diese Grenzwerte werden als gestrichelte Linien angezeigt und in einer Tabelle neben dem Diagramm aufgelistet. Ich würde eine Menge JSL brauchen, um das zu erreichen, also ist es ziemlich schön, ein so nützliches Feature zu entdecken.
Die grundlegende Verwendung von Add Limits sieht ungefähr so aus:
//Example of adding limits to a control chart
ccb = dt << Control Chart Builder( Variables( Y( :Column 1 ) ), Show Control Panel( 0 ) );
ccb << chart( position( 1 ), Add Limits( {LCL( 20 ), UCL( 30 )} ) );
Die letzte Zeile von JSL sendet eine Nachricht an das Diagramm, die die Werte enthält, die als Grenzwerte für die gestrichelte Linie verwendet werden sollen.
Natürlich möchte ich es dynamisch mit jeder Spalte verwenden, das erfordert also ein bisschen mehr ausgefallene Fußarbeit.
Lassen Sie uns zunächst eine Tabelle erstellen, die als Beispiel verwendet werden soll.
dt=New Table( "old and new control limits",Add Rows( 50 ),
New Column( "Column 1",Numeric,"Continuous",Format( "Best", 12 ),
Formula( Round( Random Normal( 25, 3 ), 0 ) )));
column(dt, 1)<< Delete Formula;
Beachten Sie, dass ich die Formel lösche, die einige zufällige Daten generiert, mit denen Sie direkt nach dem Erstellen der Tabelle arbeiten können. Dadurch werden die Werte in der Tabelle fixiert.
Der nächste Schritt besteht darin, eine neue Art von Spalteneigenschaft hinzuzufügen, etwas benutzerdefiniertes, das in JMP nicht nativ vorhanden ist.
Column( dt, 1 ) << set property( "Old Control Limits", {LCL( 20 ), UCL( 30 )} );
Nach dem Ausführen dieser Zeile hat die Spalte in der Datentabelle jetzt eine Eigenschaft namens Old Control Limits.
Nur um zu überprüfen, ob das Skript funktioniert hat, können Sie sich auf diese Weise die Werte der Spalteneigenschaft ansehen.
OCL = Column( dt, 1 ) << Get Property( "Old Control Limits" );Show( OCL[1], OCL[2] );
Die neue Variable OCL hat zwei Werte, LCL(20) und UCL(30)
Ich kann diese Werte in einem neuen Kontrolldiagramm verwenden.
Die nächsten paar Zeilen sehen vielleicht wirklich seltsam aus, aber sie sind super robust und nutzen die funktionsbasierte Struktur von JSL.
Zuerst werde ich ein paar leere oder fast leere Argumente definieren und sie dann verschachteln.
ccbe = Expr(Control Chart Builder( Variables( Y( :Column 1 ) ), Show Control Panel( 0 ) ));
ce = Expr( chart( position( 1 ) ) );
ae = Expr( add limits() );
le = {};
Indem ich diese Ausdrücke aufstelle, kann ich jeden Teil behandeln, ohne sie auszuwerten.
ccbe, der Control Chart Builder-Ausdruck ist eine Funktion, "Control Chart Builder" mit zwei Argumenten, "Variablen" und "Show Control Panel".
Ich möchte der Control Chart Builder-Funktion ein neues Argument namens Chart() hinzufügen. Die neue Variable ce ist ein Ausdruck mit dem Argument „Chart“, und Chart enthält ein Argument „Position (1)“.
Ich möchte Add Limits zum Chart-Argument hinzufügen, damit ich die Variable ae habe, um auf einen leeren Add Limits-Ausdruck zu verweisen.
Zuletzt habe ich eine leere Liste namens "le" erstellt, die die Grenzen enthält, die ich von "Get Properties" in der OCL-Variablen aus dem vorherigen Schritt erhalten habe.
Als nächstes werde ich die Teile zusammenschichten:
Insert Into( le, OCL );show( le );
Insert Into( ae, le );Show( ae );
Insert Into( ce, Name Expr( ae ) );Show( ce );
Insert Into( ccbe, Name Expr( ce ), 2 );
ccbe;
Zuerst nehme ich die Liste der Dinge in OCL und füge sie in le ein.
Zweitens nehme ich "le" und füge es in "ae" ein, gefolgt vom Einfügen von "ae" in "ce". Im zweiten Fall habe ich "ae" in einen Name Expr() gepackt. Dies gibt mir den ausgewerteten Ausdruck von ae, ohne ihn auszuwerten. Diese Methode NameExpr() ist super praktisch.
Zuletzt füge ich ce in die ccbe ein, was der gesamte Kontrolldiagrammausdruck ist.
In der obigen JSL habe ich nach jedem Schritt eine „Show“ eingefügt, damit Sie sehen können, wie die Funktion im Protokoll erstellt wird.
Der letzte Schritt besteht darin, ein Diagramm zu erhalten. Indem ich einfach ccbe ganz alleine ausführe, wird diese Variable ausgewertet, die den vollständigen Ausdruck enthält, und ich erhalte ein Regeldiagramm mit gestrichelten Linien, die die alten Regelgrenzen darstellen, die aus den Spalteneigenschaften stammen.
Ich bin mir ziemlich sicher, dass es mit etwas mehr Aufwand möglich wäre, mit einer Tabelle zu beginnen, die die aktuellen und alten Kontrollgrenzen enthält, die verwendet werden könnten, um alle Spalteneigenschaften für eine ganze Tabelle von Prozessvariablen zu füllen.
Das gesamte Skript ist unten enthalten.