欧姆龙工业自动化产业集团是一个引领工业自动化产品和应用先进技术的跨国公司,作为欧姆龙全球事业的一部分,它已经成为自动化领域的佼佼者。
标题 | 用欧姆龙PLC与上位机通信实现振动磨的变频控制 |
技术领域 | |
行业 | |
简介 | |
内容 |
摘要:本文给出了用VC++6.0实现OMRON可编程控制器与上位机之间的通信程序设计方法,并提供了利用RS232串行通讯端口实现计算机与可编程控制器通讯的方法。此方案成功应用在振动磨的变频控制中。 关键词:上位机;PLC;串口通信;VC++6.0;振动磨 1.引 言 ![]() 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表示写数据的地址DM00123.发送命令 按照命令格式,本课题主要发送两个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 _ 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 ) ) ; 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; 四.结束语 此程序在VC++6.0中运行通过,并成功应用于振动磨的控制中。该系统采用OMRON XA40DR-A PLC与上位机连接组成控制系统,上位机通过串行口向PLC发出写命令及数据,PLC接受数据后,通过D/A转换模块,将模拟量发给变频器,从而实现了振动磨振动速度和时间的控制。 参考文献 [1]OMRON公司.CP1H操作手册.2005 [2]万曼影.视窗环境下欧姆龙PLC的实时通信.微处理机.2004(6) [3]何华东,赵喜荣.PLC与上位计算机的串行通信程序设计.机电工程.2002(6) [4]OMRON公司.CPM编程手册.2003基金项目:国家自然科学基金资助项目(编号:50575147) 作者简介:苏丹(1982-),女,在读硕士; 王树林(1951—),男,教授,博士生导师。 |