打印

Windows系统下 Modbus RTU 编程如何实现 t3.5延时

[复制链接]
2057|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ztb|  楼主 | 2019-4-11 11:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ztb 于 2019-4-11 11:15 编辑

根据 Modbus RTU 协议要求,通信报文帧是靠大于3.5个字符的空白时间作为间隔的.这个在单片机中比较容易做到.而在windows系统下就难了.例如VB6.0 定时间隔的分辨率为1/18秒,而9600速率下的t3.5=4mS 定时器根本无法用于在高速通信时的定时.即便是使用mS级别的系统时钟 timeGetTime 也无法实现115200速率下t3.5的0.33mS定时.
Modbus本来报文较短,在高速率下间隔时间过长严重影响通信效率.不知道各位是如何处理这个问题的?

使用特权

评论回复

相关帖子

沙发
mcu5i51| | 2019-4-11 11:16 | 只看该作者
多媒体定时器

使用特权

评论回复
评论
ztb 2019-4-11 12:57 回复TA
timeGetTime 就是 Winmm.dll (多媒体定时器)中的函数呀! 最小时间1mS 
板凳
逆天凡凡| | 2019-4-11 12:00 | 只看该作者
帮你顶起  求大神

使用特权

评论回复
地板
nethopper| | 2019-4-12 01:29 | 只看该作者
看下SetCommTimeouts(),可到1ms.
BOOL WINAPI SetCommTimeouts(
  _In_ HANDLE         hFile,
  _In_ LPCOMMTIMEOUTS lpCommTimeouts
);

typedef struct _COMMTIMEOUTS {
  DWORD ReadIntervalTimeout;
  DWORD ReadTotalTimeoutMultiplier;
  DWORD ReadTotalTimeoutConstant;
  DWORD WriteTotalTimeoutMultiplier;
  DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS, *LPCOMMTIMEOUTS;




使用特权

评论回复
5
ztb|  楼主 | 2019-4-12 10:05 | 只看该作者
nethopper 发表于 2019-4-12 01:29
看下SetCommTimeouts(),可到1ms.
BOOL WINAPI SetCommTimeouts(
  _In_ HANDLE         hFile,

是的,在VB中也可以实现1mS的定时.mS以下的就没有好办法了.

使用特权

评论回复
6
cjseng| | 2019-4-12 14:00 | 只看该作者
>3.5T也不会出现问题啊

使用特权

评论回复
7
ztb|  楼主 | 2019-4-13 14:12 | 只看该作者
cjseng 发表于 2019-4-12 14:00
>3.5T也不会出现问题啊

    我这里谈及这个问题主要是为为了通信效率. ModBus 协议的传输效率随报文长度而异一般在50%以下.就是说,发送100个字节有一半多是用来纠错和协调的.这还是指遵守协议间隔为3.5T条件下计算的.如果来往报文的间隔扩大其效率还会下降.为了保持数据量就要提高通讯速率.而高速率又会带来新的问题.所有尽量减小报文的间隔才是最有效的办法.
    对于VB6.0 MSDN 在<使用 Timer 控件> 一节有如下描述:
"系统每秒生成 18 个时钟信号─ 所以即使用毫秒衡量 Interval 属性,间隔实际的精确度不会超过 18 分之一秒。"
    如此,报文的最小间隔就是55.5mS.以最常用的03命令为例,请求数据7字节,回送数据6字节.在9600速率下间隔2x3.5=7字节.如此总时长为20字节=22.9mS.如果有一端变成55mS那么总时间长就是 22.9-4+55.5=74.4mS, 传输效率再下降32.5%.如果是115200的速率,字节传输效率已经是3.3%了.总线上超过96%的时间是空闲的这是多大的浪费呀!

使用特权

评论回复
8
舍恩| | 2020-3-1 16:33 | 只看该作者
帮顶, 我也碰到这个问题, 为什么我用多媒体定时器就出问题, 目前只能用SetTimer KillTimer, 最小时间间隔也有15ms~16ms

使用特权

评论回复
9
R2D2| | 2020-3-4 20:36 | 只看该作者
Windows下面不要用MODBUS RTU,要用MODBUS ASCII。

使用特权

评论回复
10
叶春勇| | 2020-3-6 09:25 | 只看该作者
我也是用SetCommTimeouts,这个函数在python中也有。

使用特权

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

本版积分规则

ztb

139

主题

660

帖子

9

粉丝