电工学习网

 找回密码
 立即注册
查看: 2126|回复: 0
打印 上一主题 下一主题

西门子PLC编程之SFC15与ANY数据类型

[复制链接]
跳转到指定楼层
楼主
发表于 2021-1-20 17:59:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
网上一个朋友请我帮忙分析一段程序,有个SFC15(DPWR_DAT)的调用他没看懂,并把程序发给了我。
收到程序解压后,用STEP7 软件打开,弹出提示窗:
西门子PLC编程之SFC15与ANY数据类型
项目语言是德语的,打不开,于是找到项目目录下的GlobalLanguage文件,使用编辑软件UltraEdit打开,修改第一行的0改为1后保存,这样项目就可以在中文WINDOWS环境下打开,要不就要修改控制面板中关于区域语言的选择,要改成德语才能打开,还一个办法是直接删除Language这个文件也能打开。
西门子PLC编程之SFC15与ANY数据类型
打开项目,找到SFC15调用这里,发现SFC15调用后,整个FC块就结束了。
西门子PLC编程之SFC15与ANY数据类型

我们知道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个字节,各字节的定义如下图:
西门子PLC编程之SFC15与ANY数据类型

各字节的含义:
字节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)见下面的表格:
西门子PLC编程之SFC15与ANY数据类型

ANY数据类型的访问存储区代码(Byte6)见下面的表格:
西门子PLC编程之SFC15与ANY数据类型

了解到这些后,再次查看程序,发现在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型数据类型有了一个简单的了解。
来源:西门子工业技术论坛

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-4-25 22:55

Powered by © 2011-2022 www.diangon.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表