5.2.4 站全局变量(StationGlobals)
在TestStand中,作用域范围最大的是站全局变量。只要是运行于同一台计算机上同一个版本的TestStand,任何序列文件都可以访问站全局变量。本质上讲,站全局变量其实是保存在StationGlobals.ini文件中的,对全局变量的访问相当于是对该文件进行读/写操作。StationGlobal.ini文件位于<TestStand Application Data>\Cfg目录下。
站全局变量的创建和其他变量类似,可以在变量窗格中的StationGlobals容器下添加。当站全局变量较多时,可单击工具条上的图标,TestStand会打开站全局变量管理窗口,用户可以方便地在管理窗口中对站全局变量进行操作。在StationGlobals下默认有StationGlobals.TS子属性,StationGlobls.TS.CurrentUser包含的是当前账户的信息,如登录名、权限等。
【练习5-2】使用文件全局变量和站全局变量。
在本练习中,将创建文件全局变量和站全局参量,使用文件全局变量在同一个序列文件的序列之间传递数据,使用站全局变量在不同的序列文件之间传递数据。
(1)打开序列编辑器,新建序列文件并将其保存为<Exercise>\Chapter 5\FileGlobals and StationGlobals\FileGlobals and StationGlobals.seq。
(2)在FileGlobals容器下新建一个数值型文件全局变量Count(初始值为0)。
(3)在序列窗格中,新建两个序列,序列名称分别是“SubSequence A”、“SubSequence B”。
(4)在序列窗格中,选中“SubSequence A”,然后添加一个表达式步骤,在表达式中输入“FileGlobals.count++”。
(5)在序列窗格中,选中“SubSequence B”,然后添加一个表达式步骤,在表达式中输入“FileGlobals.count++”。
(6)在序列窗格中,选中主序列,添加序列调用步骤,设置步骤名称为“Call SubSequence A”,在步骤设置窗格模块页面中,选中“Use Current File”选项,然后在序列下拉列表中选择“SubSequence A”。
(7)再添加一个序列调用步骤,设置步骤名称为“Call SubSequence B”,在步骤设置窗格模块页面中,勾选“Use Current File”选项,然后在序列下拉列表中选择“SubSequence B”。
(8)添加一个消息对话框步骤,设置步骤名称为“Display value of FileGlobals.count”,在消息表达式中输入“"The value of count is"+Str(FileGlobals.count)”。
(9)保存序列文件,通过菜单命令“ExecuteRun MainSequence”执行序列。观察消息对话框中最终显示的文件全局变量的值。
(10)右击步骤列表窗格的上方(选项卡处),关闭执行完成的窗口,如图5-6所示。
图5-6 关闭执行完成的窗口
注意:在序列执行完成后,回到序列文件的窗口,在变量窗格中留意观察FileGlobals.count的值。
(11)回到序列文件的窗口,在序列窗格中选中主序列,在变量窗格中创建一个数值型局部变量Area(初始值为0)。
(12)在StationGlobals容器下创建一个数值型站全局变量diameter(初始值为0)。
(13)在Display Value of FileGlobals.count步骤后面添加一个表达式步骤,设置步骤名称为“Compute Circle Area”,在表达式中输入“Locals.Area=3.14∗StationGlobals.diameter∗StationGlobals.diameter”,计算圆的面积。
(14)添加一个消息对话框步骤,设置步骤名称为“Display Value of Area”,在消息表达式中输入“"The value of Area is"+Str(Locals.Area)”。现在,主序列步骤列表窗格如图5-7所示。
图5-7 主序列的步骤列表窗格
(15)保存序列文件,通过菜单命令“ExecuteRun MainSequence”执行序列。观察Display Value of Area消息对话框中Locals.Area的显示值。
(16)新建一个序列文件并将其保存为“Set diameter.seq”。
(17)在Set diameter.seq的主序列中添加一个表达式步骤,在表达式中输入“StationGlobals.diameter=3”。
(18)保存序列文件,通过菜单命令“ExecuteRun MainSequence”执行序列。
(19)回到FileGlobals and StationGlobals.seq序列文件窗口,通过菜单命令“ExecuteRun MainSequence”执行序列。观察Display value of Area消息对话框中Locals.Area的显示结果。
在步骤(9)之后,回到序列文件FileGlobals and StationGlobals.seq的窗口,在变量窗格中,观察发现FileGlobals.count的值依然为0。而StationGlobals.diameter在Set diameter.seq中一旦被设置后,这个值将会一直保存,在FileGlobals and StationGlobals.seq中再次运行主序列时得到的Locals.Area结果就不再是0了。所以,如果局部变量、参量和文件全局变量的值在序列执行的过程中被修改,修改的值只会在序列执行过程中产生影响,当序列执行完成后,它们并不能保持这些修改的值,所有的变量会变回初始值。而对站全局变量的任何更新赋值都可以保留下来,即使用户退出TestStand或重启计算机。
在范例资源的第5章练习中,例程<Exercises>\Chapter 5\FileGlobals and StationGlobals目录下的序列完成的是上面的练习,读者可以通过菜单命令“ExecuteRun MainSequence”运行该范例并观察结果。
虽然文件全局变量和站全局变量的作用域范围较大,但是用户不应滥用全局变量。如果局部变量或参量能满足数据传递的要求,就应尽量避免使用全局变量,全局变量的过多使用会带来潜在的隐患,由于多个地方都有权限对全局变量进行写操作,全局变量的值可能在预期之外被修改,这会给系统可靠性和调试带来很大的困难。