欢迎您,请 登录 或 注册

学工控网

查看: 116|回复: 0

[分享] VC++编程实现与Omron PLC通讯进行振动磨的变频控制

[复制链接]
发表于 2019-11-19 23:26:00 | 显示全部楼层 |阅读模式
  1.引言
  当今,在自动化的工业生产中,变频控制往往与计算机远程控制相联系在一起,从而实现电机的远程变频控制。可编程序控制器系统不仅可作为单一的机电控制设备,而且作为通用的自动控制设备,也被大量地用于过程工业的自动控制。欧姆龙最新推出的可编程控制器SYSMAC CP1H,具有“高度扩张性”的端子台型一体化[1]。与以往产品CPM2A 40 点输入输出型为相同尺寸,但处理速度可达到约10倍的性能。本课题通过控制机(即为PLC)设定比例运行参数,然后控制机通过D/A转换模件发出控制变频调速器的指令,使变频调速器带动振动磨电机按输入的速度和时间运转。基于OMRON PLC的链接通信(有通信协议),我们采用功能强大的Visual C++6.0语言来实现这种小型集散控制系统的上、下位机的通信和友好的监控界面,实现了上位机与PLC间的通信。
  2.通讯软件的设计
  在本项目中,上位机选用计算机,下位机选用日本Omron公司的CP1H系列XA40DR-A可编程序控制器。在计算机外设中,RS-232串口因为其组成方式简单,编程控制方便而成为应用最为广泛的I/O通道之一。32位下串口通信程序通常采用两种方法实现:一是利用ActiveX控件;二是使用API通信函数。使用ActiveX控件,程序实现非常简单,结构清晰,缺点是欠灵活;使用API通信函数的优缺点则基本上相反[2]。VC++6.0的MSComm是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法,笔者采用了这种方法。其端口接线见附图。
image001.gif
  2.1 上位机与PLC的通讯协议
  HOST Link系统使用HOST Link 通信协议进行通信,上位机具有传送优先权,总是首先发出命令并启动通信,HOST Link 通信单元收到命令交由PLC执行,然后将执行结果返回上位机,两者以帧为单位轮流交换数据。
  2.2 上位机的PLC链接通讯
  通信时一组传送的数据称为块,它是命令或响应的单位,从上位机发送到HOSTLink单元的数据称为命令块,相应的,从HOSTLink单元发送到上位机的数据称为响应块。多点通信时,单帧发送的最大数据块为131个字符,因此当一个数据块含有132个或更多字符时,要分成两帧或多帧进行发送。多帧发送时中间帧的格式为:正文、FCS、分界符。起始帧、中间帧的长度为131 ,结束帧的长度最多为131个字符。
  Omron系列的PLC通过RS232口与主机通信有两种方式,第一种是由上位机向PLC发送初始命令,第二种是由PLC向上位机发送初始命令[3]。在监测系统中一般采用第一种方式。有关通信协议如下所述:
  2.2.1上位机→PLC的命令格式
  其中:
  (1)@为起始标志符;
  (2)N2、N1为PLC节点标志码,由两位十进制数表示,它们用来指定与上位机通信的PLC。而PLC自己的通信节点码可由它的DM6648和DM6653来设置;
  (3)CMD2、CMD1为两字节命令码;
  (4)MT为命令内容,用来设置具体的命令参数;
  (5)V2、V1为两字节的帧校验码,它是从开始符“@”到MT码结束的所有字符的ASCII码按位异或的结果;帧校验和是一个转换成2个ASCII字符的8位数据。它把帧中每一个字符顺序地进行异或操作而得到的结果,即把帧的第一个字符到正文结束的所有字符转换成二进制形式的ASCII码后,逐个异或而得到的[4]。当发送命令时,将其加在命令格式中,作为帧的一部分发送到接收端。当接收数据时,按上述步骤重新计算FCS ,当计算结果与数据块中所带的FCS相同时,说明传输无误,否则,说明接收到的数据不正确。
  (6)“*”和“CR”两字符表示命令结束。
  例如,@00WD00060500表示写一个数500到节点为0的PLC的DM0006中。
  2.2.2 PLC→上位机的响应格式
  其中S2、S1为命令结束状态码,如00表示正常结束,01表示RUN模态下PLC无法完成上位机命令,其余符号代码意义同上。实现上位机与HOST Link 通信单元的通信只需编写上位机程序,因为HOST Link 通信单元自身带有通信程序,上位机下发命令,地址相符的PLC自动上传响应帧,所以这一部分程序不需要客户编写,但是,编写上位机的通信程序时,通信参数的设置必须保证与PLC的通信参数一致性。
  3.用VC++6.0编写串行通信程序
  首先建立一个基于对话框的MFC应用程序SCommTest,支持ActiveX控件,电话形状的控件是在系统中注册过的MicrosoftCommunications Control, version 6.0,接受缺省的选项。
  1.打开串口设置串口参数
  在主对话框CSCommTestDlg::OnInitDialog()中打开串口,加入如下代码:
  if(m_ctrlComm.GetPortOpen())
  m_ctrlComm.SetPortOpen(FALSE);
  m_ctrlComm.SetCommPort(1); //选择com1
  i f ( ! m _ c t r l C o m m . G e t P o r t O p e n ( ) ) m _ c t r l C o m m .
  SetPortOpen(TRUE);//打开串口
  else
  AfxMessageBox("cannot open serial port");
  m_ctrlComm.SetSettings("9600,E,7,2"); //波特率9600,偶校验,7个数据位,2个停止位m_ctrlComm.SetInputModel(1); //1:表示以二进制方式检取数据m_ctrlComm.SetRThreshold(1);
  //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
  m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
  m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
  2.发送数据
  为发送按钮添加一个单击消息BN_CLICKED处理函数,选择IDC_BUTTON_MANUALSEND,添加OnButtonManualsend()函数,并在函数中添加如下代码:
  UpdateData(TRUE); //读取编辑框内容
  SendData(m_strTXData1,6);
  // m_strTXData1表示发送速度命令的具体数值,6表示写数据的地址DM0006
  Sleep(100);
  SendData(m_strTXData2,12); //m_strTXData1表示发送时间命令的具体数值,12表示写数据的地址DM0012
  3.发送命令
  按照命令格式,本课题主要发送两个WD命令:
  (1)数据采用十进制发送,向DM0006中写入速度指令;
  (2)数据采用十进制发送,向DM0012中写入时间指令。部分程序如下:
  Void CSCommTestDlg::SendData(int m_TobeSend,intm_address)
  { CByteArray Array;
  unsigned char auchMsg[45]={0}
  auchMsg[0]=64; // 起始标志符
  auchMsg[1]=0x0; //节点号
  auchMsg[2]=0x0; auchMsg[3]=‘W‘; //命令符
  auchMsg[4]=‘D‘;
  auchMsg[5]=m_address/1000;
  auchMsg[6]=(m_address%1000)/100;
  auchMsg[7]=(m_address%100)/10;
  auchMsg[8]=m_address%10;
  auchMsg[9]=m_TobeSend/1000;
  auchMsg[10]=(m_TobeSend%1000)/10;
  auchMsg[11]=(m_TobeSend%100)/10;
  auchMsg[12]=m_TobeSend%10;
  LRC(auchMsg,13);
  //auchMsg[13] ,auchMsg[14] ,保存FCS值
  auchMsg[15]=‘*‘; //命令结束符
  auchMsg[16]=13;
  Array.RemoveAll();
  for (Count=0;Count<17;Count++)
  Array.Add(auchMsg[Count]);
  m_ctrlComm.SetOutput(COleVariant(Array) ;
  4.计算校验码函数
  unsigned char uchLRC = 0 ;初始值设定
  while (usDataLen——)
  {uchLRC︿=*auchMsg++;}
  unsigned char high=0xF0;
  //high为校验码的高位
  unsigned char low=0x0F;
  //low为校验码的低位
  high&=uchLRC;
  low&=uchLRC;
  high>>=4;右移四位
  if(high<=9)
  high=high+48;
  else
  high=high+55;
  if(low<=9)
  low=low+48;
  else
  low=low+55;
  *auchMsg++=high;
  *auchMsg++=low;
  4.结束语
  此程序在VC++6.0中运行通过,并成功应用于振动磨的控制中。该系统采用OMRON XA40DR-A PLC与上位机连接组成控制系统,上位机通过串行口向PLC发出写命令及数据,PLC接受数据后,通过D/A转换模块,将模拟量发给变频器,从而实现了振动磨振动速度和时间的控制。

回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

发布主题 快速回复 返回列表

客服电话

15888750101

工作时间 周一至周六 8:00-21:00

客服QQ点击咨询

Copyright @ 2013-2020 学工控网 版权所有 | 浙ICP备15003942号  

快速回复 返回顶部 返回列表