C#工控

晚上终于完成了数控钻床Excellon格式的钻床文件的初步解析,能够将文件中的钻孔信息提取出来。另外还做了一个GUI工具,使数据能够可视化的显示出来。这周的任务也就暂告一段落,下周要去厂里面调试,这是我写的C#版本的第一个测试。

说来这个数控钻铣床项目在一开始还真是一波三折,最开始厂家说的是要的是一个支持Win98的版本,想和以前的系统取得兼容。我的天,当时就只好考虑使用MFC来完成这个。后来实践一番以后觉得开发难度确实很大,难点在于GUI方面,60%以上的代码都在GUI。首先我对MFC不熟,其次,MFC确实真的可以过时了。一个看似简单的界面,在.NET环境下仅需点点时间就完成了,在MFC里面那真是举步维艰。总是全部手工写代码不知道何年才能搞定。最后我执意要用C#来开发这个数控项目,在和厂商再次交涉以后,他们同意只要兼容2000以上就可以了,这样也就具备了用.NET开发的可能性。

其实,说实话,兼容2000都没有任何必要。一个小厂的东西,软件方便完全是盗版的,从操作系统到开发工具,没有一个正版,所以,换操作系统对于厂家来说就是刻个盘,安装,就搞定。还有98,谁现在还再用……所以,考虑兼容性问题纯粹是扯淡。所以,用.NET开发一点也没错。

但用.NET开发在初期增大了我的工作量。由于一些特殊的原因,厂商有早期版本的控制程序的不太完整的源代码,是10年前,用BC5写的,然后一直修改到2004年的一份代码。代码已经不能顺利编译,缺少很多必要的类库,还好只是一些GUI相关的东东。我已经将工控的大部分底层程序移植到MFC框架下面,证明了这份程序基本能够使用。如果要用MFC写下去的话,在初期看来还真的能够节省很多时间。事实证明确实是这样,截止上周,5个星期多的时间,我就能够将机床运行起来,进行钻加工。

移植到C#来就不是那么简单的事情了。首先很多朋友们的疑问要解除,他们说,.NET环境运行程序很慢的,对于这种控制项目能够搞定么?我想说的是,我认为没有任何问题。.NET程序运行慢可能显示在启动的时候。确实,要想好好的启动一个大型的.NET程序确实需要一定的技巧,尽量让窗口能够快速显示出来。程序运行时候不会觉得特别的慢。另外,通过ngen程序可以生成本机代码进一步提升速度。再说,工控机的硬件配置已经很高了,厂商的工控机的配置都在赛扬2.53G,内存512,硬盘80G。除了开发当中觉得硬盘慢以外,其他方面运行VS2005没有任何问题。

在运行速度和开发速度上,开发速度显得更必要。实践表明,编译C#程序比MFC程序要快很多。IDE和Reshaper提供的超级强大的功能,将开发效率提高了若干倍。如果没有良好的类库的支持,每一步都要造轮子,开发程序真是难上加难,古老的MFC正是这样……

另外,可能很多朋友都觉得,工控项目要要求实时性,.NET平台的运行环境限制了他的实时性。对,实时性是要要求,所以然后很多朋友就选择了实时性高的C++,特别是研究生朋友们,很多一进教研室就开始了MFC艰苦的学习进程,很乐意的和别人讨论“VC++”,听着这个词语我就觉得别扭~~。为什么不用C#做点项目呢?回答:不会~~~学啊,没时间……天,能够把MFC学到能写出一个漂亮界面的时间学C#我想都可能到精通级别了~~

对于实时性的要求,这点需要纠正,Windows平台本来的实时性很差,很多特别重要的功能都是直接做到硬件层面上的。例如基于PC机控制方面的大多数都要使用工控卡,运动控制也是控制卡包干了的,简单的调用DLL即可。而且.NET平台调用DLL是那么方便,调用的延迟完全被高频的CPU所掩。由于C#和C很接近,所以很多C的算法几乎能够直接套用过来,比用其他的基于.NET的语言都要来得直接,所以C#做控制那是很适合的。

如果硬要说.NET这样那样的问题,对于没有接触过的朋友而言,总有这样那样的疑问,我也在逐步的体会.NET带来的巨大的方便。请静待我的答案吧,这是我用.NET做的第一个控制软件,做好,证明给师弟们,.NET做工控也是合适的,比用VC会做的更好,更强大,更灵活!

逛街

完成了计划的项目,进行的很顺利。眼睛也开花了,手也打累了,背着电脑包,出去走走。

朝第五大道那边去转转,好久也没有过去了。在卖光盘的老板哪儿看到了波斯王子的新版本,2DVD。这个老板的碟子便宜,出碟子的速度又快。前些天才买的GTA4,这些天正在玩,基本上是出去就撞人,撞警察,然后知道把车开炸~~暴力游戏。路上卖肥肠粉的两家正在抢生意,两家不过20米,在一条路上,从万人坑上学和放学都要路过,应该来说人流量是不会少的,生意嘛,就看两家的味道了。

手机贴膜的也出来了,晚上出来贴,呵呵。一路上小妹挺多的,都是成教的,还有很多长得挺漂亮的。润新楼下的商店也从以前的动感地带阿之类的男生类型改为了卖饰品阿,卖衣服这些了,女生多了嘛,自然生意就好过。

出来逛逛总要买点什么嘛。家里的鼠标不好用,明基的一个鼠标,用久了感觉很不舒服,主要是掌心拱起来的,一直磨着掌心,久了就会觉得烦躁。去买个鼠标,还是现代的。加上这个,就买了3个这样的鼠标了,很好用。家里面老爸一个,我一个,寝室电脑一个,笔记本用的是明基的乖乖鼠。

去药店,准备买润洁。前段时间买了“陕西福瑞达”的“正大金海伦清见护理液”,滴到眼睛里面“很爽”,几乎是有一种刺痛的感觉。感觉上这个眼药水要比“润洁”牛逼。润洁自从被收购以后,就没有滴入眼睛以后清爽的感觉了,还以为变次了呢。但好像这个陕西的福瑞达和山东的福瑞达没有什么直接的联系。我查到了陕西的福瑞达以前还生产国“润洁”,愚弄观众。所以我决定还是重新买山东博士伦福瑞达的润洁,这才是正宗的的。

给钱的时候才知道,今天搞活动,原价13的,今天9.5。买两瓶吧,哈哈。

跟着第五大道转了一圈,脚下热和了,回寝室,休息了:)

解决电水壶烧水有异味

寝室这边打水很不方便,水又基本上没有烧开的那种。所以,很多同学买了电水壶阿,热得快阿这些。前段时间上海的女生宿舍着火了,跳了4个,悲哀阿~~几个漂亮的MM就这样消失了~~下辈子来电子科大吧~~~

走题了。热得快确实很垃圾,特别是那种棒子形状的,没有任何的保护,插上就来。而且功率大,做工粗糙,用的线也是很烂的那种,如果不注意很容易电线就软化,一短路就烧了起来。我用的是不锈钢的电水壶。图片借用了淘宝的图片,牌子不是格兰仕的,反正样子差不多。

这种壶相对来说安全的多。我拆解过这个壶,里面有根据形变金属进行控制的温度开关,用的线的质量也很好,多次烧水都不会发热。插头质量也过硬。其实这种壶用的地方很多,以前去九寨沟住的宾馆就是用的这种,在浙江的酒店也是这种。

唯一让我不满意的就是烧的水总是有一股味道。家里面普通烧水用的铜壶烧出来的水几乎没有味道,但用这个烧水就是有一股怪味。两者的区别在于烧水的速度和所用材质。但我认为材质影响不大,可能还是烧水的速度有关。一般来说,铜壶用天然气烧水要烧15分钟左右,电水壶只要5分钟。当然,两者的容量不一样,仅仅这样比较是不正确的。

我猜测,问题就在于净化水所使用的化学用品,使得水里面或多或少地有了氯,而快速烧水会让氯很快的转化为另外的物质,而慢速烧水则氯会在水加热的同时挥发出去,不至于残留在水里面。另外,揭开电水壶的盖子烧水(比较危险)也应该可以使得氯更快的挥发。在网上有一个生活小技巧,也提到了类似的方法,但我认为让水持续沸腾5分钟的做法不太好。

根据这个猜测,我做了一组试验。

  1. 从自来水管直接接一壶水,然后立刻烧开。
  2. 从自来水管接一壶水,烧到热了以后,停止加热,揭开壶盖。等5分钟,然后加热直到沸腾。

方法1烧出来的水有很大的一股味道,即便用茶叶也不能掩盖。方法2烧出来的水没有明显的味道。

总结下来,烧水还是要讲究一下,特别是快烧这种。最好的做法可能是用活性炭来吸附,但普通条件下,让水烧得半开,然后等待气体挥发,也是一种较好的策略吧!

校园-秋

每年都是十二月这个时候,片片秋叶随风落下,金色铺满了成电的道路,一群摄影爱好者聚集在此,一年一年,乐此不疲。

WinIO初始化失败的几个原因

WinIO是一个能够打开一些操作系统IO特权操作的一个库,简单的来说它加载了一些驱动。通过加载的驱动可以直接的访问端口。在工控上,我们可以利用这个库直接操作IO卡的地址。例如我最近在做的一个数控钻铣床的IO卡和运动控制卡就是很老的一个卡,在WIN98下面工作很正常,但是在NT核心上就会出现非法指令调用的问题。这些非法指令来自于底层对IO卡和运动控制卡的直接地址访问。在98时代,这些操作都没有受到保护的,在NT核心下就会出现保护问题。经试验,经过WinIO初始化载入驱动以后再进行IO卡直接访问,很成功。

但应用的时候,就出现了一些莫名其妙的问题。应用WinIO只需要调用两个函数InitializeWinIo(),和最后的ShutdownWinIo()即可。InitializeWinIo()将会返回一个bool值指示初始化结果。就是这个函数造成了许多困扰。

第一次困扰是在一次调试中,经常初始化失败,一旦成功以后就总是成功的。刚开始以为是InitializeWinIo()以后没有ShutdownWinIoI()造成的,后来看了WinIO的C Example证明只写InitializeWinIo()一样能够进程一旦结束,由InitializeWinIo初始化的资源自然就结束了。所以不存在上次运行影响这次运行的事情。后来突然发现,WinIO相关的dll,vxd,sys竟然是绿色的。绿色在WindowsXP系统里面代表了文件是被EFS加密的。我为了工程的保密,把所有的工程目录都进行了EFS加密。EFS加密会影响磁盘性能,原因就在于其加解密过程。但是这里很奇怪,可能是间歇性的EFS解密速度没有跟上WinIO中加载驱动的速度,造成读取的sys和vxd设备驱动是混乱的,最终导致加载失败。将EFS加密取消,问题解决。

第二次困找在我用C#写了一个dllimport,然后进行调用,结果,总是返回false。很疑惑,WinIO相关的文件都放到一起的,怎么还是这样的呢?VS2005单元测试里也会失败。究其原因还是路径的问题造成。分析WinIO的源代码,可以发现InitializeWinIo()会调用一个GetDriverPath这个函数:

bool GetDriverPath()
{
PSTR pszSlash;

if (!GetModuleFileName(GetModuleHandle(NULL), szWinIoDriverPath, sizeof(szWinIoDriverPath)))
return false;

pszSlash = strrchr(szWinIoDriverPath, '\');

if (pszSlash)
pszSlash[1] = 0;
else
return false;

strcat(szWinIoDriverPath, "winio.sys");

return true;
}

这里面已经很清楚的知道了什么情况下会false了。注意winio.sys存放的位置问题就能使之初始化正常。

其实还可以更加详细的打印出InitializeWinIo()中每步的执行过程,这样更容易判断是哪个地方出现了问题。

就先写到这里吧,WinIO是个很好很强大,很黄很暴力的一个库~~~