Arduino作为一款功能强大,使用便捷的开发板,在物联网、智能家居与工业信息化等各个方面应用逐渐广泛,最近由于项目的需要,我们也采用Arduino
进行一系列产品的开发。为了简化产品开发流程,在架构上我们使用计算机作为上位界面,在Arduino端仅实现控制与采集功能。这就涉及到Arduino与计算机之间的通讯与连接问题。
根据官方的相关资料,Arduino与计算机之间的通讯方式大致可分为两种。
一种是直接利用Arduino自带的串口,通过串口协议进行通讯。这种方式有最大的灵活性,Arduino端可以实现必要的功能代码,仅通过串口与上位计算机进行数据交换。缺点是需要在上位计算机与Arduino端分别写程序并实现完整的通讯协议。
第二种方法是采用成熟的固件Firmware,比如用于python通讯的pyFirmware或者用于与LabVIEW通讯的LIFA或者LINX等。固件其实是将串口通讯中几种常用命令固化在Arduino板中,仅通过上位接口发送相关指令即可实现功能。这一方法的优势在于实施简单,但缺点也很明显—功能非常有限,不支持高级功能的扩展,从某种意义上,完全没有发挥Arduino应有的性能,而只是将其作为了一个简单的硬件接口。
关于Arduino通讯方法的详细说明,可以参考官方文档
结合上述两种通讯方法的优劣,考虑到工业通讯中Modbus已经是非常成熟的解决方案,如果能采用Modbus作为上位与Arduino间的通讯问题,即能解决自己编写串口命令协议的复杂性与不可靠性,又能解决直接写入firmware对Arduino的功能限制。这样才能在产品中得到最好的应用。
Arduino的Modbus通讯方案中,官方有不少成熟的库,经过再三选择,最后选择了modbus-arduino库作为解决方案,主要是考虑到该库可以完整实现Modbus Slave端的命令功能,该库我Fork到了自己的repository里,可供参考.modbus-arduino
Modbus-arduino库有详细的使用说明,以下为使用Arduino的13引脚LED等做测试的代码示例。由于仅用到了Modbus Serial,我没有导入整个库,只是把Modbus.h,Modbus.cpp以及ModbusSerial.h和ModbusSerial.cpp复制到项目文件夹下。
#include "Arduino.h"
#include "Modbus.h"
#include "ModbusSerial.h"
const int LED_COIL=13;
const int LEDPin=13;
ModbusSerial mb;
void setup() {
// put your setup code here, to run once:
//Config Modbus Serial(port,speed,byte format)
mb.config(&Serial,9600,SERIAL_8N1);
//slave ID 1-247
mb.setSlaveId(1);
mb.addCoil(LED_COIL,false);
pinMode(LEDPin,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
mb.task();
digitalWrite(LEDPin,mb.Coil(LED_COIL));
}
采用Modbus协议后上位在LabVIEW端实现就简单了很多,调用LabVIEW自带的Modbus库即可,程序示意如下(图形化语言就没法拷代码了):
当然,上位程序的Python实现也并不复杂,可以使用PySerial,pymodbus,pymodbus-tk等库实现,相应的例程我们在后续开发中也会进行测试与发布
作者:西安维思自动化工程有限公司 魏智勇