从PCS 7 V7.1开始推出APL之后,热线上咨询APL功能块使用的用户是越来越多,但关于OS面板的问题到一直不太多,原因嘛,主要可能还是APL的脚本函数体系和各个组件之间的关系都比较复杂,用户很少会动手来修改的。但前几天倒还真出现了这么一个关于APL的OS操作面板的怪事:
一个单站项目,在ES上创建,并能够工作正常。拷贝到现场之后,下载到相应的单站计算机上,OS的数据读写都没有问题,但在打开PID等的Limit面板准备修改高低限值时,发现模拟量输入面板自动由下往上缓慢移动,而且不可操作。

这个问题着实很奇怪,赶紧创建一个同样的对象来尝试复现,但始终未能出现和用户一样的问题!
不论是APL还是传统的标准面板,模拟量输入对话框的打开和操作都是依靠背后的函数来实现的,所以这个对话框自动移动,肯定也是函数什么地方出错了。
有了这个基本判断之后,建议用户从WinCC的安装目录,一般都是“C:\Program Files\SIEMENS\WINCC\uTools”,打开其中的“apdiag.exe”,并在该软件上打开脚本监视窗口:

在这个“Output Window”中可以显示脚本函数的错误信息或者Printf函数打印出来的信息。
用户在OS上运行这个诊断工具之后,说只要这个模拟量输入对话框打开就会反复出现错误,而且在关闭操作面板的时候也有很多错误信息。
这就很奇怪了,APL面板中的按钮和显示组件都是标准的,正常情况下就只有极少量的提示信息而已,怎么会有很多错误信息呢?是不是用户的函数体系出现问题。于是建议用户打开“Global s cript”的C脚本编辑器,在工具栏上点击重新生成头文件:

可惜的是,用户做完这个之后问题还是存在。进一步,让用户又停下运行系统,做了一次“OS Project Editor”,可顽固的问题还是没有消失……
这是何故呢?
还是看看具体的脚本执行错误信息再说吧……
四个小时之后,用户的截图发过来了:

(部分信息是用户自己加入的诊断代码输出)
错误信息中反复出现了“APL_InitializeAnalogInputDialog: Error, invalid nCallFrom”。其中的“APL_InitializeAnalogInputDialog”是APL中的一个标准函数,这个函数在模拟量输入对话框打开时是会执行一次,但也只有一次而已,怎么可能还会出现这么多重复出现的错误呢?一定是有别的地方在调用这个!
为了分析的方便,建议用户把项目都发送过来了以便测试。
漫长的等待……
和客户同样的版本下激活了这个项目,问题果然出现了。现在的问题是先判断是谁在反复调用“APL_InitializeAnalogInputDialog”。这个问题在PCS7的脚本函数中倒不是什么难事,几乎所有的函数都会包含 lpszPictureName和lpszObjectName这两个形参,这表示的就是这个函数是由哪个画面中的哪个对象调用执行的,使用Printf将这个形参值输出出来即可。
果然,发现这个模拟量输入对话框画面中的一个名为“ObjPermission”的对象在反复调用这个函数!
在画面中找到这个对象,在其“PermissionChange”的事件中的确是在调用,而且其形参赋值有问题!正是由于这个赋值错误才导致了函数反复报错!
问题来源是找到了,但另一个问题又出来了?这个对象上的脚本是人为修改错的?
打开另一个新项目,查看面板上“PermissionChange”的脚本函数,和用户项目中的一模一样,难道是APL出Bug了?不可能啊,这个功能可是非常常用的,为什么只有用户的项目才报告了错误?
细想下来,如果不是画面对象的脚本出错,那么唯一的可能就是标准函数有问题。而做了OS Project Editor之后,项目中的标准函数就和系统中的函数是一致的了,系统中的函数怎么可能会有问题呢?
唯一的可能就是版本不一致!!
让用户检查创建这个OS项目的计算机上的PCS7版本以及APL的版本,问题果然出来了。这台计算机上的APL是升级了的V7.1 SP5版本,而现场的计算机都是SP4版本!
找来一个SP5版本来重新测试这个项目,问题消失了。再细看这个“APL_InitializeAnalogInputDialog”才发现,老版本下的所谓赋值错误在新版中是正常的!
回顾整个问题的处理过程,不由让人感叹啊,PCS7也好,APL也罢,版本在不断升级换代,功能在不断增强,但如果在项目执行过程中贸然升级导致类似的版本不一致的问题,那后果可是相当的严重啊。最后,还是提醒大家,保持项目中软件版本的一致性是编程组态中首先需要确保的条件!
好了!故事先写到这里。欢迎您关注更多的西门子热线故事!