早在2008年左右,我就使用Modbus协议与产品中的其他设备进行通信。
请记住,第一个是智能电动机保护器,它充当Modbus从站并与Modbus主站设备通信。
这么多年来,一直没有使用开源的Modbus协议代码,但是我自己编写的Modbus协议代码一直在不断优化,发现并解决了问题。
自己编写的代码更易于使用。
可以针对不同平台优化该应用程序,以最大化处理器的性能。
在此期间,我踩了一些坑,现在我将得出一些结论:接收到串行端口数据后,将重新使用从通过IO端口接收数据的时间间隔。
发送后切换接收的延迟时间。
如上图所示,Td根据Modbus协议的规定,在接收到数据之后,发送之前必须有3.5个字符的间隔。
如果波特率为9600bps,8个数据位,1个起始位,1个停止位且没有奇偶校验位,则1个字符为10位(对应于1.04ms)和3.5个字符(对应于3.5ms)。
考虑到总线上的电容对传输延迟的影响,建议在发送1.7个字符的数据后启用接收。
这次可能会犯一些错误,例如:在发送完最后一个字节后的发送完成中断中,直接控制IO端口以使能485芯片的接收。
众所周知,由于电容器引起的信号延迟,串口数据没有完全发送到总线,并且485芯片被设置为接收状态,导致最后几位数据错误;不能正确理解传输完成中断和传输缓冲区清空中断。
传输完成中断之间的区别通常是指串行端口数据已从移位寄存器中的端口发送出去。
但这并不意味着它已经发送到RS485总线。
从MCU的IO端口到RS485总线,还必须考虑隔离光电耦合器,电容器和RS485芯片的延迟。
发送缓冲区为空的中断意味着缓冲区位置已腾空,数据可以被缓冲。
此时,最后的数据可以在移位寄存器中按顺序移出到IO端口。
此时,RS485芯片被设置为接收。
数据仍在不断变化。
因此,有必要弄清楚所选择的中断是发送完成中断还是缓冲区空中断。
在发送中断中,它不能切换为立即接收,因此应延迟一段时间。
在中断中,如果判断为最后一个字节,则延迟为1.7ms,并且将RS485设置为接收。
定时器不应该延时启动,定时器资源是非常宝贵的,它应该由大约100us的定时器中断中的变量来计数,大约需要1.7ms的延时; MODBUS从站设备将响应多长时间? Modbus是一种问答式通信。
主设备发送数据后,从设备将响应。
根据Modbus协议,从站在3.5个字符后做出响应是合法的。
不同的传感器具有不同的响应时间。
一些不良的传感器可能要到几十毫秒后才会响应,而有些传感器会在3.5ms左右立即响应。
有些甚至没有遵循Modbus协议,因此在3.5ms之前做出了响应。
这要求主设备在启用RS485接收后立即进入接收状态。
如果使用串行端口中断接收,则应注意中断操作是否与主程序有关,以及中断操作是否会影响接收。
每个串行端口数据之间的时间间隔Modbus根据数据之间的时间间隔判断帧消息的结束。
必须确保帧消息中前后数据之间的间隔不超过3.5个字符。
通常在发送中断期间发送数据。
为了确保数据的完整性和相互排斥的数据访问,有些人喜欢关闭中断以保护现场。
如果您不小心,这种方法将导致两次发送数据之间的间隔超过3.5个字符。
特别是当波特率较高时,更可能发生这种情况。
例如,当波特率为38400时,3.5个字符仅约为850us。
在发送串行端口数据期间,如果中断关闭了850us,则Modbus通信将中断。
如果MCU支持DMA,建议使用DMA +定时器进行数据发送和接收。
作为Modbus从站设备,接收数据后需要多长时间进行响应?根据要求