以下作品由安信可社區用戶
http://ckdsx.cn制作
目錄
1.什么是Modbus, RS485?
1.2RS485,RS232兩種協議之間的主要區別
1.3Modbus的內容是什么?
1.4幀結構
1.5Modbus指令實例1.5.1
1.6 Modbus-RTU協議
2.外設介紹
2.1常用芯片選擇
2.2初始化過程
3.移植過程
3.1資料介紹
3.2示例參考程序代碼
使用wb2進行 modbus 485 通訊演示_嗶哩嗶哩_bilibiliwww.bilibili.com/video/BV1Hapxe4EsV/?vd_source=54c5db21948db2378659b7e8e42bafbf
一、什么是Modbus, RS485 ?
Modbus就是一種用在工業上的簡單協議!顧名思義,它是一個Bus,即總線協議。比如串口協議、IIC協議、SPI都是通信協議。
RS485是一種通用的通信標準,廣泛用于數據采集和控制應用中。它的主要優點之一是它允許將多個 RS485設備放在同一條總線上,這使得多個節點可以相互連接。
RS-485(目前稱為EIA/TIA-485)是通信物理層的標準接口,一種信號傳輸方式,OSI(開放系統互連)模型的第一級。創建 RS-485是為了擴展RS-232接口的物理功能。
串行EIA-485連接是使用兩根或三根電線的電纜完成的:一根數據線、一根帶反轉數據的電線,通常還有一根零線(接地,0V)。這樣,發射器和接收器通過22或24AWG 實心線的雙絞線電纜交換數據。
01、RS485 VS RS232
RS485和RS232串行通信協議已經使用了50多年,并且仍在整個商業和工業中廣泛使用。擴展RS232標準的功能是開發RS485協議的動力。下表概述了這兩個標準。
02、RS485,RS232兩種協議之間的主要區別
發射器和接收器的數量
RS232串行接口設計用于連接兩個設備。該協議支持單個發射器和接收器之間的通信。 RS485接口,最多可以將32個串行設備連接到一個變送器。
操作距離
使用RS232協議的設備在發送器和接收器之間的距離限制為15米,同時仍能實現最大數據傳輸速率。如果可以容忍較慢的數據速率,則可以延長此長度。 RS485協議大大延長了操作距離。它支持1200米長度的最大數據速率,使RS485協議成為物理上相距遙遠的設備之間通信的絕佳選擇。
數據傳輸速度
RS232接口的傳輸速度為1Mb/s,傳輸距離可達15米。RS485在15米的距離內提供高達10Mb/s的更高速度。當達到1200米的最大長度時,RS485協議以100Kb/s的速度傳輸數據。
電氣噪聲問題和接地電位
RS232接口是一種基于電壓電平的系統,在接地電位差異最小的情況下性能最佳。表現出高水平電噪聲和可變接地電位的環境會影響RS232有效傳輸數據的能力,并可能導致數據丟失或損壞。
RS485協議采用差分電壓系統,使其能夠在具有較高電噪聲水平的環境中有效運行。差分電壓系統的一個副產品是數據傳輸距離的延長、傳輸速度的提高以及RS485所見的更低電壓的使用。
03、Modbus的內容是什么?
Modbus-RTU,Modbus-ASCII,Modbus-TCP以上三種協議,一個設備只會有一種協議,如果你的設備使用的是Modbus-RTU,只需查看以下對應部分,一般來說大部分的設備都是Modbus-RTU協議的。
04、幀結構
地址
占用一個字節,范圍0-255,其中有效范圍是1-247,其他有特殊用途,比如255是廣播地址(廣播地址就是應答所有地址,正常的需要兩個設備的地址一樣才能進行查詢和回復)。
功能碼
占用一個字節,功能碼的意義就是,知道這個指令是干啥的,比如你可以查詢從機的數據,也可以修改數據,所以不同功能碼對應不同功能。
數據
根據功能碼不同,有不同結構,在下面的實例中有說明。
校驗
為了保證數據不錯誤,增加這個,然后再把前面的數據進行計算看數據是否一致,如果一致,就說明這幀數據是正確的,我再回復;如果不一樣,說明你這個數據在傳輸的時候出了問題,數據不對的,所以就拋棄了。
這是一個基于ModbusRTU協議的Ai-WB2modbus庫,它支持以下幾種modbus協議命令:
*0x01: 讀一個或多個線圈寄存器
*0x02: 讀一個或多個離散輸入寄存器
*0x03: 讀一個或多個保持寄存器
*0x04: 讀一個或多個輸入寄存器
*0x05: 寫單個線圈寄存器
*0x06: 寫單個保持寄存器
*0x0F: 寫多個線圈寄存器
*0x10: 寫多個保持寄存器
05、Modbus指令實例
查詢從機地址為01的數據
主機發送:01 03 00 00 00 01 84 0A
從機回復:01 03 02 19 98 B2 7E
發送數據解析
回復數據解析
查詢數據基本流程就是:
發送:從機的地址+要干嘛的功能碼+要查的寄存器的地址+要查的寄存器地址的個數+校驗碼
回復:從機的地址+主機發我的功能碼+要發送給主機數據的字節數+數據+校驗碼
修改從機地址為01的數據
主機發送:01 06 00 00 00 01 48 0A
從機回復:01 06 00 00 00 01 48 0A
發送數據解析
回復數據解析
06、Modbus-RTU協議
只需要看懂功能碼0x03、0x06、0x10這三個基本的就已經足夠了,分別回想下其數據域部分:
0x03—主機需要發送起始地址+寄存器數量,從機回復總字節數+數據;
0x06—主機發送起始地址+數據內容(因為你只需要修改一個,所以起始地址就是所要修改的地址),從機返回起始地址+數據內容(發現居然一樣!)
0x10—主機發送起始地址+寄存器個數+總字節數+數據,從機返回起始地址+寄存器數量
二、外設介紹
RS485轉TTL模塊
RS485遠程I/O聯網模塊IODO控制器modbus
3.3V與5.0V電源、信號兼容的RS485自動流向控制模塊無需“收—發”控制,使用本模塊跟操作串口一樣簡單,透傳模塊實現了TTL信號與RS485信號的互轉,但大家一定要知道,485是半雙工通信,這種通信方式可以實現雙向的通信,但不能在兩個方向上同時進行,必須輪流交替地進行;也就是說,通信信道的每一端都可以是發送端,也可以是接收端,但同一時刻里,信息只能有一個傳輸方向。
波特率:支持110~128000bps
模塊亮點:
(1)供電范圍寬:3.3V~5.5V。
(2)3.3V與5.0V信號兼容。
(3)采用原裝進口芯片,工業級設計,抗干擾能力強,同時采用更為有效的485防雷設計,可在工業現場及野外惡劣的環境下使用,工作溫度為—40℃至+85℃,傳輸距離可達千米(用的850米的2*1.5的線纜做的測試,建議在800米內使用,超過800米請加中繼器)。
(4)采用半孔工藝設計,板厚0.8mm,可輕松作為子母板使用,也可焊接端子使用。
(5)具有RXD、TXD信號指示燈,收發狀況盡收眼底。
模塊特點:
(1)本模塊充分考慮了485總線防雷設計和抗干擾設計,在野外長距離傳輸時,將模塊的“接大地”端接入大地,可以起到很好的抗干擾和防雷的作用,使485總線更安全;室內短距離傳輸時可以不接入大地。
(2)采用標準的2.54間距設計,方便您的二次開發。
(3)具有120歐匹配電阻,短接RO即可使能匹配電阻,長距離傳輸時建議短接。
(4)支持多機通訊,允許接在最多128個設備的總線上
(5)本模塊可以進行熱插拔,不會出現其他485芯片熱插拔出現的信號栓死現象。
(6)大面積鋪銅,防止信號干擾。
01、常用芯片選擇
SN75176
SN75276
SN75179
SN75180
MAX485
MAX488
MAX490
02、初始化過程
引入頭文件
#include
#include
#include
#include
#include
#include"bl_sys.h"
#include
#include"softcrc.h"
#include"stdint.h"
#include"string.h"
設置初始化參數
波特率:默認串口配置為9600波特率,8位數據位,無校驗位,1位停止位。
hosal_uart_dev_tuart_dev_log = {
.config= {
.uart_id= 1,
.tx_pin= 16, // TXD GPIO
.rx_pin= 7, // RXD GPIO
.cts_pin= 255,
.rts_pin= 255,
.baud_rate= 115200,
.data_width= HOSAL_DATA_WIDTH_8BIT,
.parity= HOSAL_NO_PARITY,
.stop_bits= HOSAL_STOP_BITS_1,
.mode= HOSAL_UART_MODE_POLL,
},
};
hosal_uart_init(&uart_dev_log);
配置用到的引腳
默認使用串口引腳:硬件串口
使用板載引腳4個:TX,RX,3.3V,GND(接線方法見模塊說明書或下圖) RS485引腳:A+連接A+,B-連接B-,數據有干擾的情況下GND接地。
三、移植過程
01、資料介紹
地址和命令可以直接以16進制的方式寫到數組里,CRC16校驗需要計算或查表獲得;
參考網上CRC教程,使用本地CRC庫文件二次封裝完成CRC校驗及校驗值追加與打印函數(有關更多CRC計算請參考網上教程);
由于手頭方便的僅有modubusRS485遠程控制IO模塊,僅以此模塊完成命令發送控制其輸出繼電器開關的例程。
電路連線圖
Ai-WB2 => 串口TTL=> MAX485 => A,B雙絞線=>RS485設備
注:AI-WB2與模塊之間連線時,RX連接RX,TX連接TX。請根據模塊說明自行調整接線!
02、示例參考程序代碼
RS485發送示例代碼如下:
----------------------
#include
intcounter = 0;voidsetup() {
RS485.begin(9600);}
voidloop() {
RS485.beginTransmission();
RS485.print("hello");
RS485.println(counter);
RS485.endTransmission();
counter++;
delay(1000);
}
-------------------------------
RS485接收并串口打印示例代碼如下:
-----------------------------------
#include
voidsetup() {
Serial.begin(9600); while(!Serial);
RS485.begin(9600);
//enable reception, can be //disabled with: RS485.noReceive();
RS485.receive();}
voidloop() {
if(RS485.available()) {
Serial.write(RS485.read()); }}
--------------------------------
注:通過串口助手直接輸出指令,有可能因為不是十六進制,或指令尾部被增加回車換行(0D0A)而導致失敗!
程序運行過程:wb2通過串口向RS485轉TTL模塊發送指令,遠程IO模塊通過Modbus端口A、B接收數據并解析,然后執行指令動作。
程序運行現象:RS485轉TTL模塊,TX指示燈每隔兩秒點了一下,遠程IO模塊輸出端口1234順序開啟,然后順序關閉。
若無硬件,則可以使用串口助手觀察命令發送情況,請注意勾選HEX顯示。(見下圖)
程序代碼見原貼中的附件
【外設移植】Ai-WB2+Modbus 485 RTU 遠程控制。程序太過簡單,未制作成庫文件,各位可直接修改使用,make相關內容同helloworld文件一樣。
https://bbs.aithinker.com/forum.php?mod=viewthread&tid=45244&_dsign=2c20ee00
PS:感謝園長、銀、狗哥、杰哥、妖哥等各位安信可技術社區的大佬熱情幫助!
審核編輯 黃宇
-
遠程控制
+關注
關注
4文章
634瀏覽量
34938 -
RTU
+關注
關注
0文章
414瀏覽量
28690
發布評論請先 登錄
相關推薦
評論