' Il seguente snippet deve essere inserito in un oggetto "Procedura", ed effettua il calcolo del CPK a partire da un array di misure, riportando poi i valori su un grafico.
' Devono essere passati 5 parametri
' Parameter1: oggetto "Grafico"
' Parameter2: Array monodimensionale contenente le misure
' Parameter3: Valore inferiore della misura da spacifica
' Parameter4: Valore superiore della misura da spacifica
' Parameter5: Valore del CPK calcolato e restituito dalla procedura al chiamante
Dim vmin as Double = Parameter3 ' Valore nominale
Dim vmax as Double = Parameter4 ' Tolleranza da specifica
Dim misure as DBArray=Parameter2
Dim Chart=Parameter1
' Calcola la media delle misure
dim i as integer
dim tot as double=0
dim min_mis as double=9999999
dim max_mis as double=-9999999
for i=1 to misure.size
tot+=misure(i)
if min_mis>misure(i)
min_mis=misure(i)
end if
if max_mis<misure(i)
max_mis=misure(i)
end if
next
dim mu as double=tot/misure.size ' media delle misure
' Calcola la deviazione standard
tot=0
for i=1 to misure.size
tot+=(misure(i)-mu)^2
next
dim sigma as double=math.sqrt(tot/(misure.size-1)) ' Deviazione standard delle misure
' Trasforma le misure in istogrammi, dividendo il range di misure in segmenti e calcolando la frequenza
dim bars as new dbarray(0,0,0,0,0,0)
dim bar_amp as double=(max_mis-min_mis)/bars.size
dim b as integer
for i=1 to misure.size
for b=0 to bars.size-1
if misure(i)>=min_mis+bar_amp*b and misure(i)<=min_mis+bar_amp*(b+1)
bars(b+1)+=1
exit for
end if
next
next
dim Series as new dbarray
series.Add(New DBArray("X", "Gauss", "Misure")) ' Array delle serie: il primo elemento è la testata
series.Add(New DBArray(vmin,null,0)) ' Valore minimo
series.Add(New DBArray(vmax,null,0))' Valore minimo
' Aggiunge la frequenza alla serie di misure
for b=1 to bars.size
series.add(new dbarray(min_mis+((b-1)+0.5)*bar_amp,null,bars(b)/misure.size)) ' La X è il punto centrale, la Y è la frequenza
next
' Assegna i punti della gaussiana teorica
Dim x as Double
if sigma>0
for x=mu-4*sigma to mu+4*sigma step sigma/4
series.Add(New DBArray(x,math.exp(-(1/2) * ((x - mu)/sigma)^2)/(sigma * math.sqrt(2*math.pi)),null))
next
end if
' Assegna le serie al grafico
Chart.SetSeries(series)
' Calcola il CPK
dim CPk as double
CPk=Min((vmax-mu)/(3*sigma),(mu-vmin)/(3*sigma))
' Assegna i settaggi del grafico
Dim s As String
s = "title: 'Media: "+ltrim(str(mu,10,5))+" Sigma: "+ltrim(str(sigma,10,5))+" CPK: "+ltrim(str(cpk,10,2)).Replace(",", ".")+"',"+
"description: '',"+
"enableAnimations: true," +
"showLegend: false," +
"padding: { left: 5, top: 5, right: 5, bottom: 5 }," +
"titlePadding: { left: 0, top: 10, right: 0, bottom: 10 }," +
"xAxis:" +
"{" +
"dataField: 'X'," +
"unitInterval: 'auto'," +
"axisSize: 'auto',"+
"tickMarks: {" +
"visible: true," +
"interval: 'auto'," +
"color: '#BCBCBC'" +
"}," +
"gridLines: {" +
"visible: true," +
"interval: 'auto'," +
"color: '#BCBCBC'" +
"}," +
"bands:"+
"["+
" { minValue: "+str(vmin,10,5).Replace(",", ".")+", maxValue: "+str(vmax,10,5).Replace(",", ".")+", fillColor: 'green', opacity: 0.05 },"+
" { minValue: "+str(mu-3*sigma,10,5).Replace(",", ".")+", maxValue: "+str(mu+3*sigma,10,5).Replace(",", ".")+", fillColor: 'green', opacity: 0.1 }"+
"]"+
"}," +
"valueAxis:" +
"{" +
"visible: true," +
"title: { text: '' }," +
"labels: { visible: false }," +
"tickMarks : { visible: false}" +
"}," +
"colorScheme: 'scheme06'," +
"columnSeriesOverlap: false,"+
"seriesGroups:" +
"[" +
"{" +
"type: 'line'," +
"series: [" +
"{ dataField: 'Gauss', displayText: 'Normal',lineColor: 'red' }" +
"]" +
"}," +
"{" +
"type: 'column'," +
"columnsGapPercent: 75,"+
"series: [" +
"{ dataField: 'Misure', displayText: 'misure',lineColor: 'red' }" +
"]" +
"}" +
"]"
Chart.Settings=s
Parameter5=CPK