在Galileo gen 2上使用ModBus RTU的任何人?

时间:2015-08-17 12:14:09

标签: arduino modbus intel-galileo

我正在尝试通过我的英特尔Galileo Gen2主板与ModBusRTU上的某些工业硬件进行通信。 我使用这块板将UART转换为RS485 http://linksprite.com/wiki/index.php5?title=RS485_Shield_V2.1_for_Arduino,我可以在Arduino(与2/3引脚上的SoftwareSerial)和Galileo(引脚0/1上的Serial1)之间串行通话。所以我知道RS485的链接正在运行。

使用Arduino Uno我可以使用ModBusRTU与我的设备通话,感谢这个库https://github.com/4-20ma/ModbusMaster

在伽利略的Gen2我receveid此警告“警告:库ModbusMaster声称在[AVR,SAM]架构(一个或多个)上运行,并且可以是与它运行在[i586的]架构(一个或多个)当前板不相容。 “因为不同的架构。

现在我正在尝试使用关于modbus的烹饪黑客教程和arduino,raspberry和galileo的rs485的例子,但我不能让它对我有用。我收到了大量的编译错误:

C:\英特尔\ Arduino的1.6.4 \库\ ModBusMaster485 \ ModbusMaster485.cpp:在 'uint8_t ModbusMaster485 :: ModbusMasterTransaction(uint8_t)' 的成员函数: C:\ Intel \ arduino-1.6.4 \ libraries \ ModBusMaster485 \ ModbusMaster485.cpp:701:50:错误:'_crc16_update'未在此范围内声明

C:\ Intel \ arduino-1.6.4 \ libraries \ ModBusMaster485 \ ModbusMaster485.cpp:814:52:错误:'_crc16_update'未在此范围内声明

C:\ Intel \ arduino-1.6.4 \ libraries \ ModBusMaster485 \ ModbusMaster485.cpp:在全球范围内:

C:\ Intel \ arduino-1.6.4 \ libraries \ ModBusMaster485 \ ModbusMaster485.cpp:881:14:错误:'unsigned int ModbusMaster485 :: makeWord(unsigned int)'的原型与类'ModbusMaster485中的任何一个都不匹配“

在C:\ Intel \ arduino-1.6.4 \ libraries \ ModBusMaster485 \ ModbusMaster485.cpp:25:0中包含的文件中: C:\ Intel \ arduino-1.6.4 \ libraries \ ModBusMaster485 \ ModbusMaster485.h:302:11:错误:候选者是:uint16_t ModbusMaster485 :: makeWord(uint8_t,uint8_t)

C:\ Intel \ arduino-1.6.4 \ libraries \ ModBusMaster485 \ ModbusMaster485.h:301:14:错误:uint16_t ModbusMaster485 :: makeWord(uint16_t) C:\ Intel \ arduino-1.6.4 \ libraries \ ModBusMaster485 \ ModbusMaster485.cpp:887:14:错误:'unsigned int ModbusMaster485 :: makeWord(uint8_t,uint8_t)'的原型与类'ModbusMaster485'中的任何一个都不匹配< / p>

在C:\ Intel \ arduino-1.6.4 \ libraries \ ModBusMaster485 \ ModbusMaster485.cpp:25:0中包含的文件中: C:\ Intel \ arduino-1.6.4 \ libraries \ ModBusMaster485 \ ModbusMaster485.h:302:11:错误:候选者是:uint16_t ModbusMaster485 :: makeWord(uint8_t,uint8_t) C:\ Intel \ arduino-1.6.4 \ libraries \ ModBusMaster485 \ ModbusMaster485.h:301:14:错误:uint16_t ModbusMaster485 :: makeWord(uint16_t) 编译错误。

有人让ModBus在Galileo Gen2上工作吗?

谢谢你, 醛

1 个答案:

答案 0 :(得分:1)

失败的几个原因

  • crc16库代码

ModbusMaster485代码假定使用avr头文件util / crc16.h文件 - 实际上,如果你仔细查看avr汇编指令 - 第一步是删除这种依赖。

--- ModbusMaster485.h.orig  2015-09-28 13:55:48.000000000 +0200
+++ ModbusMaster485.h   2015-09-28 13:56:00.000000000 +0200
@@ -92,7 +92,7 @@

 /* _____PROJECT INCLUDES_____________________________________________________ */
 // functions to calculate Modbus Application Data Unit CRC
-#include <util/crc16.h>
+//#include <util/crc16.h>

当然;你需要在C中提供相关的crc16代码 - 稍后会进入

  • sizeof(int)!= 16,实际上是32

您抱怨的最后一个错误是编译器的候选者找出使用哪种方法。它归结为使用“unsigned int”而不是“uint16_t” - 所以,一个简单的更改,你还需要添加缺少的引用的crc16函数。

--- ModbusMaster485.cpp.orig    2015-09-12 04:35:05.000000000 +0200
+++ ModbusMaster485.cpp 2015-09-28 13:56:54.000000000 +0200
@@ -29,7 +29,22 @@

 /* _____PROJECT INCLUDES_____________________________________________________ */

+uint16_t
+_crc16_update(uint16_t crc, uint8_t a)
+{
+    int i;

+    crc ^= a;
+    for (i = 0; i < 8; ++i)
+    {
+        if (crc & 1)
+            crc = (crc >> 1) ^ 0xA001;
+        else
+            crc = (crc >> 1);
+    }
+
+    return crc;
+}

 /* _____PUBLIC FUNCTIONS_____________________________________________________ */

@@ -878,13 +893,13 @@
 }


-unsigned int ModbusMaster485::makeWord(unsigned int w)
+uint16_t ModbusMaster485::makeWord(uint16_t w)
 {
    return w;
 }


-unsigned int ModbusMaster485::makeWord(uint8_t h, uint8_t l)
+uint16_t ModbusMaster485::makeWord(uint8_t h, uint8_t l)
 {
    return (h << 8) | l;
 }

你现在应该能够编译项目了:)

我必须这样做,甚至让项目编译Arduino到期 - 我现在正要测试它,看看这是否足以让这件事发生:) ...确认; Arduino Due上预期的功能 - 对于Intel Gallileo应该是相同的