美文网首页
Labwindows/CVI 2019入门(8)——Strip

Labwindows/CVI 2019入门(8)——Strip

作者: 菜鸟笔记 | 来源:发表于2019-06-22 17:47 被阅读0次

Strip Chart控件

使用Strip Chart控件,可以实现绘制一条或多条动态曲线,并且能够及时更新,但是不支持像Graph控件那么多的图形类型(如几何图形、光标缩放和移动等)。个人感觉实时采集数据的显示场景,非常适合使用Strip Chart 。

Strip Chart控件有三种滚动模式(Scroll Mode):

  • Continuous 连续模式

  • Sweep 扫描模式

  • Block 块模式

Strip Chart控件主要函数

  1. 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。
  2. PlotStripChartPoint 函数:切记只能使用于只有一条Trace的Strip Chart.

    int PlotStripChartPoint (int panelHandle, int controlID, double y);

  3. ClearStripChart 函数:清除曲线。

    int ClearStripChart (int panelHandle, int controlID);

  4. GetTraceAttribute 函数:获取曲线属性。

    int GetTraceAttribute (int panelHandle, int controlID, int traceNumber, int traceAttribute, void *attributeValue);

  5. 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;
}

刷新方式演示

批量连续刷新
批量扫描刷新
批量块刷新
单点块刷新
单点扫描刷新
单点连续刷新

相关文章

网友评论

      本文标题:Labwindows/CVI 2019入门(8)——Strip

      本文链接:https://www.haomeiwen.com/subject/jgsvqctx.html