• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

工业控制研华板卡VC编程实现  

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 31次 | 进入软件测试论坛讨论

领测软件测试网

介绍
在论坛中经常有人提出关于研华工业用控制板卡的VC编程方法.此类板卡编程方法比较复杂,根据说明书上面说明我们可以采用两种编程方法,一种是自己编写控制各种寄存器代码进行数据的采集和输出,另外一种就是利用他封装的DLL的方法访问相应的函数进行完成.
    为了节省时间提高开发效率,当然使用第二种方法了.我们可以根据研华光盘里面提供的例子进行修改就可以完成了.

正文
1:A/D板编程实例(型号:PCL1754,通道:64)

//定义一个结构体变量保存64通道的DI信息
struct tagSYSTEMSTATE
{
    int nState;//DI状态
    BOOL bState;//是否为数字量接点
};
//初始化里面启动线程进行板卡的采集工作
void CMy11View::OnInitialUpdate()
{
    CView::OnInitialUpdate();
    
    m_Info = new tagSYSTEMSTATE[64];
    for(int i=0;i<64;i++)
    {  
        m_Info[i].nState = 0;
        m_Info[i].bState = FALSE;
    }
    
    unsigned int nDummy;
    m_pThread=(HANDLE) _beginthreadex(NULL,0,Main_Thread_DI,this,CREATE_SUSPENDED,&nDummy);//开辟DI线程
    
    if (!m_pThread)
        TRACE(_T(" Couldn@#t start a  thread\n"));
    else
        ResumeThread(m_pThread);  
}
//转线程进行采集的循环工作
UINT WINAPI CMy11View::Main_Thread_DI(LPVOID pParam)//控制DI线程
{  
    CMy11View * pView=(CMy11View *)pParam;
    while(1)
    {
        pView->ptDeviceReadDIByte();
        pView->nVal++;
        pView->ShowMsg();
        Sleep(10);
    }
    return 0;
}
//下面是调用DLL进行信号采集工作
void CMy11View::ptDeviceReadDIByte()
{
    SHORT       gnNumOfDevices;
    LONG        DriverHandle = (LONG)NULL;
    USHORT      gwChannel;
    static      PT_DioReadPortByte ptDioReadPortByte;
    USHORT      gwValue;  
    gnNumOfDevices = 1;
    DRV_DeviceOpen(gnNumOfDevices,//板号0;
        (LONG far *)&DriverHandle);
    for(gwChannel = 0; gwChannel < 8;gwChannel ++)
    {
        ptDioReadPortByte.port = gwChannel;//////////0-7通道号
        ptDioReadPortByte.value = (USHORT far *)&gwValue;
        DRV_DioReadPortByte(DriverHandle,
            (LPT_DioReadPortByte)&ptDioReadPortByte);
        gwValue=gwValue&0x00ff;/////////////////
        for(int j=0;j<8;j++)
        {
            if( (gwValue & (1<0)  
                m_Info[gwChannel*8+j].nState = 1;
            else
                m_Info[gwChannel*8+j].nState = 0;
        }
    }  
    DRV_DeviceClose((LONG far *)&DriverHandle);  
}
//下面将个通道点状态在界面输出,这里各位可以根据实际情况进行修改
void CMy11View::ShowMsg()
{
    CDC *pDC;
    pDC = GetDC();
    CRect rect;
    GetClientRect(&rect);
    CString strText;
    CBrush pNewBrush,*pOldBrush;
    pNewBrush.CreateSolidBrush(RGB(128,128,255));
    pOldBrush=pDC->SelectObject(&pNewBrush);
    pDC->FillRect(&rect,&pNewBrush);    
    COLORREF *oldCol;
    oldCol=(COLORREF *)pDC->SetTextColor(RGB(255,0,0));
    pDC->SetBkColor(RGB(128,128,255));
    pDC->TextOut(10,10,"采集模拟点显示信息:");
    strText.Format("线程采集程序运行了%d次",nVal);
    pDC->TextOut(10,35,strText);
    for(int i=0;i<64;i++)
    {
        strText.Format("第%.2d个结点的信息是:%d",i+1,m_Info[i].nState);
        int nHeight= (i/4)*25;
        int nWidth = (i%4)*180;
        pDC->TextOut(10+nWidth,70+nHeight,strText);
    }
    pDC->SelectObject(&oldCol);
    pDC->SelectObject(&pOldBrush);
    pNewBrush.DeleteObject();
    pDC->DeleteDC();
}
//到此,DI输入编程基本结束,输出方法类似,这里不在进行叙述了.
程序模拟演示界面可以见下:

//AD大致情况入DI,相应的主要不同在于板卡的采集程序,大致见下:
void CADDemoView::ptDeviceReadADByte()
{    
    USHORT      gwChannel = 0;                      // input channel
    float       gwValue;    
    SHORT       gnNumOfDevices;
    static      PT_AIConfig     ptAIConfig;     // structure for AIConfig table
    static      PT_AIVoltageIn  ptAIVoltageIn;  // structure for AIVoltageIn table
    static      PT_DeviceGetFeatures  ptDevFeatures;
    static      DEVFEATURES     DevFeatures;    // structure for device features
    
    gnNumOfDevices = 0;
    DRV_DeviceOpen(gnNumOfDevices,//板号0;
        (LONG far *)&DriverHandle);
    
    ptDevFeatures.buffer = (LPDEVFEATURES)&DevFeatures;
    ptDevFeatures.size = sizeof(DEVFEATURES);
    DRV_DeviceGetFeatures(DriverHandle,//句标市柄
        (LPT_DeviceGetFeatures)&ptDevFeatures);
    for(gwChannel = 0; gwChannel < 32;gwChannel ++)
    {
        Sleep(1);
        ptAIVoltageIn.chan = gwChannel;
        ptAIVoltageIn.gain = 0;
        ptAIVoltageIn.TrigMode = 0;               // internal trigger
        ptAIVoltageIn.voltage = (FLOAT far *)&gwValue;        
        DRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn);  
        m_Info[gwChannel].fState = gwValue;        
    }
    
    DRV_DeviceClose((LONG far *)&DriverHandle);
}

//其实VC编程研华板卡不是一件很困难的事情,在他提供的光盘里面有VC的实例,我们可以根据实例进行修改就可以完成了.如果有什么问题可以跟我联系:13975102873@hnmcc.com
正文完


延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网