《西門子S7_200 MODBUS通信協(xié)議和支持MODBUS RTU協(xié)議的電》由會員分享,可在線閱讀,更多相關(guān)《西門子S7_200 MODBUS通信協(xié)議和支持MODBUS RTU協(xié)議的電(12頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、西門子S7_200 MODBUS通信協(xié)議和支持MODBUS RTU協(xié)議的電磁流量計(jì)、超聲波流量計(jì)的通信實(shí)例
S7_200系列PLC有一個通信口的也有兩個通信口的,這兩個口都支持MODBUS通信協(xié)議,不過要添加MODBUS庫文件(SP6版本的step7 micro/win 軟件自帶有MODBUS庫文件)。下面根據(jù)具體的項(xiàng)目來說明MODBUS的使用:
在項(xiàng)目中要采集進(jìn)水流量的瞬時流量、日累計(jì)、月累計(jì)、年累計(jì)量,流量計(jì)本身有4~20mA信號輸出和脈沖信號輸出,這些輸出信號都是瞬時量,只能轉(zhuǎn)換為瞬時流量,而累積量就要通過編寫程序來累加,而且信號的傳輸衰減和計(jì)算過程產(chǎn)生的誤差就會造成和實(shí)際的流
2、量相差很多,現(xiàn)在很多的流量計(jì)(包括其他的測量設(shè)備)都設(shè)計(jì)有通訊口,尤其是支持MODBUS協(xié)議,所以首選通信方式采集數(shù)據(jù),這樣可以直接讀取我們想要的數(shù)據(jù),只需做稍微的數(shù)據(jù)轉(zhuǎn)換就可以的,同時也減小了工作量提高準(zhǔn)確性(實(shí)際是按照流量收取費(fèi)用的)。
實(shí)際的硬件連接:10套s7-200組成PPI網(wǎng)絡(luò)(其中一個200站做主站),有一個從站要采集兩個不同廠家的流量計(jì)的相關(guān)信息。PPI網(wǎng)絡(luò)層已經(jīng)用去了一個端口0,還剩下一個端口1,那么就用這個端口并設(shè)置為自由口協(xié)議,在程序中調(diào)用MODBUS程序塊并填寫好必要的信息就可以了(其實(shí)調(diào)用MODBUS程序塊時,程序塊內(nèi)就已經(jīng)設(shè)置好端口為自由口協(xié)議了)。
圖
3、1.MODBUS庫文件
圖2.控制指令
圖3.控制指令
這里MBUS_CTRL_P1指令要一直調(diào)用,有一點(diǎn)要指明:圖2中的程序是讀取其中一臺流量計(jì)的,圖3是讀取另一臺流量計(jì)的,這兩個流量計(jì)是不一樣的。這里最重要的是MBUS_MSG_P1指令中地址“Addr”的填寫,其實(shí)這里要填寫Modbus從站的寄存器地址(該地址內(nèi)有我們需要的信息),那么這個地址要怎么填寫呢,填寫多少呢?這就要查看從站設(shè)備(這里是流量計(jì))的“通信手冊”了,因?yàn)槊總€廠家的設(shè)備都不一樣,所以相同信息的寄存器地址也不一樣。下面是流量計(jì)廠家要的通訊手冊上的信息:
RTU消息幀基本定義
0
1
2
3
4
4、
5
6
7
設(shè)備地址
功能編碼
地址1
地址0
數(shù)據(jù)1
數(shù)據(jù)0
CRC
CRC
8位字節(jié)
8位字節(jié)
8位字節(jié)
8位字節(jié)
8位字節(jié)
8位字節(jié)
8位字節(jié)
8位字節(jié)
一、 參數(shù)讀出命令
1、 主機(jī)命令格式
0
1
2
3
4
5
6
7
設(shè)備地址
功能代碼
地址1
地址0
數(shù)據(jù)1
數(shù)據(jù)0
CRC
CRC
1~99
03
0
00--35
0
1
XX
XX
2、 從機(jī)回應(yīng)格式
0
1
2
3
4
5
6
設(shè)備地址
功能代碼
長度
數(shù)據(jù)1
數(shù)據(jù)0
CRC
CRC
1~99
03
5、
2
高字節(jié)
低字節(jié)
XX
XX
數(shù)據(jù) = 數(shù)據(jù)1 數(shù)據(jù)0;
注意:讀出時,參數(shù)編號加1(MODBUS協(xié)議規(guī)定),如主機(jī)命令中參數(shù)編號為08,讀出的參數(shù)編號為09。
二、 讀出瞬時流量、流速、百分比、空管比、報(bào)警
1、 主機(jī)命令格式
0
1
2
3
4
5
6
7
設(shè)備地址
功能代碼
地址1
地址0
數(shù)據(jù)1
數(shù)據(jù)0
CRC
CRC
1~99
04
0
0
0
5
XX
XX
2、 從機(jī)回應(yīng)格式
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
設(shè)備地址
功能代碼
字節(jié)數(shù)
6、量
流量高位
流量低位
單位數(shù)點(diǎn)
流速高位
流速低位
百分比高
百分比低
空管比高
空管比低
報(bào)警狀態(tài)
crc
crc
1-99
04
10
三、 讀出累計(jì)總量
1、 主機(jī)命令格式
0
1
2
3
4
5
6
7
設(shè)備地址
功能代碼
地址1
地址0
數(shù)據(jù)1
數(shù)據(jù)0
CRC
CRC
1~99
04
0
5
0
5
XX
XX
2、 從機(jī)回應(yīng)格式
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
設(shè)備地址
功能代碼
7、
字節(jié)數(shù)量
正向總量3
正向總量2
正向總量1
正向總量0
反向總量3
反向總量2
反向總量1
反向總量0
總量單位
保留
Crc
Crc
1-99
04
10
0
有的通信手冊并沒有給出例子,而是只有寄存器地址如另一臺流量計(jì)的通信手冊::
好了,有了對應(yīng)的寄存器地址我們就可以參照它來填寫指令中的地址“Addr”,注意一點(diǎn):指令中的地址不能直接填寫對應(yīng)寄存器的地址,s7-200中是這樣規(guī)定的:
我們讀取的就是從站的保持寄存器的地址,所以要在從站寄存器地址加上數(shù)字40000。例如第二個流量計(jì)的地址是400
8、01和40113(在圖3中),實(shí)際是讀取了從站的從第一個和第113個寄存器開始的信息。功能碼是03。
再來看一下第一個流量計(jì)中的地址是以3開頭的地址,即30011和30015,這里的程序是沒有錯的,這就要看通信手冊中具體要主站發(fā)送的數(shù)據(jù)幀格式和功能碼,如下:可以看到功能碼是04,這里的功能碼04也是讀取保持寄存器的,那么如何讓PLC發(fā)出04這個功能碼呢?正常讀取從站時發(fā)出的功能碼是03(這也是MODBUS協(xié)議給定好的)
3、 主機(jī)命令格式
0
1
2
3
4
5
6
7
設(shè)備地址
功能代碼
地址1
地址0
數(shù)據(jù)1
數(shù)據(jù)0
CRC
CRC
1~99
04
9、
0
0
0
5
XX
XX
其實(shí)MODBUS標(biāo)準(zhǔn)協(xié)議中也有04這個功能指令,該指令命名為“讀取輸入寄存器”而不是“保持寄存器”。MODBUS協(xié)議當(dāng)然可以發(fā)送04這個指令,問題是s7-200中的MODBUS協(xié)議庫如何發(fā)送04這個指令呢?MODBUS指令要填寫的信息如下:這里的RW只能填寫0或1代表讀和寫,并不是具體的讀寫指令01、02、03還是04。
其實(shí)這里的RW功能就是告訴s7-200是讀還是寫,至于是具體讀什么或具體寫什么并不是從這里來確定的,是按照它下面的地址“Addr”來區(qū)分的。在step7 micro/win 軟件的幫助中是這樣規(guī)定的:
所以,在我們要讀取的
10、MODBUS從站的寄存器地址的基礎(chǔ)上加上40000,我們最終要輸入的地址就是4000x了(注意地址是從40001開始的而不是40000)。這樣輸入后,PLC在執(zhí)行MODBUS指令時就會判斷并發(fā)送的指令是03。同樣如果我們輸入的地址數(shù)據(jù)是3000x,PLC就會發(fā)送04這個指令了,也可以這樣理解,s7-200 MODBUS指令通過判斷輸入的信息地址“Addr”的最高位來發(fā)送具體的功能指令(03、04或其他)的。在設(shè)備和PLC通信之前最好先用調(diào)試軟件來調(diào)試設(shè)備通信是否正常,是否能采集到數(shù)據(jù),然后再編寫PLC程序。下面這個軟件就是模擬了PLC執(zhí)行MODBUS指令,從下面圖中可以看到30001對應(yīng)的F(
11、功能指令)是04。
還有一點(diǎn)就是編程時要注意MODBUS指令的調(diào)用:MBUS_CTRL_P1指令要一直調(diào)用, MBUS_MSG_P1同一條指令使能在沒有完成時要一直有效,要想再次調(diào)用該指令必須將使能端無效一次掃描讓完成標(biāo)志位復(fù)位。
SMB30和SMB130的停止位是1位,其他參數(shù)可以修改的。
ModBus功能碼
功能碼
名稱
作用
01
讀取線圈狀態(tài)
取得一組邏輯線圈的當(dāng)前狀態(tài)(ON/OFF)
02
讀取輸入狀態(tài)
取得一組開關(guān)輸入的當(dāng)前狀態(tài)(ON/OFF)
03
讀取保持寄存器
在一個或多個保持寄存器中取得當(dāng)前的二進(jìn)制值
04
讀取輸入寄存器
在一個或
12、多個輸入寄存器中取得當(dāng)前的二進(jìn)制值
05
強(qiáng)置單線圈
強(qiáng)置一個邏輯線圈的通斷狀態(tài)
06
預(yù)置單寄存器
把具體二進(jìn)值裝入一個保持寄存器
07
讀取異常狀態(tài)
取得8個內(nèi)部線圈的通斷狀態(tài),這8個線圈的地址由控制器決定,用戶邏輯可以將這些線圈定義,以說明從機(jī)狀態(tài),短報(bào)文適宜于迅速讀取狀態(tài)
08
回送診斷校驗(yàn)
把診斷校驗(yàn)報(bào)文送從機(jī),以對通信處理進(jìn)行評鑒
09
編程(只用于484)
使主機(jī)模擬編程器作用,修改PC從機(jī)邏輯
10
控詢(只用于484)
可使主機(jī)與一臺正在執(zhí)行長程序任務(wù)從機(jī)通信,探詢該從機(jī)是否已完成其操作任務(wù),僅在含有功能碼9的報(bào)文發(fā)送后,本功能碼才發(fā)送
13、11
讀取事件計(jì)數(shù)
可使主機(jī)發(fā)出單詢問,并隨即判定操作是否成功,尤其是該命令或其他應(yīng)答產(chǎn)生通信錯誤時
12
讀取通信事件記錄
可是主機(jī)檢索每臺從機(jī)的ModBus事務(wù)處理通信事件記錄。如果某項(xiàng)事務(wù)處理完成,記錄會給出有關(guān)錯誤
13
編程(184/384 484 584)
可使主機(jī)模擬編程器功能修改PC從機(jī)邏輯
14
探詢(184/384 484 584)
可使主機(jī)與正在執(zhí)行任務(wù)的從機(jī)通信,定期控詢該從機(jī)是否已完成其程序操作,僅在含有功能13的報(bào)文發(fā)送后,本功能碼才得發(fā)送
15
強(qiáng)置多線圈
強(qiáng)置一串連續(xù)邏輯線圈的通斷
16
預(yù)置多寄存器
把具體的二進(jìn)制值裝入一串連
14、續(xù)的保持寄存器
17
報(bào)告從機(jī)標(biāo)識
可使主機(jī)判斷編址從機(jī)的類型及該從機(jī)運(yùn)行指示燈的狀態(tài)
18
(884和MICRO 84)
可使主機(jī)模擬編程功能,修改PC狀態(tài)邏輯
19
重置通信鏈路
發(fā)生非可修改錯誤后,是從機(jī)復(fù)位于已知狀態(tài),可重置順序字節(jié)
20
讀取通用參數(shù)(584L)
顯示擴(kuò)展存儲器文件中的數(shù)據(jù)信息
21
寫入通用參數(shù)(584L)
把通用參數(shù)寫入擴(kuò)展存儲文件,或修改之
22~64
保留作擴(kuò)展功能備用
65~72
保留以備用戶功能所用
留作用戶功能的擴(kuò)展編碼
73~119
非法功能
120~127
保留
留作內(nèi)部作用
128~255
15、
保留
用于異常應(yīng)答
ModBus網(wǎng)絡(luò)只是一個主機(jī),所有通信都由他發(fā)出。網(wǎng)絡(luò)可支持247個之多的遠(yuǎn)程從屬控制器,但實(shí)際所支持的從機(jī)數(shù)要由所用通信設(shè)備決定。采用這個系統(tǒng),各PC可以和中心主機(jī)交換信息而不影響各PC執(zhí)行本身的控制任務(wù)。表2是ModBus各功能碼對應(yīng)的數(shù)據(jù)類型。
表2 ModBus功能碼與數(shù)據(jù)類型對應(yīng)表
代碼
功能
數(shù)據(jù)類型
01
位
02
讀
位
03
讀
整型、字符型、狀態(tài)字、浮點(diǎn)型
04
讀
整型、狀態(tài)字、浮點(diǎn)型
05
寫
位
06
寫
整型、字符型、狀態(tài)字、浮點(diǎn)型
08
N/A
重復(fù)“回路反饋”信息
15
寫
位
16
寫
整型、字符型、狀態(tài)字、浮點(diǎn)型
17
讀
字符型