构造SCPI字符串的类

时间:2019-01-11 16:40:57

标签: c# class abstract-class abstract

我正在尝试编写一个类以形成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”的另一个类。如何正确执行此操作?具体来说:

  • 如何使命令字符串相互构建?
  • 如何制作一种方法来接受一个或多个附加到字符串的参数?
  • 是否有方便的方法在字符串之间添加所需的冒号?
  • 是否有方便的方法在查询末尾添加问号?

1 个答案:

答案 0 :(得分:0)

  1. 第一个解决方案:在这种情况下,您可以使用装饰器模式。检查以下链接:
    decorator pattern tutorial

    要简要说明它如何适用于您的案例: 您可以将SCPI协议放在根命令和分支上,并将其扩展,直到您具有定义明确的SCPI命令为止:
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

如上面的代码所示,您可以灵活地进行不同的命令组合。参数也可以传递到最里面的对象实例。

  1. 第二种解决方案:鉴于SCPI命令的数量有限(它们并不受此限制,但是您只需执行一次),就可以创建一个带有函数的库以返回正确的字符串,而您只需要传递参数即可。这样做的好处是您不需要实现检查命令有效性的机制,而在解决方案1中,您可能最终制作了未为测量设备定义的非法字符串。