private List <string> UpdateVariables()
 {
     try
     {
         HashSet <string> variableList = new HashSet <string>();
         _matlabService.Matlab.Execute(string.Format("{0} = who", MatlabService.VariablesTag));
         object vars;
         _matlabService.Matlab.GetWorkspaceData(MatlabService.VariablesTag, MatlabService.BaseTag, out vars);
         object[,] variables = vars as object[, ];
         if (variables != null)
         {
             for (int i = 0; i < variables.GetLength(0); i++)
             {
                 string variableName = variables[i, 0].ToString();
                 if (variableName != MatlabService.VariablesTag)
                 {
                     variableList.Add(variableName);
                     object variable = _matlabService.Matlab.GetVariable(variableName, MatlabService.BaseTag);
                     OpcDataVariableNode dataNode;
                     if (!_variableNodesIds.TryGetValue(variableName, out dataNode))
                     {
                         dataNode = new OpcDataVariableNode(_matlabFolder,
                                                            new OpcName(variableName), variable);
                         dataNode.WriteVariableValueCallback = WriteMatlabVariableValueCallback;
                         _variableNodesIds.Add(variableName, dataNode);
                         AddNode(dataNode);
                         Console.WriteLine("Added variable {0} : {1}", variableName, variable);
                     }
                     else if (!dataNode.Value.Equals(variable))
                     {
                         dataNode.Value = variable;
                         Console.WriteLine("Modified variable {0} : {1}", variableName, variable);
                     }
                     dataNode.DataType = OpcDataTypes.GetDataType(variable.GetType());
                 }
             }
             //Remove variables that no longer exists
             List <string> keys = _variableNodesIds.Keys.ToList();
             foreach (string key in keys)
             {
                 if (!variableList.Contains(key))
                 {
                     IOpcNode removeNode = _variableNodesIds[key];
                     this.RemoveNode(removeNode);
                     _variableNodesIds.Remove(key);
                     Console.WriteLine("Removed variable: {0}", key);
                 }
             }
         }
         return(variableList.ToList());
     }
     catch (Exception ex)
     {
         Console.WriteLine("Update variables error:{0}{1}{0}{2}", Environment.NewLine, ex.Message, ex.StackTrace);
         return(null);
     }
 }
Example #2
0
        public static void Main(string[] args)
        {
            //// If the server domain name does not match localhost just replace it
            //// e.g. with the IP address or name of the server machine.

            var client = new OpcClient("opc.tcp://localhost:4840/SampleServer");

            client.Connect();

            var methodsNode = client.BrowseNode("ns=2;s=Methods");
            var methods     = BrowseMethods(methodsNode).ToList();

            do
            {
                Console.WriteLine("Enter index of method to call or 'exit':");

                for (int index = 0; index < methods.Count; index++)
                {
                    Console.WriteLine("{0}. {1}", index, methods[index].Node.DisplayName.Value);
                }

                var line = Console.ReadLine();

                if (line == "exit")
                {
                    break;
                }

                if (int.TryParse(line, out var methodIndex))
                {
                    var method = methods[methodIndex];

                    Console.WriteLine();
                    Console.WriteLine("Calling method '{0}' ...", method.Node.DisplayName.Value);

                    var inputs = method.Node.GetInputArguments();

                    foreach (var input in inputs)
                    {
                        Console.WriteLine(
                            "\t[IN] {0} : {1} // {2}",
                            input.Name,
                            OpcDataTypes.GetDataType(input.DataTypeId),
                            input.Description);
                    }

                    var outputs = method.Node.GetOutputArguments();

                    foreach (var output in outputs)
                    {
                        Console.WriteLine(
                            "\t[OUT] {0} : {1} // {2}",
                            string.IsNullOrEmpty(output.Name) ? "ret" : output.Name,
                            OpcDataTypes.GetDataType(output.DataTypeId),
                            output.Description);
                    }

                    var inputArguments = new List <object>();

                    if (inputs.Length > 0)
                    {
                        Console.WriteLine();

                        foreach (var input in inputs)
                        {
                            Console.Write(
                                "Enter '{0}' value of '{1}': ",
                                OpcDataTypes.GetDataType(input.DataTypeId),
                                input.Name);

                            var value = Console.ReadLine();

                            if (input.DataTypeId == OpcDataTypes.String)
                            {
                                inputArguments.Add(value);
                            }
                            else if (input.DataTypeId == OpcDataTypes.Int32)
                            {
                                inputArguments.Add(int.Parse(value));
                            }
                        }
                    }

                    try {
                        var outputArguments = client.CallMethod(method.ParentId, method.Node.NodeId, inputArguments);
                        Console.WriteLine("Call succeeded!");

                        for (int index = 0; index < outputs.Length; index++)
                        {
                            var output = outputs[index];

                            Console.WriteLine(
                                "'{0}' value of '{1}': {2}",
                                OpcDataTypes.GetDataType(output.DataTypeId),
                                string.IsNullOrEmpty(output.Name) ? "ret" : output.Name,
                                outputArguments[index]);
                        }
                    }
                    catch (OpcException ex) {
                        Console.WriteLine("Call failed: {0}", ex.Message);
                    }

                    Console.WriteLine();
                }
            } while (true);

            client.Disconnect();
        }