modbus通信协议在tcp ip上的实现本科学位论文.docx
《modbus通信协议在tcp ip上的实现本科学位论文.docx》由会员分享,可在线阅读,更多相关《modbus通信协议在tcp ip上的实现本科学位论文.docx(26页珍藏版)》请在冰豆网上搜索。
modbus通信协议在tcpip上的实现本科学位论文
MODBUS通信协议在TCP/IP上的实现
摘要:
伴随着批评家的鄙夷和使用者的称赞,MODBUS/TCP的确已不再是新生事物。
更何况对于自1979年就开始使用的MODBUS协议,为其增加基于以太网TCP/IP的传输技术是绝对由必要的。
MODBUS协议本身的MODBUS服务和对象模式在MODBUS/TCP中都没有改变,并简单地采用TCP/IP作为数据传输协议。
这使得MODBUS拥有了一系列协议,目前包括传统的MODBUS-RTU、MODBUS-Plus和MODBUS-TCP。
所有这些协议都使用相同的应用层协议-规定了统一的用户数据和通讯服务。
分析MODBUS/TCP协议构成,通过采用套接字与多线程技术,设计出基于MODBUS/TCP协议的工业以太网通信网络,分析出客户端/服务器的通信模式的主要特性,并给出其具体实现过程。
所构建的基于MODBUS/TCP与MODBUS的工业以太网可实现工业现场数据采集、处理及通信等功能,为工业自动化领域的实时网络化通信提供了一种有效的解决方案。
关键词:
MODBUS/TCP、以太网、套接字、工业、TCP/IP
MODBUSprotocolimplementateintheTCP/IP
Abstract:
Withthecontemptofcriticsanduserspraise,MODBUS/TCPisindeednolongeranovelty.Moreover,since1979begantousetheMODBUSprotocol,forincreaseinEthernet-basedTCP/IPtransmissiontechnologyisabsolutelythenecessary.MODBUSprotocolitselfandtheobjectmodelserviceMODBUS/TCPwerenotchanged,andsimplyuseTCP/IPasadatatransferprotocol.ThismakestheMODBUShaveaseriesofagreements,currentlyincludingtraditionalMODBUS-RTU,MODBUS-PlusandMODBUS-TCP.Alltheseprotocolsusethesameapplicationlayerprotocol-providesaunifieduserdataandcommunicationservices.AnalysisofMODBUS/TCPprotocolcomposition,throughtheuseofsocketandmulti-threadingtechnology,designedbasedonMODBUS/TCPprotocolEthernetcommunicationsnetwork,analyzetheclient/servermodelofthemaincharacteristicsofthecommunication,andgivesspecificimplementationprocess.ConstructedbasedonMODBUS/TCPandMODBUSindustrialEthernetcanachieveindustrialdataacquisition,processingandcommunicationsfunctionsforindustrialautomation,real-timecommunicationnetworkprovidesaneffectivesolution.
Keywords:
MODBUS/TCP、Ethernet、sockets、industry、TCP/IP
第1章引言
1.1研究背景
在现代化工业控制中,由于被控对象、测控装置等物理设备的地域分散性,以及控制与监控等任务对实时性的要求,不同设备之间现场交互性信息的传递越来越多。
但传统的工业控制系统软件存在着一些问题。
不具备开放性,各个部分的联系过于紧密,使系统过于复杂。
这样使系统的更新、扩展和升级变得非常困难,对系统任何一部分的修改都有可能对其它部分造成影响,从而导致大量且烦琐的软件和硬件的修改。
传统的工业控制软件开发中出现的另一个主要问题是软件的重复开发,软件不能够复用,资源不能共享,造成大量的人力与物力资源的浪费。
虽然使用高级语言函数库让我们可以利用面向对象的继承等方法大量重用源代码,但这些复用只是对源代码级的复用而不是对可执行文件级的复用。
由于传统工业控制系统的带来的不便,造成形成了大量的“信息孤岛”,但是,对于工业控制而言,各站点之间不是孤立的,它们必须互相配合、协调才能保证产品质量和实现连续生产,这就需要各站点能互通讯息。
另外,上级管理网也需要与子站交互数据,以实现全局的监控和优化。
然而,子站是采用不同开发平台、不同通讯协议组成的异构系统,可能由不同的厂家和个为开发。
要为每种协议写一个转换接口或驱动是比较繁琐的,特别是在站点和协议较多的时候。
因此,怎样有效集成数据,避免信息孤岛的出现,是工业控制领域中常遇到难点问题之一。
比较好的方法是各站点都采用标准协议进行数据通讯,而不必为每一种协议开发一个通讯接口。
目前这方面的协议比较多,MODBUS就是其中的一种。
MODBUS是一种全开放,免费提供,非常容易理解和实施的协议,从70年代诞生以来,在制造业、电力、水电、冶金、矿山、交通、基础设施的工业领域中的数据采集和过程控制得到了广泛应用,形成了一种事实上的工业标准。
同时,随着计算机网络技术的迅速发展,信息技术已逐步进入工业自动化领域,以太网技术以高速率、低成本、应用广泛等优势,促进了它在工控领域的应用,形成了当前的工业以太网技术。
它允许MODBUS协议与以太网TCP/IP结合,在TCP帖中嵌MODBUS信息帧,成为MODBUSTCP/IP,在工业自动化领域中,具有很高的性能价格比,是一种真正开放的理想解决方案。
1.2国内外发展现状
目前在全球范围内已经安装了8,000,000套MODBUS串行链路设备和800,000套MODBUSTCP/IP设备,基于MODBUSTCP/IP和Web技术的“透明就绪”的广泛应用可以被归类到三大市场:
能源与基础设施,工业,以及建筑行业。
◆ 在能源与基础设施市场,机场、隧道、数字通讯、电信、水处理、油气、能源等行业大大得益于“透明就绪”的远程控制能力
◆ 在工业市场,食品与饮料、微电子、制药、汽车等行业则高度的受益于“透明就绪”中从IT系统贯通到车间层TCP/IP以太网的统一全局网络架构
◆ 在建筑市场,医疗机构、公用建筑、民用住宅、船舶等行业在“透明就绪”中使用他们原有的TCP/IP以太网网络,从而大大的降低了实施费用
1.3主要技术路线
MODBUS/TCP协议是在MODBUS协议的基础上发展而来的。
为了尽量地使用已有成果,MODBUS/TCP协议的实现是在不改变原有MODBUS协议的基础上,只是将它的传输层协议简单的移植到TCP/IP上。
因此在TCP/IP网络中MODBUS/TCP使用传输控制协议(TCP)进行MODBUS应用协议的数据传输。
参数和数据使用封装的方法嵌入到TCP报文的用户数据容器中进行传送。
另外地址和校验在MODBUS/TCP中也由底层的TCP协议来完成。
由于传输层以上遵循MODBUS协议,所以采用C/S结构,在数据传输前进行之前,需要在客户和服务器之间建立一个TCP/IP连接。
服务器使用端口502作为MODBUS/TCP连接的端口。
连接的建立通常由TCP/IP的Socket接口的软件协议自动实现的,因此对应用完全透明。
一旦客户和服务器之间的TCP/IP连接建立,同样的连接可以根据要求的方向用来传输任意数量的用户数据。
客户和服务器还可以同时建立多个TCP/IP连接,最大的连接数量取决于TCP/IP接口的规范。
在输入输出数据循环传输的情况下,永久的连接通常维持在客户和服务器之间,只有在发生特殊事件而有必要传送参数和诊断报文时,连接才能在每一次数据传送后被关闭,需要时再次建立。
这也是MODBUS/TCP在工业以太网中采用TCP作为为传输层协议而不采用速度更快的UDP协议的原因所在。
虽然MODBUS/TCP由于在传输层采用TCP协议,而使其不得不在传输层协议以下的诸层采取更有效的实时性策略。
但与IDA方案相比,MODBUS/TCP在其开放性、简单和稳定的性能上具有优势,是一个具有较高的性能价格比的工业以太网方案。
1.4本文的工作
本文主要告诉读者该课题的实现过程。
在看到一个用软件编程实现的课题时,应该有的一些思路,需要掌握的一些知识。
在拿到一个课题时,首先需要为课题的实现构建一个模型,对于该课题而言,应想到怎样在一台设备上实现MODBUS协议,同时,该课题是实现通信,那么就必然不只一台设备,继而想到两台设备间的通信模型,最后到多台设备的通信结构。
建构好模型后,就应该查找相关的理论知识。
本文涉及到的理论知识主要包括MODBUS协议结构以及套接字的原理。
掌握原理后,接下来就应该设计实现流程。
对于软件开发而言,编程环境和编程语言很重要,这会对工作的复杂程度带来很大的影响。
选择好编程工具后,就要想着怎样实现课题,应构思一个流程。
本文首先需要将TCP/IP应用层以下作为一个整体,而这个整体和上层的接口即是套接字接口。
再将套接字接口与应用层MODBUS协议联系,即可实现该课题的要求。
摘取程序中最重要的部分进行分析。
能够让读者清楚的认识到整个编程实例的精髓。
最后对整个课题的实现进行一个总结,带给读者一个实现该课题的基本框架,以及在实现该课题过程中自己的一些见解以、疑问及学到的知识和技术。
提出自己对该项技术的展望,以及这项技术的发展前景。
1.5论文的结构安排
本论文共分五章,各章主要内容如下:
第一章:
介绍本论文所研究的背景,即该课题的实际应用价值。
第二章:
构建了实现课题的模型,从一台设备上实现MODBUS协议,到两台设备通信,最后构建多台设备的整体通信结构。
第三章:
为该课题建立理论基础。
该课题涉及到的理论主要包括MODBUS协议结构及套接字,分析它们之间的关系所在。
第四章:
提出实现该课题的主要流程,分为几个步骤,每个步骤应做的工作,以及用到的编程环境和编程语言。
第五章:
程序实验结果演示,并对MODBUSTCP/IP报文进行分析,通过分析体现MODBUS协议的数据交换过程。
第六章:
总结与展望。
第二章基于TCP/IP模型的MODBUS通信协议
2.1一台设备上的MODBUS模型构建
2.1.1用户应用层
它和设备应用相对应,与设备完全无关。
2.1.2通信应用层
一个MODBUS设备可提供一个客户机或服务器的MODBUS接口。
可提供一个MODBUS后端接口,间接地允许对用户应用对象的访问。
此接口由四个区域组成:
离散量输入、离散量输出(线圈)、输入寄存器和输出寄存器。
必须进行这个接口与用户应用数据直接的映射。
可将MODBUS通信应用层分为四个小模块,如下:
1、MODBUS客户机
MODBUS客户机允许用户应用显式控制与远程设备的信息交换。
MODBUS客户机根据用户应用向MODBUS客户机接口发送的要求中所包含的参数来建立一个MODBUS请求。
2、MODBUS客户机接口
MODBUS客户机接口提供一个接口,使得用户应用能够生成各类MODBUS服务的请求,该服务包括对MODBUS应用对象的访问。
3、MODBUS服务器
收到一个MODBUS请求以后,模块激活一个本地操作进行读、写、或完成其他操作。
这些操作的处理对应用程序开发员来说都是透明的。
MODBUS服务器的主要功能是等待来自TCP502口的MODBUS请求,处理这一请求,根据设备的现状生成MODBUS应答。
4、MODBUS后端接口
MODBUS后端接口是一个从MODBUS服务器到定义应用对象的用户应用之间的接口。
2.1.3TCP管理层
报文传输服务的主要功能之一是管理通信的建立和结束,及管理在所建立的TCP连接上的数据流。
TCP管理层进行两方面的管理:
1、连接管理
在客户机和服务器的MODBUS模块之间的通信需要TCP管理模块。
它负责全面管理报文传输TCP连接。
TCP502端口的监听是为MODBUS通信保留的。
客户机和服务器均应向用户提供对TCP端口号进行MODBUS参数配置的可能性。
2、访问控制模块管理
在某些至关重要的场合,必须禁止无关的主机对设备内部数据的访问。
这既是需要的安全模式,也是在需要时实现安全处理的原因。
2.1.4TCP/IP栈层
TCP/IP栈提供了一个接口,用来管理连接、发送和接收某些参数配置。
TCP连接管理模块采用栈接口,即BSD套接字接口来与TCP/IP栈进行通信。
可以对TCP/IP栈进行参数配置,以适用对不同产品或系统的不同特定约束进行数据流控制、地址管理和连接管理。
2.2两台设备间的通信模型构建
在TCP/IP网络应用中,通信的两个进程相互作用的主要模式是客户机/服务器模式,即客户端向服务器发出请求,服务器接收到请求后提供相应的服务。
客户机/服务器模式在操作过程中采取的是主动请求方式。
·服务器方:
首先服务器方要启动,侦听客户方是否有连接请求,并根据请求提供相应服务:
a.打开一通信通道并告知本地主机,它愿意在某一公认地址端口上接受客户请求,或者由开发人员自己指定端的地址,此时端口地址应大于1024B,一般不超过5000B;b.等待客户请求到达该端口;c.接收到重复服务请求时,处理该请求并发送应答信号。
接收并发服务请求,需要激活一个新进程来处理这个客户请求,并不需要对其他请求作出应答。
服务完成后,关闭此新进程与客户的通信链路,并终止;d.返回第二步,等待另外的客户请求;e.关闭服务器。
·客户方:
a.打开一通信通道,并连接到服务器所在的主机的特定端口;b.向服务器发出服务请求报文,等待并接收应答;继续提出请求;C,请求结束后关闭通信通道并终止。
从以上描述过程可以看出:
客户机与服务器进程的作用是非对称的,因此编码不同,而且服务进程要先于客户请求启动。
这个客户机/服务器模型基于4种报文类型:
MODBUS请求:
MODBUS请求是客户机在网络上发送用来启动事务处理的报文。
MODBUS证实:
MODBUS证实是在客户机侧接收的响应报文。
MODBUS指示:
MODBUS指示是服务器侧接受的请求报文。
MODBUS响应:
MODBUS响应时服务器发送的响应报文。
具体模型如下图所示:
2.3总体通信模型构建
如下图2、3所示,MODBUSTCP/IP的通信系统可以包括不同类型的设备:
1、连接至TCP/IP网络的MODBUSTCP/IP客户机和服务器设备。
2、互联设备。
第三章MODBUS在TCP/IP上的实现与分析
3.1应用层MODBUS协议描述
3.1.1TCP/IP上的MODBUS数据应用单元
MODBUSTCP/IP是在TCP/IP网络协议加上MODBUS应用层协议,形成五层开放式体系结构,其中MODBUSTCP数据帧包括报文头、功能代码和数据三个部分,其结构如图1所示。
3.1.2MBAP报文头描述
MBAPHeader由7个字节组成,是MODBUSTCP协议的头部。
四个域如图2所示,TransactionIdentifier为传输标志,ProtocolIdentifier为协议标志,Length是长度域,UnitIdentifier是单元标志。
MBAP报文结构如下所示:
MBAP报文头包括的各个域的功能描述如下表:
域
长度
描述
客户机
服务器
事务处理标识符
2byte
MODBUS请求/响应事务处理的识别码
客户机启动
服务器从接受的请求中重新复制
协议标识符
2byte
0=MODBUS协议
客户机启动
服务器从接受的请求中重新复制
长度
2byte
随后字节的数量
客户机启动
服务器启动(响应)
单元标识符
1byte
串行链路或其他总线上连接的远程从站的识别
客户机启动
服务器从接受的请求中重新复制
3.2套接字简介
套接字的概念与文件句柄类似,一个套接字就是一个通信标识,由一个短整数表示,实际上就是一个句柄,代表网络协议中的一组数据,该数据包含了通信双方的IP地址和当前的连接状态等信息。
我们知道,如果一个文件被打开,可以通过文件句柄对文件进行读写操作,套接字也一样,只不过套接字提供的函数更多一些。
套接字存在于通信区域中,由协议、地址、端口来描述并惟一确定,根据传输协议的不同,套接字可分为3种类型:
流式套接字、数据报套接字和原始套接字。
流式套接字提供了一个面向连接的、可靠的、数据无错且按顺序接收的服务,这种套接字对应的是面向连接的传输协议,如TCP/IP协议簇中的TCP。
数据报套接字提供了一个无连接服务,不提供无错保证,数据可能丢失或重复,且接受顺序混乱,该套接字所对应的是无连接传输协议,如TCP/IP协议簇中的UDP。
原始套接字允许直接访问低层的协议,如IP、ICMP协议,该套接字常用于访问服务器中配置的新设备。
WinSock提供了许多套接字函数,它们并不代表协议的某一个层次,其实质就是一组编程接口,用户利用这些函数可以很容易地进行编程。
该程序设计中用到的套接字如下所示:
(1)socket()函数
Socket()函数用于创建一个套接字。
返回的一个套接字号被创建者用来访问该套接字。
套接字创建时没有地址(IP地址和端口号)。
直到一个端口被绑定到该套接字时,方可接受数据。
socket函数用于创建一个套接字。
语法:
SOCKETsocket(
Intaf,
Inttype,
Intprotocol
);
af:
标识一个地址家族,通常为AF_INET。
type:
标识套接字类型,如果为SOCK_STREAM,表示流式套接字;如果为SOCK_DGRAM,表示数据报套接字。
protocol:
标识一个特殊的协议被用于这个套接字,通常为0,表示采用默认的TCP/IP协议。
(2)bind()函数
Bind()函数用于将套接字绑定到一个已知的地址上。
bind()函数在套接字与所指定的端口间建立连接。
语法:
intbind(
SOCKETs,
conststructsockaddrFAR* name,
intnamelen
);
s:
是一个套接字。
name:
是一个sockaddr结构指针,该结构中包含了要绑定的地址和端口号。
namelen:
确定name缓冲区的长度。
在定义一个套接字后,需要调用bind函数为其指定本机地址、协议和端口号。
例如,创建一个套接字s,将其绑定到502端口上,其代码如下:
intport=502;
SOCKETs=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
sockaddr_inaddr;
addr.sin_family=AF_INET; //内部网络协议TCP\UDP等
addr.sin_port=htons(port); //端口号
addr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(s,(LPSOCKADDR)&addr,sizeof(addr))==0)
{
MessageBox("成功");
}
(3)connect()函数
为了初始化一个连接,客户机必须发送connect()函数来制定套接字号、远程IP地址和远程监听端口号。
语法:
intconnect(
SOCKETs,
conststructsockaddrFAR* name,
intnamelen
);
s:
标识一个套接字。
name:
套接字s想要连接的主机地址和端口号。
namelen:
name缓冲区的长度。
(4)listen函数
listen函数用于将套接字置入监听模式。
语法:
intlisten(
SOCKETs,
intbacklog
);
s:
套接字。
backlog:
表示等待连接的最大队列长度。
例如,如果backlog被设置为3,此时有4个客户端同时发出连接请求,那么前3个客户端连接会放置在等待队列中,第4个客户端会得到错误信息。
(5)accept函数
为了完成连接,服务器必须发送accept()函数来指定先前在listen()调用中所指定的套接字号。
一个新的套接字被创建,并具有与初始套接字相同的特性。
这个新的套接字连接到客户机的套接字,而将套接字号返回到服务器。
于是,释放出示套接字,以便为其他欲与该服务器连接的客户机使用。
语法:
SOCKETaccept(
SOCKETs,
structsockaddrFAR*addr,
intFAR*addrlen
);
s:
是一个套接字,它应处于监听状态。
addr:
是一个sockaddr_in结构指针,包含一组客户端的端口号、IP地址等信息。
addrlen:
用于接收参数addr的长度。
(6)send()和recv()函数
TCP连接建立以后,数据即可被传送。
将send()和recv()函数专门设计成和已经连接的套接字一起使用。
(7)close()函数
一旦不使用,通过该函数关闭套接字。
3.3应用程序与套接字关系
1、系统调用
大多数操作系统使用系统调用(systemcall)的机制在应用程序和操作系统之间传递控制权。
对程序员来说,每一个系统调用和一般程序设计中的函数调用非常相似,只是系统调用是将控制权传递给了操作系统。
如下图所示:
2、应用编程接口API(ApplicationProgrammingInterface)
如上图所示,当某个应用进程启动系统调用时,控制权就从应用进程传递给了系统调用接口。
操作系统将此接口再将控制权传递给计算机的操作系统。
此调用转给某个内部过程,并执行所请求的操作。
内部过程一旦执行完毕,控制权就又通过系统调用接口返回给应用进程。
由上可知,系统调用接口实际上就是应用进程的控制权和操作系统的控制权进行转换的一个接口,即应用编程接口API。
套接字(Socket)就是由操作系统提供的一组有关TCP/IP的API。
3、套接字(Socket)的作用
如下图所示,应用进程通过套接字接入到网络。
第四章课题的具体实现流程
4.1编程环境
4.1.1VC++与面向对象
Windows编程采用的是面向对象的方法(ObjectO