2008-11-20 23 views
13

मैं एक लाभदायक इतिहासकार/iHistorian से कच्चे समय-श्रृंखला डेटा कैसे प्राप्त कर सकता हूं?मैं एक लाभकारी इतिहासकार से कच्चे डेटा से कैसे पूछूं?

आदर्श रूप से, मैं दो तिथियों के बीच किसी विशेष टैग के लिए डेटा मांगूंगा।

उत्तर

13

कई अलग-अलग नमूने मोड हैं जिनके साथ आप प्रयोग कर सकते हैं।

  • कच्चे
  • अंतर्वेशित
  • लैब
  • रुझान
  • परिकलित

ये मोड निम्न API के सभी का उपयोग कर उपलब्ध हैं।

  • उपयोगकर्ता एपीआई (ihuapi.dll)
  • एसडीके (ihsdk.dll)
  • OLEDB (iholedb.dll)
  • ग्राहक Acess एपीआई (Proficy.Historian.ClientAccess।एपीआई)

इनमें से प्रवृत्ति नमूना मोड शायद आप चाहते हैं क्योंकि यह विशेष रूप से चार्टिंग/प्रवृत्ति के लिए डिज़ाइन किया गया है। हालांकि, प्रयोगशाला और इंटरपोलेटेड भी उपयोगी हो सकता है।

प्रत्येक नमूना मोड पर अधिक जानकारी के लिए इलेक्ट्रॉनिक पुस्तक पढ़ें। मेरी मशीन पर इसे C:\Program Files\GE Fanuc\Proficy Historian\Docs\iHistorian.chm के रूप में संग्रहीत किया गया है और मेरे पास संस्करण 3.5 स्थापित है। निम्नलिखित खंडों पर विशेष ध्यान दें।

  • इतिहासकार OLE DB प्रदाता का उपयोग करना
  • उन्नत विषय | पुनर्प्राप्ति

यहां बताया गया है कि आप प्रवृत्ति नमूना करने के लिए ओएलडीडीबी कैसे बना सकते हैं।

set 
    SamplingMode = 'Trend', 
    StartTime = '2010-07-01 00:00:00', 
    EndTime = '2010-07-02 00:00:00', 
    IntervalMilliseconds = 1h 
select 
    timestamp, 
    value, 
    quality 
from 
    ihRawData 
where 
    tagname = 'YOUR_TAG' 

उपयोगकर्ता एपीआई और SDK का उपयोग बराबर तरीकों दिखा जटिल (उपयोगकर्ता एपीआई के साथ इतना अधिक) के बाद से वे कोड में पाइपलाइन का एक बहुत आवश्यकता होती है सेटअप मिल रहे हैं। क्लाइंट एक्सेस एपीआई नया है और दृश्यों के पीछे डब्ल्यूसीएफ का उपयोग करता है।

वैसे, ओएलडीडीबी विधि के साथ कुछ सीमाएं हैं।

    क्या प्रलेखन कहता है कि मैं कभी नहीं देशी क्वेरी पैरामीटर काम करने के लिए प्राप्त करने में सक्षम हो गया है के बावजूद
  • । यदि आप उदाहरण के लिए SQL सर्वर रिपोर्टिंग सेवाओं के साथ इसका उपयोग करना चाहते हैं तो यह एक शोस्टॉपर है।
  • आप संग्रह में नमूने नहीं लिख सकते हैं या किसी भी तरह से इतिहासकार कॉन्फ़िगरेशन में परिवर्तन/टैग बदलना, संदेश लिखना आदि शामिल कर सकते हैं
  • कुछ मामलों में यह थोड़ा धीमा हो सकता है।
  • इसमें कॉलम में एकाधिक टैगनामों को क्रॉसस्टैब करने और फिर नमूने आगे बढ़ाने के लिए कोई प्रावधान नहीं है ताकि प्रत्येक टाइमस्टैम्प और टैग संयोजन के लिए एक मान मौजूद हो। प्रवृत्ति नमूना मोड आपको आधे रास्ते में ले जाता है, लेकिन फिर भी क्रॉसस्टैब नहीं होता है और वास्तव में कच्चे नमूनों को लोड नहीं करता है। फिर फिर उपयोगकर्ता एपीआई और एसडीके यह भी नहीं कर सकते हैं।
+0

मुझे बहुत देर हो चुकी है, लेकिन कभी भी देर से बेहतर नहीं है। इसके अलावा, एसओ पर पुराने प्रश्नों का उत्तर देना मेरी शैली की तरह है। –

+0

मेरे पास अभी यह परीक्षण करने का समय नहीं है, लेकिन यह वही है जो मैंने शुरू किया था जब मैंने शुरू किया था। धन्यवाद! क्या आप मौका दे सकते हैं कि ईबुक आमतौर पर कहां स्थित है? –

+0

इस तरह से पिछला वैल्यू जैसे इतिहास में निर्मित कार्यों का उपयोग करने के बारे में कोई विचार? क्या ओल्डब ऐसा कर सकता है? चुनिंदा "टाइमस्टैम्प, पिछलावैल (समय, टैगनाम) की रेखाओं के साथ कुछ ..." – xdumaine

4

मेरा एक सहकर्मी इस एक साथ रखा:

web.config में:

<add name="HistorianConnectionString" 
    providerName="ihOLEDB.iHistorian.1" 
    connectionString=" 
     Provider=ihOLEDB.iHistorian; 
     User Id=; 
     Password=; 
     Data Source=localhost;" 
/> 

डेटा परत में:

public DataTable GetProficyData(string tagName, DateTime startDate, DateTime endDate) 
{ 
    using (System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection()) 
    { 
     cn.ConnectionString = webConfig.ConnectionStrings.ConnectionStrings["HistorianConnectionString"]; 
     cn.Open(); 

     string queryString = string.Format(
       "set samplingmode = rawbytime\n select value as theValue,Timestamp from ihrawdata where tagname = '{0}' AND timestamp between '{1}' and '{2}' and value > 0 order by timestamp", 
       tagName.Replace("'", "\""), startDate, endDate); 

     System.Data.OleDb.OleDbDataAdapter adp = new System.Data.OleDb.OleDbDataAdapter(queryString, cn); 
     DataSet ds = new DataSet(); 

     adp.Fill(ds); 
     return ds.Tables[0]; 
    } 
} 

अद्यतन:

यह अच्छी तरह से काम किया लेकिन हम उन टैग्स के साथ एक समस्या में भाग गए जो अक्सर अद्यतन नहीं होते हैं। अगर टैग अनुरोधित स्टार्टडेट और एंडडेट के प्रारंभ या समाप्ति के पास अपडेट नहीं हुआ है, तो रुझान खराब दिखेंगे। इससे भी बदतर, अभी भी ऐसे मामले थे जहां अनुरोध किए गए विंडो के दौरान कोई स्पष्ट बिंदु नहीं था - हमें कोई डेटा वापस नहीं मिला।

मैं तीन प्रश्नों बनाकर इस समाधान किया गया: से पहले

  1. पिछले मान आरंभ-तिथि
  2. ENDDATE के बाद StartDate और EndDate
  3. अगले मूल्य के बीच अंक

यह करने के लिए यह एक संभावित अक्षम तरीका है लेकिन यह काम करता है:

public DataTable GetProficyData(string tagName, DateTime startDate, DateTime endDate) 
{ 
    DataSet ds = new DataSet(); 
    string queryString; 
    System.Data.OleDb.OleDbDataAdapter adp; 

    using (System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection()) 
    { 
     cn.ConnectionString = proficyConn.ConnectionString; 
     cn.Open(); 

     // always get a start value 
     queryString = string.Format(
      "set samplingmode = lab\nselect value as theValue,Timestamp from ihrawdata where tagname = '{0}' AND timestamp between '{1}' and '{2}' order by timestamp", 
      tagName.Replace("'", "\""), startDate.AddMinutes(-1), startDate); 
     adp = new System.Data.OleDb.OleDbDataAdapter(queryString, cn); 
     adp.Fill(ds); 

     // get the range 
     queryString = string.Format(
      "set samplingmode = rawbytime\nselect value as theValue,Timestamp from ihrawdata where tagname = '{0}' AND timestamp between '{1}' and '{2}' order by timestamp", 
      tagName.Replace("'", "\""), startDate, endDate); 
     adp = new System.Data.OleDb.OleDbDataAdapter(queryString, cn); 
     adp.Fill(ds); 

     // always get an end value 
     queryString = string.Format(
      "set samplingmode = lab\nselect value as theValue,Timestamp from ihrawdata where tagname = '{0}' AND timestamp between '{1}' and '{2}' order by timestamp", 
     tagName.Replace("'", "\""), endDate.AddMinutes(-1), endDate); 
     adp = new System.Data.OleDb.OleDbDataAdapter(queryString, cn); 
     adp.Fill(ds); 

     return ds.Tables[0]; 
    } 
} 

और हाँ, मुझे पता है, उन प्रश्नों को पैरामीटरकृत किया जाना चाहिए।

+0

ओएलई बहुत धीमी है। एपीआई का उपयोग करने से बेहतर प्रदर्शन होता है, आप एक्सटेंशन विधियों को भी लिख सकते हैं जो आपको ओएलई बॉक्स से अधिक समर्थन देने की अनुमति देते हैं। – rolls

+0

कोई नमूने वापस पाने के संबंध में आप समय के बजाय "ReadSamplesByCount" कर सकते हैं, इस तरह आप कम से कम 1 नमूना वापस प्राप्त करते हैं। यदि नमूने के कई नमूने नहीं हैं तो नमूना उस समय अवधि के बाद हो सकता है जब आप प्रदर्शित करना चाहते हैं। – rolls

0

माइकल - आईपी 21 में एक "इंटरपोलेटेड" तालिका है, साथ ही "वास्तविक" डेटा बिंदु तालिका भी है। क्या प्रोफेसी के पास भी है?

+0

@reallyJim मुझे विश्वास है कि वे करते हैं, हालांकि, मेरे मामले में मुझे कच्चे डेटा की आवश्यकता है –

+0

मैं कुछ साल पहले पीआई सिस्टम के साथ एक ही चीज़ में भाग गया था, इसलिए मुझे तुम्हारा दर्द महसूस होता है! – reallyJim

0

हम एक आवरण DLL है कि इस तरह इस तरह देखा लिखा है:

[DllImport("IHUAPI.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "[email protected]")] 
public static extern int ihuReadRawDataByTime(int serverhandle, string tagname, ref IHU_TIMESTAMP startTime, ref IHU_TIMESTAMP endTime, ref int noOfSamples, ref IHU_DATA_SAMPLE* dataValues); 
... 
private int _handle; 

public HistorianTypes.ErrorCode ReadRawByTime(string tagName, DateTime startTime, DateTime endTime, 
               out double[] timeStamps, out double[] values, out IhuComment [] comments) 
{ 
    var startTimeStruct = new IhuApi.IHU_TIMESTAMP(); //Custom datetime to epoch extension method 
    var endTimeStruct = new IhuApi.IHU_TIMESTAMP(); 

    int lRet = 0; 
    int noOfSamples = 0; 
    startTimeStruct = DateTimeToTimeStruct(dstZone.ToUniversalTime(startTime)); 
    endTimeStruct = DateTimeToTimeStruct(dstZone.ToUniversalTime(endTime)); 
    IhuApi.IHU_DATA_SAMPLE* dataSample = (IhuApi.IHU_DATA_SAMPLE*)new IntPtr(0); 

    try { 
     lRet = IhuApi.ihuReadRawDataByTime 
      (
       _handle, // the handle returned from the connect 
       tagName, // the single tagname to retrieve 
       ref startTimeStruct, // start time for query 
       ref endTimeStruct, // end time for query 
       ref noOfSamples, // will be set by API 
       ref dataSample // will be allocated and populated in the user API 
      ); 
      .... 

कुछ नोट कि iFIX यदि DLL स्टार्टअप पर लोड किया जाता है ताकि आप गतिशील/अनलोड लोड की तरह कार्य करने की आवश्यकता की जाँच करेगा कर रहे हैं डीएलएल ताकि अन्य अनुप्रयोग क्रैश न हों। हमने फ्लाई पर रजिस्ट्री कुंजियों को हटाकर/जोड़कर ऐसा किया।

एक और यह है कि यदि आप 10,000 नमूने मतदान करते हैं और नमूने में से 1 दूषित हो जाते हैं तो यह सभी 10,000 नमूने छोड़ देगा। आपको एक खराब डेटा हैंडलर को लागू करने की आवश्यकता है जो खराब डेटा के दोनों तरफ से शुरू होगा और खराब डेटा के सभी डेटा को प्राप्त करने के लिए चरणों में वृद्धि होगी।

कई सी शीर्षलेख फ़ाइलें हैं जिनमें सभी त्रुटि कोड और DLL के लिए फ़ंक्शन हेडर शामिल हैं।

संबंधित मुद्दे