SCL-程序中的复杂数据类型(二) 点击:2027 | 回复:6



一世欢颜

    
  • 精华:2帖
  • 求助:0帖
  • 帖子:10帖 | 323回
  • 年度积分:275
  • 历史总积分:4170
  • 注册:2012年11月11日
发表于:2020-06-16 13:15:35
楼主

指针的高阶用法门槛相对较高,很多编程人员在自己的工作中几乎用不到或不用指针,要不就是用其他方法代替指针的使用,但是当我们真正理解了指针的很多用法后,会明白指针在很多时候还是能帮我们灵活高效的处理程序问题。

PLC编程人员都知道,寻址有绝对地址访问和符号标签访问(自己起的名字,理解就好),在TIA的发展过程中,似乎有意淡化绝对地址访问而加强标签访问。在LAD和FAD中当我们建立例如I0.0的变量时,会自动生成符号名,而在SCL中却不会自动生成符号名,输入绝对地址会导致报错,也就是时说SCL必须保证变量先声明后使用。

下面我不在讲解寻址的基础知识,我的总结尽量还是以干货为主。

一、有关寻址的的知识

l  Slice访问

Slice访问又称为片段访问,它的基本用法是,当我们在DB块中建立一个变量时,可以使用符号访问该变量中的位、字节、字等,而无需重新定义该变量包含的数据。

例如我们在名为TSET1的数据块中建立test变量,数据类型为DWORD,当需要使用其中第三个位时可以表述为"TEST1".test.%X1,当需要使用第一个字时,可以表述为"TEST1".test.%W1。

                                               image.png

image.png

l  AT访问

   AT访问可以理解为对一个变量进行解析,通过AT访问我们可以对一个变量进行再操作,最常用的可能就是拆解一个变量(还有其他用法,不局限于对变量的拆解)。AT访问通常用在FB/FC的接口处,使用AT访问时,FB/FC必须为标志访问模式(即在属性中去掉【优化的块访问】)。

  例:在FB的INPUT处建立一个【字】变量,然后建立【字拆分1】变量,在数据类型处输入AT,然后输入数据类型为二元数组,元素类型为BYTE,则【字拆分1】中的两个字节即可认为是【字】变量的组成。此时修改【字】变量的值,【字拆分1】中的两个字节会对应变化,同理【字拆分1】的值改变,【字】中的值也会变。

l  REF与^

REF是TIA引入的SCL新指令,它用来操作变量的地址,所以它的本质是指针。REF用来获取变量地址,而^用来对地址内存储的数据进行读取或赋值。需要注意的是REF需要在优化的块中使用,而且规定只能在FB/FC 的接口参数或者在 FB/FC/OB 的 TEMP 区中使用。

例:建立如下图所示的变量和代码

image.png

image.png

  这里有几个地方需要注意,指针变量的声明需要使用【REF_TO 数据类型】,其中数据类型要与需要操作的数据类型一致,当不一致时会出现警告或者报错(数据长度一致,类型不同会出现警告,数据长度不一致会导致报错)。

  如果想通过P1指针改变DATA1值,需要的代码为,#P1^=11。

l  PEEK与POKE

  在SCL中,变量的绝对地址是不允许直接使用的,但是如果在编程中需要使用绝对地址的时候,则需要使用PEEK与POKE指令。PEEK是读指令,POKE是写指令.

PEEK直接使用时,有三个参数,第一个为读区域,需要使用功能码,第二个时DB编号,第三个为编译量。PEEK还可用”PEEK” + ”_” + ”数据类型”的使用方式,如果不加使用类型时,默认使用BYTE。


image.png

image.png

一、 指针

TIA中将ANY、POINTER、VARIANT归类为指针,但是从本质上来说VARIANT并非指针,而是引用类型,前两种指针需要指向绝对地址而VARIANT指向变量标识符。并且当这三种指针在FB\FC的接口中使用时,ANY和POINTER是占用地址的,而VARIANT并不占用地址空间,在标准访问模式下,在背景DB块中可以观察到。

VARIANT的出现在很大程度上会替代ANY/POINTER,所以我并不会占用大量时间去讲述ANY和POINTER这两种指针。

l  ANY

ANY是一种指针类型,它存储的是地址信息并指向一块存储区域的起始地址,它常用在FB/FC的接口中。在下表中列出了在FB/FC中受支持的情况。

image.png

例:建立FB块,在接口中,建立如下值(因为ANY存储的为地址信息,所以并不能直接赋值

image.png

输入如下代码,将any1中的值移动到OUT ANY中(BLKMOV有返回值,所以用TEMP1作为返回值,否则报错)

image.png

调用FB块并赋值,将从M100.0开始的连续十个字节赋值到从M200.0开始的连续是个字节。

image.png

上述是基本用法,高级一点的用法需要拆分ANY的结构体,对,ANY可以算是系统预定义的结构变量(结构变量看我上一篇讲解),在标准块访问模式下,我们可以看到ANY占用十个字节。

image.png

这十个字节存储了ANY的地址信息,这些地址信息可以动态赋值,实现复杂的功能,如果有兴趣的可以和我交流,我不在做详细讲解。

l  POINTER

POINTER也是指针,与ANY不同的是它仅指定了存储区域,而ANY指定了区域长度和访问类型,就我个人观点,POINTER并没有很大的使用价值,但是使用结构体中的变量赋值与ANY一样可以实现复杂的功能。

l  VARIANT

VARIANT是我想讲解的重点,之前已提到过,TIA开始淡化绝对地址操作,而更多的使用符号标签。VARIANT之所以不同于指针,正是因为他是某个变量的完整映射。VARIANT不占用地址空间,因此我们无法通过拆分结构体来对其进行操作,但是系统提供了大量关于VARIANT的指令,通过这些丰富的指令,我们一样可以使用VARIANT实现复杂的功能。而且由于VARIANT不指向地址,所以不会因为指向某个不存在的地址而产生错误。

VARIANT同样用在FB\FC接口处,使用VARIANT的一般步骤是,建立一个VARIANT类型的接口数据,在代码部分首先判断VARIANT的数据类型,然后再进行读写操作。

VARIANT指令

image.png

例:

建立变量如下图

image.png

代码部分

image.png

上述例子是最简单的的使用方法,如果能够灵活运用指令可以实现更加快捷高效的编程。

更多复杂用法和例子将在简述完SCL的全部知识后,进行分享。


1分不嫌少!


楼主最近还看过



一世欢颜

  • 精华:2帖
  • 求助:0帖
  • 帖子:10帖 | 323回
  • 年度积分:89
  • 历史总积分:4410
  • 注册:2012年11月11日
发表于:2020-06-16 13:17:34
1楼

时间仓促,整理的不全,如果有兴趣,可以共同探讨


回复本条

    

fighting2020

  • [管理员]
  • 精华:4帖
  • 求助:4帖
  • 帖子:1148帖 | 7804回
  • 年度积分:266
  • 历史总积分:21315
  • 注册:2008年11月11日
发表于:2020-06-16 14:13:10
2楼

感谢楼主的分享总结

回复本条

    

jzl070521

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 229回
  • 年度积分:2
  • 历史总积分:231
  • 注册:2021年8月12日
发表于:2023-07-21 12:50:09
3楼

感谢楼主的分享总结

回复本条

    

jzl070521

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 229回
  • 年度积分:2
  • 历史总积分:231
  • 注册:2021年8月12日
发表于:2023-07-21 12:50:12
4楼

感谢楼主的分享总结

回复本条

    

chun1989

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 1183回
  • 年度积分:7
  • 历史总积分:1210
  • 注册:2012年11月20日
发表于:2023-09-11 11:45:36
5楼

指针是很好用的,可惜我不太懂不


回复本条

    

热门招聘
相关主题

官方公众号

智造工程师