本文介绍如何使用Arduino作为Modbus TCP从站,PC机为Modbus主站,安装ModScan用于主站调试,通过ModScan控制LED开关照明。相关软件可登录网信智汇(wangxinzhihui)下载。
1、运行Arduino IDE,点击“工具/管理库”,弹出库管理器,搜索modbus,加载ArduinoModbus库。
2、创建项目,输入以下代码:
//引入相关库文件
#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoRS485.h>
#include <ArduinoModbus.h>
//设置网络
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //设置Arduino网络MAC地址
IPAddress ip(192, 168, 1, 100); //设置Arduino网络IP地址
EthernetServer ethServer(502); //创建服务器对象,端口502
ModbusTCPServer modbusTCPServer; //创建ModbusTCPServer 对象
//采用PIN8输出,控制LED
const int ledPin = 8;
//主程序
void setup() {
//启动串口用于打印输出调试:
Serial.begin(9600);
//创建服务器连接
Ethernet.begin(mac, ip);
//检测网络硬件
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println("网卡设备未发现");
while (true) {
delay(1);
}
}
//离线检测
if (Ethernet.linkStatus() == LinkOFF) {
Serial.println("网卡未连接");
}
//启动服务器
ethServer.begin();
//启动Modbus TCP server
if (!modbusTCPServer.begin()) {
Serial.println("启动Modbus TCP Server失败!");
while (1);
}
// 配置LED
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
//Modbus TCP Server配置1个线圈,地址0x00
modbusTCPServer.configureCoils(0x00, 1);
}
//主循环
void loop() {
//侦听网络连接
EthernetClient client = ethServer.available();
if (client) {
// 发现一个新的连接
Serial.println("发现一个新的连接");
//接受连接
modbusTCPServer.accept(client);
while (client.connected()) {
// 接受modbus TCP主站轮询
modbusTCPServer.poll();
// 更新LED状态
updateLED();
}
Serial.println("连接断开");
}
}
// 更新LED状态
void updateLED() {
// 读取线圈状态
int coilValue = modbusTCPServer.coilRead(0x00);
if (coilValue) {
//线圈值为1,LED灯亮
digitalWrite(ledPin, HIGH);
} else {
//线圈值为0,LED灯灭
digitalWrite(ledPin, LOW);
}
}
3、编译,下载
4、在上位机上用Modscan,改变线圈00的数值,观察LED照明变化。
通过本案例,可以初步掌握Arduino Modbus TCP从站开发的基本知识,通过扩展,可开发出更丰富的功能。