专家大讲堂《PLC通信原理探秘》系列视频:https://www.ad.siemens.com.cn/service/elearning/series/288.html
最新更新:
连载之十五: 【PLC通信原理探秘】大讲堂幕后彩蛋之苦大
连载之十六: 【PLC通信原理探秘】大讲堂幕后彩蛋之愁深
连载之十七: 【PLC通信原理探秘】大讲堂幕后彩蛋之砥砺
连载之十八: 【PLC通信原理探秘】大讲堂幕后彩蛋之前行
连载之十九: 【PLC通信原理探秘】大讲堂幕后彩蛋之一步
当你弄清楚事物运动的本质,那根据此事物的任何问题都可以迎刃而解。所以理解TCP的发送功能块的参数,例如Done或Busy,就可以解释和理解一些现象,解决现场出现的一些问题。不过,在探索TCP/IP通信的过程中还有许多问题和概念需要去澄清和理解。通过测试,可以发现在TCP的通信过程中,存在两个缓冲区,一个是Shadow Buffer,另一个是堆栈Buffer。根据前面的测试,证明前面的推论是正确的,也就是说Shadow buffer的大小与发送数据的大小一致,而TCP/IP的堆栈大小为固定的8K,也就是滑动窗口的大小是8K,用来调节发送端的发送数据的速度。
为了进一步证明两个Buffer的作用和概念,实验仍然是必不可少的,此时,网线连接一切完好, 而接收功能块的使能为0,也就是说在建立正常的收发后,关闭接收功能。此时,还是按照之前的收发4K,那么发送6次后,Done=5,Busy=1。这表示在接收侧具有和发送侧一样的缓冲区,大小一致。前三次发送,填充了接收侧的2个缓冲区,分别是4K和8K,后三次发送,填充了自己的2个缓冲区,分别是8K和4K,这进一步证明两个Buffer是存在的,而且对于堆栈Buffer大小是固定的8K,属于系统特性,对于Shadow buffer应该是和发送和接收的DB大小一致。
在测试的过程中,还发现了一个奇怪的现象。就是在接收侧CPU重新启动后,建立TCP连接,接收功能块T_RECV不使能的情况下,还是按照上述的方式发送4K数据,那么发送5次后,Done=4,Busy=1。通过改变收发字节的数量,例如1K,反复测试的结果,都是类似的。那么发送了5次,前二次填充了接收侧的堆栈Buffer,为8K,后面三次填充的是自己的2个缓冲区,分别是8K和4K,这就表明Shadow Buffer生成需要使能相应的功能块,否则不能创建相应的缓冲区,而Stack Buffer属于系统特性,是随着TCP连接的建立而存在的。
上述的测试都是收发的数据长度小于数据一致性8K字节,那么如果大于8K会是如何呢?测试收发16K,那么还是按照先前的测试条件,测试结果发现,发送2次,Done=1,Busy=1,这是怎么原因?如果按照之前的判断结果,Shadow buffer应该是16K,堆栈Buffer是8K,应该发送3次,Done=2,Busy=1。然而实验的结果表明不是的,这说明哪里出了问题,或者理解有误。这又该如何判断呢?
经过分析,还是从数据一致性入手,按照前面提到的方法测试数据一致性大小为8K,即[8191]和[8192]自增1的程序来判断,确实是8K的数据一致性。那么是不是Shadow buffer的大小最大就是8K呢?带着这样的假设,如果发送2次,Done=1,Busy=1,那么意味着第一次发送16K,占满了接收侧的Shadow Buffer和堆栈Buffer,分别是8K,总共是16K,第二次的发送占满自己发送侧的两个缓冲区,也是总共16K。经过多次验证,表明Shadow buffer的最大确实是8K。
那么前面有些结论并不是十分的充分,现在我来总结一下,Done信号表示的是DB区的全部数据通过Shadow Buffer推送到堆栈Buffer才置位。因为从16K数据可以看到,第二次的16K的发送实际上是有8K数据从Shadow Buffer推送到堆栈Buffer中的,但是Done并没有置位,第一次的完整16K是经过了Shadow Buffer推送到堆栈Buffer中的,Done置位。Shadow Buffer,只有当调用TSEND或者TRCV时,Shadow Buffer才生成,且最大是8K,如果收发的DB长度小于8K,那么Shadow Buffer的大小与DB的大小一致,否则,保持最大的长度为8K。
此外,最终从这些测试和结论,还能够得出新的结论就是Shadow buffer的大小决定了数据一致性的大小,这个结论应该具有普遍性,也就是说S7通信的数据一致性也应该是由Shadow Buffer的大小来决定的。是不是真的是这样,我们拭目以待吧。
----------未完待续----------
连载之二十一: 【PLC通信原理探秘】大讲堂幕后彩蛋之残余
连 载 汇 总: 【PLC通信原理探秘】系列连载故事汇总