摘要:本文给出了用VC++6.0实现OMRON可编程控制器与上位机之间的通信程序设计方法,并提供了利用RS232串行通讯端口实现计算机与可编程控制器通讯的方法。此方案成功应用在振动磨的变频控制中。
7b7fe5d【中国自动化网社区】3799c5【http://sns.ca800.com】c045f4e关键词:上位机;PLC;串口通信;VC++6.0;振动磨
4734bc【中国自动化网社区】e943a8【http://sns.ca800.com】90392f1Abstract:This article mainly introduces a method of programming design based on VC++6.0 to realize the communication of PLC and host omputer and also discusses how to use the RS232 communication port to realize the communication between PC and PLC. Thisprogram has been successfully applied in the frequency control of vibration mill.
4734bc【中国自动化网社区】e943a8【http://sns.ca800.com】90392f1Key words: Host computer, PLC, Serial communication, VC++6.0,Vibration mill
50d4【中国自动化网社区】a59036【http://sns.ca800.com】39cca11.引 言
50d4【中国自动化网社区】a59036【http://sns.ca800.com】39cca1 当今,在自动化的工业生产中,变频控制往往与计算机远程控制相联系在一起,从而实现电机的远程变频控制。可编程序控制器系统不仅可作为单一的机电控制设备,而且作为通用的自动控制设备,也被大量地用于过程工业的自动控制。欧姆龙最新推出的可编程控制器SYSMAC CP1H,具有“高度扩张性”的端子台型一体化[1]。与以往产品CPM2A 40 点输入输出型为相同尺寸,但处理速度可达到约10倍的性能。本课题通过控制机(即为PLC)设定比例运行参数,然后控制机通过D/A转换模件发出控制变频调速器的指令,使变频调速器带动振动磨电机按输入的速度和时间运转。基于OMRON PLC的链接通信(有通信协议),我们采用功能强大的Visual C++6.0语言来实现这种小型集散控制系统的上、下位机的通信和友好的监控界面,实现了上位机与PLC间的通信。
50d4【中国自动化网社区】a59036【http://sns.ca800.com】39cca12.通讯软件的设计
af6970a【中国自动化网社区】cf5371【http://sns.ca800.com】159d6a6 在本项目中,上位机选用计算机, 下位机选用日本Omron公司的CP1H系列XA40DR-A可编程序控制器。在计算机外设中,RS-232串口因为其组成方式简单,编程控制方便而成为应用最为广泛的I/O通道之一。32 位下串口通信程序通常采用两种方法实现:一是利用ActiveX控件; 二是使用API通信函数。使用ActiveX控件, 程序实现非常简单, 结构清晰,缺点是欠灵活; 使用API通信函数的优缺点则基本上相反[2]。VC++6.0的MSComm是Microsoft 公司提供的简化Windows 下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法,笔者采用了这种方法。其端口接线见附图。
af6970a【中国自动化网社区】cf5371【http://sns.ca800.com】159d6a6af6970a【中国自动化网社区】cf5371【http://sns.ca800.com】159d6a6af6970a【中国自动化网社区】cf5371【http://sns.ca800.com】159d6a62.1 上位机与PLC的通讯协议
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 HOST Link系统使用HOST Link 通信协议进行通信,上位机具有传送优先权,总是首先发出命令并启动通信,HOST Link 通信单元收到命令交由PLC执行,然后将执行结果返回上位机,两者以帧为单位轮流交换数据。
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c552.2 上位机的PLC链接通讯
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 通信时一组传送的数据称为块,它是命令或响应的单位,从上位机发送到HOSTLink 单元的数据称为命令块,相应的,从HOSTLink单元发送到上位机的数据称为响应块。多点通信时,单帧发送的最大数据块为131 个字符,因此当一个数据块含有132 个或更多字符时,要分成两帧或多帧进行发送。多帧发送时中间帧的格式为:正文、FCS、分界符。起始帧、中间帧的长度为131 ,结束帧的长度最多为131 个字符。
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 Omron系列的PLC 通过RS232 口与主机通信有两种方式,第一种是由上位机向PLC 发送初始命令,第二种是由PLC 向上位机发送初始命令[3]。在监测系统中一般采用第一种方式。有关通信协议如下所述:
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c552.2.1上位机→PLC 的命令格式
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 其中:
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 (1)@为起始标志符;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 (2)N2 、N1 为PLC 节点标志码,由两位十进制数表示,它们用来指定与上位机通信的PLC。而PLC 自己的通信节点码可由它的DM6648 和DM6653 来设置;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 (3)CMD2 、CMD1 为两字节命令码;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 (4)MT 为命令内容,用来设置具体的命令参数;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 (5)V2、V1 为两字节的帧校验码,它是从开始符“@”到MT码结束的所有字符的ASCII 码按位异或的结果; 帧校验和是一个转换成2 个ASCII 字符的8 位数据。它把帧中每一个字符顺序地进行异或操作而得到的结果,即把帧的第一个字符到正文结束的所有字符转换成二进制形式的ASCII 码后,逐个异或而得到的[4]。当发送命令时,将其加在命令格式中,作为帧的一部分发送到接收端。当接收数据时,按上述步骤重新计算FCS ,当计算结果与数据块中所带的FCS 相同时,说明传输无误,否则,说明接收到的数据不正确。
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 (6)“*”和“CR”两字符表示命令结束。
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 例如,@00WD00060500表示写一个数500到节点为0的PLC的DM0006中。
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c552.2.2 PLC→上位机的响应格式
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c551ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 其中S2 、S1 为命令结束状态码,如00 表示正常结束,01 表示RUN 模态下PLC 无法完成上位机命令,其余符号代码意义同上。实现上位机与HOST Link 通信单元的通信只需编写上位机程序,因为HOST Link 通信单元自身带有通信程序,上位机下发命令,地址相符的PLC 自动上传响应帧,所以这一部分程序不需要客户编写,但是,编写上位机的通信程序时,通信参数的设置必须保证与PLC 的通信参数一致性。
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c553.用VC++6.0编写串行通信程序
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 首先建立一个基于对话框的MFC应用程序SCommTest,支持ActiveX控件,电话形状的控件是在系统中注册过的MicrosoftCommunications Control, version 6.0,接受缺省的选项。
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c551.打开串口设置串口参数
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 在主对话框CSCommTestDlg::OnInitDialog()中打开串口,加入如下代码:
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 if(m_ctrlComm.GetPortOpen())
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 m_ctrlComm.SetPortOpen(FALSE);
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 m_ctrlComm.SetCommPort(1); //选择com1
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 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 .
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55SetPortOpen(TRUE);//打开串口
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 else
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 AfxMessageBox("cannot open serial port");
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 m_ctrlComm.SetSettings("9600,E,7,2"); //波特率9600,偶校验,7个数据位,2个停止位m_ctrlComm.SetInputModel(1); //1:表示以二进制方式检取数据m_ctrlComm.SetRThreshold(1);
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c552.发送数据
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 为发送按钮添加一个单击消息BN_CLICKED处理函数,选择IDC_BUTTON_MANUALSEND,添加OnButtonManualsend()函数,并在函数中添加如下代码:
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 UpdateData(TRUE); //读取编辑框内容
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 SendData(m_strTXData1,6);
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 // m_strTXData1表示发送速度命令的具体数值,6表示写数
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55据的地址DM0006
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 Sleep(100);
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 SendData(m_strTXData2,12); //m_strTXData1表示发送时间命令的具体数值,12表示写数据的地址DM0012
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c553.发送命令
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 按照命令格式,本课题主要发送两个WD命令:
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 (1)数据采用十进制发送,向DM0006中写入速度指令;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 (2)数据采用十进制发送,向DM0012中写入时间指令。部分程序如下:
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 Void CSCommTestDlg::SendData(int m_TobeSend,intm_address)
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 { CByteArray Array;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 unsigned char auchMsg[45]={0}
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[0]=64; // 起始标志符
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[1]=0x0; //节点号
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[2]=0x0; auchMsg[3]=‘W‘; //命令符
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[4]=‘D‘;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[5]=m_address/1000;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[6]=(m_address%1000)/100;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[7]=(m_address%100)/10;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[8]=m_address%10;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[9]=m_TobeSend/1000;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[10]=(m_TobeSend%1000)/10;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[11]=(m_TobeSend%100)/10;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[12]=m_TobeSend%10;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 LRC(auchMsg,13);
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 //auchMsg[13] ,auchMsg[14] ,保存FCS值
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[15]=‘*‘; //命令结束符
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 auchMsg[16]=13;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 Array.RemoveAll();
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 for (Count=0;Count<17;Count++)
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 Array.Add(auchMsg[Count]);
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 m _ c t r l C o m m . S e t O u t p u t ( C O l e Va r i a n t ( A r r a y ) ) ;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c554.计算校验码函数
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 unsigned char uchLRC = 0 ; 初始值设定
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 while (usDataLen——)
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 {uchLRC ︿= *auchMsg++; }
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 unsigned char high=0xF0;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 //high为校验码的高位
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 unsigned char low=0x0F;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 //low为校验码的低位
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 high&=uchLRC;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 low&=uchLRC;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 high>>=4;右移四位
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 if(high<=9)
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 high=high+48;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 else
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 high=high+55;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 if(low<=9)
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 low=low+48;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 else
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 low=low+55;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 *auchMsg++=high;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 *auchMsg++=low;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55四.结束语
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55 此程序在VC++6.0中运行通过,并成功应用于振动磨的控制中。该系统采用OMRON XA40DR-A PLC与上位机连接组成控制系统,上位机通过串行口向PLC发出写命令及数据,PLC接受数据后,通过D/A转换模块,将模拟量发给变频器,从而实现了振动磨振动速度和时间的控制。
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55参考文献
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55[1]OMRON公司.CP1H操作手册.2005
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55[2]万曼影.视窗环境下欧姆龙PLC的实时通信.微处理
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55机.2004(6)
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55[3]何华东,赵喜荣.PLC与上位计算机的串行通信程序设
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55计.机电工程.2002(6)
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55[4]OMRON公司.CPM编程手册.2003
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55基金项目:国家自然科学基金资助项目(编号:50575147)
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55作者简介:苏丹(1982-),女,在读硕士;
1ee0b【中国自动化网社区】8fc4b5【http://sns.ca800.com】060c55王树林(1951—),男,教授,博士生导师。