quote:以下是引用凡烨在2011-04-13 13:55:15的发言:quote:以下是引用sunzhongjin在2011-04-13 13:02:25的发言:
关于协议通讯,我认为速度由快到慢应该是profinet(对TCP堆栈结构进行了处理)、ISO、UDP、TCP、ISO on TCP、 S7。 TCP和UDP虽同在第四层,但是有区别的,TCP保证数据能可靠并且按顺序到达,是完全可靠的连接传输,然而资源要求也比较多,结构也比较复杂。TCP首先需要在传输方的两端建立一可靠的连接(通过信号的三次握手),然后通过数据包的各项校验确保数据完全正确。做过带握手协议的底层编程会帮助理解这个问题。UDP设计初衷就是尽可能快的将数据包发送出去。所以UDP协议显得非常精简。只要建立一个包,构造一个有目标信息的IP头,然后发出去。无需连接。
3"ISO协议是面向于数据块的,而TCP/IP是面向于流的",的确,TCP包是流的,没有边界,ISO发送的是离散的对象,需要有数据结束标志。 西门子PLC的ISO on TCP是附加了RFC1006,但实际上不能说ISO on TCP就是RFC1006,因为ISO on TCP还可以附加RFC983,RFC2126等协议。 针对TSAP,他的全名应该是TCP service access point,也就是TCP的服务访问点。其实这个问题解释起来比较复杂,可以从ISO/OSI参考模型说起。这7层之间如果想通讯,就是通过SAP来完成的,不过每一层的SAP都是具有不同名字,例如IP层的SAP称为ISAP。这些是很专业的术语,OSI/ISO对应的TCP/IP的模型中,TSAP对应的就是Port,即端口号。这也就是说SAP是层层之间的寻址而且要唯一。对于ISO协议来说,没有IP层,那么意味着不能路由,所以寻址只能通过MAC地址。对于访问高层的应用程序就需要TSAP了。不过你在Step7组态时,不需要改变任何的TSAP,因为Step7自动生成了符合ISO协议的TSAP标识。这要下载这些组态信息PLC之间就可以相互识别。 我认为S7协议是一个大包,也就是MPI,PROFIBUS,Ethernet上的S7协议部有区别的,因为S7协议毕竟是第7层的协议,由于所嫁接的底层协议毕竟是不同的。所以这种多样性就是复杂性的一种体现。另外,对于细节协议,S7协议的应答十分两步的,首先是对协议层的应答,接着应答应用层,这也是它的复杂性。Step7在NetPro中作的很普遍,所以不易察觉。 ISO on TCP不需要组态MAC地址这是真的,因为应用层寻址并不是依靠MAC地址,而是依靠IP和Port来完成的。在TCP上加入不是ISO的校验机制,而是ISO的协议与其连接。因为ISO协议与TCP协议是不同的,ISO协议是面向于数据块的,而TCP/IP是面向于流的。其协议的本质就是有没有数据的结束标志。 对于SAP,不用考虑太多,它只是层与层之间的桥梁,所以向下向上都会有SAP,而在Step7中所显示的SAP往往是向上的,因为应用层毕竟是相对独立特殊的,不像TCP/IP那样普遍。在任何时候都需要建立的,只不过在TCP/IP中你看到的是端口号。 对于Step7 TCP的连接可以有两种方式,一种是通过Open IE的方法,通过功能块确定Server/Client的关系来实现动态的一种连接,也可以断开这个连接。PLC对于这个连接个数同样是有限制的。另外一种就是在NetPro中建立TCP连接,当下载组态后,连接自动建立,但这个资源不能动态释放。连接一旦建立,数据就开始通讯了。不过每个包数据的大小并不是我们决定的,而是TCP的滑动窗口算法决定的。所以使用TCP协议时,速度的快慢不是我们所能把握的。另外流的概念就是你所接收的并不一定是你所发送的。而数句块的概念所接收的一定是你所发送的。
总结的很好!
不过,恰恰在我们使用TCP/IP时,是可以把握其快慢的。我前面所说,PLC通信的速度依靠PLC的通信负荷的%,发送功能块的发送周期和接收功能块的接收周期,以及数据量的大小。
TCP窗口的目的是控制流量,如果我们设法始终让窗口为空,那么通信速度就会加快起来,这就要求我们对PLC的内部通信处理机制有所了解,或者说真正的了解ISO/OSI参考模型的魅力。如果其它条件一定,那么提高速度的最好方法就是把接收功能块的放到周期最小的组织块OB中,这里的最小就是比发送功能块的放到的组织块OB的周期还小。你可以试试。
另外,流的特点确实是“你所接收的并不一定是你所发送的”,这是因为窗口的缓冲作用。但如果PLC也这样,谁还敢用TCP/IP来通信呢?所以在PLC应用TCP/IP通信时,除了上述我所说的,只要设置发送DB=接收DB的长度,就可以实现发送的就是你所接收的。
CP模块确实有这样的问题,接收和发送块的长度最好定义为相同。但是,PN口CPU之间的OPEN IE通讯,FB64 TRCV块有个LEN参数,通过设定这个LEN参数的值,就可以决定数据接收的方式。
关于TCP连接的诊断,CP模块通过NETPRO建立连接,有现成的FC10 AG_CNTRL系统块。但是PN口CPU之间的OPEN IE通讯,却没有系统功能块调用来诊断。我只能在通讯双方编写心跳程序来诊断连接的状态。