485总线硬件设计必看:电平匹配、TVS防护,还有exmodbus库快速上手
RS485是工业物联网的标配通信接口。合宙Air780EHV系列Cat.1模组凭借强大外设扩展能力LCD、摄像头、以太网、CAN等和LuatOS高效开发环境支持TCP/MQTT/HTTP/Modbus等主流协议是工业场景的高性价比之选。本文聚焦RS485实战从硬件设计、接口匹配、防护设计到Modbus扩展库应用助你快速完成工业通信开发。一、485总线接口与UART的关系485总线接口本质上是UART总线接口的一种应用需要搭配485收发器芯片实现。最新参考设计文件详见合宙资料中心https://docs.openluat.com/air780ehv/product/shouce/下图为典型的参考设计二、电平匹配问题在UART与485收发器芯片的搭配中最常见需要注意的一个问题是电平匹配。由于上一章节参考设计中Air780EHV和SP3485都是3.3V的IO电平所以不再需要分立元器件电平转换电路或电平转换芯片。当双方电平不一致时则需要分立元器件电平转换电路或电平转换芯片。常见的分立元器件电平转换电路如下三、485总线接口的TVS防护工业现场环境复杂485总线经常面临静电、浪涌等威胁因此接口保护必不可少。485接口用TVS常用的型号有SM712系列如果防护等级要求较高也可以选择如下ESD等级防护适用于一般静电防护场景。TVS等级防护具备2KV 1.2/50uS浪涌能力。TSS等级防护**具备4KV 10/700uS浪涌能力。四、Modbus通信协议与485总线接口强相关的通信协议是Modbus。此前我们发布过一版LuatOS的modbus核心库但使用难度较高。为此我们特别设计了exmodbus扩展库——在核心库的基础上封装了更简洁易用的API大大降低了开发难度让开发者可以快速集成Modbus通信。exmodbus最新API文档详见https://docs.openluat.com/osapi/ext/exmodbus/核心示例持续更新中敬请关注PROJECTRTU_MASTERVERSION001.000.000-- 在日志中打印项目名和项目版本号log.info(main,PROJECT,VERSION)localexmodbusrequire(exmodbus)-- 使用 Air8000 开发板测试打开这两个gpio.setup(16,1)-- RS485 芯片供电引脚localrs485_dir_gpio17-- RS485 方向引脚-- 使用 Air780EPM 开发板测试打开这三个-- gpio.setup(1, 1) -- Air780EPM RS485 芯片供电引脚-- gpio.setup(23, 1) -- Air780EPM vref 脚拉高-- local rs485_dir_gpio 24 -- Air780EPM RS485 方向引脚V1.2 是 25V1.3 是 24-- 创建 RTU 主站配置参数-- 说明创建 RTU 主站时只需要配置如下参数即可localcreate_config{-- 串口配置参数modeexmodbus.RTU_MASTER,-- 通信模式uart_id1,-- UART 端口号baud_rate115200,-- 波特率data_bits8,-- 数据位stop_bits1,-- 停止位parity_bitsuart.None,-- 校验位byte_orderuart.LSB,-- 字节顺序rs485_dir_gpiors485_dir_gpio,-- RS485 方向引脚rs485_dir_rx_level0,-- RS485 接收方向电平}-- 初始化从站 1 数据结构-- 用于记录从站 1 保持寄存器 0-1 的值localslave1_data{}-- 读取从站 1 保持寄存器 0-1 的值时配置读命令的字段参数localread_config{slave_id1,-- 从站地址 1reg_typeexmodbus.HOLDING_REGISTER,-- 寄存器类型保持寄存器start_addr0x0000,-- 起始地址 0reg_count0x0002,-- 读取 2 个寄存器timeout1000-- 超时时间 1000 ms}-- 创建 RTU 主站实例localrtu_masterexmodbus.create(create_config)-- 判断主站是否创建成功并记录日志ifnotrtu_masterthenlog.info(exmodbus_test,rtu_master 创建失败)elselog.info(exmodbus_test,rtu_master 创建成功)end-- 读取从站 1 保持寄存器数据的函数localfunctionread_slave1_holding_registers()log.info(exmodbus_test,开始读取从站 1 保持寄存器 0-1 的值)-- 执行读取操作localread_resultrtu_master:read(read_config)-- 根据返回状态处理结果ifread_result.statusexmodbus.STATUS_SUCCESSthenslave1_data.data1read_result.data[read_config.start_addr]slave1_data.data2read_result.data[read_config.start_addr1]log.info(exmodbus_test,成功读取到从站 1 保持寄存器 0-1 的值寄存器 0 数值为,slave1_data.data1,寄存器 1 数值为,slave1_data.data2)elseifread_result.statusexmodbus.STATUS_DATA_INVALIDthenlog.info(exmodbus_test,收到从站 1 的响应数据但数据损坏/校验失败)elseifread_result.statusexmodbus.STATUS_EXCEPTIONthenlog.info(exmodbus_test,收到从站 1 的 modbus 标准异常响应异常码为,read_result.execption_code)elseifread_result.statusexmodbus.STATUS_TIMEOUTthenlog.info(exmodbus_test,未收到从站 1 的响应超时)endend-- 定时任务函数每 2 秒调用一次读取函数localfunctiontask()whiletruedoifrtu_masterthen-- 每 2 秒调用一次读取函数read_slave1_holding_registers()elselog.info(exmodbus_test,rtu_master 未创建无法执行 read_slave1_holding_registers())endsys.wait(2000)endend-- 初始化任务sys.taskInit(task)-- 用户代码已结束----------------------------------------------- 结尾总是这一句sys.run()-- sys.run()之后后面不要加任何语句!!!!!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2473384.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!