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