调用系统功能(SFC65~69)来实现MPI的通信,这种通信方式适合于S7-300/400/200之间通信,一些非常老的S7-300/400 CPU不含有SFC65~69,所以不能用这种方式通信,只能用全局数据包的方式来通信,判断一个CPU是否含有通信的SFC,可以在联机的情况下,在线查看所用的程序块,看一看是否包含SFC65~69。通过调用SFC来实现通信又可分为两种方式:双向通信和单项通信。以例子的方式介绍通信过程,例子中使用的硬件为CPU315-2DP,CPU416-2DP。软件为:STEP7 V5.2 SP1。
在通信的双方都需要调用通信块,一方调用发送块,另一方就要调用接收块来接收数据。这种通信方式适用S7-300/400之间通信,发送块是SFC65(X_SEND),接收块是SFC66(X_RCV)。下面以举例的形式说明通信实现的过程:在STEP7中创建两个站STATION1 CPU 416 MPI站为2,STATION2 CPU315-2DP MPI站号为4,2号站发送2包数据给4号站,4号站判断后放在相应的数据区中。
在2号站OB35中调用SFC65,如果扫描时间太短,发送频率太块,对方没有响应,将加重CPU的负荷,在OB35中调用发送块,发送任务将间隔100MS执行一次,编写发送程序如下
参数中REQ 为发送请求为1时发送。
CONT 为1表示连续占用通信资源,为0时,通信完成后释放通信资源。
DEST_ID 表示对方的MPI地址。
REQ_ID 表示一包数据的标识符 ,标识符自己定义,例子中两包数据的标识符分别为“1”,“2”。
SD 表示发送区,以指针的格式,例子中第一包数据为DB1中从DBX0.0 (DBB0) 以后76个字节,发送区最大为76个字节。
RET_VAL 表示发送的状态
BUSY 为1时发送中止。
在这个例子中M1.1,M1.3为1时,CPU416将发送标识符为“1”和“2”的两包数据给4号站CPU315-2DP。
用户可能会问一个CPU究竟可以和能几个CPU通信,这和CPU的通信资源有关系,这也决定SFC的调用的次数,在选项手册中,常常可以看到“动态连接”的个数,这个数字与SFC的调用有关,以上例作说明,M1.1,M1.3为1时,与4号站的连接建立起来,反之4号站发送,2号站接收同样建立一个连接,也就是说两个站通信,都需要发送和接收的情况下占用两个动态连接。
参考图1:
图1 连接建立
M1.1,M1.3为0时,建立的连接并没有释放,必须调用SFC69释放连接,在上例中M1.5为1时,与4号站建立的连接断开,如图2所示:
图2 连接释放
有的用户编写多个连接时,由于CPU的资源有限,而不能通信,可以用这种方法检测。
在4号站编写接收程序如下:
在OB1中调用SFC66 (X_RCV),参数EN_DT表示接收使能,RET_VAL 表示接收状态字,REQ_ID接收数据包的标识符,NDA 为1时指示有新的数据包,为0则没有,RD表示接收区,接收区放在DB1中从DBB0以后76个字节中。例子中,接收块只识别数据的标识符,而不管是哪一个CPU发送的,接收从2号站CPU416发送的两包数据,当标识符为“1” 时,M1.3为1,复制接收区的数据到DB2前76个字节中(调用SFC20),当标识符为“2” 时,M1.4为1,复制接收区的数据到DB3前76个字节中。
与双向通信两方都需要编写发送和接收块不同,单向通信只在一方编写通信程序,这也是客户机与服务器的关系,编写程序一方的CPU作为客户机,没有编写程序一方的CPU作为服务器,客户机调用SFC通信块对服务器的数据进行读写操作,这种通信方式适合S7-300/400/200之间通信,S7-300/400的CPU可以同时作为客户机和服务器,S7-200只能作服务器。SFC67 (X_GET) 用来读回服务器指定数据区的数据并存放到本地的数据区中,SFC68 (X_PUT) 用来写本地数据区的数据到服务器中指定的数据区中,以举例的方式说明怎样调用SFC通信块实现通信,先介绍S7-300/400通信,与上例一样,建立两个站,STATION1 CPU416-2 MPI 地址为2作为客户机,STATION2 CPU315-2DP MPI地址为4作为服务器,调用SFC68,CPU416 把本地数据区的数据DB1.DBB0以后76个字节存储在CPU315 DB1.DBB0以后76个字节中,调用SFC67, CPU416读出CPU315的数据DB1.DBB0以后76个字节,放到本地DB2.DBB0以后76个字节中,例子程序如下:
参数DEST_ID表示对方MPI地址,VAR_ADDR指定服务器的数据区,SD 本地数据区(数据源) M1.1为1时,CPU416将数据区的数据DB1.DBB0以后的76个字节存放到CPU315的数据区DB1.DBB0以后的76个字节中。
RD本地数接收区,M1.3为1时CPU416将CPU315数据DB1.DBB0以后76个字节的数据存放到本地数据区DB2.DBB0 以后76个字节中。数据区最大为76个字节。同时在一个CPU中调用SFC67,68占用一个动态连接,M1.5为1时中断通信释放连接。同样S7-300CPU也可以作为客户机,S7-400CPU也可以作为服务器。
S7-300/400与S7-200通信时在S7-200中不能调用SFC通信块,只能在S7-300/400中调用,所以只有S7-300/400可以作为客户机,S7-200只能作为服务器。下面将以举例的方式介绍实现通信的过程,例子使用的硬件为S7-300 CPU315-2DP,S7-200 CPU224,通信卡CP5611;使用的软件为STEP7 V5.2 SP1,MICROWIN V3.2。
首先要设定站号和通信速率,S7-300为2号站,S7-200为4号站,通信速率为187.5K/S,在S7-300侧:打开STEP7,插入一个S7-300站,组态站号及通信速率并下载到CPU中,在S7-200侧:打开MICROWIN,在“SYSTEM BLOCK”中设定S7-200的站号和通信速率,如图3所示:
图3 设置S7-200 MPI接口
然后把组态数据下载到S7-200CPU中,这样所有的硬件组态作完了,接下来的工作是在S7-300CPU中编写通信程序,在OB1中调用SFC68和SFC67。程序如下:
M1.1为1时把S7-300的输入信号IB0 发送到S7-200的QB0中,同时M1.4为1时把S7-200的输入信号IB0方到S7-300的输出信号QB0中。
如果需要与S7-200的V区通信,在S7-300CPU中相对应的是DB1,例如读出S7-200中VB100以后16个字节并且放到S7-300 MB20以后的16个字节中,需要调用系统功能SFC67(X_GET),在参数VAR_ADDR 写入S7-200的地址区如:P#DB1.DBX100.0 BYTE 16。在参数RD:写入S7-300的地址区如:P#MB20.0 BYTE 16,这样就可以完成通信了。
另外还可以通过S7-200的PROFIBUS-DP模块EM277与S7-300/400的MPI口通信,设置更为简单,在S7-300/400侧调用SFC67/68,与上例参数相同,地址变成S7-200 EM277的地址就可以了,在S7-200侧,用拨码开关设定EM277的站号而不用软件下载设定,连接好以后,从新上电通信速率就可以自适应。