在Delphi编程环境下实现上位机与PLC的串行通信
摘 要:介绍了通过引进ActiveX控件MSComm,在Delphi 6.0编程环境下,实现上位机与Omron C200H PLC串行通信的一般方法,并给出了工程实例。该方法简单可靠、便于移植、实用性强,在工业控制中有着广泛的用途。
关键词:串行通信;ActiveX控件;上位机;PLC
一、引言
PLC(Programmable Logic Controller)作为一种新型的工业控制器,以其功能强、通用性好、可靠性高、安装灵活、扩展方便、编程简单,以及体积小、重量轻、功耗低、性能价格比高等一系列优点,在工业控制中得到越来越广泛的应用。目前,在电力生产过程中,随着国外大型火力发电机组的成套引进,PLC以其优越的性能在国内的很多火电厂也得到越来越广泛的应用。
在火电厂的小型集散控制系统中,如使用专业工控组态软件,如FIX、INTOUCH等,制作上位机的监控界面,而以专用的PLC通信接口模块以及其厂家推荐的DDE Server作为联系上位机和PLC的桥梁,则成本较高,投资较大。所以如果上位机采用高效的Delphi 6.0语言编程,通过引进ActiveX控件MSComm,实现Omron C200H PLC和上位机的通信则是一种较好的技术方案。在工程实际应用中,该方案已在河南信阳火电厂输煤系统中得到了应用,并取得了满意的效果。
二、实现方法
1、设计思想
在Delphi 6.0语言环境下,上位机首先通过引进Visual Basic或Visual C++的通信控件MSComm,编程实现与PLC之间的串行通信。即:上位机定时向PLC发出读数据的命令,PLC响应后,把存放在数据区的数据送入接收缓冲器,然后再把数据赋给临时变量,经过处理后用于显示,再通过编程实现对PLC的自动监控。如果采用RS_485串行通信总线标准进行通信,只要使用RS485/RS232接口转换器即可。其通信简图如图1所示。
上位机和Omron C200H PLC的通信接线示意图如图2所示:
2、通信协议
上位机通过RS232C串口与主机通信有两种命令方式:第一种是由上位机向PLC发送通信请求命令,第二种是由PLC向上位机发送通信响应命令。工业过程监控一般采用第一种方式启动。其通信协议格式如下(以Omron C200H PLC为例):
(1)上位机→PLC的命令帧格式:
其中:@为帧开始标志符;IP2、IP1为PLC的节点标识码,两位十进制数,用来指定与上位机通信的PLC,对应上位机,PLC可在DM6648和DM6653中设置自己的通信节点码;ID2、ID1为两字节命令码;CT为正文内容,用以设置具体的命令参数;F2、F1为两字节的帧校验码FCS,它是从开始符“@”到正文结束的所有字符的ASCII码按位异或的结果;“*”和“/”两字符表示命令结束。
(2)PLC→上位机的响应帧格式:
其中:@ 为帧开始标志符;IP2、IP1为与主机通信的PLC节点标识码;ID2、ID1为两字节命令码;E2、E1为命令结束状态码,00表示正常结束,01表示RUN模态下无法完成;CT为正文内容,仅在收到读数据命令时产生;P2、P1为两字节的帧校验码FCS,它是从开始符“@”到正文结束的所有字符的ASCII码按位异或的结果;“*”和“/”两字符表示命令结束。
三、ActiveX控件的引入
1、引入MSComm控件的意义
在计算机的串行通信中,常用的通信方式有三种:直接读写串口、利用WINDOWS API函数读写串口和利用串口通信控件MSComm操作串口。其中直接读写串口即通过调用-inp()和-outp()函数直接读写串口;利用WINDOWS API函数读写串口即通过调用API函数中的 CreateFile()、 ReadFile()、WriteFile()等函数操作串口。?
使用这两种方法进行编程,既繁琐复杂,又不直观。而通过从Visual Basic或Visual C++中引进ActiveX控件MSComm,编程者只需通过改变MSComm控件的属性设置和编写相应的初始化程序,就能在Windows环境下简单方便地实现不同用户的串行通信要求。
2、引入MSComm控件的方法
(1)进入Delphi 6.0编程环境下,在菜单项中选中Component/Import ActiveX选项,将出现ActiveX控件导入窗口(如图3);
(2)在其中选中Microsoft Comm Control 6.0(Version 1.1),并按需要选定Palette pages、unit dir name、Search path值(一般取默认值),最后选择Install按钮进行安装。即可将MSComm控件引入到Delphi 6.0中。
(3)在编程使用中,直接打开ActiveX控件,选取TMSComm控件,放在窗体上,右键选取Properties,出现如图4所示的属性窗口,设置其属性即可。其使用方法与Delphi其它控件相同。
3、MSComm控件相关属性
MSComm控件有27个属性,其中一部分可缺省设置为不用,常用的属性如下:
(1)CommPort:设置串行口选择。缺省值为1,选择为COM1;若赋值为2,则选择COM2。
(2)PortOpen:设置通信端的状态。设置为True时,打开端口;设置为False时,关闭端口并清除接收和发送缓冲区。
(3)Settings:设置通信时的波特率、奇偶校验、停止位参数。
(4)Inputlen:设置每次从接收缓冲区读取的字符个数。缺省值为0,表示将读取接收缓冲区中全部内容;若设置值为n(n>0),表示每次将读取接收缓冲区中的n个字符。
(5)InputMode:设置接收数据的类型。
(6)InBufferCount:设置返回接收缓冲区中等待被读取的字符个数。初始化程序时,InBufferCount设置值为0,表示清除接收缓冲区。
(7)OutBufferCount:设置返回发送缓冲区中等待发送的字符个数。设置值为0时,表示清除发送缓冲区。
(8)InBufferSize:设置接收缓冲区中的长度,缺省值为1024字节。
(9)OutBufferSize:设置发送缓冲区中的长度,缺省值为512字节。
(10)Rthreshold:设置表示在触发OnComm事件之前接收缓冲区允许有的字符数。缺省值为0,表示即使接收缓冲区有字符时,也不会触发OnComm事件;设置值为n(n>0)时,表示接收缓冲区每有n个字符时,就会触发一次OnComm事件。
(11)Sthreshold:设置表示在触发OnComm事件之前发送缓冲区允许有的字符数。缺省值为0,表示不触发OnComm事件;设置值为n(n>0)时,表示发送缓冲区每有n个字符时,就会触发一次OnComm事件。
(12)TREnable:设置DTR的有效性。
(13)RTSEnable:设置RTS的有效性。
(14)Input:从串口读取数据。
(15)Output:向串口写入数据。
四、编程实例
1、编程原理
本文采用Delphi 6.0语言作为软件开发平台,主要是因为Delphi在图形处理和数据库管理等方面具有较强的功能,且代码编译速度快,控件使用方便。本例将介绍在Delphi 6.0编程环境下,如何实现从PLCDM0000读取两个字节(一个PLC通道单元)的内容到数据存储区PLCData中,并通过帧数据校验函数来校验数据发送和接收是否准确。?
假设PLC的节点号为00,那么上位机的命令为:?
“@00RR00000001F2F1*/r”
而PLC的应答为:?
“@00RR00D0D1D2D3P2P1*/r”
其中:F2、F1是上位机发送命令的校验码,D0D1D2D3是上位机要读取的数据, P2、P1是PLC响应命令的校验码。2、程序实现
(1)启动Delphi 6.0,生成应用窗体,命名为Form1。在窗体上添加通信开始按钮BtnR、通信停止按钮BtnT,并在ActiveX控件栏选中MSComm控件,插入窗体,命名为MSComm1。
(2)为窗体添加FormCreate事件,进行串口初始化,代码如下:?
也可右键单击MSComm控件,选取Properties,出现如图4所示的属性设置窗口,按上述赋值进行属性设置即可。?
(3)编写帧校验函数:?
五、小结
本通信方案由于采用了ActiveX控件和面向对象的编程方法,因而具有封装性、继承性、多态性等多方面的特性,从而在工业控制的小型监控系统中有着广阔的应用前景。该方案已在河南信阳火电厂输煤系统中得到了应用,实际运行表明,该通信方式简单、稳定,取得了令人满意的效果。