查看: 2307|回复: 21
收起左侧

[综合] ST语法编程基础课程 :7 ST编程数据结构

lirui 2020-2-15 17:37:00 | 显示全部楼层 |阅读模式
邀请回答

马上注册,享受更多特权

您需要 登录 才可以下载或查看,没有帐号?立即注册   

x
本帖最后由 lirui 于 2020-2-15 18:38 编辑

image.png
image.png image.png
1.数组
1.1  数组定义与语法
定义:数组是有序数据的结合,其中的每一个元素都拥有相同的数据类型。
    在InoProShop软件中可以直接定义一维、二维和三维数组作为数据类型。您可以在POU的声明部分或者全局变量表中定义数组,声明数组的语法如下。
<数组名>:ARRAY [<ll1>..<ul1>,<ll2>..<ul2>,<ll3>..<ul3>] OF <基本数据类型>
    其中,ll1, ll2, ll3表示字段范围的最小值,ul1, ul2和ul3表示字段范围的最大值。字段范围必须是整数。数组的结构如下图所示:
image.png

1.2  一维数组的使用
例如一台设备共有20个需要测量温度的点,如不使用数组,需要声明nTemp1,nTemp2,……,nTemp20共20个变量作为测量点对应的具体温度值,而此时,如使用数组,只需定义一个数组nTemp,将它的成员定义为20个,即可完成这20个温度变量的定义。具体指令如下所示。
        nTemp :ARRAY [1..20] OF REAL;
其中,中括号内的数据表示20个测量点,例如nTemp[17]就表示第17个测量点的温度值。
在定义数组变量时可以借助InoProShop内部的输入助手提高效率,编写变量nTemp回车弹出变量自动声明窗口,选择“数组向导”。
image.png
image.png
在定义数组时,需要指定数组中元素的个数,中括号的常量表达式用来表示元素的个数,即数组长度。例如a[1..5],表示a数组共有5个元素。
如果下标在定义时是从0开始的,如a[0..5]则表示其中的元素有a[0],a[1],a[2],a[3],a[4],不存数组元素a[5]。
nTemp数组定义后的调试结果如图所示。
image.png


1.3  二维数组的使用
二维数组可以看作是一个特殊的一维数组,它自身的元素可以理解为又是一个新的一维数组。
    例如,可以把a看作是一个一维数组,它有三个元素,a[0],a[1]及a[2],而其中的每个元素又包含4个元素的一维数组,如图所示。
image.png
VAR
    Card_game: ARRAY [1..2, 1..4] OF INT;
END_VAR
编写变量Card_game回车弹出变量自动声明窗口,选择“数组向导”,创建二维数组,调试结果如下。
image.png
通过如上的结果可以看出,第一维的成员有两个,第二维的成员有4个,故在数学上,相当于绘制了一个2×4的2维矩阵表格。

1.4  数组的初始化
对数组元素的初始化可用以下方法实现。
a)在定义数组时对数组元素赋予初值,例如:arr1 : ARRAY [1..5] OF INT :=[1,2,3,4,5];
将数组元素的初值依次列举,经过如上的定义和初始化后,arr1[1]=1,arr1[2]=2,arr1[3]=3,arr1[4]=4,arr1[5]=5。
b)只给一部分元素赋值,例如:
arr1 : ARRAY [1..5] OF INT :=[1,2];
定义arr1数组有5个元素,但中括号中只提供2个初值,这表示只有前两个元素被赋初值,没有预置的数组元素,则使用其基本类型的默认初始值进行初始化。在本例中,数组成员arr1[3]到arr1[5]均被初始化为0。
c)对于重复的初值,可以批量定义,只需在括号前加上数量,例如:
arr1 : ARRAY [1..5] OF INT := [1,2(3)];
“2(3)”表示2个3,经过上述初始化命令后,数组的初值情况为,arr1[1]=1,arr1[2]=3,
arr1[3]=3,arr1[4]=0,arr1[5]=0。
d)针对二维/三维数组,可以将所有数据写在中括号内,按数组排列的顺序对个元素赋初值,例如:
arr2 : ARRAY [1..2,3..4] OF INT := [1,3(7) ];
定义一个二维数组,第一个元素的初值为1,后三个的初值为7,最终输出的结果为,
arr2[1,3]=1,arr2[1,4]=7,arr2[2,3]=7,arr2[2,4]=7。
arr3 : ARRAY [1..2,2..3,3..4] OF INT := [2(0),4(4),2,3];
最终输出的结果为,
arr3[1,2,3]=0,arr3[1,2,4]=0,arr3[1,3,3]=4,arr3[1,3,4]=4,arr3[2,2,3]=4,arr3[2,2,4]=4,
arr3[2,3,3]=2,arr3[2,3,4]=3。

1.6  数组的引用
数组必须先定义,然后再使用,InoProShop规定只能逐个引用数组元素,而不能一次引用整个数组。
数组的引用形式为:
<数组名>[Index1,Index2,Index3]
下标可以是整型常量也可以是变量表达式,例如:a[i+1,2,2]:= a[0,1,1]+a[0,0,0]+a[i,2,2];

2.结构体
2.1 结构体定义与语法
前面介绍了基本类型的变量(如整型、实数、字符串等),也介绍了数组,数组中的个元素属于同一个类型的。但光有这些数据类型是不够的,有时需要将不同类型的数据组合成一个有机的整体,以便于引用。结构(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构体。
结构体声明的语法如下:
TYPE <结构名>:
STRUCT
<变量的声明1>
<变量声明n>
END_STRUCT
END_TYPE
其中,<结构名>是一种可以在整个工程中被识别的数据类型,可以像标准数据类型一样使用。结构体可以实现嵌套,如下图所示,其中子结构也是一个结构体。说明了结构体的复杂结构,其中包含了多个基本数据类型,并包含其他子结构体,数据的结构复杂程度依次从右至左递增。
image.png

2.2 结构体的使用
结构体添加选中“Application”右键-->“添加对象”-->“DUT”。
image.png http://bbs.inovance.com/forum.php?mod=attachment&aid=MzU4OXxiNzFmZTVjMTM2YjM5ZmU2YzkxNDVkZWJiNDFjNmZjZHwxNTkzOTAxMDQ1&request=yes&_f=.zip
打开DUT添加窗口后类型选择“结构(S)”点击“打开”,如图所示。确定后,系统则会自动进入DUT编辑器。
image.png
例子:在数据单元类型中新建一个名为Motor的结构体,具体内容如下。
TYPE Motor :
STRUCT
Product_IDWORD;
Vendor:STRING(20);
Nominal_Voltage:REAL;
Nominal_Current:REAL;
Poles:INT;
Brake:BOOL;
END_STRUCT
END_TYPE
建立完结构体后,只需在程序中新建一个变量,类型为刚刚建立的<结构名>,即Motor。在程序中键入“变量名.”后,系统则会自动弹出结构体内具体对应的信息,见图,通过点击鼠标选择,再配合赋值语句即可实现对结构体的读写操作。结果如下图所示。
image.png

2.3 定义结构体数组
和定义结构体变量的方法相似,只需要说明其为数组即可,例如:
TYPE Machine :
STRUCT
sDeviceName:STRING;
nInstallLocation:INT;
bWorkStatus:BOOL;
rHumidity:REAL;
rTemperature:REAL;
END_STRUCT
END_TYPE
以上定义了一个数组arrMachineStatus,数组中有3个元素,均为Machine类型数据,如图所示。
image.png
image.png

3.枚举
3.1 枚举的概念
如果一种变量有几种可能的值,可以定义为枚举类型。所谓“枚举”是将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。
例如,必须定义一个变量,该变量的值表示一周中的一天。该变量只能存储七个有意义的值。若要定义这些值,可以使用枚举类型。
如一周内星期可能取值的集合为:{ Sun,Mon,Tue,Wed,Thu,Fri,Sat}
该集合可定义为描述星期的枚举类型,该枚举类型共有七个元素,因而用枚举类型定义的枚举变量只能取集合中的某一元素值。
枚举类型声明的语法如下:
TYPE <标识符>:
(<Enum_0> ,
<Enum_1>,
...,
<Enum_n>)|<基本数据类型>;
END_TYPE
<基本数据类型>为可选项,如果不填写数据类型,系统默认为INT类型。
3.2枚举类型的使用
a)枚举类型的基本数据类型-默认是INT类型,也由用户明确指定,例如:
TYPE BigEnum : (yellow, blue, green:=16#8000) DINT;
END_TYPE
b)枚举值可以直接用来做判断条件,例如:
IF nWeekday>5 THEN
nWeekday:=0;
c)在CoDeSys中,整数可以直接赋给一个枚举变量,例如:
nWeekday:=10;
d)同样的POU内,同样的枚举值不得用两次,在枚举或在所有枚举内,例如:
TRAFFIC_SIGNAL: (red, yellow, green);
COLOR: (blue, white, red);
Error: red may not be used for both TRAFFIC_SIGNAL andCOLOR..

【例子】使用枚举类型,将一周中的7天按照Sun,Mon,Tue,Wed,Thu,Fri,Sat的形式显出,并每个程序周期进行一次变化。
声明:
TYPE Weekday :
(Sun:=0,
Mon:=1,
Tue:=2,
Wed:=3,
Thu:=4,
Fri:=5,
Sat:=6);
END_TYPE
使用:
VAR
nWeekday:Weekday;
END_VAR
image.png

4.联合
有时需要使几种不同类型的变量存放到同一段内存单元中,比如可以把一个INT、一个BYTE和一个DWORD型变量放在同一地址开始的内存单元中,如表所示,从同一地址16#100开始存放。
下表中,有填充色部分为覆盖区域,这种使几个不同的变量共占同一段内存的结构成为联合。
image.png
联合体申明的语法为:
TYPE <联合体名>:
UNION
<变量的声明1>
<变量声明n>
END_UNION
END_TYPE

首先,先在数据单元类型中新建一个名为NAME的联合,选中“Application”右键-->“添加
对象”-->“DUT”,如图4所示,确定后在联合编辑器中输入如下内容。
image.png
TYPE NAME :
UNION
var1:STRING(20);
var2:STRING(20);
var3:STRING(20);
END_UNION
END_TYPE
在程序中写的代码如下,
VAR
nName:NAME;
END_VAR
nName.var1:='Zhang San';
最终输出的结果如图所示,即所有nName中的成员的数值都被统一的写入‘Zhang San’。调试结果如下。
image.png
此外,联合体内的成员数据类型可以不一样,
例如:
TYPE Un_WORD :
UNION
nWord:WORD;
nByte:ARRAY [0..1] OF BYTE;
END_UNION
END_TYPE
程序及声明如下:
VAR
UN_Word_test:Un_WORD;
nByte_Low:BYTE:=16#12;
nByte_Hight:BYTE:=16#34;
END_VAR
UN_Word_test.nByte[0]:=nByte_Hight;
UN_Word_test.nByte[1]:=nByte_Low;
在联合中使用成员nWord作为整合后WORD变量存放的地址,由于联合体内所有成员数据结果都一样的特性,决定了WORD和数组中2个BYTE的映射关系,具体映射关系如右所示。
image.png
调试结果如下图所示。
image.png



2.7 ST编程数据结构.pdf

2.7 MB, 下载次数: 113

售价: 3 水滴  [记录]

结构体数据例程.zip

114.08 KB, 下载次数: 39

售价: 3 水滴  [记录]

<
回复 邀请回答送花

使用道具 举报

yrd0115 2020-2-16 11:12:13 | 显示全部楼层
强大 非常感谢!
回复 送花

使用道具 举报

阮航 2020-2-16 16:32:54 | 显示全部楼层
不用水滴 更好
回复 送花

使用道具 举报

阮航 2020-2-16 16:34:22 | 显示全部楼层
帖子  写的不错
回复 送花

使用道具 举报

zhu 2020-2-16 21:32:38 | 显示全部楼层
回帖能赞水滴嘛
回复 送花

使用道具 举报

查克拉饱满 2020-2-18 12:46:18 | 显示全部楼层
没有水滴
回复 送花

使用道具 举报

查克拉饱满 2020-2-18 12:46:42 | 显示全部楼层
谢谢楼主分享
回复 送花

使用道具 举报

查克拉饱满 2020-2-18 12:51:23 | 显示全部楼层
下不过来 这是为什么
回复 送花

使用道具 举报

wenpian 2020-2-19 08:12:02 | 显示全部楼层
下载,很好学习资料,谢谢!
回复 送花

使用道具 举报

xcaq123 2020-2-23 20:39:21 | 显示全部楼层
受益匪浅
回复 送花

使用道具 举报

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

本版积分规则

有技术问题,就上汇川技术社区

INOVANCE汇川技术 公众号

汇川控制技术 公众号

全国服务热线:8:30-17:30

400-777-1260

苏州地址:江苏省苏州市吴中区越溪友翔路16号

深圳地址:深圳市宝安区留仙二路6号鸿荣源鸿威工业区E栋

Copyright © 2003-2100 汇川技术 Powered by Discuz! X3.4 ( 苏ICP备12002088号 )
快速回复 返回列表 返回顶部