通訊協(xié)議050——全網(wǎng)獨有的OPC HDA知識一之接口(五)IOPCHDA_SyncRead

本文簡單介紹OPC HDA規(guī)范的IOPCHDA_SyncRead接口方法,更多通信資源請登錄網(wǎng)信智匯(wangxinzhihui.com)。
?
1)HRESULT ?ReadRaw (htStartTime, htEndTime, dwNumValues, bBounds, dwNumItems, phServer, ppItemValues, ppErrors)
此函數(shù)從歷史數(shù)據(jù)庫中讀取一個或多個項目的指定時域的值、質(zhì)量和時間戳。當(dāng)bBounds為TRUE時,將返回時域的邊界值。此功能旨在供希望在歷史記錄中保存實際數(shù)據(jù)的客戶使用。實際數(shù)據(jù)可以被壓縮,或者可以是為項目收集的所有數(shù)據(jù),這取決于歷史記錄和保存項目值時調(diào)用的存儲規(guī)則。提供可選的邊界值以允許客戶端在對顯示器上的實際數(shù)據(jù)進(jìn)行趨勢分析時對開始和結(jié)束時間的值進(jìn)行插值。
請求的時域由htStartTime、htEndTime和dwNumValues定義;必須至少指定其中兩個。如果htEndTime小于htStartTime,或者只指定了htEndTime和dwNumValues,則數(shù)據(jù)將以相反的順序返回,后面的數(shù)據(jù)將先返回。如果指定了這三個值,則調(diào)用將根據(jù)htStartTime和htEndTime的相對值以升序或降序返回從htStartTime到htEndTime最多dwNumValues的結(jié)果。如果dwNumValues為0,則返回該范圍內(nèi)的所有值。OPCHDA_TIME的空值用于指示未指定htStartTime或htEndTime。
如果htStartTime或htEndTime是以字符串(相對)格式給出的,則OPCHDA_time結(jié)構(gòu)的絕對時間(ftTime)應(yīng)設(shè)置為FILETIME,該FILETIME是服務(wù)器將相對時間轉(zhuǎn)換為的。
特別允許htStartTime和htEndTime相同。這允許客戶端只請求一個值。如果請求的時域超出服務(wù)器的范圍,則特別不允許服務(wù)器返回E_INVALIDARG。這種情況應(yīng)視為不存在數(shù)據(jù)的區(qū)間。
如果在該時間范圍內(nèi)存在多個dwNumValues結(jié)果,則該ItemID的ppErrors條目應(yīng)為OPC_S_MOREDATA。當(dāng)返回OPC_S_MOREDATA時,想要下一個dwNumValues值的客戶端應(yīng)再次調(diào)用ReadRaw,并將為該項返回的最舊值的時間戳作為新的htStartTime,同時保持htEndTime的原始值不變(如果需要相反的順序,則反轉(zhuǎn)htStartTime和htEndTime)。請注意,第二次調(diào)用將返回上一次調(diào)用中最后一個值的副本。
如果請求了邊界值,并且指定了非零的dwNumValues,則返回的任何邊界值都將包含在dwNumValue計數(shù)中。如果dwNumValues為1,則只返回起始邊界(如果需要相反的順序,則返回結(jié)束邊界)。如果dwNumValues為2,則返回數(shù)據(jù)點和起始邊界(如果需要相反的順序,則返回結(jié)束邊界)。
當(dāng)請求邊界值但未找到邊界值時,ppItemValues中相應(yīng)的數(shù)組元素的質(zhì)量將為OPCHDA_NOBOUND,時間戳等于開始或結(jié)束時間(視情況而定),VARIANT的值為VT_EMPTY。在歷史中查找邊界值的前后距離取決于服務(wù)器。
如果只指定了htStartTime或htEndTime中的一個,并且指定了非零的dwNumValues,則歷史上的最后一個值被視為結(jié)束界限(如果需要相反的順序,則為開始界限)。
對于不存在數(shù)據(jù)的間隔,如果未請求或未找到邊界值,則相應(yīng)的ppErrors應(yīng)為OPC_S_NODATA,而OPCHDA_Item的dwCount應(yīng)為0。如果請求了邊界值并且其中一個或兩個都存在,則ppError返回為S_OK,并返回邊界值。當(dāng)然,如果任何ppError代碼不是S_OK,則返回給客戶端的HRESULT必須是S_FALSE。
?
2)HRESULT ?ReadProcessed (htStartTime, htEndTime, ftResampleInterval, dwNumItems, phServer, haAggregate, ppItemValues, ppErrors)
該方法可選。
該方法在標(biāo)準(zhǔn)的v1.0和v1.1之間進(jìn)行了更改,以將haAggregate作為DWORD而非ENUM傳遞,從而允許供應(yīng)商指定自己的聚合。使用該標(biāo)準(zhǔn)v1.0構(gòu)建的服務(wù)器和客戶端將與使用v1.1構(gòu)建的服務(wù)器或客戶端協(xié)同工作,但v1.0客戶端可能與返回供應(yīng)商指定聚合的v1.1服務(wù)器不兼容。
此函數(shù)根據(jù)歷史數(shù)據(jù)庫中一個或多個項目的指定時域的數(shù)據(jù)計算聚合值、質(zhì)量和時間戳。時域被劃分為持續(xù)時間為ftResampleInterval的子區(qū)間。通過使用下一個ftResampleInterval中的數(shù)據(jù),為以htStartTime開始的每個子區(qū)間計算指定的haAggregate。
此函數(shù)旨在提供相對于重采樣間隔計算的值。例如,當(dāng)ftResampleInterval為1小時時,此函數(shù)可以為指定時域內(nèi)的每個項目提供每小時統(tǒng)計信息,如Maximum、Minimum、Average等。
請求的域由htStartTime、htEndTime和htResampleInterval定義。如果htStartTime或htEndTime是以字符串(相對)格式給定的,則返回的值應(yīng)為服務(wù)器將該值轉(zhuǎn)換為的FILETIME。必須指定這三個。如果htEndTime小于htStartTime,則應(yīng)以相反的順序返回數(shù)據(jù),后面的數(shù)據(jù)優(yōu)先。如果htStartTime和htEndTime相同,則服務(wù)器應(yīng)返回E_INVALIDARG,因為沒有任何有意義的方法來解釋這種情況。
用于計算每個子區(qū)間的聚合的值應(yīng)包括正好落在子區(qū)間開始的時間戳上的任何值,但不應(yīng)包括直接落在子間隔結(jié)束的時間戳的任何值。因此,每個值在計算中只能包含一次。如果時域的順序相反,我們認(rèn)為較晚的時間戳是子區(qū)間的開始時間,較早的時間戳則是子區(qū)間結(jié)束時間。請注意,這意味著簡單地交換開始和結(jié)束時間不會導(dǎo)致以相反的順序返回相同的值,因為在這兩種情況下請求的子區(qū)間不相同。
如果計算的最后一個子區(qū)間不是完整的子區(qū)間(請求的時域不能被重新采樣間隔整除),則返回的最后一個聚合應(yīng)基于該不完整的子間隔,并且聚合的質(zhì)量應(yīng)為OPCHDA_PARTIAL。
對于MinimumActualTime和MaximumActualTime,如果一個子區(qū)間內(nèi)存在多個值實例,則返回的值實例(時間戳)取決于服務(wù)器。在任何情況下,服務(wù)器可以設(shè)置OPCHDA_EXTRADATA質(zhì)量標(biāo)志,以使呼叫者知道存在具有該值的其他時間戳。
要獲得同一項目的多個聚合,請在每個所需聚合的項目列表中包含服務(wù)器項目句柄。
如果htResampleInterval為0,則服務(wù)器應(yīng)為整個時間范圍創(chuàng)建一個聚合值。這允許在長時間內(nèi)進(jìn)行聚合。時間戳等于htEndTime的值將從該聚合中排除,就像它將從具有該結(jié)束時間的子區(qū)間中排除一樣。
與聚合一起返回的時間戳應(yīng)為間隔開始時的時間,除非聚合指定了不同的值。此外,如果聚合所依據(jù)的所有值的質(zhì)量均為良好,則聚合返回的質(zhì)量應(yīng)為良好(見OPC數(shù)據(jù)訪問標(biāo)準(zhǔn))。如果這些值中的任何一個具有任何其他質(zhì)量,則聚合的質(zhì)量應(yīng)為亞正常(0x010110xx)。
如果時域中的任何子區(qū)間中不存在給定項的數(shù)據(jù),則服務(wù)器應(yīng)在該項的ppErrors數(shù)組中返回OPC_S_NODATA,并且相應(yīng)的ppItemValues結(jié)構(gòu)的dwCount應(yīng)為0。
如果該項的至少一個子區(qū)間中確實存在數(shù)據(jù),則服務(wù)器應(yīng)返回時域中每個子區(qū)間的時間戳、質(zhì)量和值。對于沒有數(shù)據(jù)的每個子區(qū)間,服務(wù)器應(yīng)返回該子區(qū)間的VT_EMPTY值和OPCHDA_NODATA質(zhì)量,并帶有適當(dāng)?shù)臅r間戳。如果聚合的時間戳基于數(shù)據(jù),則為OPCHDA_NODATA返回的時間戳應(yīng)為間隔開始的時間戳。
注:供應(yīng)商定義的聚合在子區(qū)間中是否包含后緣值方面可能具有不同的行為。預(yù)計服務(wù)器供應(yīng)商將清楚地記錄其供應(yīng)商特定聚合的行為,以便客戶端知道每個聚合中包含哪些值。
?
3)HRESULT ?ReadAtTime (dwNumTimeStamps, ftTimeStamps, dwNumItems, phServer, ppItemValues, ppErrors)
此函數(shù)從歷史數(shù)據(jù)庫中讀取一個或多個項目的指定時間戳的值和質(zhì)量。此函數(shù)旨在提供與具有已知時間戳的其他值相關(guān)的值。例如,收集實驗室樣本時傳感器的值。
返回的值和質(zhì)量的順序應(yīng)與請求中提供的時間戳的順序相匹配。
當(dāng)指定的時間戳不存在值時,應(yīng)從周圍的值中插入一個值,以表示指定時間戳的值。
OPCHDA_ITEM結(jié)構(gòu)將在haAggregate字段中返回OPCHDA_NOAGGREGATE。
如果找到指定時間戳的值,服務(wù)器將在質(zhì)量中設(shè)置OPCHDA_RAW位。如果該值是根據(jù)周圍的值進(jìn)行插值的,則服務(wù)器將在質(zhì)量中設(shè)置OPCHDA_interpolated位。
?
?
4)HRESULT ?ReadModified(htStartTime, htEndTime, dwNumValues, dwNumItems, phServer, ppItemValues, ppErrors)
此函數(shù)從歷史數(shù)據(jù)庫中讀取一個或多個項目的指定時域的修改值、質(zhì)量、時間戳、用戶ID和時間戳。如果ReadRaw、ReadProcessed或ReadAtTime返回的質(zhì)量為OPCHDA_EXTRADATA,表示存在被取代的值,則此函數(shù)將允許您查看被取代的那些值。此函數(shù)只讀取已修改/替換或刪除的值。這是接口上的一個可選方法。
請求的域由htStartTime、htEndTime和dwNumValues定義;必須至少指定其中兩個。如果htEndTime小于htStartTime,或者只指定了htEndTime和dwNumValues,則應(yīng)以相反的順序返回數(shù)據(jù),后面的數(shù)據(jù)優(yōu)先。如果指定了這三個值,則調(diào)用應(yīng)根據(jù)StartTime和EndTime的相對值以升序或降序返回從StartTime到EndTime的最多dwNumValues結(jié)果。如果在該時間范圍內(nèi)存在多個dwNumValues結(jié)果,則該ItemID的ppErrors條目應(yīng)為OPC_S_MOREDATA。如果dwNumValues為0,則返回該范圍內(nèi)的所有值。
如果一個值被修改了多次,則會返回該時間的所有值。這意味著時間戳可以多次出現(xiàn)在數(shù)組中。具有相同時間戳的返回值的順序應(yīng)該是從最近修改值到最舊修改值。是否保留多次修改或僅保留最近的修改取決于服務(wù)器。
?
5)HRESULT ?ReadAttribute (htStartTime, htEndTime, hServer, dwNumAttributes, pdwAttributeIDs, ppAttributeValues, ppErrors)
此函數(shù)從歷史數(shù)據(jù)庫中讀取項目指定時域的屬性值和時間戳。如果需要屬性的當(dāng)前值,則htStartTime應(yīng)設(shè)置為“NOW”,htEndTime應(yīng)為NULL。
此函數(shù)用于檢索已更改的屬性,以便將這些屬性的值與其數(shù)據(jù)的值關(guān)聯(lián)起來。例如,傳感器的重新校準(zhǔn)可能需要改變正常的最大和最小屬性。
如果項目唯一可用的屬性值是當(dāng)前值,則應(yīng)返回這些值,并將ppError設(shè)置為OPC_S_CURRENTVALUE。
除了請求當(dāng)前值(htStartTime=NOW,htEndTime=NULL)的情況外,服務(wù)器應(yīng)始終返回一個起始邊界值。因此,如果客戶端請求1997年1月1日至1997年10月1日的屬性值,則服務(wù)器應(yīng)在1997年1日返回該屬性的值,而不是返回的第一個值是1997年1月份1日之后該屬性的第一個新值。同樣,第一個值的時間戳應(yīng)為1997年1月1日,而不管屬性實際何時取該值。所有其他時間戳應(yīng)為屬性值發(fā)生變化的時間。
請注意,雖然客戶端可以向服務(wù)器查詢ItemID的本機數(shù)據(jù)類型,但客戶端不能假設(shè)從服務(wù)器發(fā)送的所有數(shù)據(jù)都是該數(shù)據(jù)類型。給定ItemID的數(shù)據(jù)類型可能在Item的使用壽命內(nèi)發(fā)生了變化,因此客戶端應(yīng)該能夠處理接收與此調(diào)用返回的數(shù)據(jù)類型不同的數(shù)據(jù)類型的數(shù)據(jù)。
未完待續(xù)。更多通信資源請登錄網(wǎng)信智匯(wangxinzhihui.com)。