不懂单片机也可实现的RS485 Modbus主机通信Lua编程

96 篇文章 0 订阅
67 篇文章 0 订阅

RS485 Modbus主机案例(简版)

本教程来源于 FlexLua 官网,基于FlexLua开发可以降低 IoT 硬件开发难度,零门槛 Lua 低代码编程技术开发 IoT 硬件。

前言

本教程以读取一个支持 Modbus-RTU 协议的 RS485 温湿度传感器为例,演示了 RS485 Modbus-RTU 主机通信(简版)实现的几个相关主要函数的使用方法:

LIB_Uart1Rs485Config("BAUDRATE_4800","D6") --RS485初始化,这里的波特率可以任意填,因为后面会再次配置
LIB_ModbusToJsonConfig() --初始化 Modbus-RTU 主机通信实例,并配置结果 Json 字符串长度
LIB_ModbusToJsonAdd() --增加一个要读取的寄存器
LIB_ModbusToJsonSend() --执行RS485发送
LIB_ModbusToJsonFinishCheck() --等待RS485应答数据


一、本例程实现功能

通过 03 功能码(读保持寄存器)每隔1秒读取一个市面上常见的 RS485 温湿度传感器(例如:建大仁科的)的温度值和湿度值:

  • 传感器从机地址:0x01
  • 湿度值寄存器地址:0x0000(16bit 整数,扩大十倍)
  • 温度值寄存器地址:0x0001(16bit 整数,扩大十倍)
  • 传感器RS485通信参数:4800,N,8,1

最后将读取到的温湿度值在 log.txt 中 print 打印出来。

ab817ecc8af529bed8df3cb800ce6168.jpeg

b7e2f291771a86706dd5f1f6f7220e2d.jpeg

ea562af276d4086f26297f12ef76796d.jpeg

二、接线图

6e4c25ecec50f75980e981614fda082d.jpeg

三、源码

--配置Uart1作为485接口,初始默认波特率4800,并且D6作为自动收发切换引脚
LIB_Uart1Rs485Config("BAUDRATE_4800","D6")
--使能系统10毫秒定时器开始工作
LIB_10msTimerConfig("ENABLE")

--全局变量
WorkMs = 0
temp = 0.0 --温度
humi = 0.0 --湿度

--定义10毫秒定时器的回调函数,函数名字必须是LIB_10msTimerCallback
function LIB_10msTimerCallback()
WorkMs = WorkMs + 10
end

--读取RS485温湿度传感器
--获取到的Json数据形如:{"Humi":79.7,"Temp":26.8}
function ModbusToJson()
--配置RS485 Modbus转Json功能,并设置将要生成的Json字符串最大长度为150字节
LIB_ModbusToJsonConfig(150)--必须小于255
--湿度值寄存器地址0x0000,类型为16bit带符号AB型,小数点个数1个,Json Key名称"Humi"
LIB_ModbusToJsonAdd(0x0000,"S_AB",1,"Humi")
--温度值寄存器地址0x0001,类型为16bit带符号AB型,小数点个数1个,Json Key名称"Temp"
LIB_ModbusToJsonAdd(0x0001,"S_AB",1,"Temp")
--参数设置(4800,无校验,1位停止位,功能码"03",从机地址0x01,应答最长等待1000ms,包与包最短间隔100ms)
LIB_ModbusToJsonSend("BAUDRATE_4800","NoneParity","StopBit_1","03",0x01,1000,100)
end

--进入大循环
while(GC(1) == true)
do
--每隔1秒(1000ms)读取一次传感器的值
if WorkMs >= 1000 then
WorkMs = 0
print("Start")
--通过RS485 Modbus-RTU读取485温湿度传感器数据
ModbusToJson()
--等待RS485通信结束
while true do
--读取传感器Json结果和错误信息(如果没有错误Err=null)
Finish,Json,Err = LIB_ModbusToJsonFinishCheck()
if Finish == 1 then
if Err == "null" then
--从Json结果中解析出传感器的实际值
Temp_val = LIB_JsonParse(Json, "$.Temp", "Number")
Humi_Val = LIB_JsonParse(Json, "$.Humi", "Number")
print(string.format("humi = %.1f, temp = %.1f", Humi_Val, Temp_val)) --打印温湿度值结果
else
--打印错误信息
print(Err)
end
break --跳出while循环
end
end
end
end


如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

四、实验结果

代码运行一段时间后,打开 log.txt 文件可以看到运行过程中 print() 打印输出的日志信息如下图:

(1)485通信正常情况:

cf11c1d22b9251ad5ab9b44be12f66fa.jpeg

(2)485通信异常情况:

c224961ba62ec6847108fbf7fd709399.jpeg

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值