我正在尝试编写一个类以形成SCPI commands。我希望用法看起来像这样(与Keysight的DLL相似):
Instrument.SCPI.DISPlay.TEXT.Command("HELLO");
然后将构造字符串“ DISP:TEXT HELLO”,我可以通过Instrument类中指定的连接发送该字符串。
我以为这样的静态抽象类可能有用。我可以为希望支持的任何乐器添加新命令来扩展该类。基于抽象SCPI类的“ Instrument”类可以将结果字符串传递给串行端口或TCPIP或其他。
public static class SCPI
{
// Mandated commands
public const string CLS = "*CLS";
public const string ESE = "*ESE";
public const string ESR = "*ESR";
public const string IDN = "*IDN?";
public const string OPC = "*OPC";
public const string PSC = "*PSC";
// Display command
public static class DISPlay
{
public const string TEXT = "DISP:TEXT";
}
}
但是,如果我想添加命令“ TEXT:CLEar”,将立即变得不清楚如何继续,因为我无法在DISPlay中嵌套名称为“ TEXT”的另一个类。如何正确执行此操作?具体来说:
ROOT:BRANCH1:BRANCH2 ... <parameters>
以下伪代码显示了如何应用模式。基本上,您需要假设每个命令都是一个包含另一个命令并返回如下字符串的类:
class COMMAND: /* to be used as an interface for each SCPI command */
COMMAND ref_to_deeper_commands = NULL
string command_str = ""
string get_command(){
if(ref_to_deeper_commands == NULL)
return command_str
else
return command_str + ref_to_deeper_commands.get_string()
}
class ROOT:COMMAND /*implementation of ROOT command*/
ROOT(){
command_str = ":ROOT";
}
ROOT(sub_commands){
command_str = ":ROOT"
ref_to_deeper_commands = sub_commands
}
class BRANCH1:COMMAND /*implementation of BRANCH1 command*/
ROOT(){
command_str = ":BRANCH1";
}
ROOT(sub_commands){
command_str = ":BRANCH1"
ref_to_deeper_commands = sub_commands
}
class BRANCH2:COMMAND /*implementation of BRANCH2 command*/
ROOT(){
command_str = ":BRANCH2";
}
ROOT(sub_commands){
command_str = ":BRANCH2"
ref_to_deeper_commands = sub_commands
}
您可以执行以下主要功能:
main_function(){
COMMAND cmd = ROOT(BRANCH1(BRANCH2()))
print cmd
}
调用主代码中的打印功能将为您提供:
ROOT:BRANCH1:BRANCH2
您可以在上面的代码中看到,您可以灵活地进行不同的命令组合。参数也可以传递到最里面的对象实例。