简介 这是 armink 大神移植的 freemodbus 协议栈。同时支持主机和从机的功能。
freemodbus 是一款开源的 modbus 协议栈,但是只有从机开源,主机源码是需要收费的。同时网上也没有发现比较好的开源的 modbus 主机协议栈,所以才开发这款支持主机模式的 freemodbus 协议栈。本版 freemodbus版本号更改为v1.6,特性如下:
新增加的主机源码与原有从机的风格及接口保持一致; 支持主机与从机在同一协议栈运行; 支持实时操作系统及裸机移植; 为应用提供多种请求模式,用户可以选择阻塞还是非阻塞模式,自定义超时时间等,方便应用层灵活调用; 支持所有常用的modbus方法。 文件结构 注:所有带_m后缀的文件为主机模式下必须使用的文件,如使用从机模式则无需这些文件。
许可证 freemodbus 软件包遵循 bsd 许可,详见 license 文件。
依赖 rt_thread uart 设备 获取方式 使用 freemodbus 软件包 需要在 rt-thread 的包管理器中选择它,具体路径如下:
最后让 rt-thread 的包管理器自动更新,或者使用 pkgs --update 命令更新包到 bsp 中。
使用方法 数据缓冲区 数据缓冲区定义的位置位于 freemodbus\port\user_mb_app_m.c 文件顶部,共计 4种 数据类型。 freemodbus从机默认使用 一维数组 作为缓存区数据结构,主机可以存储所有网内从机的数据,所以主机采用 二维数组 对所有从机节点数据进行存储。二维数组的列号代表寄存器、线圈及离散量地址,行号代表从机节点id,但需要做减一处理,例如usmregholdbuf[2][1]代表从机id为 3,保持寄存器地址为 1 的从机数据。
modbus 数据处理回调接口 modbus 一共有4种不同的数据类型,所有的 modbus 功能都围绕这些数据类型进行操作。由于不同的用户数据缓冲区结构可能有所不同,那么对应的 modbus 数据处理方式也就存在差异,所以用户需要把每种数据类型对应的操作,按照自己的数据缓冲区结构进行定制实现。 所有的 modbus 数据处理回调接口如下:
对于数组形式的数据缓冲区结构,源码中已经做好了移植,直接使用即可。
初始化配置流程 本协议栈所有配置参数都位于freemodbus\modbus\include\mbconfig.h,目前协议栈支持主机及从机两种模式,并且支持两种模式同时开启。从机支持modbus rtu 、modbus ascii 及modbus tcp 3种模式,主机现在只支持常用的modbus rtu模式。在使用主机的过程中,用户需要对广播的转换延时时间、命令响应超时时间及从机数量做以配置。需要注意的是,目前协议栈只支持从机地址连续,并且起始地址从1开始。
正常使用流程 调用embmasterinit方法初始化modbus主机协议栈,主机涉及到的一些硬件就在这个时候做了初始化 调用embmasterenable方法启动modbus主机 通过在线程或者定时器轮询调用embmasterpoll方法,轮询周期决定了命令的响应时间。 调用主机请求api方法,设定一定的请求超时时间,直到方法有结果后才会返回。如果方法执行成功并且命令是读命令,可以通过查看modbus主机的数据缓冲区,获取最新从机数据。 具体的使用方法,可以参考 /samples 目录下的示例代码。调试 modbus 的主从机程序可以在 pc 上使用 modbus poll 和 modbus slave 软件配合调试。
异常处理流程 异常处理主要出现在主机正常使用过程中,所有的主机请求api的错误码都在第三章开头已经做以描述,针对的这些错误码,用户需要根据自己的产品特征去完成不同的动作。建议用户自己封装实现主机请求方法的重发机制,这样实现方式比较灵活,一般是在接收到帧数据出错及命令响应超时的错误码时需要重发,重发次数自动加一,如果重发次数超过设定值则认为从机掉线,以后所有只要是发给这个从机命令都被提前拦截掉;如果第二次重发命令响应成功,则自动清零该从机重发次数。 上述所有功能可以利用主机请求方法或者使用freemodbus\port\portevent_m.c中的回调接口来实现,用户可以根据自己的需求灵活选择。
api 详解 modbus 主机使用过程中与从机有很大不同,从机是需要被动等待主机请求,而主机则是主动发出请求,并接收处理从机响应。在主机发送广播请求的时候,从机不需要返回响应,所以广播请求适合主机的写从机数据命令,不适合读从机数据命令。 主机请求api中的所有方法的返回值格式都相同,返回值意义如下。
所有的主机请求方法都是 线程安全 的也是 阻塞模式 的。在使用过程中,只要在设定的超时时间内没有得到主机资源,就会返回主机忙;如果在设定的超时时间内得到主机资源,那么必须等待得到请求结果后才会返回。
写单个保持寄存器 往从机某个保持寄存器中写入数据
写多个保持寄存器 往从机多个保持寄存器中写入数据。
读多个保持寄存器 读取多个保持寄存器中的数据
读写多个保持寄存器 先读多个寄存器,然后再写多个寄存器。
读多个输入寄存器 读取多个输入寄存器中的数据
写单个线圈 往从机某个线圈中写入数据
写多个线圈 往从机多个线圈中写入数据。
读多个线圈 读取多个线圈中的数据
读多个离散输入 读取多个离散输入中的数据
注意事项 从机支持modbus rtu 、modbus ascii 及modbus tcp 3种模式,主机现在只支持常用的modbus rtu模式。 目前协议栈只支持从机地址连续,并且起始地址从1开始。
光学扫描测量精度的影响因素及对策分析
SysTick时钟
安防监控ffc排线的选择和排布,是确保画面成像质量的关键所在
SolidWorks如何在圆柱零件上打孔?异型开孔教程!
LG G6 跑分数据曝光:骁龙820+4GB内存+Android 7.0
开发一款支持主机模式的FreeModbus协议栈
串口通讯波特率出现误差的因素
区块链如何才能解决广告技术的透明度问题
PT2044单通道触摸检测芯片概述、特性及应用电路
基于单片机的LED显示监控板系统的设计
如何分辨劣质电器
聚焦CES 2013:超高清电视无法一炮打响的三大原因
关于智能化欧玛执行器与一般电动执行机构的对比
采用分立元件的视频发射电路
高通骁龙 888 进军中国大陆 5G 市场,联发科压力山大
恩智浦推出全新的射频功率器件顶部冷却封装技术,进一步缩小5G无线产品尺寸
低成本又优质PCB制造怎样找
鸿蒙能竞争过安卓吗?鸿蒙存在巨大机会
中兴通讯与GE Digital签署了战略合作协议将共同探索5G领域
步进电机驱动器细分解析