標題: Lazarus 讀寫 PLC 範例 (ModBus 協議)
無頭像
canonpapago

帖子 28
註冊 2013-4-18
用戶註冊天數 4084
發表於 2020-4-8 20:46 
115.43.252.58
分享  私人訊息  頂部
modbus? 關於modbus RTU的使用說明
http://www.xuan.idv.tw/wordpress/?p=1705


以下為文章的摘要

modbus RTU    為最原始的以二進制方式表示
modbus ASCII  使用ASCII
modbus TCP/IP

其不同的差異只有在於部分的格式不同(ASCII採用字元編碼方式傳送)
在低階的硬體控制中,最常使用的莫過於modbus RTU這種以二進制方式傳送的通訊
是最簡單不過的,在RS485(TTL485)中經常可以看到modbus的通訊協定
其原因為modbus本身也具有master與slave的架構,在一個並聯(RS485)的通訊環境
中,有一節點(設備)為master,由該master向其他slave通訊,進行通訊、控制等




★★作者提到 :
1.因為TCP/IP的傳送格式本身就有其自己的檢查機制,故可以將Modbus RTU的CRC省略,透過TCP/IP本身的機制防止收到垃圾資料,這是我認為省略Modbus RTU CRC的原因。
2.但是如果是使用Modbus TCP的話,我記得除了省略CRC以外,在命令前面還會加上6個byte表示後面命令長度,如 00 00 00 00 00 06 01 03 01 02 00 AA
3.Modbus RTU能用網路IP封包傳送方式嗎?
  我的答案是肯定的,因為只要是資料,就可以透過TCP/IP拋出來,Modbus只是定義了一種資料格式,所以與TCP/IP沒有衝突。





■ 常用的modbus功能碼(function code) - 0x03

0x03功能碼(function code)所定義的功能為讀取多個暫存器,用來讀取一連續
位址的資料。

master讀取格式:
設備ID(slave address/ID) + 0x03 + 讀取起始位置(word) + 讀取的數量(word) + CRC16

slave回復格式:
設備ID(slave address/ID + 0x03 + 回復資料的byte數 + 資料1(word) + ... + 資料n(word) + CRC16

例如以下所出現之命令數字均已16進制表示)
master送出: 05 03 0100 0003 + CRC16
slave回應: 05 03 06 00A1 00B2 00C3 + CRC16
這樣就或許到暫存器位址中0100,0101,0102的資料分別為
0100 = 00A1
0101 = 00B2
0102 = 00C3


■ 常用的modbus功能碼(function code) - 0x10

0x10是在執行連續寫入多個暫存器用,其發送命令類似0x03功能的回覆命令

master寫入格式:
設備ID(slave address/ID) + 0x10 + 寫入暫存器起始位置(word) + 寫入的數量(word) + 資料數量(byte)
+ 第1筆資料(word) + ... +第n筆資料(word) + CRC16

slave回復格式:
設備ID(slave address/ID) + 0x10 + 寫入暫存器起始位置(word) + 寫入的數量(word) + CRC16

這個命令通常剛接觸的人都會霧煞煞,簡單說就是指定一個寫入的起始位置,然後預計寫入多少個暫存器
然後再加上一個資料數量,這個資料數量就是後面所帶的資料量有幾個byte,所以等於寫入的數量乘以2
因為一次需要寫入一個word的資料量,以至於就必須告訴slave端說後面帶了多少資料,很多人會說
已經知道寫入幾個了,為什麼還要脫褲子放屁的加上一個資料byte數呢?其原因應該是增加資料的可靠度
當slave端收到命令時,可以有助於驗證資料的正確性,如同0x03功能碼回覆時,也必須帶一個資料長度的大小
也是一樣的作用。

寫入範例:
master 送出: 05 10 0601 0003 06 000A 000B 000C + CRC16
slave 回應: 05 10 0601 0003 + CRC16
這行命令代表了我要寫入多個暫存器,由0601開始寫,連續寫入三個,所以後面的資料長度是6byte
經過命令之後
0601 = 000A
0602 = 000B
0603 = 000C


■ 常用的modbus功能碼(function code) - 0x06 (★★作者沒提到讀取單一暫存器的功能)

0x06的作用,在於寫入單一個暫存器資料,因一次只能寫入一筆資料,
依照modbus標準的定義來看,一次只能寫入1word的資料量。

master寫入格式:
設備ID(slave address/ID) + 0x06 + 寫入暫存器位置(word) + 寫入資料(word) + CRC16

slave回復格式:
設備ID(slave address/ID) + 0x06 + 寫入暫存器位置(word) + 寫入資料(word) + CRC16

0x06寫入與回應是相同的時候,代表寫入成功,如寫入失敗時,則會有另外一種格式,於後面介紹

寫入範例:
master 送出: 05 06 0205 9999 + CRC16
slave 回應: 05 06 0205 9999 + CRC16
經過上面的命令後,slave端暫存器位置0205資料寫入變更為0x9999


無頭像
canonpapago

帖子 28
註冊 2013-4-18
用戶註冊天數 4084
發表於 2020-4-8 20:58 
115.43.252.58
如何看懂 Modbus TCP 通訊協定
https://dotblogs.com.tw/leo_codespace/2018/12/26/185411


【Maker電子學】認識 Modbus協定
https://makerpro.cc/2019/08/modbus-protocol/


【Maker電子學】Modbus RTU的傳輸資料格式
https://makerpro.cc/2019/09/modbus-protocol-packet-format/


【Maker電子學】Modbus over TCP 實作(上)
https://makerpro.cc/2019/11/modbus-over-tcp-part1/

[ 本帖最後由 canonpapago 於 2020-4-8 21:47 編輯 ]


無頭像
canonpapago

帖子 28
註冊 2013-4-18
用戶註冊天數 4084
發表於 2020-4-8 21:49 
115.43.252.58
三菱FX5U通訊(MODBUS)
http://kilean.pixnet.net/blog/po ... U%E9%80%9A%E8%A8%8A


文中提到 :


送碼測試指令整理

01H,讀取M0:
  Send:010120000001F60A
  Receive:01010100F188 (M0為OFF)

01H,讀取M0~M7:
  Send:010120000008360C
  Receive:010101005188 (M0~M7為OFF)

01H,讀取M0~M15:
  Send:0101200000103606
  Receive:010102FF00F80C (M0~M7為ON M8~M15為OFF)

03H,讀取D0:
  Send:010300000001840A
  Receive:0103020000B844 (D0為0)

03H,讀取D0~D1:
  Send:010300000002C40B
  Receive:01030400640000BBEC (D0~D1為0)

05H,寫入M0 ON:
  Send:01052000FF0087FA
  Receive:01052000FF0087FA

05H,寫入M0 OFF:
  Send:010520000000C60A
  Receive:010520000000C60A
06H,寫入D0:
  Send:0106000000648821
  Receive:0106000000648821

0FH,寫入M0~M7 ON
  Send:010F2000000801FFB9B5
  Receive:010F200000085FCD

10H,寫入D0=100, D1=200
  Send:01100000000204006400C8B3E6
  Receive:01100000000241C8



功能代碼:

01H 讀取多個暫存器(Bit型)
03H 讀取多個暫存器(Word型)
05H 寫入單一暫存器(Bit型)
06H 寫入單一暫存器(Word型)
0FH 寫入多個暫存器(Bit型)
10H 寫入多個暫存器(Word型)



MODBUS地址(Bit型暫存器)

0000H∼03FFH Y0∼1023
2000H∼3DFFH M0∼7679
5000H∼57FFH SM0∼2047
5800H∼75FFH L0∼7679
7800H∼78FFH B0∼255
9800H∼987FH F0∼127
A000H∼A0FFH SB0∼255
B000H∼BFFFH S0∼4095
D000H∼D1FFH TC0∼511
D800H∼D9FFH TS0∼511
E000H∼E00FH SC0∼15
E800H∼E80FH SS0∼15
F000H∼F0FFH CC0∼255
F800H∼F8FFH CS0∼255



MODBUS地址(Word型暫存器)

0000H∼1F3FH D0∼7999
5000H∼770FH SD0∼9999
7800H∼79FFH W0∼512
A000H∼A0FFH SW0∼512
D000H∼D1FFH TN0∼511
E000H∼E00FH SN0∼15
F000H∼F0FFH CN0∼255


無頭像
canonpapago

帖子 28
註冊 2013-4-18
用戶註冊天數 4084
發表於 2020-4-8 22:18 
115.43.252.58
Modbus續篇二:Modbus TCP、Modbus RTU及Modbus ASCII的區別
原文網址:https://kknews.cc/code/4o5o6rg.html

[摘要]

TCP和RTU協議非常類似,只要把RTU協議的兩個字節的校驗碼去掉,
然後在RTU協議的開始加上5個0和一個6並通過TCP/IP網絡協議發送出去即可。


對於Modbus TCP而言,主站通常稱為 Client,從站稱為 Server;
而對於Modbus RTU和 Modbus ASCII來說,主站是 Master,從站是Slave。


Modbus TCP是傳輸在 TCP/IP網絡上的,多了一個報文頭,少了CRC校驗,
採用TCP的502埠,RTU多了設備地址和CRC校驗。