/// <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, "提示信息"); } }
/// <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(); }
/// <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, "提示信息"); } }
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); } }
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) { } } }
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; } } }
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(); }
//发送异步写数据指令 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); }
/// <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); }
//向指定项写入内容 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毫秒 } }
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); } }
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); } }
/// <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); } }
/// <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(); }
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}"); }
/// <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(); }
/// <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(); }
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(); }
/// <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); } }
/// <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); } }
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; } }