cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Try the Materials Informatics Toolkit, which is designed to easily handle SMILES data. This and other helpful add-ins are available in the JMP® Marketplace
Choose Language Hide Translation Bar
Andeka
Level I

Control charts automatization with spec limits based on product

Dear community,

I perform trend analyses using control charts for different products of the same family, which share common process controls (pH, manufacturing time...), but which have different specification limits.

 

I would like to have just a column with common process control data (col 3 in example), and through a script apply the different spec limits by product ( i am currently using automatic control limits at 3 sigma, but would be interesting to be able to define them also)

My current way of doing it is having different columns and saving the spec limits to column properties and then having to link product 1 with time column 1, product 2 with time column 2 etc. But this creates a huge data table.

I guess it has to be using a spec limit table, but could not script the process through it either.

 

Andeka_1-1697035737392.png

DT is attached

thank you

@Ben_BarrIngh  @Danny_sierra

1 ACCEPTED SOLUTION

Accepted Solutions

Re: Control charts automatization with spec limits based on product

Hi Andeka,

Thanks for posting. Will preface by saying I’m not a scripter but I’ve found a way to solve this using JMP which you can script. I’ve taken a lot of these details from the example described here: https://community.jmp.com/t5/Discussions/Setting-Spec-Limits-using-Column-Data/td-p/392499

 

In this solution you can store each product and process(es) control and spec limits in a separate data table, in this case I’ve made a data-table of spec limits with UCL/LCL generated from the Limit Summaries generated by the Control Chart Builder. I’ve added random USL values to demonstrate its use. If you have multiple processes that you want to analyze, you just need to note it on your ‘Process’ column (important for later).

Ben_Ingham_0-1697187200959.png

 

Using this data-table, you can use the Process Screening platform (Analyze>Quality and Process>Process Screening in JMP 17) to create a single ‘page’ to look at your control charts. To start, place your process control data in ‘Process Variables’ and separate your data by the product using the ‘By’ selection (see below). Make sure to select ‘Use Limits Table’ and press Okay and select your spec table.

 

 

 

Ben_Ingham_1-1697187200996.png

 

Ben_Ingham_2-1697187200999.png

 

From here, the process screening platform will prompt you to select your process variable (Process) and Grouping (your ‘Product’ /the previous ‘by’ variable) and your LCL/UCL and USL/LSL spec limits. Press okay then it’s a simple case of activating ‘select chart as selected’ and highlighting your  summary table.

 

 

Ben_Ingham_3-1697187201033.png

Ben_Ingham_5-1697187405275.png

 

 

 

Process Screening(
	SendToByGroup( Bygroup Default ),
	Process Variables( :"Total Time (min)"n ),
	Control Chart Type( "Indiv and MR" ),
	SendToByGroup( {:Product == "Product 1"}, Cp( 1 ) ),
	Show Charts as Selected( 1 ),
	SendToByGroup(
		{:Product == "Product 1"},
		Chart Options as Selected( Show Zones( 1 ), Show Spec Limits( 1 ) )
	),
	Use Limits Table(
		1,
		Data Table( "Spec Table" ),
		Process Variables( :Process ),
		Grouping( :Product ),
		LSL( :LSL ),
		USL( :USL ),
		Target( :Target ),
		Go
	),
	SendToByGroup( {:Product == "Product 1"}, RowStates( [0 1] ) ),
	SendToByGroup( {:Product == "Product 2"}, RowStates( [0 1] ) ),
	SendToByGroup( {:Product == "Product 3"}, RowStates( [0 1] ) ),
	By( :Product ),
	SendToByGroup(
		{:Product == "Product 1"},
		SendToReport(
			Dispatch(
				{"Process Screening Product=Product 1", "Charts as Selected"},
				"",
				ListBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 1", "Charts as Selected"},
				"",
				TextBox,
				{Set Wrap( 520 ), Set Base Font( "Small" )}
			),
			Dispatch(
				{"Process Screening Product=Product 1", "Charts as Selected"},
				"",
				PictureBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 1", "Charts as Selected"},
				"",
				TextEditBox,
				{Rotate Text( "Left" ), Set Wrap( 170 ),
				Set Base Font( "Axis Title" )}
			)
		)
	),
	SendToByGroup(
		{:Product == "Product 2"},
		SendToReport(
			Dispatch(
				{"Process Screening Product=Product 2"},
				"",
				TableBox,
				{set height( 69 ), set width( 830 )}
			),
			Dispatch(
				{"Process Screening Product=Product 2", "Charts as Selected"},
				"",
				ListBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 2", "Charts as Selected"},
				"",
				TextBox,
				{Set Wrap( 520 ), Set Base Font( "Small" )}
			),
			Dispatch(
				{"Process Screening Product=Product 2", "Charts as Selected"},
				"",
				PictureBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 2", "Charts as Selected"},
				"",
				TextEditBox,
				{Rotate Text( "Left" ), Set Wrap( 170 ),
				Set Base Font( "Axis Title" )}
			)
		)
	),
	SendToByGroup(
		{:Product == "Product 3"},
		SendToReport(
			Dispatch(
				{"Process Screening Product=Product 3", "Charts as Selected"},
				"",
				ListBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 3", "Charts as Selected"},
				"",
				TextBox,
				{Set Wrap( 520 ), Set Base Font( "Small" )}
			),
			Dispatch(
				{"Process Screening Product=Product 3", "Charts as Selected"},
				"",
				PictureBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 3", "Charts as Selected"},
				"",
				TextEditBox,
				{Rotate Text( "Left" ), Set Wrap( 170 ),
				Set Base Font( "Axis Title" )}
			)
		)
	)
)

 

I’ve attached the data table and the script for this process (saved by selecting ‘Save  By Group Script’ in the red drop down menu). Let me know if this solution works for you!

 

Cheers,

Ben

“All models are wrong, but some are useful”

View solution in original post

1 REPLY 1

Re: Control charts automatization with spec limits based on product

Hi Andeka,

Thanks for posting. Will preface by saying I’m not a scripter but I’ve found a way to solve this using JMP which you can script. I’ve taken a lot of these details from the example described here: https://community.jmp.com/t5/Discussions/Setting-Spec-Limits-using-Column-Data/td-p/392499

 

In this solution you can store each product and process(es) control and spec limits in a separate data table, in this case I’ve made a data-table of spec limits with UCL/LCL generated from the Limit Summaries generated by the Control Chart Builder. I’ve added random USL values to demonstrate its use. If you have multiple processes that you want to analyze, you just need to note it on your ‘Process’ column (important for later).

Ben_Ingham_0-1697187200959.png

 

Using this data-table, you can use the Process Screening platform (Analyze>Quality and Process>Process Screening in JMP 17) to create a single ‘page’ to look at your control charts. To start, place your process control data in ‘Process Variables’ and separate your data by the product using the ‘By’ selection (see below). Make sure to select ‘Use Limits Table’ and press Okay and select your spec table.

 

 

 

Ben_Ingham_1-1697187200996.png

 

Ben_Ingham_2-1697187200999.png

 

From here, the process screening platform will prompt you to select your process variable (Process) and Grouping (your ‘Product’ /the previous ‘by’ variable) and your LCL/UCL and USL/LSL spec limits. Press okay then it’s a simple case of activating ‘select chart as selected’ and highlighting your  summary table.

 

 

Ben_Ingham_3-1697187201033.png

Ben_Ingham_5-1697187405275.png

 

 

 

Process Screening(
	SendToByGroup( Bygroup Default ),
	Process Variables( :"Total Time (min)"n ),
	Control Chart Type( "Indiv and MR" ),
	SendToByGroup( {:Product == "Product 1"}, Cp( 1 ) ),
	Show Charts as Selected( 1 ),
	SendToByGroup(
		{:Product == "Product 1"},
		Chart Options as Selected( Show Zones( 1 ), Show Spec Limits( 1 ) )
	),
	Use Limits Table(
		1,
		Data Table( "Spec Table" ),
		Process Variables( :Process ),
		Grouping( :Product ),
		LSL( :LSL ),
		USL( :USL ),
		Target( :Target ),
		Go
	),
	SendToByGroup( {:Product == "Product 1"}, RowStates( [0 1] ) ),
	SendToByGroup( {:Product == "Product 2"}, RowStates( [0 1] ) ),
	SendToByGroup( {:Product == "Product 3"}, RowStates( [0 1] ) ),
	By( :Product ),
	SendToByGroup(
		{:Product == "Product 1"},
		SendToReport(
			Dispatch(
				{"Process Screening Product=Product 1", "Charts as Selected"},
				"",
				ListBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 1", "Charts as Selected"},
				"",
				TextBox,
				{Set Wrap( 520 ), Set Base Font( "Small" )}
			),
			Dispatch(
				{"Process Screening Product=Product 1", "Charts as Selected"},
				"",
				PictureBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 1", "Charts as Selected"},
				"",
				TextEditBox,
				{Rotate Text( "Left" ), Set Wrap( 170 ),
				Set Base Font( "Axis Title" )}
			)
		)
	),
	SendToByGroup(
		{:Product == "Product 2"},
		SendToReport(
			Dispatch(
				{"Process Screening Product=Product 2"},
				"",
				TableBox,
				{set height( 69 ), set width( 830 )}
			),
			Dispatch(
				{"Process Screening Product=Product 2", "Charts as Selected"},
				"",
				ListBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 2", "Charts as Selected"},
				"",
				TextBox,
				{Set Wrap( 520 ), Set Base Font( "Small" )}
			),
			Dispatch(
				{"Process Screening Product=Product 2", "Charts as Selected"},
				"",
				PictureBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 2", "Charts as Selected"},
				"",
				TextEditBox,
				{Rotate Text( "Left" ), Set Wrap( 170 ),
				Set Base Font( "Axis Title" )}
			)
		)
	),
	SendToByGroup(
		{:Product == "Product 3"},
		SendToReport(
			Dispatch(
				{"Process Screening Product=Product 3", "Charts as Selected"},
				"",
				ListBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 3", "Charts as Selected"},
				"",
				TextBox,
				{Set Wrap( 520 ), Set Base Font( "Small" )}
			),
			Dispatch(
				{"Process Screening Product=Product 3", "Charts as Selected"},
				"",
				PictureBox,
				{Horizontal Alignment( "Right" )}
			),
			Dispatch(
				{"Process Screening Product=Product 3", "Charts as Selected"},
				"",
				TextEditBox,
				{Rotate Text( "Left" ), Set Wrap( 170 ),
				Set Base Font( "Axis Title" )}
			)
		)
	)
)

 

I’ve attached the data table and the script for this process (saved by selecting ‘Save  By Group Script’ in the red drop down menu). Let me know if this solution works for you!

 

Cheers,

Ben

“All models are wrong, but some are useful”