来宝网移动站

真空测量和控制系统

来宝网 2010/7/19点击2415次

 

开发真空测量与控制系统

VC++下用MSComm控件实现PG500真空计与PC机的通讯

0 引言

上海易川真空有限技术公司推出的PG500真空计产品是可以和PC机、PLC、单片机系统、组态软件--组态王等上位机进行通讯的。本文建立PG500真空计与PC机的通讯,可以实现真空计的压力值显示、远程操作、状态控制、数据处理等功能。本文介绍了在基于对话框的MFC应用程序中应用MSComm控件编程实现PG500真空计串口与PC机串口的控制代码,并加入了测量数据的数据库处理(如将真空计压力数值记录在Excel表格中等)。

1 硬件连接

PG500真空计的通讯接口为RS-485串行接口,而PC机上为RS-232-C串口,所以事前准备好了RS-485RS-232-C的转换器,连接方式如右图

2 软件代码

这里总结一下用MSComm控件进行串口编程的基本步骤:

ü  在建立的工程中插入MSComm控件

ü  添加MSComm控件ID的控制变量或对象

ü  对串口进行初始化,设置MSComm控件的属性

ü  添加串口事件的消息处理函数OnComm()函数,在函数中根据应用需要,编写数据 处理代码

ü  编写串口发送等其他代码

ü  关闭串口

2.1 创建工程并添加MSComm控件

建立首先打开VC 6.0,建立一个基于对话框的MFC应用程序:PG500。在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对 Windows 通讯驱动程序的 API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。

2.2初始化串口:设置MSComm控件的属性

CPG500Dlg::OnInitDialog()函数中写入对串口的初始化语句:

      //串口初始化

      m_DM100Comm.SetCommPort(1);//选择COM1

      m_DM100Comm.SetInputMode(1);//输入方式为二进制方式

      m_DM100Comm.SetInBufferSize(1024);//设置输入缓冲区大小

     m_DM100Comm.SetOutBufferSize(512);//设置输出缓冲区大小

      m_DM100Comm.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数//据位,1个停止位

      if (!m_DM100Comm.GetPortOpen())//如果串口没有打开则打开

           m_DM100Comm.SetPortOpen(TRUE);//打开串口

     else

           AfxMessageBox("串口已打开或不存在");

      m_DM100Comm.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将//引发接收数据的OnComm事件

      m_DM100Comm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读

      m_DM100Comm.GetInput();//先预读缓冲区以清除残留数据

2.3添加串口事件消息处理函数

MSComm控件一般用事件驱动方式来从串口接收数据,也就是消息处理,当串口有时间发生时,程序调用消息函数来处理数据。

void CDM100Dlg::OnComm()

{

      // TODO: Add your control notification handler code here

      VARIANT m_input;

      COleVariant nyVar;

      char* str;

      //CString strtmp;

      if(m_DM100Comm.GetCommEvent()==2)//事件值为2表示接收缓冲区

      {

           int l = m_DM100Comm.GetInBufferCount();

           if(l > 0)

           {

                 nyVar.Attach(m_DM100Comm.GetInput());//读缓冲区

                 m_input=nyVar;//VARIANT型变量转换为ColeSafeArray型变量

                 str = (char*)(unsigned char*)m_input.parray->pvData;//字符型

           }

           str[l]=’\0’;

          if(str[0]==’:’)

          {

                m_zstrtmp=_T("");

          }

           m_zstrtmp+=(const char*)str;

           if(str[l-1]==0x0D)

           {

                 if (m_bShowData)//已发送数据

                 {

                      m_strtmp=m_zstrtmp;

                     m_strfinal=GetShowMode();//显示压力值的单位以及压力数据显示方式

                      if (m_strtmp.Mid(3,2)=="1D")//

                      {

                            m_nCount1++;

                            m_strRecv1=m_strfinal;

                            if (m_bExcelSave)//存入Excel表格的数据

                            {

                                  m_time=m_time.GetCurrentTime();

                                  m_SampleArray.Add(m_time.Format("%H:%M:%S"));

                                  m_SampleArray.Add(m_strRecv1);

                            }

                            UpdateData(FALSE);

                      }

                      else if (m_strtmp.Mid(3,2)=="2D")

                            m_strRecv2=m_strfinal;

                      else if (m_strtmp.Mid(3,2)=="1R")

                            m_strExpo1=m_strfinal;

                      else if (m_strtmp.Mid(3,2)=="2R")

                            m_strExpo2=m_strfinal;

                      else if (m_strtmp.Mid(3,2)=="3R")

                            m_strExpo3=m_strfinal;

                    UpdateData(FALSE);

                 }

                 m_zstrtmp.Empty();

           }

      } 

}

2.4 发送数据

为发送按钮添加一个单击响应函数,添加如下代码

void CDM100Dlg::OnCheckCycleSend1() //PG500配置的DM100显示屏1通道//循环发送数据

{

      // TODO: Add your control notification handler code here

      if (m_bAutoSend2)

      {

           m_ctrlCycleSend2.SetCheck(0);

           KillTimer(2);

      }

      if (m_ctrlCycleSend1.GetCheck())

      {

           m_bAutoSend1=TRUE;

           ((CButton*)GetDlgItem(IDC_BTN_PORT_OPEN))->EnableWindow(FALSE);

           SetTimer(1,m_nCycleTime1,NULL);

      }

      else

      {

           m_bAutoSend1=FALSE;

           ((CButton*)GetDlgItem(IDC_BTN_PORT_OPEN))->EnableWindow();

           KillTimer(1);

      }

}

void CDM100Dlg::OnCheckCycleSend2() //PG500配置的DM100显示屏2通道//循环发送数据

{

      // TODO: Add your control notification handler code here

      if (m_bAutoSend1)

      {

           m_ctrlCycleSend1.SetCheck(0);

           KillTimer(1);

      }

      if (m_ctrlCycleSend2.GetCheck())

      {

           m_bAutoSend2=TRUE;

           ((CButton*)GetDlgItem(IDC_BTN_PORT_OPEN))->EnableWindow(FALSE);

           SetTimer(2,m_nCycleTime2,NULL);

      }

      else

      {

           m_bAutoSend2=FALSE;

           ((CButton*)GetDlgItem(IDC_BTN_PORT_OPEN))->EnableWindow();

           KillTimer(2);

      }

}

定时器消息处理函数代码如下:

void CDM100Dlg::OnTimer(UINT nIDEvent)

{

      // TODO: Add your message handler code here and/or call default

switch (nIDEvent)

      {

      case 1:

           OnBtnShow1();//1通道发送一次数据

           break;

      case 2:

           OnBtnShow2();//2通道发送一次数据

           break;

      case 3:

           SetWindowText(m_strCaption.Mid(0,13+m_ncaption));

           if(m_ncaption<(m_strCaption.GetLength()+1))

               m_ncaption++;

           else

                 m_ncaption=0;

           break;

      default:

           break;

      }

      CDialog::OnTimer(nIDEvent);

}

3 结束语

使用以上代码可以通过PC机实现PG500真空计的远程设置、压力显示、状态控制、数据处理等过程。

注:以上代码为PG500真空计与PC机通讯的主干代码,另有大部分函数原型由于文字限制在本文中未写出。

真空测量软件开发可联系仇小姐,电话:021-61526449,分机号8002


 

推荐仪器
  • *
  • *
  • *
  • *