网站标志
导航菜单
当前日期时间
当前时间:
购物车
购物车中有 0 件商品 去结算 我的订单
商品搜索
商品搜索:
文章正文
嵌入式智能人机界面与PLC的通讯实现
作者:管理员    发布于:2015-06-29 17:45:22    文字:【】【】【

 人机界面提供的串口是符合通用标准的。WinCE.net下的串口通讯与Windows下的串口通讯原理相同。都是应用程序不直接控制硬件,而是通过操作系统提供的设备驱动程序,来进行数据传递。

WinCE.net是Win32编程。串口在Win32中是作为文件来进行处理的,不是直接对端口进行操作。对于串行通信,Win32提供了相应的文件I/O函数与通信函数。

  但是也要注意WinCE.net所能支持的API函数只是WindowAPI函数的子集。Windows有的,WinCE.net下不一定能使用。同时,WinCE.net字符集类似于WindowsNT而不同于Windows9x,它是基于Unicode的。这也是开发程序过程中从WINDOWS转到WinCE.net的程序员遇到问题最多的地方。另外在Windows下常用的一些通讯控件如MSComm等在WinCE.net下就不能正确使用了。

  本监控系统采用API函数实现串口通讯。以下分几个问题介绍串口通讯及整个系统的实现。

  5.1打开串口

  首先是打开串口,这是串口通讯的第一步。其代码为:

  BOOLCMainDlg::onInitDialog()

  {

  ......

  m_hComm=CreateFile(_T(“COM1:“),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);//打开串口的操作,需要注意

  WinCE.net系统与Windows系统表达方式的细微不同,WinCE.net需要在串口后加上冒号;

  SetupComm(m_hComm,1024,1024);//初始化串口的输入,输出缓冲区参数;

  SetCommState(m_hComm,&m_dcb);//配置串口参数;m_dcb为设置好的参数结构;

  ......

  SetCommTimeouts(m_hComm,&timeout);//设置通讯超时时间参数;

  PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);

  //清空输入,输出缓冲区的字符,为开始接受数据,进入监控状态做好准备;

  ......5.2读串口线程

  其次是启动读串口线程,它让读串口程序不停地在后台运行,而不影响前台程序的工作。与此有关的代码为:

  BOOLCMainDlg::onInitDialog()

  {

  ......

  ReadFile(m_hComm,inBuffer+iBufLen,INBUFFERLEN-iBufLen,&dwBytes,NULL);//从串口读数据;

  iBufLen+=dwBytes;

  for(inti=”0“;i{

  if(inBuffer[i]==”\r“)//以连接的设备为OMRONPLC为例,其通讯协议规定应答应当以”\r“结尾;

  inBuffer[i]=0;//字符串结束标志;

  switch(m_iDlgType)//m_iDlgType为代表不同对话框的标志变量;

  {

  case子对话框1标志:

  子对话框1.ProcData(inBuffer,i);//不同对话框中对命令应答的处理,ProcData为处理函数名;

  break;

  ......

  }

  ......

  }5.3各子对话框发送写命令

  各个子对话框根据需要,采用定时器的形式,定时向PLC发送命令。以OMRONPLC为例,在发送命令时,根据OMRONPLC的通讯协议,还需对发送的命令字符串加校验码。这些程序代码为:

  void子对话框1类::onTimer(UINTnIDEvent)

  {

  ......

  strcpy(m_szC

  md,”@00RR00000001“);//OMRONPLC的命令字符串;

  GenXor(m_szCmd,result);//进行校验码计算,调用GenXor函数;

  sprintf(szTailer,”%02X*\r“,result);//OMRONPLC通讯协议以“*\r”结尾;

  strcat(m_szCmd,szTailer);//形成完整的通讯协议命令字符串;

  WriteFile(m_hComm,m_szCmd,strlen(m_szCmd),&dwWriten,NULL);

  //将命令字符串写入串口;

  ......

  }

  以下为上面所调用的计算校验码的代码:

  voidGenXor(LPCSTRstrSource,char&result)//为计算校验码的函数,进行异或运算:

  {

  result=0;//为校验码赋初值;

  intlen=“strlen”(strSource);//命令协议字符串的长度;

  for(inti=“0”;iresult^=strSource[i];//按位进行异或;

  }

浏览 (45) | 评论 (0) | 评分(0) | 支持(0) | 反对(0) | 发布人:管理员
将本文加入收藏夹
新闻详情
脚注栏目
|
脚注信息
机电工程网(C) 2015-2020 All Rights Reserved.    联系我们