用于构造SCPI字符串的类

问题描述 投票:1回答:1

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

  • 如何使命令字符串相互构建?
  • 我如何制作一种方法来接受要附加到字符串的一个或多个参数?
  • 是否有在字符串之间添加所需冒号的简便方法?
  • 是否有在末尾添加问号的便捷方法?
c# class abstract-class abstract
1个回答
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中,您可能最终制作了未为测量设备定义的非法字符串。
© www.soinside.com 2019 - 2024. All rights reserved.