技術(shù)文章
軟PLC指令系統(tǒng)設(shè)計
閱讀:82 發(fā)布時間:2020-8-123 .4軟PLC指令系統(tǒng)設(shè)計
梯形圖與指令表是開發(fā)PLC用戶程序使用多的兩種編程語言,雖然二者 指令的表達(dá)形式不同但表示內(nèi)容都是由操作碼和操作數(shù)組成。操作碼提供運(yùn)算的 法則,操作數(shù)提供執(zhí)行運(yùn)算所需的數(shù)據(jù)和地址信息。軟PLC指令是以函數(shù)的形 式提供操作碼和操作數(shù)。
軟PLC運(yùn)行系統(tǒng)為每條PLC指令編寫了相應(yīng)的指令函數(shù),它們共同組成了 軟PLC系統(tǒng)的指令庫。為了便于以后的擴(kuò)展和管理,本文在編制軟PLC指令時 制定了統(tǒng)一的格式。
PLC指令分為基本指令和功能指令兩類,前者用于對位進(jìn)行簡單的邏輯運(yùn) 算,是編制PLC程序使用的指令;后者主要對字節(jié)、字等復(fù)雜數(shù)據(jù)進(jìn)行處 理完成某種特定的功能。本文在參考標(biāo)準(zhǔn)IEC61131-3中梯形圖與指令表指 令的基礎(chǔ)上,依據(jù)SIMATIC S7-300指令系統(tǒng)設(shè)計軟PLC系統(tǒng)的指令函數(shù)。
本軟PLC系統(tǒng)共設(shè)計了 25個指令函數(shù),其中基本指令函數(shù)16個,功能指 令函數(shù)9個。表3-2、3-3分別對每個指令函數(shù)進(jìn)行了說明。
編號 |
PLC指令 |
指令函數(shù) |
實(shí)現(xiàn)功能 |
1001 |
LD |
ReadInBit〇 |
讀輸入位狀態(tài)壓入堆棧 |
1002 |
LDI |
ReadInBitnot〇 |
讀輸入位狀態(tài)取反壓入堆棧 |
1003 |
A |
ReadInANDBit() |
讀輸入位狀態(tài)與棧頂元素進(jìn)行邏輯“與”運(yùn)算,然 后壓入堆棧 |
1004 |
AI |
ReadInANDBitnot() |
讀輸入位狀態(tài)取反后與棧頂元素進(jìn)行邏輯“與”運(yùn) 算,然后壓入堆棧 |
1005 |
0 |
ReadInORBit() |
讀輸入位狀態(tài)與棧頂元素進(jìn)行邏輯“或”運(yùn)算,然 后壓入堆棧 |
1006 |
01 |
ReadInORBitnot() |
讀輸入位狀態(tài)取反后與棧頂元素進(jìn)行邏輯“或”運(yùn) 算,然后壓入堆棧 |
1007 |
OutBit |
WriteOutBit〇 |
將邏輯堆棧棧頂元素狀態(tài)寫到對應(yīng)輸出地址位 |
1008 |
NOT |
LogicNot〇 |
將邏輯堆棧棧頂元素狀態(tài)取反后壓入堆棧 |
1009 |
S |
SetBit〇 |
將對應(yīng)的輸入輸出位狀態(tài)置“1” |
1010 |
R |
ResetBit() |
將對應(yīng)的輸入輸出位狀態(tài)置“0” |
1011 |
CopyPush |
C〇py() |
將邏輯堆棧棧頂元素復(fù)制到第二個棧中 |
1012 |
Pop |
ReleasePop() |
釋放邏輯堆棧棧頂元素 |
1013 |
ANB |
AndStack〇 |
將兩個堆棧棧頂元素進(jìn)行邏輯“與”運(yùn)算 |
1014 |
ORB |
OrStack() |
將兩個堆棧棧頂元素進(jìn)行邏輯“或”運(yùn)算 |
1015 |
Copytofirst |
Copytofirst〇 |
將邏輯堆棧棧頂兩個元素進(jìn)行“與”運(yùn)算 |
1016 |
CLR |
ClearStackQ |
清空邏輯堆棧中的所有元素 |
|
編號 |
PLC指令 |
指令函數(shù) |
實(shí)現(xiàn)功能 |
1017 |
BAND |
LogicANDByte〇 |
將兩個字節(jié)的數(shù)值進(jìn)行邏輯“與”運(yùn)算 |
1018 |
WAND |
LogicANDWord() |
將兩個字的數(shù)值進(jìn)行邏輯“與”運(yùn)算 |
1019 |
BOR |
LogicORByte() |
將兩個字節(jié)的數(shù)值進(jìn)行邏輯“或”運(yùn)算 |
1020 |
WOR |
LogicORByte() |
將兩個字的數(shù)值進(jìn)行邏輯“或”運(yùn)算 |
1021 |
CompareByte |
ComparedByteLD(); ComparedByteAND〇 ; ComparedByteOR〇 ; |
將兩個字節(jié)的數(shù)值進(jìn)行比較 將比較結(jié)果壓入邏輯堆棧;
將比較結(jié)果與棧頂元素進(jìn)行邏輯“與”運(yùn)算; 將比較結(jié)果與棧頂元素進(jìn)行邏輯“或”運(yùn)算; 比較運(yùn)算符:==、>、<、>=、<=、!= |
1022 |
CompareWord |
C ompare dWor dLD (); ComparedWordAND〇 ; ComparedWordOR(); |
將兩個字的數(shù)值進(jìn)行比較 將比較結(jié)果壓入棧頂;
將比較結(jié)果與棧頂元素進(jìn)行邏輯“與”運(yùn)算; 將比較結(jié)果與棧頂元素進(jìn)行邏輯“或”運(yùn)算; 比較運(yùn)算符:==、>、<、>=、<=、!= |
1023 |
Move |
MoveByte(); Move Word(); MoveD Word〇 ; |
按字節(jié)賦值 按字賦值 按雙字賦值 |
1024 |
Timer |
TIMER |
定時功能:用于設(shè)定輸出信號的延遲時間, 當(dāng)延遲時間到達(dá)到所設(shè)定的值時能流通過 |
1025 |
Counter |
COUNTER |
計數(shù)功能:用于對脈沖信號進(jìn)行計數(shù),當(dāng)脈 沖數(shù)等于所設(shè)定值時能流通過 |
|
下面以基本指令函數(shù)ReadlnBitG和功能指令函數(shù)COUNTER為例,說明他 們的具體實(shí)現(xiàn):
(1) ReadInBit()
讀輸入位指的指令之一,當(dāng)軟PLC系統(tǒng)執(zhí)行LD指令時會調(diào)用 ReadInBit〇函數(shù)。首先它按照參數(shù)訪問I/O存儲區(qū)域,通過字節(jié)號查詢到該位軟 元件所在的單元地址,然后查找位號讀取該位當(dāng)前狀態(tài),將其壓入邏輯堆棧。具 體實(shí)現(xiàn)代碼如下:
ReadInBit(char Channel [no])
{bool bitno =false; //清 “0”
ReadBit(Channel[no], bitno); //讀取操作數(shù)(位)狀態(tài)
pb—stackarea ->push(bitno); //壓入邏輯堆棧
(2) COUNTER
西門子PLC計數(shù)器按計數(shù)方式的不同分為:加計數(shù)器、減計數(shù)器以及加/減 計數(shù)器。本文COUNTER采用遞減方式計數(shù),當(dāng)當(dāng)前值減為“0”時計數(shù)器完成 計數(shù)功能。梯形圖指令中的計數(shù)器如圖3.9所示。
軟PLC為COUNTER類分配了存儲區(qū)域m_counterAREA[]來保存計數(shù)器的 預(yù)設(shè)倌和狀杰信息。計數(shù)器執(zhí)行函數(shù)的運(yùn)行流稈如圖3.9所示。當(dāng)計數(shù)器的狀杰 位Curcondition[0]=FALSE (可計數(shù)狀態(tài))且Reset=0時,檢測到上升沿脈沖信號 輸入時,計數(shù)器的當(dāng)前值m_CurValue減1。當(dāng)m_CurValue= 0時計數(shù)標(biāo)志位置 “1”,完成計數(shù)。若Curcondition[0]=TRUE(不可計數(shù)狀態(tài)),則以預(yù)設(shè)值m_PV 初始化計數(shù)器,并使計數(shù)標(biāo)志位置“0”,未完成計數(shù)。
計數(shù)器功能的實(shí)現(xiàn)代碼如下:
{ int bitno =(C_No%8-l); //確定軟兀件所在位號 char flagC=0x01;
if(Curcondition[0]==TRUE) //判斷計數(shù)器的狀態(tài) {if(Lastcondition[l]== TRUE)
{ m_CurValue=m_PV; } //計數(shù)器值復(fù)位 flagC=!(0x01« bitno);
m_counterAREA[C_No/8]&=flagC;// 計數(shù)標(biāo)志位置 “0”
}
else //可計數(shù)狀態(tài)
{ if((m_CurValue!=0)&&(!Lastcondition[l])&&Curcondition[l]) {m_Cur Value--;}//有上升沿脈沖信號輸入計數(shù)值自減
if(m_CurValue==〇y/判斷計數(shù)器的當(dāng)前值
{
flagC=! (0x01« bitno);
m_counterAREA[C_N〇 /8]卜 flagC; //完成計數(shù)功能
}
else
{
flagC=!(0x01« bitno);
m_counterAREA[C_No/8]&= flagC;//未完成計數(shù)功能
}
}
}
(1)軟PLC指令尋址格式
軟PLC指令函數(shù)是通過尋址函數(shù)獲取操作數(shù)及其地址信息的。對于簡單數(shù) 據(jù)軟PLC運(yùn)行系統(tǒng)提供按位(bit)、字節(jié)(Byte)的尋址方式,對于復(fù)雜數(shù)據(jù)按 字(W)、雙字(DW)方式進(jìn)行尋址。尋址時首先數(shù)據(jù)存儲區(qū)域,接著存儲 的輸入、輸出標(biāo)識,后所在字、字節(jié)以及位地址。例如:尋址“LI4.3” 表示對應(yīng)I/O端子的數(shù)據(jù)存儲在本地通訊存儲區(qū)的輸入映像區(qū),其中“L”代表 數(shù)據(jù)的存儲區(qū)域,“I”代表存儲在輸入映像寄存區(qū),“4”代表數(shù)據(jù)所在字節(jié)編號, 表示取位操作符,“3”代表所取元素所在字節(jié)中的位號。
由于CPU —次至少能處理8位,所以對于按字節(jié)、字、雙字尋址,軟PLC
米用了頭部尋址加尾部尋址的統(tǒng)一尋址格式。編址格式見圖3.12。米用統(tǒng)一尋址 可避免因外部I/O采集裝置的改變而對用戶程序的接口函數(shù)進(jìn)行修改,通過尋址 能夠智能獲取數(shù)據(jù)。圖3.13給出了軟PLC按字節(jié)的尋址方式。
|
r \ | ||
區(qū)域標(biāo)識符 |
輸入輸出標(biāo)識符 |
尋址類型 |
字節(jié)編號 |
(L,R, T,A,P,C) |
(i,Q) |
(B,W,DW) |
15 0 |
參數(shù)信息:
L,R,T,A,P,C分別為PLC數(shù)據(jù)在內(nèi)存中的存儲區(qū)域
I-輸入映像區(qū)Q-輸出映像區(qū)
B-按字節(jié)尋址W-按字尋址DW-按雙字尋址
(2)軟PLC指令尋址函數(shù)實(shí)現(xiàn)
每種尋址方式都有對應(yīng)的尋址函數(shù),如:按位尋址函數(shù)ReadBitG、按字節(jié) 尋址函數(shù)ReadByte〇、按字尋址函數(shù)ReadWord(),它們共同完成向PLC指令函 數(shù)提供操作數(shù)的任務(wù)。按位尋址函數(shù)ReadBitG的部分實(shí)現(xiàn)代碼如下:
{ char * chr_point;
chr_point=strchr(address,將指針指向字符串中所在位號 switch(address[0]) //判斷軟邏輯存儲區(qū)域
{case 'L':
switch(address「ll) //判斷輸入還是輸出映像區(qū) { case T:
CurrentBitStatus(m SercosBuffer.m SercosToPLCBufFer.m ulSercosToPL
C[atoi(address+2)],atoi(chr_point+l),bitbool);
break;
case 'Q':
…}
CurrentBitStatus(unsigned char Channelno, int bitno,bool &bitstatus) //判斷當(dāng)前 輸入位狀態(tài)
{ char flagbit=0x01; flagbit «=bitno;
if((flagbit & Channelno) == flagbit)//判斷當(dāng)前位狀態(tài)是否為 “ 1 ” bitstatus =tme; else
bitstatus =false;
}
3. 5本章小結(jié)
本章通過分析軟PLC運(yùn)行系統(tǒng)的工作原理,劃分了軟PLC運(yùn)行系統(tǒng)的任務(wù) 組成,給出了各模塊的執(zhí)行流程圖以及部分實(shí)現(xiàn)代碼,結(jié)合直接方式和間接方式 調(diào)度的優(yōu)點(diǎn)實(shí)現(xiàn)了軟PLC系統(tǒng)多任務(wù)之間的調(diào)度,并對軟PLC存儲系統(tǒng)、指令 系統(tǒng)以及尋址方式進(jìn)行了設(shè)計,給出了典型的基本指令和功能指令的實(shí)現(xiàn)函數(shù), 基本上實(shí)現(xiàn)了軟PLC運(yùn)行系統(tǒng)的功能。
本文采摘自“五軸數(shù)控加工中心軟PLC控制系統(tǒng)的研究”,因?yàn)榫庉嬂щy導(dǎo)致有些函數(shù)、表格、圖片、內(nèi)容無法顯示,有需要者可以在網(wǎng)絡(luò)中查找相關(guān)文章!本文由伯特利數(shù)控整理發(fā)表文章均來自網(wǎng)絡(luò)僅供學(xué)習(xí)參考,轉(zhuǎn)載請注明!