2017-10-14 4 views
0

Je travaille sur la création d'un programme C# pour contrôler une machine pick and place à trois axes et essaye de déterminer le type de fichier que je veux utiliser pour lire et exécuter le programme pick and place. Le programme ressemblerait à quelque chose comme ceci:Quel est le type de fichier le meilleur et le plus simple à utiliser pour lire et exécuter un programme C#?

Déplacer X 999,9 Attendez entrée 1 Déplacer Y à 1,0 Set 1 sortie Et les choses simples comme ça.

Je figure que dans un fichier CSV, il ressemblerait à ceci:

move,x,999.9 
wait,in,1 
move,y,1.0 
set,out,1 

Et puis je dois vérifier ce qui est dans la première colonne de la première ligne, si son mouvement puis vérifier quel axe la deuxième colonne alors où se déplacer dans la dernière colonne.

Serait-ce le moyen le plus simple ou devrais-je chercher quelque chose d'autre? Plus tard, je voudrais également implémenter les instructions IF dans le programme.

Répondre

0

Il sûrement d'autres façons de le faire, mais je le ferais de cette façon (juste un concept de base , vous devez mettre en œuvre la gestion des exceptions, les commandes inconnues, les paramètres illégaux et des trucs comme ça ...)

définition de commande:

interface ICommand 
{ 
    object Context { get; set; } 
    bool IsResponsible(string line); 
    void Execute(string line); 
} 
public class Move: ICommand 
{ 
    public bool IsResponsible(string line) 
    { 
     return line.StartsWith("move"); 
    } 
    public void Execute(string line) 
    { 
     var tmp = line.Split(','); 
     // Validate and verify parameters here 
     // code here to move the context to x/y 999.9 
     // Context.Move(tmp[1], Convert.ToDouble(tmp[2]); 
    } 
} 
public class Wait: ICommand 
{ 
    public bool IsResponsible(string line) 
    { 
     return line.StartsWith("wait"); 
    } 
    public void Execute(string line) 
    { 
     var tmp = line.Split(','); 
     // code here to wait... 
    } 
} 

exécution:

public void RunFile() 
{ 
    var ctx = new YourContext(); 
    var commands = new List<IMyCommand>(); 
    // You could look for all ICommand implementations here with reflection or just hard-code all known classes... 
    command.Add(new Move() { Context = ctx; }); 
    command.Add(new Wait() { Context = ctx; }); 

    var lines = File.ReadAllLines("your-file.txt"); 
    foreach(var line in lines) 
    { 
     var cmd = commands.FirstOrDefault(x => x.IsResponsible(line)); 
     if (cmd == null) 
      throw new IOException("unknown command!"); 
     cmd.Execute(line); 
    } 
} 

n'a pas été testé

+0

Merci je me suis pris dans une autre bussiness, je vais vérifier cela merci vous beaucoup. – JeeyBee

0

Si vous souhaitez utiliser un langage fonctionnel dans votre format de fichier, je vous recommande d'utiliser JSON plutôt que CSV. JSON est très facile à analyser. Net (en utilisant le populaire paquetage Newtonsoft.Json.dll nuget), permet une notation lisible très humaine, et vous permet une flexibilité que CSV plat ne peut tout simplement pas offrir.

L'équivalent JSON de votre fichier CSV ressemblerait à quelque chose comme ceci:

[ 
    { 
     "command": "move", 
     "axis": "x", 
     "distance": 999.9 
    }, 
    { 
     "command": "wait", 
     "interval": 1 
    }, 
    { 
     "command": "move", 
     "axis": "y", 
     "distance": 1.0 
    }, 
    { 
     "command": "set", 
     "valueName": "out", 
     "newValue": 1 
    } 
] 

Parsing ce serait aussi facile que la définition d'un objet comme celui-ci:

public class Command { 
    [JsonProperty("command")] 
    public string Command { get; set;} 

    [JsonProperty("axis")] 
    public string Axis { get; set;} 

    [JsonProperty("distance")] 
    public double Distance { get; set;} 

    [JsonProperty("interval")] 
    public double Interval { get; set;} 

    [JsonProperty("valueName")] 
    public string ValueName { get; set;} 

    [JsonProperty("newValue")] 
    public int NewValue { get; set;} 
} 

var commandList = JsonConvert.Deserialize<List<Command>>(rawTextOfCommandFile); 

Si vous voulez faire votre IF déclaration, il suffit de définir une commande IF qui prend un argument conditionnel, un argument THEN et un argument optionnel ELSE, où les arguments THEN et ELSE sont tapés comme Command ou List<Command>. Le balisage ressemblerait à ceci:

[ 
    { 
     "command": "if", 
     "conditionValueName": "foo", 
     "conditionValueOperator": "equals", 
     "conditionValueOperand": "bar", 
     "then": { 
     "command": "move", 
     "axis": "x", 
     "distance": 1 
     }, 
     "else": { 
     "command": "move", 
     "axis": "y", 
     "distance": 3 
     } 
    } 
]