2019年12月16日

在Thingworx中绘制正态分布图


SPC分析中,正态分布图是使用较为频繁的图表。
本文介绍一下如何在Thingworx中绘制正态分布图。


如图所示,我们可以看到图表中包含:数据的分布情况(每个数据区间的数量),和参考正态分布曲线。

1.     绘图工具和注意项
我们可以用Label Chart工具来绘制图形。
注意不要选中“SingleDataSource”,这样我们可以引用两个数据源。
1个数据源引用自数据分布集,SeriesType1=Bar
2个数据源引用自正态分布集,SeriesType2=Line
两个数据集的X值应一致。
启用“YAxisAutoscale”,因为两个数据集的Y值是不一样的,自动缩放后数据会落到相同区间。

2.     数据分布计算
我们可以根据平均值和标准差来计算数据的分布。
标准差(σ)的计算可参考我的文章《Thingworx中的SPC计算工具》。
为了简化计算,我们选取常用的±3σ这个范围。
计算很简单,但是要注意一点:柱状图的X轴显示的是引用范围的起始值,但是我们在正态分布图中参考的是范围平均值,因此在最后,我们要把柱状图X轴加上0.5σ
下面是代码:
------------------------------------------------------------------------------
// To generate Histogram dataset for SPC
// Developed by Tallrain, Dec 2019
// Input
//    avg = Average
//    sd  = Standard Deviation
//    spcTable = SPC data, with field of SPC1 for data value
// Output
//    infoTable, with fields of value and count

var bar1 = avg-3*sd;
var bar2 = avg-2*sd;
var bar3 = avg-1*sd;
var bar4 = avg;
var bar5 = avg+1*sd;
var bar6 = avg+2*sd;
var bar7 = avg+3*sd;

var v1 = 0;
var v2 = 0;
var v3 = 0;
var v4 = 0;
var v5 = 0;
var v6 = 0;
//var v7 = 0;

var tableLength = spcTable.rows.length;
for (var x=0; x < tableLength; x++) {
    var row = spcTable.rows[x];
    var v = row.SPC1;
   if(v>=bar1 && v
   if(v>=bar2 && v
   if(v>=bar3 && v
   if(v>=bar4 && v
   if(v>=bar5 && v
   if(v>=bar6 && v  
}

bar1 = bar1 + sd*0.5;
bar2 = bar2 + sd*0.5;
bar3 = bar3 + sd*0.5;
bar4 = bar4 + sd*0.5;
bar5 = bar5 + sd*0.5;
bar6 = bar6 + sd*0.5;
bar7 = bar7 + sd*0.5;

// Output data
var params = {
    infoTableName : "InfoTable",
    dataShapeName : "DS_SPC_Histogram"
};

//CreateInfoTableFromDataShape(infoTableName:STRING("InfoTable"), dataShapeName:STRING):INFOTABLE(DS_SPC_CPK_OUT)
var spcOut = Resources["InfoTableFunctions"].CreateInfoTableFromDataShape(params);
spcOut.AddRow({value:bar1, count:v1});
spcOut.AddRow({value:bar2, count:v2});
spcOut.AddRow({value:bar3, count:v3});
spcOut.AddRow({value:bar4, count:v4});
spcOut.AddRow({value:bar5, count:v5});
spcOut.AddRow({value:bar6, count:v6});
//spcOut.AddRow({value:bar7, count:0});

var result = spcOut;
------------------------------------------------------------------------------

3.     正态分布计算
算法可参考WIKI
在这里为了和柱状图契合,我们按照每0.5σ为基础单位进行计算。
要说明的是,正态分布公式的值并不是概率,X区间和曲线相交的面积才是概率。
具体的值和平均值、标准差相关,所以在绘制图表时要允许Y轴自动绽放,这样两个图才能匹配。
下面是代码:
------------------------------------------------------------------------------
// Generate SPC Normal Distribution
// Developed by Tallrain, Nov 2019
// Input
//    u = Average
//    sd = Standard Deviation
// Output
//    infoTable, with field of x and np

// Create temp InfoTable for output
var params = {
    infoTableName : "InfoTable",
    dataShapeName : "DS_Normal_Distrib"
};

// CreateInfoTableFromDataShape(infoTableName:STRING("InfoTable"), dataShapeName:STRING):INFOTABLE(DS_Normal_Distrib)
var tempInfoTable = Resources["InfoTableFunctions"].CreateInfoTableFromDataShape(params);

// calculate normal distribution data
var e = Math.E; //2.71828182846;
var pi = Math.PI; // 3.14159265359;
for (var i=1; i <= 13; i++) {
    var x = (i-7)/2;
    x = u + x*sd;   
    var dividend = Math.pow(e, 0-((x-u)*(x-u)/(2*sd*sd)));
    var divisor = sd*Math.sqrt(2*pi);
    var np = dividend/divisor;
    //const dividend = Math.E ** -((value - this.mean) ** 2 / (2 * this.standardDeviation ** 2));
    //const divisor = this.standardDeviation * Math.sqrt(2 * Math.PI);
    //var np = 0-(x-u)*(x-u)/(2*sd*sd);
    //logger.info('np='+np);
    //np = Math.pow(e,np);
    //var np2 = sd*Math.sqrt(2*pi);
    //np = np/np2;
    //logger.info('np='+np);
    tempInfoTable.AddRow({x:x, np:np});   
}

var result = tempInfoTable;
//var result = Math.pow(3,2);
------------------------------------------------------------------------------


2019年12月9日

Thingworx的非官方扩展


我们知道PTC提供了官方商城: https://marketplace.ptc.com/
我们从官方商城可以下载很多常用的扩展,如JDBC Connector Extension、PTC ThingWorx-to-Windchill Connector、QRCode等。
这些扩展通常由PTC官方提供,也有一些是第三方的应用或解决方案如Callisto Digital Work Instructions。
但是官方商城的扩展很少。
PTC技术人员在论坛上推荐了另一个非官方扩展下载地址: https://github.com/ptc-iot-sharing
这是发布在github上的,大部分是开源包,基于Java或JavaScript开发,如有很多基于D3引擎开发的图形化数据展示工具。
大家可以尝试一下,当然稳定性方面可能和官方扩展有所差距。