第一部分:TCP/IP 基础知识
第二部分:TCP/IP 协议系统
第三部分:TCP/IP连网
第四部分:工具
第五部分:Internet
第六部分:运行中的TCP
OSI 模型
OSI模型,即开放式通信系统互联参考模型(Open System Interconnection),这是一种事实上被TCP/IP 4层模型淘汰的协议。在当今世界上没有大规模使用,但对于理解网络协议有帮助。OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。
OSI将计算机网络体系结构(architecture)划分为以下七层:
物理层: 将数据转换为可通过物理介质传送的电子信号相当于
邮局中的搬运工人
数据链路层: 决定访问网络介质的方式
在此层将数据分帧,并处理流控制。本层 指定拓扑结构并提供硬件寻 址。相当于邮局中的装拆箱工人
网络层: 使用权数据路由经过大型网络 相当于邮局中的排序工人
传输层: 提供终端到终端的可靠连接 相当于公司中跑邮局的送信职员
会话层: 允许用户使用简单易记的名称建立连接 相当于公司中收寄信、写信封与拆信封的秘书
表示层: 协商数据交换格式 相当公司中简报老板、替老板写信的助理
应用层: 用户的应用程序和网络之间的接口老板
网络分层对比
工业协议的再总结
狭义上,可类似看成 profinet=profibus+ethernet
,profinet 是一种新的以太网通讯系统,是由西门子公司和 profibus 用户协会开发。 profinet 具有多制造商产品之间的通讯能力,自动化和工程模式,并针对分布式智能自动化系统进行了优化。其应用结果能够大大节省配置和调试费用。 profinet 系统集成了基于 profibus 的系统,提供了对现有系统投资的保护。它也可以集成其它系统。参考文章
Ethernet/IP:
是一个面向工业自动化应用的工业应用层协议。它建立在标准UDP/IP与TCP/IP协议之上,利用固定的以太网硬件和软件,为配置、访问和控制工业自动化设备定义了一个应用层协议西蒙公司开发。
PROFINET:
由PROFIBUS国际组织(PROFIBUS International,PI)推出,是新一代基于工业以太网技术的自动化总线标准。作为一项战略性的技术创新,PROFINET为自动化通信领域提供了一个完整的网络解决方案,囊括了诸如实时以太网、运动控制、分布式自动化、故障安全以及网络安全等当前自动化领域的热点话题,并且,作为跨供应商的技术,可以完全兼容工业以太网和现有的现场总线(如PROFIBUS)技术,保护现有投资。
PROFINET是适用于不同需求的完整解决方案,其功能包括8个主要的模块,依次为实时通信、分布式现场设备、运动控制、分布式自动化、网络安装、IT标准和信息安全、故障安全和过程自动化。
MODBUS/TCP:
是简单的、中立厂商的用于管理和控制自动化设备的MODBUS系列通讯协议的派生产品。显而易见,它覆盖了使用TCP/IP协议的 “Intranet”和“Internet”环境中MODBUS 报文的用途。协议的最通用用途是为诸如PLC’s,I/O模块,以及连接其它简单域总线或I/O模块的网关服务的。
MODBUS/TCP协议是作为一种(实际的)自动化标准发行的。既然MODBUS已经广为人知,该规范只将别处没有收录的少量信息列入其中。然而,本规范力图阐明MODBUS中哪种功能对于普通自动化设备的互用性有价值,哪些部分是MODBUS作为可编程的协议交替用于PLC’s的“多余部分”。
它通过将配套报文类型“一致性等级”,区别那些普遍适用的和可选的,特别是那些适用于特殊设备如PLC’s的报文。
虽然这些工业以太网都是国际标准,但是指的是IEC 61784里的标准,但是这些工业以太网不都是标准的以太网。即这些工业以太网并不都是符合IEEE802.3U的标准,这当中只有Modbus-TCP和EtherNet/IP是符合IEEE802.3U的,只有符合IEEE802.3U标准的,才能与IT和以太网将来的发展相兼容。而不符合IEEE802.3U标准的,基本上可以讲不是以太网,它们都对以太网进行了修改,或者是硬件或者是软件,已经不是以太网了。
各种工业以太网的区别:
其实主要就是协议的区别,其中最主要的还是应用层协议
的区别,我们知道,按照OSI的参考模型,网络被划分为7层。
a. Modbus TCP
和EtherNet/IP
的区别主要是应用层不相同,ModbusTCP的应用层采用Modbus协议,而EtherNet/IP采用CIP协议,这两种工业以太网的数据链路层采用的是CSMA/CD,因此是标准的以太网,另外,这两种工业以太网的网络层和传输层采用TCP/IP协议族。还有一个区别是,Modbus协议中迄今没有协议来完成功能安全、高精度同步和运功控制等,而EtherNet/IP有CIPSafety、CIP Sync和CIP Motion来完成上述功能,所以才有Schneider加入ODVA,成为ODVA的核心成员来推广EtherNet/IP。由于这两种网络都是标准的TCP/IP以太网,所以所有标准以太网节点都可以接入这两种网络。
b. PROFINET
分为原来划分为v1,v2,v3,现在一般称为ProfiNetCBA
、ProfiNet IO
和ProfiNet IRT
.也就是通过以太网来实现对等通讯、实时控制和运动控制。v1采用TCP/IP
协议,采用标准的以太网,而V2和V3不采用tcp/ip协议,这两种都绕过tcp/ip协议,采用另外的网络层和传输层协议,开发ProfiNet采用开发人员人员认为tcp/ip协议增加了数据在网络中的传输延迟,其实这是一种误解,据美国密歇根大学的教授研究后认为数据在TCP/IP中的传输延迟很小,他们研究得出数据在经过TCP,IP栈时延迟只有不到100微秒,如果采用UDP/IP时就更小,同时他们研究也得出数据在不同应用层延时比较大,不同的协议延迟不一样,但是相差不是很大,从200us-800us不等,他们经过实验后认为以太网的基础设施(指交换机、网卡等)和TCP/IP协议并不是影响工业以太网实时性的主要原因,而认为应用层协议才是主要原因。所以密歇根大学的教授认为绕开TCP/IP协议没有丝毫的意义,反而由于缺少了TCP/IP协议,使得设备也就缺少了IT功能,与其它现场总线没有区别。 ProfiNet V3就更特别了,它不完全采用标准以太网的数据链路层,有一不时间采用以太网的数据链路层(CSMA/CD),而另外一部分时间采用自己的数据链路层,通过一个高精度的时间来完成。所以ProfiNet V3也就不是标准的以太网了,也就给Profinet v3带来如下的问题:不能采用标准的交换机、不能采用标准的以太网芯片、与企业网相连可能会出现问题,与标准以太网相连还要特殊的网关、添加和删除一个节点都需要重新组态网络和重新启动网络、至今没有千兆网络,还有最重要的是,当标准以太网以后发展了后,它不能与标准以太网相兼容,不具有将来以太网所应具有的功能。
作者对工业协议的看法:
我认为Ethernet/IP
和ProfiNet
这两种工业以太网
都适合各个行业,并不象heidai讲的应用的行业不一样。首先这两种工业以太网都用于传输非实时数据,还可传输实时数据,即可以用于离散控制,也可用于过程控制(当然现在还不能用于本安应用)。其次,这两种工业以太网都可用于网络功能安全传输,Ethernet/IP
有CIP Safety
协议,而ProfiNet
有Profisafe
协议,还有在运动控制方面ProfiNet
有 ProfiNet IRT
,而EtherNet/IP
则有CIP Safety
,二者都可以用于中高端的运动控制。最后两者都有基于IEEE1588
的高精度时钟同步。而Modbus TCP
,EtherCat
和PowerLink
,都只能完成部分控制任务,如Modbus TCP
一般只作常规IO
实时和非实时数据。而EtherCat和PowerLink则更象是为运动控制而开发的,这二者好像没有功能安全、在PLC和DCS控制方面也没有得到大自动化公司的支持,况且这两者又对以太网进行修改,一个在软件,另一个在软件和硬件方面都进行了修改,都不能兼容标准的以太网设备,个人认为这样做得不偿失,为满足运动控制而不能兼容已有的标准的以太网设备而开发的工业以太网并不是以太网,与其说是工业以太网还不如说是另一种现场总线。
我认为工业以太网的竞争将会在Ethernet/IP
和ProfiNet
间进行,而其它工业以太网都是这两者的陪衬,将会逐渐退出市场。
EtherNet/IP
以后将由罗克韦尔自动化、Omron、施耐德和思科公司来推动,而ProfiNet
将由业界老大西门子公司带领一些小公司去奋斗,由国内PLC厂商中的老二、老三和老五对老大,不知谁将引导未来。
中国用户和制造商应选择Ethernet/IP
还是ProfiNet
,各人的看法有所不同,不过我认为firstrazor所说的没错,由于ProfiNet采用了专门的芯片、网卡、交换机等以太网基础设施,虽然ProfiNet应用层协议是公开的,但这些芯片却是专用,国内的制造商要想开发符合ProfiNet
标准的设备,确要依赖于这些芯片,受制于提供芯片的公司,也就是西门子公司,因此可以将ProfiNet
并不是完全开放的。而相反,Ethernet/IP
不论是在软件还是硬件上都是标准和开放的,国内的工业以太网制造商还是选择EtherNet/IP
为好,至于最终用户的选择,当然是从可靠性、价格、兼容性和可替换性方面考虑,可靠性方面,二者没有明显区别,在其它方面Ethernet/IP
具有明显的优势。
参考文章
以太网
上述 profinet
Ethernet/Ip
是工业以太网,属于以太网。以太网是局域网的一种。
以太网(Ethernet)指的是由 Xerox(施乐)公司创建并由Xerox、Intel和 DEC公司联合开发的基带局域网规范,通用的以太网标准于1980年9月30日出台,是当今现有局域网采用的最通用的通信协议标准。
通常 数据链路层遵从CSMA/CD
协议通信,那么 它就可以被称为以太网。
ethernet采用无源的介质,按广播方式传播信息。它规定了 物理层和 数据链路层协议,规定了物理层
和数据链路层
的接口以及数据链路层与更高层的接口。
知乎大神关于232、485、Modbus等的总结
RS232
,RS485
是物理层的协议,定义了各线的针脚功能,连接的物理结构。就好像各国对马路上行车要求左行或右行一样,规定大家都照着一个规则走。RJ45
是物理接口,俗称的水晶头,网口。但并不是要求一定是网络协议,比如有些设备只用了两个针脚来连接RS485
的两线。这时候虽然是用RJ45
,但走的物理协议是485。MODBUS
协议是数据层
的协议,打个比方来解释下和物理层的差别:都是用声音这种方式来交流,两人也需要都用同一种语言,声音是物理层而语言就是数据层。同样,一种语言可以是声音也可以是文字,MODBUS
也根据在不同物理协议上通讯,可以分成MODBUS-RTU(MODBUS-ASCII)
和MODBUS-TCP/IP
。串行口本义是包括所有串行通信在内的所有接口,但国内经常用来特指电脑上的9针RS232
接口,也就是DB-9。
我们先来看接口:
设想直流电源,它的输出端插座接口有三个管脚,分别是正极、负极和接地极。相应地,负载的插头也应当有三个管脚与电源侧一一对应,这样才能正确地获得电能供应。
注意到这里有三个必须满足的条件:
第一是插头和插座管脚的形状、大小和插针直径及长度必须一一对应,否则无法完成接插操作。这一点规定了插头组合的物理结构和管脚定义。
第二是电源的输出电压值必须满足载侧的需求值,否则无法完成电参量的要求。这一点决定了插头组合的电平规范。
第三是电源的输出阻抗与负载的输入阻抗必须匹配,否则不能实现完善的供电。这一点决定了电源的工作性质。
这三点其实就是电源插头组合在物理层面上的规范性协议。
再看通信接口。在有关计算机信息交换的ISO(国际标准化组织)OSI模型里,物理层是最底层(第一层),它规定了接口的机械外形、接口管脚定义、接口电平和字节格式。
这里的字节格式,指的是一个字节中有几个数据位,有几个起始位/停止位,有几个奇偶校验位。一般地,一个字节有8个数据位,1个起始位(停止位),和1个奇偶校验位。注意:起始位和停止位可以合并。
再看通信接口和通信网络的工作制问题。
当我们拿手机挂电话时,我们发现通信双方在通话的同时也可以接听,这叫做全双工(双向工作制);如果说话的时候不能听,而接听的时候不能说,但任何一方都具有说和听的能力,也即对讲机的通话型式,这叫做半双工。
RS422接口和RS232接口是全双工接口,而RS485则是半双工接口。
对于半双工接口,显然需要有通信的发起者,所以RS485接口和网络一定具有主站和若干从站,并且从站的数量也有规定。一般地,从站的数量是32个。
RS485主站与从站的关系问题,看似只是通信工作制的不同,其本质是通信各方对通信总线控制权的合理分配。
我们再看总线连接问题。
我们还是以电源为例。我们可以从电源引出一条主干线,然后再并联若干个支路并分别送到若干个负载。只要满足电源的功率要求,显然这是可行的。
如果我们用同样的方法来引出RS485的通信线,是否可行呢?答案是否定的。我们必须从通信主站先引一条线到第一个通信子站,再从第一子站引第二条线到第二子站,如此循环直到最后一个子站。在通信线的终端,还要配一个终端电阻。在这条通信线路上,任何一点如果发生断路,则后续的通信链路上的通信也就断了。这种接线方法形象地被称为菊花瓣连接方法,或者链形连接方法,而电源的接线方法则被称为星形连接方法。
我们发现,从电气接线来看,链路是并联的。但从通信来看,链路是菊花瓣的,属于一个接一个的有秩序的连接。
现在我们可以总结一下了:RS485的总线网络接线方式必须是链形菊花瓣的接线方式,并且属于半双工的通信方式;RS232是点到点的接线方式,属于全双工通信。不管是RS232接口,还是RS485接口,它们必须符合物理层的通信规约。
再看MODBUS-RTU通信协议:
有了物理层通信接口,是不是就能通信呢?答案是否定的。物理层通信接口只是使得通信双方具备通信条件而已。但若双方说的话谁都听不懂,或者通信双方的说话方式及语法结构不相符,显然这也无法通信。
在OSI模型中,物理层之上是数据链路层。MODBUS-RTU协议就是数据链路层协议,只要通信双方都采用了MODBUS-RTU协议,则能确保通信语言是双方都能听得懂的语句格式。
注意这里的词汇“语句”。物理层定义的是字节,相当于语言中的字,数据链路层则把字节组织成语句,也即帧。帧规定了通信双方所用语句的语法结构。
MODBUS也是主从式的。和物理层的总线控制是一样的,这里的主从关系,就是对通信总线的控制权做了规定。主站先下达命令,占用总线;接着把总线空置,交给从站去写回应码;从站完成后,再把总线还给主站。
现在我们来看看ISO的HDLC规定的帧结构,也即通信语句的语法结构,如下:
在MODBUS通信协议下,不同的命令功能码它的帧结构不尽相同。对于读寄存器命令,MODBUS的主站帧结构是:2个字节的地址码,1个字节的功能码,2个字节的数据地址码,2个字节的CRC校验码;MODBUS的从站回应帧结构是:2个字节的功能码,1个字节的回应区字节总数,N个字节的回应数据,2个字节的CRC校验码。
虽然物理层协议与数据链路层协议不同,但数据链路层协议的执行必须建立在通信双方物理层连接已经符合要求,并且已经可以无障碍地实现信息交互的基础上。
这个规则在ISO/OSI模型的七层协议中必须完全彻底地得到执行。在ISO/OSI模型中,通信双方的低层次协议必须为上层协议建立透明的无故障的连接和信息交换关系。也就是说,各层次的上下级关系必须是绝对的。
从数据链路层再往上,就是网络层了。它的任务是构成现场总线的信息交换网。
网络层的功能包括:把通信帧打包成数据分组,然后把数据分组发送给对方。
由于通信双方的网络结构可能不同,于是对于同种网就需要用网桥来连接,而异种网则需要用网关来连接。
网络之间的信道可能有多条。数据分组在发送时有多种路径可以选择。负责选择路径的元件称为路由器。路由器不但决定了真实的数据交换网络路径,还可以构建虚拟的网络路径,还要决定数据分组的发送秩序。因此,路由器是网络层中最复杂最关键的装备。
OSI模型中,把物理层+数据链路层+网络层合并称为现场总线,其通信接口就是8针的RJ45水晶头。显见,RJ45与RS232/RS485/RA422完全不是一回事。
网络层的数据分组是数据帧的组合。通俗地说,数据分组是一篇短文,或者是一页待传递的数据组合单元。
网络层在发送数据分组时,其路由问题和接收组合问题见下图:
我们看到网络层在通信时先由路由器确定路由路径,然后把分组发送到对方。对方接收到分组后,把分组按前后秩序组合起来,再解包为实际文档。
指的注意的是:由于网络层有了路由器,因此网络层支持星形网络结构。
现在我们来关注一下ISO/OSI的7层模型,如下:
值得注意的是:RS232/RS485/RS422通信接口以及它们的定义,是非常明确的。包括管脚的电平,管脚的功能定义,以及接口在信息发送和接收信息时的数据流时序关系,这些都必须准确和严格,否则就无法执行信息交换。
当PLC与某电力仪表交换信息,并且这些电力仪表符合RS485/MODBUS-RTU通信规范。我们要做什么事呢?
第一,我们按菊花瓣结构的通信链路要求去接线,将PLC的通信接口与N个电力仪表接口连接起来。最后一个电力仪表的末端要配100欧的终端电阻。
第二,我们把这N个电力仪表按地址递增的原则确定各自的地址,例如01H、02H、1FH等等。这里的H表示是16进制,1F表示16+15=31。
第三,我们在PLC编程软件中设定好电力仪表规定的通信速率
第四,我们在PLC编程软件中按电力仪表的数据区地址码设定好MODBUS通信码,以及各个子站的循环关系。
注意,这里的MODBUS通信码满足PLC的IEC61131-3编程模块要求,一般的PLC梯形图没有此功能。梯形图满足IEC 61131-1要求,但不满足IEC 61131-3要求。
第五,在PLC的内存中开辟专用数据区,存放从电力仪表读取到并处理后的信息,以便让更高层的总站来读取信息。此数据区有一个名称,叫做数据点表,有时也简称通信协议。
最后,当然就是开机测试了。其中的内容很多,限于篇幅不再介绍。
我们来看一个在RS485网络上用MODBUS-RTU读取数据的例子,如下:
某电力仪表,地址是01H。在电力仪表内存第2000的位置上,放置了三相电流和三相电压等6个数据,每个数据占用两个字节,共12个字节。
此电力仪表的通信速率是9600bps。什么意思呢?bps表示一个0/1,也就是比特,这说明每秒钟这条总线上可以发送9600个比特。我们已经知道一个字节有8个数据位,1个起始位,1个奇偶校验位,刚好10位或者10个比特,所以,如果电力仪表的通信速率是9600bps,那么1秒钟就可以发送:
9600/10=960个字节。
我们还知道,主站的读数据的帧结构(下行帧)中,有1个字节的地址,1个字节的功能码,2个字节的内存地址,2个字节的数据数量,2个字节的CRC校验码,总共有8个字节,所以主站发送读数据MODBUS通信帧占用的时间是:8X10/9600=8.33毫秒。
对于本例,我们知道MODBUS-RUT读数据的命令是0X03H,也即03命令。注意这里的写法:0X是字头,中间的03是命令,最后的H表示是16进制。
具体通信帧的是:01 03 07 D0 00 06 C5 45,其中0X01H是地址,0X03H是命令,0X07D0H是内存地址2000,0X0006H表示读取连续6个字,也即内存中的电流和电压参数,0XC545H是01 03 07 D0 00 06的CRC校验码。
那么电力仪表的回应帧(上行帧)的帧结构是:1个字节的地址,1个字节的功能码,1个字节的数据区字节数,12个字节的数据,2个字节的CRC校验码,总共17个字节,占用时间是:17X10/9600=17.7毫秒。
具体的仪表回应通信帧是:01 03 0C 00 64 0064 0064 00 DC 00 DC 00 DC D6 F5,其中0X01H和0X03H的意义同前,0X0CH表示上传数据区有12个字节,0X0064H表示A相电流为100A,后面的两组为B相和C相电流,均为100A,0X00DCH表示A相电压为220V,其后两组为B相和C相电压,均为220V,最后0XD6F5H为CRC校验码。
从主站发起下行通信帧,再等待10毫秒让从站回应,再接收到从站发还的上行通信帧,总历时为:
如果有31个相同的仪表等待主站一一访问,则主站从访问第一个仪表开始,到最后回应完毕,总历时:
这里的1.12秒就是在通信速率为9600bps下这31台仪表的读数据循环周期,且忽略了主站再次发送下行通信帧的等待时间,实际时间会略微再长一些。
相信,看到这里,大家对MODBUS-RTU下的通信帧应当有了较为深刻的认识。
提醒大家:一个字有两个字节。一般地,字节只能用来表达8个开关量。但对于模拟量,则要用字来表达。例如电流1250A,16进制下是04E2H,要用2个字节才能表达完整。也因此,各种电力仪表中,模拟量都是用字来表达的。
以下是MODBUS的部分常用功能码,也即命令码:
几个相关的问题解释一下:
1)有些现场总线,用令牌解决了总线的控制权问题。
大家很容易想到,如果从站有紧急事项需要主站来服务,可是MODBUS规定了轮询规则,等到自己的时候,可能会太迟了。于是许多现场总线就发明了一个特殊的东西,叫做令牌。令牌很短,只有一个字节,它可以很快地在总线上传递。令牌在各站点中传递,谁拿到令牌,谁就是主站,就可以发布信息。如果本站没有事情需要发布,就把令牌交给下一个站点,由此解决了总线占用问题。
2)当链路发生断路时,为了避免出现通信中断,可采用双主站措施。双主站(PLC的两个主站RS485接口)之间用握手线连接,平时主用RS485开通,而辅助RS485浮空。浮空的RS485虽然接在总线上,但它处于高阻态等效于完全脱离。当发生断路时,从站确认后立即开通通信,从链路两头进行连接通信。
有时,还采取环状通信措施。限于篇幅,不做介绍。
3)MODBUS可工作在网络层,此时协议变为MODBUS-TCP,但还是符合主从结构。
4)MODBUS协议是美国莫迪康公司发明的,该公司的宗旨是:MODBUS协议为不收费的公开协议。后来莫迪康公司被施耐德公司收购了,施耐德公司继承了莫迪康公司的做法,MODBUS是不收费的公开协议。既然MODBUS已经成为施耐德的协议,施耐德把它延伸到网络层,构建了网络层的MODBUS-TCP协议,以及内部专用的MODBUS-PLUS协议。限于篇幅,对于这两个协议的描述此处从略。
5)关于RS232和RS485的区别
学过模电和数电的人都知道差分电路。差分电路具有共模抑制比,能够消除共模误差。RS485接口就具有此特征。因此RS232接口的传输距离仅为十几米,而RS485/RS422接口的传输距离为1200米。
我们从图中看到,虽然RS232和RS485接口的外形是一致的,但它们的性能和信息交换模式不同,因此抗干扰能力也不同。
6)当距离很长的时候,RS485接口还可以接入光纤,但需要配备1对光纤转换器。之所以要1对,是因为其中一只用于电转光,而第二只则用于光转电。光纤收发器中间的通信介质就是光缆或者光纤。(注意哦,光纤是光缆的芯线,不要以为是两种东西)
光纤分为单模和多模。单模的光纤较细,光在传输过程中反射较少,因而失真小,其传输距离可达15km以上;多模的光纤较粗,光在传输过程中反射较多,因而失真大,其传输距离为1.5km。
注意这里的f(x)就是除去CRC校验码的MODBUS通信帧,除数是CRC16。帧中的CRC是运算后的余数。
主站在发送帧之前,把帧先做CRC计算,再把CRC运算的余数附在帧尾发送给从站。从站接收到帧后,先对帧除去CRC的部分做CRC运算来检验是否正确,若不正确,从站要求主站重发。
同理,当从站发送信息给主站时,主站也根据CRC来检查数据的正确性。若发现错误,则要求从站重发。
8)关于MODBUS-RTU、MODBUS-ASC和MODBUS-TCP
如果MODBUS中字节表达数据的方式采取BCD码,则被称为MODBUS-RTU;如果MODBUS中字节表达数据的方式采取ASCII码,则被称为MODBUS-ASC;如果MODBUS运行在网络层上,则被称为MODBUS-TCP。
ASCII码的内容如下:
MODBUS在实际使用中,大多数都采用BCD码,因此MODBUS-RTU得到广泛应用。
BCD码如下: