网上一个朋友请我帮忙分析一段程序,有个SFC15(DPWR_DAT)的调用他没看懂,并把程序发给了我。 收到程序解压后,用STEP7 软件打开,弹出提示窗: 项目语言是德语的,打不开,于是找到项目目录下的GlobalLanguage文件,使用编辑软件UltraEdit打开,修改第一行的0改为1后保存,这样项目就可以在中文WINDOWS环境下打开,要不就要修改控制面板中关于区域语言的选择,要改成德语才能打开,还一个办法是直接删除Language这个文件也能打开。 打开项目,找到SFC15调用这里,发现SFC15调用后,整个FC块就结束了。
我们知道SFC15的作用,是要写数据到DP从站,其中LADDR是源地址,RECORD是目标地址。 查看RECORD的赋值是#P_X,查看这个变量是个TEMP型临时变量,这里就奇怪了,临时变量在FC块执行结束后就释放了,按理说这里应该在FC块结束前把#P_X的结果传送到一个保持性的地址中,不然这个SFC15的调用只是把结果写入了临时变量,而临时变量当FC块结束就丢失了,那这个调用就没意义了。 看了下源地址的赋值是#ADR_x,它是个WORD型TEMP临时变量,在程序中找到它来自 L #Adr INT整形FB块的IN输入形参 T #ADR_x 这里没什么问题,外部的实参输入给到SCF15的源地址,但这个输入是WORD型的,看了下目标地址#P_X是ANY型TEMP临时变量,为何不是WORD类型呢? 对于ANY类型的数据不太了解,网上搜索了一下: ANY数据类型是STEP7的一种复杂数据类型。所谓“复杂”,就是说它是由一些简单数据类型(比如:字节,字等)按照某种定义组成的。由于ANY数据类型中包含了很多信息(比如:访问数据的地址、访问数据的长度、访问数据的基本数据类型等),很多系统功能块都使用ANY数据类型作为参数。 比如,系统功能块SFC20 "BLKMOV",它来实现从一个地址(源地址)到另一个地址(目标地址)拷贝一定长度的数据的功能。其源地址和目标地址的参数都是使用ANY数据类型。 S7-300/400,S7-1500系列 plc都支持ANY数据类型。ANY数据类型包含10个字节,各字节的定义如下图:
各字节的含义: 字节0(Byte0):为常数10H(十六进制数10),表示STEP7; 字节1(Byte1):ANY数据中的基本数据类型; 字节2~字节3(Byte2~Byte3):ANY数据的重复因子(Repetition factor),表示传送的数据的长度或者数组、字符串的长度; 字节4~字节5(Byte4~Byte5):数据块的编号(DB number);当访问区域为非DB区时,将该值设置为0; 字节6(Byte6):访问存储区的代码; 字节7的0~2位、字节8及字节9的3~7位:表示访问数据的字节地址(byte address); 字节9的0~2位:表示访问数据的位地址(bit address); ANY数据的基本数据类型代码(Byte1)见下面的表格:
ANY数据类型的访问存储区代码(Byte6)见下面的表格:
了解到这些后,再次查看程序,发现在FC块的开头有如下的程序: L #DB_Ziel ;FC的IN形参,外部赋值是DB块的数DB1399 T #T_DB ;FC块的TEMP变量,下面给ANY数据赋值是用到。
:下面是ANY数据#P_X的赋值,#P_X 变量的起始地址为0. L B#16#10 T LB 0 ;常数10H(十六进制数10),表示STEP7 L 2 T LB 1 ;基本数据类型为字节型 L #Anz ;FC块的IN形参,外部赋值33. T LW 2 ;重复因子33 L #T_DB ;1399 T LW 4 ;确定DB块—DB1399 L 2#10000100 ;16进制的84 T LB 6 ;存储区域84代表全局数据块DB L 0 T LB 7 ;字节7的0~2位、字节8及字节9的3~7位:表示访问数据的字节地址 L #DB_ADR ;来自FC的IN形参输入 SLW 3 T LW 8 ;同上面的字节7,同时字节9的0~2位:表示访问数据的位地址 DB块的存储开始地址没去仔细看,向前查的话还是一个块的形参,还需要向前查,就放弃了,实际监控程序时,就能看到这个值是多少。 从上面这个#P_X赋值可以看出,虽然#P_X本身是个TEMP型临时变量,但他是ANY型数据,通过前面的赋值,这里已经变成了一个有确切地址的DB块。所以SFC15的目标地址,就是从这个DB块开始的33个字节。 通过这个程序,也对ANY型数据类型有了一个简单的了解。 来源:西门子工业技术论坛 |