展开查看
以下是引用啤酒鱼在2014-11-11 22:26:52的发言 >138楼:如果使用TCP连接,发送10个字节而接收只有8个字节,那么发送的前8个字节到的接收区后,满了,还有两个字节又重新放到接收区的前两个字节中,这样你接收的数据前两个字节就被覆盖了,同样接收区可以是任意,如果发送的数据是一样的,接受区接收到的数据就是循环变化的,不容易判断。有人又会问道,为什么接收与发送区不设置为一样呢,例如都是20个字节,但是在应用中会发现会有问题,例如MODBUS/TCP,客户端可以发送读/写请求,读3区数据20个字节的请求,然后从接收区读出,如果下一次从4区读出4个字节数据是,你的接收区就会变化,假设分别从不同的数据区读出5,6,7个字节,那么我的接收区应设置多大呢,如果设置为5,那么接收到6个字节时,数据的次序就会发生变化,使编程人员不易判断。也有工程师想过,设置一个大的接收区,接收到新的数据就清零,实验后发现,第一次接收到4个字节后清零,第二次接收到的数据还是从接收区的第5个字节开始接收,与清零无关。为了解决这样的问题(如果读取固定长度的数据那就幸福了)第一可以购买西门子通信函数块,另外一种就是设置接收区为一个字节长度,通过编程移动数据(与DONE结合).使用TCP连接的另外一种风险就是数据的更新问题,假设上位机读写PLC数据,大家都知道上位机快呀,这样相当于发送快于接收,如果上位机发的快而PLC接收的慢,这样数据就会堆积到网卡的缓冲区中,PLC接收一次数据,网卡的缓冲区就会腾出一点空间,有空间后才可以再次发送,这样就会出现上位机发的数据几分钟后才传到PLC中,这样的事件在PLC中出现的少,有几次,在SIMOTION就比较多了,因为上位机发送实时的指令与算法,这时需要考虑到PLC中的接收频率。为什么要使用TCP连接的,1:例如与上位机通信不需要驱动;2:使用MODBUS TCP;3:使用其他操作系统但是这场TCP协议的;4:需要路由,现场中很少使用,例如通过互连网两个PLC通信,通常都是编程器通过互联网远程维护。如果要我定义一个两个PLC间通信的方式(我的观点),使用TCP连接时我需要发送与接收数据定长,并且接收频率大于发送频率,我就不考虑了,ISO(没有了,或很少网卡支持)和ISO_On_TCP都比较好,因为1:发送快了就会报错(现在好像再优化,原来一定会的,所以建议在OB35中发送,在OB1中接收)2:数据有长度信息,接收区大于发送区就可以了,接收的数据总是从头开始。但是与上位机通信就有问题,1:不支持unix系统(不好编写驱动,前面已提出)2:在windows系统中需要购买SIMATIC NET。这些通信统称S5兼容通信或用户开放式通信,这些通信的确认都是网卡实现的,早期是CP卡,现在CPU集成的PN接口也支持,如果需要用户数据层的确认,例如我发送的数据对方是否接收到,除了用户编写程序识别并确认外,另外一种通信方式就需要S7通信了。
以下是引用啤酒鱼在2014-11-05 17:40:06的发言 >:说来话长,如果深入...
以下是引用jacky_andy在2014-11-04 13:21:25的发言 >:西门子的通信方式太...
下面再介绍一下S7通信服务。
当然S7通信是随着S7 PLC而产生的,所以通信都是围绕着S7PLC的。上面介绍西门子最擅长S/R通信,这种通信在以太网上使用ISO(mac地址)和ISO_ON_TCP(IP地址)这两种方式,同样S7通信服务(service)还是借鉴了这些方式,所以建立连接时可以输入MAC地址,传输方式就是ISO,使用的是TSAP;也可以输入IP地址,传输方式就是ISO_ON_TCP,但是使用的是TSAP而不是端口号,所谓ISO_ON_TCP方式,我个人理解就是有ISO也有TCP,所以虽然使用了TSAP,也可以知道端口号是102,只是没有说。
S7通信服务为应用层,所以大家说可以独立于网络,MPI,PROFIBUS,ETHERNET都可以使用,我感觉PPI也借鉴了S7的通信机制,但是非常简单。
S7通信服务其实是一个集合,不能简单理解,它分为PLC间的数据交互、PLC与wincc,
PLC与操作面板、PLC与PG通信。
首先介绍一下PLC简的S7通信。S7通信使用三种通信函数,第一种PUT/GET,可以单方编程,继承了FETCH/WRITE功能,但是更简单了,因为不需要写报文头了(类似MODBUS RTU),直接读写对方的数据。S7-300由于通信资源少,只能被读写,而S7-400之间一个连接下,都可以对对方数据进行读写,这也是为什么在两个公司进行通信时不选择S7通信连接(在S7-1500中改了,增加了一个开关,用于屏蔽PUT/GET功能);第二种为BSEND/BRECV;第三种为USEND/URECV。那么有人问,PLC通信为什么使用应用层进行通信,效率不是低吗?
其他比S/R通信效率是低,但是都不是实时网络。如果通信需要对方确认呢,使用S/R、
就麻烦了,因为它们的确认只到通信处理器,而S7是在用户程序中确认。使用BSEND/BRECV相当于我发邮件,添加了tracking功能,不但你收到了并且还读了,使用USEND/URECV相当于我发邮件,我收到的确认只知道你的邮箱接收到了,但是并不知道你是否读了。
S7通信占有CPU的通信资源,S7-400大,可以使用多个,但是S7-300就有问题了。原来S7-300只有四个,一个被编程器占用,只能连接三个HMI,如果连接多了只能考虑使用C/S架构了,而且不能主动建立S7连接,直到现在一个CPU315-2DP的CPU也没有这个功能,随着需求的增加,可以通过CP建立S7连接了,使能多路复用功能就可以了,例如一个CP可以连接16个PLC和OP(不能连接WINCC)才占用一个CPU的通信资源,这时调用通信函数名称同样是PUT/GET、BSEND/BRECV和USEND/URECV,但是都是FB块属性family中为CP300PBK;再以后出来带有PN接口的S7-300 CPU,同样支持S7连接,同样是FB名称一样,但是都是FB块属性family中为CPU_300.与S7-400相比无论CP还是集成的MPI、PROFIBUS、PN接口都是用相同的函数块SFB。