Strip Chart控件
使用Strip Chart控件,可以实现绘制一条或多条动态曲线,并且能够及时更新,但是不支持像Graph控件那么多的图形类型(如几何图形、光标缩放和移动等)。个人感觉实时采集数据的显示场景,非常适合使用Strip Chart 。
Strip Chart控件有三种滚动模式(Scroll Mode):
-
Continuous 连续模式
-
Sweep 扫描模式
-
Block 块模式
Strip Chart控件主要函数
-
PlotStripChart 函数:向控件中绘制一条或多条曲线上的点。
函数原型:
int PlotStripChart (int panelHandle, int controlID, void *yArray, size_t numberOfPoints, int startingIndex, int skipCount, int yDataType);
- *yArray:显示点的存放数组。
- numberOfPoints:绘制曲线数据点数。
- startingIndex:数组y中开始绘图的索引号,默认值0。
- skipCount:绘制一组数据时跳过的数组z中的数据个数,默认值0。
-
PlotStripChartPoint 函数:切记只能使用于只有一条Trace的Strip Chart.
int PlotStripChartPoint (int panelHandle, int controlID, double y);
-
ClearStripChart 函数:清除曲线。
int ClearStripChart (int panelHandle, int controlID);
-
GetTraceAttribute 函数:获取曲线属性。
int GetTraceAttribute (int panelHandle, int controlID, int traceNumber, int traceAttribute, void *attributeValue);
-
SetTraceAttribute 函数:设定曲线属性。
int SetTraceAttribute (int panelHandle, int controlID, int traceNumber, int traceAttribute, int attributeValue);
控件应用实例
程序设计界面如下图。该实例练习,基本掌握了strip chart控件的使用方法。实现了如下功能:
-
单点或批量绘制曲线,批量绘制曲线特别适合高速采集应用场景。
-
曲线刷新模式可调,展示不同模式下的效果。
-
刷新频率可设定。
-
使用定时器实现自动连续刷新。
image.png
虽然是入门,但码这些个代码还是很费时间的,喜欢就点个小红心,鼓励一下!
全部源代码
#include <advanlys.h>
#include "toolbox.h"
#include <cvirte.h>
#include <userint.h>
#include "StripDemo01.h"
static int panelHandle;
int workMode=1;//工作模式定义
int plotPoint=1;//批量或单点绘制定义
int scrollMode=1;//刷新模式定义
double RefreshHz=10;//曲线刷新频率定义
static double y[200];//绘制点数据存储
double sinA[100];//Trace1数据存储
double sinB[100];//Trace2数据存储
static int count=0;//计数器
//生成两条曲线的数据点
void GenSinData()
{
SinePattern(100,10,0,4,sinA);
SinePattern(100,10,90.0,4,sinB);
for(int i=0;i<100;i++)
sinA[i] += 25;
}
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "StripDemo01.uir", PANEL)) < 0)
return -1;
//设置曲线图例名称
SetTraceAttributeEx (panelHandle, PANEL_STRIPCHART, 1, ATTR_TRACE_LG_TEXT, "曲线1");
SetTraceAttributeEx (panelHandle, PANEL_STRIPCHART, 2, ATTR_TRACE_LG_TEXT, "曲线2");
GenSinData();
SetCtrlVal(panelHandle,PANEL_NUMERICDIAL,RefreshHz);
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK panelCB (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_GOT_FOCUS:
break;
case EVENT_LOST_FOCUS:
break;
case EVENT_CLOSE:
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK btnExit (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}
//生成plotstripchart可用数据。
//提醒:多曲线数据不是使用多维数组,还是一维数组A-B-A-B-A-B-A-B存储。
void GeneratePoints()
{
if(plotPoint==1)
{
if(count>=100)
count=0;
y[0] = sinA[count];
y[1] = sinB[count];
count++;
}
else if(plotPoint==2)
{
for(int i=0;i<100;i++)
{
y[i*2] = sinA[i];
y[i*2+1] = sinB[i];
}
}
}
//绘制曲线
void PlotTraceLines()
{
GeneratePoints();
if(plotPoint==1)
{
//单点绘制
PlotStripChart(panelHandle,PANEL_STRIPCHART,y,2,0,0,VAL_DOUBLE);
}
else if(plotPoint==2)
{
//批量多点绘制
PlotStripChart(panelHandle,PANEL_STRIPCHART,y,200,0,0,VAL_DOUBLE);
}
}
int CVICALLBACK brtDraw (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
if(workMode==1)
{
//手动绘制模式
PlotTraceLines();
SetCtrlAttribute (panelHandle, PANEL_COMMANDBUTTON_3, ATTR_DIMMED, TRUE);
}
else if(workMode==2)
{
//自动绘制模式启动
SetCtrlAttribute(panelHandle,PANEL_TIMER,ATTR_ENABLED,TRUE);
SetCtrlAttribute (panelHandle, PANEL_COMMANDBUTTON_3, ATTR_DIMMED, FALSE);
}
break;
}
return 0;
}
int CVICALLBACK brtStopDraw (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
//停止自动绘制曲线
SetCtrlAttribute(panelHandle,PANEL_TIMER,ATTR_ENABLED,FALSE);
SetCtrlAttribute (panelHandle, PANEL_COMMANDBUTTON_3, ATTR_DIMMED, FALSE);
break;
}
return 0;
}
int CVICALLBACK RingWork (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
//获取工作模式设定
GetCtrlVal(panelHandle,PANEL_RINGSLIDE,&workMode);
break;
}
return 0;
}
int CVICALLBACK RingPoints (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
//获取单点或批量绘制设定
GetCtrlVal(panelHandle,PANEL_RINGSLIDE_2,&plotPoint);
break;
}
return 0;
}
int CVICALLBACK RingScroll (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
//获取刷新模式设定
GetCtrlVal(panelHandle,PANEL_RINGSLIDE_3,&scrollMode);
if(scrollMode==1)
{
//连续刷新模式
SetCtrlAttribute (panel, PANEL_STRIPCHART, ATTR_SCROLL_MODE, VAL_CONTINUOUS);
}
else if(scrollMode==2)
{
//扫描刷新模式
SetCtrlAttribute (panel, PANEL_STRIPCHART, ATTR_SCROLL_MODE, VAL_SWEEP);
}
else if(scrollMode==3)
{
//块刷新模式
SetCtrlAttribute (panel, PANEL_STRIPCHART, ATTR_SCROLL_MODE, VAL_BLOCK);
}
break;
}
return 0;
}
int CVICALLBACK UpdateTimer (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_TIMER_TICK:
PlotTraceLines();
break;
}
return 0;
}
int CVICALLBACK SetTimer (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
//获取刷新频率设定
GetCtrlVal(panelHandle,PANEL_NUMERICDIAL,&RefreshHz);
double hz = 1.0/ RefreshHz;//把频率转换为定时器时间间隔
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_INTERVAL, hz);
break;
}
return 0;
}
int CVICALLBACK btnClearChart (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
//清除曲线
ClearStripChart(panelHandle,PANEL_STRIPCHART);
break;
}
return 0;
}
刷新方式演示






网友评论