public void AsyncRead() { Array Errors; int cancelID; try { KepGroup.AsyncRead(KeyItemServerHandles.Length, ref KeyItemServerHandles, out Errors, 2009, out cancelID); } catch (Exception exp1) { } }
public void ReadValue(string tagName, bool wtf) { try { OPCItem bItem = _kepItems.GetOPCItem(_opcItemDic[tagName]); int[] temp = { 0, bItem.ServerHandle }; Array serverHandles = temp; KepGroup.AsyncRead(1, ref serverHandles, out Array errors, 2009, out int cancel); GC.Collect(); } catch (Exception) { throw; } }
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(); }
public static void ReadValue(string tagName, bool wtf) { GetTagValue(tagName); int aa = itmHandleServer; OPCItem bItem = KepItems.GetOPCItem(itmHandleServer); int[] temp = new int[2] { 0, bItem.ServerHandle }; Array serverHandles = (Array)temp; Array Errors; int cancel; KepGroup.AsyncRead(1, ref serverHandles, out Errors, 2009, out cancel); GC.Collect(); }
/// <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}"); }
public void AsyncRead(string[] sItemsID, string sGroupName, int iTransactionID, out Array Result) { try { int iNumItem = sItemsID.Length; int[] iServerHandler = GetServerHandles(sItemsID); Array aServerHandler = (Array)iServerHandler; Array aError; //int iTransactionID = 299; int iCanceID; KepGroup = KepGroups.GetOPCGroup(sGroupName); KepGroup.AsyncRead(iNumItem, aServerHandler, out aError, iTransactionID, out iCanceID); Result = aError; } catch { //Console.WriteLine("************** " + "AsyncRead Error" + " **************"); Result = null; } }
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); } }
private void GetSeqences(Plc plc) { Array ItemIDs = Array.CreateInstance(typeof(string), 61); Array ClntHndl = Array.CreateInstance(typeof(int), 61); Array SvrHndl; Array SvrErr; Array Values; object qual = new object(); object TS = new object(); string tag = ""; try { for (int i = 1; i <= 30; i++) { switch (type) { case OPCType.Kepware: tag = $"{plc.Tag}.ZZSEQ[{(i).ToString()}].SA"; ItemIDs.SetValue(tag, i); tag = $"{plc.Tag}.ZZSEQ[{(i).ToString()}].DESC.DATA/8"; ItemIDs.SetValue(tag, i + 30); break; case OPCType.Matrikon: tag = $"{plc.Tag}:PLC:SCADA_CONFIG:ZZSEQ[{(i).ToString()}].SEQ.VALUE"; ItemIDs.SetValue(tag, i); //"A3_01_R01_S01: PLC: SCADA_CONFIG: ZZMISSEQ[1].DESC.VALUE" tag = $"{plc.Tag}:PLC:SCADA_CONFIG:ZZSEQ[{(i).ToString()}].DESC.VALUE"; ItemIDs.SetValue(tag, i + 30); break; } ClntHndl.SetValue(i, i); ClntHndl.SetValue(i + 30, i + 30); } oGroup.OPCItems.AddItems(60, ref ItemIDs, ref ClntHndl, out SvrHndl, out SvrErr); if (this.Sync) { oGroup.SyncRead((short)OPCAutomation.OPCDataSource.OPCDevice, 60, ref SvrHndl, out Values, out SvrErr, out qual, out TS); string zone = "ZONE" + plc.ID.ToString("00"); for (int j = 1; j <= 30; j++) { double ms = double.Parse(Values.GetValue(j).ToString()); string desc = Values.GetValue(j + 30).ToString(); if (ms > 0) { Sequence s = plc.AddSequence(j, zone, ms, desc); NewSeq?.Invoke(plc, s); } } oGroup.OPCItems.Remove(60, ref SvrHndl, out SvrErr); } else { int ic; oGroup.AsyncRead(60, ref SvrHndl, out SvrErr, plc.ID, out ic); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
/// <summary> /// 异步读取多个Item /// </summary> /// <param name="itemName"></param> public void AsyncReadItems(List <string> ItemName) { try { if (itmHandleClientList.Count > 0) { TagValueList.Clear(); QualitiesList.Clear(); TimeStampsList.Clear(); Array Errors; List <OPCItem> bItem = new List <OPCItem>(); foreach (int itmHandleServer in itmHandleServerList) { bItem.Add(KepItems.GetOPCItem(itmHandleServer)); } //注:OPC中以1为数组的基数 int[] temp = new int[bItem.Count + 1]; temp[0] = 0; for (int i = 1; i < temp.Length; i++) { temp[i] = bItem[i - 1].ServerHandle; } Array serverHandle = (Array)temp; //移除上一次选择的项 KepItems.Remove(KepItems.Count, ref serverHandle, out Errors); itmHandleClientList.Clear(); itmHandleServerList.Clear(); } for (int i = 0; i < ItemName.Count; i++) { itmHandleClientList.Add(1234 + i); KepItem = KepItems.AddItem(ItemName[i], 1234 + i); if (KepItem != null) { itmHandleServerList.Add(KepItem.ServerHandle); QueryTime = DateTime.Now; QueryTimeBool = true; } } int[] temp1 = new int[itmHandleServerList.Count + 1]; temp1[0] = 0; for (int i = 1; i < temp1.Length; i++) { temp1[i] = itmHandleServerList[i - 1]; } Array serverHandles = (Array)temp1; Array _Errors; int cancelID; KepGroup.AsyncRead(itmHandleClientList.Count, ref serverHandles, out _Errors, 1, out cancelID);//第一参数为item数量 } catch (Exception) { //没有任何权限的项,都是OPC服务器保留的系统项,此处可不做处理。 itmHandleClient = 0; TagValue = "Error ox"; Qualities = "Error ox"; TimeStamps = "Error ox"; //MessageBox.Show("保留项2错误!\n" + err); } }
//测试用工作方法 public void work() { //初始化item数组 MyItem = new OPCItem[4]; MyItem2 = new OPCItem[4]; GetLocalServer(); //ConnectRemoteServer("TX1", "KEPware.KEPServerEx.V4");//用计算机名的局域网 //ConnectRemoteServer("192.168.1.35", "KEPware.KEPServerEx.V4");//用IP的局域网 if (ConnectRemoteServer("", "KEPware.KEPServerEx.V4"))//本机 { if (CreateGroup()) { Thread.Sleep(500); //暂停线程以让DataChange反映,否则下面的同步读可能读不到 //以下同步写 MyItem[3].Write("I love you!"); //同步写 MyItem[2].Write(true); //同步写 MyItem[1].Write(-100); //同步写 MyItem[0].Write(120); //同步写 //以下同步读 object ItemValues; object Qualities; object TimeStamps; //同步读的临时变量:值、质量、时间戳 MyItem[0].Read(1, out ItemValues, out Qualities, out TimeStamps); //同步读,第一个参数只能为1或2 int q0 = Convert.ToInt32(ItemValues); //转换后获取item值 MyItem[1].Read(1, out ItemValues, out Qualities, out TimeStamps); //同步读,第一个参数只能为1或2 int q1 = Convert.ToInt32(ItemValues); //转换后获取item值 MyItem[2].Read(1, out ItemValues, out Qualities, out TimeStamps); //同步读,第一个参数只能为1或2 bool q2 = Convert.ToBoolean(ItemValues); //转换后获取item值 MyItem[3].Read(1, out ItemValues, out Qualities, out TimeStamps); //同步读,第一个参数只能为1或2 string q3 = Convert.ToString(ItemValues); //转换后获取item值,为防止读到的值为空,不用ItemValues.ToString() Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); Console.WriteLine("0-{0},1-{1},2-{2},3-{3}", q0, q1, q2, q3); //以下为异步写 //异步写时,Array数组从下标1开始而非0! int[] temp = new int[] { 0, MyItem[0].ServerHandle, MyItem[1].ServerHandle, MyItem[2].ServerHandle, MyItem[3].ServerHandle }; Array serverHandles = (Array)temp; object[] valueTemp = new object[5] { "", 255, 520, true, "Love" }; Array values = (Array)valueTemp; Array Errors; int cancelID; MyGroup.AsyncWrite(4, ref serverHandles, ref values, out Errors, 1, out cancelID);//第一参数为item数量 //由于MyGroup2没有订阅,所以以下这句运行时将会出错! //MyGroup2.AsyncWrite(4, ref serverHandles, ref values, out Errors, 1, out cancelID); //以下异步读 MyGroup.AsyncRead(4, ref serverHandles, out Errors, 1, out cancelID);//第一参数为item数量 /*MyItem[0] = MyItems.AddItem("BPJ.Db1.dbb96", 0);//byte * MyItem[1] = MyItems.AddItem("BPJ.Db1.dbw10", 1);//short * MyItem[2] = MyItems.AddItem("BPJ.Db16.dbx0", 2);//bool * MyItem[3] = MyItems.AddItem("BPJ.Db11.S0", 3);//string*/ Console.WriteLine("************************************** hit <return> to Disconnect..."); Console.ReadLine(); //释放所有组资源 MyServer.OPCGroups.RemoveAll(); //断开服务器 MyServer.Disconnect(); } } //END Console.WriteLine("************************************** hit <return> to close..."); Console.ReadLine(); }