Exemplo n.º 1
1
 /// <summary>
 /// 选择列表项时处理的事情
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
 {
     try
     {
         if (itmHandleClient != 0)
         {
             this.txtTagValue.Text   = "";
             this.txtQualities.Text  = "";
             this.txtTimeStamps.Text = "";
             this.txtDataType.Text   = "";
             int     sd = KepItems.Count;
             Array   Errors;
             OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);
             //注:OPC中以1为数组的基数
             int[] temp = new int[2] {
                 0, bItem.ServerHandle
             };
             Array serverHandle = (Array)temp;
             //移除上一次选择的项
             KepItems.Remove(KepItems.Count, ref serverHandle, out Errors);
         }
         itmHandleClient = 0;
         //for (int i = 0; i < 5; i++)
         //{
         //    KepItem = KepItems.AddItem(listBox1.Items[i].ToString(), itmHandleClient);
         //    itmHandleClient += 1;
         //}
         //KepItem = KepItems.AddItem(listBoxItems.SelectedItem.ToString(), itmHandleClient);
         KepItem = KepItems.AddItem("Channel_0_User_Defined.User.User1", itmHandleClient);
         KepItems.AddItem("Channel_0_User_Defined.User.User2", 1235);
         //数据类型
         txtDataType.Text = Enum.GetName(typeof(CanonicalDataTypes), KepItem.CanonicalDataType);
         itmHandleServer  = KepItem.ServerHandle;
     }
     catch (Exception err)
     {
         //没有任何权限的项,都是OPC服务器保留的系统项,此处可不做处理。
         itmHandleClient    = 0;
         txtTagValue.Text   = "Error ox";
         txtQualities.Text  = "Error ox";
         txtTimeStamps.Text = "Error ox";
         MessageBox.Show("此项为系统保留项:" + err.Message, "提示信息");
     }
 }
Exemplo n.º 2
0
        /// <summary>
        /// 异步写
        /// </summary>
        /// <param name="writeItemNames"></param>
        /// <param name="writeItemValues"></param>
        public void AsyncWrite(string[] writeItemNames, string[] writeItemValues)
        {
            OPCItem[] bItem = new OPCItem[writeItemNames.Length];
            for (int i = 0; i < writeItemNames.Length; i++)
            {
                for (int j = 0; j < itemNames.Count; j++)
                {
                    if (itemNames[j] == writeItemNames[i])
                    {
                        bItem[i] = opcItems.GetOPCItem(itemHandleServer[j]);
                        break;
                    }
                }
            }
            int[] temp = new int[writeItemNames.Length + 1];
            temp[0] = 0;
            for (int i = 1; i < writeItemNames.Length + 1; i++)
            {
                temp[i] = bItem[i - 1].ServerHandle;
            }
            Array serverHandles = (Array)temp;

            object[] valueTemp = new object[writeItemNames.Length + 1];
            valueTemp[0] = "";
            for (int i = 1; i < writeItemNames.Length + 1; i++)
            {
                valueTemp[i] = writeItemValues[i - 1];
            }
            Array values = (Array)valueTemp;
            Array Errors;
            int   cancelID;

            opcGroup.AsyncWrite(writeItemNames.Length, ref serverHandles, ref values, out Errors, 2009, out cancelID);
            GC.Collect();
        }
Exemplo n.º 3
0
        /// <summary>
        /// 选择列表项时处理的事情
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (itmHandleClient != 0)
                {
                    this.txtTagValue.Text   = "";
                    this.txtQualities.Text  = "";
                    this.txtTimeStamps.Text = "";

                    Array   Errors;
                    OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);
                    //注:OPC中以1为数组的基数
                    int[] temp = new int[2] {
                        0, bItem.ServerHandle
                    };
                    Array serverHandle = (Array)temp;
                    //移除上一次选择的项
                    KepItems.Remove(KepItems.Count, ref serverHandle, out Errors);
                }
                itmHandleClient = 1234;
                KepItem         = KepItems.AddItem(listBox1.SelectedItem.ToString(), itmHandleClient);
                itmHandleServer = KepItem.ServerHandle;
            }
            catch (Exception err)
            {
                //没有任何权限的项,都是OPC服务器保留的系统项,此处可不做处理。
                itmHandleClient    = 0;
                txtTagValue.Text   = "Error ox";
                txtQualities.Text  = "Error ox";
                txtTimeStamps.Text = "Error ox";
                MessageBox.Show("此项为系统保留项:" + err.Message, "提示信息");
            }
        }
Exemplo n.º 4
0
 private static void GetTagValue(string tagName)
 {
     try
     {
         readValue = "";
         if (itmHandleClient != 0)
         {
             Array   Errors;
             OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);
             //注:OPC中以1为数组的基数
             int[] temp = new int[2] {
                 0, bItem.ServerHandle
             };
             Array serverHandle = (Array)temp;
             //移除上一次选择的项
             KepItems.Remove(KepItems.Count, ref serverHandle, out Errors);
         }
         itmHandleClient = 12345;
         KepItem         = KepItems.AddItem(tagName, itmHandleClient);
         itmHandleServer = KepItem.ServerHandle;
     }
     catch (Exception err)
     {
         //没有任何权限的项,都是OPC服务器保留的系统项,此处可不做处理。
         itmHandleClient = 0;
         Console.WriteLine("Read value error:" + err.Message);
     }
 }
Exemplo n.º 5
0
        private void btnWriteDb_Click(object sender, EventArgs e)
        {
            if (listboxAlias.SelectedIndex < 0)
            {
                MessageBox.Show("未选中变量!", "提示信息");
            }
            else
            {
                try
                {
                    //注意array在函数内部做参数时,数据下标是从1开始的所以要考虑将第0位空出来,n个Item,就要定义n+1列数组,添加一个0,但在函数使用时,又是从左开始读取的。(针对opc)
                    //否则会报错
                    OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);
                    int[]   temp  = new int[2] {
                        0, bItem.ServerHandle
                    };
                    Array  serverHandles = (Array)temp;
                    Array  values;
                    Array  Errors;
                    object qualities;
                    object timeStamps;
                    KepGroup.SyncRead(1, 1, ref serverHandles, out values, out Errors, out qualities, out timeStamps);

                    bool   result   = (Errors.GetValue(1).ToString() == "0") ? true : false;
                    object tagValue = values.GetValue(1);

                    if (result)
                    {
                        int addResult = TagDataOper.Add(new TagData()
                        {
                            ServerName = txtServerName.Text,
                            AliasName  = listboxAlias.SelectedItem.ToString(),
                            TagValue   = tagValue.ToString()
                        });
                        if (addResult == 1)
                        {
                            MessageBox.Show("入库成功!", "提示信息");
                        }
                        else
                        {
                            MessageBox.Show("入库失败!", "提示信息");
                        }
                    }
                    GC.Collect();
                }
                catch (Exception err)
                {
                }
            }
        }
Exemplo n.º 6
0
 public void WriteTagValue(string TagName, string TagValue)
 {
     foreach (TIRAPOPCTagItem tagItem in tags)
     {
         if (tagItem.TagName == TagName)
         {
             OPCItem item = kepItems.GetOPCItem(tagItem.ServerHandle);
             if (item != null)
             {
                 item.Write(TagValue);
             }
             break;
         }
     }
 }
Exemplo n.º 7
0
        void Read(string u1, int u2)                                            //读方法
        {
            _kepItem         = _kepItems.AddItem(u1, u2);
            _itmHandleServer = _kepItem.ServerHandle;
            //OPCItem bItem = _kepItems.GetOPCItem(_itmHandleServer);
            var bItem = _kepItems.GetOPCItem(_itmHandleServer);
            var temp  = new[] { 0, bItem.ServerHandle };
            //Array serverHandles = (Array)temp;
            var   serverHandles = (Array)temp;
            Array errors;
            int   cancelId;

            _kepGroup.AsyncRead(1, ref serverHandles, out errors, 2009, out cancelId);
            GC.Collect();
        }
Exemplo n.º 8
0
        //发送异步写数据指令
        private void button3_Click(object sender, EventArgs e)
        {
            Array AsyncValue_Wt;
            Array SerHandles;

            object[] tmpWtData   = new object[5];//写入的数据必须是object型的,否则会报错
            int[]    tmpSerHdles = new int[5];
            //将输入数据赋给数组,然后再转成Array型送给AsyncValue_Wt
            tmpWtData[1]  = (object)this.textBox1.Text.Trim();
            tmpWtData[2]  = (object)this.textBox2.Text.Trim();
            tmpWtData[3]  = (object)this.textBox2.Text.Trim();
            tmpWtData[4]  = (object)this.textBox1.Text.Trim();
            AsyncValue_Wt = (Array)tmpWtData;
            //将输入数据送给的Item对应服务器句柄赋给数组,然后再转成Array型送给SerHandles
            tmpSerHdles[1] = Convert.ToInt32(lserverhandles.GetValue(1));
            tmpSerHdles[2] = Convert.ToInt32(lserverhandles.GetValue(2));
            tmpSerHdles[3] = Convert.ToInt32(lserverhandles.GetValue(5));
            tmpSerHdles[4] = Convert.ToInt32(lserverhandles.GetValue(4));
            SerHandles     = (Array)tmpSerHdles;
            objGroup.AsyncWrite(4, ref SerHandles, ref AsyncValue_Wt, out lErrors_Wt, lTransID_Wt, out lCancelID_Wt);


            //用objChangeItem[1].Write用这句可也以写入数据,但并不触发写入事件。
            objChangeItem[1] = objItems.GetOPCItem(Convert.ToInt32(lserverhandles.GetValue(1)));
            //objChangeItem[1].Write(102);
        }
Exemplo n.º 9
0
        /// <summary>
        /// 为item指定字符串类型的值
        /// </summary>
        /// <param name="block">ITEM名称</param>
        /// <param name="value">指定的值</param>
        public bool SetValue(string block, string value)
        {
            // 获取要更新的item
            OPCItem bItem = null;

            try
            {
                bItem = _items.GetOPCItem(_itemServerHandles[block]);
            }
            catch (Exception ex)
            {
                log.Error("获取opcitem " + block + "出错: " + ex.Message);
            }

            // 检查item的连接品质
            if (bItem.Quality != (int)OPCQualities.Good)
            {
                log.Warn("地址块 " + block + " 的连接品质为 " + ((OPCQualities)bItem.Quality).ToString() + " 更新可能无法写入");
                OnBadBlockDetected(block, bItem.Quality);
            }

            // 3次尝试更新item
            int writeCount = 0;

            do
            {
                try
                {
                    bItem.Write(value);
                }
                catch (Exception ex)
                {
                    log.Error("将值" + value + " 写入 " + block + " 时出错:" + ex.Message);
                    return(false);
                }
                writeCount += 1;
                log.Debug("正在尝试第 " + writeCount + " 次写入opc " + block);
            } while ((string)bItem.Value != value && writeCount < _writeCount);

            return(true);
        }
Exemplo n.º 10
0
 //向指定项写入内容
 public void WriteValue(string tagName, object value, string key)
 {
     lock ("write")
     {
         try
         {
             OPCItem  bItem         = _kepItems.GetOPCItem(_opcItemDic[tagName]);
             int[]    temp          = { 0, bItem.ServerHandle };
             Array    serverHandles = temp;
             object[] valueTemp     = { "", value };
             Array    values        = valueTemp;
             KepGroup.AsyncWrite(1, ref serverHandles, ref values, out Array errors, 2009, out int cancelId);
             GC.Collect();
         }
         catch (Exception ex)
         {
             LogHelper.WriteLog(typeof(OpcClient), ex.StackTrace + ex.Message);
         }
         //Thread.Sleep(100);//暂停100毫秒
     }
 }
Exemplo n.º 11
0
        public string AsyncWriteTagValue(string tag, string writeStr)
        {
            try
            {
                Array Errors;
                if (itmHandleClientWriteData != 0)
                {
                    OPCItem bItem = KepItemsWrite.GetOPCItem(itmHandleServerWriteData);
                    //注:OPC中以1为数组的基数
                    int[] temp = new int[2] {
                        0, bItem.ServerHandle
                    };
                    Array serverHandle = (Array)temp;
                    //移除上一次选择的项
                    KepItemsWrite.Remove(KepItemsWrite.Count, ref serverHandle, out Errors);
                }
                itmHandleClientWriteData = Array.IndexOf(tagList, tag) + 1;
                KepItemWrite             = KepItemsWrite.AddItem(tag, itmHandleClientWriteData);
                itmHandleServerWriteData = KepItemWrite.ServerHandle;

                OPCItem bItem_ = KepItemsWrite.GetOPCItem(itmHandleServerWriteData);
                int[]   temp_  = new int[2] {
                    0, bItem_.ServerHandle
                };
                Array    serverHandles = (Array)temp_;
                object[] valueTemp     = new object[2] {
                    "", writeStr
                };
                Array values = (Array)valueTemp;
                int   cancelID;
                KepGroupWriteData.AsyncWrite(1, ref serverHandles, ref values, out Errors, 2009, out cancelID);
                GC.Collect();
                return("OK");
            }
            catch (Exception err)
            {
                return(err.Message);
            }
        }
Exemplo n.º 12
0
        public string AsyncReadTagValue(string tag)
        {
            try
            {
                Array Errors;
                if (itmHandleClientReadData != 0)
                {
                    OPCItem bItem = KepItemsRead.GetOPCItem(itmHandleServerReadData);
                    //注:OPC中以1为数组的基数
                    int[] temp = new int[2] {
                        0, bItem.ServerHandle
                    };
                    Array serverHandle = (Array)temp;
                    //移除上一次选择的项
                    KepItemsRead.Remove(KepItemsRead.Count, ref serverHandle, out Errors);
                }
                itmHandleClientReadData = Array.IndexOf(tagList, tag) + 1;
                KepItemRead             = KepItemsRead.AddItem(tag, itmHandleClientReadData);
                itmHandleServerReadData = KepItemRead.ServerHandle;

                OPCItem bItem_ = KepItemsRead.GetOPCItem(itmHandleServerReadData);
                int[]   temp_  = new int[2] {
                    0, bItem_.ServerHandle
                };
                Array serverHandles = (Array)temp_;
                int   cancelID;
                //KepGroupReadData.AsyncWrite(1, ref serverHandles, ref values, out Errors, 2009, out cancelID);
                KepGroupReadData.AsyncRead(1, ref serverHandles, out Errors, 2018, out cancelID);
                GC.Collect();
                return("OK");
            }
            catch (Exception err)
            {
                return(err.Message);
            }
        }
Exemplo n.º 13
0
 /// <summary>
 /// 写入
 /// </summary>
 public void WriteTagValue(string tagValue)
 {
     try
     {
         OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);
         int[]   temp  = new int[2] {
             0, bItem.ServerHandle
         };
         Array    serverHandles = (Array)temp;
         object[] valueTemp     = new object[2] {
             "", tagValue
         };
         Array values = (Array)valueTemp;
         Array Errors;
         int   cancelID;
         KepGroup.AsyncWrite(1, ref serverHandles, ref values, out Errors, 2009, out cancelID);
         //KepItem.Write(txtWriteTagValue.Text);//这句也可以写入,但并不触发写入事件
         GC.Collect();
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
Exemplo n.º 14
0
        /// <summary>
        /// 第一次加载分支根据句柄读取数据
        /// </summary>
        /// <param name="handle">分支句柄</param>
        /// <param name="opcItems"></param>
        /// <param name="opcGroup"></param>
        /// <param name="bindingData"></param>
        /// <param name="serviceDic"></param>
        private void ReadOpcValue(int handle, OPCItems opcItems, OPCGroup opcGroup, List <OpcData> bindingData, Dictionary <int, string> serviceDic)
        {
            OPCItem bItem = opcItems.GetOPCItem(handle);

            int[] temp = new int[2] {
                0, bItem.ServerHandle
            };
            Array serverHandles = (Array)temp;
            Array Errors;
            int   cancelID;

            opcGroup.AsyncRead(1, ref serverHandles, out Errors, 2009, out cancelID);
            //OpcData data = bindingData.FirstOrDefault(x => x.OpcName == serviceDic[handle]);
            //data.OpcValue = bItem.Value.ToString();
            //data.OpcTime = DateTime.Now.ToString();
        }
Exemplo n.º 15
0
        private void ReadOPCValue(int handle)
        {
            OPCItem bItem = _opcItems.GetOPCItem(handle);

            int[] temp = new int[2] {
                0, bItem.ServerHandle
            };
            Array serverHandles = (Array)temp;
            Array Errors;
            int   cancelID;

            _opcGroup.AsyncRead(1, ref serverHandles, out Errors, 2009, out cancelID);
            OpcData data = _bindingData.FirstOrDefault(x => x.OpcName == _serviceDic[handle]);

            data.OpcValue = bItem.Value.ToString();
            data.OpcTime  = DateTime.Now.ToString();
            Log.Info($"ReadOPCValue读取数据。。。{data.OpcName}-{data.OpcValue}-{ data.OpcTime}");
        }
Exemplo n.º 16
0
        /// <summary>
        /// 右键写入value值。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 写ItemToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OPCItem bItem = KepItems.GetOPCItem(itmHandlerServer);

            int[] temp = new int[2] {
                0, bItem.ServerHandle
            };
            Array serverHandles = (Array)temp;

            object[] valueTemp = new object[2] {
                "", toolStripTextBox1.Text
            };
            Array values = (Array)valueTemp;
            Array Errors;
            int   CancelID;

            KepGroup.AsyncWrite(1, ref serverHandles, ref values, out Errors, 2017, out CancelID);
            GC.Collect();
        }
Exemplo n.º 17
0
        /// <summary>
        /// 写入
        /// </summary>
        public void WriteItem(string itemname, string value)
        {
            OPCItem bItem = PxItems.GetOPCItem(OPCItemDic[itemname].ServerHandle);

            int[] temp = new int[2] {
                0, bItem.ServerHandle
            };
            Array serverHandles = (Array)temp;

            object[] valueTemp = new object[2] {
                "", value
            };
            Array values = (Array)valueTemp;
            Array Errors;
            int   cancelID;

            PxGroup.AsyncWrite(1, ref serverHandles, ref values, out Errors, 2009, out cancelID);
            //KepItem.Write(txtWriteTagValue.Text);//这句也可以写入,但并不触发写入事件
            GC.Collect();
        }
Exemplo n.º 18
0
        private void btnWrite_Click(object sender, EventArgs e)
        {
            //获取之前定位的标签
            OPCItem bItem = myItems.GetOPCItem(itmHandleServer);

            //根据用户界面输入生成数据对象
            int[] temp = new int[2] {
                0, bItem.ServerHandle
            };
            Array serverHandles = (Array)temp;

            object[] valueTemp = new object[2] {
                "", txtMyValue.Text
            };
            Array values = (Array)valueTemp;
            Array Errors;
            int   cancelID;

            //异步写入到OPC服务器
            myGroup.AsyncWrite(1, ref serverHandles, ref values, out Errors, 2009, out cancelID);
            //回收资源
            GC.Collect();
        }
Exemplo n.º 19
0
        /// <summary>
        /// OPC初始化
        /// 当定时时间到触发下面事件
        /// 开机后延迟1秒开始初始化OPC,以后10秒检查与OPC链接转态,如果断开链接就重新链接并初始化OPC
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OPCconnectTimer_Tick(object sender, EventArgs e)
        {
            try
            {
                OPCconnectTimer.Interval = 10000;
                if (objServer.ServerState != 1)
                {
                    //连接opc server
                    objServer.Connect("Kepware.KEPServerEX.V5", "");
                    #region 获取所有监控信息点
                    string  sql       = @"select a.ID,a.EquipmentId,a.ParentId,a.EquipmentCode,a.EquipmentName,a.Team,a.PLCIP+'.'+b.PLCDB as PLCDB,b.FaultCode,b.FaultDesc,b.FaultType,b.ID AS FaultId,a.EType,'1' as alarmtype,a.IsPayPoint
                                    from EquipmentData(nolock) a 
                                    join FaultCodeInfo(nolock) b on a.ID=b.EquipmentId
union 
select a.ID,a.EquipmentId,a.ParentId,a.EquipmentCode,a.EquipmentName,a.Team,a.PLCIP+'.'+b.PLCUPDBAddress as PLCDB,'' FaultCode,b.UPDataDesc,'' FaultType,b.ID AS FaultId,a.EType,'0' as alarmtype,a.IsPayPoint
                                    from EquipmentData(nolock) a 
                                    join PLCTemplateInfoDetail(nolock) b on a.PLCDB=b.PLCTemplateID
order by EquipmentId,alarmtype asc";
                    DataSet dsstation = SQLHelper.GetDataSet(sql);
                    #endregion
                    //(2)建立一个opc组集合
                    objGroups = objServer.OPCGroups;
                    //(3)建立一个opc组
                    objGroup = objGroups.Add(null); //Group组名字可有可无
                    //(4)添加opc标签
                    objGroup.IsActive     = true;   //设置该组为活动状态,连接PLC时,设置为非活动状态也一样
                    objGroup.IsSubscribed = true;   //设置异步通知
                    objGroup.UpdateRate   = 250;
                    objServer.OPCGroups.DefaultGroupDeadband = 0;
                    objGroup.DataChange         += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
                    objGroup.AsyncReadComplete  += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(AsyncReadComplete);
                    objGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(AsyncWriteComplete);
                    objItems = objGroup.OPCItems; //建立opc标签集合
                    #region 循环创建连接并监控PLC地址
                    if (dsstation == null || dsstation.Tables[0].Rows.Count <= 0)
                    {
                        SystemLogs.InsertPLCLog("AndonResult", "获取PLC报警配置失败!请确认配置!");
                    }
                    else
                    {
                        scount = dsstation.Tables[0].Rows.Count;
                        int count = dsstation.Tables[0].Rows.Count + 1;
                        tmpIDs = new string[count + dcount];
                        int[] tmpCHandles = new int[count];
                        objChangeItem = new OPCItem[count];
                        //设备部分
                        for (int i = 1; i < count; i++)
                        {
                            tmpCHandles[i] = i;
                            tmpIDs[i]      = dsstation.Tables[0].Rows[i - 1]["PLCDB"].ToString();

                            #region 保存站点和PLCDB关系
                            ItemDB it = new ItemDB();
                            it.dbseq         = i;
                            it.DBTabid       = dsstation.Tables[0].Rows[i - 1]["PLCDB"].ToString();
                            it.Team          = dsstation.Tables[0].Rows[i - 1]["Team"].ToString();
                            it.FaultDesc     = dsstation.Tables[0].Rows[i - 1]["FaultDesc"].ToString();
                            it.FaultCode     = dsstation.Tables[0].Rows[i - 1]["FaultCode"].ToString();
                            it.FaultType     = dsstation.Tables[0].Rows[i - 1]["FaultType"].ToString();
                            it.ID            = dsstation.Tables[0].Rows[i - 1]["ID"].ToString();
                            it.ParentId      = dsstation.Tables[0].Rows[i - 1]["ParentId"].ToString();
                            it.FaultId       = dsstation.Tables[0].Rows[i - 1]["FaultId"].ToString();
                            it.EquipmentCode = dsstation.Tables[0].Rows[i - 1]["EquipmentCode"].ToString();
                            it.EquipmentName = dsstation.Tables[0].Rows[i - 1]["EquipmentName"].ToString();
                            it.EquipmentId   = dsstation.Tables[0].Rows[i - 1]["EquipmentId"].ToString();
                            it.EType         = dsstation.Tables[0].Rows[i - 1]["EType"].ToString();
                            it.alarmtype     = dsstation.Tables[0].Rows[i - 1]["alarmtype"].ToString();
                            it.IsPayPoint    = dsstation.Tables[0].Rows[i - 1]["IsPayPoint"].ToString();

                            itemsdb.Add(it);
                            #endregion

                            if (dsstation.Tables[0].Rows[i - 1]["PLCDB"].ToString().IndexOf("E0AssetID") >= 0)
                            {
                                statinindex.Add(i);
                            }
                        }

                        strItemIDs     = (Array)tmpIDs;//必须转成Array型,否则不能调用AddItems方法
                        lClientHandles = (Array)tmpCHandles;
                        // 添加opc标签
                        SystemLogs.InsertPLCLog("AndonResult", "添加监控标签!");
                        objItems.AddItems(count - 1, ref strItemIDs, ref lClientHandles, out lserverhandles, out lErrors, RequestedDataTypes, AccessPaths);
                        for (int i = 1; i < (count); i++)
                        {
                            objChangeItem[i] = objItems.GetOPCItem(Convert.ToInt32(lserverhandles.GetValue(i)));
                        }
                        //初始化站点编码
                        for (int i = 1; i < count; i++)
                        {
                            if (statinindex.IndexOf(i) >= 0)
                            {
                                SystemLogs.InsertPLCLog("StationResult", dsstation.Tables[0].Rows[i - 1]["PLCDB"].ToString() + "初始化AssetID:" + dsstation.Tables[0].Rows[i - 1]["EquipmentId"].ToString());
                                objChangeItem[i].Write(dsstation.Tables[0].Rows[i - 1]["EquipmentId"].ToString());
                            }
                        }
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {
                objServer.Disconnect();
                SystemLogs.InsertPLCLog("AndonResult", ex.Message);
            }
        }
Exemplo n.º 20
0
        /// <summary>
        /// OPC初始化
        /// 当定时时间到触发下面事件
        /// 开机后延迟1秒开始初始化OPC,以后10秒检查与OPC链接转态,如果断开链接就重新链接并初始化OPC
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OPCconnectTimer_Tick(object sender, EventArgs e)
        {
            try
            {
                OPCconnectTimer.Interval = 10000;
                if (objServer.ServerState != 1)
                {
                    //连接opc server
                    objServer.Connect("Kepware.KEPServerEX.V5", "");
                    #region 获取所有线体首站点以及PLC模板
                    string  sql       = @"select * from StationInfo(nolock) where IsFirstStation=1;
                                select a.ID as SID,a.StationCode,b.PLCTrigger,C.* from StationInfo(nolock) a 
                                join PLCTemplateOperationInfo(nolock) b on a.ID=b.PLCStationId
                                join PLCTemplateInfoDetail(nolock) c on b.PLCTemplateId=c.PLCTemplateId 
                                where a.IsFirstStation=1
                                order by a.ID,c.ID";
                    DataSet dsstation = SQLHelper.GetDataSet(sql);
                    #endregion
                    //(2)建立一个opc组集合
                    objGroups = objServer.OPCGroups;
                    //(3)建立一个opc组
                    objGroup = objGroups.Add(null); //Group组名字可有可无
                    //(4)添加opc标签
                    objGroup.IsActive     = true;   //设置该组为活动状态,连接PLC时,设置为非活动状态也一样
                    objGroup.IsSubscribed = true;   //设置异步通知
                    objGroup.UpdateRate   = 250;
                    objServer.OPCGroups.DefaultGroupDeadband = 0;
                    objGroup.DataChange         += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
                    objGroup.AsyncReadComplete  += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(AsyncReadComplete);
                    objGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(AsyncWriteComplete);
                    objItems = objGroup.OPCItems; //建立opc标签集合
                    #region 循环创建连接并监控PLC地址
                    if (dsstation == null || dsstation.Tables[0].Rows.Count <= 0 || dsstation.Tables[1].Rows.Count <= 0)
                    {
                        SystemLogs.InsertPLCLog("Order2PLC", "获取站点PLC模板失败!请确认配置!");
                    }
                    else
                    {
                        scount = dsstation.Tables[0].Rows.Count;
                        dcount = dsstation.Tables[1].Rows.Count;
                        int count = dsstation.Tables[1].Rows.Count + 1;
                        tmpIDs = new string[count];
                        int[] tmpCHandles = new int[count];
                        objChangeItem = new OPCItem[count];
                        List <int> statinindex = new List <int>();
                        for (int i = 1; i < count; i++)
                        {
                            tmpCHandles[i] = i;
                            tmpIDs[i]      = dsstation.Tables[1].Rows[i - 1]["PLCTrigger"].ToString() + "." + dsstation.Tables[1].Rows[i - 1]["PLCUPDBAddress"].ToString();
                            if (dsstation.Tables[1].Rows[i - 1]["PLCUPDBAddress"].ToString() == "Order0Init")
                            {
                                statinindex.Add(i);
                            }
                        }

                        strItemIDs     = (Array)tmpIDs;//必须转成Array型,否则不能调用AddItems方法
                        lClientHandles = (Array)tmpCHandles;
                        // 添加opc标签
                        SystemLogs.InsertPLCLog("Order2PLC", "添加监控标签!");
                        objItems.AddItems(count - 1, ref strItemIDs, ref lClientHandles, out lserverhandles, out lErrors, RequestedDataTypes, AccessPaths);
                        for (int i = 1; i < count; i++)
                        {
                            objChangeItem[i] = objItems.GetOPCItem(Convert.ToInt32(lserverhandles.GetValue(i)));
                        }
                        for (int i = 1; i < count; i++)
                        {
                            if (statinindex.IndexOf(i) >= 0)
                            {
                                SystemLogs.InsertPLCLog("Order2PLC", dsstation.Tables[1].Rows[i - 1]["PLCTrigger"].ToString() + "初始化站点编码:" + dsstation.Tables[1].Rows[i - 1]["StationCode"].ToString());
                                objChangeItem[i + 3].Write(dsstation.Tables[1].Rows[i - 1]["StationCode"].ToString());
                            }
                        }
                        //SystemLogs.InsertPLCLog("Order2PLC", "添加监控标签!");
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {
                objServer.Disconnect();
                SystemLogs.InsertPLCLog("Order2PLC", ex.Message);
            }
        }
Exemplo n.º 21
0
        public bool AddItems(List <Tag> biList)
        {
            try
            {
                #region  入的标签集合为空时,直接返回
                if (biList.Count == 0)
                {
                    return(false);
                }
                #endregion
                #region 当前标签集合已包含此Tag,则退出
                if (Tags.Count(p => biList.Select(b => b.TagName).Contains(p.TagName)) != 0)
                {
                    MessageBox.Show("Tag重复:在在重复的Tag点", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return(false);
                }


                #endregion

                //根据组名,取出组下的子集合
                OPCItems        items = this.OPCGroup.OPCItems;
                int             itmHandleBegin;
                int             NUMITEMS;
                Array           OPCItemIDs;
                Array           ItemClientHandles;
                Array           ItemServerHandles;
                Array           AddItemServerErrors;
                Func <Tag, int> f = (p => p != null ? p.ExtraAs <DaExtra>().ItmHandleClient : 0);

                itmHandleBegin      = f(Tags.LastOrDefault()); //itmHandleBegin的逻辑为最后一个标签itmHandle值
                NUMITEMS            = biList.Count + 1;        //OPCitem集合元素是以1为数组的基数,例:如果新增5个标签的话,就需要创建一个长度为6的标签,
                OPCItemIDs          = Array.CreateInstance(typeof(string), NUMITEMS);
                ItemClientHandles   = Array.CreateInstance(typeof(int), NUMITEMS);
                ItemServerHandles   = Array.CreateInstance(typeof(int), NUMITEMS);
                AddItemServerErrors = default(System.Array);

                //标签赋值后加入daTags
                for (int i = 1; i < NUMITEMS; i++)
                {
                    OPCItemIDs.SetValue(biList[i - 1].OpcTagName, i);
                    ItemClientHandles.SetValue(itmHandleBegin + i, i);
                    biList[i - 1].ExtraAs <DaExtra>().ItmHandleClient = itmHandleBegin + i;
                    Tags.Add((Tag)(Object)biList[i - 1]);
                }

                //关键,此步骤将标签添加入OPCclient的监听列表中
                items.AddItems(biList.Count, ref OPCItemIDs, ref ItemClientHandles, out ItemServerHandles, out AddItemServerErrors);

                #region ***********判断tag点是否正常监听************
                for (short i = 1; i < NUMITEMS; i++)
                {
                    if ((int)AddItemServerErrors.GetValue(i) == 0) //If the item was added successfully then allow it to be used.
                    {
                        Tags[i - 1].Message = "OPC Add Item Successful";
                        Tags[i - 1].Enabled = true;

                        //设置标签的数据类型及ServerHandle
                        OPCItem ki = items.GetOPCItem((int)ItemServerHandles.GetValue(i));
                        biList[i - 1].DataType = Enum.GetName(typeof(OpcTypes.CanonicalDataTypesForDa), ki.CanonicalDataType);
                        biList[i - 1].ExtraAs <DaExtra>().ItmHandleServer = (int)ItemServerHandles.GetValue(i);
                    }
                    else
                    {
                        Tags[i - 1].Message = "OPC Add Item Fail";
                        Tags[i - 1].Enabled = false;
                        //ItemServerHandles(i) = 0; // If the handle was bad mark it as empty
                        //OPCItemValue(i).Enabled = false;
                        //OPCItemValue(i).Text = "OPC Add Item Fail";
                    }
                }
                #endregion
                return(true);
            }
            catch (Exception e)
            {
                throw;
            }
        }