基于VC++的PC与PLC自由口通讯

2013-09-18 01:40迟新利曲延华高庆忠
当代化工 2013年7期
关键词:主程序子程序中断

林 盛,迟新利,曲延华,高庆忠

(沈阳工程学院, 辽宁 沈阳 110136)

作为新一代工业控制装置,PLC自上世纪 60年代产生以来,发展迅猛,被广泛应用于众多的工业控制现场。S7-200系列的PLC是西门子公司的小型PLC,从其推向市场的那天起,就以高可靠性和性价比在国内广受欢迎。在工业控制现场,往往需要上位机(PC)对下位机(PLC)进行监控,以实现控制的分散和管理的集中。但上位机的专用组态软件,往往价格昂贵,并且控制不够灵活。

如果可以自己编程实现PLC与上位机之间的通讯,必可起到节约成本提高效率的效果。可是若要完全由自己来编写一段用于通信的程序,必须对相关的网络协议及其他的一些较底层的技术有很深入的了解,这不是一件容易的事。本文将介绍一种简单的方法,借助于Visual Studio2010中的VC++开发工具,用户只需通过设置serialPort组件的属性并调用其方法,再在PLC内部进行简单的编程,就可经由自由口实现PC与PLC之间的通信。

1 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

2 PC编程

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

4 结束语

随着 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.

猜你喜欢
主程序子程序中断
自动升级程序在船舶监测系统中的应用
浅谈数控铣削技术代码程序的嵌套方式研究
电控冰箱软件模块化设计
基于FPGA的中断控制器设计*
跟踪导练(二)(5)
千里移防,卫勤保障不中断
时光倒流 换回PotPlayer老图标
浅谈子程序在数控车编程中的应用
子程序在数控车加工槽中的应用探索
西门子840D系统JOG模式下PLC调用并执行NC程序