100us我自己都不相信的劳动成果

来源:互联网 发布:淘宝网经营模式分析 编辑:程序博客网 时间:2024/04/30 21:51

        一直以来我都不相信在XP系统下可以做实时控制,我个人始终认为决定一个程序的根本特征的东西,就是它的程序框架,那些国外的RTOS提供商们宣称他们可以在XP下做到100us,我认为简直就是天方夜谈一样,因为XP操作系统的框架就在那摆着,你不可能指望把一辆牛车开出奔驰的速度,可是我TMD又错了,事实上又证明了经验害死人的主观错误,我错了,我真的错了。因为我做出来了,连我自己都不相信。我不知道是否有人能理解出我此时因为感觉自己失败而痛苦的心情。
        要想说明白XP系统下开发运动控制的难点在哪里,需要从一个标准说起,这个标准的名称叫做IEC 1131-3,几乎所有的RTOS厂商都支持这个运动控制上的编程标准,最著名的厂家我个人认为有两个一个是CODESYS一个是德国的倍福,虽然德国的倍福用的也是CODESYS的平台,但是经过我认真的分析它的特点发现倍福有很多都是自己的东西。其实根本就不用管什么ST FBD LD SFC IL那些并不是决定一个系统是否实时的难点,实现这些语言中国很多厂商都能做到。在这个标准下实现实时性的难点是IEC 1131-3的数据定义标准,下面是一个例子:
        L1_green AT %QB0.1:BOOL;(*定义一个bool型的变量*)
        anlog_1 AT%Q*:DINT;(*定义一个双整形的变量*)
        以及和以上类似的各种类型的数据定义。如果没有研究过实时库的人,你是不太可能明白,在这种数据结构下,如何刷新这些变量,以及为什么想提高实时性,这么困难,因为变量的刷新周期就决定了这个系统实时性的性能,而+,-,*,/这些类似的运算,大家如果使用同样的CPU的话,同样的编译优化技术(已经很成熟了,发挥空间很小了),想在计算上获得优势想都不要想,决定了你系统实时性能的,就是变量的刷新周期,可是所有的变量名字都是字符串,涉及到一个查找,系统是并发的,又涉及到互锁,数据维护,因为IEC 1131-3的标准并不单单是下位的标准,和其他系统如上位的交互标准也是这个,你可以了解一下倍福的ADS协议和RTIO协议。从我查的国外文献当中看,大部分论述的都是这个问题,即如何解决变量的搜索问题,可惜想通过文献得到答案,比我不想做家务还要困难。
        我这里不能说我是如何做的,因为我想把这个成果应用到我们公司现有的项目上,但是我有权力在这里展示一下我确实是做到了,毕竟这是我自己私底下努力了将近一年的劳动成果。
        下面是我的代码,和倍福的ADS协议接口是一样的。

下面是运行时,显示各个1000个周期的时间

把这些时间/1000 之后求平均值,正好是100us左右,再次证明了国外的人比中国人诚信,一点噱头都没有加,确实能做到100us。这个在宏观上看起来好像不太稳定差了20~30ms,但是在单独的一个us周期上你是根本就看不出来差别的,倍福说它的PLC刷新周期可以1个ms,我认为简直就和玩一样,因为即使是机器手的插补控制周期做到8ms就非常满足要求了。另外请注意1024个double型数据的查询,据我所知这比很多PLC程序占的内存都要多,因为PLC程序大部分都是bool型的数据,我们最复杂的项目也没有这么多的数据。

      说起来这个东西真轻松,几句话就说完了。如果我不是弄明白了倍福软件的内存管理方式,有可能再给我几年时间我都捉摸不明白这个东西到底怎么做,我对德国人的实现方式佩服的简直五体投地,同时我也发自真心的感谢德国鬼子,他们在开发软件的时候,肯定没有想到擅长山寨的中国人会捉摸他的实现方式。

      首先说实现难点,如果你想在XP系统下做实时控制,那么就必须脱离开XP的系统框架,如何脱离,内存要你自己去管,自己去维护。我想说到这里很多牛人已经知道了我是怎么做的了。汇编和C语言都可以做到这一点,当然你要很牛叉才行。另外一个就是搜索和维护的难点了。本质上来说这种实时引擎就是在操作系统上开了一个洞,你所需要的就是除了利用操作系统的保护机制以外,其他的工作都由你自己来完成,这样一半的难点你就解决了。

      另外一半的难点我即使说出来也白说,因为涉及到太多的理论了,但是我保证所有的理论在大学的教科书上都讲到了,你所需要的就是把这些知识点都好好的深入下去,学好C语言和汇编,如果你能把这个东西做出来,你就知道C#和JAVA语言是非常容易被取代的。这一年来我没少看虚拟机,编译原理方面的书。C为什么这些年,越来越流行,也有其根本原因,面向对象其实没有什么,其实现的根本还是结构化编程。

      汇编的重要性,并不是你要学会了用它,而是学会它,了解它,对你计算机理论方面的学习有很大的好处,你可以看看我的这篇文章,没事拿个小程序,反汇编之后好好的分析分析为什么是这样的。

       另外我想说的是虽然我弄明了这个实时引擎的数据结构怎么设计,框架怎么写。但是与国外的发展水平比,它在天上我还在地上呢。

       最后送给大家一句话,应用永远不能为王,理论才是王道。什么是道,这里附上唐骏的一句话:“万事万物的运转,大到宇宙,小至一花一果,其实都遵循若干非常简明的规则。语言也是如此。只要掌握这些规则,就可以不断复制,创造出纷繁复杂的内容”,说的太好了。这个实时引擎我用C语言写的,核心代码总共才有395+28=423行,你信吗?从我昨天晚上写出来(当然花了N个晚上,N个周末,改了N次),今天都冷静了一天了,我还不信呢!而我相信国外的软件这里大部分代码都会直接用汇编写,能不快嘛,想不快都难,我也明白了为啥倍福那么牛叉,那么牛叉的一个系统ADS接口的API只有十几个(核心的只有4~5个),自卑啊,我TMD太自卑了,自卑的我想哭。

       剩下还有很多路要走,我认为运动控制的下一个黄金时代是并行处理技术,因为现在大部分嵌入式系统CPU都是单核的,即使XP类系统,并发库也刚刚出来,一两年以后现有的实时引擎技术就不适用了,无论是哪家企业都必须重新设计它们的算法了,也就是说我刚摸到一点门,这个技术就要过时了哈哈,自虐啊。我祝诸位仁君好运。

      我要整理文档,再好好的分析一下,整理一下,继续往下走。

原创粉丝点击