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 });
        }
Esempio n. 2
0
        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;
                }
            }
        }