关键词:自动 SCPI 标准编程语言
Electric Resistance Instrument
Teng Da-zhu ,Cheng Ming
Abstract: Along with the development of the automatic test, put forward the challenge to the programmable of the instrument, under this premise, the appear of the negotiate SCPI(Standard Commands for Programmable Instruments), arousing the development of the standard programable language, and finally were accept by the industry field. This thesis is design for the bottom machine base on the SCPI.
Keywords: automation SCPI programmable language
1、引言
在以往的仪器控制中,复杂的指令结构,繁琐的编写语言使仪表的可编程性很差,久而久之,人们渴望得到一个统一的编程标准,美国HP公司为了迎接这个挑战,首先在公司的内部实现了统一的标准化编程语言TMSL(Test and Measuremens System Language),经过一段时间的试验和改进,它被工业界所接受,定义为仪表界的标准,并将它重新命名为SCPI(Standard Commands for Programmable Instruments)。
SCPI应用的很普遍,但是在中国,可程控仪器和自动测试系统正处于发展阶段,所以个人认为,我们应尽量跳过程控命令非标准化阶段。大力推广SCPI,以跟上程控命令标准化的世界潮流。
在本文中,主要通过构建一个子系统来说明SCPI是如何实现的,上位机通过RS232串口发送指令,下位机接受后进行循环解析,得出命令所希望实现的功能,执行相应的函数后返回数据。下位机通过返回相应的数据来验证上位机的指令是否得到了解析,如果是正确的,则返回相应的数据,如果是错误的,则返回错误信息。
2、设计概述
2.1 SCPI命令树结构
对SCPI命令采用树状结构的,可向下三级,在这里最高级称为子系统命令。只有选择了子系统命令,该其下级命令才有效,SCPI使用冒号(:)来分隔高级命令和低级命令。
2.2串口通信
通常PC机和单片机之间的通信都是通过串行总线RS-232实现的。因此采用一种以RS232为核心的通信接口电路。该接口电路适用于由一台PC机与多个单片机串行通信的设计,其原理框图见图1:
该框图中,起着重要作用的是RS-232C通信接口电路。它是上位机和下位机之间信息传递的枢纽,一切数据的传输必需由它完成,上位机通过直接利用它的RS-232串行口来发送指令和接受返回值。
图1单片机与PC机通信原理框图
3、SCPI在直流低阻表中的实现
3.1直流低阻表的功能
直流低电阻主要用于计算机等高端机器,由于是直流电阻,所以电阻发热是不可避免的,而采用低阻值的电阻则可以减少发热量,不但可以节省电能,而且还大大提高仪器的使用寿命。直流低阻表的功能就是在流水线上检测电阻的质量,确保电阻阻值在允许的误差范围内。这样不但可以全天实时监控,更可以记录下阻值变化曲线图,给工程师检测仪器是否正常工作带来方便。
3.2直流低阻表的模块
可程控仪器的标准指令集同样可以在直流低阻表里实现,一般的直流低阻表都包含: FUNCtion子系统和COMParator子系统。
3.3命令解析
3.3.1 库函数介绍
在构建模块化的时候,调用库函数完成相应的功能是很方便的,在这个SCPI解析协议中提供了以下的库函数:
CheckFloat.c 它的作用是检查是否为浮点数;
CheckInteger.c 它的作用是检查是否为整数;
CommandEntry.c 这个库函数很重要,它是程序的入口,计算机通过RS232串口发送数据到单片机,就是通过这个入口程序来接受指令的;
NewToken.c 它的作用是对指针指向的字符或符号或数字转换成标识符,如将“set”转换“TOKEN_FLAG_COMMAND”,将“50”转换成“TOKEN_FLAG_NUMMBER”;
RS232_Close.c 它的作用是关闭RS232串口;
RS232ErrChr.c 它的作用是显示字符错误;
RS232ErrStr.c 它的作用是显示字符串错误;
RS232_Open.c 它的作用是打开RS232串口;
RS232Print.c 它的作用是输出;
RS232PrintChar.c 它的作用是输出单个字符;
RS232PrintError.c 它的作用是输出错误;
RS232PrintLine.c 它的作用是输出字符串;
RS232Send.c 它是RS232发送指令;
SeekParameter.c 它的作用是寻找参数;
SubsystemError.c 这里面包括了ERR子系统的函数;
Translate.c 这个库函数是下面要讲到的循环调用解析函数。
3.3.2命令解析函数
解析函数是整个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”,返回主函数。执行完这段程序后跳出循环,等待下次循环的到来。
(2) 如果有下级执行函数,则将下级命令赋给pToken,并执行下级执行函数,函数执行完后会返回一个标识符,在这里又一次对标识符进行一次判断:
① 如果是“:”,这时再看命令是否有下级,如果没有,则返回错误信息“INVALID AEPARATOR”,如果有则将true赋给bNeedCommand后跳出。
② 如果是“;”,则看m_bCommon是否为true,若为true的话,则将其置false,并将bNeedCommand置为false后跳出。
③ 如果是“TOKEN_FLAG_RESTART”,则将m_bCommon置为false,返回到根命令,返回true。
④ 如果是“TOKEN_FLAG_COMMON”,则看m_bCommon是否为false如果是则将其置为true,将pToken的值赋给m_pTokenSave,返回true。
⑤ 如果是“END”,则返回fslse。
⑥ 如果以上什么都不是,则返回错误信息,并返回false。
2.如果是“*”,则其代表的是公共命令,将m_bCommon置为true。
3.如果是“:”,则跳出。
4.如果是“ ”,此时看bNeedCommand是否为真,如果是,则返回错误信息“SYNTAX ERROR”,返回主函数。
5.如果是“TOEN_FLAG_NUMBER”,返回错误信息“BAD COMMAND”。
6.如果是“TOKEN_FLAG_END”,返回主循环。
7.如果都不是,则返回错误信息“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,发现了问题的所在,我就开始改写时种定义函数。
首先找到定义延时定时器的文件define.h,在里面找到:
#define RELOAD_H_10MS 0x7d
#define RELOAD_L_10MS 0xcb
这里的时间定义是以20M为准的,时间计算的公式如下:
x=65536-T/t,再将x转化成十六进制,分别赋给RELOAD_H_10MS和RELOAD_L_10MS,其中T是延时时间,t是一周期的时间。像:
12MHz@12CLK: t=1us/circle
12MHz@6CLK: t=500ns/circle
40MHz@12CLK: t=300ns/circle
像:x = 65536 –T/t 1ms = 65536–1000=64536 转化为十六进制为0xFC18
50ms = 65536–50000=15536转化为十六进制为0x3CB0
在本设计中,用的是12M@12CLK的芯片,延时定时器用的是10ms的,所以修改定义RELOAD_H_10MS和RELOAD_L_10MS的值就可以了,x=65536-10ms/1us=55536,修改后为: #define RELOAD_H_10MS 0Xd8
#define RELOAD_L_10MS 0Xf0
修改后运行成功,时间也正确了。
3.5测试结果
在设计里,你可以通过两种方法来设置红绿等亮的时间,一种是通过按键,直接在模板上进行操作,是通过“KeyEntry()”来完成的;一种是通过计算机串口和模板进行通信,在计算机里输入命令来设置红绿灯的时间,是通过“CommandEntry()”来完成的,这两种方法在模板上都得到了实现,通过按键来来设置的功能要少一点,只能对时间进行设置和实现暂停功能,通过串口通信来设置的功能包括了查询,设置时间,重新启动。在电脑里通过上位机所编的界面,来与模板通信,输入“set:red 50”,返回“50”,同时红灯的设置时间变为“50”,输入“set:gree?”,返回“30”说明绿灯的设置时间为“30”,输入“rst”,返回“waiting for 3s……”,3s后重新启动,通过测试,说明我所用的SCPI的思想在里面得到了实现。
4、结束语
控制中出现的功能不足,可以通过增加指令来满足,这是SCPI的优点。标准的指令格式实现了助记符的一致性、参数格式的统一性以及执行方式和功能扩展战略的一致性,减少了测试软件开发时间,使仪器的互换更容易。用SCPI编写的程序不仅更可读,而且更加直观人们可以花费较少的时间来学习所使用的仪器,从而可花费较多的时间来解决实际应用问题。而且SCPI还是可扩展的,这就使它能随着仪器能力的增加而扩大,这样在将来人们可以购买一台比目前所用仪器功能更多的多用表,其基本功能完全可像目前使用的旧仪器一样程控。
因而,在本次设计中,我们就是以SCPI协议为指导思想,采用SCPI的指令助记符,分层结构及多重命令结构,来实现控制仪器模板的目的。在计算机通过RS232串口发送控制指令到模板时,模板接受了指令,并且做出了相应的回应,返回的数据与实际的数据相符,成功地把SCPI的思想应用于下位机的编程中,收到了很好的效果。
本文的创新点: SCPI协议已经编写成功,计算机发送的指令已经被单片机接受,并解析正确,执行了相应的函数。由此可见,在直流低阻表中,SCPI也能得到实现。
参考文献
[1] 李毓辉,郭群山,周雄伟.一种自动测试系统软件平台的设计[J].微计算机信息 2005年第五期.
[2] 欧阳光,何光明.Keil_c程序设计教程[M].北京:人民大学出版社,2004.23-39.
[3] 王小龙,雷河静.可编程仪器的前景[J].微型仪器与应用,2001,(6):16-18.
[4] H.A.Wheeler.SCPI:The Next Step in the Evolution of ATE Systems.Electronics Test[M].New York:Industry Publisher,August 1990:12-15.
[5] J.W.Duncan,and V.P.Minerva.SCPI Instruments Will Ease ATE Development[J]. Instrument,October l991:4-6.






