Addressing for S7-300 and S7-400 Single - FAQ Edition (2010年-9月) |
摘 要 本文對S7-300, S7-400 PLC編程過程中,所涉及的尋址方式方法,做了簡單介紹及簡單示例。
關鍵詞 STEP7, 編程,尋址,間接尋址,S7-300, S7-400
Key Words STEP7, Programming, Addressing, Indirection addressing, S7-300,S7-400
目錄 S7-300和S7-400尋址 1.S7-300/400系統存儲區域 2. S7-300/400 PLC尋址方式 2.1直接尋址 2.1.1絕對地址: 2.1.2符號尋址: 2.2間接尋址 2.2.1存儲器間接尋址 2.2.2寄存器間接尋址 2.2.3 FB/FC的指針參數傳遞
1 S7-300/400系統存儲區域
S7 CPU的系統存儲區域分為下表中列出的地址區域。在程序中可以根據相應的地址直接讀取數據。
地址區域
| 可以訪問的地址單位
| S7符號
(IEC)
| 描述
| 過程映像輸入表
| 輸入(位)
| I
| 循環掃描周期開始時,CPU從輸入模板讀輸入值并記錄到該區域
| 輸入(字節)
| IB
| 輸入(字)
| IW
| 輸入(雙字)
| ID
| 過程映像輸出表
| 輸出(位)
| Q
| 在循環掃描周期中,程序計算輸出值并記錄到該區域。循環掃描周期結束時,CPU將計算結果寫入相應的輸出模板
| 輸出(字節)
| QB
| 輸出(字)
| QW
| 輸出(雙字)
| QD
| 位存儲器
| 存儲器(位)
| M
| 該區域用于存儲程序的中間計算結果
| 存儲器(字節)
| MB
| 存儲器(字)
| MW
| 存儲器(雙字)
| MD
| 定時器
| 定時器 (T)
| T
| 該區域提供定時器的存儲
| 計數器
| 計數器 (C)
| C
| 該區域提供計數器的存儲
| 數據塊
| 數據塊,用"OPN DB"打開
| DB
| 數據塊中包含了程序的信息。可以定義為所有邏輯塊共享 (shared DBs) 或指定給一個特定的 FB或 SFB 做背景數據塊(instance DB)。
| 數據位
| DBX
| 數據字節
| DBB
| 數據字
| DBW
| 數據雙字
| DBD
| 數據塊,用"OPN DI"打開
| DI
| 數據位
| DIX
| 數據字節
| DIB
| 數據字
| DIW
| 數據雙字
| DID
| 局部數據
| 局部數據位
| L
| 該區域包含塊執行時該塊的臨時數據。L堆棧還提供用于傳遞塊參數及記錄梯形邏輯網絡中間結果的存儲器
| 局部數據字節
| LB
| 局部數據字
| LW
| 局部數據雙字
| LD
| 外設地址 (I/O)
| 外設輸入字節
| PIB
| 主站及分布式從站(DP)外設輸入輸出區域允許直接存取
| 輸入
| 外設輸入字
| PIW
| 外設輸入雙字
| PID
| 外設地址 (I/O)
| 外設輸出字節
| PQB
| 輸出
| 外設輸出字
| PQW
| 外設輸出雙字
| PQD
|
2.S7-300/400 PLC尋址方式
2.1直接尋址
在STEP7程序中可以使用輸入輸出信號(I/O),位存儲區(M),計數器(C),計時器(T),數據塊(DB)以及功能塊(FB)等地址。你可以直接訪問這些絕對地址,但是如果給絕對地址以符號(助記符)程序將更易讀懂(例如Motor_A_On, 或者根據你的公司或者工程中的代碼使用別的標識符),而一個你的用戶程序中的地址也就可以用一個符號來訪問。
2.1.1絕對地址:
絕對地址由一個地址標識符和存儲器位置組成。
例如I 0.0,Q 1.7,PIW 256,PQW 512,MD 20,T 15,C 16,DB1.DBB 10,L1 0.0等。
2.1.2符號尋址:
如果給絕對地址分配符號可使程序易讀而簡化故障查找。
STEP7能自動翻譯符號名為要求的絕對地址。如果你準備用符號名訪問 數組,結構,數據塊,局部變量,邏輯塊及用戶自定義數據類型,那么你必須在此之前先分配符號名給絕對地址。
例如, 你可以分配符號名’Motor_On’給地址Q 4.0,然后在程序語句中使用符名’Motor_On’作為地址。
如需在程序中顯示DB里所定義的符號,可以給該DB塊定義一個符號。不能在符號表給DB塊中某地址單獨定義符號。
2.2間接尋址
間接尋址分為存儲器間接尋址和寄存器間接尋址,間接尋址的指針分為16位指針和32位指針,而32位指針又分為內部區域尋址與交叉區域尋址。
2.2.1存儲器間接尋址
►16位指針:16位地址指針用于定時器、計數器、程序塊(DB、FC、FB)的尋址,16位指針被看作一個無符號整數(0~65535),它表示定時器(T)、計數器(C)、數據塊(DB、DI)或程序塊(FB、FC)的號,16位指針的格式如下:
圖1
尋址格式表示為: 區域標識符 [ 16位地址指針 ]
例如使一個計數器向上計數表示為:
CU C [ MW ]
上述指令中,’C’為區域標識符,而’MW20’為一個16位指針。
16位指針存儲器間接尋址舉例:
//用于定時器
L 1
T MW0 //將1傳送到MW0
A I0.0 //如果I0.0 = True
L S5T#10S
SD T[MW0] //T1開始計時
// 上述指令可等同于:
A I0.0
L S5T#10S
SD T1
//用于打開DB塊
L 20
T LW20
OPN DB[LW20] //打開DB20
//程序調用
L 2
T LW20
UC FC[LW20] //調用FC2
L 41
T DBW30
UC FB[DBW30] //調用FB41
►32位指針:32位地址指針用于I、Q、M、L、數據塊等存儲器中位、字節、字及雙字的尋址,32位的地址指針可以使用一個雙字表示,第0位~第2位作為尋址操作的位地址,第3位~第18位作為尋址操作的字節地址,第19位~第31位沒有定義,32位指針的格式如下:

圖 2
存儲器32指針僅用于內部區域尋址。
尋址格式表示為: 地址存儲器標識符 [ 32位地址指針 ]
例如寫入一個M的雙字表示為:
T MD [ LD0 ]
‘MD’為區域標識符及訪問寬度,而LD0為一個32位指針。
32位內部區域指針可用常數表示, 表示為P# 字節.位 。如常數
P# 10.3
為指向第10個字節第3位的指針常數。
若把一個32位整型轉換為字節指針常數,從上述指針格式可以看出,應要把該數左移3位(或是乘8)即可。
如: L L#100 //Accu0裝入32位整形100
SLD 3 //左移3位
T LD0 //LD0得到P#100.0指針常數
32位存儲器間接尋址舉例:
//DB塊間接尋址舉例
OPN DB 1 //打開DB1。
OPN DI 3 //打開DB3,最多可以同時打開兩個DB塊。
L 4 //裝載4到累加器1中。
SLD 3 //累加器1中數值左移3位。
T MD 20 //將邏輯操作結果傳送到MD20中,MD20
//包含地址指針為P#4.0。
L P#20.0 //將地址指針P#20.0裝載到MD24中。
T MD 24
L 320 //320轉換指針為P#40.0并裝載到MD28中。
T MD 28
L DBW [MD 20] //裝載DB1.DBW4。
L DBW [MD 24] //裝載DB1.DBW20。
+I //相加
L DIW [MD 28] //裝載DB3.DBW40。
-I //相減。
T DIW 2 //將運算結果傳送到DB3.DBW2中。
JZ m1
//M存儲器連續區域操作
L 0 //初始化MW100和MD4。
T MW 100
T MD 4
OPN DB 1 //打開DB1。
L 100 //循環操作的次數,100次。
NEXT: T MW 100 //將循環100次裝載到MW100中,固定格式。 L MW 2 //進行比較的數值存儲于MW2。
L DBW [MD 4] //與DB塊中存儲的值進行比較,開始地址為DBW0。
==I //如果數值相等跳到m1。
JC m1
L MD 4 //將地址指針加2(每個相鄰的字地址相差2)。
L P#2.0
+D
T MD 4
L MW 100 //次數減1,跳回next,如果MW100等于0,跳
LOOP NEXT //出循環操作LOOP指令,LOOP指令固定格式。
m1: FP M 10.0 //如果數值相當,記錄MD4指針的數據,將轉換為數組
JCN m2 //的位置((地址值/P#2.0)+1)值存儲于MD8中。
L MD 4
L P#2.0
/D
+ L#1
T MD 8
m2: NOP 0
2.2.2寄存器間接尋址
通過CPU的地址寄存器AR1和AR2尋址方式稱為寄存器間接尋址,分為內部區域間接尋址和交叉區域尋址。使用寄存器間接尋址方式的程序語句包含以下部分:
指令,地址標識符,地址寄存器標識符,偏移量
AR1,AR2均為32位寄存器,寄存器間接尋址只使用32位指針。
與ARx相關的指令有:
LAR1, LAR2, TAR1, TAR2, +AR1, +AR2, LAR1 AR2, CAR等。
以上指令使用請參考手冊:開始 -> (所有)程序 -> SIMATIC -> Documentation -> English -> STEP 7 – Statement List for S7-300 and S7-400。
或點擊下載該手冊中文版
►內部區域寄存器間接尋址
指針格式與存儲器間接尋址的32位指針相同,第0位~第2位作為尋址操作的位地址,第3位~第18位作為尋址操作的字節地址,第19位~第31位沒有定義,32位指針的格式如下:

圖 3 間接尋址表示為:存儲器標識符 [ ARx, 地址偏移量 ]
如:
L MW [AR1, P#2.0]
‘MW’為被訪問的存儲器及訪問寬度,’AR1’為地址寄存器1,P#2.0為地址偏移量。
內部區域寄存尋址舉例:
//DB塊寄存器內部尋址
OPN DB 1 //打開DB1。
LAR1 P#10.0 //將指針P#10.0 裝載到地址寄存器1中。
L DBW [AR1, P#12.0] //將DBW22裝載到累加器1中。
LAR1 MD 20 //將存儲于MD20中的指針裝載到地址寄存器1中。
L DBW [AR1, P#0.0] //將DBW裝載到累加器1中,地址存儲于MD20中。
+I
LAR2 P#40.0 //將指針P#40.0 裝載到地址寄存器2中。
T DBW [AR2, P#0.0] //運算結果傳送到DBW40中。
//DI、DO區寄存器內部尋址
L P#8.7 //裝載指向第8字節第7位的指針值到累加器1
LAR1 //累加器1中的指針裝載到AR1
A I [AR1, P#0.0] //查詢I8.7的信號狀態
= Q [AR1, P#1.1] //給輸出位Q10.0賦值
►交叉區域寄存器間接尋址
包含有存儲器區域信息的指針,稱為交叉區域指針。
同樣,交叉區域指針為32位,寄存器間接尋址要使用地址寄存器AR1或AR2。
32位交叉區域指針,左起0~18位格式與32位內部區域指針相同,19~23位,27~30位未定義,31位為交叉區域指針標識位。
24~26位是存儲區域地址標識,8中組合表示8種存儲器區域:
000 表示沒有地址區,例如P#12.0;
001 表示輸入地址區I,例如P#I12.0;
010 表示輸出地址區Q,例如P#Q12.0;
011 表示標志位地址區M,例如P#M12.0;
100 表示數據塊(DB)中的數據,例如P#DB1.DBX12.0
101 表示數據塊(DI)中的數據,例如P#DI1.DIX12.0
110 表示區域地址區L,例如P#L12.0;
111 表示調用程序塊的區域地址區V,例如P#V12.0;
交叉區域指針格式如下:

圖 4
交叉區域指針常數表達為:P# 存儲器 字節 . 位
例如: P#Q10.5 //指向Q區第10字節第5位的指針常
P#DB1.DBX32.0 //指向DB1區域的第32字節第0位的指針常數
交叉區域尋址表示為: 訪問寬度 [ ARx, 偏移量 ]
例如: L W [ AR2, P#1.0 ]
‘W’為訪問寬度,AR2為地址寄存器2,P#1.0為偏移量。
交叉區域間接尋址舉例:
//M存儲區
L P#M20.0
LAR1
L 1234
T W [ AR1, P#2.0]
//I存儲區
L P#I0.0
LAR2
L W[ AR2, P#0.0 ]
T MW0
2.2.3 FB/FC的指針參數傳遞
在使用FB/FC形參傳遞指針參數時,16位、32位指針是可用的,但POINTER與ANY指針類型也是常見的類型,因為更方便。
►16指針用于參數傳遞
例如:
//編寫一個FC,作用是啟動條件滿足后延時3秒輸出閉合信號
//定義FC的形參如下:
圖 5 //程序如下:
L #Pointer16
T LW 0 //將16位指針裝入LW0
A #Start //Start參數 = True時
L S5T#3S //計時3秒
SD T [LW 0]
A T [LW 0] //計時器計時到
= #Motor //輸出Motor = True
*32指針用于參數傳遞
//編寫一個FC,作用是將輸入DB塊指定的區域 (實數) 求出平均值
//定義形參如下:
圖 6 //程序如下:
L #DB_No
T LW 0 //裝載DB塊號至LW0
OPN DB [LW 0] //并打開該DB塊
L #Data_1st
T LD 2 //裝載第一個要計算的實數的32指針至LD0
L 0
T LD 8 //將'和'初始為 0
L #Len //長度
NEXT: T LW 6 //實數的個數裝載至LW6, 并且進入一個LOOP循環
L DBD [LD 2] //讀取LD2指針位置的實數
L LD 8
+R //與'和'相加
T LD 8 //結果存到'和'中
L LD 2 //裝入指針
L P#4.0
+D //指針加4個字節
T LD 2 //結果仍存入LD2,此時LD2指針指向下一個實數
L LW 6 //循環計數
LOOP NEXT //LOOP循環的結束
L #Len //將實數個數由INT轉成REAL
ITD
DTR
T LD 12
L LD 8 //'和'除以實數格式的實數個數
TAK
/R
T #Average_out //得到平均值,通過Average_out輸出
►POINTER數據類型及參數傳遞
POINTER是一種用于傳遞指針的形參數據類型,長度為6個字節。用于向被調用的函數FC及函數塊FB傳遞復合數據類型(如ARRAY、STRUCT及DT等)的實參。在被調用的函數FC及函數塊FB內部可以間接訪問實參的存儲器。
格式如下:
圖 7 POINTER參數中,數據區含義如下:
16進制代碼
| 數據區
| 簡單描述
| B#16#81
| I
| 輸入區
| B#16#82
| Q
| 輸出區
| B#16#83
| M
| 標志位
| B#16#84
| DB
| 數據塊
| B#16#85
| DI
| 背景數據塊
| B#16#86
| L
| 區域數據區
| B#16#87
| V
| 上一級賦值的區域數據
|
表 1 若數據區為B#16#84,那么表示該POINTER指針是一個DB塊地址,DB塊號區域應當是所指向的DB塊號(INT類型)并且不為零。
(請參考ANY數據類型舉例)
►ANY數據類型及參數傳遞
ANY是一種用于傳遞指針的形參數據類型,可視為POINTER類型的擴展,較POINTER類型為復雜,長度為10個字節,增加的4字節,最高字節 (Byte 0) 固定為B#16#10,第二字節 (Byte 1) 為ANY指針所指向區域的數據類型,而接下來的2字節 (BYTE 3, 4) 組合為一個INT,為ANY指針所指定區域的長度,稱為重復系數 (Repetition factor) 。其余6字節作用與POINTER類型相同。
格式如下
圖 8
其中數據類型含義為:
數據類型代碼
| 十六進制代碼
| 數據類型
| 簡單描述
| B#16#00
| NIL
| 空
| B#16#01
| BOOL
| 位
| B#16#02
| BYTE
| 8位字節
| B#16#03
| CHAR
| 8位字符
| B#16#04
| WORD
| 16位字
| B#16#05
| INT
| 16位整形
| B#16#06
| DWORD
| 32位雙字
| B#16#07
| DINT
| 32位雙整形
| B#16#08
| REAL
| 32位浮點
| B#16#09
| DATE
| IEC日期
| B#16#0A
| TIME_OF_DAY(TOD)
| 24小時時間
| B#16#0B
| TIME
| IEC時間
| B#16#0C
| S5TIME
| SIMATIC時間
| B#16#0E
| DATE_AND_TIME(DT)
| 時鐘
| B#16#13
| STRING
| 字符串
| B#16#17
| BLOCK_FB
| FB號
| B#16#18
| BLOCK_FC
| FC號
| B#16#19
| BLOCK_DB
| DB號
| B#16#1A
| BLOCK_SDB
| SDB號
| B#16#1C
| COUNTER
| 計數器
| B#16#1D
| TIMER
| 定時器
|
表 2
編程舉例:
//冒泡排序程序,算法原理請參考相關資料
//此例程僅提供存于DB塊中的INT類型數據排序
//結果為INT數據由小到大排列,保存于原DB塊中
//FC3塊,形參定義如下:
圖 9
//輸入參數Data(Any類型);輸出參數Error(INT類型)
//若輸出參數Error不為0, 則說明排序未進行,
//Error = 1, Data(ANY類型)輸入指針無效
//Error = 2, Data(ANY類型)輸入指針地址非DB地址
//Error = 3, Data(ANY類型)輸入指針指定區域類型非INT類型
SET
SAVE
L 0
T #Error
//將輸入ANY指針'Data_In'復制到LB0~LB9
L P##Data
LAR1
L D [AR1,P#0.0]
T LD 0
L D [AR1,P#4.0]
T LD 4
L W [AR1,P#8.0]
T LW 8
//ANY指針BYTE0是B#16#10
L LB 0
L B#16#10
==I
JCN ERR1
//輸入數據區是否為DB塊
L LB 6
L B#16#84
==I
JCN ERR2
//類型為INT
L LB 1
L B#16#5
==I
JCN ERR3
//打開輸入DB塊
OPN DB [LW 4]
//數據起始地址去掉數據區標識部分
L LD 6
L DW#16#FFFFFF
AD
T LD 10
//計算最后一個存儲單元指針保存至LD10
L LW 2
L 2
*I
T LD 14
L L#2
-D
SLD 3
L LD 10
+D
T LD 10
//外循環計數LW20,循環次數為(數據個數-1)次
L LW 2
L 1
-I
NXT2: T LW 20
L LD 10
LAR1
L LW 20
//嵌套循環計數LW18,循環次數為(LW20)次
NXT1: T LW 18
TAR1
L P#2.0
-D
LAR1
//后一單元數據小于前一單元數據?
L DBW [AR1,P#2.0]
L DBW [AR1,P#0.0]
<I
JCN L1
//否,交換2單元數據
L DBW [AR1,P#2.0]
L DBW [AR1,P#0.0]
T DBW [AR1,P#2.0]
POP
T DBW [AR1,P#0.0]
L1: L LW 18
LOOP NXT1
L LW 20
LOOP NXT2
JU EXIT
//錯誤碼1,ANY指針有錯
ERR1: L 1
T #Error
JU EXIT
//錯誤碼2,輸入數據區不是DB塊
ERR2: L 2
T #Error
JU EXIT
//錯誤碼3,輸入數據類型不是INT
ERR3: L 3
T #Error
EXIT: SET
SAVE
在OB1程序中調用舉例:
A M 0.0
FP M 0.1
JCN EXIT
CALL FC 3 //FC3為上述排序程序
Data :=P#DB3.DBX 0.0 INT 64 //參數Data, DB3中64個INT排序
Error :=MW2
EXIT: NOP 0
如果您對該文檔有任何建議,請將您的寶貴建議提交至下載中心留言板。
該文檔的文檔編號:F0215
附錄-推薦網址
自動化系統
西門子(中國)有限公司
工業自動化與驅動技術集團 客戶服務與支持中心
自動化系統 下載中心:http://www.ad.siemens.com.cn/dow ... Id=0&CatFirst=1
自動化系統 全球技術資源:http://support.automation.siemens.com/CN/view/zh/10805045/130000
“找答案”自動化系統版區:http://www.ad.siemens.com.cn/service/answer/category.asp?cid=1027
注意事項
應用示例與所示電路、設備及任何可能結果沒有必然聯系,并不完全相關。應用示例不表示客戶的具體解決方案。它們僅對典型應用提供支持。用戶負責確保所述產品的正確使用。這些應用示例不能免除用戶在確保安全、專業使用、安裝、操作和維護設備方面的責任。當使用這些應用示例時,應意識到西門子不對在所述責任條款范圍之外的任何損壞/索賠承擔責任。我們保留隨時修改這些應用示例的權利,恕不另行通知。如果這些應用示例與其它西門子出版物(例如,目錄)給出的建議不同,則以其它文檔的內容為準。
聲明
我們已核對過本手冊的內容與所描述的硬件和軟件相符。由于差錯難以完全避免,我們不能保證完全一致。我們會經常對手冊中的數據進行檢查,并在后續的版本中進行必要的更正。歡迎您提出寶貴意見。
版權© 西門子(中國)有限公司2001-2008 版權保留 復制、傳播或者使用該文件或文件內容必須經過權利人書面明確同意。侵權者將承擔權利人的全部損失。權利人保留一切權利,包括復制、發行,以及改編、匯編的權利。
西門子(中國)有限公司
|