MCGS入門筆記3-與S7200(master)Modbus-Rtu通訊
本文介紹通過485串口連接MCGS與S7200進行Modbus-Rtu通訊,MCGS為從站,S7200為主站。
S7200這個老古董,就是活在口中的東西,要不是項目需要,真的想不到還會用到這個,
組態軟件Micro/WIN也是年代久遠,所以寫了另一篇文章,S7200入門筆記。
Modbus通訊協議是工業全球流行的通訊的協議了,相比大家都熟悉,不熟悉的建議先了解下,有助於項目實現,如果我發布了我自己寫的modbus的草稿,你能在博客頁面找到這篇文章。
前面兩篇文章鏈接:
MCGS入門筆記2-與S7300以太網通訊 - 夜owl - 博客園 (cnblogs.com)
-
組態MCGS
這一部分跟上篇文章方法類似,這里省略的地方可能在前面能找到
1.1組態通訊驅動
添加串口,主要設置端口號,這里的端口號跟MCGS的端口號一致對應
添加設備,從站要選擇
modbus串口數據轉發設備,
設置從站地址和添加通訊變量
分別添加I0.0-I0.7、Q0.0-Q0.7、WORD40001-WORD40008變量
(下圖對應的是前篇文章S7300的圖,僅供參考)
1.2畫面組態
添加按鈕,用於改變變量
按下圖操作,圖比較亂。
按鈕設置數據對象為取反可能更容易調試。
添加矩形顯示,用於顯示變量變化,相當於LED
添加滑動塊,用於改變多位整數,40001滑條設置0-65535對應的是16位無符號字變量。
40002設置為0-255對應低字節。
畫面顯示效果如圖。
二、組態S7-200
2.1組態軟件和硬件
S7200PLC組態軟件是STEP7_MicroWin32。
組態軟件因為年代久遠,並不友好,所以不好上手,很多注意的地方,比如通訊下載不支持以太網,另外Modbus通訊需要安裝指令庫,這部分教程可以看另一篇文章,S7200入門筆記
硬件是
CPU 224XP CN REL 02.01
2.2測試程序編程
關於程序編程,西門子官方出了比較完整的教程,強烈推薦,里面還有例程
https://www.ad.siemens.com.cn/service/article/wap/S7-200/S7-200modbus/Default.aspx
Modbus RTU 主站功能編程
1. 調用 Modbus RTU 主站初始化和控制子程序
使用 SM0.0 調用 MBUS_CTRL 完成主站的初始化,並啟動其功能控制:
2. 調用 Modbus RTU 主站讀寫子程序MBUS_MSG,發送一個Modbus 請求
我這里用的是v1.0的modbus舊版本庫指令,與官方有一點不同,官方的v1.2如下圖
v1.2指令官方說明比較清楚
a. |
EN |
使能: |
同一時刻只能有一個讀寫功能(即 MBUS_MSG)使能 |
|
|
||
b. |
First |
讀寫請求位: |
每一個新的讀寫請求必須使用脈沖觸發 |
c. |
Slave |
從站地址: |
可選擇的范圍 1 - 247 |
d. |
RW |
從站地址: |
0 =讀, 1 =寫 |
|
|
||
1. 開關量輸出和保持寄存器支持讀和寫功能 |
|||
2. 開關量輸入和模擬量輸入只支持讀功能 |
|||
e. |
Addr |
讀寫從站的數據地址: |
|
|
選擇讀寫的數據類型 |
||
|
00001 至 0xxxx - 開關量輸出 |
||
|
10001 至 1xxxx - 開關量輸入 |
||
30001 至 3xxxx - 模擬量輸入 |
|||
40001 至 4xxxx - 保持寄存器 |
|||
f. |
Count |
數據個數 |
通訊的數據個數(位或字的個數) |
|
|
||
g. |
DataPtr |
數據指針: |
1. 如果是讀指令,讀回的數據放到這個數據區中 |
|
2. 如果是寫指令,要寫出的數據放到這個數據區中 |
||
h. |
Done |
完成位 |
讀寫功能完成位 |
i. |
Error |
錯誤代碼 |
|
對比下v1.0版本指令庫
解釋下主要區別
v1.0的bFoucti~是功能碼,不同Modbus的功能碼對應不同,上圖v1.0的15功能碼就是寫入多個輸出,地址和功能碼參考下表
表 1.功能
Modbus 地址 |
讀/寫 |
Modbus 從站須支持的功能 |
00001 - 09999 |
讀 |
功能 1 |
寫 |
功能 5:寫單輸出點 |
|
10001 - 19999 |
讀 |
功能 2 |
寫 |
- |
|
30001 - 39999 |
讀 |
功能 4 |
寫 |
- |
|
40001 - 49999 |
讀 |
功能 3 |
寫 |
功能 6:寫單寄存器單元 |
以下參考博途幫助文件
Modbus 功能代碼 |
用於讀取從站(服務器)數據的功能 - 標准尋址 |
01 |
讀取輸出位: 每個請求 1 至 2000/19921) 位 |
02 |
讀取輸入位: 每個請求 1 至 2000/19921) 位 |
03 |
讀取保持寄存器: 每個請求 1 至 125/1241) 字 |
04 |
讀取輸入字: 每個請求 1 至 125/1241) 字 |
1) 用於擴展尋址 |
用於寫入數據的功能: 更改分布式 I/O 和程序數據
Modbus 功能代碼 |
用於向從站(服務器)寫入數據的功能 - 標准尋址 |
05 |
寫入一個輸出位: 每個請求 1 位 |
06 |
寫入一個保持寄存器: 每個請求 1 個字 |
15 |
寫入一個或多個輸出位:每個請求 1 至 1960 位 |
16 |
寫入一個或多個保持寄存器:每個請求 1 至 122 個字 |
v1.2版本使用讀寫+地址+個數的方式代替功能碼,比如 寫入+地址為0+位數為1相當於功能嗎05
3. 輪詢各個指令可以訪問不同的從站
在地址為1的從站請求發送完成后,置位M3.2,觸發地址為2的從站發送請求。
上圖的功能碼是3,是讀取地址為1從站的保持寄存器數值,地址為0,也就是起始地址為40001,讀取40001-40008的8個字保存在Vw130-Vw146
讀取40002的數值,取低字節,拷貝到VB100和QB0.
VB100用於再次寫入MCGS的輸出狀態變量,也就是上面M3.1觸發的請求
QB0會同步PLC的輸出狀態顯示。
關於modbus地址和S7-200 存儲區地址
三.硬件連接
MCGS串口引腳定義,這里選擇的是COM2
西門子串口引腳定義,這里是CM1241的手冊圖,S7200的也適用
如上圖所示引腳3接7,8接8
四.測試效果
下載MCGS組態到觸摸屏
下載程序到PLC,並且監控變量表,
拖動40001,40002的滑條,VW130,VW132同步
拖動40003的滑條,VW134同步,並且,QB0取低字節VB135的數值,如上圖所示,VB135=255時,輸出位全亮,另外觸摸屏上的輸出狀態也同步VB100。
五.常見問題
1.放置該指令需要創建一個或多個POU
如果需要添加V1.2的指令庫,,添加指令會報錯,因為庫的名字重復了,需要刪除原來舊版本的庫
2. 此POU包含一個或多個對參數化子程序無效的調用
庫刪除了,程序塊(POU)里面的指令沒有刪除會報錯
3.庫數據區問題-通訊變量個別字出現問題,通訊時間長,通訊功能錯誤,編譯報錯
檢查庫地址分配有沒有重疊,這部分沒有設置好,會很麻煩
參考西門子教程3.1
3.1分配庫指令數據區
調用STEP 7 - Mciro/WIN32 V3.2 Instruction Library(指令庫)需要分配庫指令數據區(Library Memory)。庫指令數據區是相應庫的子程序和中斷程序所要用到的變量存儲空間。
如果在編程時不分配庫指令數據區,編譯時會產生許多相同的錯誤(錯誤18)。
操作步驟(以Modbus RTU庫指令為例):
1,在指令樹的Project(項目)中,以鼠標右鍵單擊Program Block(程序塊),在彈出的快捷菜單中選擇Library Memory。如圖1所示:
圖1
2,在彈出的選項卡中設置庫指令數據區,如圖2所示:
圖2.缺省情況下是從VB0開始,但因為與Modbus的保持寄存區沖突,所以手動改為VB2000。按"Suggest Address"按鈕也可以自動分配。
可以使用Suggest Address(推薦地址)設置數據區,但要注意編程軟件設置的數據區地址,只考慮到了其他一般尋址,而未考慮到諸如Modbus數據保持寄存器區等的設置。應當確保不與其他任何已使用的數據區重疊、沖突。不應重復按Suggest Address按鈕,否則也會造成混亂。
在STEP 7-Micro/WIN32 V3.1中,有分配庫指令數據區時有不同的操作方法,需要在Symbol Table(符號表)中設置一個首地址。我們強烈建議使用當時最新的編程版本。