首页 上一页 1 2 下一页 尾页

Windows系统下的实时性问题 点击:8580 | 回复:27



天罡

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:13帖 | 23回
  • 年度积分:0
  • 历史总积分:113
  • 注册:2004年4月16日
发表于:2004-08-12 08:10:00
楼主
如果我想在windows下实现实时,能达到毫秒级的工业控制,该怎么实现,例如:我用VC开发了一个控制界面+运动控制卡+机械本体,控制界面上有一个急停按钮,我用鼠标按下急停按钮,机械本体要马上停止动作。有人说利用VXD将代码加栽到WINDOWS底层,中断处理,可达微秒,不知道可行否,鼠标操作属于Ring3层,VXD属于Ring0层,到底如何实现?



冷火

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 10回
  • 年度积分:0
  • 历史总积分:63
  • 注册:2004年8月11日
发表于:2004-08-12 09:01:00
1楼
我觉得你的设计思路有问题,如果用鼠标来控制的话,你的微秒级中断已经没有意义了(因为人的行为反应能力不可能达到微秒级吧!),如果用定时器中断,或外部串口、并口中断,在毫秒级是完全没问题的,何必要在微妙级钻牛角尖呢!

TellTruth

  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 451回
  • 年度积分:0
  • 历史总积分:1302
  • 注册:2003年10月29日
发表于:2004-08-12 09:44:00
2楼
完全用不着这么复杂,我已经能实现5ms准确的定时,我好象发过关于Windows下定时的贴子,不过当时对进程要求过于苛刻,其实在NORMAL_CLASS及THREAD_PRIORITY_NORMAL也可以实现毫秒级定时,关键在于你程序设计的是不是合理。Windows下在其它进程处于空闲状态,查询定时是非常准确的。0.1ms都可以达到,如果线程间关系安排合理的话。

ccbq

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 558回
  • 年度积分:0
  • 历史总积分:581
  • 注册:2003年9月26日
发表于:2004-08-12 10:00:00
3楼
找一段现成的汇编嵌进去,干脆又省事。

tigermu

  • 精华:6帖
  • 求助:0帖
  • 帖子:175帖 | 5410回
  • 年度积分:0
  • 历史总积分:19807
  • 注册:2003年1月19日
发表于:2004-08-12 10:30:00
4楼
急停这种东西还是硬件比较可靠。

天罡

  • 精华:0帖
  • 求助:0帖
  • 帖子:13帖 | 23回
  • 年度积分:0
  • 历史总积分:113
  • 注册:2004年4月16日
发表于:2004-08-12 13:50:00
5楼
谢谢大家的建议。 to:冷火 我没有钻牛角尖,能达到毫秒机也行,你说:如果用定时器中断,或外部串口、并口中断,在毫秒级是完全没问题的。我现在的问题就是主线程正在运行的话,突然触发一个鼠标按钮,会反应很慢,也许是我的程序设计不合理。

天罡

  • 精华:0帖
  • 求助:0帖
  • 帖子:13帖 | 23回
  • 年度积分:0
  • 历史总积分:113
  • 注册:2004年4月16日
发表于:2004-08-12 13:53:00
6楼
to:ccbq 是不是嵌入汇编程序以后,应用程序级的操作(比如鼠标操作)就会直接和底层ring0打交道了。

天罡

  • 精华:0帖
  • 求助:0帖
  • 帖子:13帖 | 23回
  • 年度积分:0
  • 历史总积分:113
  • 注册:2004年4月16日
发表于:2004-08-12 14:10:00
7楼
to DragonShadow: 我看了你以前《关于Windows下精确定时的问题》的帖子。很不错。我现在的问题就是主线程处于忙状态时,突然有一个鼠标输入,但是反应很慢。我用你的方法改改程序,试试看。

冷火

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 10回
  • 年度积分:0
  • 历史总积分:63
  • 注册:2004年8月11日
发表于:2004-08-13 10:41:00
8楼
to 天罡: 我觉得你的问题应该说具体一点,你的程序可能存在以下几个问题: (1)、首先要理清线程之间的通信问题: 按钮和定时器应该是在主线程的,而从按钮发出的消息应该是到辅线程的。 (2)、辅线程响应中断的时间问题: 如果你的主线程一直都是执行辅线程的中断(比如串口读写数据),那么你就需要在发送数据的中断里实现响应从按钮发出的消息,也就是说你应该中止发送原有的数据,直接发送新的数据。如果是这样的话根本就用不着使用定时器。 (3)、一般来说,定时器是用来自动响应一些事件,也就是处理无人干预的事情。如果你将按钮消息发送给定时器,然后又让定时器把这个消息传给辅线程或中断,那岂不是多次一举。

TellTruth

  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 451回
  • 年度积分:0
  • 历史总积分:1302
  • 注册:2003年10月29日
发表于:2004-08-13 13:44:00
9楼
写给上面的仁兄: 对定时和线程不明白不要乱说。你对Windows里面的机制还不是很了解吧,为何给人家指点。 1.首先要在Windows下实现硬实时是不可能的,但软件实时是可能的,精度也很高。但这个定时决不能用窗口中的定时器来实现,因为个定时器的精度只能在55ms左右,它实质是8254定时器计数溢出中断周期。所以实现50ms以下的定时,只能用查询方式,即在工作线程中设置循环用标准C时间库函数或者用查询time stamp(586以上的CPU提供的MMX指令及硬件计数器)的方法来获得精确时间。 2.辅助线程与主线程通讯用全局的变量来实现。 3.与外围设备通讯如串口也必须建立一个线程来监视串口,以防丢失数据包。 4.辅助线程不能接受消息。主线程通知辅助线程用事件或信号灯,同步锁等对象实现。 如果你自己认为很懂,请用写一个每隔5ms做一件事情的程序,如在主窗口上将时间值打印出来。

学海做舟

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:23
  • 注册:2004年7月16日
发表于:2004-08-13 14:06:00
10楼
毫秒级控制是可以的,但算不上实时,用WINDOWS的多媒体定时器(不是普通的定时器)+独立线程据说可到1毫秒+VC,我自己编过到3毫秒,但定时器内部代码不可太多,否则会处理不过来。多媒体定时器的相关资料可在许多VC编程的网站上找到,不用VXD,再说现在的NT,XP系统不再支持VXD。

ccbq

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 558回
  • 年度积分:0
  • 历史总积分:581
  • 注册:2003年9月26日
发表于:2004-08-13 17:03:00
11楼
窗口定时受其它程序影响很大,不推荐。全局通信是一个好办法,我曾见过这个程序(可惜没存下来:P),在WIN本身正常的情况下还算准确。如果够狠的话写一个牛X的驱动加载(不推荐)。 软定时器不准,不可依赖。(不是DragonShadow兄说的软件实时哦)

TellTruth

  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 451回
  • 年度积分:0
  • 历史总积分:1302
  • 注册:2003年10月29日
发表于:2004-08-13 17:39:00
12楼
多媒体定时器最好不用,我试过用它来定时,它的唯一好处是不用自己去查询时间,时间也很精确,但不用于1ms以下的定时而且占用资源太大。定时在1-5ms之间时,鼠标经常不响应。而用查询定时则不然,即使在0.1ms-1ms之间定时,鼠标依然很灵活。不过你动一下鼠标,则定时间隔则受到影响。Windows下线程时间片在10ms左右,(大于10ms),也就是说如果其它程序设计合理(每个线程在运行一个循环后休眠,即不会满满占用这个10ms),即使有多个任务在运行,ms级时间间隔依然可以有很高的精度,且不影响界面。 通过测试的数据即使在windows下做实时(不要很多任务同时运行,关掉一些无用的服务,仅保留RPC,SERVICES,WORKSTATION,PNP,WMGMT服务)5ms采样是没有问题的,如果用它来做实时控制,你的代价是Windows崩溃时你的控制系统将失去控制。所以用它作实时的采集显示或者向下位机发指令是适合的。

学海做舟

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:23
  • 注册:2004年7月16日
发表于:2004-08-16 08:46:00
13楼
DragonShadow兄所说虽然言之有理,但请看他应用场合,他需要模仿急停的效果,即需要在最短时间内将急停指令发送下去。可以这样,先不开启多媒体定时器,鼠标一旦按在急停按纽上,立即启动多媒体定时器,向控制卡发送急停指令,发送完后自动停止多媒体定时器。这样不会影响其它工作任务,比如屏幕刷新,鼠标响应等。其实这和真正的急停开关是类似的,从人眼看到出现问题到按压真正的设备上急停开关也同样需要时间,所以这段时间不必启动定时器,但一旦触发急停,指令立即送出,这也是用户的意图。

冷火

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 10回
  • 年度积分:0
  • 历史总积分:63
  • 注册:2004年8月11日
发表于:2004-08-16 11:43:00
14楼
DragonShadow: 你就是知道吹你的定时器如何精确,根本就是不明白我的意思,说白了一句话:根本用就不需要定时器!!! 如果你的定时越短,其他中断响应就越慢!而且系统中也应该尽量不要使用特别频繁的中断,这是搞嵌入式开发的人都知道。 如果你的急停是通过串口控制的,只要在串口中断里面加有条件地发送急停代码就行了,就那么简单!千万记住,主线程里面不要搞太多的频繁中断!要不你的系统响应永远都是慢的!!!

TellTruth

  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 451回
  • 年度积分:0
  • 历史总积分:1302
  • 注册:2003年10月29日
发表于:2004-08-16 12:04:00
15楼
呵呵,不要急,你用串口来发送实现停止,那只能说明你不要求实时,而我指的是实时的系统。我用的也不是中断。因为查询定时根本用不着中断。就好象嵌入式系统里主程序是一个循环一样。现在我的控制的效果系统响应很好。

realtimehx

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 9回
  • 年度积分:0
  • 历史总积分:232
  • 注册:2010年7月02日
发表于:2011-04-19 14:11:25
16楼
可以使用RTX,其是windows下的实时扩展。联系方式:product_gao@163.com

huzhiwen28

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 8回
  • 年度积分:0
  • 历史总积分:42
  • 注册:2010年8月16日
发表于:2011-04-20 12:50:55
17楼
上面的广告同学,你知道RTX啊?

huzhiwen28

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 8回
  • 年度积分:0
  • 历史总积分:42
  • 注册:2010年8月16日
发表于:2011-04-20 12:51:01
18楼

huzhiwen28

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 8回
  • 年度积分:0
  • 历史总积分:42
  • 注册:2010年8月16日
发表于:2011-04-28 13:40:09
19楼
1 概述

此文是在实现modbus-RTU通讯的基础上总结而来的,主要讲述了如何提高window做工业控制时的实时性能。

PC机上做控制系统,一般就是在window或者linux操作系统上做控制系统软件开发,window上做控制系统,有如下优势:

1)现有的设备驱动支持

2)各类厂家提供的现成的卡板

3)以及比较平民化的开发平台

4)数量众多的开发人员。


2 提高实时性手段

window是一个非实时操作系统,如果要做实时任务的话,有必要用些特别的手段,来提高其实时控制的能力。



1) 语言最好选择C语言,之所以选择C语言,因为工业控制主要基于window API编程,使用很多window内核的服务。

2) 多任务一般采用多线程来实现,根据任务的紧要程度,设置线程的优先级别,一定要设置优先级。

3) 如果在一个线程中有多个任务的话,建议采用协程的方式实现多任务,任务内部最好不要调用Sleep()等休眠函数

4) 为了提高内核的时钟的调度精度,必须使用多媒体定时器并且将其精度设置为1ms,这样内核任务调度精度也提高为1ms,这估计是微软的内部耦合。如果不使用多媒体定时器的话,内核定时器时钟精度一般只有15ms左右。

5) 每个线程的一个循环必须释放一次CPU,采用Sleep(1),这样才能保证机器的CPU不被耗光,否则低优先级的任务就没有机会得到执行了。

6)计时采用QueryPerformanceFrequency()和 QueryPerformanceCounter()函数来计时,可以达到ns级别。

上面手段都是用户空间的手段,在内核空间应该也有手段(应用程序作为驱动跑),但是我不熟,就不说了。
3 效果

使用以上几种方式实现的控制程序,时间关键优先级别多线程任务调度精度可以达到2-5ms级别,计时精度可以达到ns级别。这对于很多(大部分)要求不高的控制来说,基本是够用的。

至于驱动部分,window的驱动的反应速度还是挺快的(CPU占用率不过高的情况下面达到us级别的反应),这个和我们用户空间的程序不一样,例如window的串口驱动,可以将接收FIFO设置为1,采用事件方式读串口,即使波特率为115200bps,也不会丢失数据。

使用上面的方法,我在PC机上实现了modbus-RTU客户端,其3.5T设置为5ms,可以很稳定地和PLC主设备通讯。


4 硬实时

如果在PC机上追求真正的硬实时,那么一般是在window或者linux系统中加入硬实时内核,形成双内核系统,例如RTX或者RTAI,这些都有成功的案例,例如西门子的基于RTX的数控系统,基于RTAI的实时控制系统,这些实时系统都是用于100us级别的硬实时系统中,需要开发者自己写驱动,其架构是实时内核上跑实时任务,普通内核上跑一般任务,实时任务和一般任务间通过通讯的方式沟通。由于我还没有在这些实时系统上做过开发,所以暂时不写。

Bonyz

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 72回
  • 年度积分:0
  • 历史总积分:292
  • 注册:2010年1月18日
发表于:2011-05-11 16:39:51
20楼
学习了,顶一下楼上大侠!

热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页