news 2026/7/15 3:12:07

CoDeSys入门实战一起学习(二十一):联合体、长时间、宽字符串、引用、指针5种标准扩展类型,解决复杂编程问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CoDeSys入门实战一起学习(二十一):联合体、长时间、宽字符串、引用、指针5种标准扩展类型,解决复杂编程问题

CoDeSys高级数据类型!

前言

在上一篇中,我们掌握了CoDeSys的5大类标准数据类型,能满足大部分基础编程需求。但在实际项目中,总会遇到一些复杂场景:

  • 如何将2个字节整合成1个字?
  • 如何实现高精度纳秒级计时?
  • 如何间接访问变量的内存地址?
  • 如何给变量起“别名”,简化复杂变量的引用?

这些问题,标准数据类型无法解决,而CoDeSys为IEC61131-3标准做的扩展数据类型,就是专门的解决方案。本文将详解5种标准扩展类型:联合体、长时间、宽字符串、引用、指针,讲透概念、用法、实战案例,让你的程序更灵活、更高效。

一、联合体(UNION):同一段内存,存储不同类型数据

核心概念

联合体是一种特殊的数据结构,允许几种不同类型的变量共用同一段内存单元——所有成员的起始内存地址相同,修改其中一个成员,其他成员的值会同步改变。简单说:一块内存,多种解读方式

核心用途

  • 字节/字/双字的快速整合与拆分(如2个BYTE整合成1个WORD);
  • 同一份数据,按不同类型解析(如将DWORD分别解析为INT和两个BYTE);
  • 节省内存(避免为不同类型变量分配独立内存)。

声明与使用步骤

  1. 新建DUT:右键Application添加对象DUT,选择联合体
  2. 定义联合体成员:成员可为不同类型,建议内存长度一致,避免数据错乱;
  3. 程序中声明联合体变量,赋值并访问成员。

实战案例1:2个字节整合成1个字(经典用法)

第一步:新建联合体DUT,命名为Union_ByteToWord


TYPE Union_ByteToWord :


第二步:程序中声明并使用


// 赋值:高字节给nByte[0],低字节给nByte[1]
// 访问整合后的字:stByteToWord.nWord = 16#1234

✅ 内存映射:nByte[0]对应nWord的高8位,nByte[1]对应低8位。

实战案例2:同内存不同类型解析

// 联合体DUT:DWORD分别解析为INT和两个WORD
TYPE Union_DwordParse :
UNION
dwData:DWORD;
nInt:ARRAY[0..1] OF INT;
wWord:ARRAY[0..1] OF WORD;
END_UNION
END_TYPE

// 赋值后,dwData、nInt、wWord共享同一段内存,修改其一,其余同步变化

二、长时间类型(LTIME):纳秒级高精度计时

核心概念

LTIME是TIME类型的高精度扩展,解决了TIME(32位,毫秒级)计时精度低、范围小的问题。

  • TIME:32位,精度毫秒,最大71582分钟;
  • LTIME:64位,精度纳秒,支持天、小时、分钟、秒、毫秒、微秒、纳秒,满足高精度计时需求。

核心用途

  • 高速设备的精准计时(如伺服运动、高速传感器触发);
  • 长时间高精度累计(如设备运行时长、生产节拍精准统计)。

赋值格式

LTIME#开头,单位按d→h→m→s→ms→us→ns排序,示例:

ltimeHighPrecision:LTIME;

三、宽字符串(WSTRING):Unicode字符处理

核心概念

WSTRING是STRING的Unicode扩展,STRING仅支持ASCII字符(单字节),而WSTRING支持全球多语言字符(如中文、日文、特殊符号),以Unicode编码存储。

核心参数

  • 存储规则:实际占用内存 =2*定义长度+2个字节(每个Unicode字符占2字节,额外2字节存结束符);
  • 用法:与STRING基本一致,常量仍用单引号包裹,支持中文等特殊字符。

实战案例

VAR
wstrCN:WSTRING[20] := 'CoDeSys教程:数据类型详解'; // 支持中文
wstrEN:WSTRING[10] := 'Hello CoDeSys';
END_VAR

✅ 适用场景:需要显示中文故障信息、多语言设备名称的项目。

四、引用(REFERENCE TO):变量的“别名”,简化复杂引用

核心概念

引用是变量的别名,相当于给变量起了一个新名字,操作引用就等同于操作原变量——引用与原变量共享同一块内存,修改引用的值,原变量的值会同步改变。

与指针的区别(核心)

  • 引用:直接操作原变量,无需解引用,语法简单,更安全;
  • 指针:存储变量的内存地址,需解引用才能操作原变量,语法复杂,灵活性更高。

声明与使用

  1. 声明格式:引用名:REFERENCE TO 数据类型
  2. 绑定原变量:引用名 := REF(原变量);(必须绑定,否则无效);
  3. 校验有效性:用__ISVALIDREF(引用名)判断引用是否绑定有效变量(返回TRUE/FALSE)。

实战案例:引用的使用与有效性校验

✅ 适用场景:简化复杂变量的引用(如结构体数组的成员、深层嵌套结构体的变量)。

五、指针(POINTER TO):内存地址的“导航仪”,间接访问内存

核心概念

指针是一种特殊的变量,不存储数据本身,只存储变量的内存地址——通过指针,可间接访问任意变量的内存,实现灵活的内存操作,是CoDeSys中最灵活也最危险的扩展类型(使用不当会导致内存错误)。

核心用途

  • 动态访问变量(如根据地址动态读取/写入数据);
  • 数组的快速遍历(比下标访问更高效);
  • 共享内存访问(如PLC与第三方设备的内存交互);
  • 复杂数据结构的灵活操作(如结构体、联合体)。

核心语法

  1. 声明指针:指针名:POINTER TO 数据类型;(如pInt:POINTER TO INT;);
  1. 获取地址:ADR(变量名)(返回变量的内存地址,赋值给指针);
  1. 解引用:指针名^(通过地址访问原变量,读/写均可);
  1. 地址偏移:指针名 + 偏移量(如pByte + 1,指向内存地址的下一个字节)。

实战案例1:指针的基本使用(间接访问变量)

VAR

END_VAR

实战案例2:指针拆分INT为两个BYTE(经典用法)

VAR

END_VAR

指针的安全使用(避坑重点)

指针使用不当会导致内存越界、程序崩溃,务必做好安全校验:

  1. 添加指针校验函数:右键Application添加对象用于隐含检查的POU,选择CheckPointer
  2. 访问指针前,先校验有效性(自定义CheckPointer函数,判断地址是否在有效范围);
  3. 避免指针指向已释放的内存(如临时变量);
  4. 地址偏移时,确保偏移后仍指向有效数据类型(如BYTE指针偏移1,INT指针偏移2)。

总结

标准扩展数据类型是CoDeSys解决复杂编程问题的利器,核心使用原则:

  • 内存共享/数据拆分整合:用联合体,简单高效还省内存;
  • 高精度计时:用LTIME,纳秒级精度满足高速场景;
  • 多语言字符处理:用WSTRING,支持中文等Unicode字符;
  • 简化复杂变量引用:用引用,语法简单更安全;
  • 灵活的内存间接访问:用指针,配合校验函数确保安全。

下一篇我们将进入CoDeSys数据类型的核心灵活部分——自定义数据类型,详解数组、结构体、结构体数组、枚举、子范围,这些类型能让你根据项目需求“定制”数据类型,让程序结构更清晰、更易维护,比如用结构体封装一台电机的所有参数,用枚举定义设备的运行状态,敬请期待!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/8 14:40:46

KingbaseES数据库瓶颈排查实战指南:从实例到语句的全维度解析

在高并发、海量数据的业务场景下,数据库性能直接决定了应用系统的响应速度和稳定性,而瓶颈排查则是性能调优的核心前提——只有精准定位问题根源,才能避免盲目调参、优化无效的内耗。KingbaseES作为国产数据库中的优秀代表,在政务…

作者头像 李华
网站建设 2026/7/1 15:09:46

巡防勤务可视化管理

巡防勤务可视化管理 巡防勤务管理可视化系统,基于大数据平台的警务地理信息系统,可以实时查看警力在岗状态、警力分布、应急资源等。系统支持快速定位警员、车辆的位置,查看警力详细信息,调取监控视频画面,并进行单方…

作者头像 李华
网站建设 2026/7/4 7:23:47

想把网页保存成PDF文件,快速删掉侧边栏广告再打印

想要把网页保存成PDF文件的时候经常会有右侧左侧侧边栏挡住主要内容。怎么办呢? 打开 开发者模式 在 console 里粘贴以下,回车,就好了! // 隐藏所有可能包含侧边栏的常见元素 var style document.createElement(style); style.in…

作者头像 李华
网站建设 2026/7/1 10:28:51

深度学习之第八课迁移学习(残差网络ResNet)

目录 简介 一、迁移学习 1.什么是迁移学习 2. 迁移学习的步骤 二、残差网络ResNet 1.了解ResNet 2.ResNet网络—残差结构 三、代码分析 1. 导入必要的库 2. 模型准备(迁移学习) 3. 数据预处理 4. 自定义数据集类 5. 数据加载器 6. 设备配置 7. 训练函数 8. 测…

作者头像 李华
网站建设 2026/7/5 10:32:03

计算机视觉系列之opencv语法基础案例分析之银行卡号识别

简介 计算机视觉系列第一课opencv语法(一)保姆级教学 计算机视觉系列第一课opencv语法(二)保姆级教学 计算机视觉系列第一课opencv语法(三)保姆级教学 [计算机视觉第一课opencv(四)保姆级教学][opencv 3] 关于计算机视觉的基础内容我们之前已经说完了,今天我们就来用…

作者头像 李华
网站建设 2026/7/6 4:35:05

工业控制场景下模拟I2C通信的完整指南

以下是对您提供的博文《工业控制场景下模拟IC通信的完整指南:原理、实现与鲁棒性设计》进行 深度润色与结构重构后的专业级技术文章 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹(无模板化表达、无空洞套话、无机械连接词&#xff…

作者头像 李华