对于西门子寻址方式在此做简单解析,目的备忘和更为深入和熟练的使用。
1、西门子高地址、低字节
高字节、低字位对应描述对象是以字节为单位,只有比字节大的存储单位进行数据存储时才存在这种说法,具体到PLC中就是字和双字,一个双字是由四个连续的字节组成,此处以西门子博途MD0的双字变量作为解析地址举例来解析西门子高地址低字节的意义,定义如下:
MD0为双字DWord数据类型,其是由连续的四个字节组成,即MB0、MB1、MB2和MB3,此处MB3为高字节,MB0为低字节,如下示意图为MD0的32个位的排列顺序。
从上图可以看到最左边是最高位31,最右边是最低位0,左边最高的8各位编号为24-31,对应的字节是MB0,最右边最低的8个位0-7,对应的字节是MB3,可以从图中看出,西门子的MD0最高的字节编号MB3反而在最右边充当最低的0-7位,而最低的字节编号MB0出现在了最高位24-31位置编号,这就是高地址、低字节意义。
下面是数字在空间中的存储介绍,比如十进制数字1,234,567,891,其十六进制为16#499602D3,二进制位2#0100 1001 1001 0110 0000 0010 1101 0011,这些数据在西门子PLC中的存储方式如下图:
从上图可以看出,MB3作为最高字节编号,其存储的为最低位数据16#D3,MB0作为最低字节编号,其存储的为最高位数据16#49。以下为将MD0分解为32个位时,数据存储情况。
由上图可以看出,在西门子数据存储过程中,对于双字MD0其分为四个连续字节,MB0存储最高位数据,MB3存储最低位数据,在数字用十六进制显示过程中,每两个数字表示一个字节,如16#49表示最高位MB0,每一个数字表示四个位,依据8421的方式对每个位进行对应,如当MD0存储的数据为16#10000000时,则M0.4位true。
2、西门子片段寻址
在西门子S71500/S71200系列PLC开始,其寻址方式开始支持Slice或者片段寻址方式,语法表达式如下,以MD0举例:
位寻址: ”测试双字”.%Xn
字节寻址:”测试双字”.%Xbn
字寻址: ”测试双字”.%Xwn
双字寻址:”测试双字”.%Xdn(对于64位及以上数据)
以上”测试双字”表示待寻址数据变量名,%X后b表示字节,访问8个位,w表示字,访问16个位,d表示双字,访问32个位,n表示寻址序号。
通常针对Byte、Word等数据类型的变量进行片段访问,如下图所示,此外也可以对INT、DINT等整数数据类型的变量进行片段访问。注意,博途V13以后.X改为.%X。
由上图可以看出,对于MD0使用片段寻址时:
”测试双字”.%X0对应MD0的最低位,即M3.0;
”测试双字”.%X31对应MD0的最高位,即M0.7;
”测试双字”.%Xb0对应最低字节MB3;
”测试双字”.%Xb3对应最高字节MB0;
”测试双字”.%Xw0对应最低字MW2;
”测试双字”.%Xw1对应最高字MW0;
3、西门子间接寻址
3.1 PEEK
西门子使用SCL编程时,可以用PEEK指令来读取I、Q、M和DB中的数据,PEEK支持以位(PEEK_BOOL)、字节(PEEK_BYTE)、字(PEEK_WORD)以及双字(PEEK_DWORD)的形式进行数据读取。
3.1.1 PEEK_BOOL
PEEK_BOOL以位的形式对西门子数据进行间接寻址,用于在不指定数据类型的情况下从标准存储区读取存储位。指令应用举例为:
#Peeker_BOOL := PEEK_BOOL(AREA := 16#84,
DBNUMBER := 1,
BYTEOFFSET := 2,
BITOFFSET := 1,
ENO => ENO);
IF NOT ENO THEN;
#Peeker_BOOL := 0;
END_IF;
指令针脚定义如下:
在上表中的AREA说明中,16#81对应I区,16#82对应Q区,16#83对应M区,16#84对应DB区。如以MD0为例,读取MD0中的各个位,其对应关系见以下分析:
"位读取存储" := PEEK_BOOL(
area := "读取区域",
dbNumber := "DB号",
byteOffset := "待读取地址",
bitOffset := "待读取位");
如上图所示,当读取M区域时:
待读取地址:n 待读取位: x
PEEK_BOOL读取的位为:Mn.x 注意:x≤7
3.1.2 PEEK_BYTE
PEEK_ BYTE以字节的形式对西门子数据进行间接寻址,用于在不指定数据类型的情况下从标准存储区读取存储字节。指令应用举例为:
#字节存储 := PEEK_BYTE(area := "读取区域",
dbNumber := "DB号",
byteOffset :="待读取地址");
如上图所示,当读取M区域时:
待读取地址:n
PEEK_BYTE读取的字节为:MBn
3.1.3 PEEK_WORD
PEEK_ WORD以字的形式对西门子数据进行间接寻址,用于在不指定数据类型的情况下从标准存储区读取存储字。指令应用举例为:
#字存储:=PEEK_WORD(area := "读取区域",
dbNumber := "DB号",
byteOffset := "待读取地址");
如上图所示,当读取M区域时:
待读取地址:n
PEEK_WORD读取的字节为:MWn
3.1.4 PEEK_DWORD
PEEK_ DWORD以双字的形式对西门子数据进行间接寻址,用于在不指定数据类型的情况下从标准存储区读取存储双字。指令应用举例为:
#双字存储 := PEEK_DWORD(area := "读取区域",
dbNumber := "DB号",
byteOffset := "待读取地址");
如上图所示,当读取M区域时:
待读取地址:n
PEEK_DWORD读取的字节为:MDn
3.2 POKE
西门子使用SCL编程时,可以用POKE指令来写入I、Q、M和DB中的数据,PEKE支持以位(PEKE_BOOL)、字节(PEKE_BYTE)、字(PEKE_WORD)以及双字(PEKE_DWORD)的形式进行数据写入。
3.2.1 POKE_BOOL
POKE_BOOL以位的形式对西门子数据进行间接寻址,用于在不指定数据类型的情况下从标准存储区写入存储位。指令针脚定义如下:
在上表中的AREA说明中,16#81对应I区,16#82对应Q区,16#83对应M区,16#84对应DB区。如以MD0为例,读取MD0中的各个位,其对应关系见以下分析:
POKE_BOOL(area:="读写区域",
dbNumber:="DB号",
byteOffset:="待读写地址",
bitOffset:="待读写位",
value:="值给定位");
如上图所示,当写入M区域时:
待读写地址:n 待读写位: x
POKE_BOOL写入的位为:Mn.x 注意:x≤7
3.2.2 POKE_BLK
“写入存储地址”指令用于在不指定数据类型的情况下将存储地址写入标准存储区,下表为指令及其针脚定义表。
POKE(AREA := 16#84,
DBNUMBER := 1,
BYTEOFFSET := 2,
VALUE := BYTE#7,
ENO => ENO);
在上表中的AREA说明中,16#81对应I区,16#82对应Q区,16#83对应M区,16#84对应DB区。如以MD0为例,读取MD0中的各个位,其对应关系见以下分析:
如上图所示,当写入M区域且Value为byte时:
待读写地址:n
POKE写入的为字节为:MBn
如上图所示,当写入M区域且Value为WORD时:
待读写地址:n
POKE写入的为字为:MWn
如上图所示,当写入M区域且Value为DWORD时:
待读写地址:n
POKE写入的为双字为:MDn