產品簡介
西門子(SIEMENS)公司的PLC產品包括LOGO、S7-200、S7-1200、S7-300、S7-400、S7-1500等。 西門子S7系列PLC體積小、速度快、標準化,具有網絡通信能力,功能更強,可靠性高。S7系列PLC產品可分為微型PLC(如S7-200),小規模性能要求的PLC(如S7-300)和中、高性能要求的PLC(如S7-400)等。
詳細介紹
合肥西門子模塊代理商
合肥西門子模塊代理商
ANY 10 B 當實參的數據類型未知時,可以使用該類型
1) 定時器或計數器參數類型
在功能塊中定義一個定時器或計數器類型的形參,功能塊就能使用一個定時器或計數器,而不需明確具體的定時器或計數器,等到調用該功能塊時再確定定時器或計數器號。這使用戶程序能靈活性地分配和使用定時器或計數器。當給定時器或計數器參數類型形參分配實參時,在“T”或“C”后跟一個有效整數,如T 100。
2) 塊參數類型
當定義一個作為輸入輸出的塊時,參數聲明決定了塊的類型(FB、FC、DB等)。當為塊參數類型形參分配實參時,可以使用物理地址,如FC 101,也可使用符號地址,如“valve
3) 指針參數類型
一個指針給出的是變量的地址,而不是變量的數值大小。在有些功能塊中,可能使用指針編程更為方便。用定義指針類型的形參,就能在功能塊中先使用一個虛設的指針,待調用功能塊時再為其賦予確定的地址。當為指針參數類型形參分配實參時,需要指明內存地址,例如P#M50.0。
3. 塊調用過程及內存分配
CPU提供塊堆棧(B堆棧)來存儲與處理被中斷塊的有關信息。當發生塊調用或有來自更高優先級的中斷時,就有相關的塊信息存儲在B堆棧里,并影響部分內存和寄存器。圖5.2顯示了調用塊時B堆棧與L堆棧的變化。圖5.3提供了關于STEP 7的塊調用情況。
1) B堆棧與L堆棧
B堆棧是CPU系統內存中的一部分,它存儲以下被中斷塊的數據:
(1) 塊號、塊類型、優先級、被中斷塊的返回地址;
(2) 塊寄存器DB、DI被中斷前的內容;
(3) 臨時變量的指針(被中斷塊的L堆棧地址)。
STEP 7中可使用的B堆棧大小是有限制的,對于S7-300 CPU,則可在B堆棧中存儲8個塊的信息。因此,塊調用嵌套深度也是有限制的,多可同時激活8個塊。
L堆棧是CPU內存中的一部分,它在塊調用時被重新分配。L堆棧用來存儲邏輯塊中定義的臨時變量,也分配給臨時本地數據使用。梯形圖的方塊指令與標準功能塊也可能使用L堆棧存儲運算的中間結果。
2) 調用功能塊FB
當調用功能塊FB時,會有以下事件發生:
(1) 調用塊的地址和返回位置存儲在塊堆棧中,調用塊的臨時變量壓入L堆棧;
(2) 數據塊DB寄存器內容與DI寄存器內容交換;
(3) 新的數據塊地址裝入DI寄存器;
(4) 被調用塊的實參裝入DB和L堆棧上部;
(5) 當功能塊FB結束時,先前塊的現場信息從塊堆棧中彈出,臨時變量彈出L堆棧;
(6) DB和DI寄存器內容交換。
當調用功能塊FB時,STEP 7并不一定要求給FB形參賦予實參,除非參數是復式數據類型的IO形參或參數類型形參。如果沒有給FB形參賦予實參,則功能塊FB就調用背景數據塊內的數值。該數值是在功能塊的變量聲明表內或背景數據塊內設置的形參初始數值。
3) 調用功能塊FC
當調用功能塊FC時會有以下事件發生:
(1) 功能塊FC實參的指針存到調用塊的L堆棧;
(2) 調用塊的地址和返回位置存儲在塊堆棧,調用塊的局部數據壓入L堆棧;
(3) 功能塊存儲臨時變量的L堆棧區被推入L堆棧上部;
(4) 當被調用功能塊FC結束時,先前塊的信息存儲在塊堆棧中,臨時變量彈出L堆棧。
因為功能塊FC不用背景數據塊,不能分配初始數值給功能塊FC的局部數據,所以必須給功能塊FC提供實參。
STEP 7為功能塊FC提供了一個特殊的返回值輸出參數(關鍵字:RET_VAL)。當在文本文件中創建功能塊FC時,你可以在定義功能塊FC命令后輸入數據類型(如BOOL或INT)。對文本文件進行編譯時,STEP 7會自動生成RET_VAL輸出參數。當用STEP 7的程序編輯器(Program Editor)以增量模式創建功能塊FC時,可在FC的變量聲明表中聲明一個輸出參數RET_VAL,并指明其數據類型。
功能塊編程與調用舉例
對功能塊編程分兩步進行:*步是定義局部變量(填寫局部變量表);第二步是編寫要執行的程序,可以用梯形圖或語句表兩種形式編程,并在編程過程中使用定義了的局部變量(數據)。
定義局部變量的工作內容包括:
(1) 分別定義形參、靜態變量和臨時變量(FC塊中不包括靜態變量);
(2) 確定各變量的聲明類型(Decl.)、變量名(Name)和數據類型(Data Type),還要為變量設置初始值(Initial Value)(盡管對有些變量初始值不一定有意義)。如果需要還可為變量注釋(Comment)。在增量編程模式下,STEP 7將自動產生局部變量地址(Address)。
寫功能塊程序時,可以用以下兩種方式使用局部變量:
(1) 使用變量名,此時變量名前加前綴“#”,以區別于在符號表中定義的符號地址。增量方式下,前綴會自動產生。
(2) 直接使用局部變量的地址,這種方式只對背景數據塊和L堆棧有效。
在調用FB塊時,要說明其背景數據塊。背景數據塊應在調用前生成,其順序格式與變量聲明表必須保持*。在增量方式下,調用FB塊時,STEP 7會自動提醒并生成背景數據塊。此時也為背景數據塊設置了初始值,該初始值與變量聲明表中的相同。當然也可以為背景數據塊設置當前值(Current Value),即存儲在CPU中的數值。
1.二分頻器
假設功能塊FC10是二分頻器產生程序,功能是對不同的輸入位進行二分頻處理。以下給出了FC10的變量聲明表和語句表程序。在程序中使用了跳變沿檢測指令。
1) FC10的變量聲明表(見表5.3)
Address Decl. Symbol Data Type Initial Value Comment
0.0 In INP BOOL FALSE 脈沖輸入信號
1.0 Out OUTP BOOL FALSE 脈沖輸出信號
2.0 In_Out ETF BOOL FALSE 跳變沿標志
2) 語句表程序
Network 1
A #INP 對脈沖輸入信號產生RLO
FP #ETF 對前面的RLO進行跳變沿檢測,若有正跳沿則RLO=1,否則RLO=0
NOT 取反RLO
BEC 若RLO=1(沒有正跳沿),結束塊;若RLO=0(有正跳沿),繼續執行下一條指令
AN #OUTP
= #OUTP 輸出信號反轉
BEU 無條件結束塊
在功能塊FCl0中定義了三個形參,程序中以引用變量名方式使用了形參變量。也可以為FC10在符號表中定義一個符號名,如“BINARY”,并選用以下兩種方式之一調用功能塊FC10。調用時為形參分別賦予實參I0.0、Q4.0和M10.0,以對輸入位I0.0進行二分頻以產生輸出脈沖Q4.0。
調用方式1 調用方式2
CALL FC10 CALL BINARY
INP:= I0.0 INP:= I0.0
OUTP:= Q4.0 OUTP:= Q4.0
ETF:= M10.0 ETF:= M10.0
2.讀模擬輸入量程序
一些S7-300的應用系統中,使用8通道模擬量模塊采集信號,當模塊數量較多時,讀模擬輸入量就很繁瑣。下面給出一個通用程序FC100,利用它可以方便地把模擬量讀回并順序存入數據塊,因為模入模塊的起始地址、通道數、存儲數據塊號及數據在數據塊中的存儲起始位置均是可變的,所以可在調用FC100時靈活確定。
Address Decl. Symbol Data Type Initial Value Comment
0.0 In PIW_Addr INT
模入模塊通道起始地址
2.0 In CH_LEN INT
要讀入的通道數
4.0 In DB_No INT
存儲數據塊號
6.0 In DBW_Addr INT
存儲在數據塊中的字地址
Network 1
L #DB_No
T LW0
OPN DB[LW 0] 打開存儲數據塊
L #PIW_Addr
SLD 3 形成模入模塊地址指針
T LD4 在臨時本地數據雙字LD 4中存儲模入模塊地址指針
L #DBW_Addr
SLD 3 形成數據塊存儲地址指針
T LD8 在臨時本地數據雙字LD 8中存入數據塊存儲地址指針
L #CH_LEN 以要讀入的通道數為循環次數,裝入累加器1
2.讀模擬輸入量程序
一些S7-300的應用系統中,使用8通道模擬量模塊采集信號,當模塊數量較多時,讀模擬輸入量就很繁瑣。下面給出一個通用程序FC100,利用它可以方便地把模擬量讀回并順序存入數據塊,因為模入模塊的起始地址、通道數、存儲數據塊號及數據在數據塊中的存儲起始位置均是可變的,所以可在調用FC100時靈活確定。
Address Decl. Symbol Data Type Initial Value Comment
0.0 In PIW_Addr INT
模入模塊通道起始地址
2.0 In CH_LEN INT
要讀入的通道數
4.0 In DB_No INT
存儲數據塊號
6.0 In DBW_Addr INT
存儲在數據塊中的字地址
Network 1
L #DB_No
T LW0
OPN DB[LW 0] 打開存儲數據塊
L #PIW_Addr
SLD 3 形成模入模塊地址指針
T LD4 在臨時本地數據雙字LD 4中存儲模入模塊地址指針
L #DBW_Addr
SLD 3 形成數據塊存儲地址指針
T LD8 在臨時本地數據雙字LD 8中存入數據塊存儲地址指針
L #CH_LEN 以要讀入的通道數為循環次數,裝入累加器1
NEXT:T LW 0
將累加器1的值,裝入循環次數計數器LW0(臨時本地數據字)
L LD4
LARl 將模入模塊地址指針裝入地址寄存器1
L PIW[ARl,P#0.0] 讀模入模塊裝入累加器1
T LW2 將累加器1的內容暫存入緩沖器LW2
L LD8
LARl 將數據塊存儲地址指針裝入地址寄存器1
L LW2 將數據緩沖器中的內容裝入累加器1
T DBW[ARl,P#0.0] 將累加器的內容存入數據塊中
L LD4 AR1+P#2.0→AR1
+ L#16 ACC1+(.._0001_0 000)
T LD4 調整模入模塊地址指針,指向下一通道Acc1+(bb bbbb bxxx)
L LD8
+ L#16
T LD8 調整數據塊存儲地址指針,指向下一存儲地址
L LW0 將循環次數計數器LW0的值裝入累加器1
LOOP NEXT 若累加器1的值不為0,將累加器減1繼續循環;若累加
器為0,則結束
在FC100中,寄存器間接尋址指令OP NDB[LW0]使用了臨時本地數據LW0,變量表中定義的臨時變量雖然也在L堆棧中,但不能用于存儲器間接尋址,從這里也可看出臨時本地數據與臨時變量的區別。程序中LW2、LD4和LD8起的作用也可用臨時變量替代。
下面舉例說明如何使用FC100。在某應用中,機架0的4號槽位安裝了一個8模入模塊(地址256開始),若要將前6個模入模塊信號讀回,存入DB50.DBW10開始的6個字單元中,可按下列形式調用FC100:
CALL FC100
PIW_Add:= 256
CH_LEN:= 6
DB_No:= 50
DBW_Addr:= 10
數據塊
數據塊定義在S7 CPU存儲器中,用戶可在存儲器中建立一個或多個數據塊。每個數據塊可大可小,但CPU對數據塊數量及數據總量有限制,如對于CPU314,用作數據塊的存儲器多為8 KB(8192 B),用戶定義的數據總量不能超出這個限制。對數據塊必須遵循先定義后使用的原則,否則,將造成系統錯誤。
1. 定義數據塊
在編程階段和運行程序中都能定義數據塊。大多數數據塊是在編程階段用STEP 7開發軟件包定義的,定義內容包括數據塊號及塊中的變量(包括變量符號名、數據類型以及初始值等),定義完成后,數據塊中變量的順序及類型決定了數據塊的數據結構,變量的數量決定了數據塊的大小。數據塊在使用前,必須作為用戶程序的一部分下載到CPU中。
如果確實需要,還可以在程序運行中動態定義一個數據塊。動態定義時,數據塊號是自動產生的,數據塊在存儲器中的位置是動態分配的。由于要定義的數據塊有可能大于CPU存儲器(用于數據塊的部分)的剩余空間,因此動態定義過程有可能失敗
2.訪問數據塊
在用戶程序中可能定義了許多數據塊,而每個數據塊中又有許多不同類型的數據,因此,訪問時需要明確數據塊號和數據塊中的數據類型與位置。根據明確數據塊號的不同方法,可以用多種方法訪問數據塊中的數據。