在 LoRaWAN 专用网络中添加无线 Modbus RS485-LN Dragino LoRa 接口

描述

有许多Modbus/RS485应用程序和安装可以从RS485设备和硬件的无线接口中受益。对于具有小数据有效负载且间歇性报告的RS485设备,LoRa无线协议是一个很好的选择,可以提供长距离和低功耗的优势。
Dragino的RS485-LN提供了连接各种RS485传感器和硬件的手段,发送定制的Modbus命令来读取/控制RS485设备,并将产生的RS485数据/信息上传到LoRaWAN网络。本项目设置RS485-LN和Seeed的S-TH-01 RS485温湿度传感器,通过LoRa查询温湿度数据并上传温湿度数据。
该项目还讨论了将传感器节点添加到现有的基于ChirpStack的私有LoRaWAN网络和Machinechat的JEDI Pro物联网软件平台上。LoRaWAN网络使用Seeed的IP67等级工业LoRaWAN网关, 将LoRa传感器数据包转发到在Seeed的ReServer上运行 (安装了Ubuntu linux)的专用ChirpStack LoRaWAN网络服务器,。Machinechat的JEDI Pro物联网平台运行在同一个ReServer上。

硬件

软件

  • JEDI Pro或JEDI Pro SSE
    适用于物联网数据收集、可视化、监控和数据存储的软件,可集成到物联网解决方案中。功能包括:收集来自传感器、设备和机器的数据;构建直观的实时和历史数据以及系统视图仪表板;创建规则,自动监控和响应数据情况;通过电子邮件和短信接收警报通知。JEDI Pro SSE是JEDI Pro的Seeed工作室版版本,为Seeed的SenseCAP LoRaWAN传感器系列增加了一个数据收集器

  • ChirpStack
    ChirpStack开源LoRaWAN网络服务器堆栈为LoRaWAN网络提供开源组件。模块化的架构使得在现有的基础设施内集成成为可能。

  • Modbus
    组织是一个由自动化设备的独立用户和供应商组成的组织,旨在推动Modbus通信协议套件的采用,并为多个细分市场的分布式自动化系统解决架构问题。

背景

这篇文章是一个后续项目,建立在相关的技术论坛文章的基础上:使用 Machinechat 和 Seeed SenseCAP 建立一个私有的 LoRaWAN 传感器网络
其中详细介绍了使用Digi-Key提供的现成硬件和软件建立一个私人LoRaWAN物联网传感器网络。相关项目中使用的软件包括Machinechat的JEDI Pro应用软件和ChirpStack的LoRaWAN网络服务器应用程序。项目中使用的硬件包括Seeed reServer x86服务器和SenseCAP室外LoRaWAN网关。在本项目中,Dragino RS485- ln用于读取Seeed S-TH-1传感器的温度、湿度和露点寄存器,并通过LoRaWAN网络上传传感器数据。

image
Dragino RS485-LN
Dragino RS485-LN 是一款RS485转LoRaWAN转换器,将RS485数据转换成远程无线LoRa有效载荷,传输到LoRaWAN网关。对于数据上行,RS485- ln配置为向所连接的RS485设备发送用户自定义命令并读取其响应。然后,RS485- ln根据用户定义的规则处理响应,构建数据负载,通过LoRa上传到LoraWAN服务器。数据下行时,RS485- ln运行在LoRaWAN C类,接收RS485/Modbus命令。当LoRaWAN服务器有下行命令时,RS485- ln将LoRaWAN服务器的命令转发给所连接的RS485设备。RS485- ln允许用户监控/控制RS485设备,并达到极远的范围。它提供超长距离扩频通信和高抗干扰性,同时最大限度地减少电流消耗。

image

Seeed S-TH-1 RS485 温湿度传感器
S-TH-01模块在一个小尺寸传感器中提供工业级传感和紧凑型空气温湿度传感。S-TH-1由3.6-30V直流电源供电,通信通过RS485,遵循Modbus协议。

RS485传感器通信测试

测试与正在使用的传感器的RS485通信始终是一个很好的做法。这是通过使用Windows PC上运行的RealTerm串行终端来完成的,该终端连接到USB到RS485转换器,通过RS485连接到被测试的传感器。在本项目中,使用Waveshare USB到RS232/485/TTL转换器连接Seeed温湿度传感器,如下图所示SeeedSTH1TempRS485Test:

一旦传感器连接并通电,启动RealTerm并连接到Waveshare USB到RS232/485/TTL转换器的COM端口。RS485通信可以通过向传感器发送有效命令并监控响应来测试。注意:传感器的地址位于传感器电缆上的标签上,恰好是十进制42(十六进制0x2A)。
选择“Send”页签,输入Modbus命令为十六进制值,选择“Send Numbers”。在下面的示例中,命令为“2A0302000002C3A8”(读取服务器地址和波特率码寄存器)

示例 1 (读取服务器地址和波特率码寄存器)
命令(客户端)-“2A0302000002C3A8”
2A服务器地址
03 Modbus功能码3 -读取保持寄存器
02 起始地址Hi字节
00 起始地址Lo字节
00 寄存器数量Hi字节
02 寄存器数量Lo字节
C3 CRC Hi字节
A8 CRC Lo字节

响应(服务器)-“2A0304002A000300F8”
2A 服务器地址
03 Modbus功能码3 -读取持有寄存器
04 字节计数
002A 字节1,2(服务器地址= 2A)
0003 字节3,4(波特率码= 3 = 9600波特)
00 CRC Hi字节
F8 CRC Lo字节

2 (读取温度、湿度和露点寄存器)
命令(客户端)-“2A0400000003B610”
2A 服务器地址
04 Modbus功能码4 -读取输入寄存器)
00 起始地址Hi字节
00 起始地址Lo字节
00 寄存器数量Hi字节
03 寄存器数量Lo字节
B6 CRC Hi字节
10 CRC Lo字节

响应(服务器)- " 2A040607310D1400CFF4ED "
2A 服务器地址
04 Modbus功能码4 -读取输入寄存器
06 字节计数
0731 字节1,2(温度= 1841/100 = 18.41C)
0D14 字节3,4(湿度= 3348/100 = 33.48%)
00CF 字节5,6(露点= 207/100 = 2.07C)
F4 CRC Hi字节
ED CRC Lo字节

关于Modbus通信示例的详细信息请参见 S-TH-1 Air Temperature and HumiditySensor-Data Sheet 的6.4.2节。

建立RS485-LN,实现RS485与LoRa通信

对于本项目,需要配置RS485-LN,通过RS485向S-TH-1传感器发送适当的Modbus命令,以读取输入寄存器的温度,湿度和露点。接下来,需要对其进行配置,以构建适当的数据有效负载,以便通过LoRa上行到LoRaWAN网关。为了配置RS485-LN,需要为其供电,并通过编程电缆连接串行终端,如图所示方案图DraginoRS485LN_ProgramCable

电气连接列于下表:

RS485-LN FTDI 串口线 电力供应 电脑
Vin - - 接地 -
Vin + - + 12 v直流 -
PRO-txd(红色) 4 - tx(橙色) - -
PRO-rxd(白色) 5 - rx(黄色) - -
PRO-gnd(黑) 1 - GND(黑色) - -
- USB - USB

在本项目中,RS485-LN连接到单个RS485设备Seeed S-TH-1传感器,需要配置发送相应的RS485命令来读取温度、湿度和露点寄存器,并构建数据负载,通过LoRa发送到LoRaWAN服务器。RS485-LN用户手册S-TH-1数据手册都是配置RS485-LN时需要参考的重要文档。

1 - 配置RS485-LN for Modbus命令。
RS485-LN使用“AT+COMMANDx=x y z…”命令类型创建RS485命令,发送到所连接的RS485设备。由于只有一个S-TH-1 RS485设备,因此命令为“AT+ command1 = 2A 04 000 000 000 03,1”

描述
2 服务器地址
04 Modbus功能代码4 -读取输入寄存器
00 起始地址Hi字节
00 起始地址Lo字节
00 寄存器数量Hi字节
03 寄存器的数量
1 在命令末尾添加CRC-16/MODBUS

2 - 配置RS485-LN,从S-TH-1传感器响应中构建适当的数据负载。
RS485-LN使用“AT+DATACUTx=x,y,z…”命令类型来构建要通过LoRa上传的传感器响应的数据有效载荷。由于只有一个S-TH-1 RS485设备连接,命令响应是11字节的日志,所以使用的命令是“AT+DATACUT1=11,2,1~11”(上传命令响应的所有字节)

描述
11 AT+COMMAND的响应长度(以字节计)
2 按字节段抓取有效值
1 ~ 11 定义有效值的位置(字节1到11)

3 - 配置RS485-LN参数的有效载荷版本,采样率和上传配置。
本项目设置“AT+PAYVER=9”(有效载荷版本9)、“AT+TDC=60000”(采样延时60秒)、“AT+DATAUP=0”(单上行上传数据)

建立和测试用于LoRa通信的S-TH-1和RS485-LN

将编程线缆连接串口和RS485-LN程序连接器。RS485-LN A+、B-、RS485gnd和电源端子接在S-TH-1传感器上,如下图所示。RS485-LN和S-TH-1都由同一个12VDC电源供电。
(参见Scheme-it Project:DraginoRS485_SeeedSTH1_Pcable

确定RS485-LN设备EUI和APPKEY

使用TeraTerm(或类似的串行终端程序)和FTDI USB转TTL适配器连接到如上所示的程序电缆上。连接成功后,先输入“123456”密码,再输入“AT+CFG”打印配置数据(包括设备EUI和APPKEY)。注:见下面的示例数据

AT+DEUI=a8 40 41 b1 31 84 7d fa
AT+DADDR=01847DFA
AT+APPKEY=12 34 56 78 90 1a 1b 1c 1d 1f 2a 2b 2c 2d 2e 2f
AT+NWKSKEY=cb ee cf 7c 9d c4 d1 9f c4 64 26 b9 2b d7 8d 91
AT+APPSKEY=f8 d9 c9 a9 f6 55 12 cb fd 5b ab 74 36 ec 62 f1
AT+APPEUI=a8 40 41 00 00 00 01 01
AT+ADR=1
AT+TXP=5
AT+DR=1
AT+DCS=0
AT+PNM=1
AT+RX2FQ=923300000
AT+RX2DR=8
AT+RX1DL=1000
AT+RX2DL=2000
AT+JN1DL=5000
AT+JN2DL=6000
AT+NJM=1
AT+NWKID=00 00 00 00
AT+FCU=698
AT+FCD=740
AT+CLASS=C
AT+NJS=1
AT+RECVB=0:
AT+RECV=0:
AT+VER=v1.3 US915
AT+CFM=0
AT+CFS=0
AT+SNR=0
AT+RSSI=0
AT+RJTDC=20
AT+RPL=4
AT+TDC=60000
AT+PORT=2
AT+RX1WTO=24
AT+RX2WTO=7
AT+INTMOD=2
AT+PWORD=123456
AT+MBFUN=0
AT+BAUDR=9600
AT+PARITY=0
AT+STOPBIT=0
AT+DATAUP=0
AT+PAYVER=9
AT+CHS=0
AT+CHE=0
Use default channel
AT+COMMAND1=2a 04 00 00 00 03 ,1     AT+DATACUT1=11,2,1~11     AT+CMDDL1=0
AT+COMMAND2=0,0     AT+DATACUT2=0,0,0     AT+CMDDL2=0
AT+COMMAND3=0,0     AT+DATACUT3=0,0,0     AT+CMDDL3=0
AT+COMMAND4=0,0     AT+DATACUT4=0,0,0     AT+CMDDL4=0
AT+COMMAND5=0,0     AT+DATACUT5=0,0,0     AT+CMDDL5=0
AT+COMMAND6=0,0     AT+DATACUT6=0,0,0     AT+CMDDL6=0
AT+COMMAND7=0,0     AT+DATACUT7=0,0,0     AT+CMDDL7=0
AT+COMMAND8=0,0     AT+DATACUT8=0,0,0     AT+CMDDL8=0
AT+COMMAND9=0,0     AT+DATACUT9=0,0,0     AT+CMDDL9=0
AT+COMMANDA=0,0     AT+DATACUTA=0,0,0     AT+CMDDLA=0
AT+COMMANDB=0,0     AT+DATACUTB=0,0,0     AT+CMDDLB=0
AT+COMMANDC=0,0     AT+DATACUTC=0,0,0     AT+CMDDLC=0
AT+COMMANDD=0,0     AT+DATACUTD=0,0,0     AT+CMDDLD=0
AT+COMMANDE=0,0     AT+DATACUTE=0,0,0     AT+CMDDLE=0
AT+COMMANDF=0,0     AT+DATACUTF=0,0,0     AT+CMDDLF=0

将RS485-LN添加到ChirpStack LoRaWAN网络服务器中

(注意:这个项目和下面的步骤假设一个基于ChirpStack的私有LoRaWAN网络是活跃的,并且在LoRa-E5传感器节点的范围内,参考技术论坛帖子使用 Machinechat 和 Seeed SenseCAP 建立一个私有的 LoRaWAN 传感器网络)

1 - 在ChirpStack中,选择设备配置文件并创建。名称设备配置文件“DraginoRS485LN”,LoRaWAN MAC版本选择“1.0.3”,LoRaWAN区域参数版本选择“A”,ADR算法选择“Default ADR algorithm”,上行间隔输入“3600”。在JOIN(OTAA/ABP) 选项卡中,选中“Device supports OTAA”。

2 - 在ChirpStack中,选择应用程序,然后选择“FarmTest”,然后选择创建。设备名称输入“DraginoRS485LN”,设备描述输入“description”,RS485-LN输入“设备EUI”(由上一步“Determine RS485-LN device EUI and APPKEY”确定),设备配置文件输入“DraginoRS485LN”,选择创建设备。(注意:对于初始测试和演示,您可能需要勾选“Disable frame-counter validation”选项)

3 - 为设备添加应用程序密钥。从上一步“Determine RS485-LN device EUI and APPKEY” ,并选择SET DEVICE-KEYS。

一旦设置了DEVICE-KEYS, RS485-LN应该加入LoRaWAN网络并开始上传传感器数据有效载荷。您可以转到“Applications/FarmTest”查看RS485-LN是否已加入ChirpStack:

一旦RS485-LN加入,您可以通过展开其中一条消息来查看它的“DEVICEDATA”:

下面扩展的“DEVICEDATA”示例显示了base64编码的数据负载:

开发和添加CODEC到ChirpStack设备配置文件

为了使ChirpStack从数据有效载荷中解码更有意义的信息,必须在DraginoRS485LN设备配置文件中指定CODEC。由于RS485-LN几乎可以用于任何RS485设备类型和多个设备,因此需要专门为RS485-LN / S-TH-1传感器数据负载开发自定义Java脚本CODEC,并保存在设备配置文件中。

1 - 第一步是解码一个base64编码的有效载荷示例,以确定数据参数和相关位置,以便开发编解码器。一个示例编码负载可以从DraginoRS485LN“设备DATA”中复制,并使用在线base64到十六进制解码器(如https://www.asciitohex.com/)进行解码。一个编码有效载荷的例子是“CSoEBgbnEB8BtIrz”。这被解码为十六进制字节序列“09 2a 04 06 06 e7 10 1f 01 b4 8a f3”。回顾RS485-LN配置中使用的“AT+DATACUT”命令,其转换为以下内容:

字节 描述
09 0 有效载荷的版本
2 1 服务器地址
04 2 Modbus功能代码4 -读取输入寄存器
06 3 字节数
06 e7 4、5 字节1,2 (temp = 1767/100 = 17.67
10 1 f 6、7 字节3,4(湿度= 4127/100 = 41.27%
01 b4 8、9 字节5,6(露点= 436/100 = 4.36 C
8 10 CRC Hi字节
f3 11 CRC低字节

2 - 为了这个项目的目的,下面的编解码器被开发来解码有效载荷版本,硬件,温度,湿度和露点值从有效载荷。

// Decode decodes an array of bytes into an object.
//  - fPort contains the LoRaWAN fPort number
//  - bytes is an array of bytes, e.g. [225, 230, 255, 0]
//  - variables contains the device variables e.g. {"calibration": "3.5"} (both the key / value are of type string)
// The function must return an object, e.g. {"temperature": 22.5}
function Decode(fPort, bytes) {
    //Payload Formats of RS485LN with S-TH-1 sensor or Unknown HW      
  	  var hardware= ((bytes[0])>>3 & (bytes[1])>>5);      
      var decode = {};
      
      if(hardware=='1')
      {
        decode.Hardware="RS485LN_STH1";
        decode.PayloadVer = parseFloat((bytes[0]).toFixed());
        decode.STH1_temp= parseFloat(((bytes[4]<<24>>16 | bytes[5])/100).toFixed(3));
        decode.STH1_humid= parseFloat(((bytes[6]<<24>>16 | bytes[7])/100).toFixed(3));
        decode.STH1_dewpt= parseFloat(((bytes[8]<<24>>16 | bytes[9])/100).toFixed(3));        
      }
      else 
      {
        decode.Hardware= "Unknown HW";
      }
    
            
      if(bytes.length==12)
      {
        return decode;
      }
    }

3 - 测试编解码器
进入“设备配置文件”,选择“Dragino RS485LN”。选择“CODEC”并将上面的Javascript代码粘贴到解码部分,然后选择“UPDATE-DEVICE PROFILE”。现在打开“Applications/FarmTest/Devices/DraginoRS485LN”,查看“DEVICE DATA”。打开一个框架,你应该会看到编码和解码的JSON数据,如下图所示。

设置和测试ChirpStack HTTP集成与JEDI Pro通用LoRaWAN自定义数据收集器

修改ChirpStack,增加HTTP集成,用于将LoRaWAN元数据和传感器数据转发到指定IP地址。Machinechat的通用LoRaWAN自定义数据收集器插件用于监听指定的IP地址并解析LoRaWAN数据以供审查(启用调试时)并在JEDI Pro平台中使用。
(注1:自定义数据收集器由两个文件组成,lorawan-linux.bin和config。

https://support.machinechat.io/hc/en-us/articles/6046199010327-Generic-LoRaWAN-Custom-Data-Collector-Beta-for-JEDI-PRO-Linux )

(注2:如果你之前已经在 你的系统上设置了ChirpStack HTTP集成,你可以跳过第1-4节,直接进入第5步)

1 - 在ChirpStack中启用HTTP集成。
在ChirpStack集成界面中选择“添加”。

2 - 选择“JSON”作为有效载荷封送器,添加IP地址(使用与配置
相同的IP地址)。为Endpoint URL 添加ip地址,然后选择ADD INTEGRATION

3 - 拷贝lorawan-linux.binconfig. bin 。到 Ubuntu Linux Mini-PC上安装JEDI Pro的~/jedi/plugins目录下。修改config. yml 文件开启调试,并指定IP监听地址。
(注意:如果你之前已经安装了lorawan-linux.bin config. yml 文件。Yml文件对于不同的传感器,你所需要做的就是编辑config.yml 如步骤5所示,添加S-TH-!传感器温度、湿度和露点参数)。

4 - 在命令行中使用*“* 。**/lorawan-linux.bin ./config 运行自定义插件。在 Ubuntu Linux Mini-PC 的终端上运行 yml ,并监控输出数据。数据应该类似于下面(注意:记得让lorawan-linux.bin文件可执行):

5 - 编辑配置。将LoRaWAN数据映射到JEDI Pro数据参数并关闭调试。在本工程示例中,请编辑 propertyNames so LoRaWAN cSproperty:
“SHT1_temp”
映射到 mcProperty: “SHT1temperature” and LoRaWAN cSproperty:
“SHT1_humid”
映射到 mcProperty:
“SHT1humidity”
and LoRaWAN *cSproperty: “SHT1_dewpt”*映射到 mcProperty: “SHT1dewpoint” .通过设置“setDebug:”为false关闭调试并保存文件。

设置JEDI Pro自定义数据收集器和数据仪表板

在JEDI Pro中,选择“Settings”选项卡,然后选择“Data Collectors”,然后选择“Add Collector”。(注意:如果您之前已经将LoRaWAN自定义数据收集器添加到JEDI应用程序中,则无需执行此步骤)

如下图所示配置Collector。将数据收集器命名为“LoRaWAN”(或您喜欢的任何名称),选择“Collector Type”为“Custom Plug-In”,选择“LoRaWAN -linux.bin”作为插件可执行文件,输入配置位置。Yml文件(例如:“/home/scottr/jedi/plugins/config. bin”)。yml“Plug-in选项”,选中“Run As Background Process and Monito”复选框,然后选择“VALIDATE PLUG-IN”以验证功能。

在JEDI Pro中,选择“Data Dashboards”,然后选择“+”来添加一个新图表。配置STH1温度,湿度,露点的数据图表,并选择“添加”以包含在您的数据仪表板中。

结论

RS485LN显着扩展了专用LoRaWAN的功能,可以添加几乎任何类型的RS485/Modbus传感器或设备。另一个潜在的好处是在现有的RS485/Modbus安装中添加无线LoRaWAN网络和物联网软件平台数据收集、可视化、监控和数据存储功能。项目示例可以根据需要轻松扩展和修改其他传感器,应用程序和用例。

参考文献