Codesys数据结构:扩展数据类型之指针 Pointer 详解

1 地址描述

在内存中,每个字节都有一个编号,通过编号找到存储区(类似去1-407室 取快递,编号就是1-407,快递就是对应存储区),这个编号在这里我们取个名字叫做地址;当定义一个变量并为其赋值的时候,计算机会开辟一块空间用来存取变量值,在程序中一般是通过变量名来引用变量的值,实际上程序在编译的时候已经将变量名字转为变量的地址,即通过变量名找存储单元的地址,从而读取或修改存储单元的变量值;
在这里插入图片描述

2 绝对地址

(1)描述

在设备中比如PLC,已经提前定义好一部分地址的用途(比如地址(16#0080000~~16#008FFFF)只用于外部输入地址),
在Codesys中 I 、Q 、 M 表示设备的绝对地址区域,分别是输入地址区、输出地址区、中间地址区;

(2) 地址表示

格式:%<内存区域>(<大小>)<内存位置>

  • 内存区域 : I 、Q、M
  • 大小 : X(位)、B(字节) 、W(字)、D(双字)
  • 内存位置:数字

例如 下面的关系对照表

举例 Value
%IB1 输入区域B1的地址;
%IX1.2 输入区域B1中位2的位地址;
%QD2 输出区域D2的地址;
在这里插入图片描述
(3) 地址映射

%<内存区域>(<大小>)<内存位置> :只是表示从哪个地址开始取,具体取多少个字节,是由我们定义的数据类型决定;

dwTest AT %IB1 : DWORD;

表示 从输出区域字节B1开始取 4个字节(DWORD占四个字节)中的内容映射到dwTest变量中;

3 指针

(1)描述

指针就是地址,它可以是绝对地址,也可以是用户自定义变量的地址;
当定义指针的时候,必须定义指针的数据类型,因为指针指向的变量类型不同,而类型所占字节大小不同,所有如果仅仅知道地址不知道类型时,指针就不知道从当前地址读取多少个字节;

(2)关键字:“Pointer to” 、“adr” 、“^”
  • “Pointer to” : 用来定义指针类型变量;
piTest: pointer to dword;(*指向dword类型的指针*)
pbTest: pointer to bool;(*指向bool类型的指针*)
prTest: pointer to real;(*指向real类型的指针*)
paiTest: pointer to array[1..10] of int ;*指向int类型数组的指针*)
apiTest: array[1..10] of pointer to int;(*int类型指针数组:存储10个指针,每个指针指向Int类型*)
  • “ADR” 用来获取变量的地址
  • “^” 用来读取指针变量中地址对应的数值
VAR
piTest : POINTER TO INT;
iTest  : INT := 1; 
iTest2 : INT := 0;	
END_VAR

piTest := ADR(iTest);(*获取变量piTest的地址,保存到piTest指针变量中*)
iTest2 := piTest^;(*取地址对应的存储单元数据,赋值给iTest2*)

在这里插入图片描述

(3)指针变量中值的含义
  • 每个地址对应一个byte存储单元,即每个byte都有一个独立的地址
  • WORD\INT 等16位数据类型包含2个byte,其地址用第一个byte的地址表示;
  • dowrd\dint等32位数据类型包含4个byte,其地址用第一个byte的地址表示,以此类推;
  • 指针变量中的值代表某一个byte地址,指针的类型决定了是指向以这个byte开始,连续多少个字节;

在这里插入图片描述

  • 图中1000指的是第一个byte的地址,1001指的是第二个byte的地址,以此类推;

(1) 每个地址对应的空间是一个byte,byte中的每一位bit不具备单独的地址,如下图所示,取输出地址区第1个字节中每一位的地址,运行查看都是同一个值,这个值就是这个字节的地址;

VAR
	bBool_0 AT %QX0.0 : BOOL;
	bBool_1 AT %QX0.1 : BOOL
  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值