मैं एक लाभदायक इतिहासकार/iHistorian से कच्चे समय-श्रृंखला डेटा कैसे प्राप्त कर सकता हूं?मैं एक लाभकारी इतिहासकार से कच्चे डेटा से कैसे पूछूं?
आदर्श रूप से, मैं दो तिथियों के बीच किसी विशेष टैग के लिए डेटा मांगूंगा।
मैं एक लाभदायक इतिहासकार/iHistorian से कच्चे समय-श्रृंखला डेटा कैसे प्राप्त कर सकता हूं?मैं एक लाभकारी इतिहासकार से कच्चे डेटा से कैसे पूछूं?
आदर्श रूप से, मैं दो तिथियों के बीच किसी विशेष टैग के लिए डेटा मांगूंगा।
कई अलग-अलग नमूने मोड हैं जिनके साथ आप प्रयोग कर सकते हैं।
ये मोड निम्न API के सभी का उपयोग कर उपलब्ध हैं।
इनमें से प्रवृत्ति नमूना मोड शायद आप चाहते हैं क्योंकि यह विशेष रूप से चार्टिंग/प्रवृत्ति के लिए डिज़ाइन किया गया है। हालांकि, प्रयोगशाला और इंटरपोलेटेड भी उपयोगी हो सकता है।
प्रत्येक नमूना मोड पर अधिक जानकारी के लिए इलेक्ट्रॉनिक पुस्तक पढ़ें। मेरी मशीन पर इसे C:\Program Files\GE Fanuc\Proficy Historian\Docs\iHistorian.chm
के रूप में संग्रहीत किया गया है और मेरे पास संस्करण 3.5 स्थापित है। निम्नलिखित खंडों पर विशेष ध्यान दें।
यहां बताया गया है कि आप प्रवृत्ति नमूना करने के लिए ओएलडीडीबी कैसे बना सकते हैं।
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 का उपयोग बराबर तरीकों दिखा जटिल (उपयोगकर्ता एपीआई के साथ इतना अधिक) के बाद से वे कोड में पाइपलाइन का एक बहुत आवश्यकता होती है सेटअप मिल रहे हैं। क्लाइंट एक्सेस एपीआई नया है और दृश्यों के पीछे डब्ल्यूसीएफ का उपयोग करता है।
वैसे, ओएलडीडीबी विधि के साथ कुछ सीमाएं हैं।
मेरा एक सहकर्मी इस एक साथ रखा:
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];
}
}
अद्यतन:
यह अच्छी तरह से काम किया लेकिन हम उन टैग्स के साथ एक समस्या में भाग गए जो अक्सर अद्यतन नहीं होते हैं। अगर टैग अनुरोधित स्टार्टडेट और एंडडेट के प्रारंभ या समाप्ति के पास अपडेट नहीं हुआ है, तो रुझान खराब दिखेंगे। इससे भी बदतर, अभी भी ऐसे मामले थे जहां अनुरोध किए गए विंडो के दौरान कोई स्पष्ट बिंदु नहीं था - हमें कोई डेटा वापस नहीं मिला।
मैं तीन प्रश्नों बनाकर इस समाधान किया गया: से पहले
यह करने के लिए यह एक संभावित अक्षम तरीका है लेकिन यह काम करता है:
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];
}
}
और हाँ, मुझे पता है, उन प्रश्नों को पैरामीटरकृत किया जाना चाहिए।
ओएलई बहुत धीमी है। एपीआई का उपयोग करने से बेहतर प्रदर्शन होता है, आप एक्सटेंशन विधियों को भी लिख सकते हैं जो आपको ओएलई बॉक्स से अधिक समर्थन देने की अनुमति देते हैं। – rolls
कोई नमूने वापस पाने के संबंध में आप समय के बजाय "ReadSamplesByCount" कर सकते हैं, इस तरह आप कम से कम 1 नमूना वापस प्राप्त करते हैं। यदि नमूने के कई नमूने नहीं हैं तो नमूना उस समय अवधि के बाद हो सकता है जब आप प्रदर्शित करना चाहते हैं। – rolls
माइकल - आईपी 21 में एक "इंटरपोलेटेड" तालिका है, साथ ही "वास्तविक" डेटा बिंदु तालिका भी है। क्या प्रोफेसी के पास भी है?
@reallyJim मुझे विश्वास है कि वे करते हैं, हालांकि, मेरे मामले में मुझे कच्चे डेटा की आवश्यकता है –
मैं कुछ साल पहले पीआई सिस्टम के साथ एक ही चीज़ में भाग गया था, इसलिए मुझे तुम्हारा दर्द महसूस होता है! – reallyJim
हम एक आवरण 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 के लिए फ़ंक्शन हेडर शामिल हैं।
मुझे बहुत देर हो चुकी है, लेकिन कभी भी देर से बेहतर नहीं है। इसके अलावा, एसओ पर पुराने प्रश्नों का उत्तर देना मेरी शैली की तरह है। –
मेरे पास अभी यह परीक्षण करने का समय नहीं है, लेकिन यह वही है जो मैंने शुरू किया था जब मैंने शुरू किया था। धन्यवाद! क्या आप मौका दे सकते हैं कि ईबुक आमतौर पर कहां स्थित है? –
इस तरह से पिछला वैल्यू जैसे इतिहास में निर्मित कार्यों का उपयोग करने के बारे में कोई विचार? क्या ओल्डब ऐसा कर सकता है? चुनिंदा "टाइमस्टैम्प, पिछलावैल (समय, टैगनाम) की रेखाओं के साथ कुछ ..." – xdumaine