Пример #1
0
        /// <summary>
        /// 写PLC数据,写入1个object数据
        /// </summary>
        /// <param name="msg">写入数据</param>
        /// <param name="itemNum">操作的Items,0-sendDB,1-sendflag,2-recvDB,3-recvflag,4-TV1alarm,5-TV1ResetAlarm,以此类推</param>
        /// <returns>true表示成功</returns>
        public override bool Write(object msg, int itemNum)
        {
            try
            {
                if (m_subscription == null || m_subscription.Items == null || itemNum >= m_subscription.Items.Count())
                {
                    return(false);
                }

                ItemValue[] itemvalues = new ItemValue[1];
                itemvalues[0]       = new ItemValue((Opc.ItemIdentifier)m_subscription.Items[itemNum]);
                itemvalues[0].Value = msg;

                Opc.IdentifiedResult[] idr = m_subscription.Write(itemvalues);
                if (idr != null && idr.Length > 0)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            catch (Exception ex)
            {
                CLOGException.Trace("函数CommunicationLib.COPCAccessTimer.Write 异常", CBaseMethods.MyBase.GetExceptionInfo(ex));
                return(false);
            }
        }
Пример #2
0
        /// <summary>
        /// 写数据
        /// </summary>
        /// <param name="opcDataItem"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public OpcResult Write(OpcDataItem opcDataItem, object value)
        {
            OpcResult opcResult = OpcResult.Unknow;

            //如果未连接那么返回
            if (!this.IsConnected)
            {
                if (!Equals(null, OnErrorHappened))
                {
                    OnErrorHappened(this, new OpcErrorEventArgs(OpcResult.E_FAIL, "Opc服务器未连接,请先连接再写数据项", null));
                }
                return(opcResult);
            }
            try
            {
                if (Equals(null, opcDataItem))
                {
                    throw new ArgumentNullException("opcDataItem参数不能为空。");
                }

                Opc.Da.Subscription tmpSubscription =
                    this.opcServer.Subscriptions.Cast <Opc.Da.Subscription>().FirstOrDefault(a => a.State.UpdateRate == opcDataItem.UpdateRate);
                var itemValue =
                    new ItemValue((ItemIdentifier)tmpSubscription.Items.FirstOrDefault(a => a.ItemName == opcDataItem.Name));
                //itemValue.Value = opcDataItem.NewValue;
                itemValue.Value = value;
                var results = tmpSubscription.Write(new ItemValue[] { itemValue });
                //写多次
                //for (int i = 0; i < 20; i++)
                //{
                results = tmpSubscription.Write(new ItemValue[] { itemValue });
                //}
                if (results.Count() < 1 && !Equals(null, OnErrorHappened))
                {
                    opcResult = OpcResult.E_UNKNOWN_ITEM_NAME;
                    OnErrorHappened(this, new OpcErrorEventArgs(opcResult, "写入数据项时发生错误,未找到数据项:" + opcDataItem.Name, null));
                    opcDataItem.Quality = OpcResult.Unknow;
                    return(opcResult);
                }
                foreach (var v in results)
                {
                    Enum.TryParse <OpcResult>(v.ResultID.ToString(), out opcResult);
                    if (v.ResultID != Opc.ResultID.S_OK && !Equals(null, OnErrorHappened))
                    {
                        Enum.TryParse <OpcResult>(v.ResultID.ToString(), out opcResult);
                        OnErrorHappened(this, new OpcErrorEventArgs(opcResult, "写入数据项时发生错误:" + v.ResultID.Name, null));
                    }
                }//end foreach
                return(opcResult);
            }
            catch (Exception ex)
            {
                if (!Equals(null, OnErrorHappened))
                {
                    OnErrorHappened(this, new OpcHelper.OpcErrorEventArgs(OpcResult.E_FAIL, "写入数据时错误。", ex));
                }
                return(opcResult);
            }
        }
Пример #3
0
        /// <summary>
        /// 同步方式向指定item名称的数据项写入内容
        /// </summary>
        /// <param name="writeItemDataDic">写入的数据项Dictionary</param>
        public void WriteSynchronization(Dictionary <string, object> writeItemDataDic)
        {
            List <ItemValue> itemValueList = new List <ItemValue>();

            foreach (string itemName in writeItemDataDic.Keys)
            {
                if (itemIndexDic.ContainsKey(itemName))
                {
                    ItemValue item = new ItemValue((ItemIdentifier)subscription.Items[itemIndexDic[itemName]]);
                    item.Value = writeItemDataDic[itemName];
                    itemValueList.Add(item);
                }
            }
            subscription.Write(itemValueList.ToArray());
        }
Пример #4
0
        /// <summary>
        /// 写入数据
        /// </summary>
        /// <param name="para">上位机需要发送的参数</param>
        /// <returns></returns>
        public bool Write(UpperPara para)
        {
            System.Type      t     = para.GetType();
            FieldInfo[]      infos = t.GetFields();
            List <ItemValue> items = new List <ItemValue>();

            foreach (FieldInfo info in infos)
            {
                ItemValue item = new ItemValue(subscription.Items.First(subItem => subItem.ItemName.EndsWith(info.Name)))
                {
                    Value = info.GetValue(para)
                };
                items.Add(item);
            }
            try
            {
                IdentifiedResult[] res = subscription.Write(items.ToArray());
                foreach (var re in res)
                {
                    if (!re.ResultID.Equals(Opc.ResultID.S_OK))
                    {
                        return(false);
                    }
                }
                return(true);
            }
            catch (Exception e)
            {
                return(false);
            }
        }
Пример #5
0
 private void EnableDataWriteCallback(Subscription group, ItemValue[] writeValues)
 {
     Opc.IRequest req;
     group.Write(writeValues, 44.0, new WriteCompleteEventHandler(WriteCompleteCallback), out req);
     group.State.Active = true;
     Console.WriteLine();
 }
Пример #6
0
        private void OperationWriteOPC()
        {
            /*
             * Opc.Da.Item[] OPC_ItemID = new Opc.Da.Item[3];
             * OPC_ItemID[0] = new Opc.Da.Item();
             * OPC_ItemID[0].ItemName = BrakePressTag_OPC + "HMI_Operation_One_PB.VALUE";
             * OPC_ItemID[1] = new Opc.Da.Item();
             * OPC_ItemID[1].ItemName = BrakePressTag_OPC + "HMI_Operation_Two_PB.VALUE";
             * OPC_ItemID[2] = new Opc.Da.Item();
             * OPC_ItemID[2].ItemName = BrakePressTag_OPC + "HMI_Operation_Three_PB.VALUE";
             * OPC_ItemID = OperationSelection_Write.AddItems(OPC_ItemID);
             */

            Opc.Da.Item[] OPC_ItemID = new Opc.Da.Item[3];
            OPC_ItemID[0]          = new Opc.Da.Item();
            OPC_ItemID[0].ItemName = BrakePressTag_OPC + "HMI_Operation_One_PB";
            OPC_ItemID[1]          = new Opc.Da.Item();
            OPC_ItemID[1].ItemName = BrakePressTag_OPC + "HMI_Operation_Two_PB";
            OPC_ItemID[2]          = new Opc.Da.Item();
            OPC_ItemID[2].ItemName = BrakePressTag_OPC + "HMI_Operation_Three_PB";
            OPC_ItemID             = OperationSelection_Write.AddItems(OPC_ItemID);

            Opc.Da.ItemValue[] ItemID_OPCValue = new Opc.Da.ItemValue[3];
            ItemID_OPCValue[0] = new Opc.Da.ItemValue();
            ItemID_OPCValue[1] = new Opc.Da.ItemValue();
            ItemID_OPCValue[2] = new Opc.Da.ItemValue();

            switch (SelectedOperation)
            {
            case 1:     // Operation #1
                ItemID_OPCValue[0].ServerHandle = OperationSelection_Write.Items[0].ServerHandle;
                ItemID_OPCValue[0].Value        = 1;
                ItemID_OPCValue[1].ServerHandle = OperationSelection_Write.Items[1].ServerHandle;
                ItemID_OPCValue[1].Value        = 0;
                ItemID_OPCValue[2].ServerHandle = OperationSelection_Write.Items[2].ServerHandle;
                ItemID_OPCValue[2].Value        = 0;
                break;

            case 2:     // Operation #2
                ItemID_OPCValue[0].ServerHandle = OperationSelection_Write.Items[0].ServerHandle;
                ItemID_OPCValue[0].Value        = 0;
                ItemID_OPCValue[1].ServerHandle = OperationSelection_Write.Items[1].ServerHandle;
                ItemID_OPCValue[1].Value        = 1;
                ItemID_OPCValue[2].ServerHandle = OperationSelection_Write.Items[2].ServerHandle;
                ItemID_OPCValue[2].Value        = 0;
                break;

            case 3:     // Operation #3
                ItemID_OPCValue[0].ServerHandle = OperationSelection_Write.Items[0].ServerHandle;
                ItemID_OPCValue[0].Value        = 0;
                ItemID_OPCValue[1].ServerHandle = OperationSelection_Write.Items[1].ServerHandle;
                ItemID_OPCValue[1].Value        = 0;
                ItemID_OPCValue[2].ServerHandle = OperationSelection_Write.Items[2].ServerHandle;
                ItemID_OPCValue[2].Value        = 1;
                break;
            }

            Opc.IRequest OPCRequest;
            OperationSelection_Write.Write(ItemID_OPCValue, 123, new Opc.Da.WriteCompleteEventHandler(WriteCompleteCallback), out OPCRequest);
        }
Пример #7
0
        private void WriteComponentThree_OPC()
        {
            Opc.Da.Item[] OPC_CompThreeWrite = new Opc.Da.Item[4];
            OPC_CompThreeWrite[0]          = new Opc.Da.Item();
            OPC_CompThreeWrite[0].ItemName = SpotWeld_Tag_Name + "HMI_Operation_One_PB";
            OPC_CompThreeWrite[1]          = new Opc.Da.Item();
            OPC_CompThreeWrite[1].ItemName = SpotWeld_Tag_Name + "HMI_Operation_Two_PB";
            OPC_CompThreeWrite[2]          = new Opc.Da.Item();
            OPC_CompThreeWrite[2].ItemName = SpotWeld_Tag_Name + "HMI_Operation_Three_PB";
            OPC_CompThreeWrite[3]          = new Opc.Da.Item();
            OPC_CompThreeWrite[3].ItemName = SpotWeld_Tag_Name + "HMI_Operation_Four_PB";
            OPC_CompThreeWrite             = GroupWriteCompThree.AddItems(OPC_CompThreeWrite);

            Opc.Da.ItemValue[] WriteCompThreeValue = new Opc.Da.ItemValue[4];
            WriteCompThreeValue[0] = new Opc.Da.ItemValue();
            WriteCompThreeValue[0].ServerHandle = GroupWriteCompThree.Items[0].ServerHandle;
            WriteCompThreeValue[0].Value        = 0;
            WriteCompThreeValue[1] = new Opc.Da.ItemValue();
            WriteCompThreeValue[1].ServerHandle = GroupWriteCompThree.Items[1].ServerHandle;
            WriteCompThreeValue[1].Value        = 0;
            WriteCompThreeValue[2] = new Opc.Da.ItemValue();
            WriteCompThreeValue[2].ServerHandle = GroupWriteCompThree.Items[2].ServerHandle;
            WriteCompThreeValue[2].Value        = 1;
            WriteCompThreeValue[3] = new Opc.Da.ItemValue();
            WriteCompThreeValue[3].ServerHandle = GroupWriteCompThree.Items[3].ServerHandle;
            WriteCompThreeValue[3].Value        = 0;

            Opc.IRequest req;
            GroupWriteCompThree.Write(WriteCompThreeValue, 123, new Opc.Da.WriteCompleteEventHandler(WriteCompleteCallback), out req);
        }
Пример #8
0
        public override bool WriteTag(TagId tag, string value)
        {
            try
            {
                groupWrite.RemoveItems(groupWrite.Items);
                List <Item>      writeList = new List <Item>();
                List <ItemValue> valueList = new List <ItemValue>();

                Item itemToWrite = new Item();
                itemToWrite.ItemName = tag.TagName;
                ItemValue itemValue = new ItemValue(itemToWrite);
                itemValue.Value = value;

                writeList.Add(itemToWrite);
                valueList.Add(itemValue);
                groupWrite.AddItems(writeList.ToArray());
                for (int i = 0; i < valueList.Count; i++)
                {
                    valueList[i].ServerHandle = groupWrite.Items[i].ServerHandle;
                }

                groupWrite.Write(valueList.ToArray());
                return(true);
            }
            catch (Exception ex)
            {
                logger.Logged("Error", "Не удалось записать значние OPC DA сервера {" + tag.TagName + "[" + value + "]}: {" + ex.Message + "}", "OpcDaPoller", "WriteTag");
                return(false);
            }
        }
Пример #9
0
        public void WriteData(string[] itemName, int[] value)
        {
            groupWrite.RemoveItems(groupWrite.Items);

            List <Item>      writeList = new List <Item>();
            List <ItemValue> valueList = new List <ItemValue>();

            for (int x = 0; x < itemName.Length; x++)
            {
                Item itemToWrite = new Item();
                itemToWrite.ItemName = itemName[x];
                ItemValue itemValue = new ItemValue(itemToWrite);
                itemValue.Value = value[x];
                writeList.Add(itemToWrite);
                valueList.Add(itemValue);
            }



            //IMPORTANT:
            //#1: assign the item to the group so the items gets a ServerHandle
            groupWrite.AddItems(writeList.ToArray());
            // #2: assign the server handle to the ItemValue
            for (int i = 0; i < valueList.Count; i++)
            {
                valueList[i].ServerHandle = groupWrite.Items[i].ServerHandle;
            }
            // #3: write
            groupWrite.Write(valueList.ToArray());
        }
Пример #10
0
 /// <summary>
 /// 写入一个int16字型数据
 /// </summary>
 /// <param name="data">待写入的字数据</param>
 /// <param name="itemNum">待写入项</param>
 /// <returns></returns>
 public bool Write(Int16 data, int itemNum)
 {
     try
     {
         ItemValue[] values = new ItemValue[1];
         values[0]       = new ItemValue((Opc.ItemIdentifier)subscription.Items[itemNum]);
         values[0].Value = data;
         Opc.IdentifiedResult[] idr = subscription.Write(values);
         if (idr != null && idr.Length > 0)
         {
             return(true);
         }
         else
         {
             return(false);
         }
     }
     catch (Exception ex)
     {
         throw new Exception("opc函数Write异常:" + ex.ToString());
     }
 }
        // Write The Component Value From Barcode Scanner
        private void ScanComponents_OPC()
        {
            Opc.Da.Item[] OPC_ScanComponent = new Opc.Da.Item[1];
            OPC_ScanComponent[0]          = new Opc.Da.Item();
            OPC_ScanComponent[0].ItemName = Spotweld_Tag_Name + "DM8050_READ_RESULTS.DATA";
            OPC_ScanComponent             = ScanNewPart_Write.AddItems(OPC_ScanComponent);

            Opc.Da.ItemValue[] OPC_ScanComponent_Value = new Opc.Da.ItemValue[1];
            OPC_ScanComponent_Value[0] = new Opc.Da.ItemValue();
            OPC_ScanComponent_Value[0].ServerHandle = ScanNewPart_Write.Items[0].ServerHandle;
            OPC_ScanComponent_Value[0].Value        = ScannerString;
            Opc.IRequest OPCRequest;
            ScanNewPart_Write.Write(OPC_ScanComponent_Value, 123, new Opc.Da.WriteCompleteEventHandler(WriteCompleteCallback), out OPCRequest);
        }
Пример #12
0
 /// <summary>
 /// OPC同步写一个数据
 /// </summary>
 /// <param name="opcitem">地址Name</param>
 /// <param name="WriteVaule">待写的地址Value</param>
 /// <returns>是否写成功</returns>
 public bool SynWriteOpcItem(string itemName, string writeValue)
 {
     try
     {
         ItemValue[] itemvalues = new ItemValue[1];
         foreach (var item in OpcGroupClasssubscription.Items)
         {
             if (itemName == item.ItemName)
             {
                 itemvalues[0]       = new ItemValue((ItemIdentifier)item);
                 itemvalues[0].Value = writeValue;
                 break;
             }
         }
         OpcGroupClasssubscription.Write(itemvalues);
         return(true);
     }
     catch (Exception ex)
     {
         //ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
         //log.Fatal("写心跳信号失败!", ex);
         return(false);
     }
 }
        // Turn off Reset Input
        private void ConfirmWeldReset_Off_OPC()
        {
            Opc.Da.Item[] OPC_Reset_Off = new Opc.Da.Item[1];
            OPC_Reset_Off[0]          = new Opc.Da.Item();
            OPC_Reset_Off[0].ItemName = SpotWeld_Tag_Name + "HMI_PB_Reset_Part_Weld_Count";
            OPC_Reset_Off             = ResetWeldCount_Off_Write.AddItems(OPC_Reset_Off);

            Opc.Da.ItemValue[] OPC_ResetValue_Off = new Opc.Da.ItemValue[1];
            OPC_ResetValue_Off[0] = new Opc.Da.ItemValue();
            OPC_ResetValue_Off[0].ServerHandle = ResetWeldCount_Write.Items[0].ServerHandle;
            OPC_ResetValue_Off[0].Value        = 0;

            Opc.IRequest OPCRequest;
            ResetWeldCount_Off_Write.Write(OPC_ResetValue_Off, 123, new Opc.Da.WriteCompleteEventHandler(WriteCompleteCallback), out OPCRequest);
        }
        // Turn on Reset Input
        private void ConfirmWeldReset_On_OPC(object sender, EventArgs e)
        {
            Opc.Da.Item[] OPC_Reset_On = new Opc.Da.Item[1];
            OPC_Reset_On[0]          = new Opc.Da.Item();
            OPC_Reset_On[0].ItemName = SpotWeld_Tag_Name + "HMI_PB_Reset_Part_Weld_Count";
            OPC_Reset_On             = ResetWeldCount_Write.AddItems(OPC_Reset_On);

            Opc.Da.ItemValue[] OPC_ResetValue_On = new Opc.Da.ItemValue[1];
            OPC_ResetValue_On[0] = new Opc.Da.ItemValue();
            OPC_ResetValue_On[0].ServerHandle = ResetWeldCount_Write.Items[0].ServerHandle;
            OPC_ResetValue_On[0].Value        = 1;
            Opc.IRequest OPCRequest;
            ResetWeldCount_Write.Write(OPC_ResetValue_On, 123, new Opc.Da.WriteCompleteEventHandler(WriteCompleteCallback), out OPCRequest);
            //ResetOff_Timer.Start(); // Start a Timer to turn off Input
        }
Пример #15
0
        /*********************************************************************************************************************
        *
        * Buttons Region End
        *
        *********************************************************************************************************************/
        #endregion

        /********************************************************************************************************************
        *
        *  OPC Region Start
        *  -- Total:
        *
        ********************************************************************************************************************/
        #region

        // Write Both On and Off Using OPC_TeachSensorValue
        private void TeachSensor_OPC()
        {
            Opc.Da.Item[] OPC_SensorWrite = new Opc.Da.Item[1];
            OPC_SensorWrite[0]          = new Opc.Da.Item();
            OPC_SensorWrite[0].ItemName = SpotWeld_Tag_Name + "HMI_PB_TEACH_SENSOR";
            OPC_WriteSensor.Add(OPC_SensorWrite[0]);
            TeachSensor_Write.AddItems(OPC_WriteSensor.ToArray());

            Opc.Da.ItemValue[] WriteValue = new Opc.Da.ItemValue[1];
            WriteValue[0] = new Opc.Da.ItemValue();
            WriteValue[0].ServerHandle = TeachSensor_Write.Items[0].ServerHandle;
            WriteValue[0].Value        = OPC_TeachSensorValue;

            Opc.IRequest req;
            TeachSensor_Write.Write(WriteValue, 123, new Opc.Da.WriteCompleteEventHandler(WriteCompleteCallback), out req);
        }
Пример #16
0
 /// <summary>
 /// Synchronize write to the OPC Server
 /// </summary>
 public bool SyncWrite(ref ItemValue[] items)
 {
     if (Subscription == null)
     {
         return(false);
     }
     try
     {
         var results = Subscription.Write(items);
         return(true);
     }
     catch (Exception e)
     {
         //MessageBox.Show(e.Message);
         throw e;
     }
 }
        // Turn off Scan New Part Input
        // Toggle Scan Hardware Input
        private void SetHardware_OPC()
        {
            Opc.Da.Item[] OPC_SetHardware = new Opc.Da.Item[2];
            OPC_SetHardware[0]          = new Opc.Da.Item();
            OPC_SetHardware[0].ItemName = Spotweld_Tag_Name + "HMI_PB_SCAN_NEW_PART";
            OPC_SetHardware[1]          = new Opc.Da.Item();
            OPC_SetHardware[1].ItemName = Spotweld_Tag_Name + "HMI_PB_SCAN_HARDWARE";
            OPC_SetHardware             = Hardware_Write.AddItems(OPC_SetHardware);

            Opc.Da.ItemValue[] OPC_SetHardware_Value = new Opc.Da.ItemValue[2];
            OPC_SetHardware_Value[0] = new Opc.Da.ItemValue();
            OPC_SetHardware_Value[0].ServerHandle = Hardware_Write.Items[0].ServerHandle;
            OPC_SetHardware_Value[0].Value        = 0;
            OPC_SetHardware_Value[1] = new Opc.Da.ItemValue();
            OPC_SetHardware_Value[1].ServerHandle = Hardware_Write.Items[1].ServerHandle;
            OPC_SetHardware_Value[1].Value        = HMI_PB_SCAN_HARDWARE_VALUE;
            Opc.IRequest OPCRequest;
            Hardware_Write.Write(OPC_SetHardware_Value, 123, new Opc.Da.WriteCompleteEventHandler(WriteCompleteCallback), out OPCRequest);
        }
Пример #18
0
        public void Work()
        {
            int i = 5;

            if (i == 1)
            {
                url    = new Opc.URL("opcda://192.168.0.4/OPC.PHDServerDA.1");
                server = new Opc.Da.Server(fact, null);
                server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

                Opc.Da.Item[] itemCollection = new Opc.Da.Item[1];
                itemCollection[0] = new Opc.Da.Item {
                    ItemName = "RTOS.TEST.PV", MaxAge = -1
                };
                Opc.Da.ItemValueResult[] result = server.Read(itemCollection);

                Console.WriteLine(result[0].Value);
                server.Disconnect();
            }
            else if (i == 2)
            {
                url    = new Opc.URL("opcda://192.168.0.4/OPC.PHDServerDA.1");
                server = new Opc.Da.Server(fact, null);
                server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

                groupState              = new Opc.Da.SubscriptionState();
                groupState.Name         = "Group";
                groupState.ServerHandle = null;
                groupState.ClientHandle = Guid.NewGuid().ToString();
                groupState.Active       = true;
                groupState.UpdateRate   = 1000;
                groupState.Deadband     = 0;
                groupState.Locale       = null;

                groupRead = (Opc.Da.Subscription)server.CreateSubscription(groupState);


                string[] itemName = { "RTOS.TEST.PV", "RTOR.TI1237.DACA.PV" };

                Opc.Da.Item[] items = new Opc.Da.Item[2];

                for (int j = 0; j < items.Length; j++)
                {
                    items[j] = new Opc.Da.Item();
                    items[j].ClientHandle = Guid.NewGuid().ToString();
                    items[j].ItemPath     = null;
                    items[j].ItemName     = itemName[j];
                }

                groupRead.AddItems(items);
                //groupRead.DataChanged += new Opc.Da.DataChangedEventHandler(group_DataChanged);

                Opc.Da.ItemValueResult[] results = groupRead.Read(groupRead.Items);
                foreach (ItemValueResult result in results)
                {
                    Console.WriteLine("{0},{1},{2},{3}", result.ItemName, result.Value, result.Quality, result.Timestamp);
                }
                //groupRead.DataChanged -= new Opc.Da.DataChangedEventHandler(group_DataChanged);

                groupRead.RemoveItems(groupRead.Items);
                server.CancelSubscription(groupRead);
                groupRead.Dispose();
                server.Disconnect();
            }
            else if (i == 3)
            {
                url    = new Opc.URL("opcda://192.168.0.4/OPC.PHDServerDA.1");
                server = new Opc.Da.Server(fact, null);
                server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

                groupState              = new Opc.Da.SubscriptionState();
                groupState.Name         = "Group";
                groupState.ServerHandle = null;
                groupState.ClientHandle = Guid.NewGuid().ToString();
                groupState.Active       = true;
                groupState.UpdateRate   = 1000;
                groupState.Deadband     = 0;
                groupState.Locale       = null;

                groupWrite = (Opc.Da.Subscription)server.CreateSubscription(groupState);

                string[] itemName = { "RTOS.TEST.PV", "RTOS.TEST2.PV" };

                Opc.Da.Item[] items = new Opc.Da.Item[2];

                for (int j = 0; j < items.Length; j++)
                {
                    items[j] = new Opc.Da.Item();
                    items[j].ClientHandle = Guid.NewGuid().ToString();
                    items[j].ItemPath     = null;
                    items[j].ItemName     = itemName[j];
                }

                groupWrite.AddItems(items);

                //groupRead.DataChanged += new Opc.Da.DataChangedEventHandler(group_DataChanged);

                Opc.Da.ItemValue[] writeValues = new Opc.Da.ItemValue[groupWrite.Items.Length];
                for (int k = 0; k < groupWrite.Items.Length; k++)
                {
                    writeValues[k] = new Opc.Da.ItemValue((ItemIdentifier)groupWrite.Items[k]);
                }

                writeValues[0].Value = 5;
                writeValues[1].Value = 6;

                groupWrite.Write(writeValues);

                Console.WriteLine("Press any key to close...");
                Console.ReadLine();

                //groupRead.DataChanged -= new Opc.Da.DataChangedEventHandler(group_DataChanged);

                groupWrite.RemoveItems(groupWrite.Items);
                server.CancelSubscription(groupWrite);
                groupWrite.Dispose();
                server.Disconnect();
            }
            else if (i == 4)
            {
                url       = new Opc.URL("opchda://192.168.0.4/OPC.PHDServerHDA.1");
                serverHda = new Opc.Hda.Server(fact, null);
                serverHda.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

                try
                {
                }
                catch (Opc.ConnectFailedException opcConnEx)
                {
                    Console.WriteLine(string.Format("Could not connect to server {0}", "OPC.PHDServerHDA.1"));
                    Console.WriteLine(opcConnEx.ToString());
                }

                Console.WriteLine("Are we connected? " + serverHda.IsConnected);

                string[] itemName = { "RTOS.TEST.PV", "RTOS.TEST2.PV" };

                Opc.Hda.Trend groupHda = new Trend(serverHda);

                groupHda.Name        = "HDA";
                groupHda.AggregateID = AggregateID.NOAGGREGATE;
                DateTime startTime = DateTime.Now.AddHours(-1);
                DateTime endTime   = DateTime.Now;
                groupHda.StartTime     = new Opc.Hda.Time(startTime);
                groupHda.EndTime       = new Opc.Hda.Time(endTime);
                groupHda.MaxValues     = 0;
                groupHda.IncludeBounds = false;

                serverHda.Trends.Add(groupHda);

                Opc.Hda.Item[] items = new Opc.Hda.Item[2];
                for (int m = 0; m < 2; m++)
                {
                    items[m]              = new Opc.Hda.Item();
                    items[m].ItemName     = itemName[m];
                    items[m].ItemPath     = null;
                    items[m].ClientHandle = Guid.NewGuid().ToString();
                }

                IdentifiedResult[] identifiedResult = serverHda.CreateItems(items);

                if (identifiedResult != null)
                {
                    foreach (IdentifiedResult item in identifiedResult)
                    {
                        if (item.ResultID.Succeeded())
                        {
                            groupHda.Items.Add(new Opc.Hda.Item(item));
                        }
                    }
                }

                Opc.Hda.ItemValueCollection[] results = groupHda.ReadRaw();

                Opc.Hda.ItemValueCollection result1 = results[0];

                foreach (Opc.Hda.ItemValue result in result1)
                {
                    Console.WriteLine("{0},{1},{2}", result.Value, result.Quality, result.Timestamp);
                }

                serverHda.Disconnect();
            }
            else if (i == 5)
            {
                url       = new Opc.URL("opchda://192.168.0.4/OPC.PHDServerHDA.1");
                serverHda = new Opc.Hda.Server(fact, null);
                serverHda.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

                try
                {
                }
                catch (Opc.ConnectFailedException opcConnEx)
                {
                    Console.WriteLine(string.Format("Could not connect to server {0}", "OPC.PHDServerHDA.1"));
                    Console.WriteLine(opcConnEx.ToString());
                }

                Console.WriteLine("Are we connected? " + serverHda.IsConnected);

                string[] itemName = { "RTOR.TI1237.DACA.PV", "RTOS.TEST2.PV" };

                Opc.Hda.Trend groupHda = new Trend(serverHda);

                groupHda.Name        = "HDA";
                groupHda.AggregateID = AggregateID.AVERAGE;

                DateTime startTime = DateTime.Now.AddHours(-1);
                DateTime endTime   = DateTime.Now;
                //TimeSpan span = endTime.Subtract(startTime);
                //int calcInterval = ((int)span.TotalSeconds);
                //groupHda.ResampleInterval = (decimal)calcInterval;

                //DateTime startTime = new DateTime(2020, 6, 12, 9, 0, 0, 0);
                //DateTime endTime = new DateTime(2020, 6, 12, 10, 0, 0, 0);
                int calcInterval = 300;
                groupHda.ResampleInterval = (decimal)calcInterval;


                groupHda.StartTime     = new Opc.Hda.Time(startTime);
                groupHda.EndTime       = new Opc.Hda.Time(endTime);
                groupHda.MaxValues     = 0;
                groupHda.IncludeBounds = false;

                serverHda.Trends.Add(groupHda);

                Opc.Hda.Item[] items = new Opc.Hda.Item[2];
                for (int m = 0; m < 2; m++)
                {
                    items[m]              = new Opc.Hda.Item();
                    items[m].ItemName     = itemName[m];
                    items[m].ItemPath     = null;
                    items[m].ClientHandle = Guid.NewGuid().ToString();
                }

                IdentifiedResult[] identifiedResult = serverHda.CreateItems(items);

                if (identifiedResult != null)
                {
                    foreach (IdentifiedResult item in identifiedResult)
                    {
                        if (item.ResultID.Succeeded())
                        {
                            groupHda.Items.Add(new Opc.Hda.Item(item));
                        }
                    }
                }

                Opc.Hda.ItemValueCollection[] results = groupHda.ReadProcessed();

                Opc.Hda.ItemValueCollection result1 = results[0];

                foreach (Opc.Hda.ItemValue result in result1)
                {
                    Console.WriteLine("{0},{1},{2}", result.Value, result.Quality, result.Timestamp);
                }

                serverHda.Disconnect();
            }
        }
        // Write the Selected Operation Value to the PLC
        private void OperationWriteOPC()
        {
            Opc.Da.Item[] OPC_ItemID = new Opc.Da.Item[8];
            OPC_ItemID[0]          = new Opc.Da.Item();
            OPC_ItemID[0].ItemName = SpotWeld_Tag_Name + "HMI_Operation_One_PB";
            OPC_ItemID[1]          = new Opc.Da.Item();
            OPC_ItemID[1].ItemName = SpotWeld_Tag_Name + "HMI_Operation_Two_PB";
            OPC_ItemID[2]          = new Opc.Da.Item();
            OPC_ItemID[2].ItemName = SpotWeld_Tag_Name + "HMI_Operation_Three_PB";
            OPC_ItemID[3]          = new Opc.Da.Item();
            OPC_ItemID[3].ItemName = SpotWeld_Tag_Name + "HMI_Operation_Four_PB";

            OPC_ItemID[4]          = new Opc.Da.Item();
            OPC_ItemID[4].ItemName = SpotWeld_Tag_Name + "HMI_Operation_One_Selected";
            OPC_ItemID[5]          = new Opc.Da.Item();
            OPC_ItemID[5].ItemName = SpotWeld_Tag_Name + "HMI_Operation_Two_Selected";
            OPC_ItemID[6]          = new Opc.Da.Item();
            OPC_ItemID[6].ItemName = SpotWeld_Tag_Name + "HMI_Operation_Three_Selected";
            OPC_ItemID[7]          = new Opc.Da.Item();
            OPC_ItemID[7].ItemName = SpotWeld_Tag_Name + "HMI_Operation_Four_Selected";
            OPC_ItemID             = OperationSelection_Write.AddItems(OPC_ItemID);

            Opc.Da.ItemValue[] ItemID_OPCValue = new Opc.Da.ItemValue[8];
            ItemID_OPCValue[0] = new Opc.Da.ItemValue();
            ItemID_OPCValue[1] = new Opc.Da.ItemValue();
            ItemID_OPCValue[2] = new Opc.Da.ItemValue();
            ItemID_OPCValue[3] = new Opc.Da.ItemValue();
            ItemID_OPCValue[4] = new Opc.Da.ItemValue();
            ItemID_OPCValue[5] = new Opc.Da.ItemValue();
            ItemID_OPCValue[6] = new Opc.Da.ItemValue();
            ItemID_OPCValue[7] = new Opc.Da.ItemValue();

            // switch the values written based on which operation was selected
            switch (SelectedOperation)
            {
            case 1:     // Operation #1
                ItemID_OPCValue[0].ServerHandle = OperationSelection_Write.Items[0].ServerHandle;
                ItemID_OPCValue[0].Value        = 1;
                ItemID_OPCValue[1].ServerHandle = OperationSelection_Write.Items[1].ServerHandle;
                ItemID_OPCValue[1].Value        = 0;
                ItemID_OPCValue[2].ServerHandle = OperationSelection_Write.Items[2].ServerHandle;
                ItemID_OPCValue[2].Value        = 0;
                ItemID_OPCValue[3].ServerHandle = OperationSelection_Write.Items[3].ServerHandle;
                ItemID_OPCValue[3].Value        = 0;

                ItemID_OPCValue[4].ServerHandle = OperationSelection_Write.Items[4].ServerHandle;
                ItemID_OPCValue[4].Value        = 1;
                ItemID_OPCValue[5].ServerHandle = OperationSelection_Write.Items[5].ServerHandle;
                ItemID_OPCValue[5].Value        = 0;
                ItemID_OPCValue[6].ServerHandle = OperationSelection_Write.Items[6].ServerHandle;
                ItemID_OPCValue[6].Value        = 0;
                ItemID_OPCValue[7].ServerHandle = OperationSelection_Write.Items[7].ServerHandle;
                ItemID_OPCValue[7].Value        = 0;
                break;

            case 2:     // Operation #2
                ItemID_OPCValue[0].ServerHandle = OperationSelection_Write.Items[0].ServerHandle;
                ItemID_OPCValue[0].Value        = 0;
                ItemID_OPCValue[1].ServerHandle = OperationSelection_Write.Items[1].ServerHandle;
                ItemID_OPCValue[1].Value        = 1;
                ItemID_OPCValue[2].ServerHandle = OperationSelection_Write.Items[2].ServerHandle;
                ItemID_OPCValue[2].Value        = 0;
                ItemID_OPCValue[3].ServerHandle = OperationSelection_Write.Items[3].ServerHandle;
                ItemID_OPCValue[3].Value        = 0;

                ItemID_OPCValue[4].ServerHandle = OperationSelection_Write.Items[4].ServerHandle;
                ItemID_OPCValue[4].Value        = 0;
                ItemID_OPCValue[5].ServerHandle = OperationSelection_Write.Items[5].ServerHandle;
                ItemID_OPCValue[5].Value        = 1;
                ItemID_OPCValue[6].ServerHandle = OperationSelection_Write.Items[6].ServerHandle;
                ItemID_OPCValue[6].Value        = 0;
                ItemID_OPCValue[7].ServerHandle = OperationSelection_Write.Items[7].ServerHandle;
                ItemID_OPCValue[7].Value        = 0;
                break;

            case 3:     // Operation #3
                ItemID_OPCValue[0].ServerHandle = OperationSelection_Write.Items[0].ServerHandle;
                ItemID_OPCValue[0].Value        = 0;
                ItemID_OPCValue[1].ServerHandle = OperationSelection_Write.Items[1].ServerHandle;
                ItemID_OPCValue[1].Value        = 0;
                ItemID_OPCValue[2].ServerHandle = OperationSelection_Write.Items[2].ServerHandle;
                ItemID_OPCValue[2].Value        = 1;
                ItemID_OPCValue[3].ServerHandle = OperationSelection_Write.Items[3].ServerHandle;
                ItemID_OPCValue[3].Value        = 0;

                ItemID_OPCValue[4].ServerHandle = OperationSelection_Write.Items[4].ServerHandle;
                ItemID_OPCValue[4].Value        = 0;
                ItemID_OPCValue[5].ServerHandle = OperationSelection_Write.Items[5].ServerHandle;
                ItemID_OPCValue[5].Value        = 0;
                ItemID_OPCValue[6].ServerHandle = OperationSelection_Write.Items[6].ServerHandle;
                ItemID_OPCValue[6].Value        = 1;
                ItemID_OPCValue[7].ServerHandle = OperationSelection_Write.Items[7].ServerHandle;
                ItemID_OPCValue[7].Value        = 0;
                break;

            case 4:     // Operation #4
                ItemID_OPCValue[0].ServerHandle = OperationSelection_Write.Items[0].ServerHandle;
                ItemID_OPCValue[0].Value        = 0;
                ItemID_OPCValue[1].ServerHandle = OperationSelection_Write.Items[1].ServerHandle;
                ItemID_OPCValue[1].Value        = 0;
                ItemID_OPCValue[2].ServerHandle = OperationSelection_Write.Items[2].ServerHandle;
                ItemID_OPCValue[2].Value        = 0;
                ItemID_OPCValue[3].ServerHandle = OperationSelection_Write.Items[3].ServerHandle;
                ItemID_OPCValue[3].Value        = 1;

                ItemID_OPCValue[4].ServerHandle = OperationSelection_Write.Items[4].ServerHandle;
                ItemID_OPCValue[4].Value        = 0;
                ItemID_OPCValue[5].ServerHandle = OperationSelection_Write.Items[5].ServerHandle;
                ItemID_OPCValue[5].Value        = 0;
                ItemID_OPCValue[6].ServerHandle = OperationSelection_Write.Items[6].ServerHandle;
                ItemID_OPCValue[6].Value        = 0;
                ItemID_OPCValue[7].ServerHandle = OperationSelection_Write.Items[7].ServerHandle;
                ItemID_OPCValue[7].Value        = 1;
                break;
            }
            Opc.IRequest OPCRequest;
            OperationSelection_Write.Write(ItemID_OPCValue, 123, new Opc.Da.WriteCompleteEventHandler(WriteCompleteCallback), out OPCRequest);
        }