在本篇文章,Arduino作为MODBUS主站(Master)与MODBUS从站(Slave)进行通信。本文中将使用安装MODBUS Slave Software的计算机用作MODBUS从站。那么,让我们首先简要介绍一下RS-485和Modbus。
RS-485串行通信
RS-485是一种异步串行通信协议,不需要时钟。它使用称为差分信号的技术将二进制数据从一个设备传输到另一个设备。当使用两根电线时,它提供半双工通信,而全双工需要4条电线。
RS-485模块可以连接到任何带有串行端口的微控制器。微控制器使用RS-485模块时,需要一个基于Maxim MAX485的5V MAX485 TTL到RS485的模块,因为它允许1200米长距离的串行通信。它是双向和半双工的,数据传输速率为2.5 Mbps。该模块需要5V的电压。
RS-485模块的引脚输出定义:
USB转RS-485转换模块:
这是一个USB转RS485转换器适配器模块,支持WIN7、XP、Linux、Mac OS,并通过使用计算机中的COM端口提供易于使用的RS485接口。该模块是即插即用设备。没有命令结构,发送到虚拟COM端口的任何内容都会自动转换为RS485,反之亦然。该模块完全由USB总线供电。因此,无需外部电源即可运行。
它显示为串行/ COM端口,可从应用程序或超级终端访问。该转换器提供半双工RS-485通信。波特率范围为75 bps至115200 bps,最高可达6 Mbps。
要使用此设备,互联网上提供了各种Modbus软件。在本教程中,使用了来自Witte Software的名为Modbus Slave软件的软件。该软件可从www.modbustools.com网站下载。
Modbus Slave软件
Modbus Slave应用程序通过使用串行通信端口从任何Modbus主站设备接收值。它是一种数据通信测试软件。在使用该软件之前,必须了解以下事项。有关更多信息,请参阅软件手册。
SlaveID:网络中的每个从站都分配有1到127的唯一单元地址。当主站请求数据时,它发送的第一个字节是从站地址。这样,每个从设备在第一个字节之后知道是否忽略该消息。
Modbus寄存器:
离散输出线圈:它是一个1位寄存器,用于控制离散输出,可以读取或写入。它们的寄存器编号为(1至9999)。
离散输入:它是一个1位寄存器,用作输入,只能读取。他们有(10001年至19999年)的登记号码。
输入寄存器:用于输入的16位寄存器,只能读取。它们的寄存器编号为(30001至39999)。
保持寄存器:它是一个16位寄存器,可以读写。它们的寄存器编号为(40001至49999)。
Modbus功能代码:
CRC:CRC代表循环冗余校验。它是在每个Modbus消息的末尾添加两个字节以进行错误检测。
需要的组件
● Arduino UNO开发板
● MAX-485 TTL转RS-485转换模块
● USB转RS-485转换模块
● 1602 LCD显示屏
● Modbus Slave
电路原理图
MAX-485 TTL至RS-485转换器模块与Arduino UNO之间的电路连接:
带有10k下拉电阻的两个按钮也连接到Arduino引脚4和5。10K电位器用于为Arduino引脚A0提供模拟输入值。
电路连接后,完整设置如下所示。
编程Arduino Uno作为MODBUS Master
在本文中,Arduino Uno配置为Modbus Master,通过Modbus Master库编写Master Modbus Arduino代码。在这里,Arduino Uno有两个按钮和一个电位器,用于将Modbus Master Arduino的值发送到Modbus Slave软件。
为了在Arduino UNO中使用Modbus,使用库
本文末尾处给出了完整的代码。这里我们解释了下面的一些主要步骤。
首先,包括ModbusMaster和Liquid Crystal库:
#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 setup()中,LCD设置为1602模式,并显示欢迎信息。
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引脚设置为低电平
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);
◾ 然后将ADC值(0到1023)写入0x40000寄存器,使用以下语句将其发送到Modbus Slave。
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);
◾ 根据按钮的状态,按钮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 Master
电路连接完成后,将代码上传到Arduino Uno,现在可以将USB转RS-485模块连接到安装了Modbus Slave软件的计算机。
注意:打开设备管理器,根据连接USB转RS-485模块的PC检查COM端口,然后打开Modbus Slave软件。
1. Modbus Slave Tool如下所示,表示无连接。
2.下一步打开Connection->Connect...,显示如下。
3.它显示以下对话框,因为该软件是试用版,因此请单击“稍后注册”
4. 此试用软件仅在打开后运行10分钟。
5. 连接细节如下所示。将连接设置为串行端口,将串行设置设置为连接USB转RS-485模块的相应COM端口。然后将波特率设置为115200,数据位为8,无奇偶校验,1个停止位和模式为RTU,然后单击“确定”。
6. 请注意,显示No connection,现在打开Setup-> Slave Definition。
7.现在Slave ID字段输入1,Function选择03保持寄存器,以及地址设置为0,然后单击OK。
8. 之后,将ID验证为1,将F为03.。在本文中,使用前三个寄存器(0-电位器ADC值,1-Push按钮值,2-Push按钮值)。
9. 现在按下按钮2。注意第三行中的值1。当没有按下按钮1时,它在第二行中保持为0,在第一行中显示电位器值。
10. 按下按钮1时。注意第二行中的值1。并且由于没有按下按钮2所以它在第三行保持为0,第一行中显示电位器值。
11. 现在当按下两个按钮时,在第二行和第三行中都有值1,并且还记下电位计值。
12. 当电位计变化时,Modbus从站软件中的第1行也会发生变化。
以上就是Arduino UNO作为Master如何进行RS-485 Modbus串行通信。
编辑:hfy
评论
查看更多