You can download the Source Code from this link Download Source Code
Introduction
Nowadays, the automobile industry is interested in automated measuring machines to ensure quality and to compete in the global industry. Control Chart takes a major role in ensuring quality by measuring automobile components. The purpose is to make a simple Control Bar Chart for Measuring Systems like Camshaft, Crankshaft, Master Setting and so on. A digital sensor is used for measuring Camshaft and Crankshaft. Then the measured data is analyzed using the Control Chart.
The Control Charts are graphs which is used to check the quality of control of a process. In Control Charts UCL/LCL or USL/LSL will be used to check with the resultant data. If measurement data is within the range of limits then the process is OK (GOOD). If the measurement data is above or below the limits the process is NG (NOT GOOD).
In our simple Control Chart USL /LSL are used for verifying the data. USL -> Upper Specification Limit and LSL -> Lower Specification Limit. Note in this sample we used USL/LSL.
Difference between USL/LSL and UCL/LCL.
(The UCL or upper control limit and LCL or lower control limit are limits set by your process based on the actual amount of variation of your process.
The USL or upper specification limit and LSL or lower specification limit are limits set by your customer's requirements. This is the variation that they will accept from your process. Ref)
The main purpose of this article is to share what we have developed to other members.
We have created a Control Chart as a User Control so that it can be used easily in all projects.
In this article we have a attached zip file named as SHANUControlChart_SRC.zip which contains:
1) First we will start with the User Control. To Create a user control:
'Public Property Declaration
Public
Property
MasterData()
As
String
Get
Return
lblMasterData.Text
End
Set
(value
)
lblMasterData.Text = value
USLData()
lblUslData.Text
lblUslData.Text = value
LSLData()
lblLslData.Text
lblLslData.Text = value
NominalData()
lblNominalData.Text
lblNominalData.Text = value
5. In our user control we have used Timer control to always check for the measurement data and produce the Bar Chart. In user control Load we have Enabled and Start the Timer. In Timer Tick Event we called the Function "LoadcontrolChart()". In this function we set all USL/LSL and measurement data and draw the Chart control.
Sub
LoadcontrolChart()
Try
'For Barand GageLoad
upperLimitChk =
False
lowerLimitchk =
errLimtchk =
Dim
pointVal
Integer
calcvalues
Double
calcvalues1
' Dim upperValue As Double
hasread
UpperRange
err
pointVal = 3
ival
sensordata = Convert.ToDouble(lblMasterData.Text.Trim())
frmMasteringPictuerBox.Refresh()
upperValue = System.Convert.ToDouble(lblUslData.Text)
lovervalue = System.Convert.ToDouble(lblLslData.Text)
If
upperValue = lovervalue
Then
lovervalue = lovervalue - 1
inputValue = System.Convert.ToDouble(lblMasterData.Text)
'here we call the draw rectangle function
drawRectanles(barheight, barwidth, upperValue, lovervalue, loverInitialvalue, upperInititalvalue, xval, yval)
Catch
ex
Exception
'This method is to draw the control chart
drawRectanles(
ByVal
barheight
,
barwidth
uppervalue
lovervalue
loverinitialvalue
upperinitialvalue
xval
yval
limitsline
lowerlimitline
underrange
upperrange
differentpercentage
totalheight
inputvalueCal
finaldisplayvalue
backColors1
Color
backColors2
'this is for the range percentage Calculation
differentpercentage = uppervalue - lovervalue
differentpercentage = differentpercentage * 0.2
'Upper range value
upperrange = uppervalue + differentpercentage
'Lover range value
underrange = lovervalue - differentpercentage
totalheight = upperrange - underrange
'For Upper Limit
''limitsline = barheight * 0.2 - 10
limitsline = lovervalue - underrange
limitsline = limitsline / totalheight
limitsline = barheight * limitsline + 10
'For Lower Limit
lowerlimitline = uppervalue - underrange
lowerlimitline = lowerlimitline / totalheight
lowerlimitline = barheight * lowerlimitline + 10
'lowerlimitline = barheight - limitsline + 10
'for finding the rangedata
inputvalueCal = inputValue - underrange
finaldisplayvalue = inputvalueCal / totalheight
finaldisplayvalue = barheight * finaldisplayvalue
g
Graphics = frmMasteringPictuerBox.CreateGraphics
f5
Font
f5 =
New
Font(
"arial"
, 22, FontStyle.Bold, GraphicsUnit.Pixel)
''If condition to check for the result and display the chart accordingly depend on limit values.
inputValue =
"0.000"
zeroDisplay = 0
backColors1 = Color.Red
backColors2 = Color.DarkRed
a5
System.Drawing.Drawing2D.LinearGradientBrush(
RectangleF(0, 0, 90, 19), backColors1, backColors2, Drawing.Drawing2D.LinearGradientMode.Horizontal)
g.DrawString(
"NG -> UnderRange"
, f5, a5, System.Convert.ToInt32(xval) - 40, barheight + 24)
lblMasterData.ForeColor = Color.Red
frmMasteringlblmsg.Text =
Else
backColors1 = Color.GreenYellow
backColors2 = Color.DarkGreen
"OK -> Good"
lblMasterData.ForeColor = Color.GreenYellow
ElseIf
inputValue >= lovervalue
And
inputValue <= uppervalue
RectangleF(0, 0, 100, 19), backColors1, backColors2, Drawing.Drawing2D.LinearGradientMode.Horizontal)
'frmMasteringlblOrignalData.ForeColor = Color.GreenYellow
inputValue < lovervalue
'frmMasteringlblOrignalData.ForeColor = Color.Red
inputValue > uppervalue
"NG -> UpperRange"
"Not Good"
apen
Pen(Color.Black, 2)
g.DrawRectangle(Pens.Black, System.Convert.ToInt32(xval) - 2, System.Convert.ToInt32(yval) - 2, System.Convert.ToInt32(barwidth) + 3, System.Convert.ToInt32(barheight) + 3)
g.DrawLine(apen, System.Convert.ToInt32(xval) - 15, System.Convert.ToInt32(limitsline), System.Convert.ToInt32(xval), System.Convert.ToInt32(limitsline))
g.DrawLine(apen, System.Convert.ToInt32(xval) - 15, System.Convert.ToInt32(lowerlimitline), System.Convert.ToInt32(xval), System.Convert.ToInt32(lowerlimitline))
a1
RectangleF(0, 0, 100, 19), Color.Blue, Color.Orange, Drawing.Drawing2D.LinearGradientMode.Horizontal)
f
f =
, 10, FontStyle.Bold, GraphicsUnit.Pixel)
g.DrawString((
.Format(
"{0:N3}"
CDbl
(uppervalue.ToString))), f, a1, System.Convert.ToInt32(xval) - 40, System.Convert.ToInt32(limitsline) + 1)
(lovervalue.ToString))), f, a1, System.Convert.ToInt32(xval) - 40, System.Convert.ToInt32(lowerlimitline) + 1)
(upperrange.ToString))), f, a1, System.Convert.ToInt32(xval) - 40, 9)
(underrange.ToString))), f, a1, System.Convert.ToInt32(xval) - 40, barheight + 10)
a
RectangleF(xval, barheight + 10, barwidth, finaldisplayvalue + 1), backColors1, backColors2, Drawing.Drawing2D.LinearGradientMode.Vertical)
a2
RectangleF(0, 0, 100, 19), Color.Black, Color.Black, Drawing.Drawing2D.LinearGradientMode.Horizontal)
f2
f2 =
, 12, FontStyle.Bold, GraphicsUnit.Pixel)
inputValue >= upperrange
g.FillRectangle(a,
RectangleF(xval, 10, barwidth, barheight))
(inputValue.ToString))), f2, a2, System.Convert.ToInt32(xval) + 40, yval - 8)
inputValue <= underrange
RectangleF(xval, barheight + 10, barwidth, 4))
(inputValue.ToString))), f2, a2, System.Convert.ToInt32(xval) + 40, barheight + 10)
RectangleF(xval, barheight - finaldisplayvalue + 10, barwidth, finaldisplayvalue))
(inputValue.ToString))), f2, a2, System.Convert.ToInt32(xval) + 40, barheight - System.Convert.ToInt32(finaldisplayvalue))
' End If
g.Dispose()
2) Now we create a Windows application and add and test our "SHANUControlChart_CNT" User Control.
private void btnDisplay_Click(object sender, EventArgs e)
{
shanuControlChart.USLData = txtusl.Text;
shanuControlChart.LSLData = txtLSL.Text;
shanuControlChart.NominalData = txtNominal.Text;
shanuControlChart.MasterData = txtData.Text;
}
private void btnRealTime_Click(object sender, EventArgs e)
if (btnRealTime.Text ==
"Real Time Data ON"
btnRealTime.Text =
"Real Time Data OFF"
;
btnRealTime.ForeColor = Color.Red;
timer1.Enabled = true;
timer1.Start();
else
btnRealTime.ForeColor = Color.DarkGreen;
timer1.Enabled = false;
timer1.
Stop
();
' Timer Tick Event to check for the different random sample Measurement test data.
private void timer1_Tick(object sender, EventArgs e)
Random rnd =new Random();
rndval = rnd.
Next
(1, 20);
txtData.Text = rndval.ToString(
);//FormatNumber(rndval.ToString(), 3, , 0)