Modbus 协议基础与 LuatOS exmodbus 库使用说明

分析以太网帧结构_100G以太网接口调试初体验 是的,标题没有多敲一个“0”,明人不说暗话,就是在FPGA上实现100G以太网接口设计。正好参与了实验室某项目中的100G接口的调试,早想写个专栏文章了,由于调试过程中发现了一些硬件问题,导致迟迟没有往前推进,现在问题解决了之后可以简单分享一下100G以太网接口的调试初体验了~(好像DDR4读写测试系列文章还没搞完 )这篇初体验暂时不分多个章节了,基本设计流程与之前发布的“10G以太网接口”系列文... 阅读详情

工业物联网场景里,Modbus 协议的应用十分普遍,温湿度传感器、变频器、PLC、电表等多数工业设备都在使用。以往开发时,CRC 校验、RS485 方向切换、超时重试这类底层逻辑都要手动编写,流程繁杂还容易出现问题。

** LuatOS 推出的 exmodbus 扩展库**,把这些底层工作做了封装,开发者直接调用接口就能完成 Modbus 通信。该库适配全系 LuatOS 模组与工业引擎产品,搭配 Air780Exx、Air8000 等自带 RS485 电路的开发板,参考开源例程就能直接调试使用。

636DEEB7743699A225BD349A52D32EF0.jpg

一、必看的Modbus基础知识

Modbus最初由Modicon(现为施耐德电气旗下品牌)于1979年开发,是一种用于可编程逻辑控制器(PLC)之间通信的工业通信协议。

由于其简单、开放、免费且易于实现,Modbus已成为工业自动化领域最广泛使用的通信协议之一,被广泛应用于工业控制、楼宇自动化、能源管理、智能仪表等场景。

1.1 Modbus三种常见通信模式

Modbus协议采用主从架构,最初基于串行通信(Modbus RTU和Modbus ASCII),后扩展支持以太网传输(Modbus TCP)。

1)Modbus RTU

  • 传输介质:RS485/RS232串行通信;

  • 编码格式:二进制,报文紧凑;

  • 校验方式:CRC16;

  • 报文结构:[从站地址][功能码][数据][CRC16校验]

  • 典型示例:

请求:01 03 00 00 00 02 C4 0B
响应:01 03 04 00 01 00 05 6B F0

2)Modbus ASCII

  • 传输介质:RS485/RS232串行通信;

  • 编码格式:ASCII字符,报文可读性强;

  • 校验方式:LRC;

  • 报文结构:[:][从站地址][功能码][数据][LRC校验][\r\n]

  • 典型示例:

:010300000002BA\r\n

3)Modbus TCP

  • 传输介质:以太网等;

  • 编码格式:二进制,在RTU基础上增加了MBAP头;

  • 校验方式:无需校验位,直接通过TCP/IP传输;

  • 报文结构:[MBAP头][功能码][数据]

  • 典型示例:

请求:00 01 00 00 00 06 01 03 00000002
响应:00 01 00 00 00 07 01 03 04 00 01 00 05

1.2 Modbus四种基本数据类型

Modbus定义了四种数据对象:线圈、离散输入、输入寄存器和保持寄存器,并通过功能码实现设备间的数据交换。

01 四种数据类型26041701.png

二、exmodbus库核心API函数速览

LuatOS的exmodbus库从工业应用实际需求出发,将复杂的协议细节封装为简洁易用的API,使开发者能够专注于业务逻辑,从而有效缩短项目周期、降低维护成本。

**最新API文档详见:**https://docs.openluat.com/osapi/ext/exmodbus/

2.1 exmodbus.create(config)

函数功能: 创建并返回一个新的modbus主/从站实例。

简要示例:

-- 创建 modbus RTU 主站
local create_config = {
     -- 串口配置参数;
     mode = exmodbus.RTU_MASTER, -- 通信模式:RTU 主站
     uart_id = 1,                -- 串口 ID:uart1
     baud_rate = 115200,         -- 波特率:115200
     data_bits = 8,              -- 数据位:8
     stop_bits = 1,              -- 停止位:1
     parity_bits = uart.None,    -- 校验位:无校验
     byte_order = uart.LSB,      -- 字节顺序:小端序
     rs485_dir_gpio = 23,        -- RS485 方向转换 GPIO 引脚
     rs485_dir_rx_level = 0      -- RS485 接收方向电平:0 为低电平,1 为高电平
}

local rtu_master = exmodbus.create(config)

2.2 modbus:read(config)

函数功能: 主站向从站发送读取操作请求(阻塞接口);支持通过“字段参数方式”或“原始帧方式”传入config配置参数。

简要示例:

-- 1. 创建主站
-- 2. 执行读取请求
local result = modbus:read(config)
-- 3. 判断从站响应状态
if result.status == exmodbus.STATUS_SUCCESS then

    log.info("收到响应数据且数据有效")

elseif result.status == exmodbus.STATUS_DATA_INVALID then

    log.info("收到响应数据但数据损坏/校验失败")

elseif result.status == exmodbus.STATUS_EXCEPTION then

    log.info("收到 modbus 标准异常响应")

elseif result.status == exmodbus.STATUS_TIMEROUT then

    log.info("无任何响应(超时)")

end

2.3 modbus:write(config)

函数功能: 主站向从站发送写入操作请求(阻塞接口);支持通过“字段参数方式”或“原始帧方式”传入config配置参数。

简要示例:

-- 1. 创建主站
-- 2. 执行写入请求
local result = modbus:write(write_config)
-- 3. 判断从站响应状态
if result.status == exmodbus.STATUS_SUCCESS then

   log.info("收到响应数据且数据有效")

elseif result.status == exmodbus.STATUS_DATA_INVALID then

   log.info("收到响应数据但数据损坏/校验失败")

elseif result.status == exmodbus.STATUS_EXCEPTION then

   log.info("收到 modbus 标准异常响应")

elseif result.status == exmodbus.STATUS_TIMEROUT then

   log.info("无任何响应(超时)")

end

2.4 modbus:destroy()

函数功能: 销毁已创建的主/从站示例对象。

简要示例:

1 modbus:destroy()

2.5 modbus:on(callback)

函数功能: 此接口仅限设备做从站时使用;当收到主站请求数据时,通过callback通知应用脚本处理;应用脚本处理完之后,在callback中通知返回值,告知exmodbus扩展库返回给主站。

简要示例:

-- 0. 初始化一些参数
-- 当前从站地址(ID 号)
local SLAVE_ID = 1

-- 寄存器映射表(按类型组织)
local modbus_data = {
    coils = {},            -- 线圈,可读可写,布尔值 (0/1)
    inputs = {},           -- 输入状态,只读,布尔值 (0/1)
    input_registers = {},  -- 输入寄存器,只读,16 位无符号整数
    holding_registers = {} -- 保持寄存器,可读可写,16 位无符号整数
}

-- 初始化一些默认值,便于测试
for i = 0, 3 do
    modbus_data.coils[i] = 0
    modbus_data.inputs[i] = 1
    modbus_data.input_registers[i] = 100 + i
    modbus_data.holding_registers[i] = 200 + i
end

-- 1. 创建从站
-- 2. 注册主站请求处理回调函数
local function callback(request)
    log.info("exmodbus_test", "收到主站请求")

    -- 检查从站 ID 是否匹配
    if request.slave_id ~= SLAVE_ID then
        log.info("exmodbus_test", "从站 ID 不匹配,请求从站 ID 为", request.slave_id, ",当前从站 ID 为", SLAVE_ID)
        return nil
    end

    -- 根据功能码和寄存器类型,匹配对应的数据表
    local data_table = nil
    local is_write = false -- 标记是否为写操作

    -- 检查请求的功能码是否支持
    if request.func_code == exmodbus.READ_COILS then -- 读线圈
        data_table = modbus_data.coils
    elseif request.func_code == exmodbus.READ_DISCRETE_INPUTS then -- 读离散输入
        data_table = modbus_data.inputs
    elseif request.func_code == exmodbus.READ_HOLDING_REGISTERS then -- 读保持寄存器
        data_table = modbus_data.holding_registers
    elseif request.func_code == exmodbus.READ_INPUT_REGISTERS then -- 读输入寄存器
        data_table = modbus_data.input_registers
    elseif request.func_code == exmodbus.WRITE_SINGLE_COIL or request.func_code == exmodbus.WRITE_MULTIPLE_COILS then -- 写单个/多个线圈
        is_write = true
        data_table = modbus_data.coils
    elseif request.func_code == exmodbus.WRITE_SINGLE_HOLDING_REGISTER or request.func_code == exmodbus.WRITE_MULTIPLE_HOLDING_REGISTERS then -- 写单个/多个保持寄存器
        is_write = true
        data_table = modbus_data.holding_registers
    else
        -- 不支持的功能码
        log.info("exmodbus_test", "不支持的功能码: ", request.func_code)
        return exmodbus.ILLEGAL_FUNCTION
    end

    -- 检查数据地址是否有效
    local end_addr = request.start_addr + request.reg_count - 1

    -- 假设每种寄存器的最大地址是 3 (即 0 - 3)
    if request.start_addr < 0 or end_addr > 3 then
        log.info("exmodbus_test", "数据地址超出范围,起始地址为", request.start_addr, "结束地址为", end_addr)
        return exmodbus.ILLEGAL_DATA_ADDRESS
    end

    -- 处理读取操作
    if not is_write then
        -- 构造响应数据表
        local response = {}
        for i = 0, request.reg_count - 1 do
            local addr = request.start_addr + i
            response[addr] = data_table[addr]
        end
        log.info("exmodbus_test", "读取成功,返回数据: ", table.concat(response, ", "))
        return response
    end

    -- 处理写入操作
    if is_write then
        -- 执行写入操作
        for i = 0, request.reg_count - 1 do
            local addr = request.start_addr + i
            data_table[addr] = request.data[addr]
            log.info("exmodbus_test", "写入成功,写入地址: ", addr, "写入数据: ", request.data[addr])
        end
        return {} -- 返回空表表示成功
    end
end

-- 3. 注册主站请求处理回调函数
modbus:on(callback)

2.6 exmodbus.debug(enable)

函数功能: 设置debug开关,开启后会打印接收和发送的原始数据。

简要示例:

-- 开启 debug 模式;
exmodbus.debug(true)

-- 关闭 debug 模式;
exmodbus.debug(false)

三、开源示例快速上手

在LuatOS官方仓库的demo/modbus目录下提供了完整的开源示例代码,涵盖TCP主站/从站应用、RTU主站/从站应用、485温湿度传感器读取等功能模块。

以Air8000系列开发板为例:

  • Modbus最新示例源码https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/modbus

  • Modbus实操教程详见:https://docs.openluat.com/air8000/luatos/app/modbus/

图片

图片

01 AirUI串口工具.gif
Modbus 是工业自动化领域广泛使用的通信协议,支持 RTU、ASCII、TCP 三种模式,包含线圈、离散输入、输入寄存器、保持寄存器四类数据对象。传统开发需手动处理 CRC 校验、RS485 方向控制、超时重试等底层逻辑。LuatOS 提供 exmodbus 扩展库,封装底层细节,通过 create、read、write、destroy、on、debug 等 API 实现主从站通信。该库支持全系列模组与工业引擎,Air780Exx、Air8000 等开发板板载 RS485 电路,搭配开源示例可快速验证功能。

银河麒麟高级服务器V11操作系统安装部署zabbix监控平台的实操保姆级教程 本文详细介绍了在《银河麒麟高级服务器V11上安部署Zabbix监控系统的全过程》涵盖了zabbix监控系统涉及到的所有软件安装、参数优化、服务启动验证及防火墙配置等一系列实操。其中关于安装过程报错undefined symbol: usmAES256CiscoPrivProtocol;ares_reinit等依赖库问题进行了详细记录与分析解决;还提供了Web前端中文显示修复方案和Admin密码修改方法。实现监控平台的100%部署上线,实现对业务系统的实时监控,保证业务的稳定运行。 阅读详情

相关推荐

分子对接中的相互作用特征分析(目视筛查)

介绍分子对接的相互作用特征,以及如何通过这些特征进行目视筛查

recher_He1107的博客 5760

LuatOS扩展库API——【exmodbus】MODBUS协议

LuatOS是一款面向物联网设备的轻量级Lua脚本运行框架,基于Lua 5.3优化,支持4G-Cat.1和MCU等终端。其特点包括Lua脚本开发、协程多任务设计,提供70+核心库、30+扩展库及1000+应用示例。文章重点介绍了Modbus协议及其在LuatOS中的实现,包括RTU、ASCII和TCP三种通信模式,详细解析了报文格式和功能码,并展示了LuatOS的exmodbus扩展库如何简化Modbus主/从设备通信管理。

m0_57476762的博客 866

集成电路模拟版图入门-版图基础学习笔记(四)

第三部分:版图的准备 2. 设计规则 3) Design Rule 2. 设计规则 4) 规则定义 4.1 NW(N WELL) 2. 设计规则 4) 规则定义 4.1 NW(N WELL) 2. 设计规则 4) 规则定义 4.2 PO(Poly) 2. 设计规则 4) 规则定义 4.3 M1(Metal1) 2. 设计规则 4) 规则定义 4.4 VIA 3. DRC文件 3.1 DRC:Design Rule Check,设计规则检查。 3.2 DRC程序了解有关

weixin_52955333的博客 6736

LuatOS exmodbus 库使用指南:快速实现工业 Modbus 通信

Modbus 是工业自动化场景下最常用的通信协议,几乎贯穿各类工业终端与控制设备。传统开发模式下,开发者需自行处理报文校验、电平切换、异常重连等底层工作,开发效率偏低。 为此 LuatOS 推出 exmodbus 扩展库,屏蔽复杂协议底层,通过简洁 API 即可完成 Modbus 通信。目前该库已适配全系模组,配套硬件与示例工程完善。下面从协议基础、接口用法、实操示例三方面,带大家上手使用。

yangliu123456_的博客 336

保姆级教程:在Ubuntu 22.04上,用Chroot和xorriso定制你的专属服务器镜像(附离线包集成)

本文提供了一份详细的Ubuntu 22.04离线镜像定制教程,通过Chroot环境和xorriso工具,帮助用户打造专属服务器镜像。教程涵盖环境准备、镜像解构、系统定制、镜像重组与验证等全流程,特别适合需要在隔离网络环境中批量部署服务器的场景。

weixin_28704565的博客 445

AD24层次原理图设计避坑指南:如何解决端口连接与自动交叉引用问题

本文深入解析AD24层次原理图设计的核心机制,聚焦端口连接错误、自动交叉引用干扰等常见问题。通过对比自上而下与自下而上设计流程,提供端口类型匹配、命名规范等实用解决方案,并指导如何关闭烦人的红色框线视觉干扰,帮助工程师高效避坑,实现复杂系统的模块化设计。

wdx01234567的博客 616

LuatOS ——Modbus RTU 通信模式

在工业自动化与嵌入式系统通信领域,Modbus RTU因其高可靠性与广泛兼容性成为主流的串行通信协议之一。LuatOS作为面向物联网与智能设备开发的轻量级操作系统,原生支持Modbus RTU协议,为开发者提供了高效、稳定的通信能力。本文将深入剖析LuatOS平台中Modbus RTU的实现机制,涵盖协议封装、串口配置、主从模式实现及实际应用中的关键技巧。

m0_57476762的博客 966

SAP RAP 校验全流程:从 EML 读取到消息上屏与阻止落库

本文系统梳理了 SAP ABAP RAP 中的校验流程(The Validation Process),结合 Airline/Connection 案例,详细讲解了三类核心校验:语义键唯一性、外键有效性和字段间一致性。文章覆盖了 EML 的 READ ENTITIES 操作、reported-* 与 failed-* 结构的使用方法、消息创建与字段绑定技巧,以及处理草稿数据时的 UNION 查询策略。通过代码示例演示了如何实现校验逻辑、生成错误消息并阻止无效数据持久化,同时提供了常见问题的排查建议。全文注重

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 334

以Air780EHV为例:基于 LuatOS 的 485 总线与 Modbus 协议开发指南

Air780EHV 是一款集成 4G、音频及多种工业接口的物联网模组,适用于包含语音交互、多屏显示、工业总线(RS485/CAN/ 以太网)的复杂物联网应用场景。RS485 总线接口基于 UART 总线接口实现,实际使用时需配合 485 收发器芯片。

2401_87506083的博客 390

电气:蒙特卡洛1000个风光场景并通过削减法|聚类法得到几个典型场景(matlab\python实现)

    个人电气目录传送门:学好电气全靠它,个人电气博文目录(持续更新中…)     本文内容包括22页(代码和一些自己对风光的观点) 提示:专栏解锁后,可以查看该专栏所有文章,划算。 文章目录一、理论依据1.风电DG出力概率模型1.2光伏DG出力概率模型1.3对风光的认识二、蒙特卡洛模拟1000个风光场景、并通过削减法得到5个典型风电场景 (Matlab 版程序)三、蒙特卡洛模拟1000个风光场景、并通过聚类法得到5个典型

总裁余(余登武)博客 7681

EMS案例:BMS传导发射超标整改案例

BMS作为新能源汽车的关键部件,其EMC性能直接影响整车的安全性和可靠性。本文通过一个实际的传导发射整改案例,详细展示了从问题定位、分析到解决方案实施的全过程。希望这些经验能够为从事类似产品设计的工程师提供有价值的参考,在未来的产品开发中避免类似问题,设计出更加可靠、稳定的BMS产品。EMC设计是一门结合理论与实践的艺术,只有通过不断积累经验、深入理解电磁场理论,并紧密结合实际应用场景,才能在复杂的电磁环境中设计出鲁棒性强的电子产品。

m0_56451176的博客 272

工业 485 总线防护与 Modbus LuatOS 开发实践

工业通信中常用的 RS485 总线,说明其硬件设计要点,并介绍与其配合使用的 Modbus 协议在 LuatOS 中的应用方式。

UpUpStudy123的博客 344

基于深度学习的道路裂缝检测系统完整教程

本文介绍了一种基于深度学习的道路裂缝检测系统完整解决方案。项目采用5466张高质量道路裂缝图像数据集,包含YOLO和Pascal VOC两种标注格式,覆盖多种道路场景。系统利用CNN和YOLO算法实现高效检测,相比传统人工巡检显著提升效率和准确性。文中详细阐述了数据集结构、环境配置和训练流程,包括数据预处理、智能分割策略和质量检查方法。该技术可及时发现道路裂缝隐患,降低维护成本,保障交通安全,为道路养护提供智能化解决方案。

FJN110的博客 298

搞定485总线开发:电平匹配+TVS防护实操,搭配LuatOS易用版Modbus库

在工业物联网、智能采集与远程控制项目里,RS485 几乎是绕不开的标准通信接口。搭配合宙低功耗 Cat.1 模组,既能实现设备联网,又能稳定对接各类传感器、变频器、仪表等工业外设。 凭借强大的外设扩展能力与简洁高效的 LuatOS 开发环境,Air780EHV 系列模组早已成为工业场景下的高性价比选择。它不仅支持 LCD、摄像头、以太网、CAN 等丰富外设,还完美兼容 TCP、MQTT、HTTP、Modbus 等主流协议,一站式满足复杂项目需求。

Moon1126_的博客 449

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

exmodbus 库:简化工业 Modbus 开发

Modbus 是工业物联网主流通信协议,凭借适配性强、部署便捷的特点,广泛用于传感器、变频器、PLC、智能仪表等工业设备。但原生开发需手动编写 CRC 校验、RS485 收发切换、超时重连等底层逻辑,代码繁琐且易出故障。 为此 LuatOS 推出exmodbus扩展库,完整封装 Modbus 底层协议。该库兼容合宙全系模组与工业引擎,配合配套硬件及开源例程可快速落地,有效简化工业 Modbus 通信开发。下文将从协议原理、接口用法、实操案例三方面详解该组件

HFL2023901的博客 399

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

工业 485 通信:从硬件设计到 Modbus 协议实现

本文围绕 485 总线与 Modbus 协议在 LuatOS 开发中的应用展开说明。485 总线接口基于 UART 实现,需配合 485 收发器芯片使用,硬件设计需重点关注 UART 与收发器之间的电平匹配,电平不匹配时应增加电平转换电路。

LBXXXXXXXX的博客 348

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

工业 Modbus 通信开发利器 exmodbus

作为工业通信的标准协议,Modbus 大量应用于温湿度传感器、PLC、变频器等设备。传统开发方式要处理大量底层通信细节,增加了开发工作量与出错概率。 针对这一行业痛点,LuatOS 上线exmodbus扩展库,一站式封装协议底层能力,完美兼容合宙 LuatOS 模组及工业引擎产品,依托配套硬件与开源案例,助力开发者快速完成 Modbus 通信功能开发。

2401_87501788的博客 371

485总线硬件设计必看:电平匹配、TVS防护,还有exmodbus库快速上手

Air780EHV系列模组集成RS485接口,支持半双工通信与Modbus RTU协议栈,适用于工业传感器、变频器、仪表等外设的数据采集与远程控制。 本文覆盖硬件设计要点:总线拓扑、终端匹配、隔离防护,及LuatOS Modbus扩展库的配置与调用。

HFL2023901的博客 250

从电路设计到协议栈:Air780EHV模组RS485+Modbus工业通信完全手册

Air780EHV 是一款集成 4G+音频+丰富工业接口的物联网模组,特别适合需要语音交互、多屏显示和工业总线(RS485/CAN/以太网)的复杂应用场景485总线接口本质上是UART总线接口的一种应用,需要搭配485收发器芯片实现。

2401_87501788的博客 511

LuatOS系统下Air8000开发板Modbus应用详解:全流程实战入门手册 !

在工业自动化领域,Modbus协议的应用日益广泛。本文以Air8000开发板为硬件平台,结合LuatOS系统,系统性地讲解Modbus应用的开发全流程。从基础概念到实战案例,本文旨在为开发者提供一份全面的入门手册,降低学习门槛,提升开发效率。

LuatOS的博客 835

485 总线:电平适配、静电防护及实用 Modbus 库

本文以Air780EHV 系列模组为例,讲解工业通信中 485 总线的硬件设计细节及 Modbus 协议在 LuatOS 的开发应用,介绍了 485 总线与 UART 的关联、电平匹配的处理方式和不同防护等级的 TVS 器件选型,还提及为降低开发难度推出的 exmodbus 扩展库,并给出了该库实现 Modbus RTU 主站通信的代码示例及相关文档查阅渠道。工业通信中非常经典的485总线,硬件设计中需要注意的细节,Modbus协议在LuatOS开发中的应用,详见下文。

weixin_72733760的博客 387

工业通信实战:RS485总线从硬件防护到Modbus协议开发全解析——基于合宙Air780EHV模组

合宙 Air780EHV 是一款高集成 4G Cat.1 模组,以4G + 音频为核心优势,支持语音通话、录音、TTS,自带 LCD、摄像头、RS485、CAN、以太网等外设,并兼容 Modbus、MQTT 等多种通信协议,适用于工业物联网与智能交互设备。 在实际工业场景中,与 485 总线配合最紧密的,正是 Modbus 协议。下面我们就来讲讲 Modbus 在 LuatOS 上的开发与应用。

a_qidian的博客 248

工业 485 接口:从电平到防护及 Modbus 实现

本文将系统梳理 RS-485 硬件设计的核心要点——包括终端匹配电阻配置、偏置电阻设计、隔离防护策略及布线规范,并深入介绍 Modbus 协议在 LuatOS 嵌入式开发环境中的具体实现与应用范式。

yangliu123456_的博客 365

注塑机数据采集网关 ZK-D1/D3:读取控制器哪些数据对接 MES/IoT 平台

ZK-D1/D3数据采集网关可统一接入多品牌注塑机,采集设备状态、生产计数、工艺参数、报警及能耗等核心数据,通过MQTT/HTTP等协议标准化上传至MES/IoT平台。实现“一次接入、统一建模”,支撑OEE分析、产量看板、质量追溯与故障闭环管理。关键在于规范数据映射、合理设置采集频率、保障时间同步与安全传输,最终将设备数据转化为生产效率与质量管理价值。

专业采集注塑机数据,为mes系统提供数据服务! 494

注塑机数据采集网关 ZK-D1/D3 困局解析:如何实现与 MES/IoT 平台的实时数据对接

注塑车间数字化困局源于设备异构导致的数据采集难题。中科晟达ZK-D1/D3网关虽具备多协议适配与边缘采集能力,但常遇“采得到却采不准”“与MES对不上”“实时性与稳定性难兼顾”等挑战。核心问题在于点位映射错误、状态判定单一、数据模型错位及断网丢数。破解之道需构建四层架构:通过协议模板库与远程配置降低实施成本;以多信号组合+状态机实现精准状态判定;在网关侧下沉计算逻辑,完成数据预聚合与清洗;采用分级传输、消息幂等、本地缓存与统一时间同步,确保数据可信、实时、可消费。最终实现从“设备语义”到“业务语义”的高效转

专业采集注塑机数据,为mes系统提供数据服务! 265

009基于物联网的智能厨房安全监测系统

本文讲解物联网毕业设计选题《基于物联网的智能厨房安全监测系统》的实现:ESP32 搭配 MQ-2 燃气传感器采集可燃气体浓度、DHT11 采集温湿度,按浓度区分预警与危险两级做分级声光报警;危险时自动驱动常闭电磁阀切断气源,并通过 WiFi 推送告警到微信,数据上传云平台留存,隐患排除后可按键复位。内容含硬件清单与接线、传感器预热与阈值标定、分级报警与危险锁存设计、.h/.c 分离的多模块代码,并附测试验收、开题表述与答辩问答。照着做即可。

x1649545783的博客 384
上一篇: SPI 总线一主多从必踩的两个硬件坑
学无止境的小孩
博客等级 码龄2年 1092粉丝 296原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值