基于以太网接口的PLC上位机通讯系统设计1 引言随着信息时代的到来和国际互连网Internet的兴起,TCP/IP协议(传输控制协议/网际协议)越来越被人所熟知和重视。
在工业控制领域,利用TCP/IP协议编程实现下位机的数据通讯和数据交换,既容易形成工厂企业内部局域网络体系,也便于设备和Internet相连,实现远程监控。
TCP/IP协议是当今最成熟、应用最广泛的计算机互连网技术,拥有一整套总体结构和协议标准。
该协议诞生于70年代中期,Unix引入该协议后极大的促进了它的发展,许多公司都推出了基于TCP/IP协议的软件包和工业产品,现在Microsoft公司的Windows98/2000/X P和基于Windows开发的VB6.0等都包含了TCP/IP协议,永宏公司的PLC产品也开发生产了带有TCP/IP协议支持的Ethernet产品,这使永宏的PLC与PC利用该协议进行网络互连进行数据交换和远程监控变得可行。
2 系统概述某自动售货机系统设计中,本地的下位机控制采用永宏公司的FBs系列PLC进行售货控制,系统组成如图1所示。
人机主态采用基于TCP/IP协议的VB6.0编写,为便于实现售货的数据统计和交换,VB通过写操作把数据导入Excel中。
硬件配置:FBs-CBE-20MAT+24EYT+16EY+16EY图1 系统组成3 自动售货控制功能售货机销售液态货品,每台主机控制32个售货台的电磁阀,以体积分ABCD四种不同量,32电磁阀能同时销售货品。
考虑到成本,系统采用共用ABCD的方式,在输出控制上用多点巡回扫描方式,图2示出PLC巡回扫描电路设计。
图2 PLC巡回扫描电路设计动态扫描检知每个售货台的选择类型,当有类别被选择时,启动该售货台的出液电磁阀,并且用时间控制来决定不同类别的出液量。
PLC还必须记录每次销售货品的类别和该销售所发生所在售货台的站号,以便PC实时的统计。
4 PLC以太网服务器架设以太网络通讯转换器的工作原理是透过本模块为中介,将网络上欲传给主机的以太网络信号解出后转为CPU主机可接受的串行信号,透过Port1传送给直接连接之CPU主机或与Por t1连接之其它CPU主机。
此一转换过程完全为透通(Transparent)方式。
换句话说对CPU主机而言,其完全不知道此信号系由网络传来,其回传信号与一般之串行通讯并无二致。
当模块收到主机回传之串行信号后再将其打包为网络封包并将其传回网络上。
配合以太网络界面转换模块应用,永宏公司提供一窗口版设定软件“Ether_cfg.exe”,利用此软体把模块服务模式(Server mode),在服务模式下本模块会等待网络传来的讯息,译码之后将此讯息传到串行通讯端口给CPU主机。
CPU主机回复的讯息待本模块接收后会再将其打包并回传至网路上,如此即完成一笔命令的循环。
采用该模块可以同时连接8个客户端连接。
设置如图3所示,协议采用永宏标准通讯协议。
具体项目解释如下:(1) Firmware Version:代表以太网络界面转换模块内的软件版本;(2) IP Address:本模块的网络地址;(3) Subnet Mask:本模块的子网络掩码;(4) GateWay:本模块的所在局域网络网关;(5) Host Name:批注用,可用于辨识不同模块,最多可输入11个字符;(6) Comment:批注用,可用于说明更详细之模块信息,最多可输入21个字符;(7) Operation mode:客户或服务工作模式选择;(8) Protocol:Fatek或ModBus/TCP通讯协议选择,ModBus/TCP仅能使用于Server模式。
图3 PLC以太网络通讯转换器设置5 数据采集和通讯5.1 永宏通讯协议和系统数据采集永宏PLC之通讯讯息格式无论是命令讯息(主系统发出)或响应讯息(从系统发出)均可概分为6个数据域位,如图4所示,具体解释如下。
图4 永宏PLC通讯协议讯息格式(1) 开头字符(STX):ASCI I码之开始字符STX,接收方以此判知传输数据之开头;(2) 从站号码:为两位数之16进制数值,在永宏PLC通讯系统中之网络架构采用主从系统在整个网络系统中只有一个主系统,但可以有254个从系统,每个从系统均有一个独一无二之站号;(3) 命令号码:为两位数之16进制数值,所谓命令号码系由主系统要求从系统所执行之动作类别,例如要求读取或写入单点状态、填入或读取缓存器数据、强制设定、运转、停止…..等;(4) 本文资料:本文数据可为0(无本文数据)~500个ASCII字符,在命令讯息中此字段数据用以指定命令所要运作或存取之对象(地址)或要写入之数值;(5) 侦误值(CHECKSUM):侦误值系将前述~各字段之所有ASCII字符之16进制数值以“纵式余数查核法”LRC(Longitudinal Redundancy C heck)计算产出一个Byte长度(两个16进制数值00~FF)之侦误值。
本通讯协议LRC侦误值之计算方法是将各ASCII字符之16进制数码值(8位长度)从头至尾依序相加,但不考虑进位,因此最终结果仍为8位长度之侦误值;(6) 结尾字符(ETX):ASCI I码之结尾字符ETX之16进制数码为03H,当接收方收到ET X 字符后便知该次通讯已结束。
本系统运行界面所需的数据是PLC的内部暂存器R0-R9等10个16BIT的数据,依照协议VB设计的通讯程序必须指定一个命令码,主动向PLC请求数据传送,查的该命令码为“46”,解释为:连续多个缓存器之数据读取。
读取R0-R9的PC命令的ASCII码写法为:“STX+01(站号)+46(命令码)+10(连续数据个数)R00000(数据开始地址)+LRC(侦误值)+ETX”侦误值(CHECKSUM)计算,为VB的编程方便,把该计算做成单独一个子程序,依所有数据累加,舍弃进位的规则VB的LRC编程如下:Private Function Lrc(Dats) As StringDim iDim SumSum = 0For i = 1 To Len(Dats)Sum = Sum + Asc(Mid(Dats, i, 1))Next iIf Len(Hex(Sum + 2)) = 1 Then Hex(Sum + 2) = "0" + Hex(Sum + 2)Lrc = Right(Hex(Sum + 2), 2)End Function5.2 VB的TCP/IP协议通讯设计随着计算机的网络化已经渗透到各个领域,尤其是以TCP/IP协议之间的网络互连发展很快,但是TCP/IP协议的底层编程很复杂,VB6.0提供了基于Windows Sockets网络编程接口的Winsock控件,它使开发TCP/IP通讯程序变得简单方便。
Winsock控件是一个运行时不可见的控件,它对Winsock API进行了封装,可以不必了解TCP/IP细节就可以调用Winsoc k API。
只要设置好Winsock控件的属性,就可以对Winsock控件的方法触发的事件进行相应处理。
(1) Winsock控件的属性LocalIP:返回本地机器采用“点分十进制”格式的IP地址;LocalPort:本地计算机通讯应用程序的端口;RemoteHost:远程机器名;RemoteHostIP:远程机器的IP地址;RemotePort:远程机器通讯应用程序端口;SocketHandle:Winsock API的句柄参数;State:连接的当前状态;Protocol:设置使用的协议(TCP或UDP)。
TCP或UDP采用:TCP是一种面向连接的服务,在文件传输时会先行建立连接,通过链接提供双向、有序且无重复的数据流服务、以及流量控制、差错检测和纠错等服务,从而确保文件传输的正确性;UDP则是一种无连接的服务,它在传输文件时不会确保传输端的文件能够正确无误的传送到接收端,所以当使用UDP时,通常要自己作接收确认的工作。
该系统发送的数据比较小,而且多用在本地的局域网内,利用UDP协议无需建立连接占用的资源少,编程简单的优势,采用UDP协议向服务器请求资料。
(2) VB程序启动且立即设置Winsock属性的程序设计Private Sub Form_load()Winsock1.Protocol = sckUDPProtocolWinsock1.RemoteHost = "192.168.1.168"Winsock1.RemotePort = 500End Sub(3) 采用轮询方法向服务器请求数据的程序设计Private Sub Timer1_Timer()Winsock1.SendData (Chr(2)+ “014610R00000”+“70”+chr(3))End Sub(4) 处理服务器响应信息,进行字符处理,得到十进制的各项数据的程序设计Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)Dim InRbuf As StringDim InR(0 To 9) As StringWinsock1.GetData InRbufInRbuf = Mid(Buf, 4, 44)For K = 0 To 9InR(K) = Val("&H" + Mid(InRbuf, 4 * (K + 1), 4)) `数据处理,R0-9放于InR(0-9)NextText1.Text = InR(0)End Sub5.2 Excel数据写入和VB界面设计在该功能设计中,在VB中引用了Microsoft Excel 11.0 Object Library,另外配合Exc el的VBA(宏)操作快速把数据写入Excel,极其方便销售数据的统计,Excel部分界面如图5所示,VB部分源码如下:图5 Excel界面Set xlApp = CreateObject("Excel.Application")`创建EXCEL应用类xlApp.Visible = False`设置EXCEL不可见Set xlBook = xlApp.Workbooks.Open("c:\ Sale.xls") `打开EXCEL工作簿Set xlsheet = xlBook.Worksheets(1)`打开EXCEL工作表xlsheet.Activate `激活工作表xlsheet.Range("A6:D5000").Value = " "`清空单元格xlBook.RunAutoMacros (xlAutoOpen)`运行EXCEL中的启动宏xlsheet.Cells(1, 2) = InR(0) `写入A类和xlsheet.Cells(1, 3) = InR(1) `写入B类和xlsheet.Cells(1, 4) = InR(2) `写入C类和xlsheet.Cells(1, 5) = InR(3) `写入D类和VB界面中实时记录每次发生的售货动作,如图6所示。