王 芸(1982-) 女,湖北人 ,助教,硕士研究生,(安徽师范大学物电学院,安徽 芜湖 241000),研究方向为计算机应用。
基金项目:安徽省教育厅2006年自然科学基金(NO.2006kj077B)
摘要:研究了在Visual C++6.0环境下利用MSComm控件实现系列PLC与上位计算机通信的问题,并给出了基于Visual C++6.0的通信程序设计方法。该通信程序能读写PLC内部各种软设备。实践证明,在Visual C++6.0下实现系列PLC与计算机通信简单使用,具有很强的推广应用价值。
关键词:PLC;Visual C++6.0;MSComm控件;通信
Abstract: In this paper, the issue of implementing communication between PLC and computer is studied base on Visual C++6.0 developing environment. A method for designing communication program by Visual C++6.0 is given. The communication program can read or write various kinds of soft devices inside PLC. The practice proved that the communication between PLC and computer under Visual C++6.0 is simple and applicable. It is worth to be promoted.
Key words: PLC;Visual C++6.0;MSComm control box;Communication
1 引言
可编程控制器PLC(Programmable Logic Controller),由于其安全可靠、功能齐全、应用灵活、操作维修容易和稳定可靠等特点而得到广泛应用。但它也存在一些缺点,如不能给用户提供良好的人机控制和管理界面。随着工厂自动化程序要求的不断提高,生产过程中,要监视、控制PLC内部的数据与运行状况。对于中小型控制系统,如采用厂家提供的通信模块则成本高、投资较大、灵活性差。因此用户自己开发计算机与PLC的通信模块程序不仅可以满足不同情况下数据传输速率与稳定性的要求而且对节约外资、灵活应用具有重要意义。本文以三菱PLC为例,介绍一种通过Visual C++编程实现计算机作为上位机与PLC的通信,该通信程序能读写PLC内部各种软设备。
2 通信原理
系统采用RS-232C总线实现,直接与计算机的Host-Link单元构成1:1点对点通信系统。设定计算机即上位机具有高的优先级,通信以“帧”为单位进行,计算机首先向PLC发出命令帧,发送查询数据的指令,目的是查询PLC中端子的状态和DM区的值等。PLC接收了指令后,进行校验,检查数据是否正确,如果正确,则向上位机发送响应帧,传送数据(包含首尾校验字节)。否则,PLC拒绝向上位机传送数据。上位机接收到PLC传送的数据,也要判断正确与否,如果正确,则接收;否则,拒绝接收。
要使计算机与PLC联接单元之间正确交换数据,必须确保以下条件成立:(1)上下位机之间波特率以及数据格式一致;(2)在通信程序中,只使用协议规定的命令级中的命令;(3)当上位机向PLC发送数据或读取数据均由上位机主动以命令帧形式发出;(4)对上位机发来的命令帧,PLC用响应帧应答,若命令较长时,可分为若干帧发送。只要能顺利实现命令帧和响应帧的应答,就能使要交换的数据顺利达到对方。对于PLC发回的响应帧用户必须按其格式进行拆装识别,才能正确分离出交换数据及有用状态信息。
3 MSComm控件特点
利用VC的MSComm控件,实际上是一些Windows API函数的有机集成,它以属性和事件的形式提供了对Windows通讯驱动程序API函数接口,为应用程序提供了通过串行接口收发数据的简便方法。因此,程序员只需在程序中设置和监视MSComm控件的属性和事件即可完成对串口的编程。
MSComm控件提供了一种有效的处理串口交互作用的方法:事件驱动法,该方法利用OnComm事件捕获并处理通信及其错误,当CommEvent属性发生变化时,就产生事件并等待相应处理。每个MSComm控件都有一个串口相对应。
MSComm控件基本属性如下:
CommPort:设置并返回通信端口号。Windows系统将会利用该端口与外界通信。
Setings:设置并返回初始化参数。其组成格式为“BBBB.P.D.S”。BBBB为数据速率,P为奇偶校验,D为数据位数,S为停止位数。
PortOpen:设置并返回通信端口的状态。也可以打开和关闭端口。
OutPut:向传输缓冲区写IB的数据。
InPut:将传送到输入缓冲区的字符读到程序里。
RThreshold:设置在产生OnComm之前要接受的字符数。
InputLen:设置并返回Input属性从接收缓冲区读取的字符数。
InBuffersize:设置或返回输入缓冲区的大小。
InBufferCount:返回输入缓冲区内等待读取的字节个数;可通过设置该属性值为0来清除接收缓冲区。
InputMode:设置或返回传输数据的类型。
CommEvent:传回OnComm事件发生时的数值码。
4 通信程序设计
在应用程序中,主要采用MSComm控件与PLC进行通信,加载窗体时初始化通信参数,读数据时由上位机通过串行口向PLC发出读数据命令帧,PLC发出响应帧并将数据准备好,这时上位机读串行口就可读取需要的数据;写数据时上位机通过串行口向PLC发出写数据命令帧,PLC接受命令,并发送响应帧。
(1)在进行通信之前首先要对PLC端进行编程初始化,初始化程序如下:
LD M8002 MOV K0 D8121 MOV H4881 D8120
M8002为特殊功能寄存器,只在PLC转为运行时接通一次。D8121设定PLC站号寄存器,在这里设定PLC的站号为0号。通信控制寄存器D8120中移入16进制数4881,对照参数表,PLC端的设定为通信速率9600b/s,无校验,8位数据位,1位停止位。采用RS232接口,数据帧中不添加校验位。上位机端要与之相匹配。
(2)装载窗体时初始化并打开串口
m_Com.SetCommPort(1); //选择COM1 m_Com.SetInBufferSize(1024); //设置输入缓冲区大小 m_Com.SetOutBufferSize(512); //设置输出缓冲区大小 if(!m_Com.GetPortOpen()) //打开串口 m_Com.SetPortOpen(TRUE); //打开通信端口,准备通信 m_Com.Settings(9600,n,8,1); //通信速率9600b/s,无校验,8位数据位,1位停止位 m_Com.SetRThreashold(); m_Com.SetInputLen(1); m_Com.SetInputMode(0); (3)发送主程序(串口读写) 由GetInput()和SetOutput()函数完成串口读写。相应的部分程序为: Void CMainFramme::OnCommSend() { //准备要发送的数据存放在数组SXData[]中 CByteArray Send; Send.RemoveAll(); Send.SetSize(m); For(i=0;i<m;i++) Array.SetAt(i;SxData[i]); m_Com.SetOutput(ColeVariant(Send)); } Void CMainFramme::OnCommMscomm() { VARIANT vResponse; int k; k=m_Com.GetInBuffetCount(); //接收到的字符数目 if(k>0) {vResponse=m_Com.GetInput(); //read }
在实际应用中,从站被动的接收上位机发出的指令后做出的响应,然后将信息传回上位机,由于上位机在整个通信的过程中不能被中断,因此上位机在接收与发送数据过程中采用了不可中断的方法。
5 结束语
本系统根据计算机和PLC的特点,通过利用PLC的自由口通信协议,利用VC++6.0开发工具,开发出PC与PLC通信的应用软件,实践证明这种方法结构简单,开发周期短,节约投资,对小规模的控制系统有极大的现实意义。
作者信息:
王 芸,高菲菲 (安徽师范大学物电学院,安徽 芜湖 241000)
参考文献
[1] 徐世许.可编程序控制器原理·应用·网络[M].合肥:中国科学技术大学出版社,2005:244-247.
[2] MITSUBISHI公司. MITSUBISHI FX-232AW接口单元通信手册[M].上海:三菱公司,2000:25-33.
[3] 陈兴,张礼全,史旺旺.用VC++实现PC与多PLC之间串行通信的方法[J].微计算机信息,2004(20):6-7.
|