在在上一教程中,我們學習了有關與Arduino作為從站的Modbus RS-485串行通信的信息。在今天的后續文章中, Arduino將被用作MODBUS主站并與MODBUS從站進行通信。此處已安裝MODBUS Slave軟件的計算機將用作MODBUS Master。因此,我們首先簡要介紹一下RS-485和Modbus 。
RS-485串行通信
RS-485是異步串行通信協議,不需要時鐘。它使用一種稱為“ 差分信號”的技術將二進制數據從一個設備傳輸到另一個設備。當使用兩根導線和全雙工需要四根導線時,它提供半雙工通信。
將RS-485與Arduino連接
RS-485模塊可以連接到具有以下功能的任何微控制器:串行端口。為了將RS-485模塊與微控制器一起使用,需要一個基于Maxim MAX485 IC 的名為 5V MAX485 TTL到RS485的模塊,因為它可以實現1200米長距離的串行通信。它是雙向半雙工的,數據傳輸速率為2.5 Mbps。該模塊需要5V的電壓。
RS-485的插針輸出:
《表邊框=“ 1” cellpadding =“ 0” cellspacing =“ 0”》 引腳名稱 使用 VCC 5V A 同相接收器輸入同相驅動器輸出 B 反相接收器輸入反相驅動器輸出 GND GND(0V) R0 接收器輸出(RX引腳) RE 接收器輸出(低啟用) DE 驅動器輸出(高啟用) DI 驅動程序輸入(TX引腳)
這是USB到支持WIN7,XP,Vista,Linux,Mac OS的RS485轉換器適配器模塊,并通過使用計算機中的COM端口提供易于使用的RS485接口。 即插即用設備。沒有命令結構,發送到虛擬COM端口的任何內容都會自動轉換為RS485,反之亦然。該模塊完全由USB總線自供電。 因此,無需外部電源即可操作。
它顯示為串行/COM端口,并且可從應用程序或超級終端訪問。此轉換器提供半雙工RS-485通信。波特率范圍為75 bps至115200 bps,最大速率為6 Mbps。
要使用此設備,互聯網上提供了各種Modbus軟件。在本教程中,使用了名為 Witte Software的Modbus Slave軟件的軟件。可以從網站www.modbustools.com下載該軟件。
Modbus從站軟件
Modbus從站應用程序接收值使用串行通訊端口從任何Modbus主設備上進行連接。它是一個數據通信測試軟件。在使用該軟件之前,必須了解以下內容。有關更多信息,請參閱軟件手冊。
從站ID:
網絡中的每個從站都分配有一個唯一的單元地址,范圍為1到127。 masterrequests數據,它發送的第一個字節是從設備地址。這樣,每個從站都會在第一個字節之后知道是否忽略該消息。
Modbus寄存器:
離散輸出線圈:它是一個1位寄存器,用于控制離散輸出,并且可以讀取或寫入。它們的寄存器號為(1到9999)。
離散輸入:這是一個1位寄存器,用作輸入,只能讀取。它們的寄存器號為(10001到19999)。
輸入寄存器:這是一個用于輸入的16位寄存器,只能讀取。它們的寄存器號為(30001到39999)。
保持寄存器:這是一個16位寄存器,可以讀取或寫入。它們的注冊號為(40001到49999)。
Modbus功能代碼:
《表邊框=“ 1” cellpadding =“ 0” summary = “此表顯示了功能代碼,其動作
及其影響的表“》
功能代碼 動作 表名稱 04(04hex) 讀取 模擬輸入寄存器 03(03hex) 讀取 模擬輸出保存寄存器 06(06hex) 寫入單個 模擬輸出保持寄存器 16(10hex) 寫入多個 模擬輸出保持注冊
支持的線圈功能代碼:
及其影響的表”》
功能代碼操作表名
02(02hex )閱讀Di特殊的輸入觸點
01(01hex)Read離散輸出線圈
05(05hex)寫單個離散輸出線圈
15(0Fhex)寫多個離散輸出線圈
CRC:
CRC代表循環冗余校驗。在每個Modbus消息的末尾添加了兩個字節,用于錯誤檢測。
所需的組件
硬件
Arduino UNO
MAX-485 TTL轉RS-485轉換器模塊
USB轉RS-485轉換器模塊
按鈕(2)
10k電阻器(2)
16x2 LCD顯示屏
10k電位器
軟件
Modbus從站
電路圖
MAX-485 TTL至RS-485轉換器模塊與Arduino之間的電路連接UNO:
Arduino UNO MAX-485 TTL轉RS-485轉換器模塊
0(RX)RO
1(TX)DI
3DE
2RE
+ 5VVCC
GNDGND
MAX-485 TTL至RS-485模塊與USB至RS-485轉換器之間的電路連接:
MAX-485 TTL到RS-485
轉換器模塊USB轉RS-485模塊
已與PC連接
AA
BB
Arduino UNO和16x2 LCD顯示器之間的電路連接:
《表border =“ 1” cellpadding =“ 0” cellspacing =“ 0”》
16x2 LCD
Arduino UNO
VSS
GND
VDD
+ 5V
V0
至電位計中心引腳,用于LCD對比度控制
RS
8
RW
GND
E
9
D4
10
D5
11
D6
12
D7
13
A
+ 5V
K
GND
兩個具有下拉電阻10k的按鈕也連接到Arduino的引腳4和5。 10K電位器用于向Arduino引腳A0提供模擬輸入值。
電路連接后,完整的設置如下所示。
將Arduino Uno編程為MODBUS Master
在本教程中,Arduino Uno通過使用來配置為Modbus Master Master Modbus Arduino編碼g在Modbus Master庫的幫助下。這里Arduino Uno有兩個按鈕和一個電位計,可將值從Modbus Master Arduino發送到Modbus Slave軟件。
要在Arduino UNO中使用Modbus,需要一個庫 被使用。該庫用于通過RTU協議與RS-485 Modbus主站或從站進行通信。下載Modbus主站,并按照素描-》包含庫-》添加.zip庫在草圖中添加該庫。
完整的程序,并附有詳細的視頻。在這里,我們解釋了以下主要步驟。
首先,包括ModbusMaster和液晶庫:
#include
#include
接下來定義連接在MAX485 TTL到RS-485轉換器模塊和Arduino UNO之間的引腳名稱。
#define MAX485_DE 3
#define MAX485_RE_NEG 2
初始化類的節點對象 ModbusMaster 。
ModbusMaster node;
然后編寫兩個函數 preTrasnmission()和 postTrasmission()用于使Max485 TTL到RS-485轉換器模塊的RE和DE引腳高或低以發送或接收數據。
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
下一步,在 void設置()中,將LCD設置為16x2模式,并顯示并清除歡迎消息。
lcd.begin(16,2);
lcd.print(“CIRCUIT DIGEST”);
delay(3000);
lcd.clear();
lcd.print(“Arduino”);
lcd.setCursor(0,1);
lcd.print(“Modbus Master”);
delay(3000);
lcd.clear();
然后將RE和DE引腳設置為OUTPUT引腳,將引腳4和5設置為INPUT引腳(按鈕)。
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
最初,將MAX-485 TTL到RS-485轉換器模塊的DE和RE引腳設置為LOW
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
將波特率設置為115200,并用從站ID 1通知Modbus主站。
Serial.begin(115200);
node.begin(1, Serial);
之后,使用回調語句,以便RS-485收發器已正確配置。
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
現在位于 void loop()
首先從與電位計連接的A0引腳讀取模擬值。
float value = analogRead(A0);
然后,使用以下語句將(0到1023)的ADC值寫入0x40000寄存器,以將其發送到Modbus從站。
node.writeSingleRegister(0x40000,value);
然后該值也顯示在16x2 LCD顯示屏上
lcd.setCursor(0,0);
lcd.print(“POT Val :”);
lcd.print(value);
接下來,兩個按鈕的狀態為
int a= digitalRead(4);
int b= digitalRead(5);
,并且取決于th的狀態e按鈕,將按鈕1的值0x40001和按鈕2的值0x40002寫入Modbus從站,并顯示在LCD顯示屏上。
if (a == 1)
{
node.writeSingleRegister(0x40001,1);
lcd.setCursor(0,1);
lcd.print(“S1: 1”);
}
else
{
node.writeSingleRegister(0x40001,0);
lcd.setCursor(0,1);
lcd.print(“S1: 0”);
}
if (b == 1)
{
node.writeSingleRegister(0x40002,1);
lcd.setCursor(8,1);
lcd.print(“S2: 1”);
}
else
{
node.writeSingleRegister(0x40002,0);
lcd.setCursor(8,1);
lcd.print(“S2: 0”);
}
將Arduino UNO測試為RS485 MODBUS主設備
在電路連接完成并將代碼上傳到Arduino Uno之后,現在是時候將USB連接到RS-485模塊了
注意:打開設備管理器,并根據連接了USB到RS-485模塊的PC并檢查COM端口。然后打開Modbus Slave軟件。
1。Modbus Slave Tool出現如下,指示 No Connection。
2。下一步打開 Connection-》 Connect ,它顯示如下。
3。由于該軟件是試用版,因此會顯示以下對話框,因此請點擊稍后注冊
4。此試用版軟件打開后僅運行10分鐘。
5。連接細節如下所示。將連接設置為串行端口,并將串行設置設置為連接USB到RS-485模塊的COM端口。然后將波特率設置為115200 (就像我在Arduino代碼中使用的一樣),將數據位設置為8 ,無奇偶校驗, 1停止位和“模式”作為RTU,然后單擊“確定”。
6。請注意,無連接消失,現在打開設置-》從站 定義。
7。現在,將從站ID 輸入為1,將功能輸入為03 保留寄存器和地址0 ,然后單擊確定。/p》
8。之后,確認ID為1,F為03。在本教程中,將使用前三個寄存器(0電位ADC值,1-按鈕值,2-按鈕值)。
9。現在,當按下按鈕2時。注意第三行中的值1。由于未按下按鈕1,它在第二行中保持為0,在第一行中顯示了一些底池值。
10。按下按鈕1時。注意第二行中的值1。并且由于沒有按下按鈕2,因此它在第三行中保持為0,在第一行中顯示了一些底池值。
11。現在,當同時按下兩個按鈕時,第二行和第三行中都有值1,并記下電位計值。
12。當電位計變化時,行1在Modbus從站軟件中也會變化。
這是 RS-485 Modbus可以與Arduino UNO作為主機進行串行通訊。請查看上一教程,以了解Arduino Uno在MODBUS通訊中作為從機。
查找完整的代碼并下面的演示視頻
》代碼
#include //使用ModbusMaster的庫
#include //使用LCD顯示屏的庫
#define MAX485_DE 3
#define MAX485_RE_NEG 2
ModbusMaster節點;//ModbusMaster類的對象節點
LiquidCrystal lcd(8,9,10,11,12,13);//帶有LCD引腳(RS,E,D4,D5,D6,D7)并與Arduino UNO連接的液晶類液晶顯示器的對象LCD。
void preTransmission()//用于設置引腳DE的stste的函數RS-485
{
digitalWrite(MAX485_RE_NEG,1)的&RE
digitalWrite(MAX485_DE,1);
}
無效postTransmission()
{
digitalWrite(MAX485_RE_NEG,0);
digitalWrite(MAX485_DE,0);
}
void setup()
{
lcd.begin(16,2);
lcd.print(“ CIRCUIT DIGEST”);
delay(3000) ;
lcd.clear();
lcd.print(“ Arduino”);
lcd.setCursor(0,1);
lcd.print(“ Modbus Master”);
delay(3000);
lcd.clear();
pinMode(MAX485_RE_NEG,OUTPUT);
pinMode(MAX485_DE,OUTPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
digitalWrite(MAX485_RE_NEG,0);
digitalWrite(MAX485_DE,0);
Serial.begin(115200);//波特率為115200
node.begin(1,Serial);//從站ID為1
node.preTransmission(preTransmission);//正確配置RS-485收發器的回調
node.postTransmission(postTransmission);
}
void loop()
{
float值= AnalogRead(A0);
node.writeSingleRegister(0x40000,值);//將值寫入保存寄存器的0x40000
lcd.setCursor(0,0);
lcd.print(“ POT Val:”);
lcd.print(value);
int a = digitalRead(4);//讀取按鈕的狀態
int b = digitalRead(5);
if(a == 1)
{
node.writeSingleRegister(0x40001,1);//將1寫入0x40001保持寄存器
lcd.setCursor(0,1);
lcd.print(“ S1:1”);
}
else
{
節點.writeSingleRegister(0x40001,0);//將0到0x40001寫入保持寄存器
lcd.setCursor(0,1);
lcd.print(“ S1:0”);
}
if(b == 1)
{
node.writeSingleRegister(0x40002,1);//寫入1到0x40002的保持寄存器
lcd.setCursor(8,1);
lcd.print(“ S2:1”);
}
else
{
節點.writeSingleRegister(0x40002,0);//將0到0x40002寫入保持寄存器
lcd.setCursor(8,1);
lcd.print(“ S2:0”);
}
}
責任編輯:wv
-
MODBUS
+關注
關注
28文章
1821瀏覽量
77335 -
Arduino
+關注
關注
188文章
6477瀏覽量
187895
發布評論請先 登錄
相關推薦
Profinet通訊網關模塊之Modbus TCP從站轉profinet主站案例
![Profinet通訊網關模塊之<b class='flag-5'>Modbus</b> TCP<b class='flag-5'>從</b><b class='flag-5'>站</b>轉profinet<b class='flag-5'>主</b><b class='flag-5'>站</b>案例](https://file1.elecfans.com/web3/M00/06/24/wKgZO2eHeRWAVo50AACY7AqkVaQ875.png)
Modbus-TCP主站轉CC-Link IEFB協議網關(YC-CCLKIE-TCP)
![<b class='flag-5'>Modbus</b>-TCP<b class='flag-5'>主</b><b class='flag-5'>站</b>轉CC-Link IEFB協議網關(YC-CCLKIE-TCP)](https://file1.elecfans.com/web2/M00/05/17/wKgaombL9OiAS04-AAEuC4rqg-I787.png)
EtherCAT主站轉Modbus TCP從站協議網關(JM-ECTM-TCP)
![EtherCAT<b class='flag-5'>主</b><b class='flag-5'>站</b>轉<b class='flag-5'>Modbus</b> TCP<b class='flag-5'>從</b><b class='flag-5'>站</b>協議網關(JM-ECTM-TCP)](https://file1.elecfans.com/web2/M00/04/8A/wKgaombFUlSAGgRZAAKh3tAvK04112.png)
Profibus DP主站轉Modbus網關連接智能化電表通訊
![Profibus DP<b class='flag-5'>主</b><b class='flag-5'>站</b>轉<b class='flag-5'>Modbus</b>網關連接智能化電表通訊](https://file1.elecfans.com//web2/M00/F8/12/wKgaomaD2guAA-t4AACW57BMjS4396.png)
ProfibusDP主站轉Modbus模塊連接綜合保護裝置配置案例
![ProfibusDP<b class='flag-5'>主</b><b class='flag-5'>站</b>轉<b class='flag-5'>Modbus</b>模塊連接綜合保護裝置配置案例](https://file1.elecfans.com/web2/M00/F3/E0/wKgZomZ9YGGAM18vAAUACV3Da_Q844.png)
ProfibusDP主站協議轉Modbus協議模塊連接稱重儀配置案例
![ProfibusDP<b class='flag-5'>主</b><b class='flag-5'>站</b>協議轉<b class='flag-5'>Modbus</b>協議模塊連接稱重儀配置案例](https://file1.elecfans.com/web2/M00/F5/E9/wKgaomZ-KWeARytsAA4YwOl4LEY686.png)
評論