打印

MODBUS RTU 协议的模拟量采集,怎么做到通讯不丢码?

[复制链接]
1775|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tcc8073|  楼主 | 2019-9-26 15:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
ningling_21| | 2019-9-26 17:28 | 只看该作者
优先处理通信数据并及时响应

使用特权

评论回复
板凳
dirtwillfly| | 2019-9-26 18:03 | 只看该作者
看程序优先级和控制逻辑吧,我从没遇到过丢数据的问题

使用特权

评论回复
地板
18990194628| | 2019-9-27 09:08 | 只看该作者
确保总线匹配正确,确保串口数据交互的优先级,确保发和收之间的时间间隙

使用特权

评论回复
5
mohanwei| | 2019-9-27 20:50 | 只看该作者
怎么会丢码……
除非上位机把超时参数设的太短,碰到系统引起延迟时容易误报“丢包”。

使用特权

评论回复
6
tcc8073|  楼主 | 2019-10-4 07:43 | 只看该作者
dirtwillfly 发表于 2019-9-26 18:03
看程序优先级和控制逻辑吧,我从没遇到过丢数据的问题

PC不是事时系统,设定时间间隔只能大概不会很精准,请问您是以什么来测试得出不丢数据的结论呢,我目前是用PC做测试的,测几天内总是会有一帧丢字节,或者莫名的多出一到二个字节。

使用特权

评论回复
7
叶春勇| | 2019-10-5 10:41 | 只看该作者
tcc8073 发表于 2019-10-4 07:43
PC不是事时系统,设定时间间隔只能大概不会很精准,请问您是以什么来测试得出不丢数据的结论呢,我目前是 ...

1、有干扰
2、查modbus通讯代码是否有bug

使用特权

评论回复
8
mjs0528| | 2019-10-6 12:05 | 只看该作者
中断接收,并且确保数据线无干扰,用屏蔽电缆,一般就不会丢数据了

使用特权

评论回复
9
tcc8073|  楼主 | 2019-10-7 08:33 | 只看该作者
本帖最后由 tcc8073 于 2019-10-7 08:38 编辑
mjs0528 发表于 2019-10-6 12:05
中断接收,并且确保数据线无干扰,用屏蔽电缆,一般就不会丢数据了

程序是中断接收的,按照数据处理和校验计算所需要的时间等加起来做时间间隔,比如115200BPS的时候发送8字节需要800US,发送7字节需要700US,处理校验需要1MS,其他等需要1MS,这样大概就是4MS收发一次数据,按照计算接收是不会有丢数据的,但是实际上是会出现丢数据的情况,延长到5MS,10MS也会出现丢的情况,当然丢数据的量很少,我是希望能做到完全不丢数据,一直在找问题,但是效果不明显,因为一直达不到设计要求的收发速度,当然,如果速度慢的话,那是不会丢数据的。同样的方案,在TCP MODBUS上是可以做到1K速度不会丢数据的,但是在MODBUS RTU的时候速度上不去,即使是是使用了串口空闲中断和发送中断也达不到速度要求。

使用特权

评论回复
10
R2D2| | 2019-10-9 16:16 | 只看该作者
直接抄freemodbus比你自己写的不知道高明到哪里去了。

使用特权

评论回复
11
tcc8073|  楼主 | 2019-10-12 15:15 | 只看该作者
R2D2 发表于 2019-10-9 16:16
直接抄freemodbus比你自己写的不知道高明到哪里去了。

我们的处理方式和FREEMODBUS的是相同的,现在只是想把速度提高

使用特权

评论回复
12
515192147| | 2019-10-15 09:15 | 只看该作者
本帖最后由 515192147 于 2019-10-15 10:13 编辑

485 通信 丢包 是正常  的,特别 应用到 实际  现场
要想不丢包,只能 用 CAN;我们的 CANWeb可以替代 485
可参见我们的 开发板,可快速 开发 CANWeb产品
10CANWeb_STM32F10x开发板基本功能源程序说明191004.zip (2.82 MB)


653175da51dc32d9ed.png (715.79 KB )

653175da51dc32d9ed.png

使用特权

评论回复
13
oufuqiang| | 2019-10-15 12:10 | 只看该作者
丢包跟是什么总线和协议有什么关系?
那是写程序的人的问题。
can写不好一样要丢包
485写好了一样不丢包

使用特权

评论回复
14
iwjj1985| | 2019-10-22 10:09 | 只看该作者
这个和很多因数相关的,比如你的硬件电路,通讯波特率的时钟精度,软件的逻辑等。。。

使用特权

评论回复
15
iwjj1985| | 2019-10-22 10:12 | 只看该作者
你可以测量下你的波特率精度,正常情况下,MODBUS-RTU可以做到误码0的

使用特权

评论回复
16
xianghou| | 2019-10-28 11:17 | 只看该作者
为什么会丢包?我做的测试环境三个MODBUS子站,电脑做主站轮询,每个子站每秒10次轮询20个16位数据,测试了两天,没有丢包

使用特权

评论回复
17
tcc8073|  楼主 | 2019-10-28 20:39 | 只看该作者
xianghou 发表于 2019-10-28 11:17
为什么会丢包?我做的测试环境三个MODBUS子站,电脑做主站轮询,每个子站每秒10次轮询20个16位数据,测试了 ...

我是需要做到4MS读取返回一次,发送8字节,接收7字节,校验1MS,但是就是发现返回数据会丢字节,没有找到原因,以下是查询发送的子程序:
void sendarry(u8 *p,u8 i)
{
  u8 k;
  USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
  RS485_EN=1;
  for(k=0; k<i; k++)       //数据发出
    { while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET);//是否为空                                                                                                     
      USART_SendData(USART1,p[k]);                    
      while(USART_GetFlagStatus(USART1, USART_FLAG_TC)!=SET);
          USART_ClearFlag(USART1, USART_FLAG_TC);
          delay_usx(3);                        
    }
  RS485_EN=0;
}

使用特权

评论回复
18
R2D2| | 2019-10-28 21:15 | 只看该作者
涉及到上位机就不要用MODBUS-RTU,因为PC端实时性不好,根本检测不到3.5个字节的总线空闲帧头标志。换MODBUS-ASCII吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:诚信,务实,专业,创新

179

主题

1359

帖子

7

粉丝