كيف يمكنني الاستعلام عن البيانات الخام من Proficy مؤرخ?

StackOverflow https://stackoverflow.com/questions/306642

  •  08-07-2019
  •  | 
  •  

سؤال

كيف يمكنني استرداد الخام بيانات سلسلة زمنية من Proficy مؤرخ/iHistorian?

من الناحية المثالية, وأود أن أسأل عن البيانات معين الوسم بين تاريخين.

هل كانت مفيدة؟

المحلول

هناك عدة طرق أخذ العينات يمكنك تجربة مع.

  • الخام
  • محرف
  • مختبر
  • الاتجاه
  • تحسب

هذه وسائط المتاحة باستخدام كل من التالية واجهات برمجة التطبيقات.

  • المستخدم API (ihuapi.dll)
  • SDK (ihsdk.dll)
  • OLEDB (iholedb.dll)
  • العميل رصا API (Proficy.مؤرخ.ClientAccess.API)

هذه الاتجاه أخذ العينات الوضع هو على الارجح ما تريد نظرا لأنها مصممة خصيصا رسم/تتجه.على الرغم من المختبر و محرف قد تكون مفيدة أيضا.

قراءة الكتاب الإلكتروني للحصول على مزيد من المعلومات على كل العينات الوضعية.على الجهاز الخاص بي هو تخزين C:\Program Files\GE Fanuc\Proficy Historian\Docs\iHistorian.chm و لدي نسخة 3.5 تثبيت.إيلاء اهتمام خاص إلى الأقسام التالية.

  • باستخدام مؤرخ OLE DB
  • موضوعات متقدمة | استرجاع

هنا هو كيف يمكنك بناء OLEDB للقيام الاتجاه أخذ العينات.

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'

تبين ما يعادل أساليب استخدام المستخدم API SDK معقدة (أكثر من ذلك مع المستخدم API) لأنها تتطلب الكثير من السباكة في رمز للحصول على برنامج الإعداد.العميل الوصول إلى API هو أحدث استخدامات رأس المال العامل وراء الكواليس.

بالمناسبة, هناك عدد قليل من القيود مع OLEDB الأسلوب على الرغم من.

  • رغم ما وتقول الوثائق لدي أبدا كان قادرا على الحصول على الأم استعلام معلمات للعمل.هذا هو رقصة إذا كنت ترغب في استخدامه مع خدمات SQL Server التقرير على سبيل المثال.
  • لا يمكنك إرسال عينات إلى الأرشيف أو في أي طريقة إجراء تغييرات على مؤرخ التكوين بما في ذلك إضافة/تغيير العلامات, كتابة الرسائل, الخ.
  • يمكن أن تكون بطيئة بعض الشيء في بعض الحالات.
  • وقد لا ينص على crosstabbing متعددة tagnames في الأعمدة ومن ثم المضي قدما العينات بحيث توجد قيمة لكل الزمني وعلامة الجمع.الاتجاه أخذ العينات وضع يحصل لك هناك في منتصف الطريق, ولكن لا يزال لا جدولي ولا في الواقع تحميل عينات الخام.ثم مرة أخرى المستخدم API SDK لا تستطيع أن تفعل هذا أيضا.

نصائح أخرى

زميل لي وضع هذا معا:

في شبكة الإنترنت.التكوين:

<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];
    }
}

تحديث:

هذا يعمل جيدا ولكن واجهتنا مشكلة مع الكلمات التي لا تحديث في كثير من الأحيان.أنا لم تحديث قرب بداية أو نهاية طلبت startDate و endDate الاتجاهات تبدو سيئة.أسوأ من ذلك ، لا تزال الحالات التي لا توجد فيها صريح نقطة خلال النافذة المطلوبة--كنا الحصول على أي بيانات.

لقد حل هذا عن طريق اتخاذ ثلاث استفسارات:

  1. القيمة السابقة قبل بداية تاريخ
  2. النقاط بين startDate و endDate
  3. القيمة التالية بعد على endDate

هذا هو يحتمل أن تكون غير فعالة طريقة للقيام بذلك ولكن يعمل:

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];
    }
}

و نعم أنا أعلم تلك الأسئلة يجب أن تكون ذات معلمات.

ومايكل - في IP21 هناك "محرف" الجدول، فضلا عن "الفعلي" جدول نقطة البيانات. هل Proficy يكون ذلك كذلك؟

وكتبنا DLL المجمع الذي يشبه هذا مثل هذا:

[DllImport("IHUAPI.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "ihuReadRawDataByTime@24")]
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 عند بدء التشغيل لذا عليك أن تفعل أشياء مثل حيوي تحميل / تفريغ DLL بحيث التطبيقات الأخرى لا تحطم الطائرة. فعلنا ذلك عن طريق حذف / إضافة مفاتيح التسجيل على الطاير.

وآخر واحد هو إذا كنت استطلاع 10،000 العينات و1 من معطوبة أنها سوف تسقط جميع العينات 10،000 العينات. تحتاج إلى تنفيذ معالج البيانات السيئة التي ستبدأ في أي جانب من البيانات السيئة وزيادة في خطوات للحصول على كل البيانات جانبي عينة سيئة.

وهناك العديد من ملفات C رأس التي تحتوي على كل رموز الخطأ ورأس ظيفة للDLL.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top