Modbus
深入探究FreeModbus的实现细节
优惠券已抵扣
余额抵扣
还需支付
¥299.90
¥399.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
Stone_lu。
这个作者很懒,什么都没留下…
展开
-
Modbus协议模型
Modbus协议主要描述的是应用层的信息封装格式,处于OSI模式的第七层(应用层)。Modbus的物理层可以是RS-485、Ethernet II /802.3。Modbus协议栈的层次图: 本文主要介绍Modbus使用物理层是EIA/TIA-485的情况。Modbus主要内容为应用层协议,所以在现实使用中可以将EIA/TIA-485(485)...原创 2018-06-28 14:13:05 · 2077 阅读 · 0 评论 -
Modbus协议格式
MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。启动MODBUS 事务处理的客户机创建MODBUS应用数据单元。功能码向服务器指示将执行哪种操作。...原创 2019-04-07 18:37:19 · 1334 阅读 · 0 评论 -
Modbus节点地址规则
Modbus 寻址空间有256 个不同地址。地址 0 为广播地址。所有的子节点必须识别广播地址。Modbus 主节点没有地址, 只有子节点必须有一个地址。该地址必须在Modbus 串行总线上唯一。...原创 2019-08-06 23:10:25 · 7086 阅读 · 0 评论 -
Modbus串行传输方式
传输方式在485总线上使用Modbus协议,有两种主要方式:RTU ASCII。RTU传输方式传输的数据帧为二进制数据,ASCII传输方式传输的是ASCII码。举例来说要发送 0x31(十进制数)使用RTU直接发送0x31就可以(占用一个byte),而ASCII码传输方式则需要发送0x33和0x31这两个字节(即十六进制数0x31的 高低位分别占用一个byte)。两种传输方式各有利弊,使用...原创 2019-04-07 19:11:06 · 2820 阅读 · 0 评论 -
Modbus以太网传输方式
通信结构MODBUS TCP/IP 的通信系统可以包括不同类型的设备:502端口是为MODBUS通信保留的,在缺省状态下,强制侦听这个口。 连接至TCP/IP 网络的MODBUS TCP/IP 客户机和服务器设备 互连设备,例如:在TCP/IP网络和串行链路子网之间互连的网桥、路由器或网关,联接,该子网允许将MODBUS 串行链路客户机和服务器终端设备连接起来。...原创 2019-08-06 23:38:26 · 10208 阅读 · 0 评论 -
Modbus功能码
功能码 名称 作用 01 读取线圈状态 取得一组逻辑线圈的当前状态(ON/OFF) 02 读取输入状态 取得一组开关输入的当前状态(ON/OFF) 03 读取保持寄存器 ...原创 2019-04-07 19:12:23 · 991 阅读 · 0 评论 -
Modbus异常码
功能码域在正常响应中,服务器利用响应功能码域来应答最初请求的功能码。所有功能码的最高有效位(MSB)都为0(它们的值都低于十六进制80)。在异常响应中,服务器设置功能码的MSB 为1。这使得异常响应中的功能码值比正常响应中的功能码值高十六进制80。通过设置功能码的MSB,客户机的应用程序能够识别异常响应,并且能够检测异常码的数据域。数据域在正常响应中,服务器可以返回数据域中数据或...原创 2019-04-07 19:13:08 · 5120 阅读 · 0 评论 -
Modbus寄存器地址规则
Modbus协议定义的寄存器地址是5位十进制地址,即:线圈(DO)地址:00000~09999触点(DI)地址:10000~19999输入寄存器(AI)地址:30000~39999输出寄存器(AO)地址:40000~49999由于上述各类地址是唯一对应的,因此有些资料就以其第一个数字区分各类地址,即:0x代表线圈(DO)类地址,1x代表触点(DI)类地址、 3x代表输入寄...原创 2019-08-09 00:32:31 · 59831 阅读 · 5 评论 -
FreeModbus源码获取
1.进入官网:https://www.embedded-solutions.at/en/freemodbus/2.进入下载页面3.下载源码4.解压源码5.查看FreeRTOS源码原创 2019-04-07 21:34:21 · 5980 阅读 · 0 评论 -
FreeModbus移植到STM32F103(串行传输方式)
1.创建工程2.将FreeModbus源码,拷贝到工程目录3.将FreeModbus文件添加进工程添加好之后,编译出现错误4.移植底层接口先看第一个错误,缺少port.h借鉴AVR架构的程序,将demo里面AVR中的port文件夹,拷贝到工程中进入port文件夹,删除重复文件,mbcrc.c...原创 2019-04-07 22:32:20 · 3846 阅读 · 4 评论 -
FreeModbus移植到STM32F107(以太网传输方式)
1.创建工程配置好之后生成工程2.将FreeModbus源码,拷贝到工程目录3.将FreeModbus文件添加进工程打开mbtcp.c文件发现,受MB_TCP_ENABLED宏定义的影响,所有代码都是灰的因此跳转到宏定义的地方。打开TCP模式,并将RTU和ASCII模式关闭打开mbrtu.c和mb...原创 2019-08-07 23:42:52 · 2143 阅读 · 2 评论 -
FreeModbus串行传输初始化
先看一下初始化函数,参数包括传输模式、从机地址、端口号、波特率和奇偶校验。从函数大概能够猜到,初始化内容:选择传输模式,设置从机地址,配置串口。/* 初始化Modbus协议栈 */eMBErrorCode eMBInit(eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParit...原创 2019-04-08 10:12:59 · 1280 阅读 · 1 评论 -
FreeModbus RTU传输
首先,在使能modbus协议栈的时候,会调用pvMBFrameStartCur函数/* 使能modbus */eMBErrorCode eMBEnable(void){ eMBErrorCode eStatus = MB_ENOERR; /* modbus还未使能 */ if(eMBState == STATE_DISABLED) { /* 启动modbus */ pv...原创 2019-04-08 11:14:06 · 3474 阅读 · 4 评论 -
FreeModbus ASCII传输
首先,在使能modbus协议栈的时候,会调用pvMBFrameStartCur函数/* 使能modbus */eMBErrorCode eMBEnable(void){ eMBErrorCode eStatus = MB_ENOERR; /* modbus还未使能 */ if(eMBState == STATE_DISABLED) { /* 启动modbus */ pv...原创 2019-04-08 13:39:22 · 924 阅读 · 0 评论 -
FreeModbus TCP传输初始化
先看一下初始化函数,参数只有端口。/* modbus协议栈初始化 */eMBErrorCode eMBTCPInit(USHORT ucTCPPort);在网络通信过程中,502端口是专门为modbus保留的,其它应用不得占用该端口。在缺省配置的情况下,强制使用502端口。modbus协议栈的初始化,主要工作为tcp初始化,注册一些接口,设置节点号。特别要注意节点...原创 2019-08-07 23:50:36 · 2384 阅读 · 3 评论 -
FreeModbus TCP传输
首先,在使能modbus协议栈的时候,会调用pvMBFrameStartCur函数/* 使能modbus */eMBErrorCode eMBEnable(void){ eMBErrorCode eStatus = MB_ENOERR; /* modbus还未使能 */ if(eMBState == STATE_DISABLED) { /* 启动modbus */ p...原创 2019-08-07 23:47:59 · 3163 阅读 · 3 评论 -
FreeModbus输入寄存器
输入寄存器的访问属性为只读对输入寄存器的操作包括:读输入寄存器(0x04)在一个远程设备中,使用该功能码读取1 至大约125 的连续输入寄存器。请求PDU 说明了起始地址和寄存器数量。从零开始寻址寄存器。因此,寻址输入寄存器1-16 为0-15。将响应报文中的寄存器数据分成每个寄存器为两字节,在每个字节中直接地调整二进制内容。对于每个寄存器,第一个字节包括高位比特,并且第二个字...原创 2019-04-08 21:22:32 · 1775 阅读 · 1 评论 -
FreeModbus保持寄存器
保持寄存器的访问属性为读写对保持寄存器的操作包括:读保持寄存器(0x03)、写单个保持寄存器(0x06)、写多个保持寄存器(0x10)、读写多个保持寄存器(0x17)读保持寄存器(0x03)在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。请求PDU说明了起始寄存器地址和寄存器数量。从零开始寻址寄存器。因此,寻址寄存器1-16 为0-15。将响应报文中的寄存器数据...原创 2019-04-08 21:39:22 · 4601 阅读 · 0 评论 -
FreeModbus离散量输入
离散量输入的访问属性为只读对离散量输入的操作包括:读离散量输入(0x02)在一个远程设备中,使用该功能码读取离散量输入的1 至2000 连续状态。请求PDU 详细说明了起始地址,即指定的第一个输入地址和输入编号。从零开始寻址输入。因此寻址输入1-16 为0-15。根据数据域的每个比特将响应报文中的离散量输入分成为一个输入。指示状态为1= ON 和0=OFF。第一个数据字节的LSB...原创 2019-04-08 21:44:25 · 3014 阅读 · 0 评论 -
FreeModbus线圈
线圈的访问属性为读写对线圈的操作包括:读线圈(0x01)、写单个线圈(0x05)、写多个线圈(0x0F)读线圈(0x01)在一个远程设备中,使用该功能码读取线圈的1 至2000 连续状态。请求PDU 详细说明了起始地址,即指定的第一个线圈地址和线圈编号。从零开始寻址线圈。因此寻址线圈1-16 为0-15。根据数据域的每个比特将响应报文中的线圈分成为一个线圈。指示状态为1= O...原创 2019-04-08 21:55:08 · 2229 阅读 · 0 评论