SFC67/68使用方法
刘玉蓉
发布于2014-10-31 17:39
5
0
标签:
看了一下SFC67、68的帮助文档,说“SD必须与通信伙伴上的VAR_ADDR长度相同”,可是在哪里定义数据长度啊,比如s7-200里面,VB0-VB100,前30个用于读出,后70个用于写入,怎么定义读写区域啊(至少用DP的时候,配置时就配置好几个字节读几个字节写了);另外如果跟两个200站通信,同时用两套SFC67/68指令可以吗(用DEST_ID区分),两套指令的REQ和CONT一直为1可以吗
问题补充:
bob wu:您的答案很详细,您的意思是收到busy=0后要取消req信号吗?我还想问,就是收到busy=0后仍然保持req=1可以吗,即req不论busy状态,常on对通信有无影响
佳答案
一般通过调用SFC67/68实现无组态的MPI的通信,适合S7-400PLC、S7-300PLC、S7-200PLC之间的通信。下面以S7-200与S7-300之间的无组态MPI通信为例来说明,一般S7-200与S7-300之间只能采用单边无组态通信方式,即仅在S7-300
在X_PUT(SFC68)发送数据的指令,通过SFC68将数据写入不在同一个本地S7站的通信伙伴。在通信伙伴上没有相应的SFC68,必须确保由SD(本机的数据区,数据类型为ANY,在发送CPU上,既S7-300PLC上)定义的发送区和由VAR_ADDR参数(对方的数据区,数据类型为ANY,在通信伙伴上,这里是指S7-200)定义的接收区长度相同,并且数据类型相匹配。
一般若对S7-200的V区读写,则在S7-300中定义S7-200的V区,须用DB1代替,用指针间接寻址方式进行。如你想读出S7-200中VB0以后的30个字节并且放到S7-300的MB20以后的30个字节中,需要调用系统功能SFC67,在参数VAR_ADDRESS(对方数据区,指S7-200)中设定S7-200的地址区为:P#DB1.DBX0.0 BYTE 30, 在参数RD(本机的数据区,指S7-300)中设定S7-300的地址区为P#MB20.0 BYTE30.
同样如果将S7-300的MB40以后的70个字节写入7-200中VB31以后的70个字节中,需要调用系统功能SFC68,在参数VAR_ADDR中定义S7-200的地址区:P#DB1.DBX31.0 BYTE 70, 在参数SD中设定S7-300D的地址区为P#MB40.0 BYTE 70;
一般S7-300/400可以同时作为客户机和服务器,而S7-200只能作为服务器。如果想实现S7-300/400与两个S7-200站通信,在通过REQ=1调用相应SFC67/68之后,激活读写作业。此后可以继续调用SFC67/68, 两套指令的REQ和CONT可以一直为1,直到参数BUSY=0 指示接收到应答为止