抖音粉丝群1
『7x24小时有问必答』

收到后台一个小伙伴的疑问:
西门子S7-1200/1500是否支持动态数组?
我理解他说的动态数组,是指数组的上、下限值可动态修改。
我的回答是:不支持。
但是S7-1200/1500确实支持使用可变限值数组作为函数/函数块的参数。具体来说:
①对于函数块(FB)而言,仅其输入输出(InOut)参数支持可变限值数组;
②对于函数(FC)而言,其输入、输出及输入/输出参数都支持可变限值数组;
今天这篇文章,我们来详细聊聊可变限值数组。
1.png
在西门子S7-1200/1500 SCL语言编程中,数组是一种复杂数据类型,它是数量固定的、数据类型相同的元素的集合。数组有两大特点:
①元素数量是固定的;
②元素的数据类型是相同的;
数组可以是一维的,也可以是多维的。一维数组的定义采用下面的格式:
Array[下限..上限] of <数据类型>
一旦数组的上、下限值确定了,数组中元素的数量也就确定了。我们可以在数据块(DB)、函数块(FB)的静态变量、临时变量区中声明数组。比如下图中我们在数据块DBRcvData中声明了一个具有100个字节的数组arrRcv:
2.png
数组arrRcv的下限值是1,上限值是100。一旦定义完成,我们没有办法在运行过程中动态修改它的上、下限值。

在一些计算机高级语言中,比如VB,可以在运行过程中动态修改数组的维度(上限值)。比如下面的VB代码定义了一个下限值为0,上限值为100的整数数组(该数组具有101个元素):
  Dim  tmpArray  (100)  As  Integer
使用ReDim语句可以动态修改该数组的上限值,比如下面的代码将其上限值修改为199:
ReDim tmpArray(199)
目前S7-1200/1500并不支持这种动态修改,这也是我对那位小伙伴问题的回答。
不过,虽然不支持动态修改数组限值,我们却可以在参数传递时使用可变限值数组。
可变限值数组是指用通配符(*)取代数组的上、下限值,一维可变限值数组格式如下:
Array
  • of <数据类型>
  • 类似的,二维可变限值数组的格式如下:
    Array[*,*] of <数据类型>
    S7-1200/1500最多支持6维数组。

    可变限值数组仅可用于参数的传递。比如我之前的文章《西门子SCL语言编程实例——冒泡排序》就用到了可变限值数组,如下图所示:
    3.png
    可变限值数组仅是一个接口(形参),在实际使用时需要为其赋值(实参)才能正常工作。实参的数据类型、维数要与形参相同,即数组的结构要相同。
    比如在上述冒泡排序的文章中,我们在DB200中定义了数组arraySort,如下图所示:
    4.png

    在主程序中调用函数FC101_BubbleSort,为其形参“arraySort”赋值“DB200_Global.arraySort”,如下图所示:
    5.png
    对于可变限值数组,很多时候需要知道其上、下限值。可以使用系统提供的指令LOWER_BOUND读取其下限值,使用UPPER_BOUND读取其上限值。这两个指令都支持多维数组。
    我之前还写过一篇数组及其指令的文章,链接如下:
    好了,关于S7-1200/1500的可变限值数组就先介绍到这里。我的书《西门子S7-1200/1500 PLC SCL语言编程 ——从入门到精通》的第10章复杂数据类型也有介绍,如果你感兴趣的话,可以看看下面的链接:

    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    上一主题上一主题         下一主题下一主题
    QQ手机版小黑屋粤ICP备17165530号

    关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

    法律保护:PLC技术网,plcjs.com,plcjs.net等字样
    Copyright 2010-2030. All rights reserved. 


    微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码