0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

485 总线硬件设计:电平匹配、TVS 防护与 Modbus 库应用

青山老竹农 来源:jf_82863998 作者:jf_82863998 2026-03-25 12:07 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

工业物联网通信开发中,485 总线搭配 Modbus 协议的方案应用广泛。今天来和大家分享下,Air780EHV通信SoC模组,使用485总线通信的硬件设计要点,以及LuatOS下Modbus协议的实操应用。

一、485总线接口与UART的关系

485总线接口本质上是UART总线接口的一种应用,需要搭配485收发器芯片实现。

二、电平匹配问题

在UART与485收发器芯片的搭配中,最常见需要注意的一个问题是电平匹配。

由于上一章节参考设计中Air780EHV和SP3485都是3.3V的IO电平,所以不再需要分立元器件电平转换电路或电平转换芯片。

当双方电平不一致时,则需要分立元器件电平转换电路或电平转换芯片。

常见的分立元器件电平转换电路如下:

Air780EHV 系列模组的相关参数说明如下:

该模组适配 320*480 LCD 屏、30 万像素摄像头,具备 CANRJ45 以太网、485、USB、UART、SPI、I2C、PWM、GPIO 等丰富接口。

网络支持 TCP/UDP、MQTT、HTTP、NTP、Modbus 等多种协议,集成 4G音频模块,可实现语音通话、录音播放及 TTS 功能。

工业通信中非常经典的485总线,硬件设计中需要注意的细节,Modbus协议在LuatOS开发中的应用,详见下文。

三、485总线接口的TVS防护

工业现场环境复杂,485总线经常面临静电、浪涌等威胁,因此接口保护必不可少。

485接口用TVS,可以根据防护等级要求去选择:

  • ESD等级防护:适用于一般静电防护场景。
  • TVS等级防护:具备2KV 1.2/50uS浪涌能力。
  • TSS等级防护:具备4KV 10/700uS浪涌能力。

四、Modbus通信协议

与485总线接口相关的通信协议是Modbus。LuatOS的modbus核心库,但使用难度较高。而exmodbus扩展库——在核心库的基础上封装了更简洁易用的API,降低开发难度,易于开发者集成Modbus通信。

exmodbus最新API文档详见资料中心

核心示例持续更新中!

PROJECT = "RTU_MASTER"
VERSION = "001.000.000"

-- 在日志中打印项目名和项目版本号
log.info("main", PROJECT, VERSION)

local exmodbus = require("exmodbus")

-- 使用 Air8000 开发板测试打开这两个
gpio.setup(16, 1)         -- RS485 芯片供电引脚
local rs485_dir_gpio = 17 -- RS485 方向引脚

-- 使用 Air780EPM 开发板测试打开这三个;
-- gpio.setup(1, 1)          -- Air780EPM RS485 芯片供电引脚
-- gpio.setup(23, 1)         -- Air780EPM vref 脚拉高
-- local rs485_dir_gpio = 24 -- Air780EPM RS485 方向引脚(V1.2 是 25,V1.3 是 24)

-- 创建 RTU 主站配置参数;
-- 说明:创建 RTU 主站时只需要配置如下参数即可;
local create_config = {
-- 串口配置参数;
mode = exmodbus.RTU_MASTER,      -- 通信模式
uart_id = 1,                     -- UART 端口
baud_rate = 115200,              -- 波特率
data_bits = 8,                   -- 数据位
stop_bits = 1,                   -- 停止位
parity_bits = uart.None,         -- 校验位
byte_order = uart.LSB,           -- 字节顺序
rs485_dir_gpio = rs485_dir_gpio, -- RS485 方向引脚
rs485_dir_rx_level = 0,          -- RS485 接收方向电平
}

-- 初始化从站 1 数据结构
-- 用于记录从站 1 保持寄存器 0-1 的值;
local slave1_data = {}

-- 配置读取从站 1 保持寄存器 0-1 的值;
local read_config = {
raw_request = string.char(
0x01,       -- 从站地址
0x03,       -- 功能码:读取保持寄存器
0x00, 0x00, -- 寄存器起始地址
0x00, 0x02, -- 寄存器数量
0xC4, 0x0B  -- CRC16校验码
),
timeout = 1000  -- 超时时间 1000 ms
}

-- 创建 RTU 主站实例
local rtu_master = exmodbus.create(create_config)

-- 判断主站是否创建成功并记录日志
if not rtu_master then
log.info("exmodbus_test", "rtu_master 创建失败")
else
log.info("exmodbus_test", "rtu_master 创建成功")
end

-- 读取从站 1 保持寄存器数据的函数
local function read_slave1_holding_registers()
log.info("exmodbus_test", "开始读取从站 1 保持寄存器 0-1 的值")

-- 执行读取操作
local read_result = rtu_master:read(read_config)

-- 根据返回状态处理结果
if read_result.status == exmodbus.STATUS_SUCCESS then
local resp = read_result.raw_response

-- 特别说明:
-- 接下来的判断是针对 modbus RTU 标准响应格式的应答原始帧来解析的
-- 在实际项目中,应根据自己项目中的实际应答原始帧格式进行解析
-- 如果实际格式与此处演示的格式不一致,需要修改接下来的解析代码

-- 1. 检查总长度:必须为 9 字节(1 地址 + 1 功能码 + 1 字节数 + 4 数据 + 2 CRC)
if #resp ~= 9 then
log.info("exmodbus_test", "响应长度错误,期望 9 字节,实际:", #resp)
return
end

-- 2. 检查从站地址
if string.byte(resp, 1) ~= 0x01 then
log.info("exmodbus_test", "从站地址不匹配,收到:", string.byte(resp, 1))
return
end

-- 3. 检查功能码
local func_code = string.byte(resp, 2)
if func_code == 0x83 then
local exc_code = string.byte(resp, 3)
log.info("exmodbus_test", "从站返回异常响应,异常码:", exc_code)
return
elseif func_code ~= 0x03 then
log.info("exmodbus_test", "功能码错误,收到:", func_code)
return
end

-- 4. 检查字节数字段(应为 4)
local byte_count = string.byte(resp, 3)
if byte_count ~= 4 then
log.info("exmodbus_test", "字节数字段错误,期望 4,实际:", byte_count)
return
end

-- 5. 校验CRC
-- 计算前 7 字节的 CRC
local crc_calculated = crypto.crc16_modbus(resp:sub(1, 7))
-- 提取接收到的 CRC
local crc_received = string.unpack("< I2", resp, 8)
-- 比较 CRC
if crc_calculated ~= crc_received then
log.info("exmodbus_test", "CRC 校验错误,计算值:", crc_calculated, ",接收值:", crc_received)
return
end

-- 6. 解析寄存器数据(从第 4 字节开始,大端序)
local data1 = string.unpack(" >I2", resp, 4) -- 寄存器 0,偏移 4
local data2 = string.unpack(" >I2", resp, 6) -- 寄存器 1,偏移 6

-- 7. 记录数据
slave1_data[0] = data1
slave1_data[1] = data2

-- 8. 记录日志
log.info("exmodbus_test", "成功读取到从站 1 保持寄存器 0-1 的值,寄存器 0 数值为", slave1_data[0], ",寄存器 1 数值为", slave1_data[1])

elseif read_result.status == exmodbus.STATUS_TIMEOUT then
log.info("exmodbus_test", "未收到从站 1 的响应(超时)")
end

end

-- 定时任务函数:每 2 秒调用一次读取函数
local function task()
while true do
if rtu_master then
-- 每 2 秒调用一次读取函数
read_slave1_holding_registers()
else
log.info("exmodbus_test", "rtu_master 未创建,无法执行 read_slave1_holding_registers()")
end
sys.wait(2000)
end
end

-- 初始化任务
sys.taskInit(task)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!

今天的分享就到这里啦~

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MODBUS
    +关注

    关注

    28

    文章

    2510

    浏览量

    83737
  • 485总线
    +关注

    关注

    1

    文章

    34

    浏览量

    17184
  • LuatOS
    +关注

    关注

    0

    文章

    169

    浏览量

    2745
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RS485总线的两级防护电路图

    以下为RS485总线的两级防护电路图。当雷击发生时,感应过电压由两端引入,GDT做一级防护,此时过电压被大大削弱到数百伏左右,再经过PPTC限浪,T
    发表于 04-09 10:37 1.1w次阅读
    RS<b class='flag-5'>485</b><b class='flag-5'>总线</b>的两级<b class='flag-5'>防护</b>电路图

    电平设计基础:电平匹配设计

    单端逻辑电平匹配是我们平时在硬件设计中最经常碰到的,我们在《TTL&CMOS电平》章节中已经对TTL和COMS电平
    的头像 发表于 06-25 14:52 4870次阅读
    <b class='flag-5'>电平</b>设计基础:<b class='flag-5'>电平</b><b class='flag-5'>匹配</b>设计

    RS-485总线电平异常解决方案解析

    各位工程师是否会遇到这样的情况,测试单个RS-485设备数据无异常,但设备组网后,就出现通讯数据异常或连接失败等情况。出错的原因是什么?本文将从门限电平为你揭秘RS-485组网异常。RS-48
    的头像 发表于 10-12 08:06 3510次阅读
    RS-<b class='flag-5'>485</b><b class='flag-5'>总线</b><b class='flag-5'>电平</b>异常解决方案解析

    rs485总线隔离应用与选型指南

    还是不用,由现场人员来设定。当然,具体怎么区分第一个节点还是最后一个节点,还得有待现场的专家们来解答呵。)TVS我们一般选用6.8V的,这个我们会在后面进一步的讲解。   RS-485标准定义信号阈值的上下限为±200mV。即当A-B>200mV时,
    发表于 07-27 11:08

    RS-485接口的防护电路设计

    发射器和接收器,信号传输为宽范围电平-7V~+12V。基于RS-485电性能参数,其典型高浪涌防护等级的解决方案为两极防护,其中第一级可采用浪拓电路保护部门的陶瓷气体放电管GDT用于旁
    发表于 11-12 14:36

    嫌布线太麻烦,不妨考虑"RS485总线+无线+Modbus RTU协议" ?

    增加了更多的成本。"RS485总线+无线+Modbus RTU协议"既兼容了"RS485总线",又兼容了"无线",还兼容全世界公认
    发表于 02-19 13:41

    RS-485端口通用保护电路

    如图所示, 三级防护方案提供了最佳的方案。 它使 RS-485收发器承受更高等级的防护。此方案采用气体放电管作初级防护TVS二极管作次级
    发表于 06-21 17:19

    RS-485接口电路的硬件设计

    1)总线匹配。  总线匹配有两种方法,一种是加匹配电阻,位于总线两端的差分端口VA与VB之间应
    发表于 11-21 16:39

    PSM712,RS-485端口EMC防护专用TVS

    : 400W· 非对称断态电压符合RS-485收发器规格· 低动态电阻(0.5Ω TYP)提供出色的箝位性能· 75pF(最大)最低电容负载应用:· RS-485· 现场总线· Modbus
    发表于 11-11 15:40

    RS-485端口EMC防护方案设计详解

    在工业、电力、自动化及仪器仪表实际应用中,RS-485总线标准是目前业内应用最广泛的物理层总线设计标准之一。为了确保数据端口能够在极其恶劣的电磁环境中正常运行,RS-485端口
    发表于 01-03 17:34

    RS485总线接口常见三种保护电路

    在实际的工业、电力、自动化及仪器仪表应用中,RS-485总线标准是使用最广泛的物理层总线设计标准之一,由于其会在恶劣电磁环境下工作,为了确保这些数据端口能够在最终安装环境中正常工作,它们必须符合相关
    发表于 02-23 10:10

    RS485 Modbus协议的硬件电路有哪些

    一、硬件1、传感器:为液压传感器,12vDC,RS485数据输出,采用Modbus协议通信2、根据传感器属性,电路主要是两部分,通信和电源(1)485电路:由于
    发表于 07-26 06:42

    关于RS-485总线电平异常解决方案解析

    RS-485总线电平异常解决方案解析
    的头像 发表于 01-15 17:05 1.2w次阅读

    485总线匹配电阻怎么接

    485总线是一种常用的通信总线标准,在工业现场常被使用于对远程传感器、控制设备和其他外围设备进行数据传输和通信。为了确保信号质量和抗干扰能力,485
    的头像 发表于 12-20 09:44 1.4w次阅读

    LuatOS:485 总线硬件设计要点与 exmodbus 开发实战

    与 UART 的关联、电平匹配处理及不同防护等级的 TVS 器件选型,同时介绍 LuatOS 轻量化的 exmodbus 扩展,并给出该
    的头像 发表于 03-19 17:57 201次阅读
    LuatOS:<b class='flag-5'>485</b> <b class='flag-5'>总线</b><b class='flag-5'>硬件</b>设计要点与 exmodbus <b class='flag-5'>库</b>开发实战