故事作者:asdf6

最近创作

看看TA的故事

【软件编程】SFC15与ANY数据类型:

已锁定

asdf6

西门子1847工业学习平台

  • 帖子

    1222
  • 精华

    12
  • 被关注

    132

论坛等级:奇侠

注册时间:2008-09-02

钻石 钻石 如何晋级?

【软件编程】SFC15与ANY数据类型:

589

0

2021-01-20 14:25:36

网上一个朋友请我帮忙分析一段程序,有个SFC15(DPWR_DAT)的调用他没看懂,并把程序发给了我。

收到程序解压后,用STEP7 软件打开,弹出提示窗:

项目语言是德语的,打不开,于是找到项目目录下的\Global\Language文件,使用编辑软件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型数据类型有了一个简单的了解。


【软件编程】SFC15与ANY数据类型: 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

网友专栏

共有3366条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。