
Modbus就是一个总线通信协议但是他不依赖于硬件总线。Modbus是一主多从的通信协议不能Modbus同步进行通信,主机在同一时间内只能向一个从机发送请求总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。从机不会自己发送消息给主站只能回复从主机发送的消息请求。存储的数据类型 可以分为 布尔量 和 16位寄存器布尔量比如IO口的电平高低灯的开关状态等。16位寄存器比如 传感器的温度数据存储的密码等。Modbus协议规定了4个存储区 分别是0 1 3 4区 其中0区和4区是可读可写1区和3区是只读。Modbus还给每个区都划分了地址范围主机向从机获取数据时只需要告诉从机数据的起始地址还有获取多少字节的数据从机就可以发送数据给主机Modbus数据模型 规定了具体的地址范围每一个从机都有实际的物理存储跟modbus的存储区相对应主机读写从机的存储区实际上就是对从机设备对应的实际存储空间进行读写。Modbus协议使用串口传输时可以选择RTU或ASCII模式并规定了消息、数据结构、命令和应答方式并需要对数据进行校验。ASCII 模式采用LRC校验RTU模式采用16 位CRC校验。通过以太网传输时使用TCP这种模式不使用校验因为TCP协议是一个面向连接的可靠协议。如果我们需要发送一个数字10 那么RTU模式下只需要发送 0x0A 总线上传输数据形式为 0000 1010而ASCII码模式则将数据1和0转为’1’和’0’,需要发送0x31(1) 0x30(0)两个字节数据。总线上传输数据形式为 0011 0001 0011 0000ModbusASCII有开始字符(和结束字符(CR LF)可以作为一帧数据开始和结束的标志而ModbusRTU没有这样的标志需要用时间间隔来判断一帧报文的开始和结束协议规定的时间为3.5个字符周期就是说一帧报文开始前必须有大于3.5个字符周期的空闲时间一帧报文结束后也必须要有3.5个字符周期的空闲时间否则就会出现粘包的情况。注意针对3.5个字符周期其实是一个具体时间但是这个时间跟波特率相关。在串口通信中1个字符包括1位起始位、8位数据位一般情况、1位校验位或者没有、1位停止位一般情况下因此1个字符包括11个位那么3.5个字符就是38.5个位波特率表示的含义是每秒传输的二进制位的个位因此如果是9600波特率3.5个字符周期/960038.50.00401s10004.01m原文链接Modbus-RTU协议在串行链路上的报文格式如下所示Modbus功能码Modbus规定了多个功能那么为了方便的使用这些功能我们给每个功能都设定一个功能码也就是指代码。其中常用的八种1、主机对从机读数据操作2、主机对从机写数据操作Modbus-TCP并不需要从从机地址而是需要MBAP报文头并且不需要差错校验因为TCP本身就具有校验差错的能力。