//Stop Manufacturing process
        private async void StopButton_Click(object sender, RoutedEventArgs e)
        {
            List <OPCWriteNode> OPCNodes = new List <OPCWriteNode>();

            OPCWriteNode onenodew = new OPCWriteNode();

            onenodew.Name   = "Run";
            onenodew.NodeId = "ns=3;s=Run";
            onenodew.Value  = 0.0; //true
            OPCNodes.Add(onenodew);

            OPCWriteNode onenodew1 = new OPCWriteNode();

            onenodew1.Name   = "Completed";
            onenodew1.NodeId = "ns=3;s=Completed";
            onenodew1.Value  = 0.0; //false
            OPCNodes.Add(onenodew1);

            OPCWriteNode onenodew2 = new OPCWriteNode();

            onenodew2.Name   = "Error";
            onenodew2.NodeId = "ns=3;s=Error";
            onenodew2.Value  = 0.0; //false
            OPCNodes.Add(onenodew2);

            OPCWriteNode onenodew4 = new OPCWriteNode();

            onenodew4.Name   = "ProcessStatus";
            onenodew4.NodeId = "ns=3;s=ProcessStatus";
            onenodew4.Value  = 0.0;
            OPCNodes.Add(onenodew4);

            OPCWriteNode onenodew5 = new OPCWriteNode();

            onenodew5.Name   = "Distance";
            onenodew5.NodeId = "ns=3;s=Distance";
            onenodew5.Value  = 0.0;
            OPCNodes.Add(onenodew5);

            OPCWriteNode onenodew6 = new OPCWriteNode();

            onenodew6.Name   = "Torque";
            onenodew6.NodeId = "ns=3;s=Torque";
            onenodew6.Value  = 0.0;
            OPCNodes.Add(onenodew6);

            var resultw1 = await OPCUAClient.WriteValues(OPCNodes);

            if (resultw1.Success == false)
            {
                MessageList.Items.Add("Process stop and initialize is not successful! " + resultw1.ErrorMessage);
            }
            else
            {
                MessageList.Items.Add("Process stop and initialize is successful.");
            }
        }
        //Apply limit values
        private async void LimitValuesButton_Click(object sender, RoutedEventArgs e)
        {
            if (OPCUAClient.Connected == false)
            {
                MessageList.Items.Add("Not connected to the OPC UA server!");
                return;
            }

            List <OPCWriteNode> OPCNodes = new List <OPCWriteNode>();

            OPCWriteNode onenodew = new OPCWriteNode();

            onenodew.Name   = "DistanceMin";
            onenodew.NodeId = "ns=3;s=DistanceMin";
            onenodew.Value  = DistanceMin.Value;
            OPCNodes.Add(onenodew);

            OPCWriteNode onenodew1 = new OPCWriteNode();

            onenodew1.Name   = "DistanceMax";
            onenodew1.NodeId = "ns=3;s=DistanceMax";
            onenodew1.Value  = DistanceMax.Value;
            OPCNodes.Add(onenodew1);

            OPCWriteNode onenodew2 = new OPCWriteNode();

            onenodew2.Name   = "TorqueMin";
            onenodew2.NodeId = "ns=3;s=TorqueMin";
            onenodew2.Value  = TorqueMin.Value;
            OPCNodes.Add(onenodew2);

            OPCWriteNode onenodew3 = new OPCWriteNode();

            onenodew3.Name   = "TorqueMax";
            onenodew3.NodeId = "ns=3;s=TorqueMax";
            onenodew3.Value  = TorqueMax.Value;
            OPCNodes.Add(onenodew3);

            var resultw1 = await OPCUAClient.WriteValues(OPCNodes);

            if (resultw1.Success == false)
            {
                MessageList.Items.Add("Limit values writing are not successful! " + resultw1.ErrorMessage);
            }
            else
            {
                MessageList.Items.Add("Limit values writing are successful.");
            }
        }
        //Manufacturing process
        private async void Start_Click(object sender, RoutedEventArgs e)
        {
            LoadingControl.IsLoading = true;
            MessageList.Items.Clear();

            if (OPCUAClient.Connected == false)
            {
                MessageList.Items.Add("Not connected to the OPC UA server!");
                LoadingControl.IsLoading = false;
                return;
            }

            #region Read Run Status

            List <OPCReadNode> ReadOPCNodes = new List <OPCReadNode>();

            OPCReadNode onenode = new OPCReadNode();

            onenode.Name   = "Run";
            onenode.NodeId = "ns=3;s=Run";
            ReadOPCNodes.Add(onenode);
            var resultreadopc = await OPCUAClient.ReadValues(ReadOPCNodes);

            bool GoodTag   = false;
            bool RunStatus = false;
            if (resultreadopc.Success == true)
            {
                foreach (var item in resultreadopc.OPCValues)
                {
                    if (item.Name == "Run" && item.IsGood == true)
                    {
                        GoodTag = true;
                        if ((double)item.Value > 0)
                        {
                            RunStatus = true;
                        }
                    }
                }
            }
            else
            {
                MessageList.Items.Add("OPC UA communication error!");
                LoadingControl.IsLoading = false;
                return;
            }

            if (GoodTag == false)
            {
                MessageList.Items.Add("OPC UA communication error!");
                LoadingControl.IsLoading = false;
                return;
            }
            if (RunStatus == true)
            {
                MessageList.Items.Add("Process is running!");
                LoadingControl.IsLoading = false;
                return;
            }
            #endregion

            #region Start Process
            List <OPCWriteNode> OPCNodes = new List <OPCWriteNode>();

            OPCWriteNode onenodew = new OPCWriteNode();
            onenodew.Name   = "Run";
            onenodew.NodeId = "ns=3;s=Run";
            onenodew.Value  = 1.0; //true
            OPCNodes.Add(onenodew);

            OPCWriteNode onenodew1 = new OPCWriteNode();
            onenodew1.Name   = "Completed";
            onenodew1.NodeId = "ns=3;s=Completed";
            onenodew1.Value  = 0.0; //false
            OPCNodes.Add(onenodew1);

            OPCWriteNode onenodew2 = new OPCWriteNode();
            onenodew2.Name   = "Error";
            onenodew2.NodeId = "ns=3;s=Error";
            onenodew2.Value  = 0.0; //false
            OPCNodes.Add(onenodew2);

            OPCWriteNode onenodew4 = new OPCWriteNode();
            onenodew4.Name   = "ProcessStatus";
            onenodew4.NodeId = "ns=3;s=ProcessStatus";
            onenodew4.Value  = 0.0;
            OPCNodes.Add(onenodew4);

            OPCWriteNode onenodew5 = new OPCWriteNode();
            onenodew5.Name   = "Distance";
            onenodew5.NodeId = "ns=3;s=Distance";
            onenodew5.Value  = 0.0;
            OPCNodes.Add(onenodew5);

            OPCWriteNode onenodew6 = new OPCWriteNode();
            onenodew6.Name   = "Torque";
            onenodew6.NodeId = "ns=3;s=Torque";
            onenodew6.Value  = 0.0;
            OPCNodes.Add(onenodew6);

            var resultw1 = await OPCUAClient.WriteValues(OPCNodes);

            if (resultw1.Success == false)
            {
                MessageList.Items.Add("Process start is not successful! " + resultw1.ErrorMessage);
            }
            else
            {
                MessageList.Items.Add("Process start is successful.");
            }

            await Task.Delay(5000);

            #endregion

            #region Process 1
            List <OPCWriteNode> OPCNodes20 = new List <OPCWriteNode>();

            OPCWriteNode onenodew20 = new OPCWriteNode();
            onenodew20.Name   = "ProcessStatus";
            onenodew20.NodeId = "ns=3;s=ProcessStatus";
            onenodew20.Value  = 1.0;
            OPCNodes20.Add(onenodew20);

            var resultw2 = await OPCUAClient.WriteValues(OPCNodes20);

            if (resultw2.Success == false)
            {
                MessageList.Items.Add("Process 1 start is not successful! " + resultw2.ErrorMessage);
            }
            else
            {
                MessageList.Items.Add("Process 1 start is successful.");
            }

            await Task.Delay(8000);

            #endregion

            #region Process 2
            List <OPCWriteNode> OPCNodes30 = new List <OPCWriteNode>();

            OPCWriteNode onenodew30 = new OPCWriteNode();
            onenodew30.Name   = "ProcessStatus";
            onenodew30.NodeId = "ns=3;s=ProcessStatus";
            onenodew30.Value  = 2.0;
            OPCNodes30.Add(onenodew30);

            var resultw3 = await OPCUAClient.WriteValues(OPCNodes30);

            if (resultw3.Success == false)
            {
                MessageList.Items.Add("Process 2 start is not successful! " + resultw3.ErrorMessage);
            }
            else
            {
                MessageList.Items.Add("Process 2 start is successful.");
            }

            await Task.Delay(12000);

            #endregion

            #region Process 3
            List <OPCWriteNode> OPCNodes40 = new List <OPCWriteNode>();

            OPCWriteNode onenodew40 = new OPCWriteNode();
            onenodew40.Name   = "ProcessStatus";
            onenodew40.NodeId = "ns=3;s=ProcessStatus";
            onenodew40.Value  = 3.0;
            OPCNodes40.Add(onenodew40);

            var resultw4 = await OPCUAClient.WriteValues(OPCNodes40);

            if (resultw4.Success == false)
            {
                MessageList.Items.Add("Process 3 start is not successful! " + resultw4.ErrorMessage);
            }
            else
            {
                MessageList.Items.Add("Process 3 start is successful.");
            }

            await Task.Delay(6000);

            #endregion

            #region Process Completed
            List <OPCWriteNode> OPCNodesC = new List <OPCWriteNode>();
            Random rnd = new Random();

            OPCWriteNode onenodewc = new OPCWriteNode();
            onenodewc.Name   = "Run";
            onenodewc.NodeId = "ns=3;s=Run";
            onenodewc.Value  = 0.0; //false
            OPCNodesC.Add(onenodewc);

            OPCWriteNode onenodewc1 = new OPCWriteNode();
            onenodewc1.Name   = "Completed";
            onenodewc1.NodeId = "ns=3;s=Completed";
            onenodewc1.Value  = 1.0; //true
            OPCNodesC.Add(onenodewc1);

            double distance = Convert.ToDouble(rnd.Next(1, 100)) / 10;
            double torque   = Convert.ToDouble(rnd.Next(1, 100)) / 10;
            bool   error    = false;
            if (torque < TorqueMin.Value || torque > TorqueMax.Value || distance < DistanceMin.Value || distance > DistanceMax.Value)
            {
                MessageList.Items.Add("Product quality is not good! Distance: " + distance + " mm Torque: " + torque + " kN");
                error = true;
            }
            else
            {
                MessageList.Items.Add("Product quality is good. Distance: " + distance + " mm Torque: " + torque + " kN");
            }

            OPCWriteNode onenodewc2 = new OPCWriteNode();
            onenodewc2.Name   = "Error";
            onenodewc2.NodeId = "ns=3;s=Error";
            if (error == false)
            {
                onenodewc2.Value = 0.0; //false
            }
            else
            {
                onenodewc2.Value = 1.0; //true
            }
            OPCNodesC.Add(onenodewc2);

            OPCWriteNode onenodewc4 = new OPCWriteNode();
            onenodewc4.Name   = "ProcessStatus";
            onenodewc4.NodeId = "ns=3;s=ProcessStatus";
            onenodewc4.Value  = 0.0;
            OPCNodesC.Add(onenodewc4);

            OPCWriteNode onenodewc5 = new OPCWriteNode();
            onenodewc5.Name   = "Distance";
            onenodewc5.NodeId = "ns=3;s=Distance";
            onenodewc5.Value  = distance;
            OPCNodesC.Add(onenodewc5);

            OPCWriteNode onenodewc6 = new OPCWriteNode();
            onenodewc6.Name   = "Torque";
            onenodewc6.NodeId = "ns=3;s=Torque";
            onenodewc6.Value  = torque;
            OPCNodesC.Add(onenodewc6);

            var resultwc1 = await OPCUAClient.WriteValues(OPCNodesC);

            if (resultwc1.Success == false)
            {
                MessageList.Items.Add("Process completed is not successful! " + resultwc1.ErrorMessage);
            }
            else
            {
                MessageList.Items.Add("Process completed is successful.");
            }
            #endregion

            LoadingControl.IsLoading = false;
        }