在在上一教程中,我們學(xué)習(xí)了有關(guān)與Arduino作為從站的Modbus RS-485串行通信的信息。在今天的后續(xù)文章中, Arduino將被用作MODBUS主站并與MODBUS從站進(jìn)行通信。此處已安裝MODBUS Slave軟件的計(jì)算機(jī)將用作MODBUS Master。因此,我們首先簡(jiǎn)要介紹一下RS-485和Modbus 。
RS-485串行通信
RS-485是異步串行通信協(xié)議,不需要時(shí)鐘。它使用一種稱為“ 差分信號(hào)”的技術(shù)將二進(jìn)制數(shù)據(jù)從一個(gè)設(shè)備傳輸?shù)搅硪粋€(gè)設(shè)備。當(dāng)使用兩根導(dǎo)線和全雙工需要四根導(dǎo)線時(shí),它提供半雙工通信。
將RS-485與Arduino連接
RS-485模塊可以連接到具有以下功能的任何微控制器:串行端口。為了將RS-485模塊與微控制器一起使用,需要一個(gè)基于Maxim MAX485 IC 的名為 5V MAX485 TTL到RS485的模塊,因?yàn)樗梢詫?shí)現(xiàn)1200米長(zhǎng)距離的串行通信。它是雙向半雙工的,數(shù)據(jù)傳輸速率為2.5 Mbps。該模塊需要5V的電壓。
RS-485的插針輸出:
《表邊框=“ 1” cellpadding =“ 0” cellspacing =“ 0”》 引腳名稱 使用 VCC 5V A 同相接收器輸入同相驅(qū)動(dòng)器輸出 B 反相接收器輸入反相驅(qū)動(dòng)器輸出 GND GND(0V) R0 接收器輸出(RX引腳) RE 接收器輸出(低啟用) DE 驅(qū)動(dòng)器輸出(高啟用) DI 驅(qū)動(dòng)程序輸入(TX引腳)
USB轉(zhuǎn)RS-485轉(zhuǎn)換器模塊:
這是USB到支持WIN7,XP,Vista,Linux,Mac OS的RS485轉(zhuǎn)換器適配器模塊,并通過(guò)使用計(jì)算機(jī)中的COM端口提供易于使用的RS485接口。 即插即用設(shè)備。沒(méi)有命令結(jié)構(gòu),發(fā)送到虛擬COM端口的任何內(nèi)容都會(huì)自動(dòng)轉(zhuǎn)換為RS485,反之亦然。該模塊完全由USB總線自供電。 因此,無(wú)需外部電源即可操作。
它顯示為串行/COM端口,并且可從應(yīng)用程序或超級(jí)終端訪問(wèn)。此轉(zhuǎn)換器提供半雙工RS-485通信。波特率范圍為75 bps至115200 bps,最大速率為6 Mbps。
要使用此設(shè)備,互聯(lián)網(wǎng)上提供了各種Modbus軟件。在本教程中,使用了名為 Witte Software的Modbus Slave軟件的軟件。可以從網(wǎng)站www.modbustools.com下載該軟件。
Modbus從站軟件
Modbus從站應(yīng)用程序接收值使用串行通訊端口從任何Modbus主設(shè)備上進(jìn)行連接。它是一個(gè)數(shù)據(jù)通信測(cè)試軟件。在使用該軟件之前,必須了解以下內(nèi)容。有關(guān)更多信息,請(qǐng)參閱軟件手冊(cè)。
從站ID:
網(wǎng)絡(luò)中的每個(gè)從站都分配有一個(gè)唯一的單元地址,范圍為1到127。 masterrequests數(shù)據(jù),它發(fā)送的第一個(gè)字節(jié)是從設(shè)備地址。這樣,每個(gè)從站都會(huì)在第一個(gè)字節(jié)之后知道是否忽略該消息。
Modbus寄存器:
離散輸出線圈:它是一個(gè)1位寄存器,用于控制離散輸出,并且可以讀取或?qū)懭?。它們的寄存器?hào)為(1到9999)。
離散輸入:這是一個(gè)1位寄存器,用作輸入,只能讀取。它們的寄存器號(hào)為(10001到19999)。
輸入寄存器:這是一個(gè)用于輸入的16位寄存器,只能讀取。它們的寄存器號(hào)為(30001到39999)。
保持寄存器:這是一個(gè)16位寄存器,可以讀取或?qū)懭?。它們的注?cè)號(hào)為(40001到49999)。
Modbus功能代碼:
《表邊框=“ 1” cellpadding =“ 0” summary = “此表顯示了功能代碼,其動(dòng)作
及其影響的表“》
功能代碼 動(dòng)作 表名稱 04(04hex) 讀取 模擬輸入寄存器 03(03hex) 讀取 模擬輸出保存寄存器 06(06hex) 寫(xiě)入單個(gè) 模擬輸出保持寄存器 16(10hex) 寫(xiě)入多個(gè) 模擬輸出保持注冊(cè)
支持的線圈功能代碼:
及其影響的表”》
功能代碼操作表名
02(02hex )閱讀Di特殊的輸入觸點(diǎn)
01(01hex)Read離散輸出線圈
05(05hex)寫(xiě)單個(gè)離散輸出線圈
15(0Fhex)寫(xiě)多個(gè)離散輸出線圈
CRC:
CRC代表循環(huán)冗余校驗(yàn)。在每個(gè)Modbus消息的末尾添加了兩個(gè)字節(jié),用于錯(cuò)誤檢測(cè)。
所需的組件
硬件
Arduino UNO
MAX-485 TTL轉(zhuǎn)RS-485轉(zhuǎn)換器模塊
USB轉(zhuǎn)RS-485轉(zhuǎn)換器模塊
按鈕(2)
10k電阻器(2)
16x2 LCD顯示屏
10k電位器
軟件
Modbus從站
電路圖
MAX-485 TTL至RS-485轉(zhuǎn)換器模塊與Arduino之間的電路連接UNO:
Arduino UNO MAX-485 TTL轉(zhuǎn)RS-485轉(zhuǎn)換器模塊
0(RX)RO
1(TX)DI
3DE
2RE
+ 5VVCC
GNDGND
MAX-485 TTL至RS-485模塊與USB至RS-485轉(zhuǎn)換器之間的電路連接:
MAX-485 TTL到RS-485
轉(zhuǎn)換器模塊USB轉(zhuǎn)RS-485模塊
已與PC連接
AA
BB
Arduino UNO和16x2 LCD顯示器之間的電路連接:
《表border =“ 1” cellpadding =“ 0” cellspacing =“ 0”》
16x2 LCD
Arduino UNO
VSS
GND
VDD
+ 5V
V0
至電位計(jì)中心引腳,用于LCD對(duì)比度控制
RS
8
RW
GND
E
9
D4
10
D5
11
D6
12
D7
13
A
+ 5V
K
GND
兩個(gè)具有下拉電阻10k的按鈕也連接到Arduino的引腳4和5。 10K電位器用于向Arduino引腳A0提供模擬輸入值。
電路連接后,完整的設(shè)置如下所示。
將Arduino Uno編程為MODBUS Master
在本教程中,Arduino Uno通過(guò)使用來(lái)配置為Modbus Master Master Modbus Arduino編碼g在Modbus Master庫(kù)的幫助下。這里Arduino Uno有兩個(gè)按鈕和一個(gè)電位計(jì),可將值從Modbus Master Arduino發(fā)送到Modbus Slave軟件。
要在Arduino UNO中使用Modbus,需要一個(gè)庫(kù) 被使用。該庫(kù)用于通過(guò)RTU協(xié)議與RS-485 Modbus主站或從站進(jìn)行通信。下載Modbus主站,并按照素描-》包含庫(kù)-》添加.zip庫(kù)在草圖中添加該庫(kù)。
完整的程序,并附有詳細(xì)的視頻。在這里,我們解釋了以下主要步驟。
首先,包括ModbusMaster和液晶庫(kù):
#include
#include
接下來(lái)定義連接在MAX485 TTL到RS-485轉(zhuǎn)換器模塊和Arduino UNO之間的引腳名稱。
#define MAX485_DE 3
#define MAX485_RE_NEG 2
初始化類的節(jié)點(diǎn)對(duì)象 ModbusMaster 。
ModbusMaster node;
然后編寫(xiě)兩個(gè)函數(shù) preTrasnmission()和 postTrasmission()用于使Max485 TTL到RS-485轉(zhuǎn)換器模塊的RE和DE引腳高或低以發(fā)送或接收數(shù)據(jù)。
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
下一步,在 void設(shè)置()中,將LCD設(shè)置為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引腳設(shè)置為OUTPUT引腳,將引腳4和5設(shè)置為INPUT引腳(按鈕)。
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
最初,將MAX-485 TTL到RS-485轉(zhuǎn)換器模塊的DE和RE引腳設(shè)置為L(zhǎng)OW
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
將波特率設(shè)置為115200,并用從站ID 1通知Modbus主站。
Serial.begin(115200);
node.begin(1, Serial);
之后,使用回調(diào)語(yǔ)句,以便RS-485收發(fā)器已正確配置。
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
現(xiàn)在位于 void loop()
首先從與電位計(jì)連接的A0引腳讀取模擬值。
float value = analogRead(A0);
然后,使用以下語(yǔ)句將(0到1023)的ADC值寫(xiě)入0x40000寄存器,以將其發(fā)送到Modbus從站。
node.writeSingleRegister(0x40000,value);
然后該值也顯示在16x2 LCD顯示屏上
lcd.setCursor(0,0);
lcd.print(“POT Val :”);
lcd.print(value);
接下來(lái),兩個(gè)按鈕的狀態(tài)為
int a= digitalRead(4);
int b= digitalRead(5);
,并且取決于th的狀態(tài)e按鈕,將按鈕1的值0x40001和按鈕2的值0x40002寫(xiě)入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測(cè)試為RS485 MODBUS主設(shè)備
在電路連接完成并將代碼上傳到Arduino Uno之后,現(xiàn)在是時(shí)候?qū)SB連接到RS-485模塊了
注意:打開(kāi)設(shè)備管理器,并根據(jù)連接了USB到RS-485模塊的PC并檢查COM端口。然后打開(kāi)Modbus Slave軟件。
1。Modbus Slave Tool出現(xiàn)如下,指示 No Connection。
2。下一步打開(kāi) Connection-》 Connect ,它顯示如下。
3。由于該軟件是試用版,因此會(huì)顯示以下對(duì)話框,因此請(qǐng)點(diǎn)擊稍后注冊(cè)
4。此試用版軟件打開(kāi)后僅運(yùn)行10分鐘。
5。連接細(xì)節(jié)如下所示。將連接設(shè)置為串行端口,并將串行設(shè)置設(shè)置為連接USB到RS-485模塊的COM端口。然后將波特率設(shè)置為115200 (就像我在Arduino代碼中使用的一樣),將數(shù)據(jù)位設(shè)置為8 ,無(wú)奇偶校驗(yàn), 1停止位和“模式”作為RTU,然后單擊“確定”。
6。請(qǐng)注意,無(wú)連接消失,現(xiàn)在打開(kāi)設(shè)置-》從站 定義。
7。現(xiàn)在,將從站ID 輸入為1,將功能輸入為03 保留寄存器和地址0 ,然后單擊確定。/p》
8。之后,確認(rèn)ID為1,F(xiàn)為03。在本教程中,將使用前三個(gè)寄存器(0電位ADC值,1-按鈕值,2-按鈕值)。
9?,F(xiàn)在,當(dāng)按下按鈕2時(shí)。注意第三行中的值1。由于未按下按鈕1,它在第二行中保持為0,在第一行中顯示了一些底池值。
10。按下按鈕1時(shí)。注意第二行中的值1。并且由于沒(méi)有按下按鈕2,因此它在第三行中保持為0,在第一行中顯示了一些底池值。
11?,F(xiàn)在,當(dāng)同時(shí)按下兩個(gè)按鈕時(shí),第二行和第三行中都有值1,并記下電位計(jì)值。
12。當(dāng)電位計(jì)變化時(shí),行1在Modbus從站軟件中也會(huì)變化。
這是 RS-485 Modbus可以與Arduino UNO作為主機(jī)進(jìn)行串行通訊。請(qǐng)查看上一教程,以了解Arduino Uno在MODBUS通訊中作為從機(jī)。
查找完整的代碼并下面的演示視頻
》代碼
#include //使用ModbusMaster的庫(kù)
#include //使用LCD顯示屏的庫(kù)
#define MAX485_DE 3
#define MAX485_RE_NEG 2
ModbusMaster節(jié)點(diǎn);//ModbusMaster類的對(duì)象節(jié)點(diǎn)
LiquidCrystal lcd(8,9,10,11,12,13);//帶有LCD引腳(RS,E,D4,D5,D6,D7)并與Arduino UNO連接的液晶類液晶顯示器的對(duì)象LCD。
void preTransmission()//用于設(shè)置引腳DE的stste的函數(shù)RS-485
{
digitalWrite(MAX485_RE_NEG,1)的&RE
digitalWrite(MAX485_DE,1);
}
無(wú)效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收發(fā)器的回調(diào)
node.postTransmission(postTransmission);
}
void loop()
{
float值= AnalogRead(A0);
node.writeSingleRegister(0x40000,值);//將值寫(xiě)入保存寄存器的0x40000
lcd.setCursor(0,0);
lcd.print(“ POT Val:”);
lcd.print(value);
int a = digitalRead(4);//讀取按鈕的狀態(tài)
int b = digitalRead(5);
if(a == 1)
{
node.writeSingleRegister(0x40001,1);//將1寫(xiě)入0x40001保持寄存器
lcd.setCursor(0,1);
lcd.print(“ S1:1”);
}
else
{
節(jié)點(diǎn).writeSingleRegister(0x40001,0);//將0到0x40001寫(xiě)入保持寄存器
lcd.setCursor(0,1);
lcd.print(“ S1:0”);
}
if(b == 1)
{
node.writeSingleRegister(0x40002,1);//寫(xiě)入1到0x40002的保持寄存器
lcd.setCursor(8,1);
lcd.print(“ S2:1”);
}
else
{
節(jié)點(diǎn).writeSingleRegister(0x40002,0);//將0到0x40002寫(xiě)入保持寄存器
lcd.setCursor(8,1);
lcd.print(“ S2:0”);
}
}
責(zé)任編輯:wv
-
MODBUS
+關(guān)注
關(guān)注
28文章
2123瀏覽量
79592 -
Arduino
+關(guān)注
關(guān)注
190文章
6498瀏覽量
192188
發(fā)布評(píng)論請(qǐng)先 登錄
PLC與從站遠(yuǎn)距離通信:PXB-6030D的妙用

CAN從站轉(zhuǎn)Modbus TCP主站總線協(xié)議轉(zhuǎn)換網(wǎng)關(guān)

DeviceNet從站轉(zhuǎn)Modbus RTU主站:電力行業(yè)智能化升級(jí)的關(guān)鍵紐帶
Profibus DP主站如何轉(zhuǎn)Modbus TCP?

Profibus DP主站轉(zhuǎn)Modbus TCP網(wǎng)關(guān)配置文件制作

三格電子-EtherCAT從站轉(zhuǎn)ModbusTCP主站/從站網(wǎng)關(guān)

Profinet通訊網(wǎng)關(guān)模塊之Modbus TCP從站轉(zhuǎn)profinet主站案例

EtherCAT主站轉(zhuǎn)Modbus-RTU總線協(xié)議網(wǎng)關(guān)

Modbus RTU轉(zhuǎn)CC-Link協(xié)議網(wǎng)關(guān)(CC-Link轉(zhuǎn)Modbus RTU)

EtherCAT主站ModBus TCP從站總線協(xié)議轉(zhuǎn)換網(wǎng)關(guān)配置詳情

Modbus-TCP主站轉(zhuǎn)CC-Link IEFB協(xié)議網(wǎng)關(guān)(YC-CCLKIE-TCP)

EtherCAT主站轉(zhuǎn)Modbus TCP從站協(xié)議網(wǎng)關(guān)(JM-ECTM-TCP)

Modbus TCP轉(zhuǎn)Profinet主站協(xié)議網(wǎng)關(guān)(JM-PNM-TCP)

Modbus(TCP)轉(zhuǎn)Profinet從站協(xié)議網(wǎng)關(guān)(JM-TCP-PN)

評(píng)論