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