
数组是将多个相同数据类型的元素,按固定顺序组合形成的集合,每个元素通过“数组名+下标”唯一访问,下标可自定义起始和结束范围(支持正整数、负整数),无需单独声明每个元素,大幅减少变量声明工作量。
核心特点:元素类型统一、下标有序、批量访问便捷,可实现一维、二维甚至多维数组,适用于处理批量相同类型的数据(如多个传感器读数、多台电机状态)。
声明格式(以TIA博途为例):数组名: ARRAY(起始下标..结束下标) OF 数据类型;
一维数组:Temp_Sensors: ARRAY(1..10) OF REAL; // 10个温度传感器,存储实时温度(实数类型)
二维数组:Motor_Status: ARRAY(1..5, 1..4) OF BOOL; // 5台电机,每台4个状态(布尔型)
下标灵活:ARRAY(-5..5) OF INT; // 下标从-5到5,共11个元素(整数类型)
访问方式:通过下标定位元素,例如 Temp_Sensors(3) = 25.6; (设置第3个温度传感器的值为25.6)、Motor_Status(2,1) = TRUE; (设置第2台电机的第1个状态为运行)[3]。
适用于批量数据处理,如生产线多工位传感器数据采集、多台设备状态监控、批量参数设置等。例如,10台水泵的运行状态(BOOL型),无需声明10个独立变量,仅用一个一维数组即可统一管理,配合循环指令可实现批量检测和控制。
结构体是将多个不同数据类型的元素(可包含基本类型、数组、甚至其他结构体),组合成一个整体的数据类型,每个元素称为“成员”,成员之间相互独立但属于同一整体,可通过“结构体名.成员名”访问。
核心特点:元素类型多样、结构化程度高,可嵌套(嵌套深度限制为8级),能精准描述复杂控制对象(如一台设备的完整参数),使程序逻辑更清晰[3]。
声明格式(以TIA博途为例):先定义结构体类型,再声明结构体变量;也可在数据块中直接声明结构体。
// 定义结构体类型 TYPE Motor_Data : STRUCT Run_Status: BOOL; // 运行状态(布尔型) Speed: INT; // 运行速度(整数型) Current: REAL; // 运行电流(实数型) Fault_Code: WORD; // 故障代码(字类型) Run_Hours: DINT; // 运行时长(双整数型) END_STRUCT END_TYPE // 声明结构体变量 Motor1: Motor_Data; // 1号电机的完整参数 Motor2: Motor_Data; // 2号电机的完整参数
访问方式:通过“结构体名.成员名”访问具体成员,例如 Motor1.Speed = 1500; (设置1号电机速度为1500rpm)、IF Motor1.Run_Status THEN ... END_IF; (判断1号电机是否运行)[5]。
适用于描述具有多个属性的复杂对象,如单台电机、气缸、仪表等。例如,一台变频器的参数(运行频率、输出电流、故障状态、设定值),通过结构体可将所有参数整合为一个变量,便于参数的统一管理、传递和修改。
用户定义数据类型(UDT),是用户根据实际需求,将基本数据类型、结构体、数组等组合而成的“自定义复合类型”,本质是可重复使用的结构体模板,从TIA博途V11开始,S7-1200及以上系列均支持。
核心特点:可重复使用、统一修改、灵活扩展,嵌套深度限制为8级;一旦修改UDT的定义,所有使用该UDT的变量会自动更新,大幅提升程序维护效率,是Struct类型的升级替代,功能基本完全兼容[3]。
声明步骤:先在“PLC数据类型”中创建UDT,定义其内部成员;再在数据块、变量表或逻辑块接口区中,声明UDT类型的变量。
// 步骤1:创建UDT(命名为UDT_Motor) TYPE UDT_Motor : STRUCT Run_Status: BOOL; // 运行状态 Speed: INT; // 运行速度 Current: REAL; // 运行电流 Fault_Code: WORD; // 故障代码 Protection: STRUCT // 嵌套结构体(保护参数) Overload: BOOL; // 过载保护 Overvoltage: BOOL; // 过压保护 END_STRUCT; END_STRUCT END_TYPE // 步骤2:声明UDT变量 Motor_A: UDT_Motor; // A电机(使用UDT模板) Motor_B: UDT_Motor; // B电机(复用同一模板)
应用特点:可在DB块、OB/FC/FB接口区使用,从TIA博途V13SP1开始,S7-1200 V4.0及以上机型的PLC变量表中I和Q点也可使用UDT;可作为整体使用,也可单独访问其成员,还可直接创建UDT类型的数据块。
适用于多台相同设备的参数管理,如生产线多台电机、多台仪表,只需定义一个UDT模板,即可快速声明多个设备的变量,避免重复定义,同时便于后期统一修改参数结构(如新增“运行时长”成员,所有UDT变量自动同步)。
字符串是用于存储文本信息的复合类型,分为STRING(单字节字符串)和WSTRING(双字节字符串),本质是字符数组,包含总字符数、当前字符数和具体字符内容,适用于文本显示、信息记录等场景[5]。
STRING:占用最多256字节,其中1字节存储最大总字符数,1字节存储当前字符数,剩余254字节存储字符(ASCII格式),字符范围为16#00~16#FF。
WSTRING:支持双字节字符(Unicode格式),占用最多65536字,其中1字存储最大总字符数,1字存储当前字符数,剩余65534字存储字符,字符范围为16#0000~16#FFFF。
声明格式:字符串名: STRING(最大字符数); 或 字符串名: WSTRING(最大字符数);
STRING示例:Product_Name: STRING(20) := '西门子PLC'; // 存储产品名称,最多20个字符
WSTRING示例:Remark: WSTRING(10) := '设备正常'; // 存储中文备注,支持Unicode字符
应用场景:HMI文本显示、生产批次记录、故障信息提示、设备名称标注等,例如将传感器故障信息存储为字符串,通过HMI显示给操作人员。
西门子PLC中,日期时间类复合类型用于存储日期、时间相关信息,基于基本数据类型封装,主要包括TIME、DATE、TOD、DTL四种,适用于时间控制、事件记录等场景,不同类型的存储方式和用途不同[4][5]。
TIME(时间间隔):以有符号双整数存储,基本单位为毫秒,范围为-2147483648ms~+2147483647ms,编辑时可灵活使用天(d)、小时(h)、分钟(m)、秒(s)、毫秒(ms)为单位,例如T#5h10s(5小时10秒)、T#100ms(100毫秒)。
DATE(日期):以无符号整数存储,代表从1990年1月1日开始的天数,编辑时必须指定年、月、日,范围为D#1990_1_1~D#2168_12_31,例如D#2026_05_17(2026年5月17日)[4]。
TOD(时间-of-day,时刻):以无符号双整数存储,代表当天凌晨0点到当前时刻的毫秒数,编辑时必须指定小时(24小时制)、分钟、秒,可选择指定小数秒,例如TOD#14:30:25.5(14点30分25.5秒)。
DTL(日期和时间长型):以12字节结构体存储,包含年、月、日、小时、分钟、秒、毫秒、星期等完整信息,可在数据块或临时存储器中定义,定义时需为所有成员设置起始值,适用于精确的日期时间记录。
TIME用于定时器设定、时间间隔计算(如设备运行时长统计);DATE用于记录生产日期、设备维护日期;TOD用于记录事件发生时刻;DTL用于精确记录故障发生的完整日期和时间,便于后期追溯。
系统数据类型(SDT)是西门子PLC系统预定义的复合类型,具有固定的结构,用户无法修改其结构,仅能用于特定指令,主要用于定时器、计数器、故障信息等系统级功能的实现,结构由多个不同类型的元素组成。
系统数据类型 | 长度(字节) | 核心用途 |
|---|---|---|
IEC_TIMER | 16 | 定时器结构,定时值为TIME类型,用于TP、TON、TOF、TONR等定时器指令 |
IEC_SCOUNTER/IEC_USCOUNTER | 3 | 计数器结构,计数值分别为SINT、USINT类型,用于CTU、CTD、CTUD等计数器指令 |
IEC_COUNTER/IEC_UCOUNTER | 6 | 计数器结构,计数值分别为INT、UINT类型,用于CTU、CTD、CTUD等计数器指令 |
IEC_DCOUNTER/IEC_UDCOUNTER | 12 | 计数器结构,计数值分别为DINT、UDINT类型,用于CTU、CTD、CTUD等计数器指令 |
ERROR_STRUCT | 28 | 故障信息结构,用于存储编程错误或I/O访问错误信息,配合GET_ERROR指令使用 |
在实际编程中,常将多种复合数据类型组合使用,构建更复杂、更贴合实际需求的数据结构,提升程序的模块化和可维护性,常见组合方式如下:
UDT+数组:将UDT作为数组元素,实现多台相同设备的批量管理,例如ARRAY(1..10) OF UDT_Motor; (10台电机,每台电机参数遵循UDT_Motor模板)。
结构体+数组:在结构体中嵌套数组,描述设备的批量属性,例如结构体中嵌套ARRAY(1..4) OF REAL; (存储一台设备的4个传感器读数)[3]。
UDT+结构体:在UDT中嵌套结构体,实现复杂设备参数的分层管理,例如UDT中嵌套保护参数结构体、运行参数结构体,使参数分类更清晰[3]。