Modbus协议应用于串行链路时Modbus从站的编程点

笔记Modbus从站以RS-485标准来传输数据的编程要点:“Modbus主、从站通信过程”,“Modbus从站状态转换”,“数据引用”,“时间监测”。


1 Modbus主、从站通信过程

以RS-485标准来传输数据时是半双工的方式,在同一时刻,RS-485转换器件及线路只能处于发送或者接收的状态。主从站的通信过程必须符合以下流程,

Modbus协议应用于串行链路时Modbus从站的编程点_第1张图片

Figure1:Modbus主/从站通信时序

Modbus的一个通信周期是请求加响应或者命令的执行。同一个周期下,只能有一个主站且一个主站只能与一个从站通信。Modbus主站命令可以是主站和广播的方式。广播不需要响应只需要执行相应的命令。


2 Modbus从站状态转换                 

作为Modbus从站,除了要符合Modbus主/从站通信时序外,它还得依据Modbus请求包mb_req内容正确的转换接收和发送状态,

Modbus协议应用于串行链路时Modbus从站的编程点_第2张图片

Figure2:Modbus从站状态转换

用芯片内的定时器来完成Modbus从站中的状态转换。在USART中断函数中接收到一个字符就重新启动定时器重新开始计数,当接收完某个字符定时器定时超过发送4.5个字符时间时就表示接收Modbus请求包完毕,在定时器中断函数中就可以使能解析Modbus请求包的变量,当按照上图情况解析完Modbus请求包后使能发送标志,并在USART中断函数中发送Modbus响应包,当发送完最后一个字符后再重新启动定时器重新计数,当计数发送4.5个字符时间后从站又转换为接收状态,重新接收主站发来的Modbus请求包,…,主从站就按照这个秩序一直进行下去。


3 数据引用

在主站中组织的Modbus请求包mb_req中,mb_req的第2个字节表示功能码,每个功能码都对应着从站的一块存储区。第3和第4个字节中包含了访问存储块的起始地址,第5和第6个字节中包含了访问存储块的数量。

如在实现Modbus从站时,为功能码0x04(读输入寄存器)开辟一块存储区static char mb_buff[100];。现在Modbus从站中正确接收到mb_req包的内容为

01

04

00

01

00

03

CRCLi

CRCHi

第1个字节表示本从站地址。第2个字节表示读输入寄存器(读mb_buff中的数据)。第3和第4个字节分别表示读输入寄存器高和低8位,表示读输入寄存器的起始地址为0x0001,对应到 从内存空间偏移起始地址值后的下一个字节(mb_buff + 0x0002)开始读数据。第5和第6个字节分别表示读输入寄存器个数的高和低8位,表示读输入寄存器的个数为0x0003,对应着读[ mb_buff + 0x0002,mb_buff + 0x0007]这几个字节( 每个输入寄存器为两个字节)。


4 t1.5和t3.5

在以Corte-M3为内核的芯片中编程时, 数据寄存器中有内容时发生接收数据的中断,当接收到一个字符后再立即重新启动定时器到收到下一个字符定时器所记录的时间为收到当前字符的时间及与收到上一个字符所间隔的时间。

Modbus协议应用于串行链路时Modbus从站的编程点_第3张图片

Figure3:Modbus字符收取时间间隔

Modbus协议要求收取两个字符的时间间隔要小于发送1.5个字符的时间,那么在用USART中断函数中接收字符时,判断与上一个字符的时间间隔应该加上接收当前字符的时间,只要定时器所记录的时间小于发送2.5个字符时间都是合理的。同理,两个Modbus数据包之间所要求的最小时间间隔也需要加上接收一个字符的时间。但是不能在中断函数中等着接收下一个Modbus数据包的第一个字符了,因为在接收到Modbus请求包mb_req后Modbus从站就不该再继续接收Modbus请求包,从站任务转向解析Modbus请求包,然后让RS-485状态转换为发送模式,以向主站响应Modbus响应包mb_rsp。


SBox Note Over.

你可能感兴趣的:(Modbus协议应用于串行链路时Modbus从站的编程点)