无锡一网激光设备有限公司--专业研发生产销售激光打标机、光纤激光打标机、CO2激光打字机、半导体激光器,提供激光加工、激光配件及激光维修服务。热线:0510-88703162

  杭州萧功激光设备公司热线:13777567846

无锡一网激光设备公司热线:15358051101
 

网站首页 关于一网 激光打标机 激光配件 行业新闻 技术支持 行业解决方案 联系我们
 
激光设备
最新文章
   激光打标技术2:概述2020-5-2
   激光打标技术1:摘要2020-5-2
   激光打标机技术相关…2020-3-9
   激光打标机软件综述2020-3-9
   激光打标机软件精确…2020-3-9
   激光打标机软件实时…2020-3-9
   激光打标机软件实时…2020-3-9
   激光打标机微秒级精…2020-3-9
   激光打标机软件实例2020-2-25
   激光打标机数据输出…2020-2-25
   激光打标机软件框架…2020-2-25
   激光打码机软件系统…2020-2-25
客户服务
江苏地址:江苏无锡市锡山经
济技术开发区春雷路101号
TEL: 0510-88703162
手机:13777567846
浙江地址:浙江杭州市
富阳市迎宾北路205号
TEL: 0571—63163880
Email:ewlaser@aliyun.com
  行业新闻->激光打标机软件实时实现的方法

激光打标机软件实时实现的方法

2020-3-9 18:12:57

5.1 定时实现的方法

 

激光打标控制系统的输出和数据传输都必须在确定时刻开始,在有效的截止时间内完成。因此要完成实时控制任务,首先要获得精确的定时。在 WINDOWS98 下获得定时时钟的方法[32,33]通常有下面几种:

1) 利用 Windows 下的常规定时器

一般常用的是系统计时器,它使用函数 SetTimer 进行初始化,是最简单的时间控制方法。应用程序响应 SetTimer 函数发送来的消息 WM_TIMER。这个定时器是IBM PC 硬件和 ROM BIOS 构造的定时器逻辑的一个相当简单的扩展。这个定时器 WINDOWS 中的最大缺点计时器的最大分辫率是 55 毫秒,也就是说应用程序每秒只能接收到 18 个消息。此外,这个计时器消息的优先权太低,只有在所有的消息(除了消息 WM _PAINT)被处理后才能被处理。因此函数 SetTimer 只能用于一般的定时,如刷屏显示时间定时等,它远远不能满足实时数据采集的要求。

2) 利用多媒体定时

多媒体定时器(Multimedia Timer)使用自己单独的线程,来调用一个自己的回调函数。它的优先级很高,每隔一定时间就发送一个消息而不管其它消息是否执行完。对于现在的 Intel CPU 来说,它的最小定时精度通常都可以达到 1 毫秒。

利用多媒体定时器可以很精确地读出系统的当前时间, 并且能在非常精确的时间间隔内完成一个事件、函数或过程的调用。利用多媒体定时器的基本功能, 可以通过以下 2 种方法实现精确定时:

a) timeGetTime ()函数。定时精度为毫秒级,该函数返回从 Windows 启动开始所经过的毫秒时间。由于使用该函数是通过查询的方式进行定时控制的, 所以,应该建立定时循环来进行定时事件的控制。

b) timeSetEvent ()  函数。利用该函数可以实现周期性的函数调用。其中的参数说明:uDelay 延迟时间; uResolut ion 时间精度,在 Windows 中缺省值为 1m s;

lpFunction 回调函数,为用户自定义函数,定时调用; dwUser 用户参数;uFlags 标志参数;TIMEONESHOT:执行一次; TIMEPERIODIC:周期性执行。

具体应用时,可以通过调用 timeSetEvent ( )函数,将需要周期性执行的任务定义 lpFunction 回调函数中(如定时采样、控制等),完成所需处理的事件。但任务处理的时间不能大于周期间隔时间。在定时器使用完毕后,应及时调用 timeKillEvent () 将之释放。

3) 使用外界时钟定时

由于在 Win32 多任务抢占式工作方式下应用程序不能完全占有 CPU,因此Windows 环境下软件定时不准确,所以在实际应用中,也可采用外界专门的硬件时钟电路来获取可靠的时间触发信号,将外界的定时触发作为一个硬件中断,采用中断方式来进行实时系统中各种任务的处理。这种方式既能够保证精确定时,又可随任务的不同而通过编程的方式将它们的定时周期进行更改。

4) 微秒级精确定时

使用 QueryPerformanceFrequency ( )函数和 QueryPerformanceCounter ()函数。这两个函数是 VisualC++提供的仅供 Windows 95 及其后续版本使用的精确时间函数, 并要求计算机从硬件上支持精确定时器。用这两个 API 函数可以达到微秒级的分辨率。具体的使用方法如下:

使用以下函数获得高分辨率计数器的计数频率:

a) BOOL QueryPerformanceFrequency (LARGE_INTEGER *lpliFrequency );

返回的计数频率存放在指针 lpliFrequency 指向的变量中。如果系统不支持高分辨率计数器,函数返回值为 0。计数频率以每秒内计数值表示,一般为 CPU 时钟频率。为获得更加精确的计数频率,可以多次测量求出平均值和标准偏差,也可以在一段时间间隔内用 QueryPerformanceCounter 函数获得两个计数值之差间接求出。

使用以下函数获得高分辨率计数器的当前计数值:

b) BOOL QueryPerformanceCounter (LARGE_INTEGER *lpliPerformanceCount )

函数返回自系统启动以来所经历的计数值,计数值存放在 lpliPerformanceCount

指向的变量中,由前后两次调用 QueryPerformanceCounter 函数获得的两个计数值之


差,可以计算出两次调用之间的时间间隔。

数据类型 LARGE_INTEGER 既可以是 1 个作为 8 字节长的整型数,也可以作为2 4 字节长的整型数的联合结构,其具体用法根据编译器是否支持 64 位而定。该类型的定义如下:

typedef union LARGE_INTEGER { struct {

DWORD LowPart; ∥4 字节整型数

LONG HighPart;  ∥4 字节整型数

};

LONGLONG QuadPart; ∥8 字节整型数

} LARGE_INTEGER, *PLARGE_INTEGER;

在进行定时之前,应该先调用 QueryPerformanceFrequency ()函数获得机器内部定时器的时钟频率 fCLK。接着,在需要严格定时的事件发生之前和发生之后分别调 QueryPerformanceCounter () 函数,利用两次获得的计数之差和时钟频率,可计算出事件经历的精确时间。


首 页    |   产品中心   |   行业解决方案   |   新闻中心   |   关于我们  |  联系我们   |   城市关键词   |   行业关键词