protected override IEnumerable <IOpcNode> CreateNodes(OpcNodeReferenceCollection references) { var machineNode = new OpcObjectNode(this.DefaultNamespace.GetName("Machine")); this.jobsNode = new OpcFolderNode(machineNode, "Jobs"); references.Add(machineNode, OpcObjectTypes.ObjectsFolder); // Add some predefined jobs. new OpcDataVariableNode <int>(this.jobsNode, "JOB01", value: 0); new OpcDataVariableNode <int>(this.jobsNode, "JOB02", value: 0); new OpcDataVariableNode <int>(this.jobsNode, "JOB03", value: 0); // Define a generic event to notify about job-scheduled. this.jobScheduldedEventNode = new OpcEventNode(this.jobsNode, "JobSchedulded"); this.jobScheduldedEventNode.Severity = OpcEventSeverity.Medium; this.jobScheduldedEventNode.Message = "The job has been schedulded."; this.jobsNode.AddNotifier(this.SystemContext, this.jobScheduldedEventNode); // Define a generic event to notify about job-completed. this.jobCompletedEventNode = new OpcEventNode(this.jobsNode, "JobCompleted"); this.jobCompletedEventNode.Severity = OpcEventSeverity.Medium; this.jobCompletedEventNode.Message = "The job has been completed."; this.jobsNode.AddNotifier(this.SystemContext, this.jobCompletedEventNode); return(new IOpcNode[] { machineNode }); }
private static void RunMachine(object state) { var context = (OpcContext)state; var eventNode = new OpcEventNode("State"); var eventSourceNode = default(OpcNode); while (!machineControl.IsCancellationRequested) { var time = DateTime.Now.TimeOfDay; temperatureNode.Value = time.Seconds + time.Milliseconds * 0.1; temperatureNode.ApplyChanges(context); speedNode.Value = time.Seconds * 1000; speedNode.ApplyChanges(context); if (time.Seconds % 11 == 0) { eventSourceNode = speedNode; eventNode.Severity = OpcEventSeverity.Medium; } else { eventSourceNode = temperatureNode; if (temperatureNode.Value <= 10) { eventNode.Severity = OpcEventSeverity.Low; } else if (temperatureNode.Value <= 20) { eventNode.Severity = OpcEventSeverity.MediumLow; } else if (temperatureNode.Value <= 30) { eventNode.Severity = OpcEventSeverity.Medium; } else if (temperatureNode.Value <= 40) { eventNode.Severity = OpcEventSeverity.MediumHigh; } else if (temperatureNode.Value <= 50) { eventNode.Severity = OpcEventSeverity.High; } else { eventNode.Severity = OpcEventSeverity.Max; } } eventNode.SourceName = eventSourceNode.SymbolicName; eventNode.SourceNodeId = eventSourceNode.Id; var eventData = eventNode.CreateEvent(context); eventSourceNode.ReportEvent(context, eventData); // Wait for "StopMachine" or perform next steps after interval elapsed if (machineControl.Token.WaitHandle.WaitOne(2500)) { break; } } }