从加入红橡开始熟悉和使用易控(INSPEC)组态软件,值得赞扬的是INSPEC的开放性和对C#语言的支持,除此之外,便也没有感觉它与其他组态软件有太多优势,有人说INSPEC软件授权比国内其他同类的组态软件便宜,姑且认为这也是其中一强项吧。
海淘的东西好不好,得到货了拿到手里用过才知道,组态软件也是一个道理,作为一种开发工具,上手比较容易,具备一些开发经验的可以很快熟练,甚至“精通”。但是它作为一种组态开发工具软件,更多的还需要在实际项目开发过程中摸索,碰到石头伤着了会感到痛,因为害怕疼痛,所以下次会想着法子避让石头,这就是INSPEC,也是组态软件的特性吧,真正在使用时才会发现有很多“坑”,面对这些“坑”一定要留神,除非你决定放弃它,否则绝对不能去硬碰硬,得绕着来。
考虑到INSPEC(组态软件)实现功能有限,未来对由组态软件开发的系统数据的开放性需求,虽然都可以在INSPEC里实现,但是存在大量的重复性工作,所以尽早的将数据、控制和业务处理部分从组态软件中提取出来,按本公司或项目的特点进行设计和开发,对于公司或项目来说意义重大。依托INSPEC提供的OPC服务器可以实现数据的实时共享,是目前普遍采用的比较直接和快捷的使用方式。当然,如果公司具备底层硬件开发基础,可以直接无视各种组态软件。
组态软件的数据使用OPC服务器共享出来后,再利用INSPEC的OpcClient库开发OPC读写客户端软件功能,接下来就是运行高级开发语言实现数据的处理、控制和业务功能,这样就把原来在INSPEC中实现和处理的问题拿到外面来了,再使用INSPEC的Web浏览器控件在组态软件中呈现。
而这次出现的“坑”就是跟Web浏览器控件有关,本人不排除在INSPEC提供的其他控件都存在这样的问题的可能。
在INSPEC中内部变量、画面都是直接使用静态方法(全局)引用使用的,如内容变量使用变量组名+点号连接符+变量名,画面使用GrpManager+点号连接符+画面名称,不同之处是内部变量从工程启动开始就一直存在,不需要执行初始化操作,但是画面却需要使用Grp.Open或Grp.Hide方法预先加载,之后就可以直接使用GrpManager+点号连接符+画面名称+点号连接符+画面中成员ID,来操作画面中的元素。
一切就是这么看来顺理成章的事,这次就出现意外,也许对于做技术的来说,亘古不变的规律和道理固然要相信,但是某一天如果真的出现意料之外的事情,不用大惊小怪,好好静下心来梳理统理,找出引起这种差异性的原因,总结经验教训。比如我们常常认为一个单线程的函数或过程的执行总是从上至下,从入口到出口的,但是node.js出现了,打破了这个规则,函数或过程中间某一句占用时间的代码在没有执行完成,下一句代码就开始并发执行,从而导致整个函数或过程实现功能出现偏离。
临近项目开发进入里程碑结点,所有的开发任务按计划逐个实现,看着INSPEC工程文件从最初几个兆,到现在四五十兆,心底无限感慨!然而,偏偏就是在这个时刻,问题出来了。原来一直使用正常的浏览器控件突然全部报错,提示“未将对象引用设置到对象的实例”,没有错,所有浏览器控件在同一时间“集体罢工”了,在INSPEC开发环境编译也没有报错,但是运行的时候就在后台报错,而在两天前备份的档不存在这个问题。心想画面还有后台代码都是没有改动过的,突然出现这样的问题,莫非是在INSPEC中使用浏览器控件有问题,不能够这样用吗?那样的话,这个问题就太大了,不说重新在INSPEC中实现同样的功能,需要花费多少时间,还对相关联的项目造成非常大的影响!回头是万万不能的,这个问题必须要解决!
于是乎,纠结烦人的找“虫”工作开始。首先尝试检查工程页面和代码有没有错误,试图对工程进行修复。尝试过的方法有:
(1)删除页面中Web浏览器控件,重新添加新的Web浏览器控件,无效;
(2)对重新添加的Web浏览器控件修改控件ID,去除中文汉字,改为英文字母,无效;
(3)删除有问题的其中一个页面,重新添加新画面,新画面实现原画面同样的功能,问题依旧,亦无效;
(4)启用Web浏览器控件工具栏,检查发现在运行环境,所有画面中的Web浏览器控件都是在后台代码直接赋值或提交URL地址时报错,但是在Web浏览器的地址栏中输入后台提交的地址,是能够在Web浏览器控件中显示的!?
(5)怀疑开发环境出了问题,卸载INSPEC软件后,重启电脑后再安装之,无效;
(6)检查上次备份的版本,备份工程中的所有Web浏览器控件功能都是正常的。
(7)将使用Web浏览器控件的SubmitWebAddress方法改为CurrentUrl属性赋值,仍旧报错“未将对象引用设置到对象的实例”,于时开始怀疑Web浏览器控件,在后端代码检查是否为null,结果发现报错的原因竟然就是Web浏览器控件是空对象!
(8)将在后台代码发现Web浏览器控件为空的情况,与易控技术支持沟通,对方亦不相信会有这种问题,技术支持认为我们把Web浏览器用复杂了,建议直接在浏览器中自己输地址访问,汗!应对方要求,继续做了下面两点测试。
(9)在有问题的画面中新增按钮控件,在按钮控件点击事件中,引用该画面的Web浏览器控件并试图加载某个Url地址,仍然报错;
(10)新增测试画面,并添加Web浏览器和按钮控件,在按钮点击事件中操作Web浏览器控件,没有报错!
(11)据此,再次与易控技术支持沟通,基本可以推断是工程或画面出现问题了!同时对方告知,当工程意外关闭或因其他原因未正常保存的关闭/退出行为,均可能出现工程或画面损坏。
工程出问题了,可以说是悲喜参半吧,悲的是可恨这易控软件太脆弱了,电脑出现蓝屏或者故障时,保不准那时候就开着一个易控工程,从而给项目埋下了一颗定时炸弹,运气好点只是一颗哑雷,皆大欢喜,运气不好就……就不好说了。喜的是工程出问题了,但是方案没有出问题,花点时间和精力解决这个问题就好。
接下来就是开始工程修复和重建工作,简单的说来就是确定一个初始的存档,从这个存档开始到现在的工程,中间所有的工作重做。因为没有办法判断到底是工程哪里出了问题,所以必须随时备份,做好修改记录,反复测试修改前后工程是否存在异常,并且当出现异常时,重新定位最近的一个正常的工程备份,如此反复。