LabVIEW與Arduino的Modbus通訊實現

Arduino的串口通訊庫

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"n#include "Modbus.h"n#include "ModbusSerial.h"nnconst int LED_COIL=13;nconst int LEDPin=13;nModbusSerial mb;nnvoid setup() {n // put your setup code here, to run once:n//Config Modbus Serial(port,speed,byte format)nmb.config(&Serial,9600,SERIAL_8N1);n//slave ID 1-247nmb.setSlaveId(1);nmb.addCoil(LED_COIL,false);npinMode(LEDPin,OUTPUT);n}nnvoid loop() {n // put your main code here, to run repeatedly:nmb.task();ndigitalWrite(LEDPin,mb.Coil(LED_COIL));n}n

上位LabVIEW端

採用Modbus協議後上位在LabVIEW端實現就簡單了很多,調用LabVIEW自帶的Modbus庫即可,程序示意如下(圖形化語言就沒法拷代碼了):

image

image

當然,上位程序的Python實現也並不複雜,可以使用PySerial,pymodbus,pymodbus-tk等庫實現,相應的常式我們在後續開發中也會進行測試與發布


推薦閱讀:

LabVIEW這麼反人類的東西到底哪些人在用?他們看中了LabVIEW的哪些優點?
Matlab 與 Labview 哪個對電氣控制工作更有幫助?
學labview對學嵌入式有什麼幫助嗎?
labview的數據流編程思想是什麼意思?

TAG:LabVIEW | Arduino | 通用串行总线 |