利用 VB6.0 实现 PC 与三菱 PLC 的通信 |
哈尔滨李松颖 |
本文介绍的 PC 与三菱 FX 系列 PLC 通信,是通过 PLC 的编程口与 PC 机的串口进行的,采用 SC-09 编程电缆作为计算机与 PLC 通信的连线。电缆的 9 芯 D 形插头连接在计算机串口上,另一端连接 PLC 的 RS-422 编程口。 编写 PC 的通信程序可采用汇编语言、各种高级语言,也可以采用工控组态软件或直接采用 PLC 厂家的通信软件。本文采用 VB6 . 0 软件,它必须依据所连接 PLC 的通信规程来编写通信协议,所以先简单介绍 FX 系列 PLC 的通信协议。 一、 FX 系列 PLC 的通讯协议 1 .数据传输格式 FX 系列 PLC 采用异步格式,由 1 位起始位、 7 位数据位、 l 位偶校验位及 l 位停止位组成,波特率为 9600bps ,字符为 ASCi Ⅱ码。 2 .通信命令 FX 系列 PLC 有 4 条通信命令,即读命令、写命令、强制通命令、强制断命令。表 1 中, X 为输入继电器; Y 为输出继电器; M 为辅助继电器; S 为状态元件; T 为定时器; C 为计数器; D 为数据寄存器。 3 .通信控制字符 FZ 系列 PLC 采用面向字符的传输规程,用到 5 个通信控制字符,如表 2 所示。 4 .报文格式 PC 机向 PLC 发送的报文格式如表 3 所示。其中, STX 为开始标志; ETS 为结束标志; CMD 为命令的 ASC Ⅱ码: SUMH 、 SUML 为从 CMD 到 ETX 按字节求累加和,溢出不计。由于每字节十六进制数变为两字节 ASC Ⅱ代码,故校验和为 SUMH 与 SUMI 。 PLC 向 PC 机发送的应答报文格式如表 4 所示。 二、 PC 通信程序的编写 1 .通信口初始化 , MSComm 控件简介: VB 带有专门管理串行通讯的 MSComm 控件。只需设置几个主要参数就可以实现 PLC 与 PC 间的串行通讯。要完成通信必须设置 MSComm 的相关属性值,即通信口初始化,其步骤如下: (1)CoinmPort :设置或传回通信连接端口代号。 (2)Settings :设置初始化参数。以字 - 符串的形式设置或传回连接速度、奇偶校验、数据位、停止位等 4 个参数。 (3)PortOpen :设置或传回通信连接端口的状态。 (4)Input :从输入寄存器传回并移除字符。 (5)Output :将一个字符串写入输出寄存器。 (6)InputLen :指定由串行端口读入的字符串长度。 (7)InBufferCount :传回在接收寄存器中的字符数。 2 .通讯程序举例 首先,在窗体开始设计之前,添加 MSComm 控件和按钮、文本框、标签等。 (1)PC 从 PLC 中读取数据 假设 PC 要从 PLC 中读入从 D123 开始的 4 个字节的数据 ( 占用两个数据寄存器: D123 、 D124) ,其报文如表 5 所示。 根据三菱 FX 系列 PLC 编程口通信协议,地址算法为 address=address×2+1000h 将地址 123 转换成十六进制为 7Bh ,因此首地址为: address=addressx2+1000h=7Bhx2+1000h= 10F 6h . 再转换成 ASCII 码为 31h,30h,46h,36h 校验和 SUM=30H+31H+30H+46H+36H+30H+34H+03H=174H ,溢出部分不计,故 SUMH 为 "7" , SUML 为 "4" ,相应的 ASC Ⅱ码为“ 37H ”和“ 34H ”。 PLC 的应答报文格式如表 6 所示。 (2) 把数据写入 PLC 例如,向 PLC 的 D123 数据寄存器写入数据“ 1234ABCD ”的报文格式如表 7 所示 本文介绍的利用 VB6 . O 实现 PC 与三菱 PLC 通信的基本方法,切实可行,具有广泛的实用价值。对初学者很有帮助。 Windows平台下利用VB实现电脑与三菱Q00PLC的串行通信 收藏此信息 打印该信息 添加:用户发布 来源:未知 摘要:本文分析了Windows环境下串行通信的编程技术,介绍了在Windows环境下用VB6.0语言编写串行通信程序,实现了PC机与三菱 Q00PLC 之间的串行通信,并提出了在实际应用中提高串行通信性能的方法。 关键词:VB;Win32API函数;串行通信;Q00PLC 一 概述 在工业控制中,串口是常用的计算机与外部串行设备之间的数据传输通道。由于串行通信结构简单、可靠性强、实现及使用成本低、通讯标准统一,因此在测控系统和工程中应用十分广泛。目前Windows在工业生产监控管理系统中已成为主流平台 ,Windows环境下的上、下位机之间的串行通信是设计与开发监控管理系统和集散控制系统的重要组成部分。 Microsoft公司的VB++6.0是一种高级编程语言,它提供的串列通信控件封装了封装了Win32API中的标准通信函数,可以让开发者方便开发串列通信上位机程序。 PLC是现在控制领域不可缺少的部分,已经非常普及,如何简便的与PLC交互已经成为众多厂商新的竞争战场。由此产生了人机界面、组态软件等产品。这些产品的产生大大简化了对PLC的控制,操作,使用更方便。但也有共同的缺点:价格过高和开放性较差。VB作为“原始"的编程语言在这两方面无疑有着明显的优势。 二 串行通信 串行通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。 2.1 串行通信的分类 串行通信可以分为同步通信和异步通信两类。同步通信是按照软件识别同步字符来实现数据的发送和接收,异步通信是一种利用字符的再同步技术的通信方式。 2.1.1 同步通信 同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。 它们均由同步字符、数据字符和校验字符(CRC)组成。其中同步字符位于帧开头,用于确认数据字符的开始。数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。 2.1.2 异步通信 异步通信中,在异步通行中有两个比较重要的指标:字符帧格式和波特率。数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。 接收端检测到传输线上发送过来的低电平逻辑"0"(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。 2.2 几种流行的串行通信协议 RS-232、RS-422和RS-485都是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,RS-232在1962年发布,后来陆续有不少改进版本,其中最常用的是RS-232-C版。 目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通信中增加通信距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通信。标准规定,RS-232的传送距离要求可达50英尺(约15米),最高速率为20kbps。 图1 RS232端口的硬件握手和连接方式 RS232的通讯信号电平为正负5~15V,这不同于数字电路的0~3V或0~5V,所以要以RS232的方式进行通讯,源信号不匹配时需要进行电压转换。 当进行数据传送时,只用一根数据线且只能进行单向传输的方式,称为单工方式; 当进行数据传送时,只用一根数据线利用不同时段进行双向传输的方式,称为半双工方式;当进行数据传送时,利用两根数据线同时进行发送和接收的方式,称为全双工方式。 由于RS-232存在传输距离有限等不足,于是RS-422诞生了。RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了一种平衡通信接口,将传输速率提高到10Mbps,传输距离延长到4000英尺(约1219米),并允许在一条平衡总线上连接最多10个接收器。当然,RS-422也有缺陷: 因为其平衡双绞线的长度与传输速率成反比,所以在100kbps速率以内,传输距离才可能达到最大值,也就是说,只有在很短的距离下才能获得最高传输速率。一般在100米长的双绞线上所能获得的最大传输速率仅为1Mbps。另外有一点必须指出,在RS-422通信中,只有一个主设备(Master),其余为从设备(Salve),从设备之间不能进行通信,所以RS-422支持的是点对多点的双向通信。 为扩展应用范围,RS于1983年在RS-422基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/RS-485-A标准。 由于RS-485是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿,如都采用平衡传输方式、都需要在传输线上接终接电阻、最大传输距离约为1219米、最大传输速率为10Mbps等。但是,RS-485可以采用二线与四线方式,采用二线制时可实现真正的多点双向通信,而采用四线连接时,与RS-422一样只能实现点对多点通信,但它比RS-422有改进, 无论四线还是二线连接方式总线上可接多达32个设备。 三菱的 Q00PLC 的通讯接口为RS232。 三 三菱 Q00PLC 的通讯方式 3.1 通讯协议 三菱的 Q00PLC 采用列 MELSEC 通讯协议,即 MC 协议。MC协议采用帧的形式进行通讯,它包括以下几种形式: (1)、QnA 兼容3C 帧。此种帧包括1-4种格式。 (2)、QnA 兼容4C 帧。此种帧包括1-5种格式。 (3)、QnA 兼容2C 帧。此种帧包括1-4种格式。 (4)、QnA 兼容3E 帧。此种帧包括1-4种格式。 (5)、A 兼容1E 帧。 3.2 实现方式 (1) 命令文件的发送 采用MC 协议进行的数据通讯采用半双工通讯方式进行。访问PLC CPU 时对于刚刚进行的命令文件发送请在接收PLC CPU 侧发送的响应文件后发送下一个命令文件(在响应文件的接受尚未完成之前不能进行下一个命令文件的发送) 图2 命令文件和响应的顺序 (2) 对于命令文件不能接收正常结束的响应文件时 接受异常结束的响应文件时,可根据响应文件中的出错代码进行处理 3.3 Q00PLC 的帧格式 Q00PLC内置了MC通讯协议的QnA 兼容3C 帧和 RS232 通讯接口,所以不用外加通讯模块就可以实现与上位机的通讯。本例拟采用QnA 兼容3C 帧的第4种格式进行通讯。 3.3.1 对方设备读出上位站PLC CPU 的数据时 a 上位机向 PLC CPU 侧传输命令传输文件,下图中箭头所指的区域为请求数据区。 图3 读取时的发送帧格式 b PLC CPU 侧响应上位机的应答传输文件,下图中箭头所指的区域为从PLC中读出并返回的数据 图4 返回的帧格式 3.3.2 对方设备向上位站PLC CPU 写入数据时 a 三菱plc字符串截取帧格式与图3中的格式类似,只是帧中的命令和子命令为读取时的命令,请求数据区中增加了写入的数据。 b 帧格式与图34中的格式类似,只是没有返回的数据。 四 Windows环境下 VB 与 Q00PLC 通信的实现 4.1 系统分析与说明 Windows系统为每个通信设备开辟了用户定义的输入/输出缓冲区,数据进出通信口均由系统后台来完成,应用程序只需完成对输入/输出缓冲区操作就可以了。实际过程是每接收一个字符就产生一个低级硬件中断,Windows系统中的串行驱动程序就取得了控制权,并将接收到的字符放入缓冲区,然后将控制权返还给正在运行的应用程序。如果输入缓冲区数据已满,串行驱动程序用当前定义的流控制机制通知发送方停止发送数据,而队列中的数据按先进先出 (FIFO)的次序处理。 在Windows中,串行通信有两种工作方式:查询方式和事件驱动方式。查询方式占用大量的CPU时间,效率较低,但是数据不易丢失;而Win32操作系统基于事件驱动 (也称为消息驱动)机制的内核,支持基于进程的协同式多任务和基于多线程的抢先式多任务。基于事件驱动的多线程应用程序实际上在其内部实现了多任务扩展,为代码赋予了并行执行的特性,可以使应用程序对CPU的利用率大大提高,从而提高系统的响应能力,加快信息处理速度,提高通信程序的实时性和增大数据吞吐量。 基于以上分析,以事件驱动方式实现Windows下的串行通信更具优势,它能完成较大数据量的实时通信,大大提高了通信的效率,故本程序采用此种方式进行串行通信,至于通信的可靠性可以通过软件设计来保证。 Windows平台下利用VB实现串口通信主要有以下两种方法: 1)使用Windows API(Application Program Interface)函数。这种方法可编写移植性强的通信程序,但必须首先用Declare声明VB中所要用的动态链接库DLL,这需要对Windows API函数有深入的了解,编程较复杂。 2)使用Microsoft公司提供的Active X控件MSComm。该通信控件通过改变对象属性,向对象发送消息及为对象事件编写响应代码,可以方便地完成用户应用程序间的串行通信,既可实现API函数的所有功能,又使得编程效率提高,应用功能增强,并且程序简单明了。 对于MSComm控件实现串口通信的操作很多文献都有论述,该控件的主要属性可参考相关文献,在此仅列出常用的属性和方法。需要强调的是:在数据发送与接收过程中,都要通过一个Variant类型变量作为中介。发送数据时,必须先将要发送的数据赋给一个Variant类型变量,再把该Variant变量赋值给MSComm的Output属性;同样接受数据时,也应先将MSComm的Input属性赋值给Variant变量,待接收端收到后必须转换成其它类型(如字符型、二进制型)的数据才能进行处理。本例采用MSComm控件来实现。 下面介绍MSCOMM控件的属性: CommPort:设定通信连接端口代号,程序必须指定所要使用的串行端口号,Windows系统使用所设定的端口与外界通信。 PortOpen:设定通信口状态,若为真,通信端口打开,否则关闭。 Settings:设定通信口参数,其格式是"bbbb,p,d,s",其中bbbb为通信速率(波特率),p为通信检查方式(奇偶校验),d为数据位数,s为停止位数,其设定应与PLC的设定一致。 Input:将对方传送至输入缓冲区的字符读入到程序。 Output:将字符写入输出缓冲区。 InBufferCount:传回接收缓冲区中的字符数。 OutBufferCount:传回输出缓冲区中的字符数。 InputLen:设定串行端口读入字符串的长度。 InputMode:设定接收数据的方式。 Rthreshold:设定引发接收事件的字符数。 CommEvent:传回OnComm事件发生时的数值码 OnComm事件:无论是错误或事件发生,都会触发此事件。 4.2 具体实现 本例程序为读取Q00PLC的输入输出点的状态。监控界面如下所示: 图5 监控界面 4.2.1 控件参数的初始化 MSComm1.InBufferCount = 0 ‘清空输入缓冲区 MSComm1.OutBufferCount = 0 ‘清空输出缓冲区 MSComm1.CommPort = 1 ‘设定串行通信口为com1 MSComm1.Settings = "19200,O,8,1" ‘波特率19200,奇校验,8位数据位,1位停止位 MSComm1.InputLen = 0 ‘一次读入输入缓冲区中的字符串的长度为缓冲区中的所有数据 MSComm1.RThreshold = 62 ‘输入缓冲区中每次接到62个字符就产生一次OnComm事件 MSComm1.PortOpen = True ‘打开端口 Dim STX As String ‘以下为MC协议中的ASCII码 Dim ENQ As String Dim ACK As String Dim CR As String Dim LF As String Dim NAK As String STX = Chr$(&H2) ENQ = Chr$(&H5) ACK = Chr$(&H6) CR = Chr$(&HD) LF = Chr$(&HA) 4.2.2 计算机与PLC通信程序 Private Sub Timer1_Timer() Dim SD As String MSComm1.InBufferCount = 0 MSComm1.OutBufferCount = 0 If F = 1 Then SD = ENQ + "F9" + "0000FF00" + "0401" + "0001" + "X*" + "000020" + "0030" + CR + LF Else SD = ENQ + "F9" + "0000FF00" + "0401" + "0001" + "Y*" + "000050" + "0030" + CR + LF End If MSComm1.Output = SD Timer1.Enabled = False End Sub ‘OnComm事件 Private Sub MSComm1_OnComm() Dim i, j As Integer Dim RD, Temp, RDw As String If MSComm1.CommEvent = comEvReceive Then RD = MSComm1.Input If Left(RD, 1) = STX Then RDw = Mid(RD, 12, 48) j = 0 Select Case F Case 1 j = 48 Case -1 j = 96 End Select For i = 1 To 48 Temp = Mid(RDw, i, 1) If F = 1 Then If Temp = "1" Then Lalel(i - 1).BackColor = &H80FF80 Else If i <= 3 Then Lalel(i - 1).BackColor = &HFF Else Lalel(i - 1).BackColor = &HFFFF00 End If End If Else If Temp = "1" Then If i = 42 Then Lalel(i - 1 + 48).BackColor = &HFF Else Lalel(i - 1 + 48).BackColor = &H80FF80 End If Else Lalel(i - 1 + 48).BackColor = &HFFFF00 End If End If Next i F = F * (-1) Timer1.Enabled = True ‘F = F * (-1) End If End If End Sub |
本文摘 |
VB与三菱40点PLC的通讯程序 收藏
Dim rec_bv As Variant
Dim rec_flag As Integer
Dim timer1_count As Integer
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
MSComm1.RThreshold = 10
MSComm1.InputMode = comInputModeBinary
Timer1.Enabled = True
MSFlexGrid1.Cols = 12
MSFlexGrid2.Cols = 12
MSFlexGrid3.Cols = 13
MSFlexGrid4.Cols = 13
For i = 0 To 11
MSFlexGrid1.ColWidth(i) = MSFlexGrid1.Width / 12
MSFlexGrid2.ColWidth(i) = MSFlexGrid2.Width / 12
MSFlexGrid3.ColWidth(i) = MSFlexGrid3.Width / 13
MSFlexGrid4.ColWidth(i) = MSFlexGrid4.Width / 13
Next i
For i = 0 To 11
MSFlexGrid1.Row = 0
MSFlexGrid1.Col = i
MSFlexGrid1.CellAlignment = 4
MSFlexGrid2.Row = 0
MSFlexGrid2.Col = i
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论