LabVIEW与Arduino的Modbus通讯实现 点击:1983 | 回复:1



维思自动化

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:20帖 | 8回
  • 年度积分:0
  • 历史总积分:65
  • 注册:2016年1月07日
发表于:2017-12-18 16:04:36
楼主

rduino的串口通讯库

Arduino作为一款功能强大,使用便捷的开发板,在物联网、智能家居与工业信息化等各个方面应用逐渐广泛,最近由于项目的需要,我们也采用Arduino
进行一系列产品的开发。为了简化产品开发流程,在架构上我们使用计算机作为上位界面,在Arduino端仅实现控制与采集功能。这就涉及到Arduino与计算机之间的通讯与连接问题。
根据官方的相关资料,Arduino与计算机之间的通讯方式大致可分为两种。

一种是直接利用Arduino自带的串口,通过串口协议进行通讯。这种方式有最大的灵活性,Arduino端可以实现必要的功能代码,仅通过串口与上位计算机进行数据交换。缺点是需要在上位计算机与Arduino端分别写程序并实现完整的通讯协议。

第二种方法是采用成熟的固件Firmware,比如用于python通讯的pyFirmware或者用于与LabVIEW通讯的LIFA或者LINX等。固件其实是将串口通讯中几种常用命令固化在Arduino板中,仅通过上位接口发送相关指令即可实现功能。这一方法的优势在于实施简单,但缺点也很明显—功能非常有限,不支持高级功能的扩展,从某种意义上,完全没有发挥Arduino应有的性能,而只是将其作为了一个简单的硬件接口。
关于Arduino通讯方法的详细说明,可以参考官方文档

Arduino Modbus通讯库

结合上述两种通讯方法的优劣,考虑到工业通讯中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));

}


上位LabVIEW端

采用Modbus协议后上位在LabVIEW端实现就简单了很多,调用LabVIEW自带的Modbus库即可,程序示意如下(图形化语言就没法拷代码了):

当然,上位程序的Python实现也并不复杂,可以使用PySerial,pymodbus,pymodbus-tk等库实现,相应的例程我们在后续开发中也会进行测试与发布

作者:西安维思自动化工程有限公司  魏智勇




wayaj

  • 精华:30帖
  • 求助:95帖
  • 帖子:5269帖 | 8770回
  • 年度积分:0
  • 历史总积分:28783
  • 注册:2020年5月25日
发表于:2017-12-18 18:00:04
1楼

读二种语言!!


热门招聘
相关主题

官方公众号

智造工程师