產(chǎn)品分類品牌分類
-
長野計器NAGANO KEIKI壓力表 山本電機MANOSTAR微差壓開關(guān) 美國PARKER派克壓力調(diào)節(jié)器 日本山本MANOSTAR微差壓表 韓國AUTONICS壓力傳感器 國產(chǎn)電接點壓力表 德國Wenglor壓力傳感器 美國PARKER派克壓力傳感器 德國E+H壓力變送器 日本AZBIL壓力傳感器 中國臺灣金器Mindman壓力表 意大利GEFRAN壓力傳感器 德國VEGA壓力變送器 德國HYDAC壓力開關(guān) 美國BANNA壓力開關(guān) 意大利ELETTROTEC壓力開關(guān) 德國KROHNE壓力變送器 意大利ELETTROTEC電子壓力開關(guān) 美國SOR索爾壓力開關(guān) 德國Honsberg壓力傳感器 德國BECK壓力開關(guān) 美國UE壓力開關(guān) 美國FAIRCHLD壓力調(diào)節(jié)器 西門子SIEMENS壓力變送器 日本Yokogawa壓力變送器 羅斯蒙特差壓變送器? HONEYWELL壓力傳感器 瑞士ABB絕壓變送器 WIKA威卡壓力變送器 WIKA威卡壓力表 西門子SIEMENS差壓變送器 瑞士ABB差壓變送器 壓力表廠家直銷 伊萊科壓力控制器 德國HYDAC壓力傳感器 賀德克壓力變送器 國產(chǎn)壓力變送器 日本橫河Yokogawa壓力變送器
-
日東精工流量計 溫壓一體式渦街流量計 液晶顯示金屬管轉(zhuǎn)子流量計 日東精工nittoseiko流量計 德國MuTec流量開關(guān) 德國HENSE流量計 意大利SETTIMA流量計 國產(chǎn)氣體質(zhì)量流量計 國產(chǎn)熱式氣體質(zhì)量流量計 國產(chǎn)質(zhì)量流量計 國產(chǎn)旋進漩渦流量計 國產(chǎn)超聲波流量計 國產(chǎn)轉(zhuǎn)子流量計 西門子SIEMENS流量計 日本AZBIL流量計 德國KEM流量計 德國MEISTER流量計 丹麥EMCO流量計 瑞士ABB流量計 德國KROHNE流量計 德國KRACHT齒輪流量計 德國AIRCOM流量控制器 德國Honsberg流量計 日本YAMATAKE流量計 德國VSE流量計 WIKA威卡流量開關(guān) 美國ROSEMONT流量計 美國BANNA流量計 德國圖爾克TURCK流量傳感器 德國SIEMENS流量計 楔形流量計 V錐流量計 威托巴流量計 意大利ELETTROTEC流量開關(guān) 德國E+H流量計 平衡流量計廠家直銷 熱式氣體質(zhì)量流量計 手持式超聲波流量計 國產(chǎn)孔板流量計 國產(chǎn)渦街流量計 國產(chǎn)電磁流量計 日本川崎KAWAKI流量計 日本橫河Yokogawa流量計
-
日本FUJI溫度調(diào)節(jié)器 國產(chǎn)雙金屬溫度計 日本YAMATAKE溫控器 德國TESTO紅外線?溫度計 德國Wenglor溫度傳感器 美國FLUKE便攜式紅外測溫儀 BRristol Babcock溫度探頭 丹麥佩勒PR溫度變送器 意大利GEFRAN熱電偶 德國HYDAC溫度傳感器 丹麥EMCO溫度傳感器 德國KROHNE溫度傳感器 意大利ELETTROTEC溫度開關(guān) 德國JUMO溫度變送器 韓國HANYOUNG溫度控制器 中國臺灣FOTEK溫度控制器 德國OPTRIS紅外測溫儀 德國TESTO測溫儀 日本Yokogawa溫度變送器 WIKA溫度計 美國HONEYWELL溫度傳感器 瑞士ABB溫度計 美國BANNA溫度傳感器 美國ROSEMONT溫度變送器 德國圖爾克TURCK溫度變送器 德國SIEMENS溫度傳感器 美國FLUKE測溫儀 美國FLUKE手持式溫度計 德國E+H溫度計
-
頂裝防爆超聲波液位開關(guān) 外測超聲波液位計 迷你超聲波液位開關(guān) 智能外貼超聲波液位開關(guān) 國產(chǎn)導(dǎo)波雷達液位計 美國BlueLevel音叉液位開關(guān) 國產(chǎn)磁翻板液位計 導(dǎo)波雷達物位計 國產(chǎn)液位變送器 瑞士BESTA浮球開關(guān) 瑞士WEKA液位計 德國Wenglor液位傳感器 德國E+H物位計 美國SOR液位計 德國HYDAC液位開關(guān) 丹麥EMCO液位開關(guān) 美國美特斯MTS液位計 意大利ELETTROTEC液位計 德國KROHNE物位計 意大利ELETTROTE液位傳感器 美國SOR索爾液位開關(guān) 德國BURKERT雷達液位計 WIKA威卡液位計 瑞士ABB液位計 美國ROSEMONT液位變送器 雙法蘭液位計 投入式液位計 單法蘭液位計 側(cè)裝式磁性翻柱液位計 頂裝磁翻板液位計 德國HYDAC液位傳感器 德國E+H液位計 磁浮球液位計 雷達液位計 磁致伸縮液位計 磁翻板液位計 日本橫河Yokogawa液位計
-
美國MAGTROL傳感器 瑞士CARLOGAVAZZI傳感器 韓國HANYOUNG傳感器 韓國AUTONICS光電傳感器 日本YAMATAKE傳感器 德國FESTO傳感器 德國BALLUFF傳感器 意大利AECO傳感器 德國SCHMERSAL傳感器 瑞士萊姆LEM傳感器 美國TE泰科傳感器 德國PILZ傳感器 德國HUBNER-BERLIN傳感器 德國ALTHEN傳感器 德國IFM傳感器 美國特迪亞tedea傳感器 美國BENTLY傳感器 瑞士VIBRO-METER傳感器 德國BALLUFF激光傳感器 德國FSG傳感器 德國STOERK傳感器 德國MAGNESCALE傳感器 德國Wenglor傳感器 瑞士contrinex傳感器 瑞士CARLOGAVAZZI電感式傳感器 日本SUNX傳感器 意大利GEFRAN傳感器 意大利ELTRA傳感器 美國COGNEX傳感器 美國AI-TEK傳感器 美國BANNER傳感器 德國VSE傳感器 NOVOTECHNIK傳感器 德國倍加福P+F傳感器 德國SICK傳感器 美國羅克韋爾AB傳感器 美國ROSEMONT變送器 美國HONEYWELL傳感器 綠測器MIDORI傳感器 日本Yokogawa傳感器 美國EMERSON變送器 歐姆龍OMRON傳感器 德國TURCK傳感器 美國MTS傳感器 德國HYDAC傳感器 美國羅克韋爾傳感器
-
氣動薄膜高壓單座調(diào)節(jié)閥 氣動薄膜小口徑單座調(diào)節(jié)閥 氣動薄膜角形調(diào)節(jié)閥 氣動薄膜三通調(diào)節(jié)閥 氣動薄膜多級降壓低噪音調(diào)節(jié)閥 美國PARKER閥 意大利burocco閥 意大利burocco布魯克截止閥 德國GEMÜ蓋米閥 瑞士WEKA閥 德國FESTO閥 德國AIRCOM閥 德國Rexroth閥門 德國KRACHT閥門 袋配SBFEC閥 德國HYDAC閥 美國CIR-LOK閥門 美國masonilan閥 意大利CALEFFI閥 德國GSR閥 芬蘭美卓閥門 德國布赫BUCHER閥 日本KOGANEI閥 德國DUNGS閥 SBFEC閥門 美國博雷Bray閥 芬蘭美卓METSO閥門 德國KSB閥 日本KOSO閥 美國FLOWSERVE閥 德國RICKMEIER閥 德國布赫BUCHER控制閥 德國EMG閥 美國FISHER閥門 德國HAWE閥 德國AIRCOM調(diào)壓閥 韓國TPC閥 韓國TKC閥 中國臺灣金器Mindman閥 中國臺灣AIRTAC閥 日本YAMATAKE閥 日本TOKIMEC閥 日本油研YUKEN閥 意大利ODE閥 意大利ATOS閥 美國SUN閥 美國Posi-flate閥 美國TESCOM閥 美國MAC閥 美國ASCO閥 美國MOOG閥 德國BURKERT閥 日本CKD喜開理電磁閥 文丘里角閥? 微壓調(diào)節(jié)閥 O型球閥? 三通調(diào)節(jié)閥? 單座調(diào)節(jié)閥
-
澳大利亞Ebsray泵 德國boerger?泵 美國Blackmer泵 美國PARKER泵 德國Almatec泵 法國MOUVEX泵 新加坡EUROFLO泵 意大利OBL泵 德國FLUX泵 瑞士cp泵 意大利SETTIMA泵 美國VICKERS泵 法國OLAER泵 意大利CASAPPA泵 德國DENISON泵 德國KSB泵 德國KSB泵流量計 美國FLOWSERVE泵 德國RICKMEIER泵 德國布赫BUCHER泵 意大利CASAPPA齒輪泵 德國HAWE泵 德國VERDER泵 德國KRACHT泵 日本TOYOOKI泵 日本YUKEN泵 美國EATON泵 德國Rexroth泵 塔克TACO泵 臥式離心泵 輕型臥式多級離心泵 液壓隔膜計量泵
PLC編程,,實例學(xué)習(xí)PLC指針編程的方法
我們知道,,在PLC中劃有各種用途的存儲區(qū),比如物理輸入輸出區(qū)P,、映像輸入?yún)^(qū)I,、映像輸出區(qū)Q、位存儲區(qū)M,、定時器T,、計數(shù)器C、數(shù)據(jù)區(qū)DB和L等,,同時我們還知道,,每個區(qū)域可以用位(BIT)、字節(jié)(BYTE),、字(WORD),、雙字(DWORD)來衡量,或者說來確切的大小,。當(dāng)然定時器T,、計數(shù)器C不存在這種衡量體制,它們僅用位來衡量,。由此我們可以得到,,要描述一個地址,至少應(yīng)該包含兩個要素:
1,、存儲的區(qū)域
2,、這個區(qū)域中具體的位置
比如:A Q2.0
其中的A是指令符,Q2.0是A的操作數(shù),,也就是地址,。這個地址由兩部分組成:
Q:指的是映像輸出區(qū)
2.0:就是這個映像輸出區(qū)第二個字節(jié)的第0位。
由此,,我們得出,, 一個確切的地址組成應(yīng)該是:
〖存儲區(qū)符〗〖存儲區(qū)尺寸符〗〖尺寸數(shù)值〗.〖位數(shù)值〗,例如:DBX200.0,。
DB X 200 . 0
其中,,我們又把〖存儲區(qū)符〗〖存儲區(qū)尺寸符〗這兩個部分合稱為:地址標(biāo)識符。這樣,一個確切的地址組成,,又可以寫成:
地址標(biāo)識符 + 確切的數(shù)值單元
【間接尋址的概念】
尋址,,就是指令要進行操作的地址。給定指令操作的地址方法,,就是尋址方法,。
在談間接尋址之前,我們簡單的了解一下直接尋址,。所謂直接尋址,,簡單的說,就是直接給出指令的確切操作數(shù),,象上面所說的,,A Q2.0,就是直接尋址,,對于A這個指令來說,,Q2.0就是它要進行操作的地址。
這樣看來,,間接尋址就是間接的給出指令的確切操作數(shù),。對,就是這個概念,。
比如:A Q[MD100] ,,A T[DBW100]。程序語句中用方刮號 [ ] 標(biāo)明的內(nèi)容,,間接的指明了指令要進行的地址,,這兩個語句中的MD100和DBW100稱為指針Pointer,它指向它們其中包含的數(shù)值,,才是指令真正要執(zhí)行的地址區(qū)域的確切位置,。間接由此得名。
西門子的間接尋址方式計有兩大類型:存儲器間接尋址和寄存器間接尋址,。
【存儲器間接尋址】
存儲器間接尋址的地址給定格式是:地址標(biāo)識符+指針,。指針?biāo)甘敬鎯卧兴臄?shù)值,就是地址的確切數(shù)值單元,。
存儲器間接尋址具有兩個指針格式:單字和雙字,。
單字指針是一個16bit的結(jié)構(gòu),從0-15bit,,指示一個從0-65535的數(shù)值,,這個數(shù)值就是被尋址的存儲區(qū)域的編號。
雙字指針是一個32bit的結(jié)構(gòu),,從0-2bit,,共三位,按照8進制指示被尋址的位編號,也就是0-7,;而從3-18bit,,共16位,指示一個從0-65535的數(shù)值,,這個數(shù)值就是被尋址的字節(jié)編號,。
指針可以存放在M、DI,、DB和L區(qū)域中,,也就是說,,可以用這些區(qū)域的內(nèi)容來做指針,。
單字指針和雙字指針在使用上有很大區(qū)別。下面舉例說明:
L DW#16#35 //將32位16進制數(shù)35存入ACC1
T MD2 //這個值再存入MD2,,這是個32位的位存儲區(qū)域
L +10 //將16位整數(shù)10存入ACC1,,32位16進制數(shù)35自動移動到ACC2
T MW100 //這個值再存入MW100,這是個16位的位存儲區(qū)域
OPN DBW[MW100] //打開DBW10,。這里的[MW100]就是個單字指針,,存放指針的區(qū)域是M區(qū),
MW100中的值10,,就是指針間接的地址,,它是個16位的值!
--------
L L#+10 //以32位形式,,把10放入ACC1,,此時,ACC2中的內(nèi)容為:16位整數(shù)10
T MD104 //這個值再存入MD104,,這是個32位的位存儲區(qū)域
A I[MD104] //對I1.2進行與邏輯操作,!
=DIX[MD2] //賦值背景數(shù)據(jù)位DIX6.5!
--------
A DB[MW100].DBX[MD2] //讀入DB10.DBX6.5數(shù)據(jù)位狀態(tài)
=Q[MD2] //賦值給Q6.5
--------
A DB[MW100].DBX[MD2] //讀入DB10.DBX6.5數(shù)據(jù)位狀態(tài)
=Q[MW100] //錯誤??!沒有Q10這個元件
--------------------------------------------------------------------------------------------------
從上面系列舉例我們至少看出來一點:
單字指針只應(yīng)用在地址標(biāo)識符是非位的情況下。的確,,單字指針前面描述過,,它確定的數(shù)值是0-65535,而對于byte.bit這種具體位結(jié)構(gòu)來說,,只能用雙字指針,。這是它們的一個區(qū)別,單字指針的另外一個限制就是,,它只能對T,、C、DB、FC和FB進行尋址,,通俗地說,,單字指針只可以用來指代這些存儲區(qū)域的編號。
相對于單字指針,,雙字指針就沒有這樣的限制,,它不僅可以對位地址進行尋址,還可以對BYTE,、WORD,、DWORD尋址,并且沒有區(qū)域的限制,。不過,,有得必有失,在對非位的區(qū)域進行尋址時,,必須確保其0-2bit為全0,!
總結(jié)一下:
單字指針的存儲器間接尋址只能用在地址標(biāo)識符是非位的場合;雙字指針由于有位格式存在,,所以對地址標(biāo)識符沒有限制,。也正是由于雙字指針是一個具有位的指針,因此,,當(dāng)對字節(jié),、字或者雙字存儲區(qū)地址進行尋址時,必須確保雙字指針的內(nèi)容是8或者8的倍數(shù),。
現(xiàn)在,,我們來分析一下上述例子中的A I[MD104] 為什么后是對I1.2進行與邏輯操作。
通過L L#+10 ,,我們知道存放在MD104中的值應(yīng)該是:
MD104:0000 0000 0000 0000 0000 0000 0000 1010
當(dāng)作為雙字指針時,,就應(yīng)該按照3-18bitbyte,0-2bitbit來確定終指令要操作的地址,,因此:
0000 0000 0000 0000 0000 0000 0000 1010 = 1.2
【地址寄存器間接尋址】
在先前所說的存儲器間接尋址中,,間接指針用M、DB,、DI和L直接,,就是說,指針指向的存儲區(qū)內(nèi)容就是指令要執(zhí)行的確切地址數(shù)值單元,。但在寄存器間接尋址中,,指令要執(zhí)行的確切地址數(shù)值單元,并非寄存器指向的存儲區(qū)內(nèi)容,,也就是說,,寄存器本身也是間接的指向真正的地址數(shù)值單元,。從寄存器到得出真正的地址數(shù)值單元,西門子提供了兩種途徑:
1,、區(qū)域內(nèi)寄存器間接尋址
2,、區(qū)域間寄存器間接尋址
地址寄存器間接尋址的一般格式是:
〖地址標(biāo)識符〗〖寄存器,P#byte.bit〗,比如:DIX[AR1,P#1.5] 或 M[AR1,P#0.0] ,。
〖寄存器,P#byte.bit〗統(tǒng)稱為:寄存器尋址指針,,而〖地址標(biāo)識符〗在上帖中談過,它包含〖存儲區(qū)符〗+〖存儲區(qū)尺寸符〗,。但在這里,,情況有所變化。比較一下剛才的例子:
DIX [AR1,P#1.5]
X [AR1,P#1.5]
DIX可以認(rèn)為是我們通常定義的地址標(biāo)識符,,DI是背景數(shù)據(jù)塊存儲區(qū)域,,X是這個存儲區(qū)域的尺寸符,指的是背景數(shù)據(jù)塊中的位,。但下面一個示例中的M呢,?X只是了存儲區(qū)域的尺寸符,,那么存儲區(qū)域符在哪里呢,?毫無疑問,在AR1中,!
DIX [AR1,P#1.5] 這個例子,,要尋址的地址區(qū)域事先已經(jīng)確定,AR1可以改變的只是這個區(qū)域內(nèi)的確切地址數(shù)值單元,,所以我們稱之為:區(qū)域內(nèi)寄存器間接尋址方式,,相應(yīng)的,這里的[AR1,P#1.5] 就叫做區(qū)域內(nèi)尋址指針,。
X [AR1,P#1.5] 這個例子,,要尋址的地址區(qū)域和確切的地址數(shù)值單元,都未事先確定,,只是確定了存儲大小,,這就是意味著我們可以在不同的區(qū)域間的不同地址數(shù)值單元以給定的區(qū)域大小進行尋址,所以稱之為:區(qū)域間寄存器間接尋址方式,,相應(yīng)的,,這里的[AR1,P#1.5] 就叫做區(qū)域間尋址指針。
既然有著區(qū)域內(nèi)和區(qū)域間尋址之分,,那么,,同樣的AR1中,就存有不同的內(nèi)容,,它們代表著不同的含義,。
【AR的格式】
地址寄存器是專門用于尋址的一個特殊指針區(qū)域,,西門子的地址寄存器共有兩個:AR1和AR2,每個32位,。
當(dāng)使用在區(qū)域內(nèi)寄存器間接尋址中時,,我們知道這時的AR中的內(nèi)容只是指明數(shù)值單元,因此,,區(qū)域內(nèi)寄存器間接尋址時,,寄存器中的內(nèi)容等同于上帖中提及的存儲器間接尋址中的雙字指針,也就是:
其0-2bit,,bit位,,3-18bitbyte字節(jié)。其第31bit固定為0,。
AR:
0000 0000 0000 0BBB BBBB BBBB BBBB BXXX
這樣規(guī)定,,就意味著AR的取值只能是:0.0 ——65535.7
例如:當(dāng)AR=D4(hex)=0000 0000 0000 0000 0000 0000 1101 0100(b),實際上就是等于26.4,。
而在區(qū)域間寄存器間接尋址中,,由于要尋址的區(qū)域也要在AR中,顯然這時的AR中內(nèi)容肯定于寄存器區(qū)域內(nèi)間接尋址時,,對AR內(nèi)容的要求,,或者說規(guī)定不同。
AR:
1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX
比較一下兩種格式的不同,,我們發(fā)現(xiàn),,這里的第31bit被固定為1,同時,,第24,、25、26位有了可以取值的范圍,。聰明的你,,肯定可以聯(lián)想到,這是用于存儲區(qū)域的,。對,,bit24-26的取值確定了要尋址的區(qū)域,它的取值是這樣定義的:
區(qū)域標(biāo)識符
26,、25,、24位
P(外部輸入輸出)
000
I(輸入映像區(qū))
001
Q(輸出映像區(qū))
010
M(位存儲區(qū))
011
DB(數(shù)據(jù)塊)
100
DI(背景數(shù)據(jù)塊)
101
L(暫存數(shù)據(jù)區(qū),也叫局域數(shù)據(jù))
111
如果我們把這樣的AR內(nèi)容,,用HEX表示的話,,那么就有:
當(dāng)是對P區(qū)域?qū)ぶ窌r,AR=800xxxxx
當(dāng)是對I區(qū)域?qū)ぶ窌r,,AR=810xxxxx
當(dāng)是對Q區(qū)域?qū)ぶ窌r,,AR=820xxxxx
當(dāng)是對M區(qū)域?qū)ぶ窌r,,AR=830xxxxx
當(dāng)是對DB區(qū)域?qū)ぶ窌r,AR=840xxxxx
當(dāng)是對DI區(qū)域?qū)ぶ窌r,,AR=850xxxxx
當(dāng)是對L區(qū)域?qū)ぶ窌r,,AR=870xxxxx
經(jīng)過列舉,我們有了初步的結(jié)論:如果AR中的內(nèi)容是8開頭,,那么就一定是區(qū)域間尋址,;如果要在DB區(qū)中進行尋址,只需在8后面跟上一個40,。84000000-840FFFFF指明了要尋址的范圍是:
DB區(qū)的0.0——65535.7,。
例如:當(dāng)AR=840000D4(hex)=1000 0100 0000 0000 0000 0000 1101 0100(b),實際上就是等于DBX26.4,。
我們看到,,在寄存器尋址指針 [AR1/2,P#byte.bit] 這種結(jié)構(gòu)中,P#byte.bit又是什么呢,?
【P#指針】
P#中的P是Pointer,,是個32位的直接指針。所謂的直接,,是指P#中的#后面所跟的數(shù)值或者存儲單元,,是P直接給定的。這樣P#XXX這種指針,,就可以被用來在指令尋址中,,作為一個“常數(shù)”來對待,這個“常數(shù)”可以包含或不包含存儲區(qū)域,。例如:
● L P#Q1.0 //把Q1.0這個指針存入ACC1,此時ACC1的內(nèi)容=82000008(hex)=Q1.0
★ L P#1.0 //把1.0這個指針存入ACC1,,此時ACC1的內(nèi)容=00000008(hex)=1.0
● L P#MB100 //錯誤,!必須按照byte.bit結(jié)構(gòu)給定指針。
● L P#M100.0 //把M100.0這個指針存入ACC1,,此時ACC1的內(nèi)容=83000320(hex)=M100.0
● L P#DB100.DBX26.4 //錯誤,!DBX已經(jīng)提供了存儲區(qū)域,不能重復(fù),。
● L P#DBX26.4 //把DBX26.4這個指針存入ACC1,,此時ACC1的內(nèi)容=840000D4(hex)=DBX26.4
我們發(fā)現(xiàn),當(dāng)對P#只是數(shù)值時,,累加器中的值和區(qū)域內(nèi)尋址指針規(guī)定的格式相同(也和存儲器間接尋址雙字指針格式相同),;而當(dāng)對P#帶有存儲區(qū)域時,累加器中的內(nèi)容和區(qū)域間尋址指針內(nèi)容*相同,。事實上,,把什么樣的值傳給AR,,就決定了是以什么樣的方式來進行寄存器間接尋址。在實際應(yīng)用中,,我們正是利用P#的這種特點,,根據(jù)不同的需要,P#指針,,然后,,再傳遞給AR,以確定終的尋址方式,。
在寄存器尋址中,,P#XXX作為寄存器AR指針的偏移量,用來和AR指針進行相加運算,,運算的結(jié)果,,才是指令真正要操作的確切地址數(shù)值單元!
無論是區(qū)域內(nèi)還是區(qū)域間尋址,,地址所在的存儲區(qū)域都有了,,因此,這里的P#XXX只能純粹的數(shù)值,,如上面例子中的★,。
【指針偏移運算法則】
在寄存器尋址指針 [AR1/2,P#byte.bit] 這種結(jié)構(gòu)中,P#byte.bit如何參與運算,,得出終的地址呢,?
運算的法則是:AR1和P#中的數(shù)值,按照BYTE位和BIT位分類相加,。BIT位相加按八進制規(guī)則運算,,而BYTE位相加,則按照十進制規(guī)則運算,。
例如:寄存器尋址指針是:[AR1,,P#2.6],我們分AR1=26.4和DBX26.4兩種情況來分析,。
當(dāng)AR1等于26.4,,
AR1:26.2
+ P#:2.6
---------------------------
= 29.7 這是區(qū)域內(nèi)寄存器間接尋址的終確切地址數(shù)值單元
當(dāng)AR1等于DBX26.4,
AR1:DBX26.2
+ P#:2.6
---------------------------
= DBX29.7 這是區(qū)域間寄存器間接尋址的終確切地址數(shù)值單元
【AR的地址數(shù)據(jù)賦值】
通過前面的介紹,,我們知道,,要正確運用寄存器尋址,重要的是對寄存器AR的賦值,。同樣,,區(qū)分是區(qū)域內(nèi)還是區(qū)域間尋址,也是看AR中的賦值,。
對AR的賦值通常有下面的幾個方法:
1,、直接賦值法
例如:
L DW#16#83000320
LAR1
可以用16進制,、整數(shù)或者二進制直接給值,但必須確保是32位數(shù)據(jù),。經(jīng)過賦值的AR1中既存儲了地址數(shù)值,,也了存儲區(qū)域,因此這時的寄存器尋址方式肯定是區(qū)域間尋址,。
2,、間接賦值法
例如:
L [MD100]
LAR1
可以用存儲器間接尋址指針給定AR1內(nèi)容。具體內(nèi)容存儲在MD100中,。
3,、指針賦值法
例如:
LAR1 P#26.2
使用P#這個32位“常數(shù)”指針賦值A(chǔ)R。
總之,,無論使用哪種賦值方式,,由于AR存儲的數(shù)據(jù)格式有明確的規(guī)定,因此,,都要在賦值前,,確認(rèn)所賦的值是否符合尋址規(guī)范。
使用間接尋址的主要目的,,是使指令的執(zhí)行結(jié)果有動態(tài)的變化,,簡化程序是目的,在某些情況下,,這樣的尋址方式是必須的,,比如對某存儲區(qū)域數(shù)據(jù)遍歷。此外,,間接尋址,,還可以使程序更具柔性,換句話說,,可以標(biāo)準(zhǔn)化,。
下面通過實例應(yīng)用來分析如何靈活運用這些尋址方式:
【存儲器間接尋址應(yīng)用實例】
我們先看一段示例程序:
L 100
T MW 100 // 將16位整數(shù)100傳入MW100
L DW#16#8 // 加載雙字16進制數(shù)8,當(dāng)把它用作雙字指針時,,按照BYTE.BIT結(jié)構(gòu),
結(jié)果演變過程就是:8H=1000B=1.0
T MD 2 // MD2=8H
OPN DB [MW 100] // OPN DB100
L DBW [MD 2] // L DB100.DBW1
T MW[MD2] // T MW1
A DBX [MD 2] // A DBX1.0
= M [MD 2] // =M1.0
在這個例子中,,我們中心思想其實就是:將DB100.DBW1中的內(nèi)容傳送到MW1中,。這里我們使用了存儲器間接尋址的兩個指針——單字指針MW100用于DB塊的編號,雙字指針MD2用于DBW和MW存儲區(qū)字地址,。
------------------------------------------------------------------------------------------
對于壇友提出的 DB[MW100].DBW[MD2] 這樣的尋址是錯誤的提法,,這里做個解釋:
DB[MW100].DBW[MD2] 這樣的尋址結(jié)構(gòu)就尋址原理來說,是可以理解的,,但從SIEMENS程序執(zhí)行機理來看,,是非法的,。在實際程序中,對于這樣的尋址,,程序語句應(yīng)該寫成:
OPN DBW[WM100],, L DBW[MD2]
-----------------------------------------------------------------------------------------------
事實上,從這個例子的中心思想來看,,根本沒有必要如此復(fù)雜,。但為什么要用間接尋址呢?
要澄清使用間接尋址的優(yōu)勢,,就讓我們從比較中,,找答案吧。
例子告訴我們,,它終執(zhí)行的是把DB的某個具體字的數(shù)據(jù)傳送到位存儲區(qū)某個具體字中,。這是針對數(shù)據(jù)塊100的1數(shù)據(jù)字傳送到位存儲區(qū)第1字中的具體操作。如果我們現(xiàn)在需要對同樣的數(shù)據(jù)塊的多個字(連續(xù)或者不連續(xù))進行傳送呢,?直接的方法,,就是一句一句的寫這樣的具體操作。有多少個字的傳送,,就寫多少這樣的語句,。毫無疑問,即使不知道間接尋址的道理,,也應(yīng)該明白,,這樣的編程方法是不合理的。而如果使用間接尋址的方法,,語句就簡單多了,。
【示例程序的結(jié)構(gòu)分析】
我將示例程序從結(jié)構(gòu)上做個區(qū)分,重新輸入如下:
=========================== 輸入1:數(shù)據(jù)塊編號的變量
|| L 100
|| T MW 100
===========================輸入2:字地址的變量
|| L DW#16#8
|| T MD 2
===========================操作主體程序
OPN DB [MW 100]
L DBW [MD 2]
T MW[MD2]
顯然,,我們根本不需要對主體程序(紅色部分)進行簡單而重復(fù)的復(fù)寫,,而只需改變MW100和MD2的賦值(綠色部分),就可以完成應(yīng)用要求,。
結(jié)論:通過對間接尋址指針內(nèi)容的修改,,就完成了主體程序執(zhí)行的結(jié)果變更,這種修改是可以是動態(tài)的和靜態(tài)的,。
正是由于對真正的目標(biāo)程序(主體程序)不做任何變動,,而尋址指針是這個程序中要修改的地方,可以認(rèn)為,,尋址指針是主體程序的入口參數(shù),,就好比功能塊的輸入?yún)?shù)。因而可使得程序標(biāo)準(zhǔn)化,具有移植性,、通用性,。
那么又如何動態(tài)改寫指針的賦值呢?不會是另一種簡單而重復(fù)的復(fù)寫吧,。
讓我們以一個具體應(yīng)用,,來完善這段示例程序吧:
將DB100中的1-11數(shù)據(jù)字,傳送到MW1-11中
在設(shè)計完成這個任務(wù)的程序之前,,我們先了解一些背景知識,。
【數(shù)據(jù)對象尺寸的劃分規(guī)則】
數(shù)據(jù)對象的尺寸分為:位(BOOL)、字節(jié)(BYTE),、字(WORD),、雙字(DWORD)。這似乎是個簡單的概念,,但如果,,MW10=MB10+MB11,那么是不是說,,MW11=MB12+MB13,?如果你的回答是肯定的,我建議你繼續(xù)看下去,,不要跳過,,因為這里的疏忽,會導(dǎo)致終的程序的錯誤,。
按位和字節(jié)來劃分?jǐn)?shù)據(jù)對象大小時,,是以數(shù)據(jù)對象的bit來偏移。這句話就是說,,0bit后就是1bit,,1bit后肯定是2bit,以此類推直到7bit,,完成一個字節(jié)大小的,,再有一個bit的偏移,就進入下一個字節(jié)的0bit,。
而按字和雙字來劃分?jǐn)?shù)據(jù)對象大小時,,是以數(shù)據(jù)對象的BYTE來偏移!這就是說,,MW10=MB10+MB11,,并不是說,MW11=MB12+MB13,,正確的是MW11=MB11+MB12,然后才是MW12=MB12+MB13!
這個概念的重要性在于,,如果你在程序中使用了MW10,,那么,就不能對MW11進行任何的操作,,因為,,MB11是MW10和MW11的交集。
也就是說,,對于“將DB100中的1-11數(shù)據(jù)字,,傳送到MW1-11中”這個具體任務(wù)而言,我們只需要對DBW1,、DBW3,、DBW5、DBW7,、DBW9,、DBW11這6個字進行6次傳送操作即可。這就是單獨分出一節(jié),,說明數(shù)據(jù)對象尺寸劃分規(guī)則這個看似簡單的概念的目的所在,。
【循環(huán)的結(jié)構(gòu)】
要“將DB100中的1-11數(shù)據(jù)字,傳送到MW1-11中”,,我們需要將指針內(nèi)容按照順序逐一指向相應(yīng)的數(shù)據(jù)字,,這種對指針內(nèi)容的動態(tài)修改,其實就是遍歷,。對于遍歷,,簡單的莫過于循環(huán)。
一個循環(huán)包括以下幾個要素:
1,、初始循環(huán)指針
2,、循環(huán)指針自加減
2、繼續(xù)或者退出循環(huán)體的條件判斷
被循環(huán)的程序主體必須位于初始循環(huán)指針之后,,和循環(huán)指針自加減之前,。
比如:
初始循環(huán)指針:X=0
循環(huán)開始點M
被循環(huán)的程序主體:-------
循環(huán)指針自加減:X+1=X
循環(huán)條件判斷:X≤10 ,F(xiàn)alse:GO TO M,;True:GO TO N
循環(huán)退出點N
如果把X作為間接尋址指針的內(nèi)容,,對循環(huán)指針的操作,就等于對尋址指針內(nèi)容的動態(tài)而循環(huán)的修改了,。
【將DB100中的1-11數(shù)據(jù)字,,傳送到MW1-11中】
L L#1 //初始化循環(huán)指針。這里循環(huán)指針就是我們要修改的尋址指針
T MD 102
M2: L MD 102
T #COUNTER_D
OPN DB100
L DBW [MD 102]
T MW [MD 102]
L #COUNTER_D
L L#2 // +2,,是因為數(shù)據(jù)字的偏移基準(zhǔn)是字節(jié),。
+D
T MD 102 //自加減循環(huán)指針,這是動態(tài)修改了尋址指針的關(guān)鍵
L L#11 //循環(huán)次數(shù)=n-1。n=6,。這是因為,,進入循環(huán)是無條件的,但已事實上執(zhí)行了一次操作,。
<=D
JC M2
有關(guān)于T MD102 ,,L L#11, <=D的詳細(xì)分析,,請按照前面的內(nèi)容推導(dǎo),。
【將DB1-10中的1-11數(shù)據(jù)字,傳送到MW1-11中】
這里增加了對DB數(shù)據(jù)塊的尋址,,使用單字指針MW100存儲尋址地址,,同樣使用了循環(huán),嵌套在數(shù)據(jù)字傳送循環(huán)外,,這樣,,要完成“將DB1-10中的1-11數(shù)據(jù)字,傳送到MW1-11中”這個任務(wù) ,,共需要M1循環(huán)10次 × M2循環(huán)6次 =60次,。
L 1
T MW 100
L L#1
T MD 102
M1: L MW 100
T #COUNTER_W
M2: 對數(shù)據(jù)字循環(huán)傳送程序,同上例
L #COUNTER_W
L 1 //這里不是數(shù)據(jù)字的偏移,,只是編號的簡單遞增,,因此+1
+I
T MW 100
L 9 //循環(huán)次數(shù)=n-1,n=10
<=I
JC M1
通過示例分析,,程序是讓尋址指針在對要操作的數(shù)據(jù)對象范圍內(nèi)進行遍歷來編程,,完成這個任務(wù)。我們看到,,這種對存儲器間接尋址指針的遍歷是基于字節(jié)和字的,,如何對位進行遍歷呢?
這就是下一個帖子要分析的寄存器間接尋址的實例的內(nèi)容了,。
L [MD100]
LAR1
L MD100
LAR1
有什么區(qū)別,?
當(dāng)將MD100以這種 [MD100] 形式表示時,你既要在對MD100賦值時考慮到所賦的值是否符合存儲器間接尋址雙字指針的規(guī)范,,又要在使用這個尋址格式作為語句一部分時,,是否符合語法的規(guī)范。
在你給出一個例程的一句:L [MD100]上,,我們看出它犯了后一個錯誤,。
存儲器間接尋址指針,是作為的存儲區(qū)域的確切數(shù)值單元來運用的,。也就是說,,指針不包含區(qū)域標(biāo)識,,它只是指明了一個數(shù)值。因此,,要在 [MD100]前加上區(qū)域標(biāo)識如:M,、DB、I,、Q、L等,,還要加上存儲區(qū)尺寸大小如:X,、B、W,、D等,。在加存儲區(qū)域和大小標(biāo)識時,要考慮累加器加載指令L不能對位地址操作,,因此,,只能非位的地址。
為了對比下面的寄存器尋址方式,,我們這里,,修改為:L MD[MD100]。并假定MD100=8Hex,,同時我們也假定MD1=85000018Hex,。
當(dāng)把MD100這個雙字作為一個雙字指針運用時,其存儲值的0-18bit將會按照雙字指針的結(jié)構(gòu)Byte.bit來重新“翻譯”,,“翻譯”的結(jié)果才是指針指向的地址,,因而MD100中的8Hex=1000B=1.0,所以下面的語句:
L MD[MD100]
LAR1
經(jīng)過“翻譯”就是:
L MD1
LAR1
前面我們已經(jīng)假定了MD1=85000018,,同樣道理,,MD1作為指針使用時,對0-18bit應(yīng)該經(jīng)過Byte.bit結(jié)構(gòu)的“翻譯”,,由于是傳送給AR地址寄存器,,還要對24-31bit進行區(qū)域?qū)ぶ?ldquo;翻譯”。這樣,,我們得出LAR1中終的值=DIX3.0,。就是說,我們在地址寄存器AR1中存儲了一個指針,,它指向DIX3.0,。
-----------------------------
L MD100
LAR1
這段語句,是直接把MD100的值傳送給AR,,當(dāng)然也要經(jīng)過“翻譯”,,結(jié)果AR1=1.0,。就是說,我們在地址寄存器AR1中存儲了一個指針,,它指向1.0,,這是由MD100直接賦值的。
似乎,,兩段語句,,只是賦值給AR1的結(jié)果不同而已,其實不然,。我們事先假定的值是考慮到對比的關(guān)系,,特意的。如果MD100=CHex的呢,?
對于前一段,,由于CHex=1100,其0-3bit為非0,,程序?qū)⒘⒓闯鲥e,,無法執(zhí)行。(因為沒有MD1.4這種地址?。,。?/p>
后一段AR1的值經(jīng)過翻譯以后,等于1.4,,程序能正常執(zhí)行,。