描述
这篇文章建立在早期的文章Advantech 工业级 LoRaWAN 无线输入/输出模块 WISE-4610 入门和详细使用WISE-4610的RS-485通信能力连接Modbus RS-485传感器和发送Modbus命令读取传感器。WISE-4610被添加到专用TTN LoRaWAN网络MQTT中,用于将传感器数据发送到Machinechat JEDI进行可视化。Seeed S-TH-01 RS-485温湿度传感器用于演示RS-485通信。
硬件
-
Advantech WISE-4610P-NA
LoRa/LoRaWAN无线I/O模块 -
Advantech WISE-S617T-A
模块化物联网I/O模块,与WISE-4600系列配对,包括2AI/2DI/1DO和1RS-485 -
Seeed101990881
产品型号:S-TH-01, rs485 -工业级空气温湿度传感器 -
AC/DC DIN导轨电源24VDC 36W输出
软件
-
Advantech WISE Studio
WISE-Studio是配置WISE模块的工具。该软件提供了一个基于web的界面,对于不同的型号是相似的。对于通过以太网、LAN或WLAN配置的WISE模块,WISE-Studio可以与WISE模块的内部web服务器进行通信。对于通过USB配置的模块,WISE-Studio在安装了该软件的计算机上执行web服务器。web服务器通过USB接口与WISE模块通信。 -
Things Stack
Things Stack是一个企业级LoRaWAN网络服务器,建立在开源核心之上。Things Stack允许您在自己的硬件或云中构建和管理LoRaWAN网络。 -
JEDI Pro或JEDI Pro SSE
适用于物联网数据收集、可视化、监控和数据存储的软件,可集成到物联网解决方案中。功能包括:收集来自传感器、设备和机器的数据;构建直观的实时和历史数据以及系统视图仪表板;创建规则,自动监控和响应数据情况;通过电子邮件和短信接收警报通知。JEDI Pro SSE是JEDI Pro的Seeed工作室版版本,为Seeed的SenseCAP LoRaWAN传感器系列增加了一个数据收集器 -
Modbus
Modbus是一个由自动化设备的独立用户和供应商组成的组织,旨在推动Modbus通信协议套件的采用,并为多个细分市场的分布式自动化系统解决架构问题。
背景
Advantech 的WISE-4610有多个I/O选项,以插件模块的形式连接到4610的基础。I/O选项包括模拟输入(电流或电压),数字输入/输出,RS-485和开关输出电压。项目中使用的硬件包括WISE-4610P-NA和WISE-S617T模块。
S617T包括2个模拟输入,2个数字输入,1个数字输出,2个功率输出,1个RS-485输入输出。模拟输入可根据跳线CN6和CN7设置配置为电压或电流(默认设置为AI1和AI2输入上的电压)。将S617T结节插入WISE-4610的底座,并使用所提供的螺钉进行固定。pinout和I/O的详细信息如下面的I/O螺钉端子连接器图片和示意图所示。
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转换器连接到seeeed温度/湿度传感器,如下图所示SeeedSTH1TempRS485Test:
一旦传感器连接并通电,启动RealTerm并连接到Waveshare USB到RS232/485/TTL转换器的COM端口。配置“端口”页签设置波特率:9600、奇偶校验:无、数据位:8、停止位:1、硬件流控制:无。配置“显示”选项卡设置“显示方式:十六进制”并选择“半双工”框。可以通过向传感器发送有效命令并监控响应来测试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空气温湿度传感器数据手册的6.4.2节。
WISE-Studio软件实用程序设置
WISE-Studio是一个用于配置WISE模块的工具(该实用程序可以从WISE Studio下载)。该工具提供了一个基于web的界面,该界面在多个WISE模型之间类似。对于通过以太网、LAN或WLAN配置的模块,WISE-Studio可以与WISE模块的内部web服务器进行通信。对于通过USB配置的模块(如WISE-4610), WISE-Studio在安装了软件的计算机上执行web服务器。web服务器通过USB接口与WISE模块通信。模块信息可通过嵌入式网页或web浏览器访问。
1 - 从这里下载并安装USB驱动程序
2 - 从http://support.advantech.com/下载并安装WISE Studio
3 - 为模块供电,将直流电源连接到+ v和- v引脚。
4 - 通过microrousb端口将模块连接到计算机上。
5 - 打开WISE Studio实用程序,在Serial Port上选择Go To Configuration 。然后选择合适的COM端口,单击“连接”。
一旦PC连接到WISE-4610,您可以进入信息页面查看模块,LoRa,设备和电源状态的详细信息。其他页面包括设置4610时使用的配置,I/O 状态 和高级。配置WISE-4610的详细信息请参见《WISE-4610用户手册》。
硬件设置
本项目采用24V DIN导轨电源为WISE-4610供电,USB电缆连接到运行WISE Studio的PC机。下面的原理图说明了如何实现设置,并包括带有DigiKey部件编号的BOM(Scheme-it WISE4610_STH1sensor项目)。
注意:USB连接到PC仅在配置WISE-4610期间使用。
确定WISE-4610 LoRa设备EUI、App EUI和App KEY值
WISE-4610的设备EUI,App EUI和App键可以通过导航到配置页面的RF模块选项卡在WISE Studio中找到。
注意:当将4610添加到Things Stack LoRaWAN网络时,将需要这些LoRa参数。
进入“IO状态”界面,选择“COM1”,选择“ModbusRTU Configuration”,选择“Rules Setting ”页签,为S-TH-1 RS-485温湿度传感器指定Modbus命令,取值为:
从ID = 42 (0x2A),类型= 04输入寄存器,起始地址= 1,长度= 3,R/W = R,扫描间隔= 60
在IO状态界面,RS-485 rtu传感器数据可以在COM1状态页签下,选择“Word Status ”页签查看。
将WISE-4610 I/O控制器添加到Things Stack LoRaWAN网络服务器中
事物堆栈是一个企业级LoRaWAN网络服务器,建立在开源核心之上。事物堆栈允许您在自己的硬件或云中构建和管理LoRaWAN网络。WISE-4610将被添加到事物堆栈服务器中,以便LoRaWAN服务器可以接收4610的I/O数据负载。由于4610数据有效负载由多字符串组成,因此需要使用自定义Javascript有效负载解析器对其进行解码,以获得各种模拟/数字I/O和RS-485数据参数值。Advantech 已经开发并提供了一个通用的WISE Javascript有效负载解析器,需要修改才能与事物堆栈一起工作。
这个项目和下面的步骤假设一个事物堆栈 LoRaWAN服务器正在运行,并且可以将设备添加到它的网络中。
1 - 第一步是以管理员身份登录到事物堆栈服务器。
2 - 选择“Applications”并打开应用程序,将WISE-4610添加为终端设备(对于本项目示例,将使用farm1)。
3 - 在应用ID“farm1”中选择 “+ Add end device ”。
4 - 在“ Register end device ”屏幕中,选择“手动注册”
“ Frequency plan ” 选择“United States 902-928 MHz FSB 2(used by TTN)”
“ LoRaWAN version ” 选择“LoRaWAN Specification 1.0.2”,
“ Regional Parameters version ” 选择“RP001 Regional Parameters 1.0.2”,
输入DevEUI, AppEUI和Appkey参数,由上述WISE Studio中的RF模块屏幕确定。
输入所有数据参数后,选择“Register end device ”,完成WISE-4610的注册。
5 - 接下来,需要在事物堆栈中设置有效载荷解码器来解码从4610发送的参数值。Advantech提供了一个参考Javascript有效负载解析器,用于第三方LoRaWAN网关,该网关经过修改,可以与事物堆栈一起使用。解码器和所做修改的信息可以在github上找到:LoRaWAN/WISE4610 main·eewiki/LoRaWAN·github。
6 - 在事物堆栈中设置有效载荷解码器,转到WISE-4610的 “End device” 屏幕(终端设备按eui ID列出)。选择“Payload Formatters”选项卡。在"Formatter type" 下选择“Custom Javascript formatter”。复制Javascript代码在github链接LoRaWAN/WISE4610/WiseParserV1_6_8_TTNmod.js at main · eewiki/LoRaWAN · GitHub 和粘贴在" Formatter code “窗口,然后选择"Save changes”。
7 - 检查WISE-4610活动的LoRaWAN消息,解码的有效载荷消息将在 “ Live Data ” 选项卡中观察到。展开其中一条“上行数据”消息,查看rtu有效载荷细节。
解码后的有效载荷示例如下:
{
"name": "as.up.data.forward",
"time": "2023-05-05T20:02:19.191808194Z",
"identifiers": [
{
"device_ids": {
"device_id": "eui-74fe48ffff7ac6e5",
"application_ids": {
"application_id": "farm1"
},
"dev_eui": "74FE48FFFF7AC6E5",
"join_eui": "0000000053363137",
"dev_addr": "00BA8AE9"
}
}
],
"data": {
"@type": "type.googleapis.com/ttn.lorawan.v3.ApplicationUp",
"end_device_ids": {
"device_id": "eui-74fe48ffff7ac6e5",
"application_ids": {
"application_id": "farm1"
},
"dev_eui": "74FE48FFFF7AC6E5",
"join_eui": "0000000053363137",
"dev_addr": "00BA8AE9"
},
"correlation_ids": [
"as:up:01GZPR46A7S6Y0S3DFYPVFKNDQ",
"gs:conn:01GZMKNRBDVHKGDKECYGGKCBT8",
"gs:up:host:01GZMKNRGY2P3J4FJT02ZBXE5C",
"gs:uplink:01GZPR4610PCNW5WBQY34M53SV",
"ns:uplink:01GZPR4618P1ZYR3RP79SWTD7Y",
"rpc:/ttn.lorawan.v3.GsNs/HandleUplink:01GZPR4616ZRDSCYMZKDTPV9N5",
"rpc:/ttn.lorawan.v3.NsAs/HandleUplink:01GZPR46A21WT6ERHB0N4MMWQ5"
],
"received_at": "2023-05-05T20:02:19.079302431Z",
"uplink_message": {
"session_key_id": "AYcT4+JJKoHLe7tygE7ZnA==",
"f_port": 1,
"f_cnt": 13250,
"frm_payload": "gcJJAAcHAgAAAAAAAAcnAgAAAAAANAofIP9/AAD//ykCNAo/IP9/AADXj/1/EAIBAIMEAABmCIMEAQAuD4MEAgC0AmAHFgNSxGBVZLk=",
"decoded_payload": {
"AI0": {
"Event": 0,
"MaxVal": 65535,
"MinVal": 553,
"Range": 4,
"Raw Data": 32767,
"status": {
"High Alarm": 0,
"Low Alarm": 0
}
},
"AI1": {
"Event": 0,
"MaxVal": 36823,
"MinVal": 32765,
"Range": 4,
"Raw Data": 32767,
"status": {
"High Alarm": 0,
"Low Alarm": 0
}
},
"DI0": {
"mode": 0,
"status": {
"DI Change": 0,
"Get/Clean Counter Overflow": 0,
"Get/Clean H2L Latch": 0,
"Get/Clean L2H Latch": 0,
"Signal Logic": 0,
"Start Counter": 1
},
"value": 0
},
"DI1": {
"mode": 0,
"status": {
"DI Change": 0,
"Get/Clean Counter Overflow": 0,
"Get/Clean H2L Latch": 0,
"Get/Clean L2H Latch": 0,
"Signal Logic": 0,
"Start Counter": 1
},
"value": 0
},
"DO0": {
"Mode": "DO",
"status": {
"DO Change": 0,
"Pulse Output Continue": 0,
"Signal Logic": 0
}
},
"Device": {
"BatteryLevel": 82,
"PowerSrc": 3,
"Time": 1683316932
},
"RtuRegister0-0": {
"Data": 2150,
"Status": 0
},
"RtuRegister0-1": {
"Data": 3886,
"Status": 0
},
"RtuRegister0-2": {
"Data": 692,
"Status": 0
},
"SequenceNumber": 194,
"SourceAddress": null,
"TotalLength": 73
},
"rx_metadata": [
{
"gateway_ids": {
"gateway_id": "dragino24cf29",
"eui": "A84041FDFE24CF29"
},
"time": "2023-05-05T20:02:18.780349Z",
"timestamp": 1643032564,
"rssi": -22,
"channel_rssi": -22,
"snr": 13.2,
"frequency_offset": "-10328",
"uplink_token": "ChsKGQoNZHJhZ2lubzI0Y2YyORIIqEBB/f4kzykQ9N+6jwYaDAjKwdWiBhCuyNz0AiCgov3i6PwQKgwIysHVogYQyNyM9AI=",
"channel_index": 6
}
],
"settings": {
"data_rate": {
"lora": {
"bandwidth": 125000,
"spreading_factor": 7
}
},
"coding_rate": "4/5",
"frequency": "905100000",
"timestamp": 1643032564,
"time": "2023-05-05T20:02:18.780349Z"
},
"received_at": "2023-05-05T20:02:18.792508173Z",
"confirmed": true,
"consumed_airtime": "0.158976s",
"network_ids": {
"net_id": "000000"
}
}
},
"correlation_ids": [
"as:up:01GZPR46A7S6Y0S3DFYPVFKNDQ",
"gs:conn:01GZMKNRBDVHKGDKECYGGKCBT8",
"gs:up:host:01GZMKNRGY2P3J4FJT02ZBXE5C",
"gs:uplink:01GZPR4610PCNW5WBQY34M53SV",
"ns:uplink:01GZPR4618P1ZYR3RP79SWTD7Y",
"rpc:/ttn.lorawan.v3.GsNs/HandleUplink:01GZPR4616ZRDSCYMZKDTPV9N5",
"rpc:/ttn.lorawan.v3.NsAs/HandleUplink:01GZPR46A21WT6ERHB0N4MMWQ5"
],
"origin": "0204e7fb6077",
"visibility": {
"rights": [
"RIGHT_APPLICATION_TRAFFIC_READ"
]
},
"unique_id": "01GZPR46DQJ76TKCPF1Z0KMW9Q"
}
添加应用程序和集成
一旦WISE-4610配置完成并添加到物栈LoRaWAN网络服务器,就可以通过添加应用和集成对从WISE-4610上行/下行的数据进行操作和/或可视化。可以实现许多选项,包括MQTT, Node-RED, IFTTT, Cloud等。更多信息可以在这里找到。
访问物栈MQTT服务器
物栈公开了一个MQTT服务器来处理流事件。下面的步骤描述了如何连接MQTT客户机并订阅上行链路或发布下行链路。Machinechat JEDI将需要MQTT服务器信息,以便接收流S2101传感器数据。关于物栈MQTT服务器的详细信息可以在这里找到。
1 - 创建API密钥。为了使用MQTT服务器,需要生成一个新的API密钥来进行身份验证。控制台提供所需的连接信息,并可用于创建用于身份验证的API密钥。在**“Applications ” 程序选项卡中,从“Integrations ” 侧菜单中选择“**MQTT “ 子菜单。
2 - 单击 “ Generate new API key ” 按钮,生成用于连接到MQTT服务器的API key。记录JEDI数据收集器配置文件所需的MQTT信息(公共地址、用户名、密码)。
设置Machinechat JEDI Pro MQTT自定义数据收集器
将在JEDI Pro上设置一个定制的MQTT数据收集器,以订阅来自WISE-4610 I/O模块的传感器数据。数据收集器由两个文件组成,“dcollector.bin”是在运行JEDI的机器上运行的可执行文件,“dconfig. bin”是在运行JEDI的机器上运行的可执行文件.yml”是包含相关MQTT和传感器信息的相应配置文件。在这个项目中,S2101的温度和湿度值将通过编辑dconfig来订阅.yml中包含传感器参数名称。为了确定传感器参数名称,将审查LHT65N的LoRaWAN数据有效载荷。
1 - 下载32位arm7版本的LoRaWAN MQTT数据采集器“dcollector.bin”和配置文件“dconfig. bin”。 Machinechat的链接。
2 - 检查WISE**-**4610 LoRaWAN有效载荷。如上所述,有效载荷包括以下数据。
温度参数为“RtuRegister0-0”。,湿度参数为“RtuRegister0-1”。Data”,露点参数为“RtuRegister0-2.Data”。
3 - 配置文件需要修改MQTT信息和传感器数据参数。需要修改的值是:
**mQTTBrokerFullURL** :这是来自MQTT集成上方的“公共地址”
**mQTTUsername** :这是来自MQTT集成上方的“用户名”
**mQTTPassword:** 这是来自MQTT集成上方的“密码”
**cSproperty:** 这是在LoRa有效负载中订阅的参数
**mcProperty:** 这是映射在JEDI**中的相应参数名称**
dconfig.yml 示例文件
mQTTBrokerFullURL: "tcp://192.168.1.129:1883"
mQTTUsername: "farm1"
mQTTPassword: "NNSXS.XFQCW3GFJXGC78MPOVKF3M2CUD4HFNSHNZQLRJQ.MB5VAGIGLVQ3F66LFYK2CVY2Z66A4CWRLQJXRIQBNT1A8IH7C6TA"
sendTestSenML: true
# setDebugLevel 0 is no debug, 1 is colorized JSON decode, 2 is 1 plus verbose payload dumps
setDebugLevel: 1
propertyNames:
- cSproperty: "Device.BatteryLevel"
mcProperty: "Battery"
- cSproperty: "DI0.value"
mcProperty: "DI0value"
- cSproperty: "DI1.value"
mcProperty: "DI1value"
- cSproperty: "AI0.Raw Data"
mcProperty: "AI0volt"
transform: "round(data - 32767)/3277"
precision: 2
- cSproperty: "AI1.Raw Data"
mcProperty: "AI1RawData"
- cSproperty: "RtuRegister0-0.Data"
mcProperty: "SHT1data0"
transform: "round(data)/100"
precision: 2
- cSproperty: "RtuRegister0-1.Data"
mcProperty: "SHT1data1"
transform: "round(data)/100"
precision: 2
- cSproperty: "RtuRegister0-2.Data"
mcProperty: "SHT1data2"
transform: "round(data)/100"
precision: 2
4 - 安装数据采集器“dcollector.bin”和配置“dconfig. bin”。. yml “文件复制到安装jedi的机器的” jedi/plugins "目录下。
5 - 通过运行" ./dcollector.bin ./dconfig. . “测试数据收集器。在jedi/plugins目录下的命令行中运行” . Yml "。下面是数据采集器正常工作(调试级别设置为1)时终端上的一些输出数据的示例。
{
"AI0.Event": 0,
"AI0.MaxVal": 32768,
"AI0.MinVal": 32766,
"AI0.Range": 4,
"AI0.Raw Data": 32767,
"AI0.status.High Alarm": 0,
"AI0.status.Low Alarm": 0,
"AI1.Event": 0,
"AI1.MaxVal": 32768,
"AI1.MinVal": 32767,
"AI1.Range": 4,
"AI1.Raw Data": 32768,
"AI1.status.High Alarm": 0,
"AI1.status.Low Alarm": 0,
"DI0.mode": 0,
"DI0.status.DI Change": 0,
"DI0.status.Get/Clean Counter Overflow": 0,
"DI0.status.Get/Clean H2L Latch": 0,
"DI0.status.Get/Clean L2H Latch": 0,
"DI0.status.Signal Logic": 0,
"DI0.status.Start Counter": 1,
"DI0.value": 0,
"DI1.mode": 0,
"DI1.status.DI Change": 0,
"DI1.status.Get/Clean Counter Overflow": 0,
"DI1.status.Get/Clean H2L Latch": 0,
"DI1.status.Get/Clean L2H Latch": 0,
"DI1.status.Signal Logic": 0,
"DI1.status.Start Counter": 1,
"DI1.value": 0,
"DO0.Mode": "DO",
"DO0.status.DO Change": 0,
"DO0.status.Pulse Output Continue": 0,
"DO0.status.Signal Logic": 0,
"Device.BatteryLevel": 82,
"Device.PowerSrc": 3,
"Device.Time": 1684181570,
"RtuRegister0-0.Data": 25.19,
"RtuRegister0-0.Status": 0,
"RtuRegister0-1.Data": 26.56,
"RtuRegister0-1.Status": 0,
"RtuRegister0-2.Data": 4.64,
"RtuRegister0-2.Status": 0,
"SequenceNumber": 89,
"SourceAddress": null,
"TotalLength": 73
}
5 - 打开JEDI并导航到“Settings”,然后选择“Data Collectors”。点击“Add Collector”,添加新的数据采集器。
6 - 增加新的数据采集器。输入数据采集器名称,类型选择“Custom Plug-in”,插件 Executable选择“dcollector.bin”,添加dconfig。插件选项的yml文件位置,选择“Run As Background Process and Monitor”,点击“VALIDATE PLUG IN”,选择“SAVE”保存设置。
在JEDI Pro上显示LoRaWAN WISE-4610 / RS-485温湿度传感器数据。
在JEDI中,导航到“Data Dashboard”并为WISE-4610 / RS-485温湿度传感器创建新图表。仪表板示例如下所示。
结论
Advantech WISE-4610P-NA与S617T I/O模块配对,提供多个I/O数据能力,用于LoRaWAN上的数字/模拟信号和RS-485设备的传感和控制。支持RS-485/Modbus通信的好处允许各种各样的传感器和控制与WISE-4610接口。在物栈 LoRaWAN网络服务器中提供可用数据提供了通过使用MQTT集成对数据进行可视化和操作的机会。在Machinechat JEDI Pro中设置自定义数据收集器提供对WISE4610传感器数据的可视化和操作的访问。
参考文献
- DigiKey技术论坛-Advantech 工业级 LoRaWAN 无线输入/输出模块 WISE-4610 入门
- Advantech -WISE-4610
- Advantech -WISE-S617T
- Advantech -WISE-4610用户手册
- Advantech -WISE-4610启动手册
- Advantech -IAG_FAQ WISE-2000如何接收LoRa端节点数据负载
- Advantech -WISE-4610常见问题解答
- Seeed -S-TH-01工业级空气温湿度传感器
- Machinechat —建立一个私有的、基于边缘的LoRaWAN物联网传感器网络
- The Things Network -The Thins Stack
Building a private, edge-based LoRaWAN IoT sensor network