倍福TwinCAT基础教程 2.2 数组(ST语言)_第1页
倍福TwinCAT基础教程 2.2 数组(ST语言)_第2页
倍福TwinCAT基础教程 2.2 数组(ST语言)_第3页
倍福TwinCAT基础教程 2.2 数组(ST语言)_第4页
倍福TwinCAT基础教程 2.2 数组(ST语言)_第5页
已阅读5页,还剩1页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

倍福TwinCAT基础教程2.2数组(ST语言)对应教程:TwinCAT常见类型使用和转换-数组,基于IEC61131-3标准,TwinCAT2/3通用,TC3推荐使用。一、数组是什么数组:同类型变量的连续集合,用下标索引访问。

✅元素可以是:BOOL/BYTE/INT/REAL/STRING/结构体DUT,甚至功能块FB。

✅下标可以不从0开始(和C语言最大区别),下限、上限自定义。语法st

数组名:ARRAY[下限..上限]OF数据类型;下限≤上限,必须是整数元素数量=上限-下限+11.一维数组示例st

VAR

arr0:ARRAY[0..500]OFINT;//下标0~500,共501个元素(从0开始)

arr1:ARRAY[1..10]OFINT;//下标1~10,共10个元素(工控常用,从1起始)

arrBool:ARRAY[1..8]OFBOOL;

arrByte:ARRAY[0..7]OFBYTE;

END_VAR访问单个元素:arr1[1]:=123;2.多维数组(二维、三维)两种写法等效:st

//写法1:逗号分隔(推荐,直观)

arr2D:ARRAY[1..3,1..4]OFINT;

//写法2:数组嵌套

arr2D_2:ARRAY[1..3]OFARRAY[1..4]OFINT;访问:arr2D[2,3]:=99;三维数组:st

arr3D:ARRAY[1..2,1..3,1..4]OFREAL;二、数组初始化(声明时直接赋值)st

VAR

arrA:ARRAY[1..5]OFINT:=1,2,3,4,5;//逐个赋值

arrB:ARRAY[1..5]OFINT:=3(0);//3个0→0,0,0,0,0;剩余自动填0

arrC:ARRAY[1..2,1..2]OFINT:=1,2,3,4;//二维按顺序展开

END_VAR3(0)代表连续3个元素赋值0,简写语法,批量初始化很方便。三、循环遍历数组(FOR循环,最常用)st

VAR

arr1:ARRAY[0..500]OFINT;

i:INT;

END_VAR

//循环写入

FORi:=0TO500DO

arr1[i]:=i;

END_FOR

//循环读取

FORi:=0TO500DO

IFarr1[i]>100THEN

//逻辑处理

END_IF

END_FOR⚠️重点:数组越界!

如果i超出数组定义的上下限,PLC会直接报异常、停机。TwinCAT3可以开启CheckBounds边界检查,在线调试捕获越界错误。四、数组常用内置函数(TwinCAT)SIZEOF(变量):返回字节长度st

len:UDINT:=SIZEOF(arr1);//得到数组总字节数ADR(数组名):获取数组首地址(指针,用于内存拷贝、MEMSET)st

pArr:POINTERTOINT:=ADR(arr1);MEMSET:批量清零数组(适合大批量数组)st

MEMSET(destAddr:=ADR(arr1),fillByte:=0,n:=SIZEOF(arr1));五、数组的类型转换(本节重点:常见类型转换)❗不能直接把整个数组强制转换成另一个类型数组,只能逐个元素转换;

若内存字节对齐一致,可以用指针/联合体UNION做内存映射(BYTE数组与其它类型互转,通讯场景高频)。示例1:INT数组↔REAL数组,元素逐个转换st

VAR

arrInt:ARRAY[1..5]OFINT;

arrReal:ARRAY[1..5]OFREAL;

i:INT;

END_VAR

FORi:=1TO5DO

arrReal[i]:=REAL(arrInt[i]);//INT转REAL

arrInt[i]:=INT(arrReal[i]);//REAL转INT,小数截断

END_FOR示例2:BYTE数组和INT内存映射(通讯,字节流解析)用UNION联合体,同一块内存,用不同类型读取,不做数值转换,直接按内存解析st

TYPEUNION_Buf:

UNION

arrByte:ARRAY[0..1]OFBYTE;

valInt:INT;

END_UNION

END_TYPE

VAR

uBuf:UNION_Buf;

END_VAR

uBuf.arrByte[0]:=16#12;

uBuf.arrByte[1]:=16#34;

//uBuf.valInt直接读出16#3412(大小端需要注意!倍福默认小端)⚠️联合体只是内存别名,不是安全类型转换,跨设备通讯务必注意大小端。六、数组作为函数/FB的输入输出st

FUNCTIONF_SumArray:INT

VAR_INPUT

arrIn:ARRAY[1..10]OFINT;//数组作为输入

END_VAR

VAR

i:INT;

END_VAR

F_SumArray:=0;

FORi:=1TO10DO

F_SumArray:=F_SumArray+arrIn[i];

END_FOR

END_FUNCTION注意:TC3推荐尽量用VAR_IN_OUT传递大数组,避免拷贝大量数据,减少PLC周期负载。七、常见坑&注意事项下标范围:定义是[1..10],不能写arr[0],越界直接报错。数组拷贝:arrA:=arrB整个数组直接赋值,TwinCAT支持,会逐个元素复制。数组大小:超大数组(几万点以上)会占用PLC内存,增加扫描周期。BOOL数组:BOOL是1字节,不是1bit;位操作要用BIT数组或BYTE位访问。HMI可视化:HMI访问数组,下标必须是常

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论