将指标时间序列数据和指标对应的测点信息, 设备信息, 案例信息集成在一起放在结构体数组中(struct array), 便于索引.

原始数据举例:

lnfun.Line: 核心数据结构类 - 图1

必要field:

va: 是指标时间序列table, 一列时间measdate, 一列measvalue指标值, 其他列为自定义列, 可以将各种中间结果, 比如门限,报警挂在上面. 要求是这些列的元素的个数相同

feid: 指标id

datatype: 父指标的id. 如保持架指标是通过高加波形计算出来的, 他的父指标就是高加总值.

id: 指标在lines中的编号(暂时不使用);

parentid: 暂时不使用

ptidx: 测点序号(第几个测点)

cldyidx: 第几条测量定义计算的当前指标

position: 测点所在部件的测点模型编号

cdloc: 测点所在部件的部件模型编号

devguid: 设备guid. 该指标是哪台监测设备的数据计算的

isempty: va中是否为空.

pid: 指标对应的案例编号

其他field:

fename: 指标名称

Line的实例化

  1. lines=lnfun.Line(structdata); %将structdata包装成Line类.
emptylines=lnfun.Line(); %生成一个空的Line
  • structdata里的属性都是lines的动态属性. 如lines.feid
  • 原始的结构体数组保存在lines.data中
    (注意:避免在变量查看窗口中直接查看lines.data, 会使editor卡顿, 推荐使用lines.view来查看)

Line的筛选

[rst_lines,ia]=lines.select(Name,Value);
[rst_lines,ia]=lines.selectrows(Name,Value); %按一一对应来筛选, 要求value1, value2, value3 寸相同

Description

从lines中选出符合条件的子lines.

Input:

Name,Value 为变参键值对.
  • 支持的Name:
    • 所有的struct data的属性如feid, fename, datatype, cdloc, cldyidx, position, pid等
    • nthpt: 第几个测点
    • nthcd: 第几个测点模型
  • Value: 1xn 的数组或 1xn 的cell

Output:

rst_lines是筛选出的子lines. ia是子line在原始lines中的序号

Examples:

[line1,ia]=lines.select('nthpt',3,'nthcdloc',4,'feid',[110,111],'fename',{'a','b','c'}
% 筛选lines中的第3个测点, 第4个测点模型下feid=110或111的且femane为a或b或c的子lines

Examples:

[line1,ia]=lines.select('feid',[111,100]) 
%选出来的lines1的feid是按[111,100]的顺序排列的. 同样也会按照fename的顺序排列
 [rst_lines,ia]=lines.selectrows(Name,Value); %按一一对应来筛选, 要求value1, value2, value3 寸相同

Examples:

[line1,ia]=lines.select('ptidx',[1,2,3],'feid',[111,100,102]); 
%选出来的lines符合条件ptidx=1且feid=111, ptidx=2且feid=100, ptidx=3且feid=102的子lines
 [rst_lines,ia]=lines.view %显示lines的数据简报

lnfun.Line: 核心数据结构类 - 图2

Examples:

lines.tojson % 转成json string 的格式
lines.fromjson %从json转成lines
lines转json后, va里的数据会删除. 主要是为了保存测量定义相关索引信息
lines.tojson

ans =
    {"va":[],"feid":1,"align":0,"datatype":1,"id":1,"parentid":0,"ptidx":1,"cldyidx":2,"cdloc":1,"devguid":"e3bcfafb-6432-4861-93f5-184fffbe1a56","fename":"rawVelRms","pid":209}
lines.totable %转table, lines.va里的每一个field对应table的一列
lines.totensor();  %待实现
lines.tomatrix(); %转成矩阵

Line的索引操作

Examples: 取lines的各种属性

lines(1).feid  
lines(1:3).feid  
lines(lines.cdloc==3).fename
lines.feid   %取所有lines的feid, 放在数组中输出

Examples:取lines中的指标数据va, va是一个table

lines(i).va.measvalue(dvbin==1)
lines(i).va.measdate
lines(i).va.wid
lines(i).va.bb %va table里的其他列

Line的扩充

Examples:

lines(end+1)=lines(1); %将lines的第一个line,复制一份添加到lines的最后
line3=[line1;line2]; %将lines1和lines2合并

Examples:

%把多台设备的数据, 一起读到一个大的lines里. 当Line结构进行扩增时, 不会因为未预分配内存, 造成速度变慢
for i=1:n
    if i==1
        z=load([num2str(i),'.mat']);
        L=z.lines;
    else
        L=[L;z.lines];
    end
end

Examples:

lines.leftjoin({'feid','cdloc'},{'shortid'},feidmap); %将lines和feidmap这个table进行左连接, 给lines扩字段

Line的生成

Examples:

newline=oldline.new(struct_data) %将oldline中的va清空, 用struct_data填充, 返回给newline

Line的赋值

Examples:

lines(1).feid=1
lines(1:2).feid=1  % 把lines中的第一个和第二个line的feid都赋值为1
lines(1:2).feid=1:2  % 把lines中的第一个line的feid赋值1, 第二个line的feid赋值为2

lines(1).va.measvalue=1;
lines(end+1)=lines(1)
lines(1:3).fename='dd';
lines(1:3).fename={'dd','aa','cc'};

L.label=table(rand(10,1),rand(10,1)); % lines中增加一个字段, 且值为table.

Line的va操作/其他表格类数据的操作

lines(1).va.wv(:,1)=wvs % line.va里新增一个column

lines(1).label(:,:)=[] % line.label这个自定义字段的表格清空

Line的属性获取

Examples:

lines.fieldnames %line中有哪些字段
lines.len
lines.ptnum %获取lines中的测点数量.
lines.uniptidx %获取lines中所有的ptidx的去重的结果
lines.unicdloc %获取lines中所有的cdloc的去重的结果

Examples:

lines.data % 隐藏属性,

避免在变量查看窗口看原始的struct 数据, 会导致matlab非常卡

Line的数据操作

 I=lines.sort(sortkey,sortdirection); %将lines排序

sortkey : 1xn cells 或者 array.

sortdirection: 1xn array, 排序方向, 升序(1), 降序(2)

Examples:

newlines=lines.sort({'feid','cdloc'},[1,2]);
lines.convert_feid_to_fename(fenametb)

查找lines中的feid, 将fenametb表格里的fename填充回lines

lines.convert_feid_to_fename()

如果不给定fenametb, 将从缺省位置读取fename table

[tSyncTime,obj]=lines.syncronize(tSyncTime,allowSynWin,minSampleInterval,isFillMissing)

Examples:

lines.syncronize(t_reference,minutes(30)/days(1),minutes(5)/days(1),0);

将lines中的数据同步, 按照t_reference作为基准同步时刻. 最小同步时间5分钟. 最大同步时间30分钟

Examples:

[tsync]=lines.syncronize([],minutes(30)/days(1),minutes(5)/days(1),0);

将lines中的数据同步, 最小同步时间5分钟. 最大同步时间30分钟

GUI操作

TrendViewer(lines);

New Feature

2021-07-28

按照过滤条件批量处理lines中的va table.

% 批量va索引, 便于多指标的协同过滤, 如剔除误信号波形对应提取的指标.
L % lnfun.Line data: size(3x1)
L.va(1:10,:) % 依次对L的每一个lines中的va里面的table, 索引1:10行, 再包在cell里返回

ans =

  1×3 cell 数组

    {10×3 table}    {10×3 table}    {10×3 table}

% 批量va赋值
L.va=L.va(1:10,:);

创建一个lines的拷贝.

newline=lines.copy; %拷贝一个new line.

lines中添加一个表格字段

L.label=table(rand(10,1),rand(10,1)); % lines中增加一个字段, 且值为table.

L.label(:,:)=[] % line.label这个自定义字段的表格清空

将lines中的趋势数据批量打印成图片. (支持并行, 自定义布局和绘图函数)

lnfun.print_to_png(L,"enableParallel",1,"layout",[3,4],"trendplot_fcn",@my_trend_plot);