1、气体泄漏测试仪的开发
在以往的仪器控制中,复杂的指令结构,繁琐的编写语言使仪表的可编程性很差,久而久之,人们渴望得到一个统一的编程标准,美国HP公司为了迎接这个挑战,首先在公司的内部实现了统一的标准化编程语言TMSL(Test and Measuremens System Language),经过一段时间的试验和改进,它被工业界所接受,定义为仪表界的标准,并将它重新命名为 SCPI(Standard Commands for Programmable Instruments)。
SCPI应用的很普遍,但是在中国,可程控仪器和自动测试系统正处于发展阶段,所以个人认为,我们应尽量跳过程控命令非标准化阶段。大力推广SCPI,以跟上程控命令标准化的世界潮流。
在本文中,主要通过构建一个子系统来说明SCPI是如何实现的,上位机通过RS232串口发送指令,下位机接受后进行循环解析,得出命令所希望实现的功能,执行相应的函数后返回数据。下位机通过返回相应的数据来验证上位机的指令是否得到了解析,如果是正确的,则返回相应的数据,如果是错误的,则返回错误信息。
2、设计概述
2.1 气体泄漏测试仪的开发
对SCPI命令采用树状结构的,可向下三级,在这里***称为子系统命令。只有选择了子系统命令,该其下级命令才有效,SCPI使用冒号(:)来分隔**命令和低级命令。
2.2串口通信
通常PC机和单片机之间的通信都是通过串行总线RS-232实现的。因此采用一种以RS232为核心的通信接口电路。该接口电路适用于由一台PC机与多个单片机串行通信的设计,其原理框图见图1:
该框图中,起着重要作用的是RS-232C通信接口电路。它是上位机和下位机之间信息传递的枢纽,一切数据的传输必需由它完成,上位机通过直接利用它的RS-232串行口来发送指令和接受返回值。
3、SCPI在直流低阻表中的实现
3.1直流低阻表的功能
直流低电阻主要用于计算机等**机器,由于是直流电阻,所以电阻发热是不可避免的,而采用低阻值的电阻则可以减少发热量,不但可以节省电能,而且还大大提高仪器的使用寿命。直流低阻表的功能就是在流水线上检测电阻的质量,确保电阻阻值在允许的误差范围内。这样不但可以全天实时监控,更可以记录下阻值变化曲线图,给工程师检测仪器是否正常工作带来方便。
3.2直流低阻表的模块
可程控仪器的标准指令集同样可以在直流低阻表里实现,一般的直流低阻表都包含: FUNCtion子系统和COMParator子系统。
3.3命令解析
3.3.1 库函数介绍
在构建模块化的时候,调用库函数完成相应的功能是很方便的,在这个SCPI解析协议中提供了以下的库函数:
CheckFloat.c 它的作用是检查是否为浮点数;
CheckInteger.c 它的作用是检查是否为整数;
CommandEntry.c 这个库函数很重要,它是程序的入口,计算机通过RS232串口发送数据到单片机,就是通过这个入口程序来接受指令的;
解析函数是整个SCPI协议的灵魂,SCPI协议的解析正是通过这样的一个循环调用函数来实现对命令的解析,然后再对解析出来的命令再加以解析,直到*后一层,*后调用其他的函数。
在循环解析中,它起了一个分割命令的作用,并对分割出来的命令再加以解析和分割直到*后一层,在这个函数中首先用到了NewToken()这个函数,这个函数的作用是对当前指针m_pInBuffer所指的对象进行判断,并返回相应的类型,若指向“:”,则返回“:”;如若指向“set”,则返回 “TOKEN_FLAG_COMMAND”;若指向“;”,则返回“ ;”,若指向“50”,则返回“TOKEN_FLAG_NUMMBER”,解析具体过程如下:
1.若是“TOKEN_FLAG_COMMAND”,则和自己所定义的命令进行比较,若不相同,则返回错误信息“BAD COMMAND”,若比较结果相同的话,赋bFound为true,并跳出while()循环,执行if操作,这里将出现两种情况:
(1) 如果没有下级执行函数,则比较m_pInBuffer是否为“:”,若是,则执行“++”操作,取出下一个符号,这里执行if操作,如果没有下级命令,则返回错误信息“BAD COMMAND”,如果有下级命令,就把这个命令赋给pToken,并置bNeedCommand为true;如果 m_pInBuffer不是“:”,则返回错误信息“INVALID SEPARATOR”,返回主函数。执行完这段程序后跳出循环,等待下次循环的到来。
为了便于理解,下面我来举个例子:
在计算机里输入“set:red 50;:set:yel?”这个指令,这个指令的作用是设置红灯的时间为“50”,并查询当前黄灯的时间。首先主程序的指针指向“set”,并通过“NewToken()”这个函数来返回一个标识符,把它赋给“cToken”,此时对“cToken”进行判断,因为 “set”是命令标识符,所以“NewToken()”返回的是“TOKEN_FLAG_COMMAND”,执行里面的操作,比较自定义的命令,结果在命令缩写形式里找到相同的命令,跳出“if”操作,程序指针“++”,由于我们定义“set”有下级指令“M_tSetup”,所以执行“else”操作,判断主程序的指针为“:”,后面有下级命令“red”,把它赋给“pToken”后跳出,此时的指针指向的是“red”,通过判断标识符的类型为 “TOKEN_FLAG_COMMAND”,继续执行里面的操作,比较自定义命令,结果找到相同的命令,程序指针“++”,我们定义的“red”指令没有下级命令而有下级执行函数,所以这里执行“if”操作,这里调用“SetRed()”这个函数,向里面写入时间“50”,此时程序指针执行“++”指向 “;:”,它是一个“TOKEN_FLAG_RESTART”类型的数据,执行命令树的重起操作,等待主函数的下次调用 “CommandEntry()”,调用后继续执行命令,同样指针指向“set”,由于返回的类型是“TOKEN_FLAG_COMMAND”,所以执行里面的操作,比较自定义的命令,结果在命令缩写形式里找到相同的命令,跳出“if”操作,程序指针“++”,由于我们定义“set”有下级指令 “M_tSetup”,所以执行“else”操作,判断主程序的指针为“:”,后面有下级命令“yel?”,把它赋给“pToken”后跳出,此时的指针指向的是“yel?”,通过判断标识符的类型为“TOKEN_FLAG_COMMAND”,继续执行里面的操作,比较自定义命令,结果找到相同的命令,程序指针“++”,我们定义的“yel?”指令没有下级命令而有下级执行函数,所以这里执行“if”操作,这里调用“SetYellowQuery()”这个函数,执行查询操作。指令到此结束。
3.4气体泄漏测试仪的开发
设计中,我遇到了这样的一个问题:一开始我用一片单片机做实验,成功后,换仿真器做实验,结果数码管的速度变慢了,原来的一秒变长了,经过思考,我认为是单片机的时钟频率和仿真器不同造成的,比较一看,单片机的时钟频率是20M,而我的仿真器的频率是12M,发现了问题的所在,我就开始改写时种定义函数。
3.5测试结果
在设计里,你可以通过两种方法来设置红绿等亮的时间,一种是通过按键,直接在模板上进行操作,是通过“KeyEntry()”来完成的;一种是通过计算机串口和模板进行通信,在计算机里输入命令来设置红绿灯的时间,是通过“CommandEntry()”来完成的,这两种方法在模板上都得到了实现,通过按键来来设置的功能要少一点,只能对时间进行设置和实现暂停功能,通过串口通信来设置的功能包括了查询,设置时间,重新启动。在电脑里通过上位机所编的界面,来与模板通信,输入“set:red 50”,返回“50”,同时红灯的设置时间变为“50”,输入“set:gree?”,气体泄漏测试仪的开发”,输入“rst”,返回“waiting for 3s……”,3s后重新启动,通过测试,说明我所用的SCPI的思想在里面得到了实现。
4、结束语
控制中出现的功能不足,可以通过增加指令来满足,这是SCPI的优点。标准的指令格式实现了助记符的一致性、参数格式的统一性以及执行方式和功能扩展战略的一致性,减少了测试软件开发时间,使仪器的互换更容易。用SCPI编写的程序不仅更可读,而且更加直观人们可以花费较少的时间来学习所使用的仪器,从而可花费较多的时间来解决实际应用问题。而且SCPI还是可扩展的,这就使它能随着仪器能力的增加而扩大,这样在将来人们可以购买一台比目前所用仪器功能更多的多用表,其基本功能完全可像目前使用的旧仪器一样程控。
因而,在本次设计中,我们就是以SCPI协议为指导思想,采用SCPI的指令助记符,分层结构及多重命令结构,来实现控制仪器模板的目的。在计算机通过RS232串口发送控制指令到模板时,模板接受了指令,并且做出了相应的回应,返回的数据与实际的数据相符,成功地把SCPI的思想应用于下位机的编程中,收到了很好的效果。