电脑教程中文网
首页  动态网站建设学习 程序  笑话  论坛 娱乐  交友 ADSL  峄城  成功者
中文名:电脑教程中文网,收集了大量的电脑教程! 编程技术文档 游戏开发 笑话站暂时关闭 设为首页
网页设计 HTML | Dreamweaver | CSS | Firework | FrontPage WEB开发 ASP | JSP | PHP | .NET | CGI | JS | VBS | XML | IIS6 | Apache | PWS
程序设计 Java | C++ |VC++ | C# | Delphi | VB | C语言 | 汇编 | Pascal | Perl 数据库 MSSQL | MySQL | Access | VF | Oracle | DB2 | SYBASE |
办公软件 Word | Excel | WPS | PowerPoint 动画平面 Photoshop | ACDSee | 3Dmax | Flash | Coreldraw |
操作系统 Windows 2000 | Windows XP | Windows 2003 | SCO Unix | Windows Vista | unix、Linux | 综合| 服务器 | 系统安全| 黑客技术
其  他 UltraDev | DOS | UML | PWS | Powerbuilder | 开发心得 | 设计理念 | 病毒库 | 其他 | LightTPD (分类排序给您带来不便请谅解)
推  荐: Java文档500篇》《ASP.NET与相关数据库技术高级指南》《TC图形函数详解》《C函数速查手册》《C语言编程宝典之一》《MFC深入浅出》《黑客零起点》《VC++ 编程指南》《JScript 用户指南》 《CSS教程宝典》《Microsoft Jet SQL 参考》《delphi技巧集合》《MySQL 4.1.0 中文参考手册》《MySQL中文手册
【导航】 您现在的位置 : 首页 - VC教程 - 《VC++精华技术文档收集(2)》- 援非洲刚果共和国电力监控系统VC实现三(基于MSCOMM控件的采集线程实现)

援非洲刚果共和国电力监控系统VC实现三(基于MSCOMM控件的采集线程实现)

日期:2005-8-16 10:30:09    作者:戚高   人气:   来源:网络




关键字 MSCOMM 线程 结构体
原作者姓名 戚高
文章原始出处 vczx.com

介绍
自从打算把援助刚果项目以文章的形式发表出来,但是由于功能模块较多,所以决定分块发表上来。但是由于工作紧张,所以在写了2遍文章之后就没有时间来续写下面的了。这个期间也有很多热心的读者给我很多宝贵的意见。我知道中间的很多文章对一些在VC领域有很多经验的人来说没有什么用,但是,我提倡的是技术共享的原则。可能一个你认为很简单的东西对一个初学者或者专注与这个方面的人来说是很有帮助的。如果每个人都能够将自己发表出来,那么,我们这对于我们大部分程序员来说将是一个很大的技术积累。

正文
前面2遍文章介绍了一个监控框架的实现和一种计量界面的模拟实现,这个文章我们讲一下基于MSCOMM控件的线程串口通讯的实现。串口通讯程序的编写方法一般有3中,第一种是基于MSCOMM控件的实现,第二种是用网络上面别人写的功能类实现Serial类,这个类功能比较强大,能够满足很多的通讯要求的。第三种就是自己写基于WIN32的API函数进行串口的程序。这种方法比较复杂。一般初学者喜欢用基于MSCOMM的控件方法实现串口通讯。
    在我进行的这个项目中,串口通讯程序只设计到与一种硬件装置的通讯,那个就是公司自行研发和生产的保护装置,这种装置应用于电力保护控制系统中,能够自动采集各种模拟量、数字量节点信息,并实现自动报警和基本控制。我们利用MSCOMM控件通讯的目的就是将设备上传来的模拟量,数字量信息和各种报警信息解包然后在界面(上位机)程序进行显示给工作人员就可以了,然后我们通过界面的关联处理方法再将工作人员的各种控制信息传递给外围设备就可以了。
    在一般的程序设计过程中,我们一般采用数据库作为数据交换的临时介质,尤其在多机多网程序中我们采用这种方法实现,但是这次由于当地条件限制,我们做的是相当于单机运行的程序,考虑到程序执行效率等方面因素,我没有采用SQL SERVER数据库,而是采用了ACCESS作为数据库。在进行数据量信息传递的时候,采用结构体传递参数的形式进行。这样程序运行的执行效率和实时性就跟上来了。
    程序具体实现如下:
    这次项目的外围设备由于通讯芯片采用的是自动送取报文而不是采用的应答方式,所以我们直接相应MSCOMM控件小心就可以对串口缓冲区进行数据的读工作了。
    相关准备工作:
    1、加入MSCOMM控件,然后定义对象并进行初始化
     //创建通讯控件
    m_Com.Create(NULL,WS_CHILD|WS_VISIBLE,CRect(0,0,10,10),this,ID_COMMCTRL);
    m_Com.SetCommPort(1);
    m_Com.SetInBufferSize(2000);
    m_Com.SetOutBufferSize(2000);
    if(!m_Com.GetPortOpen())
        m_Com.SetPortOpen(TRUE);
    m_Com.SetInputMode(1);
    m_Com.SetSettings("9600,n,8,1");
    m_Com.SetRThreshold(1);
    m_Com.SetInputLen(0);
    m_Com.SetInBufferCount(0);

    2、定义结构体:
struct ItemMsg{
    CString szName;              //设备名称标示
    float   fRealVal;             //实时记录数据
    float    fRealBuff[720];      //实时信息记录
    float   fHisVal[720];         //历史记录数据,用于曲线记录
    BOOL    bDigit;                 //是否为数字量节点
};

    3、定义变量对象
ItemMsg    *m_ItemMsg;
    4、初始化结构体信息(这里可以根据需要采用数据库组态的形式实现,将这些信息配置到数据库中,然后在程序初始化的时候读取相关信息然后进行自动配置就可以了)
void CYbkDemoView::InitbufferVal()
{
    this->m_ItemMsg = new ItemMsg[308];

    for(int i=0;i<308;i++)
    {
        m_ItemMsg[i].fRealVal = 0;
        m_ItemMsg[i].bDigit = FALSE;//初始化为模拟量接点
        for(int j=0;j<720;j++)
        {
            m_ItemMsg[i].fRealBuff[j] = 0.00f;
            m_ItemMsg[i].fHisVal[j] = 0.00f;
        }
    }
    
    m_ItemMsg[0].szName = "G3440";
    m_ItemMsg[0].bDigit = TRUE;
    m_ItemMsg[1].szName = "G3443";
    m_ItemMsg[1].bDigit = TRUE;
    m_ItemMsg[2].szName = "G3445";
    m_ItemMsg[2].bDigit = TRUE;
    m_ItemMsg[3].szName = "G3441";
    m_ItemMsg[3].bDigit = TRUE;
    m_ItemMsg[4].szName = "D344";
    m_ItemMsg[4].bDigit = TRUE;
    m_ItemMsg[5].szName = "城关线Ia";
    m_ItemMsg[6].szName = "城关线Ib";
    m_ItemMsg[7].szName = "城关线Ic";
    m_ItemMsg[8].szName = "城关线P";
    m_ItemMsg[9].szName = "城关线Q";
    m_ItemMsg[10].szName = "城关线COS";
    m_ItemMsg[11].szName = "城关线BIa";
    m_ItemMsg[12].szName = "城关线BIb";
    m_ItemMsg[13].szName = "城关线BIc";

    m_ItemMsg[14].szName = "G3430";
    m_ItemMsg[14].bDigit = TRUE;
    m_ItemMsg[15].szName = "G3433";
    m_ItemMsg[15].bDigit = TRUE;
    m_ItemMsg[16].szName = "G3435";
    m_ItemMsg[16].bDigit = TRUE;
    m_ItemMsg[17].szName = "G3431";
    m_ItemMsg[17].bDigit = TRUE;
    m_ItemMsg[18].szName = "D343";
    m_ItemMsg[18].bDigit = TRUE;
    m_ItemMsg[19].szName = "备用1线Ia";
    m_ItemMsg[20].szName = "备用1线Ib";
    m_ItemMsg[21].szName = "备用1线Ic";
    m_ItemMsg[22].szName = "备用1线P";
    m_ItemMsg[23].szName = "备用1线Q";
    m_ItemMsg[24].szName = "备用1线COS";
    m_ItemMsg[25].szName = "备用1线BIa";
    m_ItemMsg[26].szName = "备用1线BIb";
    m_ItemMsg[27].szName = "备用1线BIc";

    m_ItemMsg[28].szName = "G3420";
    m_ItemMsg[28].bDigit = TRUE;
    m_ItemMsg[29].szName = "G3423";
    m_ItemMsg[29].bDigit = TRUE;
    m_ItemMsg[30].szName = "G3425";
    m_ItemMsg[30].bDigit = TRUE;
    m_ItemMsg[31].szName = "G3421";
    m_ItemMsg[31].bDigit = TRUE;
    m_ItemMsg[32].szName = "D342";
    m_ItemMsg[32].bDigit = TRUE;
    m_ItemMsg[33].szName = "东门线Ia";
    m_ItemMsg[34].szName = "东门线Ib";
    m_ItemMsg[35].szName = "东门线Ic";
    m_ItemMsg[36].szName = "东门线P";
    m_ItemMsg[37].szName = "东门线Q";
    m_ItemMsg[38].szName = "东门线COS";
    m_ItemMsg[39].szName = "东门线BIa";
    m_ItemMsg[40].szName = "东门线BIb";
    m_ItemMsg[41].szName = "东门线BIc";

    m_ItemMsg[42].szName = "G3410";
    m_ItemMsg[42].bDigit = TRUE;
    m_ItemMsg[43].szName = "G3413";
    m_ItemMsg[43].bDigit = TRUE;
    m_ItemMsg[44].szName = "G3415";
    m_ItemMsg[44].bDigit = TRUE;
    m_ItemMsg[45].szName = "G3411";
    m_ItemMsg[45].bDigit = TRUE;
    m_ItemMsg[46].szName = "D341";
    m_ItemMsg[46].bDigit = TRUE;
    m_ItemMsg[47].szName = "马峰线Ia";
    m_ItemMsg[48].szName = "马峰线Ib";
    m_ItemMsg[49].szName = "马峰线Ic";
    m_ItemMsg[50].szName = "马峰线P";
    m_ItemMsg[51].szName = "马峰线Q";
    m_ItemMsg[52].szName = "马峰线COS";
    m_ItemMsg[53].szName = "马峰线BIa";
    m_ItemMsg[54].szName = "马峰线BIb";
    m_ItemMsg[55].szName = "马峰线BIc";

    m_ItemMsg[56].szName = "G3400";
    m_ItemMsg[56].bDigit = TRUE;
    m_ItemMsg[57].szName = "G3403";
    m_ItemMsg[57].bDigit = TRUE;
    m_ItemMsg[58].szName = "G3405";
    m_ItemMsg[58].bDigit = TRUE;
    m_ItemMsg[59].szName = "G3401";
    m_ItemMsg[59].bDigit = TRUE;
    m_ItemMsg[60].szName = "D340";
    m_ItemMsg[60].bDigit = TRUE;
    m_ItemMsg[61].szName = "黄家线Ia";
    m_ItemMsg[62].szName = "黄家线Ib";
    m_ItemMsg[63].szName = "黄家线Ic";
    m_ItemMsg[64].szName = "黄家线P";
    m_ItemMsg[65].szName = "黄家线Q";
    m_ItemMsg[66].szName = "黄家线COS";
    m_ItemMsg[67].szName = "黄家线BIa";
    m_ItemMsg[68].szName = "黄家线BIb";
    m_ItemMsg[69].szName = "黄家线BIc";

    //35KVPT1
    m_ItemMsg[70].szName = "G3451";
    m_ItemMsg[70].bDigit = TRUE;

    //1#主变
    m_ItemMsg[71].szName = "G3471";
    m_ItemMsg[71].bDigit = TRUE;
    m_ItemMsg[72].szName = "D347";
    m_ItemMsg[72].bDigit = TRUE;
    m_ItemMsg[73].szName = "D940";
    m_ItemMsg[73].bDigit = TRUE;
    m_ItemMsg[74].szName = "1#主变HIa";
    m_ItemMsg[75].szName = "1#主变HIb";
    m_ItemMsg[76].szName = "1#主变HIc";
    m_ItemMsg[77].szName = "1#主变LIa";
    m_ItemMsg[78].szName = "1#主变LIb";
    m_ItemMsg[79].szName = "1#主变LIc";

    //35KV母联
    m_ItemMsg[80].szName = "G3491";
    m_ItemMsg[80].bDigit = TRUE;
    m_ItemMsg[82].szName = "D349";
    m_ItemMsg[82].bDigit = TRUE;
    m_ItemMsg[83].szName = "G3493";
    m_ItemMsg[83].bDigit = TRUE;

    //2#主变
    m_ItemMsg[84].szName = "G3481";
    m_ItemMsg[84].bDigit = TRUE;
    m_ItemMsg[85].szName = "D348";
    m_ItemMsg[85].bDigit = TRUE;
    m_ItemMsg[86].szName = "D941";
    m_ItemMsg[86].bDigit = TRUE;
    m_ItemMsg[87].szName = "2#主变HIa";
    m_ItemMsg[88].szName = "2#主变HIb";
    m_ItemMsg[89].szName = "2#主变HIc";
    m_ItemMsg[90].szName = "2#主变LIa";
    m_ItemMsg[91].szName = "2#主变LIb";
    m_ItemMsg[92].szName = "2#主变LIc";

    m_ItemMsg[93].szName = "频率";

    //35KVPT2
    m_ItemMsg[94].szName = "G3461";
    m_ItemMsg[94].bDigit = TRUE;

    m_ItemMsg[95].szName = "D951";
    m_ItemMsg[95].bDigit = TRUE;
    m_ItemMsg[96].szName = "备用2线Ia";
    m_ItemMsg[97].szName = "备用2线Ib";
    m_ItemMsg[98].szName = "备用2线Ic";
    m_ItemMsg[99].szName = "备用2线P";
    m_ItemMsg[100].szName = "备用2线Q";
    m_ItemMsg[101].szName = "备用2线COS";
    m_ItemMsg[102].szName = "备用2线BIa";
    m_ItemMsg[103].szName = "备用2线BIb";
    m_ItemMsg[104].szName = "备用2线BIc";

    m_ItemMsg[105].szName = "D950";
    m_ItemMsg[105].bDigit = TRUE;
    m_ItemMsg[106].szName = "西城开关站线Ia";
    m_ItemMsg[107].szName = "西城开关站线Ib";
    m_ItemMsg[108].szName = "西城开关站线Ic";
    m_ItemMsg[109].szName = "西城开关站线P";
    m_ItemMsg[110].szName = "西城开关站线Q";
    m_ItemMsg[111].szName = "西城开关站线COS";
    m_ItemMsg[112].szName = "西城开关站线BIa";
    m_ItemMsg[113].szName = "西城开关站线BIb";
    m_ItemMsg[114].szName = "西城开关站线BIc";

    m_ItemMsg[115].szName = "D949";
    m_ItemMsg[115].bDigit = TRUE;
    m_ItemMsg[116].szName = "复烤厂III线Ia";
    m_ItemMsg[117].szName = "复烤厂III线Ib";
    m_ItemMsg[118].szName = "复烤厂III线Ic";
    m_ItemMsg[119].szName = "复烤厂III线P";
    m_ItemMsg[120].szName = "复烤厂III线Q";
    m_ItemMsg[121].szName = "复烤厂III线COS";
    m_ItemMsg[122].szName = "复烤厂III线BIa";
    m_ItemMsg[123].szName = "复烤厂III线BIb";
    m_ItemMsg[124].szName = "复烤厂III线BIc";

    m_ItemMsg[125].szName = "D948";
    m_ItemMsg[125].bDigit = TRUE;
    m_ItemMsg[126].szName = "岩西线Ia";
    m_ItemMsg[127].szName = "岩西线Ib";
    m_ItemMsg[128].szName = "岩西线Ic";
    m_ItemMsg[129].szName = "岩西线P";
    m_ItemMsg[130].szName = "岩西线Q";
    m_ItemMsg[131].szName = "岩西线COS";
    m_ItemMsg[132].szName = "岩西线BIa";
    m_ItemMsg[133].szName = "岩西线BIb";
    m_ItemMsg[134].szName = "岩西线BIc";

    m_ItemMsg[135].szName = "D947";
    m_ItemMsg[135].bDigit = TRUE;
    m_ItemMsg[136].szName = "白云民用线Ia";
    m_ItemMsg[137].szName = "白云民用线Ib";
    m_ItemMsg[138].szName = "白云民用线Ic";
    m_ItemMsg[139].szName = "白云民用线P";
    m_ItemMsg[140].szName = "白云民用线Q";
    m_ItemMsg[141].szName = "白云民用线COS";
    m_ItemMsg[142].szName = "白云民用线BIa";
    m_ItemMsg[143].szName = "白云民用线BIb";
    m_ItemMsg[144].szName = "白云民用线BIc";

    m_ItemMsg[145].szName = "D943";
    m_ItemMsg[145].bDigit = TRUE;
    m_ItemMsg[146].szName = "电容补偿柜线Ia";
    m_ItemMsg[147].szName = "电容补偿柜线Ib";
    m_ItemMsg[148].szName = "电容补偿柜线Ic";
    m_ItemMsg[149].szName = "电容补偿柜线P";
    m_ItemMsg[150].szName = "电容补偿柜线Q";
    m_ItemMsg[151].szName = "电容补偿柜线COS";
    m_ItemMsg[152].szName = "电容补偿柜线BIa";
    m_ItemMsg[153].szName = "电容补偿柜线BIb";
    m_ItemMsg[154].szName = "电容补偿柜线BIc";

    m_ItemMsg[155].szName = "D946";
    m_ItemMsg[155].bDigit = TRUE;
    m_ItemMsg[156].szName = "备用3线Ia";
    m_ItemMsg[157].szName = "备用3线Ib";
    m_ItemMsg[158].szName = "备用3线Ic";
    m_ItemMsg[159].szName = "备用3线P";
    m_ItemMsg[160].szName = "备用3线Q";
    m_ItemMsg[161].szName = "备用3线COS";
    m_ItemMsg[162].szName = "备用3线BIa";
    m_ItemMsg[163].szName = "备用3线BIb";
    m_ItemMsg[164].szName = "备用3线BIc";

    m_ItemMsg[165].szName = "D945";
    m_ItemMsg[165].bDigit = TRUE;
    m_ItemMsg[166].szName = "备用4线Ia";
    m_ItemMsg[167].szName = "备用4线Ib";
    m_ItemMsg[168].szName = "备用4线Ic";
    m_ItemMsg[169].szName = "备用4线P";
    m_ItemMsg[170].szName = "备用4线Q";
    m_ItemMsg[171].szName = "备用4线COS";
    m_ItemMsg[172].szName = "备用4线BIa";
    m_ItemMsg[173].szName = "备用4线BIb";
    m_ItemMsg[174].szName = "备用4线BIc";

    m_ItemMsg[175].szName = "D944";
    m_ItemMsg[175].bDigit = TRUE;
    m_ItemMsg[176].szName = "备用5线Ia";
    m_ItemMsg[177].szName = "备用5线Ib";
    m_ItemMsg[178].szName = "备用5线Ic";
    m_ItemMsg[179].szName = "备用5线P";
    m_ItemMsg[180].szName = "备用5线Q";
    m_ItemMsg[181].szName = "备用5线COS";
    m_ItemMsg[182].szName = "备用5线BIa";
    m_ItemMsg[183].szName = "备用5线BIb";
    m_ItemMsg[184].szName = "备用5线BIc";

    m_ItemMsg[185].szName = "35KV母线Ua";
    m_ItemMsg[186].szName = "35KV母线Ub";
    m_ItemMsg[187].szName = "35KV母线Uc";
    m_ItemMsg[188].szName = "35KV母线Uab";
    m_ItemMsg[189].szName = "10KV母线Ua";
    m_ItemMsg[190].szName = "10KV母线Ub";
    m_ItemMsg[191].szName = "10KV母线Uc";
    m_ItemMsg[192].szName = "10KV母线Uab";

    //计量缓冲区
    m_ItemMsg[193].szName = "城关线有功电能";
    m_ItemMsg[194].szName = "城关线无功电能";
    m_ItemMsg[195].szName = "城关线有功峰";
    m_ItemMsg[196].szName = "城关线有功谷";
    m_ItemMsg[197].szName = "城关线有功平";
    m_ItemMsg[198].szName = "城关线有功尖峰";

    m_ItemMsg[199].szName = "东门线有功电能";
    m_ItemMsg[200].szName = "东门线无功电能";
    m_ItemMsg[201].szName = "东门线有功峰";
    m_ItemMsg[202].szName = "东门线有功谷";
    m_ItemMsg[203].szName = "东门线有功平";
    m_ItemMsg[204].szName = "东门线有功尖峰";

    m_ItemMsg[205].szName = "备份1线有功电能";
    m_ItemMsg[206].szName = "备份1线无功电能";
    m_ItemMsg[207].szName = "备份1线有功峰";
    m_ItemMsg[208].szName = "备份1线有功谷";
    m_ItemMsg[209].szName = "备份1线有功平";
    m_ItemMsg[210].szName = "备份1线有功尖峰";

    m_ItemMsg[211].szName = "马峰线有功电能";
    m_ItemMsg[212].szName = "马峰线无功电能";
    m_ItemMsg[213].szName = "马峰线有功峰";
    m_ItemMsg[214].szName = "马峰线有功谷";
    m_ItemMsg[215].szName = "马峰线有功平";
    m_ItemMsg[216].szName = "马峰线有功尖峰";

    m_ItemMsg[217].szName = "黄家线有功电能";
    m_ItemMsg[218].szName = "黄家线无功电能";
    m_ItemMsg[219].szName = "黄家线有功峰";
    m_ItemMsg[220].szName = "黄家线有功谷";
    m_ItemMsg[221].szName = "黄家线有功平";
    m_ItemMsg[222].szName = "黄家线有功尖峰";

    m_ItemMsg[223].szName = "备份2线有功电能";
    m_ItemMsg[224].szName = "备份2线无功电能";
    m_ItemMsg[225].szName = "备份2线有功峰";
    m_ItemMsg[226].szName = "备份2线有功谷";
    m_ItemMsg[227].szName = "备份2线有功平";
    m_ItemMsg[228].szName = "备份2线有功尖峰";

    m_ItemMsg[229].szName = "西城开关站线有功电能";
    m_ItemMsg[230].szName = "西城开关站线无功电能";
    m_ItemMsg[231].szName = "西城开关站线有功峰";
    m_ItemMsg[232].szName = "西城开关站线有功谷";
    m_ItemMsg[233].szName = "西城开关站线有功平";
    m_ItemMsg[234].szName = "西城开关站线有功尖峰";

    m_ItemMsg[235].szName = "复烤厂III线有功电能";
    m_ItemMsg[236].szName = "复烤厂III线无功电能";
    m_ItemMsg[237].szName = "复烤厂III线有功峰";
    m_ItemMsg[238].szName = "复烤厂III线有功谷";
    m_ItemMsg[239].szName = "复烤厂III线有功平";
    m_ItemMsg[240].szName = "复烤厂III线有功尖峰";

    m_ItemMsg[241].szName = "岩西线有功电能";
    m_ItemMsg[242].szName = "岩西线无功电能";
    m_ItemMsg[243].szName = "岩西线有功峰";
    m_ItemMsg[244].szName = "岩西线有功谷";
    m_ItemMsg[245].szName = "岩西线有功平";
    m_ItemMsg[246].szName = "岩西线有功尖峰";

    m_ItemMsg[247].szName = "白云民用线有功电能";
    m_ItemMsg[248].szName = "白云民用线无功电能";
    m_ItemMsg[249].szName = "白云民用线有功峰";
    m_ItemMsg[250].szName = "白云民用线有功谷";
    m_ItemMsg[251].szName = "白云民用线有功平";
    m_ItemMsg[252].szName = "白云民用线有功尖峰";

    m_ItemMsg[253].szName = "电容补偿柜线有功电能";
    m_ItemMsg[254].szName = "电容补偿柜线无功电能";
    m_ItemMsg[255].szName = "电容补偿柜线有功峰";
    m_ItemMsg[256].szName = "电容补偿柜线有功谷";
    m_ItemMsg[257].szName = "电容补偿柜线有功平";
    m_ItemMsg[258].szName = "电容补偿柜线有功尖峰";

    m_ItemMsg[259].szName = "备份3线有功电能";
    m_ItemMsg[260].szName = "备份3线无功电能";
    m_ItemMsg[261].szName = "备份3线有功峰";
    m_ItemMsg[262].szName = "备份3线有功谷";
    m_ItemMsg[263].szName = "备份3线有功平";
    m_ItemMsg[264].szName = "备份3线有功尖峰";

    m_ItemMsg[265].szName = "备份4线有功电能";
    m_ItemMsg[266].szName = "备份4线无功电能";
    m_ItemMsg[267].szName = "备份4线有功峰";
    m_ItemMsg[268].szName = "备份4线有功谷";
    m_ItemMsg[269].szName = "备份4线有功平";
    m_ItemMsg[270].szName = "备份4线有功尖峰";

    m_ItemMsg[271].szName = "备份5线有功电能";
    m_ItemMsg[272].szName = "备份5线无功电能";
    m_ItemMsg[273].szName = "备份5线有功峰";
    m_ItemMsg[274].szName = "备份5线有功谷";
    m_ItemMsg[275].szName = "备份5线有功平";
    m_ItemMsg[276].szName = "备份5线有功尖峰";

    m_ItemMsg[277].szName = "D942";

    m_ItemMsg[278].szName = "1#主变Ia";
    m_ItemMsg[279].szName = "1#主变Ib";
    m_ItemMsg[280].szName = "1#主变Ic";
    m_ItemMsg[281].szName = "1#主变P";
    m_ItemMsg[282].szName = "1#主变Q";
    m_ItemMsg[283].szName = "1#主变COS";
    m_ItemMsg[284].szName = "1#主变BIa";
    m_ItemMsg[285].szName = "1#主变BIb";
    m_ItemMsg[286].szName = "1#主变BIc";

    m_ItemMsg[287].szName = "2#主变Ia";
    m_ItemMsg[288].szName = "2#主变Ib";
    m_ItemMsg[289].szName = "2#主变Ic";
    m_ItemMsg[290].szName = "2#主变P";
    m_ItemMsg[291].szName = "2#主变Q";
    m_ItemMsg[292].szName = "2#主变COS";
    m_ItemMsg[293].szName = "1#主变BIa";
    m_ItemMsg[294].szName = "1#主变BIb";
    m_ItemMsg[295].szName = "1#主变BIc";

    m_ItemMsg[296].szName = "刀闸1";
    m_ItemMsg[297].szName = "刀闸2";
    m_ItemMsg[298].szName = "刀闸3";
    m_ItemMsg[299].szName = "刀闸4";
    m_ItemMsg[300].szName = "刀闸5";
    m_ItemMsg[301].szName = "刀闸6";
    m_ItemMsg[302].szName = "刀闸7";
    m_ItemMsg[303].szName = "刀闸8";
    m_ItemMsg[304].szName = "刀闸9";
    m_ItemMsg[305].szName = "刀闸10";
    m_ItemMsg[306].szName = "刀闸11";
    m_ItemMsg[307].szName = "刀闸12";
}

    5、定义线程,并在初始化中启动采集程序
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 CYbkDemoView::Main_Thread_DI(LPVOID pParam)//保护单元采集程序
{
    CYbkDemoView * pView = (CYbkDemoView *)pParam;
    while(1)
    {  
        pView->SetComVal(); //设置串口命令
        Sleep(10);
    }
    return 0;
}

    6、编写发送MSCOMM端口命令子程序
void CYbkDemoView::OnMsgcommSend(BYTE Outbuff[])
{
    CByteArray array;
    array.RemoveAll();
    int Count=12;
    array.SetSize(Count);
    for(int i=0;i        array.SetAt(i,Outbuff[i]);
    m_Com.SetOutput(COleVariant(array));
}

    7、触发OnCommMscomm消息。(这里根据设置串口到达的字符数来触发相应消息)
afx_msg void OnCommMscomm();//定义

BEGIN_EVENTSINK_MAP(CYbkDemoView,CView)
    ON_EVENT(CYbkDemoView,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE)
END_EVENTSINK_MAP()

void CYbkDemoView::OnCommMscomm()//串口监视程序
{
    VARIANT vResponse;
    int k,nEvent;
    char * str;
    nEvent=m_Com.GetCommEvent();
    switch(nEvent)
    {
    case 2:
        k=m_Com.GetInBufferCount();
        //******************发送分闸等命令处理回送报文***********
        if(k == 4)//是否返回特定代码OK
        {
            vResponse=m_Com.GetInput();
            str=(char *)(unsigned char *)vResponse.parray->pvData;
            for(int i=0;i<4;i++)
                m_Inbuff[i]=(BYTE)(*(str+i));  
            if(m_Inbuff[0]==0x41 && m_Inbuff[1]==0x43 && m_Inbuff[2]==0x4b && m_Inbuff[3]==0x00)
            {
                m_Com.SetInBufferCount(0);
                bProcessed = TRUE;
            }
        }
        //********************************************************
        //******************发送要数据命令处理回送报文***********
        if(k == 1248)//接受保护单元内容
        {  
            vResponse=m_Com.GetInput();
            str=(char *)(unsigned char *)vResponse.parray->pvData;
            for(int i=0;i<1254;i++)
                m_Inbuff[i]=(BYTE)(*(str+i));
            DataProcessS();
            m_Com.SetInBufferCount(0);//清空缓冲区
            SetDevMsg();//传递参数到功能类
            bProcessed = TRUE;
        }
        //********************************************************
        //******************发送定值命令处理回送报文***********
        if(k == 102)//接受保护单元内容(查询定值)
        {
            vResponse=m_Com.GetInput();
            str=(char *)(unsigned char *)vResponse.parray->pvData;
            for(int i=0;i<102;i++)
                m_Inbuff[i]=(BYTE)(*(str+i));
            if(DataProcessDefine())
            {
                m_Com.SetInBufferCount(0);//清空缓冲区
                bProcessed = TRUE;
            }
        }  
        if(k == 264)//处理电度
        {
            vResponse=m_Com.GetInput();
            str=(char *)(unsigned char *)vResponse.parray->pvData;
            for(int i=0;i<264;i++)
                m_Inbuff[i]=(BYTE)(*(str+i));
            if(DataProcess_DD())
            {
                m_Com.SetInBufferCount(0);//清空缓冲区
                bProcessed = TRUE;
            }
        }      
        break;
        //********************************************************
    case 3:
        break;
    case 4:
        break;
    case 5:
        break;
    case 6:
        break;
    default:break;
    }
}

void CYbkDemoView::DataProcess_MNL(BYTE Buff[],int nPos,int nAddr)
{
    float fVal[16];
    for(int i=0;i<16;i++)
        fVal[i] = this->m_DataWnd.GetBuffVal(m_Inbuff+18+nAddr*52,nZBKType[nAddr],i);        
    int nBaseNum = 0;
    if(nAddr == 0) nBaseNum = 136;     if(nAddr == 1) nBaseNum = 96;
    if(nAddr == 2) nBaseNum = 156;    if(nAddr == 3) nBaseNum = 166;
    if(nAddr == 4) nBaseNum = 146;    if(nAddr == 5) nBaseNum = 176;
    if(nAddr == 6) nBaseNum = 106;    if(nAddr == 7) nBaseNum = 116;
    if(nAddr == 8) nBaseNum = 126;    if(nAddr == 15) nBaseNum = 61;
    if(nAddr == 11) nBaseNum = 278;    if(nAddr == 13) nBaseNum = 287;
    if(nAddr == 16) nBaseNum = 47;  if(nAddr == 17) nBaseNum = 19;
    if(nAddr == 18) nBaseNum = 33;  if(nAddr == 19) nBaseNum = 5;
    if(nBaseNum !=0)
    {
        m_ItemMsg[nBaseNum+3].fRealVal = fVal[0];
        m_ItemMsg[nBaseNum+4].fRealVal = fVal[1];
        m_ItemMsg[nBaseNum+5].fRealVal = fVal[2];
        m_ItemMsg[nBaseNum].fRealVal   = fVal[3];
        m_ItemMsg[nBaseNum+1].fRealVal = fVal[4];
        m_ItemMsg[nBaseNum+2].fRealVal = fVal[5];
        m_ItemMsg[nBaseNum+6].fRealVal = fVal[10];
        m_ItemMsg[nBaseNum+7].fRealVal = fVal[11];
        if(nAddr >14 && nAddr <20)
            m_ItemMsg[nBaseNum+7].fRealVal = 0.00f;        
        m_ItemMsg[nBaseNum+8].fRealVal = fVal[12];
    }
    ///
    if(nAddr == 10 || nAddr == 12)
    {
        int nBaseNum = 0;
        if(nAddr == 10) nBaseNum = 74;    
        if(nAddr == 12) nBaseNum = 87;
        if(nBaseNum !=0)
        {
            m_ItemMsg[nBaseNum].fRealVal   = fVal[3];
            m_ItemMsg[nBaseNum+1].fRealVal = fVal[4];
            m_ItemMsg[nBaseNum+2].fRealVal = fVal[5];
            m_ItemMsg[nBaseNum+3].fRealVal = fVal[13];
            m_ItemMsg[nBaseNum+4].fRealVal = fVal[14];
            m_ItemMsg[nBaseNum+5].fRealVal = fVal[15];
        }
    }
    ///
    if(nAddr == 22 || nAddr == 23)
    {
        int nBaseNum = 0;
        if(nAddr == 22)
        {
            nBaseNum = 189;
            if(nBaseNum !=0)
            {
                m_ItemMsg[nBaseNum].fRealVal   = fVal[0];
                m_ItemMsg[nBaseNum+1].fRealVal = fVal[1];
                m_ItemMsg[nBaseNum+2].fRealVal = fVal[2];
                m_ItemMsg[nBaseNum+3].fRealVal = fVal[3];
            }
            float f;
            f=((m_Inbuff[16+nAddr*52]>>4)&0x0f)*10+((m_Inbuff[16+nAddr*52])&0x0f)
                +float(((m_Inbuff[17+nAddr*52])>>4)&0x0f)/10+float((m_Inbuff[17+nAddr*52])&0x0f)/100;
            m_ItemMsg[93].fRealVal = f;
        }
        if(nAddr == 23)
        {
            nBaseNum = 185;
            if(nBaseNum !=0)
            {
                m_ItemMsg[nBaseNum].fRealVal   = fVal[0];
                m_ItemMsg[nBaseNum+1].fRealVal = fVal[1];
                m_ItemMsg[nBaseNum+2].fRealVal = fVal[2];
                m_ItemMsg[nBaseNum+3].fRealVal = fVal[3];
            }
        }
    }
}

void CYbkDemoView::DataProcess_KG(BYTE Buff,int nAddr)
{
    int ZSD=0,ZSD1=0,ZSD2=0,ZSD3=0,ZSD6=0,ZSD4=0,ZSD5=0,ZSD7=0,ZSD8=0;
    ZSD = Buff;    
    ZSD1 = ZSD&0x01;
    ZSD2 = (ZSD>>1)&0x01;
    ZSD3 = (ZSD>>2)&0x01;
    ZSD4 = (ZSD>>3)&0x01;
    ZSD5 = (ZSD>>4)&0x01;
    ZSD6 = (ZSD>>5)&0x01;
    ZSD7 = (ZSD>>6)&0x01;
    ZSD8 = (ZSD>>7)&0x01;
    
    if(ZSD1 == 1 && ZSD2 == 0) //合闸状态
    {
        if(nAddr == 0) m_ItemMsg[135].fRealVal = 1;
        if(nAddr == 1) m_ItemMsg[95].fRealVal = 1;
        if(nAddr == 2) m_ItemMsg[155].fRealVal = 1;
        if(nAddr == 3) m_ItemMsg[165].fRealVal = 1;
        if(nAddr == 4) m_ItemMsg[145].fRealVal = 1;
        if(nAddr == 5) m_ItemMsg[175].fRealVal = 1;
        if(nAddr == 6) m_ItemMsg[105].fRealVal = 1;
        if(nAddr == 7) m_ItemMsg[115].fRealVal = 1;
        if(nAddr == 8) m_ItemMsg[125].fRealVal = 1;
        if(nAddr == 10) m_ItemMsg[72].fRealVal = 1;
        if(nAddr == 11) m_ItemMsg[73].fRealVal = 1;
        if(nAddr == 12) m_ItemMsg[85].fRealVal = 1;
        if(nAddr == 13) m_ItemMsg[86].fRealVal = 1;
        if(nAddr == 15) m_ItemMsg[60].fRealVal = 1;
        if(nAddr == 16) m_ItemMsg[46].fRealVal = 1;
        if(nAddr == 17) m_ItemMsg[18].fRealVal = 1;
        if(nAddr == 18) m_ItemMsg[32].fRealVal = 1;
        if(nAddr == 19) m_ItemMsg[4].fRealVal = 1;
        if(nAddr == 20) m_ItemMsg[277].fRealVal = 1;
        if(nAddr == 21) m_ItemMsg[82].fRealVal = 1;
    }
    if(ZSD1 == 0 && ZSD2 == 1) //分闸状态
    {
        if(nAddr == 0) m_ItemMsg[135].fRealVal = 0;
        if(nAddr == 1) m_ItemMsg[95].fRealVal = 0;
        if(nAddr == 2) m_ItemMsg[155].fRealVal = 0;
        if(nAddr == 3) m_ItemMsg[165].fRealVal = 0;
        if(nAddr == 4) m_ItemMsg[145].fRealVal = 0;
        if(nAddr == 5) m_ItemMsg[175].fRealVal = 0;
        if(nAddr == 6) m_ItemMsg[105].fRealVal = 0;
        if(nAddr == 7) m_ItemMsg[115].fRealVal = 0;
        if(nAddr == 8) m_ItemMsg[125].fRealVal = 0;
        if(nAddr == 10) m_ItemMsg[72].fRealVal = 0;
        if(nAddr == 11) m_ItemMsg[73].fRealVal = 0;
        if(nAddr == 12) m_ItemMsg[85].fRealVal = 0;
        if(nAddr == 13) m_ItemMsg[86].fRealVal = 0;
        if(nAddr == 15) m_ItemMsg[60].fRealVal = 0;
        if(nAddr == 16) m_ItemMsg[46].fRealVal = 0;
        if(nAddr == 17) m_ItemMsg[18].fRealVal = 0;
        if(nAddr == 18) m_ItemMsg[32].fRealVal = 0;
        if(nAddr == 19) m_ItemMsg[4].fRealVal = 0;
        if(nAddr == 20) m_ItemMsg[277].fRealVal = 0;
        if(nAddr == 21) m_ItemMsg[82].fRealVal = 0;
    }
    if((ZSD1 == 1 && ZSD2 == 1)||(ZSD1 == 0 && ZSD2 == 0)) //错误状态
    {
        if(nAddr == 0) m_ItemMsg[135].fRealVal = 2;
        if(nAddr == 1) m_ItemMsg[95].fRealVal = 2;
        if(nAddr == 2) m_ItemMsg[155].fRealVal = 2;
        if(nAddr == 3) m_ItemMsg[165].fRealVal = 2;
        if(nAddr == 4) m_ItemMsg[145].fRealVal = 2;
        if(nAddr == 5) m_ItemMsg[175].fRealVal = 2;
        if(nAddr == 6) m_ItemMsg[105].fRealVal = 2;
        if(nAddr == 7) m_ItemMsg[115].fRealVal = 2;
        if(nAddr == 8) m_ItemMsg[125].fRealVal = 2;
        if(nAddr == 10) m_ItemMsg[72].fRealVal = 2;
        if(nAddr == 11) m_ItemMsg[73].fRealVal = 2;
        if(nAddr == 12) m_ItemMsg[85].fRealVal = 2;
        if(nAddr == 13) m_ItemMsg[86].fRealVal = 2;
        if(nAddr == 15) m_ItemMsg[60].fRealVal = 2;
        if(nAddr == 16) m_ItemMsg[46].fRealVal = 2;
        if(nAddr == 17) m_ItemMsg[18].fRealVal = 2;
        if(nAddr == 18) m_ItemMsg[32].fRealVal = 2;
        if(nAddr == 19) m_ItemMsg[4].fRealVal = 2;
        if(nAddr == 20) m_ItemMsg[277].fRealVal = 2;
        if(nAddr == 21) m_ItemMsg[82].fRealVal = 2;
    }
}

。。。。。
float CDataProcessWnd::GetBuffVal(BYTE Buff[], int nZBKType,int nPos)
{
    float fVal = 0.00f;
    //************************************************
    if(nZBKType == 11 || nZBKType == 13 || nZBKType == 20
        || nZBKType == 21 || nZBKType == 30)
    {
        if(nPos < 10)
        {
            fVal = float(Buff[0+nPos*2]+(Buff[1+nPos*2]<<8));
            if(nPos == 2)
            {
                float fTemp1,fTemp2;
                fTemp1 = float(Buff[0]+(Buff[1]<<8));
                fTemp2 = float(Buff[2]+(Buff[3]<<8));
                if(fTemp1*fTemp1+fTemp2*fTemp2 == 0)
                    fVal = 0.00f;
                else
                    fVal = float(fTemp1)/float(sqrt(fTemp1*fTemp1+fTemp2*fTemp2));
            }
            if(nPos == 0 || nPos == 1)
            {
                if(Buff[-9] == 0)
                    fVal = -fVal;
            }
        }
        else
            fVal = (Buff[0+nPos*2]&0x0f)*10+((Buff[0+nPos*2]>>4)&0x0f)*100
                +((Buff[1+nPos*2]>>4)&0x0f)+float(Buff[1+nPos*2]&0x0f)/10;
    }
    //************************************************
    if(nZBKType == 10 || nZBKType == 60)
    {
        if(nPos < 10)
        {
            fVal = 0.00f;
            if(nPos == 3 || nPos == 4 || nPos == 5)
                fVal = (Buff[0+nPos*2]&0x0f)*10+((Buff[0+nPos*2]>>4)&0x0f)*100
                    +((Buff[1+nPos*2]>>4)&0x0f)+float(Buff[1+nPos*2]&0x0f)/10;
        }
        else
            fVal = (Buff[0+nPos*2]&0x0f)*10+((Buff[0+nPos*2]>>4)&0x0f)*100
                +((Buff[1+nPos*2]>>4)&0x0f)+float(Buff[1+nPos*2]&0x0f)/10;
    }
    //************************************************
    if(nZBKType == 50)
    {
        if(nPos < 10)
            fVal = (Buff[0+nPos*2]&0x0f)*10+((Buff[0+nPos*2]>>4)&0x0f)*100
                +((Buff[1+nPos*2]>>4)&0x0f)+float(Buff[1+nPos*2]&0x0f)/10;
        else
        {
            fVal = 0.00f;
            if(nPos == 10)
            {
                fVal = (Buff[0+nPos*2]&0x0f)+((Buff[0+nPos*2]>>4)&0x0f)*10
                    +float((Buff[1+nPos*2]>>4)&0x0f)/10+float(Buff[1+nPos*2]&0x0f)/100;
                fVal = float((fVal/50.20)*50);
            }
        }
    }
    //************************************************
    if(nZBKType == 62 )
    {
        if(nPos < 10)
            fVal = float(Buff[0+nPos*2]+(Buff[1+nPos*2]<<8));  
        else
            fVal = (Buff[0+nPos*2]&0x0f)*10+((Buff[0+nPos*2]>>4)&0x0f)*100
                +((Buff[1+nPos*2]>>4)&0x0f)+float(Buff[1+nPos*2]&0x0f)/10;
    }
    //************************************************
    if(nZBKType == 66 )
    {
        fVal = 0.00f;
        if(nPos == 0 || nPos ==1)
            fVal = float(Buff[0+nPos*2]+(Buff[1+nPos*2]<<8));
        if(nPos == 1 || nPos == 4 || nPos == 6)
            fVal = (Buff[0+nPos*2]&0x0f)+((Buff[0+nPos*2]>>4)&0x0f)*10
                +float((Buff[1+nPos*2]>>4)&0x0f)/10+float(Buff[1+nPos*2]&0x0f)/100;
        if(nPos == 3 || nPos == 5)
            fVal = (Buff[0+nPos*2]&0x0f)*10+((Buff[0+nPos*2]>>4)&0x0f)*100
                +((Buff[1+nPos*2]>>4)&0x0f)+float(Buff[1+nPos*2]&0x0f)/10;
    }
    return fVal;
}


正文完

 




网站首页 - 友情链接 - 公司简介 - 联系方式 - 广告投放 - 客户服务 - 错误报告 - 免责声明 - About us
CLDE.NET电脑教程中文网版权所有 未经许可禁止镜象和复制本站资料 MSN:CLDE_NET@hotmail.com
技术支持:CLDE.NET信息中心 鲁ICP备05039940号 友情链接QQ:784079(隐)