下面的例程說明了在S7-200CPU之間設(shè)置一個簡單的Modbus通訊。
這個例子是關(guān)于Modbus功能碼6的(寫從站保持寄存器), 也可以作為其他所支持的功能碼:1, 2, 3, 4, 5, 15 和16 的基本參數(shù)設(shè)置步驟 。
要求:
要使用Modbus協(xié)議必須先在STEP 7 Micro/Win上安裝指令庫
Modbus主站協(xié)議只支持STEP 7 Micro/Win V4.0 SP5及其以上版本.。
- 1. 硬件設(shè)置
- 2. 參數(shù)匹配
- 3. 指令庫的存儲地址
- 4. 保持寄存器值得傳輸
1. 硬件設(shè)置
例程中的Modbus通訊是在兩個S7-200 CPU的0號通訊口間進(jìn)行的(最好每個CPU都有兩個通訊口)。在主站側(cè)也可以選擇相應(yīng)庫文件 "MBUS_CTRL_P1" 和 "MBUS_MSG_P1"通過1號通訊口通信。通訊口1與Micro/WIN建立PG或PC連接,兩個CPU的通訊口0通過PPI電纜進(jìn)行連接(電纜的針腳 連接為2,3,7,8)。

( 26 KB )
圖. 01
2. 參數(shù)匹配
對于MODBUS通訊, 主站側(cè)需要程序庫 "MBUS_CTRL" 和 "MBUS_MSG", 從站側(cè)需要程序庫 "MBUS_INIT" and "MBUS_SLAVE"。
在 Micro/WIN 中您需要為主站和從站新建一個項(xiàng)目,程序與參數(shù)設(shè)置見圖.02。
必須要保證主站與從站的“Baud”和"Parity"的參數(shù)設(shè)置要一致,并且程序塊"MBUS_MSG"中的"Slave"地址要與程序塊"MBUS_INIT"中的"Addr"所設(shè)置的一致 (見圖. 02)。
Micro/WIN“系統(tǒng)塊”中設(shè)置的0通訊口的波特率與MODBUS協(xié)議無關(guān)("Mode" = "1")。

( 40 KB )
圖. 02
下面的表格列出了程序塊各個參數(shù)選項(xiàng)及其意義
主站
MBUS_CTRL
| 參數(shù) | 意義 | 選項(xiàng) |
| EN | 使能 | |
| Mode | 協(xié)議選擇 | 0=PPI, 1=MODBUS |
| Baud | 傳輸速率 kbps | 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 |
| Parity | 校驗(yàn)選擇 | 0=無校驗(yàn), 1=奇校驗(yàn), 2=偶校驗(yàn) |
| Timeout | 從站的最長響應(yīng)時(shí)間 ms | |
| Done | “完成”標(biāo)志位 | |
| Error | 錯誤代碼 | 1) |
1) 參看STEP 7 Micro/WIN 幫助: "MODBUS主站執(zhí)行MBUS_MSG時(shí)的錯誤代碼MBUS_MSG" 。
MBUS_MSG
| 參數(shù) | 意義 | 選項(xiàng) |
| EN | 使能 | |
| First | 讀寫請求位 | |
| Slave | 從站地址 | |
| RW | "讀" 或 "寫" | 0=讀, 1=寫 |
| Addr | 讀寫從站的數(shù)據(jù)地址 | 0 .. 128 = 數(shù)字量輸出 Q0.0 .. Q15.7 1001 .. 10128 = 數(shù)字量輸入 I0.0 .. Q15.7 30001 .. 30092 = 模擬量輸入 AIW0 .. AIW62 40001 .. 49999 = 保持寄存器 2 |
| Count | 位或字的個數(shù) (0xxxx, 1xxxx) / words (3xxxx, 4xxxx) | |
| DataPtr | V存儲區(qū)起始地址指針 | |
| Done | '完成' 標(biāo)志位 | |
| Error | 錯誤代碼 | 1) |
1)參看STEP 7 Micro/WIN 幫助: "MODBUS主站執(zhí)行MBUS_MSG時(shí)的錯誤代碼MBUS_MSG" 。
從站
MBUS_INIT
| 參數(shù) | 意義 | 選項(xiàng) |
| EN | 使能 | |
| Mode | 協(xié)議選擇 | 0=PPI, 1=MODBUS |
| Addr | 從站地址 | |
| Baud | 傳輸速率 kbps | 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 |
| Parity | 校驗(yàn) | 0=無校驗(yàn), 1=奇校驗(yàn), 2=偶校驗(yàn) |
| Delay | 超時(shí)時(shí)間 ms | |
| MaxIQ | 可使用的數(shù)字輸入輸出點(diǎn)數(shù) | 2) |
| MaxAI | 可使用的模擬量輸入點(diǎn)數(shù) | 2) |
| MaxHold | 保持寄存器字的最大數(shù)量 | 2) |
| HoldStart | 保持寄存器的起始地址(40001) | |
| Done | 完成標(biāo)志位 | |
| Error | 錯誤代碼 | 3) |
2) 最大的地址取決于所用CPU的類型及其最大值。
3)參看STEP 7 Micro/WIN 幫助: “MODBUS從站協(xié)議的錯誤代碼”。
MBUS_SLAVE
| 參數(shù) | 意義 | 選項(xiàng) |
| EN | 使能 | |
| Done | 完成標(biāo)志位 | |
| Error | 錯誤代碼 | 3) |
3)參看STEP 7 Micro/WIN 幫助: “MODBUS從站協(xié)議的錯誤代碼” 。
3. 庫的存儲地址
項(xiàng)目完成后必須要在Micro/WIN中定義庫的存儲地址,當(dāng)定義完存儲區(qū)后, 要保證在任何情況下不能再被其它程序所使用 (主站側(cè): "DataPtr" + "Count" 從站側(cè): "HoldStart" + "MaxHold")。

( 137 KB )
圖. 03
4. 保持寄存器值的傳輸
將程序下載到相應(yīng)的CPU后,可以在狀態(tài)表中給主站側(cè)的V存儲區(qū)賦值,然后監(jiān)視從站的變化。
當(dāng)主站的I0.0使能后,VW2中的內(nèi)容就被發(fā)送到從站并寫入從站的VW2 。
保持寄存器值的傳輸見圖. 04。
指針"DataPtr" 代表了V區(qū)被讀的起始地址。
參數(shù) "Count" 表明了地址"Addr" = "4xxxx" (保持寄存器)以字為單位被讀的個數(shù)。
主站中被讀取的V存儲區(qū)被寫入地址為"Addr" = "40002" ("RW" = "1")的保持寄存器中。
保持寄存器是以字為單位工作的,它與從站的V區(qū)地址對應(yīng)。
指針 "HoldStart" 明確了與保持寄存器起始地址40001相對應(yīng)的V存儲區(qū)的初始地址。
可以這樣計(jì)算從站的V區(qū)目標(biāo)指針:
2 * (Addr - 40001) + HoldStart = 2 * (40002 - 40001) + &VB0 = &VB2
另外,要保證"MaxHold" 定義的數(shù)據(jù)區(qū)能夠包含主站側(cè)所要寫入的數(shù)據(jù)區(qū) :
MaxHold >= Addr - 40001 + Count = 40002 - 40001 + 1 = 2

( 38 KB )
Fig. 04










