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); } }
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(); }