西門子S51500系列PLC尋址方式淺析
對(duì)于西門子尋址方式在此做簡(jiǎn)單解析,目的備忘和更為深入和熟練的使用。
1、西門子高地址、低字節(jié)
高字節(jié)、低字位對(duì)應(yīng)描述對(duì)象是以字節(jié)為單位,只有比字節(jié)大的存儲(chǔ)單位進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí)才存在這種說(shuō)法,具體到PLC中就是字和雙字,一個(gè)雙字是由四個(gè)連續(xù)的字節(jié)組成,此處以西門子博途MD0的雙字變量作為解析地址舉例來(lái)解析西門子高地址低字節(jié)的意義,定義如下:

MD0為雙字DWord數(shù)據(jù)類型,其是由連續(xù)的四個(gè)字節(jié)組成,即MB0、MB1、MB2和MB3,此處MB3為高字節(jié),MB0為低字節(jié),如下示意圖為MD0的32個(gè)位的排列順序。

從上圖可以看到最左邊是最高位31,最右邊是最低位0,左邊最高的8各位編號(hào)為24-31,對(duì)應(yīng)的字節(jié)是MB0,最右邊最低的8個(gè)位0-7,對(duì)應(yīng)的字節(jié)是MB3,可以從圖中看出,西門子的MD0最高的字節(jié)編號(hào)MB3反而在最右邊充當(dāng)最低的0-7位,而最低的字節(jié)編號(hào)MB0出現(xiàn)在了最高位24-31位置編號(hào),這就是高地址、低字節(jié)意義。
下面是數(shù)字在空間中的存儲(chǔ)介紹,比如十進(jìn)制數(shù)字1,234,567,891,其十六進(jìn)制為16#499602D3,二進(jìn)制位2#0100 1001 1001 0110 0000 0010 1101 0011,這些數(shù)據(jù)在西門子PLC中的存儲(chǔ)方式如下圖:

從上圖可以看出,MB3作為最高字節(jié)編號(hào),其存儲(chǔ)的為最低位數(shù)據(jù)16#D3,MB0作為最低字節(jié)編號(hào),其存儲(chǔ)的為最高位數(shù)據(jù)16#49。以下為將MD0分解為32個(gè)位時(shí),數(shù)據(jù)存儲(chǔ)情況。
由上圖可以看出,在西門子數(shù)據(jù)存儲(chǔ)過(guò)程中,對(duì)于雙字MD0其分為四個(gè)連續(xù)字節(jié),MB0存儲(chǔ)最高位數(shù)據(jù),MB3存儲(chǔ)最低位數(shù)據(jù),在數(shù)字用十六進(jìn)制顯示過(guò)程中,每?jī)蓚€(gè)數(shù)字表示一個(gè)字節(jié),如16#49表示最高位MB0,每一個(gè)數(shù)字表示四個(gè)位,依據(jù)8421的方式對(duì)每個(gè)位進(jìn)行對(duì)應(yīng),如當(dāng)MD0存儲(chǔ)的數(shù)據(jù)為16#10000000時(shí),則M0.4位true。
2、西門子片段尋址
在西門子S71500/S71200系列PLC開(kāi)始,其尋址方式開(kāi)始支持Slice或者片段尋址方式,語(yǔ)法表達(dá)式如下,以MD0舉例:
位尋址: ”測(cè)試雙字”.%Xn
字節(jié)尋址:”測(cè)試雙字”.%Xbn
字尋址: ”測(cè)試雙字”.%Xwn
雙字尋址:”測(cè)試雙字”.%Xdn(對(duì)于64位及以上數(shù)據(jù))
以上”測(cè)試雙字”表示待尋址數(shù)據(jù)變量名,%X后b表示字節(jié),訪問(wèn)8個(gè)位,w表示字,訪問(wèn)16個(gè)位,d表示雙字,訪問(wèn)32個(gè)位,n表示尋址序號(hào)。
通常針對(duì)Byte、Word等數(shù)據(jù)類型的變量進(jìn)行片段訪問(wèn),如下圖所示,此外也可以對(duì)INT、DINT等整數(shù)數(shù)據(jù)類型的變量進(jìn)行片段訪問(wèn)。注意,博途V13以后.X改為.%X。

由上圖可以看出,對(duì)于MD0使用片段尋址時(shí):
”測(cè)試雙字”.%X0對(duì)應(yīng)MD0的最低位,即M3.0;
”測(cè)試雙字”.%X31對(duì)應(yīng)MD0的最高位,即M0.7;
”測(cè)試雙字”.%Xb0對(duì)應(yīng)最低字節(jié)MB3;
”測(cè)試雙字”.%Xb3對(duì)應(yīng)最高字節(jié)MB0;
”測(cè)試雙字”.%Xw0對(duì)應(yīng)最低字MW2;
”測(cè)試雙字”.%Xw1對(duì)應(yīng)最高字MW0;
3、西門子間接尋址
3.1 PEEK
西門子使用SCL編程時(shí),可以用PEEK指令來(lái)讀取I、Q、M和DB中的數(shù)據(jù),PEEK支持以位(PEEK_BOOL)、字節(jié)(PEEK_BYTE)、字(PEEK_WORD)以及雙字(PEEK_DWORD)的形式進(jìn)行數(shù)據(jù)讀取。
3.1.1 PEEK_BOOL
PEEK_BOOL以位的形式對(duì)西門子數(shù)據(jù)進(jìn)行間接尋址,用于在不指定數(shù)據(jù)類型的情況下從標(biāo)準(zhǔn)存儲(chǔ)區(qū)讀取存儲(chǔ)位。指令應(yīng)用舉例為:
#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說(shuō)明中,16#81對(duì)應(yīng)I區(qū),16#82對(duì)應(yīng)Q區(qū),16#83對(duì)應(yīng)M區(qū),16#84對(duì)應(yīng)DB區(qū)。如以MD0為例,讀取MD0中的各個(gè)位,其對(duì)應(yīng)關(guān)系見(jiàn)以下分析:
"位讀取存儲(chǔ)" := PEEK_BOOL(
area := "讀取區(qū)域",
dbNumber := "DB號(hào)",
byteOffset := "待讀取地址",
bitOffset := "待讀取位");
如上圖所示,當(dāng)讀取M區(qū)域時(shí):
待讀取地址:n 待讀取位: x
PEEK_BOOL讀取的位為:Mn.x 注意:x≤7
3.1.2 PEEK_BYTE
PEEK_ BYTE以字節(jié)的形式對(duì)西門子數(shù)據(jù)進(jìn)行間接尋址,用于在不指定數(shù)據(jù)類型的情況下從標(biāo)準(zhǔn)存儲(chǔ)區(qū)讀取存儲(chǔ)字節(jié)。指令應(yīng)用舉例為:
#字節(jié)存儲(chǔ) := PEEK_BYTE(area := "讀取區(qū)域",
dbNumber := "DB號(hào)",
byteOffset :="待讀取地址");

如上圖所示,當(dāng)讀取M區(qū)域時(shí):
待讀取地址:n
PEEK_BYTE讀取的字節(jié)為:MBn
3.1.3 PEEK_WORD
PEEK_ WORD以字的形式對(duì)西門子數(shù)據(jù)進(jìn)行間接尋址,用于在不指定數(shù)據(jù)類型的情況下從標(biāo)準(zhǔn)存儲(chǔ)區(qū)讀取存儲(chǔ)字。指令應(yīng)用舉例為:
#字存儲(chǔ):=PEEK_WORD(area := "讀取區(qū)域",
dbNumber := "DB號(hào)",
byteOffset := "待讀取地址");

如上圖所示,當(dāng)讀取M區(qū)域時(shí):
待讀取地址:n
PEEK_WORD讀取的字節(jié)為:MWn
3.1.4 PEEK_DWORD
PEEK_ DWORD以雙字的形式對(duì)西門子數(shù)據(jù)進(jìn)行間接尋址,用于在不指定數(shù)據(jù)類型的情況下從標(biāo)準(zhǔn)存儲(chǔ)區(qū)讀取存儲(chǔ)雙字。指令應(yīng)用舉例為:
#雙字存儲(chǔ) := PEEK_DWORD(area := "讀取區(qū)域",
dbNumber := "DB號(hào)",
byteOffset := "待讀取地址");

如上圖所示,當(dāng)讀取M區(qū)域時(shí):
待讀取地址:n
PEEK_DWORD讀取的字節(jié)為:MDn
3.2 POKE
西門子使用SCL編程時(shí),可以用POKE指令來(lái)寫入I、Q、M和DB中的數(shù)據(jù),PEKE支持以位(PEKE_BOOL)、字節(jié)(PEKE_BYTE)、字(PEKE_WORD)以及雙字(PEKE_DWORD)的形式進(jìn)行數(shù)據(jù)寫入。
3.2.1 POKE_BOOL
POKE_BOOL以位的形式對(duì)西門子數(shù)據(jù)進(jìn)行間接尋址,用于在不指定數(shù)據(jù)類型的情況下從標(biāo)準(zhǔn)存儲(chǔ)區(qū)寫入存儲(chǔ)位。指令針腳定義如下:

在上表中的AREA說(shuō)明中,16#81對(duì)應(yīng)I區(qū),16#82對(duì)應(yīng)Q區(qū),16#83對(duì)應(yīng)M區(qū),16#84對(duì)應(yīng)DB區(qū)。如以MD0為例,讀取MD0中的各個(gè)位,其對(duì)應(yīng)關(guān)系見(jiàn)以下分析:
POKE_BOOL(area:="讀寫區(qū)域",
dbNumber:="DB號(hào)",
byteOffset:="待讀寫地址",
bitOffset:="待讀寫位",
value:="值給定位");

如上圖所示,當(dāng)寫入M區(qū)域時(shí):
待讀寫地址:n 待讀寫位: x
POKE_BOOL寫入的位為:Mn.x 注意:x≤7
3.2.2 POKE_BLK
“寫入存儲(chǔ)地址”指令用于在不指定數(shù)據(jù)類型的情況下將存儲(chǔ)地址寫入標(biāo)準(zhǔn)存儲(chǔ)區(qū),下表為指令及其針腳定義表。
POKE(AREA := 16#84,
DBNUMBER := 1,
BYTEOFFSET := 2,
VALUE := BYTE#7,
ENO => ENO);

在上表中的AREA說(shuō)明中,16#81對(duì)應(yīng)I區(qū),16#82對(duì)應(yīng)Q區(qū),16#83對(duì)應(yīng)M區(qū),16#84對(duì)應(yīng)DB區(qū)。如以MD0為例,讀取MD0中的各個(gè)位,其對(duì)應(yīng)關(guān)系見(jiàn)以下分析:

如上圖所示,當(dāng)寫入M區(qū)域且Value為byte時(shí):
待讀寫地址:n
POKE寫入的為字節(jié)為:MBn

如上圖所示,當(dāng)寫入M區(qū)域且Value為WORD時(shí):
待讀寫地址:n
POKE寫入的為字為:MWn

如上圖所示,當(dāng)寫入M區(qū)域且Value為DWORD時(shí):
待讀寫地址:n
POKE寫入的為雙字為:MDn
posted on 2025-04-06 15:46 老邁克 閱讀(763) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)