!!!易控INSPEC组态软件开发小结——-一次工程文件损坏和处理经过
从加入红橡开始熟悉和使用易控(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)据此,再次与易控技术支持沟通,基本可以推断是工程或画面出现问题了!同时对方告知,当工程意外关闭或因其他原因未正常保存的关闭/退出行为,均可能出现工程或画面损坏。
工程出问题了,可以说是悲喜参半吧,悲的是可恨这易控软件太脆弱了,电脑出现蓝屏或者故障时,保不准那时候就开着一个易控工程,从而给项目埋下了一颗定时炸弹,运气好点只是一颗哑雷,皆大欢喜,运气不好就……就不好说了。喜的是工程出问题了,但是方案没有出问题,花点时间和精力解决这个问题就好。
接下来就是开始工程修复和重建工作,简单的说来就是确定一个初始的存档,从这个存档开始到现在的工程,中间所有的工作重做。因为没有办法判断到底是工程哪里出了问题,所以必须随时备份,做好修改记录,反复测试修改前后工程是否存在异常,并且当出现异常时,重新定位最近的一个正常的工程备份,如此反复。
!!!易控INSPEC组态软件开发小结——-一次工程文件损坏和处理经过的更多相关文章
- 开源纯C#工控网关+组态软件
一. 前言 在园子潜水也七八年了.说来惭愧,这么多年虽然一直自称.NET铁杆粉丝,然仅限于回几个不痛不痒的贴,既没有发布过代码,也没有写过文章. 看着.NET和C#在国外风生水起,国内却日趋没落, ...
- 开源纯C#工控网关+组态软件(八)表达式编译器
一. 引子 监控画面的主要功能之一就是跟踪下位机变量变化,并将这些变化展现为动画.大部分时候,界面上一个图元组件的某个状态,与单一变量Tag绑定,比如电机的运行态,绑定一个MotorRunning ...
- 开源纯C#工控网关+组态软件(九)定制Visual Studio
一. 引子 因为最近很忙(lan),很久没发博了.不少朋友对那个右键弹出菜单和连线的功能很感兴趣,因为VS本身是不包含这种功能的. 大家想这是什么鬼,怎么我的设计器没有,其实这是一个微软黑科技 ...
- 让你提前知道软件开发(22):shell脚本文件操作
文章1部分 再了解C语言 shell脚本中的文件操作 [文章摘要] 编写shell脚本时,经常会涉及到对文件的操作,比方从文件里读取一行数据.向文件追加一行数据等. 完毕文件读写操作的方法有非常多,了 ...
- 开源纯C#工控网关+组态软件(六)图元组件
一. 图元概述 图元是构成人机界面的基本单元.如一个个的电机.设备.数据显示.仪表盘,都是图元.构建人机界面的过程就是铺排.挪移.定位图元的过程. 图元设计是绘图和编码的结合.因为图元不仅有显示和 ...
- 开源纯C#工控网关+组态软件(十)移植到.NET Core
一. 引子 写这个开源系列已经十来篇了.自从十年前注册博客园以来,关注了张善友.老赵.xiaotie.深蓝色右手等一众大牛,也围观了逗比的吉日嘎啦.精密顽石等形形色色的园友.然而整整十年一篇文章都 ...
- 开源纯C#工控网关+组态软件(七)数据采集与归档
一. 引子 在当前自动化.信息化.智能化的时代背景下,数据的作用日渐凸显.而工业发展到如今,科技含量和自动化水平均显著提高,但对数据的采集.利用才开始起步. 对工业企业而言,数据采集日益受到重视, ...
- 开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7
一. 引子 首先感谢博客园:第一篇文章.第一个开源项目,算是旗开得胜.可以看到,项目大部分流量来自于博客园,码农乐园,名不虚传^^. 园友给了我很多支持,并提出了很好的改进意见.现加入屏幕分辨率自 ...
- 开源纯C#工控网关+组态软件(四)上下位机通讯原理
一. 网关的功能:承上启下 最近有点忙,更新慢了.感谢园友们给予的支持,现在github上已经有.目标是最好的开源组态,看来又近一步^^ 之前有提到网关是物联网的关键环节,它的作用就是承上启下. ...
随机推荐
- [问题解决] initAndListen: 10309 Unable to create/open lock file: /data/db/mongod.lock
错误: 在linux下开启mongoDB的 $ >bin: ./mongod 时报错:initAndListen: 10309 Unable to create/open lock file: ...
- poj2140---herd sums
#include<stdio.h> #include<stdlib.h> int main() { ,i,j; scanf("%d",&n); ;i ...
- HDU 4661 Message Passing 【Tree】
题意: 给一棵树,每一个结点都有一个信息,每一个时刻,某一对相邻的结点之间可以传递信息,那么存在一个最少的时间,使得所有的节点都可以拥有所有的信息.但是,题目不是求最短时间,而是求最短时间的情况下,有 ...
- hibernate环境配置和使用
一.hibernate简单介绍 Hibernate是一个开放源码的对象关系映射框架,它对JDBC进行了很轻量级的对象封装,使得Java程序猿能够随心所欲的使用对象编程思维 ...
- C++ 文件操作实例
图1 文件个数及名称 图2 文件内容 背景:如图1所示,现有9个要处理的文件,每个文件的内容格式如图2所示,仅仅只是数值部分不同. 问题:如何提取每个文件中的相同属性的数值到同一个文件中? 输出示例: ...
- JavaScript引用类型之Array类型一
一.简介 除了Object之外,Array类型恐怕是ECMAScript中最常用的类型了.下面就来分析ECMAScript中的数组与其他语言中的数组的异同性: 1.相同点: (1)他们都是数据的有序列 ...
- SlidingMenu侧边菜单
第一步.首先在你项目中创建一个包存放侧边菜单的类:
- 在windows后台调用webservice
1.首先要创建个webservice,然后再webservice写一个方法如图 2.然后将WebService1.asmx 在浏览器中浏览会出现如图所示(该地址很重要,复制此地址在下边程序中要用到) ...
- js 下拉框效果
<script type="text/javascript"> window.onload = function () { ]; ]; var aLi = oSub.g ...
- 使用分析函数实现Oracle 10G提供的CONNECT_BY_ISLEAF和CONNECT_BY_ROOT的功能(转载)
文章转载至:http://blog.csdn.net/wzy0623/article/details/1644049 如果,有侵犯您权益的地方,烦请及时的告知我,我会即刻停止侵权行为 Oracle 1 ...