用Powerbuilder8.0实现PC机与PLC的串口通信
孟凡军,樊亚东
(武汉大学电气工程学院,武汉430072)
摘要:该文详细论述了在Powerbuilder8.0开发环境中利用Mscomm32.ocx控件来实现上位机PC与PLC的串口通信,并分别介绍了Mscomm32.ocx控件的属性、事件以及使用方法。同时,该文也给出了下位机FX2N系列PLC的通信机制以及应该注意的问题。
关键词:Powerbuilder8.0;Mscomm32.ocx控件;PLC
Theaccomplishmentofserialcommunication
betweenPCandPLCbyPowerbuilder8.0
Mengfanjun,Fanyadong
(schoolofelectricalengineering,wuhanuniversity,wuhan430072)
Abstract:Inthisarticle,wehaddiscussedthemethodtoaccomplishtheserialcommunicationbetweenPCandPLCbytheMscomm32.ocxcontrolintheenvironmentofPowerbuilder8.0indetail,andwehadalsointroduceddifferentlytheproperty,incidenceoftheMscomm32.ocxcontrolanditsusage.Atthesametime,wehadexplainedtheprincipleofcommunicationofFX2NwhichbelongedtothePLCandthenotice.
Keywords:Powerbuilder8.0;Mscomm32.ocxcontrol;PLC
前言
随着工业自动化程度的提高,上位机与下位机的串口通信在工业生产中已经越来越显示出它的重要性。下位机能够通过串口通信及时地把现场的状态信息传送给上位机,而上位机也能够通过串口通信接收现场信息,进行相应的数据分析、计算、信息存储、状态显示等。在一些特殊场合,PC机还可以把控制决策信息反馈给下位机。因此,串口通信在整个控制系统中起着关键性的作用。本文结合上位机PC与下位机三菱FX2N系列PLC来具体实现这一点对点式串口通信问题。
在本篇中,我们详细讨论了在Powerbuilder8.0开发环境中利用Mscomm32.ocx控件来实现PC机与FX2N的串口通信,并论述了FX2N的通信机制以及应该注意的问题。
上位机PC的串口通信
PC机的串口通信机制
在上位机windows操作系统下实现串口通信主要是调用windowsAPI或使用MICROSOFT公司提供的通讯控件Mscomm32.ocx。调用windowsAPI函数十分复杂,它涉及到进程调度等问题。而Mscomm32.ocx控件较为简单,它提供了一系列标准通信命令的接口,我们只要设定和监视通信控件的属性和事件就可以快速准确地实现上位机的串口通信。
Mscomm32.ocx控件的使用
Mscomm32.ocx通信控件是Powerbuilder8.0开发串口通信的一种重要控件,该控件可以通过被注册来使用。它允许建立连接,可以连接到其他通信设备(如modem),还可以发送命令,进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件。因此,我们可以使用Mscomm32.ocx控件来创建事件驱动的、高效实用的通信程序。在具体的编写程序过程中,我们常常要用到它的属性,以下列出它的常用属性。
commport:设置并返回通信端口号
settings:设置并返回波特率、校验位、数据位、停止位
portopen:设置并返回端口状态,也可以用于打开和关闭串口
inbuffercount:返回接收缓冲区的等待读取的字节个数
output:向发送缓冲区发数据
rthreshold:该属性确定当接收缓冲区内字节个数达到或超过该值后就产生代码为comeventreceive的oncomm事件
inputlen:设置或返回接收缓冲区用input读入的个数
input:返回并删除接收缓冲区的数据
commevent:有通讯错误或事件发生时产生oncomm事件
在Mscomm32.ocx控件中,它只提供了一个oncomm事件。这个事件的用法相当灵活,它可以截取串口的任何消息,从而转入事件处理程序。在使用中,它常常与commevent属性配套使用。commevent属性是oncomm事件的指示器,oncomm可以通过判断它来转入不同的事件处理。Commevent属性值一般表现为接收到中断信号(comeventbreak),硬件检测到帧错误(comeventframe),接收缓冲区溢出(comeventrxover),发送缓冲区溢出(comeventtxfull),接收到规定的字符数(comeventreceive)等。因此,我们就可以通过oncomm事件来实现数据的接收、发送以及处理在通讯过程中出现的错误等。
下位机三菱FX2N的通信
下位机FX2N只有RS-422接口,它不能直接与PC机RS-232端口连接。因此,我们需要给FX2N接入一个FX2N-232BD通讯模块才能实现FX2N与PC机COM端口通讯。在下位机通信的具体实现过程中,FX2N内部的通信格式涉及的参数必须和Powerbuilder8.0开发的Mscomm32.ocx控件涉及的通信参数一样,比如波特率、奇偶校验位、停止位等。只有把有关的参数都设置成一样,FX2N与PC机才能进行无误的通信。FX2N有它自己的通讯指令RS,我们可以用它来按照上、下位机规定的协议进行通讯。在运用RS指令的过程中,FX2N通过设置数据寄存器D8120的通信格式,并配套使用发送和接收数据的标志序号M8121、M8122和M8123来进行通信。数据的发送和接收分别是以数据寄存器D200和D500为起始的。它们即可以发送和接收16位的数据,也可以发送和接收8位的数据。因而,FX2N的通信具有很强的灵活性。
在本文中,我们把上位机设置成以字符文本的方式接收和发送数据,而字符由ASCⅡ字符码组成。所以,在下位机的通信设计中,我们把FX2N数据的接收和发送设置成16位。这样,我们能方便实现下位机数据的接收和发送,有效地利用数据寄存器。同时,本文还考虑到了下位机与上位机的软件握手协议问题。在下位机接收数据之前,它首先要辨识上位机的询问ENQ字符(下位机是否准备好)。若是,它就要发送ACK应答字符(FX2N已准备好)和正文内容给上位机。否则,它就要发送NAK出错字符(FX2N未准备好)。为防止信号信道数据传输有误,我们定义字节的奇偶校验方法,这就保证了上、下位机的数据传送的正确性。下位机的通信格式是整个通信的关键问题,本文列出我们在数据寄存器D8120设置通信格式的具体内容,表格如下:
Powerbuilder8.0具体实现上位机PC串口通信
Powerbuilder8.0是一种强有力的界面开发工具。我们通过创建窗口、文本控件、多行编辑框控件、命令按钮控件、Mscomm32.ocx控件来实现上位机PC的串口通信。在实际应用中,由于PLC主要用来完成对现场的控制功能,PC机主要用来起到管理监督等作用。因此,我们着重突出PC机的现场状态信息的显示作用。其主要功能是上位机PC发出启动通信,下位机FX2N接收启动命令,并把工业现场的一些状态信息返回给PC机,PC机再根据PLC的传递数据来显示现场的一些状态等。相关的代码如下:
4.1窗口open事件脚本:
ole_mscomm.object.commport=2
//设置PC机的2号端口
ole_mscomm.object.settings=”9600,O,7,1”
//波特率9600bit/s,奇校验位,数据位为7位,1位停止位
ole_mscomm.object.inputmode=0
//设置以文本字符的方式接收和发送数据
ole_mscomm.object.inbuffersize=1024
//接收缓冲区的大小为1024字节数
ole_mscomm.object.outbuffersize=512
//发送缓冲区的大小为512字节数
ole_mscomm.object.rthreshold=m
//接收缓冲区接收m个字符产生oncomm事件
ole_mscomm.object.sthreshold=0
//禁止PC机发送字符产生oncomm事件
cb_stop.enabled=false
cb_start.enabled=true
4.2启动通信控件cb_start的clicked事件脚本:
longll_start,ll_used
ole_mscomm.object.portopen=true
//打开PC机串口
ole_mscomm.object.outbuffercount=0
//清除发送缓冲区
ll_start=cpu()
do
ll_used=cpu()-ll_start
loopwhilell_used<=11000
//延迟1秒发出,下位机需延时2个以上的扫描周期才能接收数据。
ole_mscomm.object.output=char(5)+”start”
//发出启动信号(包含有询问ENQ字符)
cb_start.enabled=false
cb_stop.enabled=true
cb_exit.enabled=false
4.3Mscomm32.ocx控件的oncomm事件脚本:
stringls_input
integerli_check
choosecasecomeventreceive
//接收缓冲区接收到m个字符时触发
ole_mscomm.object.inputlen=m
//设置接收缓冲区读取字符数为m个
ls_input=ole_mscomm.object.input
//开始接收
li_check=asc(mid(ls_input,1,1))
ifli_check=6then
//PLC返回第一个字符为应答字符ACK
st_1.text=”上位机与下位机握手成功”
mle_1.text=mid(ls_input,2,m)
//显示PLC返回的正文字符
else
ifli_check=21then
//PLC返回第一个字符为出错字符NAK
st_1.text=”上位机与下位机握手失败”
mle_1.text=”通信出错”
endif
endif
ole_mscomm.object.inbuffercount=0
//清除接收缓冲区接收的字符
casecomeventbreak
…//处理通信中断信号
casecomeventframe
…//处理通信帧错误
casecomeventtxfull
…//处理发送缓冲区溢出
casecomeventrxover
…//处理接收缓冲区溢出
caseelse
endchoose
4.4停止按钮控件cb_stop的clicked事件脚本:
ole_mscomm.object.portopen=false
//关闭PC机串口
cb_start.enabled=true
cb_stop.enabled=false
cb_exit.enabled=true
4.5退出按钮控件cb_exit的clicked事件脚本:
close(parent)
结束语
在本篇中,本文详细论述了Mscomm32.ocx控件的属性、事件以及在通信过程中的具体使用方法。通过这种Mscomm.ocx控件的运用,我们可以方便地实现PC机串口通信,准确无误地接收和发送数据。同时,我们也给出了FX2N 系列PLC的通信机制以及在使用中应该注意的问题。本文还结合Powerbuilder8.0来开发PC机的串口通信,并成功实现了上位机与下位机的串口通信。
参考文献:
【1】龙腾、杨俊、张勤、杨飞、于世江编著《powerbuilder8.0实例中》国防科技大学出版社
【2】《三菱微型可编程控制器MELSEC-FFX2N系列编程手册》
作者简介:
姓名:孟凡军(1979-),性别:男,籍贯:湖北,学历:硕士,
研究领域:电气控制
学校:武汉大学电气工程学院,
通讯地址:武汉大学电气工程学院研02级3班,
邮编:430072,
身份证号:420523791027003
电话:13554657982027-87886714
E-mail:vigsuc@sina.comvigsuc@sohu.com
姓名:樊亚东,性别:女,
职称:武汉大学电气工程学院副教授
|
|