簡思PLC之MODBUS RTU通信講解
簡思PLC使用的是MODBUS-RTU通訊協(xié)議,MODBUS協(xié)議詳細定義了校驗碼、數(shù)據(jù)序列等,這些都是特定數(shù)據(jù)交換的必要內(nèi)容。MODBUS協(xié)議在一根通訊線上 使用主從應答式連接(半雙工),這意味著在一根單獨的通訊線上信號沿著相反的兩個方向傳輸。首先,主計算機的信號尋址到一臺唯一的終端設備(從機),然后,終端設備發(fā)出的應答信號以相反的方向傳輸給主機。MODBUS協(xié)議只允許在主機(PC,PLC等)和終端設備之間通訊,而不允許獨立的終端設備之間的數(shù)據(jù)交換,這樣各終端設備不會在它們初始化時占據(jù)通訊線路,而僅限于響應到達本機的查詢信號。
1.MODBUS功能碼簡述
? ? 下表列出MODBUS支持的部分功能代碼:以十進制表示。
表1.1 MODBUS部分功能碼
代碼
中文名稱
寄存器 PLC地址范圍
位操作/字操作
操作數(shù)量
01
讀線圈狀態(tài)
Y(0-1000),M(1000-2000)
位操作(Y,M)
單個或多個
02
讀離散輸入狀態(tài)
X(0-1000)
位操作
單個或多個
03
讀保持寄存器
G(2000-3000),W(3000-4000),Ao(5000-5100),
T(8000-9000),C(9000-10000),Z(11000-15000)
字操作
單個或多個
04
讀輸入寄存器
環(huán)中間變量(0-5000),Ai(5000-5100),Ed(5100)
字操作
單個或多個
05
寫單個線圈
Y(0-1000),M(1000-2000)
位操作
單個
06
寫單個保持寄存器
G(2000-3000),W(3000-4000),Ao(5000-5100),
T(8000-9000),C(9000-10000),Z(11000-15000)
字操作
單個
15
寫多個線圈
Y(0-1000),M(1000-2000)
位操作
多個
16
寫多個保持寄存器
G(2000-3000),W(3000-4000),Ao(5000-5100),
T(8000-9000),C(9000-10000),Z(11000-15000)
字操作
多個
1.1功能碼說明
? ? 功能碼可以分為位操作和字操作兩類。位操作的最小單位為BIT,字操作的最小單位為兩個字節(jié)。
? ? ? ? 【位操作指令】 ? ?讀線圈狀態(tài)01H,讀(離散)輸入狀態(tài)02H,寫單個線圈06H和寫多個線圈0FH。
? ? ? ? 【字操作指令】 ? ?讀保持寄存器03H,寫單個寄存器06H,寫多個保持寄存器10H。
1.2寄存器地址分配
表1.2 MODBUS寄存器地址分配
寄存器PLC地址
寄存器協(xié)議地址
適用功能
寄存器種類
讀寫狀態(tài)
00000-09999
0000H-FFFFH
01H 05H 0FH
線圈狀態(tài)
可讀可寫
00000-09999
0000H-FFFFH
02H
離散輸入狀態(tài)
可讀
00000-09999
0000H-FFFFH
04H
輸入寄存器
可讀
00000-49999
0000H-FFFFH
03H 06H 0FH
保持寄存器
可讀可寫
?
1.3寄存器種類說明
?
表1.3 MODBUS寄存器種類說明
寄存器種類
說明
PLC類比
舉例說明
線圈
狀態(tài)
輸出端口??稍O定端口的輸出狀態(tài),
也可以讀取該位的輸出狀態(tài)??煞?/p>
為兩種不同的執(zhí)行狀態(tài),例如保持
型或邊沿觸發(fā)型。
Y
數(shù)字量輸出
電磁閥輸出,MOSFET輸出,LED顯示等。
離散
輸入狀態(tài)
輸入端口。通過外部設定改變輸入
狀態(tài),可讀但不可寫。
X
數(shù)字量輸入
撥碼開關,接近開關等。
保持
寄存器
輸出參數(shù)或保持參數(shù),控制器運行
時被設定的某些參數(shù)。可讀可寫。
AO
模擬量輸出
模擬量輸出設定值,PID運行參數(shù),
變量閥輸出大小,傳感器報警上限下限。
輸入
寄存器
輸入?yún)?shù)??刂破鬟\行時從外部設
備獲得的參數(shù)。可讀但不可寫。
AI
模擬量輸入
模擬量輸入
1.4 PLC地址和協(xié)議地址區(qū)別
? ? PLC地址可以理解為協(xié)議地址的變種,在觸摸屏和PLC編程中應用較為廣泛。
1.4.1 寄存器PLC地址
? ? 寄存器PLC地址指存放于控制器中的地址,這些控制器可以是PLC,也可以使觸摸屏,或是文本顯示器。
1.4.2 寄存器協(xié)議地址
? ? 寄存器協(xié)議地址指指通信時使用的寄存器地址,例如PLC地址4x2001對應尋址地址G1,4x2002對應尋址地址G2,寄存器尋址地址使用10進制描述。再如,PLC寄存器地址3x5000對應協(xié)議地址Ai1,PLC寄存器地址4x5000對應協(xié)議地址Ao1,雖然兩個PLC寄存器寄存器通信時使用相同的地址,但是需要使用不同的命令訪問,所以訪問時不存在沖突。
簡思PLC寄存器地址表請參考?
http://www.jiiizi.com/article/39
2、協(xié)議、字節(jié)格式說明?
協(xié)議采用MODBUS 協(xié)議,RTU 模式,默認參數(shù)如下。
波特率: 19200?
數(shù)據(jù)位: 8?
校驗位: Even(偶校驗)?
停止位 : 1
3、MODBUS 協(xié)議簡單說明
?1. 幀基本格式 主機請求命令
地址
(1 個字節(jié))
功能代碼?
(1 個字節(jié))
起始地址
?(2 個字節(jié))
數(shù)據(jù)長度?
(2 個字節(jié))
CRC?
(2 個字節(jié))
從機回應命令
地址
(1 個字節(jié))
功能代碼?
(1 個字節(jié))
數(shù)據(jù)長度
?
數(shù)據(jù)內(nèi)容?
CRC?
(2 個字節(jié))
從機回應的地址和功能碼和主機請求命令相同,數(shù)據(jù)長度和主機的數(shù)據(jù)長度相同,數(shù)據(jù) 內(nèi)容字節(jié)數(shù)和數(shù)據(jù)長度有關,字節(jié)數(shù) n=數(shù)據(jù)長度 L*2
4、具體指令說明:
4.1讀離散輸入狀態(tài)??(適用于1x開頭的位狀態(tài))
<02 Read Discrete Inputs(1x)>
如主機讀取PLC輸入端X2端口的狀態(tài)
Modbus RTU 主機發(fā)送
地址
(1 個字節(jié))
功能代碼?
(1 個字節(jié))
起始地址
?(2 個字節(jié))
數(shù)據(jù)長度?
(2 個字節(jié))
CRC?
(2 個字節(jié))
01
02
00 02?
00 01
18 0A
PLC返回
地址
(1 個字節(jié))
功能代碼?
(1 個字節(jié))
數(shù)據(jù)長度
數(shù)據(jù)內(nèi)容?
CRC?
(2 個字節(jié))
0102
01
00
A1 88
例:
?a 讀取PLC輸入端X2端口的狀態(tài)

主機發(fā)送 01 02 00 02 00 01 18 0A
如果X2是斷狀態(tài),則返回數(shù)據(jù) 01 02 01?00?A1 88
如果X2是通狀態(tài),則返回數(shù)據(jù) 01 02 01?01?60 48
?b?讀取PLC輸入端X2->X6端口的狀態(tài)

主機發(fā)送 01 02 00 02 00 05 19 C9
如果是全斷狀態(tài),則返回數(shù)據(jù) 01 02 01?00?A1 88
如果X2,X3是通狀態(tài),則返回數(shù)據(jù) 01 02 01?03?E1 89 ,0x03的二進制碼為0000 0011,則表示從起始地址兩位X2,X3是通的。
4.2?讀線圈狀態(tài)??(適用于0x開頭的位狀態(tài))
<01 Read Coils(0x)>
如主機讀取PLC輸出端Y2端口的狀態(tài)
Modbus RTU 主機發(fā)送
地址
(1 個字節(jié))
功能代碼?
(1 個字節(jié))
起始地址
?(2 個字節(jié))
數(shù)據(jù)長度?
(2 個字節(jié))
CRC?
(2 個字節(jié))
01
01
00 02?
00 01
5C 0A
PLC返回
地址
(1 個字節(jié))
功能代碼?
(1 個字節(jié))
數(shù)據(jù)長度
數(shù)據(jù)內(nèi)容?
CRC?
(2 個字節(jié))
0101
01
00
51 88
例:
a.讀取PLC輸出端Y2端口的狀態(tài)

主機發(fā)送 01 01 00 02 00 01 5C 0A
如果Y2是斷狀態(tài),則返回數(shù)據(jù) 01 01 01?00?51 88
如果Y2是通狀態(tài),則返回數(shù)據(jù) 01 01 01?01?90 48
b讀取PLC輸出端Y2-Y11端口的狀態(tài)

主機發(fā)送 01 01 00 02 00 0A 1D CD
如果Y2是通狀態(tài),則返回數(shù)據(jù) 01 01 02?01?00?B8 6C
注意: 如果用Modbus Poll讀取多個位狀態(tài),則地址位需要是8的整數(shù)倍,如讀M1060-M1065的狀態(tài),則起始地址為0x1056起讀16個
4.3?讀保持寄存器??(適用于4x開頭的寄存器)
<03 Read Holding Registers(4x)>
如主機讀取PLC通用寄存器G1的值

Modbus RTU 主機發(fā)送?
G1地址2001,轉(zhuǎn)16進制是0x07D1
主機發(fā)送 01 03 07 D1 00 02 95 46
如:返回數(shù)據(jù) 01 03 04?00 64 00 C8?BA 7A
G1的值是0x0064,轉(zhuǎn)10進制值100
G2的值是0x00C8,轉(zhuǎn)10進制值200
4.4?讀輸入寄存器??(適用于3x開頭的寄存器)
<04 Read Input Registers(3x)>
如主機讀取PLC中時序環(huán)0的當前幀

Modbus RTU 主機發(fā)送?
0環(huán)的當前幀地址是3x2
主機發(fā)送 01 04 00 02 00 01 90 0A
如:返回數(shù)據(jù) 01 04 02?00 01?78 F0
當前幀為第1幀
如:返回數(shù)據(jù) 01 04 02?00 03?F9 31
當前幀為第3幀
4.5?寫單個線圈?(適用于0x開頭的位狀態(tài))
<05 Write Single Coil(0x)>
如主機發(fā)送指令控制Y4通斷 (Y4的地址是0x04)

如觸發(fā)Y4通
主機發(fā)送: ? 01 05 00 04 FF 00 CD FB
返回數(shù)據(jù) ? ?01 05 00 04 FF 00 CD FB
如觸發(fā)Y4斷
主機發(fā)送: ? 01 05 00 04 00 00 8C 0B
返回數(shù)據(jù) ?? 01 05 00 04 00 00 8C 0B
4.6?寫單個保持寄存器??(適用于4x開頭的寄存器)
<06 Write Single Register(4x)>
如主機發(fā)送指令修改G1的值 (G1的地址是4x2001)

如修改G1的值為10
主機發(fā)送: ? 01 06 07 D1 00 0A 58 80
返回數(shù)據(jù) ? ?01 06 07 D1 00 0A 58 80
如修改G1的值為500
主機發(fā)送: ? 01 06 07 D1 01 F4 D8 90
返回數(shù)據(jù) ???01 06 07 D1 01 F4 D8 90
4.6?寫多個線圈???(適用于0x開頭的位狀態(tài))
<15 Write Multiple Coils(0x)>
如主機發(fā)送指令控制M10-M14通斷 (M10的地址是0x1010)

如觸發(fā)M10斷,M11通,M12通,M13斷,M14斷,則發(fā)送的二進制碼為00110
主機發(fā)送: ? 01 0F 03 F2 00 05 01 06 D6 B2
03 F2 是地址 1010的16進制數(shù)。
00 05 是位數(shù)據(jù)個數(shù)。
01 ? ?數(shù)據(jù)占用字節(jié)數(shù)
06 ? ?需要控制的狀態(tài) 00110
返回數(shù)據(jù) ? ?01 0F 03 F2 00 05 34 7F
4.7?寫多個保持寄存器???(適用于0x開頭的位狀態(tài))
<15 Write Multiple Coils(0x)>
如主機發(fā)送指令修改G0-G2的值 (G1的地址是4x2000)

如修改G0=4,G1=5,G2=6
主機發(fā)送: ? 01 10 07 D0 00 03 06 00 04 00 05 00 06 99 9E
?07 D0?是G0地址 2000的16進制數(shù)。
?00 03 是需要修改的數(shù)據(jù)個數(shù)。
?06 ? ?數(shù)據(jù)占用字節(jié)數(shù)
?00 04 第一個數(shù)值
?00 05 第二個數(shù)值
?00 06 第三個數(shù)值
?99 9E CRC校驗
返回數(shù)據(jù) ? ?01 10 07 D0 00 03 80 85