/// <summary> /// Reads the value of the specified item property. /// </summary> public Opc.Da.ItemValueResult Read(string itemID, PropertyID propertyID) { lock (this) { // initialize result. ItemValueResult result = new ItemValueResult(); result.ItemName = itemID; result.ItemPath = null; result.ResultID = ResultID.S_OK; result.DiagnosticInfo = null; // lookup item. DeviceItem item = (DeviceItem)m_items[itemID]; if (item == null) { result.ResultID = ResultID.Da.E_UNKNOWN_ITEM_NAME; return(result); } // read value. return(item.Read(propertyID)); } }
/// <summary> /// 接收服务端数据回调 /// </summary> /// <param name="ar"></param> private void ReadCallBack(IAsyncResult ar) { //接收到的数据长度 int receLen = 0; SocketError errorCode; try { receLen = m_socket.EndReceive(ar, out errorCode); char[] chars = new char[receLen + 1]; // Extract the characters as a buffer System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); int charLen = d.GetChars(m_dataBuffer, 0, receLen, chars, 0); System.String szData = new System.String(chars); // 构造事件 ItemValueResult[] values = new ItemValueResult[1]; values[0] = new ItemValueResult(); values[0].Value = m_dataBuffer; values[0].ItemName = "MODBUS Client:" + m_socket.LocalEndPoint.ToString(); base.OnDataChange(null, null, values); if (receLen > 0) { string strLogin = "******" + szData; byte[] data = Encoding.ASCII.GetBytes(strLogin); m_socket.BeginSend(data, 0, data.Length, SocketFlags.None, out errorCode, SendCallback, m_dataBuffer);//异步发送数据 //异步接受服务器回报的字符串 m_socket.BeginReceive(m_dataBuffer, 0, m_dataBuffer.Length, SocketFlags.None, ReadCallBack, m_dataBuffer); } } catch (Exception ex) { CLOGException.Trace("函数CommunicationLib.CTcpClientAccess.ReadCallBack 异常", CBaseMethods.MyBase.GetExceptionInfo(ex)); } }
protected override ItemValueResult[] Read(ItemIdentifier[] itemIDs, Item[] items) { ItemValueResult[] array = new ItemValueResult[itemIDs.Length]; ArrayList arrayList = new ArrayList(); ArrayList arrayList2 = new ArrayList(); for (int i = 0; i < itemIDs.Length; i++) { array[i] = new ItemValueResult(itemIDs[i]); if (items[i].MaxAgeSpecified && (items[i].MaxAge < 0 || items[i].MaxAge == int.MaxValue)) { arrayList.Add(array[i]); } else { arrayList2.Add(array[i]); } } if (arrayList.Count > 0) { Read((ItemValueResult[])arrayList.ToArray(typeof(ItemValueResult)), cache: true); } if (arrayList2.Count > 0) { Read((ItemValueResult[])arrayList2.ToArray(typeof(ItemValueResult)), cache: false); } return(array); }
/// <summary> /// 初始化 /// </summary> public override void Initialize(List <string> lstConnect) { // 打开TCP通信 Open(); // 添加items项 m_lstItemValueResult.Clear(); string[] fConnects = lstConnect.ToArray(); for (int i = 0; i < fConnects.Length; i++) { ItemValueResult itemValue = new ItemValueResult() { ItemName = fConnects[i] /* 该数据项在服务器中定义的名字*/ }; m_lstItemValueResult.Add(itemValue); itemValue = null; } fConnects = null; m_timer = new Timer() { Interval = m_updateRate, Enabled = true }; // 计时器启用 m_timer.Elapsed += new ElapsedEventHandler(Timer_Tick); CLOGException.Trace("CommunicationLib.CTcpClientAccessTimer.Initialize", string.Format("{0}successfully", IP)); }
/// <summary> /// 初始化(是否添加定时器) /// </summary> public override void Initialize(List <string> lstConnect, bool isTimer) { // 打开TCP通信 Open(); // 添加items项 m_lstItemValueResult.Clear(); string[] fConnects = lstConnect.ToArray(); for (int i = 0; i < fConnects.Length; i++) { ItemValueResult itemValue = new ItemValueResult() { ItemName = fConnects[i] /* 该数据项在服务器中定义的名字*/ }; m_lstItemValueResult.Add(itemValue); itemValue = null; } fConnects = null; m_isAckHandler = isTimer; CLOGException.Trace("CommunicationLib.CTcpClientAccessTimer.Initialize", string.Format("{0}successfully, isTimer:{1}", IP, isTimer)); if (isTimer) { while (true) { Timer_Tick(this, null); System.Threading.Thread.Sleep(m_updateRate);// CConfigManagement.myPara.ReadICCardRate); } //m_timer = new Timer() { Interval = m_updateRate /*ms*/, Enabled = true, /* 定义多次循环*/AutoReset = true }; //// 计时器启用 //m_timer.Elapsed += new ElapsedEventHandler(Timer_Tick); } }
/// <summary> /// 根据Item索引获取数据块DB值、地址、长度 /// </summary> /// <param name="itemNum"></param> /// <param name="nDB"></param> /// <param name="nStartAddr"></param> /// <param name="nLen"></param> private void GetItemDBAddress(int itemNum, ref int nDB, ref int nStartAddr, ref int nLen) { if (itemNum >= m_lstItemValueResult.Count || itemNum < 0) { return; } ItemValueResult item = m_lstItemValueResult[itemNum]; string str = item.ItemName; int nIndex = str.IndexOf("DB"); if (-1 == nIndex) { return; } str = str.Substring(nIndex + 2); str = str.Replace("INT", ""); str = str.Replace("B", ""); string[] strs = str.Split(','); if (2 == strs.Count()) { int.TryParse(strs[0], out nDB); int.TryParse(strs[1], out nStartAddr); nLen = 1; } else if (3 == strs.Count()) { int.TryParse(strs[0], out nDB); int.TryParse(strs[1], out nStartAddr); int.TryParse(strs[2], out nLen); } }
//====================================================================== // Read /// <summary> /// Reads the current values for a set of items. /// </summary> /// <param name="items">The set of items to read.</param> /// <returns>The results of the read operation for each item.</returns> public Opc.Da.ItemValueResult[] Read(Item[] items) { if (items == null) { throw new ArgumentNullException("items"); } if (items.Length == 0) { return(new Opc.Da.ItemValueResult[0]); } lock (this) { ArrayList results = new ArrayList(items.Length); foreach (Item item in items) { ItemValueResult result = m_cache.Read(item.ItemName, m_culture.Name, item.ReqType, (item.MaxAgeSpecified) ? item.MaxAge : 0); if (result == null) { result = new ItemValueResult(item, ResultID.E_FAIL); } result.ClientHandle = item.ClientHandle; results.Add(result); } return((ItemValueResult[])results.ToArray(typeof(ItemValueResult))); } }
protected override ItemValueResult[] Read(ItemIdentifier[] itemIDs, Item[] items) { ItemValueResult[] resultArray = new ItemValueResult[itemIDs.Length]; ArrayList list = new ArrayList(); ArrayList list2 = new ArrayList(); for (int i = 0; i < itemIDs.Length; i++) { resultArray[i] = new ItemValueResult(itemIDs[i]); if (items[i].MaxAgeSpecified && ((items[i].MaxAge < 0) || (items[i].MaxAge == 0x7fffffff))) { list.Add(resultArray[i]); } else { list2.Add(resultArray[i]); } } if (list.Count > 0) { this.Read((ItemValueResult[])list.ToArray(typeof(ItemValueResult)), true); } if (list2.Count > 0) { this.Read((ItemValueResult[])list2.ToArray(typeof(ItemValueResult)), false); } return(resultArray); }
/// <summary> /// Sync read tags /// </summary> /// <param name="values"></param> /// <returns></returns> public bool ReadValues(ref IOpcTag[] values) //ItemValueResult { if (!AddItems(values)) { return(false); } var results = new ItemValueResult[] { }; if (!SyncRead(ref results)) { return(false); } if (values.Count() != results.Count()) { return(false); } for (var i = 0; i < values.Count(); i++) { if (values[i].Address != results[i].ItemName) { continue; } //values[i].IsGood = results[i].Quality == Quality.Good; values[i].Value = results[i].Quality == Quality.Good ? results[i].Value : null; } return(true); }
private void UpdateDPResourceData(ItemValueResult value, List <DprData> dprdata) { dprdata[dprdata.FindIndex(delegate(DprData Dprdata) { return(Dprdata.Name == value.ItemName); })] .Value = System.Convert.ToDouble(value.Value); }
private void UpdateCFResourceData(ItemValueResult value, List <ConfigurationData> configurationinfo) { configurationinfo[configurationinfo.FindIndex(delegate(ConfigurationData configurationdata) { return(configurationdata.Name == value.ItemName); })] .Value = System.Convert.ToDouble(value.Value); }
private void UpdateNDResourceData(ItemValueResult value, List <NetWorkData> networkdata) { networkdata[networkdata.FindIndex(delegate(NetWorkData NetWorkdata) { return(NetWorkdata.Name == value.ItemName); })] .Value = System.Convert.ToDouble(value.Value); }
private void UpdatePMResourceData(ItemValueResult value, List <PowerMeterData> powermeterdata) { powermeterdata[powermeterdata.FindIndex(delegate(PowerMeterData pmdata) { return(pmdata.Name == value.ItemName); })] .Value = System.Convert.ToDouble(value.Value); }
private void UpdateMDResourceData(ItemValueResult value, List <ModuleInfo> moduleInfo) { moduleInfo[moduleInfo.FindIndex(delegate(ModuleInfo moduleInfodata) { return(moduleInfodata.Name == value.ItemName); })] .Value = System.Convert.ToDouble(value.Value); }
private void UpdateASResourceData(ItemValueResult value, List <AlarmData> alarmsummary) { alarmsummary[alarmsummary.FindIndex(delegate(AlarmData alarmsummarydata) { return(alarmsummarydata.Name == value.ItemName); })] .Value = System.Convert.ToDouble(value.Value); }
private void UpdateCDResourceData(ItemValueResult value, List <CPUData> cpudata) { cpudata[cpudata.FindIndex(delegate(CPUData cpudatadata) { return(cpudatadata.Name == value.ItemName); })] .Value = System.Convert.ToDouble(value.Value); }
public static void OPCSubscription_DataChanged(object subscriptionHandle, object requestHandle, ItemValueResult[] tags) { // Display result whenever a tag value is updated for (int i = 0; i < tags.Length; i++) { Console.WriteLine(" ItemName: " + tags[i].ItemName); Console.WriteLine(" Value: " + tags[i].Value); } }
/// <summary> /// Reads the value from the cache and converts it to the rqeuested type. /// </summary> public ItemValueResult Read(string locale, System.Type reqType, int maxAge, bool supportsCOM) { // read value from device. DateTime target = DateTime.Now.AddMilliseconds((maxAge < 0)?0:-maxAge); if (maxAge == 0 || m_value == null || target > m_value.Timestamp) { m_value = m_device.Read(m_itemID, Property.VALUE); m_value.Timestamp = DateTime.Now; } ItemValueResult result = new ItemValueResult((ItemIdentifier)m_value); result.ResultID = m_value.ResultID; result.DiagnosticInfo = m_value.DiagnosticInfo; result.Quality = m_value.Quality; result.QualitySpecified = true; result.Timestamp = m_value.Timestamp; result.TimestampSpecified = true; if (m_value.ResultID.Succeeded()) { try { if (m_euType != euType.enumerated || reqType != typeof(string)) { result.Value = ChangeType(m_value.Value, reqType, locale, supportsCOM); } else { result.Value = m_euInfo[System.Convert.ToInt32(m_value.Value)]; } } catch (OverflowException e) { result.ResultID = ResultID.Da.E_RANGE; result.DiagnosticInfo = e.Message; } catch (InvalidCastException e) { result.ResultID = ResultID.Da.E_RANGE; result.DiagnosticInfo = e.Message; } catch (ResultIDException e) { result.ResultID = e.Result; result.DiagnosticInfo = e.Message; } catch (Exception e) { result.ResultID = ResultID.Da.E_BADTYPE; result.DiagnosticInfo = e.Message; } } return(result); }
//====================================================================== // Write /// <summary> /// Writes the value, quality and timestamp for a set of items. /// </summary> /// <param name="items">The set of item values to write.</param> /// <returns>The results of the write operation for each item.</returns> public IdentifiedResult[] Write(ItemValue[] items) { if (items == null) { throw new ArgumentNullException("items"); } if (items.Length == 0) { return(new Opc.IdentifiedResult[0]); } lock (this) { if (m_proxy == null) { throw new NotConnectedException(); } ItemValueList list = new ItemValueList(); list.AddRange(items); OpcXml.Da10.RequestOptions options = OpcXml.Da10.Request.GetRequestOptions(m_options.Locale, m_options.Filters); OpcXml.Da10.WriteRequestItemList requestList = OpcXml.Da10.Request.GetItemValueList(list); OpcXml.Da10.ReplyItemList replyList = null; OpcXml.Da10.OPCError[] errors = null; OpcXml.Da10.ReplyBase reply = m_proxy.Write( options, requestList, false, out replyList, out errors); CacheResponse(m_options.Locale, reply, errors); ItemValueResultList valueList = OpcXml.Da10.Request.GetResultList(replyList); if (valueList == null) { throw new InvalidResponseException(); } IdentifiedResult[] results = new IdentifiedResult[valueList.Count]; for (int ii = 0; ii < valueList.Count; ii++) { ItemValueResult valueResult = valueList[ii]; results[ii] = new IdentifiedResult(valueResult); results[ii].ResultID = valueResult.ResultID; results[ii].DiagnosticInfo = valueResult.DiagnosticInfo; } return(results); } }
public static ItemValueResult[] RsLinx_OPC_Client_Read_Array(string ItemName, int Length) { try { //Creo un istanza di OPC.server Opc.Da.Server server; //Parametro necessario alla connect OpcCom.Factory fact = new OpcCom.Factory(); //Creo un istanza di Sottoscrizione Opc.Da.Subscription groupRead; //Creo un istanza di SubscriptionState, utile per controllare lo stato della sottoscrizione Opc.Da.SubscriptionState groupState; //Creo un array di OPC.Da.Item Opc.Da.Item[] items = new Opc.Da.Item[1]; //Setto factory e url del server, come url utilizzo quello del RSLinx OPC Server server = new Opc.Da.Server(fact, null); server.Url = new Opc.URL(Url); //Connetto il server server.Connect(); //Istanzio la sottoscrizione groupState = new Opc.Da.SubscriptionState(); groupState.Name = "Group"; groupState.UpdateRate = UpdateRate; //Setto il tempo di Refresh del gruppo groupState.Active = true; //Questo valore deve essere true se voglio aver la possibilità di leggere //Creo il gruppo sul server groupRead = (Opc.Da.Subscription)server.CreateSubscription(groupState); //Istanzio l'Item items[0] = new Opc.Da.Item(); //Gli do il nome (Rockwell utilizza questa formzattazione dei nomi per gli array //[NomeTopicOPC]NomeTag,LDimensioneArray es. [MyOPCTopic]Posizione,L50) items[0].ItemName = $"{ItemName},L{Length}"; //Aggiungo l'oggetto al gruppo items = groupRead.AddItems(items); //Leggo il valore dell'item aggiunto ItemValueResult[] Ritorno = groupRead.Read(items); //Controllo che la lettura dell'array sia andata a buon fine, se non è così lancio un'eccezione if (!Ritorno[0].ResultID.Name.Name.Equals("S_OK")) { throw new System.Exception("Errore lettura OPC Tag"); } return(groupRead.Read(items)); } catch (Exception ex) { //Se viene lanciata un'eccezione ritorno un array di ItemValueResult con il primo che ha valore -1 e mostro un Messagebox con l'errore MessageBox.Show(ex.Message); ItemValueResult[] Errore = new ItemValueResult[1]; Errore[0] = new ItemValueResult(); float[] Err = { (float)-1, (float)-1 }; Errore[0].Value = Err; return(Errore); } }
public void Add(ItemValueResult value) { if (!IsGoodValue(value) || // Do not accumulate the bad values (acc.Count == 1 && !IsGoodValue(acc[0]))) { acc.Clear(); } acc.Add(value); dirty = true; }
private ItemValueResult CreateBadResult() { ItemValueResult res = new ItemValueResult(item); res.TimestampSpecified = false; res.Quality = Quality.Bad; res.QualitySpecified = true; res.ResultID = Opc.ResultID.S_OK; return(res); }
internal static object ReadProperty(PropertyID propertyID, IDeviceIndexed device, ushort ItemIndex) { ItemValueResult result = device.Read(ItemIndex, propertyID); if (result == null || result.ResultID.Failed()) { return(null); } return(result.Value); }
/// <summary> /// Reads the next sample from the device. /// </summary> private void DoSample(string locale, float deadband) { if (!m_active) { return; } // read latest value from device. ItemValueResult currentValue = m_cache.Read(m_itemID, locale, m_reqType, 0); // check if value has changed. bool changed = true; // always return for error. if (m_latestValue != null) { // compare value to last returned value if sampling has not started yet. if (m_samples.Count == 0) { changed = HasChanged(currentValue, m_latestValue, deadband); } // compare to previous sample if sampling has started. else if (m_bufferEnabled) { changed = HasChanged(currentValue, (ItemValueResult)m_samples[m_samples.Count - 1], 0); } } // add changed value to the buffer. if (changed) { // clear buffer. if (!m_bufferEnabled) { m_samples.Clear(); } // check if buffer length is exceeded. if (m_samples.Count >= MAX_BUFFER_LENGTH) { if (currentValue.ResultID == ResultID.S_OK) { currentValue.ResultID = ResultID.Da.S_DATAQUEUEOVERFLOW; } m_samples.RemoveAt(0); m_overflow = true; } // add new sample to buffer. m_samples.Add(currentValue); } }
/// <summary> /// Reads the value of the specified property. /// </summary> public object ReadProperty(PropertyID propertyID) { ItemValueResult result = m_device.Read(m_itemID, propertyID); if (result == null || result.ResultID.Failed()) { return(null); } return(result.Value); }
public static string WriteValue(string nodeName, double value) { Opc.ItemIdentifier itemId = new Opc.ItemIdentifier(nodeName); ItemValueResult it = new ItemValueResult(itemId); it.Value = value; server.Write(new ItemValueResult[] { it }); return("Masz ty RiGCz? wpisałeś " + value + " do węzła " + nodeName); }
private ItemValueResult CreateResult(object value, DateTime timestamp) { ItemValueResult res = new ItemValueResult(item); res.Timestamp = timestamp; res.TimestampSpecified = true; res.Value = value; res.Quality = Quality.Good; res.QualitySpecified = true; res.ResultID = Opc.ResultID.S_OK; return(res); }
private bool IsResultsPassed(ItemValueResult[] results) { int numTagsPassed = 0; for (int i = 0; i < results.Length; i++) { var boolValue = Convert.ToBoolean(results[i].Value.ToString()); if (boolValue) numTagsPassed++; } return (numTagsPassed == results.Length) ? true : false; }
private static bool IsGoodValue(ItemValueResult valueRes) { if (valueRes != null && valueRes.ResultID.Succeeded() && valueRes.QualitySpecified && valueRes.TimestampSpecified) { if (valueRes.Timestamp != null && valueRes.Quality != null) { return(valueRes.Quality.QualityBits == Opc.Da.qualityBits.good); } } return(false); }
/// <remarks/> public ItemValueResult[] Read(Item[] items) { if (items == null) { throw new ArgumentNullException("items"); } lock (this) { // handle trivial case. if (items.Length == 0) { return(new ItemValueResult[0]); } // create item results. ItemValueResult[] results = new ItemValueResult[items.Length]; for (int ii = 0; ii < items.Length; ii++) { // initialize result with item. results[ii] = new ItemValueResult(items[ii]); // check for invalid handle. if (items[ii].ServerHandle == null) { results[ii].ResultID = ResultID.Da.E_INVALIDHANDLE; continue; } // lookup subscription item. SubscriptionItem item = (SubscriptionItem)m_items[items[ii].ServerHandle]; if (item == null) { results[ii].ResultID = ResultID.Da.E_INVALIDHANDLE; continue; } // read the item value. results[ii] = item.Read(m_state.Active, m_state.Locale, items[ii].MaxAge); results[ii].ServerHandle = items[ii].ServerHandle; } // apply result filters. ApplyFilters(m_filters, results); // return results. return(results); } }
/// <summary> /// Reads the value from the cache and converts it to the rqeuested type. /// </summary> internal ItemValueResult Read(string locale, System.Type reqType, int maxAge, bool supportsCOM) { // read value from device. DateTime target = DateTimeProvider.GetCurrentTime().AddMilliseconds((maxAge < 0) ? 0 : -maxAge); ItemValueResult result = m_settings.ReadNewValue(maxAge, target); if (result.ResultID.Succeeded()) { try { object currentvalue = result.Value; if (m_settings.EuType != euType.enumerated || reqType != typeof(string)) { result.Value = ChangeType(currentvalue, reqType, locale, supportsCOM); } else { result.Value = m_settings.EuInfo[System.Convert.ToInt32(currentvalue)]; } } catch (OverflowException e) { result.Quality = Quality.Bad; result.ResultID = ResultID.Da.E_RANGE; result.DiagnosticInfo = e.Message; } catch (InvalidCastException e) { result.Quality = Quality.Bad; result.ResultID = ResultID.Da.E_RANGE; result.DiagnosticInfo = e.Message; } catch (ResultIDException e) { result.Quality = Quality.Bad; result.ResultID = e.Result; result.DiagnosticInfo = e.Message; } catch (Exception e) { result.Quality = Quality.Bad; result.ResultID = ResultID.Da.E_BADTYPE; result.DiagnosticInfo = e.Message; } } return(result); }
/// <summary> /// 侦听到客户端数据回调his the call back function which will be invoked when the socket /// detects any client writing of data on the stream /// </summary> /// <param name="asyn"></param> private void ReadCallBack(IAsyncResult asyn) { SocketPacket socketData = (SocketPacket)asyn.AsyncState; try { // Complete the BeginReceive() asynchronous call by EndReceive() method // which will return the number of characters written to the stream // by the client int iRx = socketData.m_currentSocket.EndReceive(asyn); char[] chars = new char[iRx + 1]; // Extract the characters as a buffer System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); int charLen = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0); System.String szData = new System.String(chars); // 构造事件 ItemValueResult[] values = new ItemValueResult[1]; values[0] = new ItemValueResult(); values[0].Value = socketData.dataBuffer; values[0].ItemName = "MODBUS Server:" + socketData.m_currentSocket.LocalEndPoint.ToString(); base.OnDataChange(null, null, values); // Send back the reply to the client string replyMsg = "Server Reply:" + szData.ToUpper(); // Convert the reply to byte array byte[] byData = System.Text.Encoding.ASCII.GetBytes(replyMsg); Socket workerSocket = (Socket)socketData.m_currentSocket; workerSocket.Send(byData); // Continue the waiting for data on the Socket WaitForData(socketData.m_currentSocket, socketData.m_clientNumber); } catch (ObjectDisposedException ex) { System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n"); CLOGException.Trace("函数CommunicationLib.CTcpServerAccess.ReadCallBack 异常", CBaseMethods.MyBase.GetExceptionInfo(ex)); } catch (SocketException ex) { if (ex.ErrorCode == 10054) // Error code for Connection reset by peer { // Remove the reference to the worker socket of the closed client // so that this object will get garbage collected m_workerSocketList[socketData.m_clientNumber - 1] = null; } CLOGException.Trace("函数CommunicationLib.CTcpServerAccess.ReadCallBack 异常", CBaseMethods.MyBase.GetExceptionInfo(ex)); } }
private void _group_DataChanged(object subscriptionHandle, object requestHandle, ItemValueResult[] values) { lock (_itemValues) { foreach (var value in values) { _itemValues[value.ItemName] = value.Value; } } }
/// <summary> /// Reads the value from the cache and converts it to the rqeuested type. /// </summary> public ItemValueResult Read(string locale, System.Type reqType, int maxAge, bool supportsCOM) { // read value from device. DateTime target = DateTime.Now.AddMilliseconds((maxAge < 0)?0:-maxAge); if (maxAge == 0 || m_value == null || target > m_value.Timestamp) { m_value = m_device.Read(m_itemID, Property.VALUE); m_value.Timestamp = DateTime.Now; } ItemValueResult result = new ItemValueResult((ItemIdentifier)m_value); result.ResultID = m_value.ResultID; result.DiagnosticInfo = m_value.DiagnosticInfo; result.Quality = m_value.Quality; result.QualitySpecified = true; result.Timestamp = m_value.Timestamp; result.TimestampSpecified = true; if (m_value.ResultID.Succeeded()) { try { if (m_euType != euType.enumerated || reqType != typeof(string)) { result.Value = ChangeType(m_value.Value, reqType, locale, supportsCOM); } else { result.Value = m_euInfo[System.Convert.ToInt32(m_value.Value)]; } } catch (OverflowException e) { result.ResultID = ResultID.Da.E_RANGE; result.DiagnosticInfo = e.Message; } catch (InvalidCastException e) { result.ResultID = ResultID.Da.E_RANGE; result.DiagnosticInfo = e.Message; } catch (ResultIDException e) { result.ResultID = e.Result; result.DiagnosticInfo = e.Message; } catch (Exception e) { result.ResultID = ResultID.Da.E_BADTYPE; result.DiagnosticInfo = e.Message; } } return result; }
public void OPCSubscription_DataChanged(object subscriptionHandle, object requestHandle, ItemValueResult[] values) { // Display result for (int i = 0; i < values.Length; i++) { OpcItem syncedItem = new OpcItem(); syncedItem.ItemName = values[i].ItemName; syncedItem.Value = values[i].Value; Console.WriteLine("ItemName" + syncedItem.ItemName); Console.WriteLine("Value" + syncedItem.Value); } }
/// <summary> /// Determines whether the value has changed. /// </summary> private bool HasChanged(ItemValueResult newValue, ItemValueResult oldValue, float deadband) { // check if the error code has changed. if (newValue.ResultID != oldValue.ResultID) { return true; } // check if the quality has changed. if (newValue.Quality != oldValue.Quality) { return true; } // check for trivial case. if (newValue.Value == null || oldValue.Value == null) { return newValue.Value != oldValue.Value; } // check if the value is the same. if (Opc.Convert.Compare(newValue.Value, oldValue.Value)) { return false; } // check deadband if required. double percentage = ((m_deadband != -1)?m_deadband:deadband)/100; if (m_euType != euType.analog || percentage == 0) { return true; } // check for trival case. double range = m_maxValue - m_minValue; if (range == 0) { return true; } // handle array values. if (newValue.Value.GetType().IsArray && oldValue.Value.GetType().IsArray) { Array newArray = (Array)newValue.Value; Array oldArray = (Array)oldValue.Value; if (newArray.Length != oldArray.Length) { return true; } // deadband is exceeded whenever a single element exceeds the deadband. for (int ii = 0; ii < newArray.Length; ii++) { try { double newElement = System.Convert.ToDouble(newArray.GetValue(ii)); double oldElement = System.Convert.ToDouble(oldArray.GetValue(ii)); if (Math.Abs((newElement - oldElement)/range) > percentage) { return true; } } catch { return true; } } } // handle scalar values. else { try { double newElement = System.Convert.ToDouble(newValue.Value); double oldElement = System.Convert.ToDouble(oldValue.Value); if (Math.Abs((newElement - oldElement)/range) > percentage) { return true; } } catch { return true; } } // deadband not exceeded. return false; }
/// <summary> /// Clears the last value sent to the client. /// </summary> public void ResetLastUpdate() { m_latestValue = null; }
/// <summary> /// Reads the value of the specified item property. /// </summary> public Opc.Da.ItemValueResult Read(PropertyID propertyID) { // initialize value and validate property. ItemValueResult value = new ItemValueResult(); value.ItemName = m_itemID; value.ItemPath = null; value.ResultID = ValidatePropertyID(propertyID, accessRights.readable); value.DiagnosticInfo = null; value.Value = null; value.Quality = Quality.Bad; value.QualitySpecified = false; value.Timestamp = DateTime.MinValue; value.TimestampSpecified = false; if (value.ResultID.Failed()) { return value; } // set default quality and timestamp (overridden when returning the item value). value.Quality = Quality.Good; value.QualitySpecified = true; value.Timestamp = DateTime.UtcNow; value.TimestampSpecified = true; // read the property value. switch (propertyID.Code) { case VALUE: { value.Value = Opc.Convert.Clone(m_value); value.Quality = m_quality; value.Timestamp = m_timestamp; break; } // standard properties. case DATATYPE: { value.Value = m_datatype; break; } case QUALITY: { value.Value = m_quality; break; } case TIMESTAMP: { value.Value = m_timestamp; break; } case ACCESSRIGHTS: { value.Value = m_accessRights; break; } case SCANRATE: { value.Value = m_scanRate; break; } case EUTYPE: { value.Value = m_euType; break; } case EUINFO: { value.Value = m_euInfo; break; } case HIGHEU: { value.Value = m_maxValue; break; } case LOWEU: { value.Value = m_minValue; break; } case MINIMUM_VALUE: { if (m_datatype == typeof(DateTime)) { value.Value = DateTime.MinValue; break; } if (m_datatype == typeof(Decimal)) { value.Value = Decimal.MinValue; break; } value.Value = null; break; } case MAXIMUM_VALUE: { if (m_datatype == typeof(DateTime)) { value.Value = DateTime.MaxValue; break; } if (m_datatype == typeof(Decimal)) { value.Value = Decimal.MaxValue; break; } value.Value = null; break; } case VALUE_PRECISION: { if (m_datatype == typeof(DateTime)) { value.Value = 1/(double)TimeSpan.TicksPerMillisecond; break; } if (m_datatype == typeof(Decimal)) { value.Value = 28; break; } value.Value = null; break; } // other defined properties. default: { if (!m_properties.Contains(propertyID)) { value.ResultID = ResultID.Da.E_INVALID_PID; break; } value.Value = m_properties[propertyID]; break; } } // read completed successfully. return value; }
/// <summary> /// Copies all samples since the last update into a buffer. /// </summary> public bool ReadSamples(ArrayList samples) { if (m_samples.Count == 0) { return false; } // save latest returned value. m_latestValue = (ItemValueResult)((ItemValueResult)m_samples[m_samples.Count-1]).Clone(); // copy samples into buffer. foreach (ItemValueResult sample in m_samples) { sample.ClientHandle = ClientHandle; sample.ServerHandle = ServerHandle; samples.Add(sample); } bool overflow = m_overflow; // clear the buffer. m_samples.Clear(); m_overflow = false; // return flag indicated whether an overflow occurred. return overflow; }
private void Group_DataChanged (object subscriptionHandle, object requestHandle, ItemValueResult[] values) { if (OpcTagUpdate != null) { for (int i = 0; i < values.Length; i++) { string name = values[i].ItemName.Substring(values[i].ItemName.LastIndexOf(".") + 1); int value = System.Convert.ToInt32(values[i].Value); OpcTagUpdate(name, value); string opcTagInfoMessage = String.Format("{0}{1}{2}{3}{4}", "OPC - TAGUPDATE > ", "Name:", name, " Value:", value.ToString()); _logger.LogInfo(opcTagInfoMessage); } } }
//====================================================================== // Read /// <summary> /// Reads the current values for a set of items. /// </summary> /// <param name="items">The set of items to read.</param> /// <returns>The results of the read operation for each item.</returns> public Opc.Da.ItemValueResult[] Read(Item[] items) { if (items == null) throw new ArgumentNullException("items"); if (items.Length == 0) { return new Opc.Da.ItemValueResult[0]; } lock (this) { ArrayList results = new ArrayList(items.Length); foreach (Item item in items) { ItemValueResult result = m_cache.Read(item.ItemName, m_culture.Name, item.ReqType, (item.MaxAgeSpecified)?item.MaxAge:0); if (result == null) { result = new ItemValueResult(item, ResultID.E_FAIL); } result.ClientHandle = item.ClientHandle; results.Add(result); } return (ItemValueResult[])results.ToArray(typeof(ItemValueResult)); } }