林 盛,迟新利,曲延华,高庆忠
(沈阳工程学院, 辽宁 沈阳 110136)
作为新一代工业控制装置,PLC自上世纪 60年代产生以来,发展迅猛,被广泛应用于众多的工业控制现场。S7-200系列的PLC是西门子公司的小型PLC,从其推向市场的那天起,就以高可靠性和性价比在国内广受欢迎。在工业控制现场,往往需要上位机(PC)对下位机(PLC)进行监控,以实现控制的分散和管理的集中。但上位机的专用组态软件,往往价格昂贵,并且控制不够灵活。
如果可以自己编程实现PLC与上位机之间的通讯,必可起到节约成本提高效率的效果。可是若要完全由自己来编写一段用于通信的程序,必须对相关的网络协议及其他的一些较底层的技术有很深入的了解,这不是一件容易的事。本文将介绍一种简单的方法,借助于Visual Studio2010中的VC++开发工具,用户只需通过设置serialPort组件的属性并调用其方法,再在PLC内部进行简单的编程,就可经由自由口实现PC与PLC之间的通信。
S7-200的自由口通信模式建立在RS-485硬件基础上。如果PLC选择了自由口模式,用户就可以通过发送指令(XMT)、接收指令(RCV)、发送中断以及接收中断对通信口进行相应的操作。S7-200 PLC也允许用户对诸如数据长度、奇偶校验等进行简单设置设置[1]。对于XMT和RCV 指令,用户可以在编程当中为其指定相应的数据缓冲区。
最终的 PLC 程序应当由主程序、中断(接收完成/发送完成)子程序、读(写)操作子程序和校验子程序等组成,各个程序块各司其职。
主程序需要进行诸如打开端口、设置波特率和奇偶校验等操作,并按照适当的条件执行中断或其他子程序。
主程序与子程序部分示例代码如下:
NETWORK1//主程序
LD SM0.1//首个周期运行标志
MOVB 16#05,SMB130//打开 COM1,无奇偶校验,数据位8,波特率为19 200,自由口模式
MOVB 16#EC,SMB187//接收使能,以SM188和SM189内字符分别作为开始和停止字符,
MOVB 35,SMB188//以“#”做为开始字符
MOVB 38,SMB189//以“&”做为停止字符
MOVB 30,SMB194//30为最大可接收字节数,设定范围为1~255
MOVW +99,SMW192//设置通信信道空闲时间为99 ms
ATCH INT_0,23//以接收完成为标识,触发中断0
ATCH INT_2,9//以发送完成为标识,触发中断2
ENI //用户中断允许
RCV VB200 1//为COM1指定从VB200开始的缓冲区
NETWORK1//中断0,接收完成中断子程序
LDB=SMB186 16#20//接收完成状态标识
MOVB 10 SMB34//设置定时中断0的时间间隔为10 ms
ATCH INT_1 10//定时中断0超时,触发中断1
CRETI//返回
NOT
RCV VB200 1//上次接收完成,开始新的接收
NETWORK1//中断1
LD SM0.0//运行标识
DTCH 10//解除定时中断
XMT VB200 1//向COM1的缓冲区返回信息
完整的程序运行流程如图1所示。
图1 PLC程序流程图Fig.1 Program Flow Chart for PLC
PC机侧程序采用微软公司的Visual C++工具开发。在以往的实践中,大家或利用标准通信函数、或利用第三方控件 MSComm、或利用 API函数[3]来实现串行通信
微软从 VisualStudio2005开发工具开始,在NETFramework类库包含了SerialPort组件,利用此组件,可以方便地实现串口通讯的多种功能[2]。SerialPort组件的常用属性极其描述如表1所示。
表1 SerialPort属性Table 1 Attribute of SerialPort
serialPort组件的串口属性要设置成与PLC串口参数相同的数值,其代码如下:
serialPort1.PortName=“COM1”;//设置通讯端口为COM1
serialPort1.BaudRate=9600;//设置波特率为9600bps
serialPort1.DataBits=8;//设置8位数据位
serialPort1.StopBits=System.IO.Ports.StopBits.One;//设置1位停止位
serialPort1.Parity=System.IO.Ports.Parity.None;//无奇偶校验
serialPort组件打开关闭串口采用的是调用类的Open()和 Close()方法。其读取数据的方法是多为同步阻塞调用,因此可以使用异步处理或线程间处理调用这些读取数据的方法,从而尽量避免在主线程中调用,由此可以显著提高系统的工作性能。
最终完成的通讯界面如图2所示,在这个通信界面上可以根据实际需要,自由设置串口的各个参数。在完成通信参数、命令类型和寄存器参数的设置后,便可发送指令数据。命令类型中05代表“读”,06代表“写”。
图2 PC程序界面Fig. 2 Program Interface of PC
随着 PLC在工业现场的大量普及和应用,对PLC的监控和管理显得日益重要。本文在PLC与PC的自由口通讯中,采用了VC++内置的serialPort组件,不但大大简化了编程,而且取得了不错的效果。在此基础上,配合PC与PLC 的通信协议,就可以开发出交互界面友好、功能强大的上位机监控系统,以较低的成本,满足众多中小企业自动化、信息化、网络化的要求。
[1] 西门子(中国)有限公司. SIMATIC S7-200 可编程控制器系统手册[G]. 2008.
[2] Ivor Horton,Visual C++2010入门经典 [M]. 第5版.北京:清华大学出版社,2010.
[3] 高潮,罗强,郭永彩,扶新.用Visual C++实现PC与PLC之间的串行通讯[J].重庆大学学报(自然科学版),2006,29(6):19-22.