' 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