【EsDA应用】Modbus应用详解

原创 ZLG致远电子 2023-07-18 11:40
Modbus作为一种公开、免费的现场总线,被广泛应用于工业电子领域。本文基于EsDA开发平台,为您详细介绍Modbus主机功能节点的使用方式,以及如何快速实现读取Modbus从机数据。

  Modbus简介
Modbus是一种串行通信协议,由于其公开、免费、易于部署和维护的优点,被广泛应用于工业电子领域,并且已经成为工业领域通信协议的业界标准。

(图片源自网络,侵删)

以往我们在使用Modbus协议进行应用开发时,通常需要自己实现诸多的Modbus功能码,或者移植开源的第三方库,这个过程往往比较费时费力,耽误项目的进展。
基于EsDA设计的Modbus主机功能节点,可以通过简单的拖拽、连线方式,快速实现读取Modbus从机数据,搭配其他功能节点,可以快速搭建出一个集数据采集上报、远程控制于一体的物联网应用。

  Modbus相关节点介绍

目前和Modbus主机相关的节点主要有6个,分别是modbus_master_rtu、modbus_master_in、modbus_master_dynamic_in、modbus_master_out、modbus_parse_in和modbus_parse_out节点。其中,modbus_master_rtu节点属于配置节点,用于配置Modbus通信设备的参数信息,该节点提供了Modbus RTU和Modbus TCP的主机通信服务;modbus_master_in和modbus_master_dynamic_in是Modbus的输入节点,主要用于读取从机设备的线圈量和寄存器数据;modbus_master_out是数据的输出节点,用于写线圈量和寄存器;modbus_parse_in和modbus_parse_out是扩展的Modbus功能节点,一般用来对输入/输出数据进行处理。


  modbus_master_rtu节点

Modbus主机的配置节点,用于配置与Modbus主机通信的从设备的通信参数,提供了Modbus RTU和Modbus TCP主机功能。该节点需要和对应的功能节点搭配使用,不会在画布中显示。

1. 属性

modbus_master_rtu节点包含了RTU和TCP两种模式的配置,不同模式需要设置的属性不同。

1.1 RTU模式配置属性

  • 名称 :节点名称,用于索引查找本节点;
  • 显示名称:用于画布上显示的名称;
  • 传输类型:用于设置链路层的传输模式(rtu/tcp可选);
  • 串口设备名:用于与从设备通信的串口设备名;
  • 波特率:串口波特率参数;
  • 数据位:串口数据位参数;
  • 校验位:串口奇偶校验位参数;
  • 停止位:串口停止位参数;
  • 响应时间:从机应答超时时间,单位ms;
  • 最大请求数量:用于配置Modbus主机读写请求的最大数量。
1.2 TCP模式配置属性
  • IP地址:从机设备(服务器)的IP地址;
  • 端口:从机设备的端口号;
  • 响应时间:从机应答超时时间,单位ms;
  • 最大请求数量:用于配置Modbus主机读写请求的最大数量。

2. 使用方法

该节点的使用依附于modbus_master_in、modbus_master_dynamic_in以及modbus_master_out等节点,使用时选择对应的通信模式,根据从机信息配置相应的配置属性即可。


  modbus_master_in节点

modbus_master_in是Modbus的输入节点,主要用于读取从机设备的线圈量和寄存器数据并输出给消费者节点。其输出是原始数据的缓冲区,后续可连接modbus_parse_in节点对数据进行处理。

1. 属性

  • 主机参数配置:输入节点依赖modbus_master_rtu节点,选择对应的配置节点即可;
  • 读取模式:选择节点的触发方式,可选择以用户设定的输出周期定时向消费者节点输出数据;也可根据输入的信息(来自push节点)进行数据读取并输出;
  • 从机ID:从机设备的ID地址;
  • 输出周期:用于周期读取模式设置读取和输出的周期;
  • 寄存器地址:需要被读取的寄存器/线圈的起始地址;
  • 读取数量:需要读取的寄存器/线圈数量;
  • 寄存器类型:用于选择读取目标的类型,可选线圈量、离散量、输入寄存器、保持寄存器。

2. 输入

该节点属于pump类型节点,一般不需要数据输入,但可以使用push节点来实现数据输入。
  • slaveID:从机设备的ID地址;
  • address:需要被读取的寄存器/线圈的起始地址;
  • reg_num:需要读取的寄存器/线圈数量;
  • reg_type:需要读取的寄存器/线圈类型。

3. 输出

  • slaveID:从机设备的ID地址,通常用于后级节点区分设备;
  • address:读取的寄存器起始地址;
  • reg_num:读取到的寄存器/线圈数量;
  • payload:缓冲区,存储读取到的数据;
  • payloadLength:读取到的数据长度;
  • poll_result:指明读取是否成功;

4. 使用方法

这里我们借助ZC1平台和一个RS485型的温湿度变送器来说明节点的使用方法。按照下图所示分别给ZC1开发板和传感器供电,并连接好RS485的A、B两线。
4.1 添加节点
添加modbus_master_in、modbus_parse_in、fscript以及log节点到画布上并连接节点。

4.2 配置节点

双击modbus_master_in节点打开属性配置面板。

选择“添加新的modbus_master_rtu节点”,进入配置主机参数面板。

根据实际情况配置完相应的参数后,点击添加,回到modbus_master_in节点配置界面。
可以看到已经创建了一个新的主机参数配置 ,同时配置读取模式为周期读取,从机ID、输出周期、寄存器地址等参数按照实际设备进行配置 。然后双击modbus_parse_in节点打开属性配置面板,对modbus_parse_in进行转换规则设置。
这里我们选择多地址转换模式,分别对温度和湿度两个寄存器进行转换,因此转换数量设置为2,转换类型设置为16位。
接下来设置modbus_parse_in节点的后级节点fscript,主要是对后续的打印信息进行格式化。由于modbus_parse_in节点的输出payload是array型对象,这里我们可以通过fscript的内置方法array_get来获取数据。fscript的内容如下:
a = msg.payloadmsg.payload = "温度:"+array_get(a,0)/10 +",湿度:"+array_get(a,1)/10
4.3 下载验证

连接好硬件,通过下载接口下载流图进行验证。

通过调试面板可以看到读回的温湿度数据。

  modbus_master_dynamic_in节点

modbus_master_dynamic_in同样是Modbus的输入节点,与modbus_master_in的区别是:modbus_master_dynamic_in节点是filter类型的节点,其根据前级节点输入的信息向从机设备读取数据,并输出给消费者节点。

1. 属性

  • 传输类型:用于设置链路层的传输模式(rtu/tcp可选);
  • 主机参数配置:输入节点依赖modbus_master_rtu节点,和使用modbus_master_in节点时一样,选择对应的配置节点即可;

2. 输入

  • slaveID:从机设备的ID地址;
  • address:待读取的寄存器的起始地址;
  • reg_num:待读取的寄存器的数量;
  • reg_type:待读取寄存器的类型。

3. 输出

  • slaveID:从机设备的ID地址;
  • address:待读取的寄存器的起始地址;
  • reg_num:读取到的寄存器的数量;
  • payload:数据缓冲区,存储读取到的数据;
  • payloadLength:读取到的数据长度;
  • poll_result:指明读取是否成功。

3. 使用方式

modbus_master_dynamic_in节点一般是由fscript节点指明需要读取的从机设备的信息,节点本身只需要创建并配置相应的主机即可。对于modbus_master_dynamic_in的输出缓冲区,我们同样使用modbus_parse_in节点进行处理。

在fscript中指明读取内容时,只需提供以下信息:

msg.slaveID = 1msg.address = 0msg.reg_num = 2msg.reg_type = 4

  modbus_master_out节点

modbus_master_out节点是Modbus的输出节点,用于写线圈量和寄存器。

1. 属性

  • 主机参数配置:输出节点依赖modbus_master_rtu节点,选择对应的配置节点即可;
  • 从机ID:待写入的从机设备ID地址;
  • 错误重试次数:发送错误情况下的重试次数;
  • 寄存器类型:待写入寄存器的类型。

2. 输入

  • slaveID:从机设备的ID地址,如果输入中包含此参数,则忽略属性中的地址;
  • address:待写入的寄存器的起始地址;
  • reg_num:待写入的寄存器的数量;
  • payload:写入缓冲区,存储待写入的数据,一般由modbus_parse_out输入;
  • payloadLength:写入缓冲区的字节长度。

3. 输出

modbus_master_out节点是sink类型的节点,一般没有输出。

4. 使用方法

modbus_master_out节点通常由modbus_parse_out节点进行输入。使用时和modbus_master_in一样创建一个主机配置,指明待写入设备的ID地址以及寄存器类型即可。

其中,modbus_parse_out节点的输入一般来自fscript节点,我们可以在fscript中借助array对象完成数据输入。比如我们需要将从机地址为1的设备的寄存器0设置为2,我们只需在fscript中添加如下内容:

var a = array_create();array_isert(a,0,2);
msg.payload = a;msg.slaveID = 1;msg.address = 0;


  modbus_parse_in节点

Modbus输入数据的转换节点,这个节点一般用于接收Modbus输入节点的原始数据,将其转换成单个value或者array对象,以便于后续处理。

1. 属性

  • 数据转换模式:可以选择对输入中的单个地址的数据进行转换,也可以选择对指定数量的寄存器、或者对输入的所有地址进行转换;
  • 转换地址:选择单个寄存器转换时,填写需要转换的寄存器地址;
  • 数据转换起始地址:选择转换多个寄存器时,指明转换的起始地址;
  • 转换数量:选择转换多个寄存器时,指明转换数量;
  • 数据转换类型:选择按照哪种类型对数据进行转换;
  • 大小端选择:大小端系统选择;
  • 数据主题:数据地址的主题(可选)。

2. 输入

modbus_parse_in的输入来自modbus_master_in或modbus_master_dynamic_in节点。
  • slaveID:从机设备的ID地址;
  • address:上一级节点读取的寄存器起始地址;
  • reg_num:上一级节点读取到的寄存器数量;
  • payload:数据缓冲区指针,存储读取到的数据;
  • payloadLength:读取到的字节数据长度;
  • poll_result:上一级节点读取数据是否成功。

3. 输出

  • slaveID:从机设备ID地址;
  • address:转换单个寄存器时,指示数据的寄存器地址;在转换多个寄存器模式下,指示起始的寄存器的地址;
  • payloadType:指示缓冲区的类型是value还是array;
  • payload:转换后的数据缓冲区,在转换单个寄存器时,payload的类型是value,可直接读取;当转换多个寄存器时,payload是个array对象,可以使用rbuffer进行读取;
  • topic:属性中设定的数据主题;
  • poll_result:上一级节点读取数据是否成功。

4. 使用方法

modbus_parse_in节点使用时需要指定转换的模式、待转换的寄存器地址和数量、待转换寄存器的数据类型以及系统的大小端模式。

作为filter类型节点,modbus_parse_in通常是从modbus_master_in节点获取输入。其输出有两种类型,在转换单个寄存器时,payload的类型是value,可以直接读取。
当转换多个寄存器时,payload是个array对象,可以在fscript中通过array对象的方法进行处理。
其中,array对象的使用方式如下:
a = msg.payload
print("湿度 " + array_get(a, 0))print("温度 " + array_get(a, 1))


  modbus_parse_out节点

modbus_parse_out节点通常用于将fscript节点输出的value或array对象转换成Modbus标准的十六进制格式,后续可以将相应的数据指针传入Modbus的输出节点modbus_master_out进行使用。

1. 属性

  • 寄存器起始地址:指明需要modbus_master_out写入的寄存器的起始地址,如果节点的输入不包含msg.address,则使用此属性指向的地址;
  • 大小端:系统大小端模式选择;
  • 主题:如果设定了主题,则节点只处理属于自己的主题消息。

2. 输入

  • slaveID:从机设备ID地址;
  • address:待写入的寄存器起始地址;
  • payload:待写入的值,可以是value类型,也可以是array对象;
  • topic:输入的数据主题,如果本节点设置了主题属性,则只有输入的主题与节点的主题属性匹配,节点才会对下一节点输出;

3. 输出

  • slaveID:从机设备ID地址;
  • address:待写入的寄存器的起始地址;
  • reg_num:待写入的寄存器的数量;
  • payload:转换后的Modbus标准十六进制数组缓冲区指针;
  • payloadLength:数组缓冲区的字节长度。

4. 使用方法

modbus_parse_out节点的前级通常是fscript,使用时在fscript中指明待写入的从机设备ID地址、并传递构建好的array对象即可。其后级节点一般是modbus_master_out节点,通过modbus_master_out节点将数据写入目标设备。

其中,在fscript中构建array对象的方法如下:
a = array_create();array_insert(a, 0, u16(1))array_insert(a, 1, u16(2))array_insert(a, 2, u16(3))
output.payload = a;output.slaveID = 10;output.address = 0;

  关联产品

  技术交流群
长按识别如下二维码可加入“EsDA嵌入式系统设计自动化交流群”,与志同道合的朋友交流,并有专业技术人员为您答疑解惑,如有问题可以咨询小致微信zlgmcu-888。

更多往期文章,请点击“ 阅读原文 ”。

评论 (0)
  • ‌一、高斯计的正确选择‌1、‌明确测量需求‌‌磁场类型‌:区分直流或交流磁场,选择对应仪器(如交流高斯计需支持交变磁场测量)。‌量程范围‌:根据被测磁场强度选择覆盖范围,例如地球磁场(0.3–0.5 G)或工业磁体(数百至数千高斯)。‌精度与分辨率‌:高精度场景(如科研)需选择误差低于1%的仪器,分辨率需匹配微小磁场变化检测需求。2、‌仪器类型选择‌‌手持式‌:便携性强,适合现场快速检测;‌台式‌:精度更高,适用于实验室或工业环境。‌探头类型‌:‌横向/轴向探头‌:根据磁场方向选择,轴向探头适合
    锦正茂科技 2025-05-06 11:36 296浏览
  • 5小时自学修好BIOS卡住问题  更换硬盘故障现象:f2、f12均失效,只有ESC和开关机键可用。错误页面:经过AI的故障截图询问,确定是机体内灰尘太多,和硬盘损坏造成,开机卡在BIOS。经过亲手拆螺丝和壳体、排线,跟换了新的2.5寸硬盘,故障排除。理论依据:以下是针对“5小时自学修好BIOS卡住问题+更换硬盘”的综合性解决方案,结合硬件操作和BIOS设置调整,分步骤说明:一、判断BIOS卡住的原因1. 初步排查     拔掉多余硬件:断开所有外接设备(如
    丙丁先生 2025-05-04 09:14 75浏览
  • 文/Leon编辑/cc孙聪颖‍2023年,厨电行业在相对平稳的市场环境中迎来温和复苏,看似为行业增长积蓄势能。带着对市场向好的预期,2024 年初,老板电器副董事长兼总经理任富佳为企业定下双位数增长目标。然而现实与预期相悖,过去一年,这家老牌厨电企业不仅未能达成业绩目标,曾提出的“三年再造一个老板电器”愿景,也因市场下行压力面临落空风险。作为“企二代”管理者,任富佳在掌舵企业穿越市场周期的过程中,正面临着前所未有的挑战。4月29日,老板电器(002508.SZ)发布了2024年年度报告及2025
    华尔街科技眼 2025-04-30 12:40 329浏览
  • UNISOC Miracle Gaming奇迹手游引擎亮点:• 高帧稳帧:支持《王者荣耀》等主流手游90帧高画质模式,连续丢帧率最高降低85%;• 丝滑操控:游戏冷启动速度提升50%,《和平精英》开镜开枪操作延迟降低80%;• 极速网络:专属游戏网络引擎,使《王者荣耀》平均延迟降低80%;• 智感语音:与腾讯GVoice联合,弱网环境仍能保持清晰通话;• 超高画质:游戏画质增强、超级HDR画质、游戏超分技术,优化游戏视效。全球手游市场规模日益壮大,游戏玩家对极致体验的追求愈发苛刻。紫光展锐全新U
    紫光展锐 2025-05-07 17:07 69浏览
  • 想不到短短几年时间,华为就从“技术封锁”的持久战中突围,成功将“被卡脖子”困境扭转为科技主权的主动争夺战。众所周知,前几年技术霸权国家突然对华为发难,导致芯片供应链被强行掐断,海外市场阵地接连失守,恶意舆论如汹涌潮水,让其瞬间陷入了前所未有的困境。而最近财报显示,华为已经渡过危险期,甚至开始反击。2024年财报数据显示,华为实现全球销售收入8621亿元人民币,净利润626亿元人民币;经营活动现金流为884.17亿元,同比增长26.7%。对比来看,2024年营收同比增长22.42%,2023年为7
    用户1742991715177 2025-05-02 18:40 183浏览
  • 随着智能驾驶时代到来,汽车正转变为移动计算平台。车载AI技术对存储器提出新挑战:既要高性能,又需低功耗和车规级可靠性。贞光科技代理的紫光国芯车规级LPDDR4存储器,以其卓越性能成为国产芯片产业链中的关键一环,为智能汽车提供坚实的"记忆力"支持。作为官方授权代理商,贞光科技通过专业技术团队和完善供应链,让这款国产存储器更好地服务国内汽车厂商。本文将探讨车载AI算力需求现状及贞光科技如何通过紫光国芯LPDDR4产品满足市场需求。 车载AI算力需求激增的背景与挑战智能驾驶推动算力需求爆发式
    贞光科技 2025-05-07 16:54 61浏览
  • 这款无线入耳式蓝牙耳机是长这个样子的,如下图。侧面特写,如下图。充电接口来个特写,用的是卡座卡在PCB板子上的,上下夹紧PCB的正负极,如下图。撬开耳机喇叭盖子,如下图。精致的喇叭(HY),如下图。喇叭是由电学产生声学的,具体结构如下图。电池包(AFS 451012  21 12),用黄色耐高温胶带进行包裹(安规需求),加强隔离绝缘的,如下图。451012是电池包的型号,聚合物锂电池+3.7V 35mAh,详细如下图。电路板是怎么拿出来的呢,剪断喇叭和电池包的连接线,底部抽出PCB板子
    liweicheng 2025-05-06 22:58 184浏览
  • 一、gao效冷却与控温机制‌1、‌冷媒流动设计‌采用低压液氮(或液氦)通过毛细管路导入蒸发器,蒸汽喷射至样品腔实现快速冷却,冷却效率高(室温至80K约20分钟,至4.2K约30分钟)。通过控温仪动态调节蒸发器加热功率,结合温度传感器(如PT100铂电阻或Cernox磁场不敏感传感器),实现±0.01K的高精度温度稳定性。2、‌宽温区覆盖与扩展性‌标准温区为80K-325K,通过降压选件可将下限延伸至65K(液氮模式)或4K(液氦模式)。可选配475K高温模块,满足材料在ji端温度下的性能测试需求
    锦正茂科技 2025-04-30 13:08 509浏览
  • 浪潮之上:智能时代的觉醒    近日参加了一场课题的答辩,这是医疗人工智能揭榜挂帅的国家项目的地区考场,参与者众多,围绕着医疗健康的主题,八仙过海各显神通,百花齐放。   中国大地正在发生着激动人心的场景:深圳前海深港人工智能算力中心高速运转的液冷服务器,武汉马路上自动驾驶出租车穿行的智慧道路,机器人参与北京的马拉松竞赛。从中央到地方,人工智能相关政策和消息如雨后春笋般不断出台,数字中国的建设图景正在智能浪潮中徐徐展开,战略布局如同围棋
    广州铁金刚 2025-04-30 15:24 336浏览
  • 你是不是也有在公共场合被偷看手机或笔电的经验呢?科技时代下,不少现代人的各式机密数据都在手机、平板或是笔电等可携式的3C产品上处理,若是经常性地需要在公共场合使用,不管是工作上的机密文件,或是重要的个人信息等,民众都有防窃防盗意识,为了避免他人窥探内容,都会选择使用「防窥保护贴片」,以防止数据外泄。现今市面上「防窥保护贴」、「防窥片」、「屏幕防窥膜」等产品就是这种目的下产物 (以下简称防窥片)!防窥片功能与常见问题解析首先,防窥片最主要的功能就是用来防止他人窥视屏幕上的隐私信息,它是利用百叶窗的
    百佳泰测试实验室 2025-04-30 13:28 617浏览
  • 某国产固态电解的2次和3次谐波失真相当好,值得一试。(仅供参考)现在国产固态电解的性能跟上来了,值得一试。当然不是随便搞低端的那种。电容器对音质的影响_电子基础-面包板社区  https://mbb.eet-china.com/forum/topic/150182_1_1.html (右键复制链接打开)电容器对音质的影响相当大。电容器在音频系统中的角色不可忽视,它们能够调整系统增益、提供合适的偏置、抑制电源噪声并隔离直流成分。然而,在便携式设备中,由于空间、成本的限
    bruce小肥羊 2025-05-04 18:14 134浏览
  • 多功能电锅长什么样子,主视图如下图所示。侧视图如下图所示。型号JZ-18A,额定功率600W,额定电压220V,产自潮州市潮安区彩塘镇精致电子配件厂,铭牌如下图所示。有两颗螺丝固定底盖,找到合适的工具,拆开底盖如下图所示。可见和大部分市场的加热锅一样的工作原理,手绘原理图,根据原理图进一步理解和分析。F1为保险,250V/10A,185℃,CPGXLD 250V10A TF185℃ RY 是一款温度保险丝,额定电压是250V,额定电流是10A,动作温度是185℃。CPGXLD是温度保险丝电器元件
    liweicheng 2025-05-05 18:36 193浏览
  • 二位半 5线数码管的驱动方法这个2位半的7段数码管只用5个管脚驱动。如果用常规的7段+共阳/阴则需要用10个管脚。如果把每个段看成独立的灯。5个管脚来点亮,任选其中一个作为COM端时,另外4条线可以单独各控制一个灯。所以实际上最多能驱动5*4 = 20个段。但是这里会有一个小问题。如果想点亮B1,可以让第3条线(P3)置高,P4 置低,其它阳极连P3的灯对应阴极P2 P1都应置高,此时会发现C1也会点亮。实际操作时,可以把COM端线P3设置为PP输出,其它线为OD输出。就可以单独控制了。实际的驱
    southcreek 2025-05-07 15:06 57浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦