用户自定义数据类型(UDT)是TIA Portal中强大的结构化工具,允许将多个相关变量组合成单一数据结构。UDT本质是可重用的数据模板,具有以下核心优势:
结构化组织:将逻辑相关的变量分组管理
代码重用:一次定义,多处使用
维护便捷:修改UDT定义自动更新所有实例
接口标准化:确保数据传递一致性
项目树 → PLC设备 → "PLC数据类型"
右键 → "添加新数据类型"
命名(如MotorData
)→ 确认
在UDT编辑器中添加成员变量:
名称 | 数据类型 | 初始值 | 注释 |
---|---|---|---|
StartCommand | Bool | FALSE | 启动命令 |
StopCommand | Bool | TRUE | 停止命令 |
ActualSpeed | Int | 0 | 实际转速 (RPM) |
SetpointSpeed | Int | 1000 | 设定转速 (RPM) |
StatusWord | Word | W#16#0 | 状态字 |
Feedback | Array[1..4] of Bool | [FALSE,FALSE,FALSE,FALSE] | 反馈信号 |
// DB1 (名称为MotorDB)变量名 | 数据类型 | 初始值 | 注释 ------------|------------|--------|----------- MainMotor | MotorData | | 主电机数据 AuxMotor | MotorData | | 辅助电机数据
访问方式:
"MotorDB".MainMotor.ActualSpeed := 1200; IF "MotorDB".AuxMotor.StartCommand THEN // 启动逻辑 END_IF;
FUNCTION_BLOCK FB_MotorControl VAR_INPUT InData : MotorData; // 输入参数 END_VAR VAR_OUTPUT OutData: MotorData; // 输出参数 END_VAR VAR LocalData: MotorData; // 局部变量 END_VAR
// 通过点标记法访问成员 LocalData.SetpointSpeed := InData.ActualSpeed * 2; OutData.StatusWord := LocalData.StatusWord;
// UDT: AxisData 名称 | 数据类型 -------------|----------- Position | Real Velocity | Real // UDT: MachineData 名称 | 数据类型 -------------|----------- X_Axis | AxisData Y_Axis | AxisData Z_Axis | AxisData
访问嵌套UDT:
"MachineDB".MainMachine.X_Axis.Position := 100.5;
// DB: ProductionLineDB 变量名 | 数据类型 | 数组大小 -----------|-------------------|--------- Conveyors | MotorData | [1..10]
访问数组元素:
FOR i := 1 TO 10 DO IF "ProductionLineDB".Conveyors[i].StartCommand THEN "ProductionLineDB".Conveyors[i].ActualSpeed := 500; END_IF; END_FOR;
// 方法1:使用默认值复位 LocalData := MotorData#InitValue; // 方法2:自定义复位函数 ResetMotorData(INOUT data: MotorData); data.StartCommand := FALSE; data.StopCommand := TRUE; data.ActualSpeed := 0; // ...其他成员复位 END_FUNCTION
CASE resetMode OF 1: // 软复位 LocalData.StartCommand := FALSE; LocalData.StopCommand := TRUE; 2: // 硬复位 LocalData := MotorData#InitValue; ELSE // 保持当前状态 END_CASE;
UDT名称:<功能>Data
(例:MotorData
, ValveData
)
成员前缀:
Cmd_
命令类 (例:Cmd_Start
)
Sts_
状态类 (例:Sts_Running
)
Cfg_
配置类 (例:Cfg_MaxSpeed
)
// UDT名称带版本号 MotorData_V2 成员变更: - 新增: SafetyStatus - 删除: ObsoleteFlag
// MotorData UDT文档 ///电机控制数据结构 ///版本: 2.1 | 创建日期: 2023-10-15 ////// 设定转速范围: 0-3000 RPM /// 单位: 转/分钟 ///
在Watch Table中添加UDT变量 → 右键 → "创建具有所有子元素的新变量"
使用监控过滤器只显示变化值
// 使用WITH语句简化访问 WITH "MotorDB".MainMotor DO ActualSpeed := SetpointSpeed; StartCommand := TRUE; StatusWord.0 := Feedback[1]; // 位访问 END_WITH;
OOP概念 | UDT实现方式 | 应用示例 |
---|---|---|
类(Class) | UDT定义 | MotorData |
对象(Object) | UDT实例 | "MotorDB".MainMotor |
属性(Property) | UDT成员 | .ActualSpeed |
方法(Method) | 关联的功能块(FB) | FB_MotorControl |
继承(Inheritance) | UDT嵌套 | MachineData包含AxisData |
UDT: ConveyorData 成员: - Cmd_Start : Bool - Cmd_Stop : Bool - Sts_Running : Bool - Act_Speed : Int - FaultCode : Word - Motor : MotorData // 嵌套UDT
FUNCTION_BLOCK FB_ConveyorControl VAR_IN_OUT // 注意:IN_OUT参数直接操作实参内存 Conv: "ConveyorData"; // 输送带数据结构 END_VAR VAR // 本地临时变量(不保留状态) EmergencyStop: BOOL := FALSE; // 急停标志 END_VAR // ----------------- 主控制逻辑 ----------------- // IF NOT EmergencyStop THEN // 启动序列(带状态互锁) IF Conv.Cmd_Start AND NOT Conv.Sts_Running THEN Conv.Motor.StartCommand := TRUE; // 触发电机启动 Conv.Motor.StopCommand := FALSE; // 释放停止命令 Conv.Sts_Running := TRUE; // 更新运行状态 // 停止序列(带状态互锁) ELSIF Conv.Cmd_Stop AND Conv.Sts_Running THEN Conv.Motor.StopCommand := TRUE; // 触发电机停止 Conv.Motor.StartCommand := FALSE; // 释放启动命令 Conv.Sts_Running := FALSE; // 更新运行状态 END_IF; ELSE // 急停处理(安全优先) Conv.Motor.StopCommand := TRUE; Conv.Sts_Running := FALSE; END_IF; // ----------------- 故障处理 ----------------- // /** * 函数调用:AnalyzeFaults - 故障诊断分析 * 输入:电机数据结构 * 输出:16位故障编码(按位定义) */ Conv.FaultCode := AnalyzeFaults(Conv.Motor); // ====================== 3. 系统集成 ====================== // /* * 全局数据块:生产线输送带系统 * 设计特点: * 1. 使用数组管理多台相同设备 * 2. 全局变量便于HMI访问 */ VAR_GLOBAL // 输送带阵列(1-5号输送带) LineConveyors: ARRAY[1..5] OF "ConveyorData"; END_VAR // 实例化控制功能块(节省内存方案) VAR ConvCtrl: FB_ConveyorControl; // 单实例重用 END_VAR /** * 主循环控制逻辑 * 采用顺序扫描方式,周期性更新所有输送带状态 * 性能:5条输送带约占用0.2ms扫描时间 */ FOR i := 1 TO 5 DO // 执行控制(传递当前输送带引用) ConvCtrl(Conv := LineConveyors[i]); // 可选:增加循环间隔防止过载 // WAIT 1; // 需要配置OB30等周期中断 END_FOR; // ====================== 辅助功能 ====================== // /** * 函数:AnalyzeFaults - 故障分析引擎 * 算法:基于电机参数的状态机分析 */ FUNCTION AnalyzeFaults : WORD VAR_INPUT Motor: "MotorData"; END_VAR VAR TempFault: WORD := 0; END_VAR // 故障检测逻辑(示例) // 位0:过热故障 // 位1:过流故障 // ... AnalyzeFaults := TempFault; // 返回故障码 END_FUNCTION
现象:程序块中UDT实例显示黄色三角警告
解决:
项目树 → 右键PLC设备 → "编译" → "硬件和软件(重新构建)"
关闭所有在线连接后重新下载
策略:
新增成员时添加到末尾
废弃成员保留但注释"OBSOLETE"
创建新版本UDT:MotorData_V2
UDT是博图SCL中实现结构化编程的核心工具,通过:
创建逻辑分组的自定义数据类型
实现数据模型的标准化和复用
通过嵌套和数组构建复杂系统
配合函数块实现面向对象设计
掌握UDT应用能显著提升以下能力:
代码可读性
工程维护效率 ⚙️
系统扩展性
团队协作水平
最佳实践提示:在项目启动阶段规划UDT结构,避免后期重构。建议将常用UDT存储在全局库中,实现跨项目复用。