本地执行与服务器执行

在针对硬件的测试中(如电脑的测试,汽车的测试,工厂中的设备的测试),为了达到自动化的目的,通常需要额外的辅助硬件工具(称为治具)配合测试,需要由程序对这些治具发出指令进行操作,FWScript依据自主研发的治具,实现了相关的指令,将来也可以支持第三方治具。

通常情况下,自动化执行脚本运行在待测机器上,这时由自动化执行脚本通过本系统发出指令让治具进行操作,我们称之为“本地执行”; 有时,治具需要执行的动作在待测机器已经关闭并且在重新启动之前的时候进行,这时需要借助第三方执行发出的指令,因此我们设计了向服务器发请求然后让服务器在规定的时间点执行这种方式,我们称之为“服务器执行”。
为了保持脚本的一致性,本地执行和服务器执行只是在设置中进行指定,一旦设置好,后面的指令是一样的,有的时候甚至可以依据待测机器上的配置文件进行判断是本地执行还是服务器执行。
治具执行命令的设计依据是:“简单的功能命令足够简单,复杂的功能也能照顾到”,因此针对每种治具,我们设计了一个初始设置语句,用来定义缺省的参数,如设备的名称,设备的ID等等,依据不同的治具定义不一样;同时考虑到尽量让设置与脚本无关,设计了BizHW.json这个配置文件,上述这些定义可以放在这个JSON文件中,当BizRunner执行的时候,读取这个配置文件。
为了尽量减少性能上的损伤,在TCJSON中特别添加了一个特征bizhw,只有在TCJSON的require字段包含有“bizhw”的时候,bizrunner才会去读取bizhw.json,并做相应的初始化设置。
注意:早期的实现方案在每次reboot后将重新读取BizHW.json,然后重新设置相应的治具,这样脚本中的设置指令在再次启动后就无效了,目前的实现方案改进了这个缺点,BizRunner会“记住”所有的HW设置,每次重新启动的时候,自动进行初始化设置。

方式设置说明
本地执行在设置的语句中,或者在BizHW.json中指定一个Com口地址或者为null 指定通过本地端口来执行相应的治具动作
服务器执行 在设置的语句中,或者在BizHW.json中指定一个IP地址指定远程服务器IP地址,由本地机器事先将要执行的动作发给服务器,由服务器在规定的时间内执行治具动作

治具设置文件

如果存在文件c:\bizat\bizhw.json,而且相应的TCJSON中的require字符串中包含有关键字"bizhw"(必须小写),则BizRunner每次启动的时候,自动从中获得相应的参数,然后对相应的治具进行初始化设置。
注意:只有在exe执行状况下,系统才会自动去判断对应的tcjson,然后自动装载bizhw.json。
如果您的执行不是在exe状况下,你可以使用强制调入命令 “loadhw” 或 “loadhwjson”。 也可以在代码里面直接使用set命令。

注:“Exe执行状态”指的是在调用BizRunner的时候,提供exe描述文件,BizRunner依据这个文件中的描述来执行脚本。

// 注意:该文件的格式随着治具的增多而会有相应的改动
 public class BizHW
    {
        public static BizHW instance;

        [DataMember]
        public string actionserver;  // 服务器的ip地址 
        [DataMember]
        public string commonportname;  // 对应的switcher或plug 的port的名字   finger powerswitcher 与plug 共用一个发射器
        [DataMember]
        DefPowerSwitcher powerswitcher;
        [DataMember]
        DefFinger finger;
        [DataMember]
        DefPlug plug;
        [DataMember]
        DefBox box;
        [DataMember]
        DefRemoteKVM remotekvm;

        [Serializable]
        [DataContract]
        public class DefPowerSwitcher  // 针对电源开关
        {
            [DataMember]
            public string name;  // 缺省的电源开关的名字 
            [DataMember]
            public int mode;  // 1: action server, 还是0: com口
        }

        [Serializable]
        [DataContract]
        public class DefFinger  // 针对单个的手指按键
        {
            [DataMember]
            public string name;  // 缺省的手指的名字
            [DataMember]
            public int mode; // action server, 还是 com口
        }

        [Serializable]
        [DataContract]
        public class DefPlug  // 针对插拔的设备
        {
            [DataMember]
            public string name; // plug 对应的控制器的缺省的名字 
            [DataMember]
            public int deviceid;  // 缺省的设备的编号
            [DataMember]
            public string portname; // 如果不是发射的模式,则此处指定对应的port口,此处表示为使用直接的串口模式,而不是无线发射 
            /// 
            /// 0: 直接串口, 1:本地发射, 2:服务器发射
            /// 
            [DataMember]
            public int mode;  // 0: 直接串口, 1:本地发射, 2:服务器发射 [DataMember]
            [DataMember]
            public int distance; // 缺省的移动距离,以mm为单位
        }

        [Serializable]
        [DataContract]
        public class DefRemoteKVM
        {
            [DataMember]
            public string port; // 对应的串口的名字
            [DataMember]
            public int deviceid;  // 对应的设备的ID
            [DataMember]
            public int mode;  // 1:action server, 还是0: com口, 2: 使用本地的滑台 
        }

        [Serializable]
        [DataContract]
        public class DefBox
        {
            [DataMember]
            public string[] switchstr;  // 定义接线的安排,通常为null [DataMember]
            [DataMember]
            public string portorip; // 如果含有符号'.',则为IP地址,表示使用远程的actionserver,后面的boxtype就是boxname;如果boxname为null,则为直接操纵含有IP地址的box。         
                        // 无mode说明,依据portorip的特征来区分  // 注意因为有延时的功能,不支持使用服务器方式
        }

对应的json文件内容:
{"actionserver":"172.16.100.2", "commonportname":"com3", "powerswitcher":{"name":"005", mode:0}}
也可以很简单地写上:
{"powerswitcher":{"name":"bizsmooth010","mode":0}} 注意:如果bizrunner发现提供的port为null,会自动去系统里面找到第一个可用的COM口。这意味着,如果系统中插有多个,你必须显示指定对应的COM口。
也就是说,如果commonportname的值为null,则直接从系统中获取第一个可用的com口。
<< 断点续执行调用BizAT >>