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