技术中心
 
 

FX系列可编程控制器与计算机通信的实现

   日期:2008-01-04     作者:管理员    

   1  引言

  可编程控制器PLC是以微处理器为核心,综合计算机技术、自动控制技术和通信技术发展起来的一种通用工业自动控制装置,它具有可靠性高、体积小、功能强、程序设计简单、灵活通用、维护方便以及抗干扰能力强等优点,因而广泛应用于电力、冶金、能源、化工、交通等领域,但是大多数中小型PLC的显示功能较差,人机交互操作不便,管理人员不能及时了解现场情况,尤其是在现场调试中,为弥补PLC在这些方面的不足,在实际控制系统中,通常采用PLC作为下位机实现对生产过程的控制,以计算机作为上位机实现工艺流程参数显示、控制参数设置等功能,使PLC和计算机相互结合,充分发挥PLC在开关量、模拟量控制和计算机在管理、监控等方面的优势,以实现优势互补,极大提高控制系统的性价比。

  实现计算机和PLC控制系统的关键是两者之间的通信,一般情况下,用户可以采用现有的组态软件实现监控,但该方法成本较高,为此本文介绍了在Visual Basic 6.0的环境下,实现计算机与三菱FX系列PLC的串行通信方法。

  2  PLC与计算机的通信端口连接

  FX系列PLC的编程

接口采用RS-422标准,而计算机的串行口采用RS-232C标准,因此采用接口模块FX-232AW将RS-422标准转换为RS-232C标准。如图1所示,计算机、PLC与FX-232AW之间采用反馈与交叉相结合的连接图。

FX系列可编程控制器与计算机通信的实现如图

  图1  FX-232AW接口引线连接图

  引脚2、3:将引脚2、3交叉互连,使PLC与上位机之间能发送和接收数据。

  引脚4、5:将引脚4、5反馈短接,对计算机发送数据来说,PLC总是处于数据准备就绪状态,计算机在任何时候都可以将数据送到PLC中。

  引脚6、20:将引脚6、20交叉互连,对计算机来说就必须检测PLC是否处于准备就绪状态,即检测引脚6是否为高电平。当引脚6为高电平时,表示PLC准备就绪,可以接收数据,这时计算机就可以向PLC发送数据了;反之,当引脚6为低电平时,PLC与计算机则不能通信。

  3  计算机与PLC之间的通信协议

  FX系列PLC与计算机的通信模式有两种:

  PLC与计算机采用专有协议(dedicated protocol)通信,这种方式无须编写梯形图,计算机直接读写PLC;

  PLC与计算机无协议通信,这种方式需要编写梯形图,并使用串行数据传送指令RS。这里介绍专有通信协议。

  FX系列PLC与计算机专有通信协议提供有数据读取、控制命令写入、控制PLC启/停和网络测试等功能,该协议有两种格式:format1和format4。两种协议的区别在于字符串中是否添加CR/LF码,采用哪种格式的协议由PLC中的特殊数据寄存器D8120决定,计算机向PLC传送的字符串格式如图2所示,在该字符串中,可由D8120来决定是否添加和校验码,此外format4需要在字符串末尾添加CR/LF。计算机与FX系列PLC之间采用主从应答通信方式,PLC内部不需要额外的通信程序,只要将所需数据放在数据寄存器中即可。每个数据寄存器都有相应的物理通信地址,通信时计算机直接对物理通信地址进行操作。

FX系列可编程控制器与计算机通信的实现如图

  图2  字符串格式

  控制代码(Control Code)主要用来控制每步数据的传送。以format 1为例,当要对PLC进行读操作时,计算机发出请求报文,该报文以ENQ码开头,并包括了报文中的所有字段,其中有字符域A。PLC对计算机的请求作出响应,以STX码开头,以ETX码结尾,该报文不包括操作指令字段和消息等待时间。当计算机收到PLC发出的响应报文,计算机发出确认报文或未确认报文,该报文只包括有控制代码、站号、PC号和错误码Error Code,如图3所示。

FX系列可编程控制器与计算机通信的实现如图

  图3  计算机从PLC读操作报文协议

  计算机与PLC间通过报文来交换信息,这些信息在交换过程中需要遵守一些约定。当要对PLC进行写操作时,计算机同样发出请求报文,该报文以ENQ码开头,包括了报文中的所有字符字段,其中有字符区域C,PLC对计算机的请求作出响应,返回确认报文或未确认报文,如图4所示:

FX系列可编程控制器与计算机通信的实现如图

  图4  计算机向PLC写操作报文协议

  站号(Station NO.)用来决定计算机访问哪一台PLC,在FX系列PLC中,站号范围从00H到0FH,特殊辅助寄存器D8121可用于设置站号。

  PC号(PC NO.)用来识别PLC上的CPU,对于FX系列PLC,该值为FFH。

  指令(Command)用来指定要进行的读写操作,每个命令字都由两个ASCII码表示。

  消息等待时间(Message Wait)指从计算机发出指令到成为接收状态所需的时

间,以10ms为一单位,等待时间可达150ms,可通过一个0到F间的ASCII码来设定。消息等待时间主要用于半双工通信模式下读写操作间的切换。

  字符区域(Character)A为计算机要读取的存储区的开始位置和字节数。B为PLC返回的要读取的存储区的数值。C为计算机要写入的存储区的开始位置和数值。

  和校验码(Sum Check Code)是从站号开始、和校验之前所有字节按位相加后取和的低两位数的ASCII码,和校验码主要用于校验数据传送过程中是否发生位错误。

  4  计算机与PLC通信程序设计

  在Windows操作系统中实现串行通信主要有三种途径:

  利用一些编程工具如Delphi提供的通信控件SPComm,Visual Basic或Visual C++提供的特定通信控件MSComm,开发者通过对这些控件编程来实现对串口的操作。

  调用Windows提供的API函数在Win32环境下,硬件设备被当作文件系统来访问,应用程序调用Create File()函数来读写数据。

  通过C/C++语言将自己的程序编译链接为DLL,然后用Visual B

asic调用DLL里的函数来通信。这里介绍VB中通过MSComm控件实现串行通信的方法。

  由于Visual Basic 6.0是Windows环境下简单高效的可视化编程语言开发系统,以其所见及所得的可视化界面设计风格和面向对象程序设计等特点,已广泛应用于各个领域,改编程语言不但提供了良好的界面设计能力,而且在计算机串口通信方面也有很强的功能,VB中的通信控件MSComm具有完善的串行数据收发和接收功能,不但包括有全部Windows API中关于串行通信的函数所具有的功能,还提供了更多的对象属性来满足不同用户的编程需要。

  MSComm控件提供了两种处理通信的方法:

  事件驱动法:当有数据到达端口,端口状态发生改变或有通信错误发生时,触发MSComm控件的OnComm事件,事件驱动实时性强,对外界情况可以作出快速响应,因而是处理串行端口交互作用的一种非常有效的方法。

  查询法:用软件或在程序中设置定时器实现对端口周期性扫描,通过读取CommEvent属性值来查询通信事件和错误,并作出相应处理,查询法编程简单,调试方便,如果应用程序较小,并且是自保持的,这种方法是可取的。

  由于MSComm控件隐藏了调用过程,屏蔽了通信过程中的底层操作,使用该控件只需定义相应的属性,调用Send方法发送数据或等待处理相应的事件接收数据,就可以轻松实现串行异步通信。MSComm控件支持如下主要属性和事件。

  CommPort属性:设置(返回)控件对应的端口号,系统用端口号唯一标识每一个串行端口。

  Settings属性:设置(返回)控件所用的传输协议,以字符串的形式定义控件使用的波特率、奇偶校验、数据位、停止位等参数。此设定应与PLC的设定相一致。

  PortOpen属性:打开或关闭通信端口。

  Input属性:从接收缓冲区接收并保存MSComm控件接收到的数据。

  Output属性:向发送缓冲区发送数据。

  InputLen属性:设置从接收缓冲区读取的字符数。

  InbufferCout属性:返回接收到数据缓冲区中需要处理的数据长度。在查询方式中,该属性可用来判断输入缓冲区是否接收到所需的字符。

  InputMode属性:设置(返回)Input属性传输的数据类型。

  OnComm事件:MSComm控件产生动作(如接收数据)或错误时,触发该事件。

  CommEvent属性:返回最近的通信事件或错误,可在OnComm事件中检测该属性的值后处理。

  这里给出计算机与PLC采用查询法通信的部分程序。

  'MSComm控件初始化

  Private Sub Form_Load()

  STX$=Chr$(2)

  ETX$=Chr$(3)

  ENQ$=Chr$(5)

  NAK$=Chr$(&H15)

  ACK$=Chr$(6)

  MSComm1.Settings="9600,e,7,1"

  MSComm1.InBufferSize=1024

  MSComm1.CommPort=1

  MSComm1.OutBufferSize=1024

  MSComm1.OutBufferCount=0

  MSComm1.PortOpen=True

  MSComm1.InputLen=0

  End Sub

  '计算机与PLC的连结程序

  Private Sub Command_Click()

  Dim WaitTime As Long

  Dim Star

tTime As Long

  MSComm1.Output=Chr(5)

  WaitTime=5

  StartTime=Timer

  Do While Timer<StartTime+WaitTime

  DoEvents

  Loop

  If MSComm1.InBufferCount>0 Then

  If Asc(MSComm1.Input)=0 Then

  MsgBox("连结成功,准备发送数据")

 

  MsgBox("连结失败")

  End If

  Else

  MsgBox("连结失败")

  End If

  End Sub

  '计算机从PLC读函数程序

  Function CmdRead(Rd As String) As String

  Dim X As Integer

  Dim Y As Integer

  Dim Z As Integer

  MSComm1.InBufferCount=0

  Read$=Chr(5)&Rd&CheckSum(Rd) &n

bsp; 

  '读数据帧由ENQ、命令串和和校验码组成

  MSComm1.Output=Read$

  Do

  DoEvents

  Loop Until MSComm1.InBufferCount>=9

  Data$=MSComm1.Input

  X=Val(Asc(Left(Data$,1)))

  Y=CheckSum(Mid(Data$,2,Len(data$)-3))   

  '计算应答帧的和校验码

  Z=Mid(Data$,Len(Data$)-1,2)   

  '计算接收到的应答帧的和校验码

  If X="2" And Y="Z" then   

  'STX的ASCII码为02H

  CmdRead=Mid(Data$,6,Len(Data$)-8)

  MSComm1.Output=ACK$

  Else

  CmdRead='Error'

  MSComm1.Output=NAK$

  End If

  End Function

  计算机向PLC写函数程序与读函数程序类似。

  5  结束语

  文中给出了利用VB的MSComm控件实现计算机与PLC实时通信的基本思想和设计方法,该程序简单、可靠、实用,并可根据实际工矿要求灵活修改程序。现在火电厂输煤程控系统的电除尘设备中,有些系采用该系列的PLC,可采用上述方法来保证控制系统通信稳定、有效。

 


 

 
  
  
  
  
 
更多>同类技术
 
全年征稿 / 资讯合作
 
推荐图文
推荐技术
可能喜欢