登录
首页 嵌入式系统 嵌入式系统
回帖 发帖
正文

主题:用delphi编写工控软件,定时器无法达到10毫秒

点击:7408 回复:9

用delphi编写工控软件,定时器无法达到10毫秒的精度,请问各位是如何解决的?
plc中有几十个10毫秒的定时器,几百个100毫秒的定时器,它是如何实现的?
在windows如果用这么多资源,会不会死机?
我试过如果有5,6个设定为10毫秒间隔的定时器一起运行,至少有一两个根本就不走.
即使走的也根本没有一个准的.
还望各位帮忙解答.
另外,这里有使用过实时操作系统的人么?
02-09-10 23:00
VxWorks是个不错的事实操作系统
02-09-21 18:41
我也关心这个问题
02-09-26 22:46
PLC多用中断功能来实现高精度的定时器
02-09-27 20:30
WinCE也许不错,我也用Delphi,愿意一起讨论,my QQ number is 39161700
02-11-15 21:28
用汇编,在delphi中可以嵌入汇编
asm
rdtsc
eax  //时钟低32位
edx  //时钟高32位
end;
delphi 6以上版本可用,不过首先要知道cpu主频,然后换算成时间
03-03-03 09:41
都是假的吧,WINDOWS的CPU是50ms切换工作,所以编程里的定时器太短没用,PLC是物理上的实现
03-03-04 14:55

qsn

这是别人提供的。
对于精确度要求更高的定时操作,则应该使用QueryPerformanceFrequency()和QueryPerformanceCounter()函数。
这两个函数是VC++提供的仅供Windows 95及其后续版本使用的精确时间函数,并要求计算机从硬件上支持精确定时器。QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型如下:
  BOOL QueryPerformanceFrequency (LARGE_INTEGER *lpFrequency);
  BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
数据类型LARGE_INTEGER既可以是一个8字节长的整型数,也可以是两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:
  typedef union _LARGE_INTEGER
{
   struct
   {
// 4字节整型数
DWORD LowPart ;
// 4字节整型数
LONG HighPart ;
   };
// 8字节整型数
   LONGLONG QuadPart ;
} LARGE_INTEGER ;
  在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率,然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经历的精确时间。下面的程序用来测试函数Sleep(100)的精确持续时间:
  LARGE_INTEGER litmp;
  LONGLONG QPart1,QPart2;
  double dfMinus, dfFreq, dfTim;
  QueryPerformanceFrequency(&litmp);
  // 获得计数器的时钟频率
  dfFreq = (double)litmp.QuadPart;
  QueryPerformanceCounter(&litmp);
  // 获得初始值
  QPart1 = litmp.QuadPart;
  Sleep(100);
  QueryPerformanceCounter(&litmp);
  // 获得中止值
  QPart2 = litmp.QuadPart;
  dfMinus = (double)(QPart2 - QPart1);
  // 获得对应的时间值
  dfTim = dfMinus / dfFreq;
03-03-04 21:41
了解delphi的定时器原理吗?如果使用控件,其时间精度为50ms,(我用bcb!),其控件为消息触发方式。建议自己编写调用api的类!
03-03-05 13:49
去大富翁骚一下,我看到过这个,如果没有,suxiongsheng@zs165.com
03-03-06 17:03

工控新闻

更多新闻资讯