6ES7313-6CG04-0AB0詳細(xì)說明
6ES7313-6CG04-0AB0詳細(xì)說明
西門子plc的每次向上計數(shù)輸入執(zhí)行從關(guān)閉至打開轉(zhuǎn)換時,,向上計數(shù)(CTU)從該計數(shù)器的當(dāng)前值向上計數(shù)。重設(shè)輸入打開或執(zhí)行重設(shè)指令時,,計數(shù)器被重設(shè),。達(dá)到最大值(32,767)時,計數(shù)器停止,。
每次向上計數(shù)輸入執(zhí)行從關(guān)閉至打開轉(zhuǎn)換時,,向上/向下計數(shù)器(CTUD)向上計數(shù),每次向下計數(shù)輸入執(zhí)行從關(guān)閉至打開轉(zhuǎn)換32,767)時,,向上計數(shù)輸入的下一個上升邊緣導(dǎo)致當(dāng)前計數(shù)變成最小值(32,768)。與此相似,,達(dá)到最小值(-32,768)時,,向下計數(shù)輸入的下一個上升邊緣導(dǎo)致當(dāng)前計數(shù)變成最大值(32,767)。
向上和向上/向下計數(shù)器有一個保持當(dāng)前計數(shù)的當(dāng)前值,。計數(shù)器還有一個預(yù)設(shè)值(PV),,每次執(zhí)行計數(shù)器指令時,將預(yù)設(shè)值與當(dāng)C位)打開,。否則,,C位關(guān)閉。
每次向下計數(shù)輸入執(zhí)行從關(guān)閉至打開轉(zhuǎn)換時,,向下計數(shù)器(CTD)從該計數(shù)器的當(dāng)前值向下計數(shù),。載入輸入打開時,計數(shù)器重設(shè)計數(shù)器位,,并將預(yù)設(shè)值載入當(dāng)前值,。達(dá)到零時,計數(shù)器停止,,計數(shù)器位(C位)打開,。
當(dāng)您使用西門子plc重設(shè)指令重設(shè)計數(shù)器時,計數(shù)器位被重設(shè),,計數(shù)器當(dāng)前值被設(shè)為零,。使用計數(shù)器號碼引用該計數(shù)器的當(dāng)前值和C位。
注釋:
因?yàn)槊颗_計數(shù)器有一個當(dāng)前值,,請勿將相同的號碼給一臺以上計數(shù)器,。(向上計數(shù)器、向上/向下計數(shù)器和向下計數(shù)器存取相同的當(dāng)前值。)
● 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#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)容相同,。事實(shí)上,把什么樣的值傳給AR,,就決定了是以什么樣的方式來進(jìn)行寄存器間接尋址,。在實(shí)際應(yīng)用中,我們正是利用P#的這種特點(diǎn),,根據(jù)不同的需要,,P#指針,然后,,再傳遞給AR,,以確定最終的尋址方式。
在寄存器尋址中,,P#XXX作為寄存器AR指針的偏移量,,用來和AR指針進(jìn)行相加運(yùn)算,運(yùn)算的結(jié)果,,才是指令真正要操作的確切地址數(shù)值單元,!
無論是區(qū)域內(nèi)還是區(qū)域間尋址,,地址所在的存儲區(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位分類相加,。BIT位相加按八進(jìn)制規(guī)則運(yùn)算,而BYTE位相加,,則按照十進(jìn)制規(guī)則運(yùn)算,。
例如:寄存器尋址指針是:[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ù)賦值】
通過前面的介紹,,我們知道,要正確運(yùn)用寄存器尋址,,最重要的是對寄存器AR的賦值。同樣,,區(qū)分是區(qū)域內(nèi)還是區(qū)域間尋址,,也是看AR中的賦值。
對AR的賦值通常有下面的幾個方法:
1,、直接賦值法
例如:
L DW#16#83000320
LAR1
可以用16進(jìn)制,、整數(shù)或者二進(jìn)制直接給值,但必須確保是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)化,。
下面通過實(shí)例應(yīng)用來分析如何靈活運(yùn)用這些尋址方式,,在實(shí)例分析過程中,將對前面帖子中的筆誤,、錯誤和遺漏做糾正和補(bǔ)充,。
【存儲器間接尋址應(yīng)用實(shí)例】
我們先看一段示例程序:
L 100
T MW 100 // 將16位整數(shù)100傳入MW100
L DW#16#8 // 加載雙字16進(jìn)制數(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
在這個例子中,我們中心思想其實(shí)就是:將DB100.DBW1中的內(nèi)容傳送到MW1中,。這里我們使用了存儲器間接尋址的兩個指針——單字指針MW100用于DB塊的編號,,雙字指針MD2用于DBW和MW存儲區(qū)字地址。
-------------------------------------------------------------------------------------------------------------------------------------------------
對于壇友提出的 DB[MW100].DBW[MD2] 這樣的尋址是錯誤的提法,,這里做個解釋:
DB[MW100].DBW[MD2] 這樣的尋址結(jié)構(gòu)就尋址原理來說,,是可以理解的,但從SIEMENS程序執(zhí)行機(jī)理來看,,是非法的,。在實(shí)際程序中,對于這樣的尋址,,程序語句應(yīng)該寫成:
OPN DBW[WM100],, L DBW[MD2]-------------------------------------------------------------------------------------------------------------------------------------------------
事實(shí)上,從這個例子的中心思想來看,,根本沒有必要如此復(fù)雜,。但為什么要用間接尋址呢?
要澄清使用間接尋址的優(yōu)勢,,就讓我們從比較中,,找答案吧,。
例子告訴我們,它最終執(zhí)行的是把DB的某個具體字的數(shù)據(jù)傳送到位存儲區(qū)某個具體字中,。這是針對數(shù)據(jù)塊100的1數(shù)據(jù)字傳送到位存儲區(qū)第1字中的具體操作,。如果我們現(xiàn)在需要對同樣的數(shù)據(jù)塊的多個字(連續(xù)或者不連續(xù))進(jìn)行傳送呢?直接的方法,,就是一句一句的寫這樣的具體操作,。有多少個字的傳送,就寫多少這樣的語句,。毫無疑問,,即使不知道間接尋址的道理,也應(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]
顯然,我們根本不需要對主體程序(紅色部分)進(jìn)行簡單而重復(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ù)看下去,,不要跳過,,因?yàn)檫@里的疏忽,會導(dǎo)致最終的程序的錯誤,。
按位和字節(jié)來劃分?jǐn)?shù)據(jù)對象大小時,,是以數(shù)據(jù)對象的bit來偏移。這句話就是說,,0bit后就是1bit,,1bit后肯定是2bit,以此類推直到7bit,,完成一個字節(jié)大小的,,再有一個bit的偏移,就進(jìn)入下一個字節(jié)的0bit,。
而按字和雙字來劃分?jǐn)?shù)據(jù)對象大小時,,是以數(shù)據(jù)對象的BYTE來偏移!這就是說,,MW10=MB10+MB11,,并不是說,MW11=MB12+MB13,,正確的是MW11=MB11+MB12,,然后才是MW12=MB12+MB13!
這個概念的重要性在于,,如果你在程序中使用了MW10,,那么,就不能對MW11進(jìn)行任何的操作,,因?yàn)?,MB11是MW10和MW11的交集。
也就是說,,對于“將DB100中的1-11數(shù)據(jù)字,,傳送到MW1-11中"這個具體任務(wù)而言,我們只需要對DBW1,、DBW3,、DBW5,、DBW7、DBW9,、DBW11這6個字進(jìn)行6次傳送操作即可,。這就是單獨(dú)分出一節(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)修改,,其實(shí)就是遍歷。對于遍歷,,的莫過于循環(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)開始點(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)容,,對循環(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,是因?yàn)閿?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,。這是因?yàn)?,進(jìn)入循環(huán)是無條件的,
但已事實(shí)上執(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)進(jìn)行遍歷來
這就是下一個帖子要分析的寄存器間接尋址的實(shí)例的內(nèi)容了,。