Skip navigation
All Places > PI Developers Club > Blog > Authors hanyong
1 2 Previous Next

PI Developers Club

20 Posts authored by: hanyong Employee

PI Web Services 2012 added support for searching through PI AF for Elements, Attributes and Event Frames. These features are added in the IPISoap interface that is added only in this release. One parameter that is required in most of these new search methods in IPISoap is RootPath. This essential is used to identify which AF Server and Database you are searching in. If you want to be searching for a subtree instead of the whole database, then you can also use this to specify that. The problem is you might start specifying this path parameter like you would in any other PI System products, like \\myafserver\myafdatabase. But this would not be recognized as a valid path with PI Web Services.

 

The format for this RootPath parameter is somewhat similar to how you would specify a path to the AF Attribute for reading values in the previous releases.

 

Referencing our usual NuGreen demo AF Database as an example:

 

1307.PIWSPath001.jpg

 

Where the AF Server is piafserver and database name is afdb.

 

If you want to specify the AF Server and Database to search in, for finding Elements (IPISoap's FindElements method), it is:
af:\\<af server>\<af database>

 

Example:
af:\\piafserver\afdb

 

If you want to specify to search within a specific subtree or element, it is:
af:\\<af server>\<af database>\<path to af element>

 

For example, I only want the elements that fulfill the name criteria in the subtree under Houston, my path should be:
af:\\piafserver\afdb\NuGreen\Houston

 

You can use this simple code snippet for a console application to test this:

 
private void FindElement()
{
    PISoapServiceClient sClient = new PISoapServiceClient();
            
    ElementSearchConstraints constraints = new ElementSearchConstraints();
    constraints.AllowMatchOnDerivedTemplates = true;
    constraints.NameMask = "B-*";
    constraints.RootPath = @"af:\\piafserver\afdb";
    //constraints.RootPath = @"af:\\piafserver\afdb\NuGreen\Houston";

    ElementSearchManner manner = new ElementSearchManner();
    manner.FlatHierarchy = true;

    Element[] elements = sClient.FindElements(constraints, manner);

    foreach (Element e in elements)
       Console.WriteLine(e.Name);
    
}

For finding path of attributes through PI Web Services, you have to provide a Root Path as well. The difference that I've found out is that you cannot specify a path to just the database. Meaning you have to provide a path to a specific element or a subtree that you want to search:
af:\\<af server>\<af database>\<path to af element>

 

Examples:
af:\\piafserver\afdb\NuGreen
af:\\piarserver\afdb\NuGreen\Houston\Cracking Process\Equipment\B-210 

 

Here's a sample code snippet:

 
private static void FindAttribute()
{
    PISoapServiceClient sClient = new PISoapServiceClient();

    AttributeSearchConstraints constraints = new AttributeSearchConstraints();
    constraints.NameMask = "Process Feedrate";
    constraints.RootPath = @"af:\\piafserver\afdb\NuGreen";
    //constraints.RootPath = @"af:\\piafserver\afdb\NuGreen\Houston\Cracking Process\Equipment\B-210";

    AttributeSearchManner manner = new AttributeSearchManner();

    string[] attributepaths = sClient.FindAttributePaths(constraints, manner);

    foreach (string path in attributepaths)
        Console.WriteLine(path);
}

If you are searching for Event Frames instead, replace "af:" with "ef:", like:
ef:\\<af server>\<af database>

 

The reason for using the "ef:" prefix is because for searching Event Frames, PI Web Services is expecting a path to an event frame instead of a element or attribute for the RootPath parameter. This is because you can have setup hierarchy for your events like batch, unit-batch and sub-batch. The RootPath parameter is for you to specify which event frame is the root event that the search runs through. To do that the path format should be:
ef:\\<af server>\<af database>\EventFrames[<name of event>] or
ef:\\<af server>\<af database>\EventFrames[{<GUID of event>}] 

 

As an example, here's some sample event frames created for this:

 

8372.PIWSPath002.jpg 

 

Note: If your AF server has Event Frame feature enabled, you can manually create event frames to test this.

 

If I want to find all event frames in the AF database, I can simply use the path:
ef:\\piafserver\afdb

 

But if what I want is limited to just the child event frame of Process Downtime 20130506 I can set the RootPath as:
ef:\\piafserver\afdb\EventFrames[Process Downtime 20130506]

 

Again a simple code snippet:

 
private static void FindEventFrames()
{
    PISoapServiceClient sClient = new PISoapServiceClient();

    EventFrameSearchConstraints constraints = new EventFrameSearchConstraints();
    constraints.NameMask = "*";
    constraints.RootPath = @"ef:\\piafserver\afdb";
    //constraints.RootPath = @"ef:\\piafserver\afdb\EventFrames[Process Downtime 20130506]";
    constraints.RefElementNameMask = "*";
    constraints.SearchRootLevelOnly = false;
    constraints.Start = "*-30d";
    constraints.Template = null;

    EventFrameSearchManner manner = new EventFrameSearchManner();
    manner.UseName = true;

    EventFrame[] efs = sClient.FindEventFrames(constraints, manner);

    foreach(EventFrame ef in efs)
       Console.WriteLine(ef.Name);
}

Hopefully this quick introduction of the path format expected in PI Web Services will be helpful for you in using these new search methods introduced in PI Web Services 2012.

In PI SDK, there are PIData.UpdateValue and PIData.UpdateValues, which writes 1 value or multiple values to a specific tag respectively. However, very often I get questions from customers about how they can write values to multiple tags in a single function call. Something new in AF SDK 2012 are methods that allows us to write data to multiple tags or attributes being implemented. Hence this allows us to write values to multiple tags or attributes more effectively.

 

The 2 methods to do this are:

  • AFListData.UpdateValues (for writing to multiple attributes)
  • PIServer.UpdateValues (for writing to multiple PI tags)

Here’s simple code samples that do this:

 

For AFListData.UpdateValues:

 
public static void WriteValuesToAttributes()
{
    Random rand = new Random();
    PISystems afsdk = new PISystems();
    PISystem afserver = afsdk["Name of AF Server"];
  
    try
    {
        afserver.Connect();
          AFDatabase afdb = afserver.Databases["Name of AF Database"];
          AFElementTemplate template = afdb.ElementTemplates["Name of Element Template"];
          if (template != null && template.InstanceType == typeof(AFElement))
          {
               // find attributes from elements based on the template
               AFAttributeList attrlist = AFAttribute.FindElementAttributes(afdb, null, "", null, template, AFElementType.Any, "Energy - Current", null, TypeCode.Double, true, AFSortField.ID, AFSortOrder.Ascending, 100000);
               AFValues newvalues = new AFValues();
 
               // generate data for all the tags
               foreach (AFAttribute a in attrlist)
               {
                    AFValue newvalue = new AFValue(a, rand.NextDouble() * 100, new AFTime(DateTime.Now));
                    newvalues.Add(newvalue);
               }
                
               // write data using AFListData.UpdateValues
               AFErrors<AFValue> errors = AFListData.UpdateValues(newvalues, AFUpdateOption.Insert);
                
               if (errors != null && errors.HasErrors)
               {
                    Console.WriteLine("\nErrors returned from AFListData.UpdateValues:");
                
                    // Display Value errors
                    if (errors.Errors != null && errors.Errors.Count gt 0)
                    {
                         foreach (var item in errors.Errors)
                         {
                              Console.WriteLine(" AFValue '{0}': {1}", item.Key, item.Value);
                         }
                    }
                
               // Display PI Server error
               if (errors.PIServerErrors != null && errors.PIServerErrors.Count > 0)
               {
                    foreach (var item in errors.PIServerErrors)
                    {
                         Console.WriteLine(" AFValue '{0}': {1}", item.Key, item.Value);
                    }
               }
                
               // Display PI System errors
               if (errors.PISystemErrors != null && errors.PISystemErrors.Count > 0)
               {
                    foreach (var item in errors.PISystemErrors)
                    {
                         Console.WriteLine(" AFValue '{0}': {1}", item.Key, item.Value);
                    }
               }
          }
     }
     catch (Exception ex)
     {
          Console.WriteLine(ex.Message);
     }
}

 

 

For PIServer.UpdateValues:

 
public static void WriteValuesToPIPoint()
{
    Random rand = new Random();
    PIServers pisdk = new PIServers();
    PIServer piserver = pisdk["Name of PI Server"];
 
    try
    {
        piserver.Connect();
 
          // searching for tags based on a tagname filter
          PIPointQuery searchfilter = new PIPointQuery("tag", OSIsoft.AF.Search.AFSearchOperator.Equal, "CAP*");
        List<PIPointQuery> conditions = new List<PIPointQuery>();
        conditions.Add(searchfilter);

        PIPointList ptlist = new PIPointList(PIPoint.FindPIPoints(piserver, conditions, null));
 
        AFValues newvalues = new AFValues();
 
        // generate data for all the tags
        foreach (PIPoint p in ptlist)
        {
            AFValue newvalue = new AFValue(rand.NextDouble() * 100, new AFTime(DateTime.Now));
            newvalue.PIPoint = p;
            newvalues.Add(newvalue);
        }
 
        // write data using AFListData.UpdateValues
        AFErrors<AFValues> errors = piserver.UpdateValues(newvalues, AFUpdateOption.Insert);
 
        if (errors != null && errors.HasErrors)
        {
            Console.WriteLine("\nErrors returned from PIServer.UpdateValues:");
 
            // Display Value errors
            if (errors.Errors != null && errors.Errors.Count > 0)
            {
                foreach (var item in errors.Errors)
                {
                    Console.WriteLine("  AFValue '{0}': {1}", item.Key, item.Value);
                }
            }
 
            // Display PI Server error
            if (errors.PIServerErrors != null && errors.PIServerErrors.Count > 0)
            {
                foreach (var item in errors.PIServerErrors)
                {
                    Console.WriteLine("  AFValue '{0}': {1}", item.Key, item.Value);
                }
            }
 
            // Display PI System errors
            if (errors.PISystemErrors != null && errors.PISystemErrors.Count > 0)
            {
                foreach (var item in errors.PISystemErrors)
                {
                    Console.WriteLine("  AFValue '{0}': {1}", item.Key, item.Value);
                }
            }
 
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

 

 

As you would imagine, if you are writing to AF Attribute, this will only work if the underlying data reference supports it, like PI Point Data Reference. There are also limitations when using this method like no buffering mechanism. No support for writing to a PI Collective (unless you implement it yourself). If these limitations doesn't bother you, these new methods is probably something useful for you.

In PI SDK, we can pass a Performance Equation (PE) expression to PI Server to perform server side calculation through the IPICalculation interface supported by Server object.

 

An equivalent of IPICalculation interface in AF SDK 2012 is AFCalculation class. So an equivalent code to calculate a simple expression like “’TagA’ + ‘TagB’” every 5 minutes for the last 2 hours is:

 
       static void AFCalculationForPIPointsPE()
        {
            string expression = "'TagA' + 'TagB'";

            AFTimeRange timerange = new AFTimeRange("*-2h", "*"); // timerange of last 2 hours
            AFTimeSpan timespan = new AFTimeSpan(0,0,0,0,5); // timespan of 5 min
            PIServer piserver = new PIServers().DefaultPIServer;
            AFValues values = AFCalculation.CalculateAtIntervals(piserver, expression, timerange, timespan);

            foreach (AFValue value in values)
            {
                Console.WriteLine("{0}:{1}", value.Timestamp.LocalTime, value.Value);
            }
        }

 

 

An additional capability of AFCalculation is that we write a PE expression based on attributes instead of tags. Assuming we have an element ‘Element1’ with 2 attributes ‘A’ and ‘B’, and we want to find the sum of these attribute values. The PE expression will be “’A’ + ‘B’” and the code to run it is:

 
        static void AFCalculationForAttributePE()
        {
            PISystems pisys = new PISystems();
            PISystem afserver = pisys["name of AF Server"];
            AFDatabase afdb = afserver.Databases["name of AF Database"];

            AFElement e = afdb.Elements[@"path to Element1"];

            AFTimeRange timerange = new AFTimeRange("*-2h", "*"); // timerange of last 2 hours
            AFTimeSpan timespan = new AFTimeSpan(0,0,0,0,5); // timespan of 5 min

            string expression = "'A' + 'B'";
            AFValues values = AFCalculation.CalculateAtIntervals(e, expression, timerange, timespan);

            foreach (AFValue value in values)
            {
                Console.WriteLine("{0}:{1}", value.Timestamp.LocalTime, value.Value);
            }
        }

 

 

It is possible to calculate attributes from different elements as well. Assuming we have ‘Element1’ and Element2’ and we want to find the sum of attributes ‘A’ from both elements:

 
        static void AFCalculationForAttributeFullPathPE()
        {
            PISystems pisys = new PISystems();
            PISystem afserver = pisys["name of AF Server"];
            AFDatabase afdb = afserver.Databases["name of AF Database"];

            AFElement e1 = afdb.Elements["path to Element1"];
            AFElement e2 = afdb.Elements["path to Element2"];
            AFAttribute a = e1.Attributes["A"];
            AFAttribute b = e2.Attributes["A"];

            AFTimeRange timerange = new AFTimeRange("*-2h", "*"); // timerange of last 2 hours
            AFTimeSpan timespan = new AFTimeSpan(0, 0, 0, 0, 5); // timespan of 5 min

            string expression = String.Format(CultureInfo.InvariantCulture, "'{0}' + '{1}'", a.GetPath(), b.GetPath());
            AFValues values = AFCalculation.CalculateAtIntervals(afdb, expression, timerange, timespan);

            foreach (AFValue value in values)
            {
                Console.WriteLine("{0}:{1}", value.Timestamp.LocalTime, value.Value);
            }
        }

 

 

AFCalculation class has other calculation methods that are useful as well. You can refer to the AF SDK Programming Reference for more information

 

 

One of the use case that we get from customers for PI Asset Framework (AF) is the ability to search for elements based on attribute values. One example: Customers may want to collect information of equipment from a specific vendor, then they would probably want to post the query like "Get all turbine that is manufactured by 'Sidewinder' <manufacturer name>". On the other hand, user may also want to identify asset based on time-series information like status. For example "Find all reactors which the status is 'On'".

 

If you look into the AF SDK Programming Reference, you will find a specific method implemented to fulfill this requirement "AFElement.FindElementsByAttribute.

 

For example, I have a test environment i defined a capacitor template with the following attribute templates

 

3731.Snap5.jpg

 

A sample implementation is:

 
AFElementTemplate template = afdb.ElementTemplates["Capacitor"];
if (template != null)
{
    // 1st value condition: Manufacturer = Borne Engineering
    AFAttributeTemplate attrtemplate2 = template.AttributeTemplates["Manufacturer"];
    AFAttributeValueQuery query1 = new AFAttributeValueQuery(attrtemplate2,
    OSIsoft.AF.Search.AFSearchOperator.Equal, "Sidewinder");

    // 2nd value condition: Differential Energy > 100
    AFAttributeTemplate attrtemplate1 = template.AttributeTemplates["Differential Energy"];
    AFAttributeValueQuery query2 = new AFAttributeValueQuery(attrtemplate1,
    OSIsoft.AF.Search.AFSearchOperator.GreaterThan, 100);

    // AFAttributeValueQuery array allow us to pass 1 or more value query in the search
    AFAttributeValueQuery[] queries = new AFAttributeValueQuery[] { query1, query2 };

    DateTime start1 = DateTime.Now;
    elementList = AFElement.FindElementsByAttribute(null, "*", queries, true, AFSortField.Name,
    AFSortOrder.Ascending, 100000);
    DateTime end1 = DateTime.Now;
    Console.WriteLine("Number of Elements Found = {0}", elementList.Count);
    Console.WriteLine("Time Taken for search to complete = {0} ms", (end1 - start1).TotalMilliseconds);
}

This implementation works great if you use templates when building up you AF Tree. However if you scale this up and try to search among 10s or 100s of elements, you will start to see that this does causes a significant load on the server. For example if I try to run the code with more than 50,000 capacitors stored in my AF server, and we look at the time to complete the search and load on AF Server and SQL Server services

 

3617.Snap1.jpg

 

5460.Snap4.jpg

 

It does take significant amount of time to complete and we can see that the server services are constantly working throughout the period that the search is taking place. Knowing that getting values through data reference is mostly handled at the client, it is surprising that AF Server and SQL Server is spending so much time working as the search going on.

 

After investigating into this with the help from Chris Manhard, it has become obvious that as the search is running, element and attribute information is gradually being loaded by the client. Hence we get the performance that we see above. 

 

What if we add 2 additional steps before calling the FindElementsByAttribute method? 

 
AFElementTemplate template = afdb.ElementTemplates["Capacitor"];
if (template != null)
{
    // Additional code: FindElementByTemplate then LoadElement before searching by attribute
    AFNamedCollectionList elist = AFElement.FindElementsByTemplate(afdb, null, template, true, AFSortField.Name, AFSortOrder.Ascending, 100000);
    AFElement.LoadElements(elist);

    // 1st value condition: Manufacturer = Borne Engineering
    AFAttributeTemplate attrtemplate2 = template.AttributeTemplates["Manufacturer"];
    AFAttributeValueQuery query1 = new AFAttributeValueQuery(attrtemplate2,
    OSIsoft.AF.Search.AFSearchOperator.Equal, "Sidewinder");

    // 2nd value condition: Differential Energy > 89
    AFAttributeTemplate attrtemplate1 = template.AttributeTemplates["Differential Energy"];
    AFAttributeValueQuery query2 = new AFAttributeValueQuery(attrtemplate1,
    OSIsoft.AF.Search.AFSearchOperator.GreaterThan, 100);

    // AFAttributeValueQuery array allow us to pass 1 or more value query in the search
    AFAttributeValueQuery[] queries = new AFAttributeValueQuery[] { query1, query2 };
    DateTime start1 = DateTime.Now;
    elementList = AFElement.FindElementsByAttribute(null, "*", queries, true, AFSortField.Name,
    AFSortOrder.Ascending, 100000);
    DateTime end1 = DateTime.Now;
    Console.WriteLine("Number of Elements Found = {0}", elementList.Count);
    Console.WriteLine("Time Taken for search to complete = {0} ms", (end1 - start1).TotalMilliseconds);
}

Here's the difference in performance

 

6114.Snap3.jpg

 

3582.Snap2.jpg

 

While the peak CPU load on the AF Server and SQL Server is higher, the time AF Server and SQL Server spent working and the time taken to complete the search even with the additional steps is still much shorter than just searching by attribute directly. So if you are searching by attribute from a large number of elements, this can be a kind of workaround that you can try using to improve the search performance.

 

After communicating to Chris about this, a work item has already been created for this behaviour in AFElement.FindElementsByAttribute method, so you can look forward to better performance in the method when this work item is completed.

 

 

What did you learn this year about the PI System that everyone needs to know? 

 

vCampus Live! 2012 preparations are at full speed and it’s time to gather presentations from you, members of the vCampus community.  This is your chance to engage professionally with your peers alongside presentations from OSIsoft. 

 

In selecting presentations we’ll favor proposals that will send the audience home from this pure technical event with ideas and inspiration.  Case studies into novel projects are acceptable, but they should support the focus of your presentation: how the attendees can apply what they learned. 

 

Presenters will receive complimentary admission to vCampus Live! 2012.  Have an idea and don’t quite know if it fits?  Write up a short description and send it to us at vCampus@osisoft.com  – we’ll give you feedback. We hope to see you there on November 28 in San Francisco!

 

On the similar topic about sharing your experience, we are going to have PI Technology Adoption Challenge this year. This is a continuation of last year's Partner Technology Adoption Challege. Like the Partner Technology Adoption Challenge, we want to you to share with us how PI System technology is adopted and used in your solution =)

 

Given the success of the Partner Technology Adoption Challenge, we are opening up 2 categories this year, for Partners and End-Users. So whether you are a partner, end user, or developer, you are more than welcome to share your experience with us and get a chance to win the challenge.

 

The registration website for OSIsoft vCampus Live! 2012 will be up very soon. In the meantime, stay tuned for more information about OSIsoft vCampus Live!

Recently I've been working on setting up several environments for demonstrations and testing purposes. To get a bit of head start on setting up a realistic PI AF model. I got a couple of databases from others so these can be imported into the AF Server.

 

Having the elements and the associated template created in my database from imported .xml file is great but in some situation that I still have to ensure that the attributes are getting the correct information. For example, attributes with PIPoint data reference should be pointing to the right PI server. Sometimes, even if the template of the attribute is configured using substitution parameters like %Server%, representing the name of PI AF Server, you can still end up in situations where the attribute instance is still pointing to another PI Server. This is because data reference configuration on an attribute can be locked in. An example would be if you use the option to Create or Update PI Point. After that, any subsequent changes made to the template will not propagate to elements based on the template.

 

This is where Reset to Template is useful. As the name suggests, it 'resets' the attribute to utilize the setting of the template. In PI System Explorer, you can select an attribute and choose the option to "Reset to Template", but the problem we have is there is no option to do that in bulk.

 

An alternative to do this in one step is using PI AF Builder add-in in Microsoft Excel. While there is no Reset to Template option, what you can do is copy the config string from the Attribute Template and replace the config strings of derived attribute. This is essentially what happens in the background when you choose to Reset to Template in PI System Explorer. This works but it may still take some effort, because you have to export the list of elements and attributes, update the config string and then export them back to the AF database.

 

Another alternative would be to do this using AF SDK, from a simple program, or a Powershell script. In my case, I've created a Powershell script that loads OSIsoft.AFSDK.dll, find all derived elements from an element template and resets all their attributes. All you need to provide is the AF Server name, AF Database name and name of element template.

 

The key part of resetting the attribute to template settings is the following:

 

 

 

if($AFAttribute.Template)
{
    # * if the attribute have different data reference from the template, reset with template's data reference
    if($AFAttribute.Template.DataReferencePlugIn -ne $AFAttribute.DataReferencePlugIn)
    {
        $AFAttribute.DataReferencePlugIn = $AFAttribute.Template.DataReferencePlugIn
    }          
    # * if attribute's data reference is not null and attribute's config string is difference from template. reset with template's config string
    if($AFAttribute.DataReferencePlugIn)
    {
        if ($AFAttribute.ConfigString -ne $AFAttribute.Template.ConfigString)
        {
            $AFAttribute.ConfigString = $AFAttribute.Template.ConfigString 
        }
    }
    # * if attribute's data reference is null, resetting means taking the template's default value
    else
    {
        $AFAttribute.SetValue($AFAttribute.Template.GetValue($null), $null)
    }        
}

 

 

 

 

With the script, the amount of manual work to reset the attributes to template is minimized. You can download this powershell script. There are some consideration that I have not included in the script that you want to take note of:

  • The script retrieves the element template by name, so you have to correctly input the name.
  • The script doesn't take into account child attributes.

Hope this would help anyone who does AF Database migration!

Recently, I have been playing around building some data cube for BI analysis with PowerPivot and PI OLEDB Enterprise, and one of the feature of PI OLEDB Enterprise that I feel that is really useful through this process is Transposed Vector Function (TVF). There were some discussions in the past that TVF is brought up, like this one. Steve basically has made a brief and concise explanation of what TVF does. If you are still not sure, here's a quick explanation.

 

In our usual query in the classic PI OLEDB Provider or in PI OLEDB Enterprise's tables in the Data category like:

 

 

 
SELECT e.Name Element, ea.Name Attribute, i.Time Time, i.ValueDbl Value
FROM [AFDB].[Asset].[ElementTemplate] et 
INNER JOIN [AFDB].[Asset].[Element] e ON et.ID = e.ElementTemplateID
INNER JOIN [AFDB].[Asset].[ElementAttribute] ea ON ea.ElementID = e.ID
INNER Join [AFDB].[Data].[ft_InterpolateRange] i ON ea.ID = i.ElementAttributeID
WHERE et.Name = N'Refinery' 
AND e.Name LIKE N'Refine%'
AND i.StartTime = N'*-1h'
AND i.EndTime = N'*'
AND i.TimeStep = N'30m' 
OPTION (FORCE ORDER, EMBED ERRORS)

 

 

and a snapshot of the result set:

 

5287.TVF001.JPG

 

This get the values of the different attributes, but all are presented in a single column. In my case a more ideal case is to have the different attributes presented in different columns. This is where TVFs is helpful. Using TVF, we can create a function in PI OLEDB Enterprise that returns the result set like:

 

0486.TVF002.JPG

 

Now in PowerPivot (of cause, you can be using other tools for your BI analysis as well), I can grab the attribute values that represent the KPI that you want from the respective column directly.

 

What you have to take note for this

  • TVF must be created before use (using PI SQL Commander, refer to the PI OLEDB Enterprise manual)
  • TVF is created for a specific Element Template in PI Asset Framework (AF)

While I am at this, there is a new white paper, titled "Business Analytics with your PI System Data using Microsoft PowerPivot" that was recently updated in the vCampus Library, under the "OSIsoft - Microsoft Accelerator" category. It contains step-by-step walkthrough of the processing of bring PI System Data to PowerPivot using PI OLEDB Enterprise. The sample AF database is included in the supporting files, hence you can walk through the paper easily.

Whenever we talk to people about OSIsoft vCampus, one of the most important aspect that we highlight is having an online community of PI System developers and integrators, encourage communication and collaboration among the community on the usage of PI System technology. Because of this, it is very encouraging for us (the vCampus team) to see more active participation in discussions among the community since the beginning of 2012. More significantly, we see more users replying to posts and sharing their insights on the various discussions on the forum.

 

We really like to show our appreciation to members who have contributed their time and effort on OSIsoft vCampus, and vCampus All-Stars award is one of the ways that we have adopted to acknowledge users who have contributed greatly throughout the year. Of cause, we do see that there are other users who deserve acknowledgement as well, hence we are starting the "Post of the Month" initiative.

 

Since the start of vCampus, we have had some outstanding posts in discussions like this and this that are helpful, educational and provides insight into the products. And these are the post that we are looking for in this initiative!

 

For the month of February 2012, we would like to congratulate Rick Davin for his post on                                   Simplest method to get the PI tag name for an Attribute. If                                 you have not read Rick's post, check it out here! In the post, Rick has compared the performance of different methods of getting the tagnames in an AFAttribute with PIPoint data reference and shared his finding. Thanks to Rick for the initiative and effort on this!

 

Of course outstanding posts may not come as regularly as we want, hence we may not get one for a particular month. The vCampus Team will keep an open eye for future "Post of the Month". If you do come across any posts that you feel it should be acknowledged, feel free to drop us a note to our email or directly to any of the vCampus team members.

If you have not registered for upcoming OSIsoft vCampus Live! 2011, the 2-for-1 special registration rate will be available until 15th October. Register 2 person together to enjoy this special rate. Visit the event website, http://www.osisoft.com/vcampuslive2011, to register!

 

At the same time, remember to nominate your vCampus All-Stars for 2011!

 

 

hanyong

Programmer Day!?

Posted by hanyong Employee Sep 15, 2011

Some fun fact: http://www.networkworld.com/community/blog/its-programmer-day-best-you-can-do

 

Maybe it will become an official holiday someday in the future?

For people who are following Ahmad's blogs, you should have noticed a new blog post about OSIsoft vCampus Live! 2011 open for registration. Yes, the event website is now up and running. You can visit the website at http://www.osisoft.com/vcampuslive2011/.

 

The agenda and abstracts of the confirmed presentations and hands-on sessions are published on the website as well. You will definitely find a wide range of technical topics covering different aspects of the PI System throughout the 3 days.

 

Visit the website to know more about the event and register early!

OSIsoft vCampus Live! 2011 is scheduled for 30th November to 1st December in San Francisco! 29th November will be the pre-conference registration day. We are creating the event based on the feedback collected from the community. It will be a new and better format focusing on more hands-on presentations compared with last year.

 

More details and the registration information will be announced soon!

OSIsoft vCampus Live! has been a big event for members of this community, a chance for us to meet face to face and share our experiences and learn about working and developing with the PI System. This year's OSIsoft vCampus Live! was originally scheduled to happen on the week of 12th of September 2011, which falls on the same week as the Microsoft BUILD. In view of this conflict, we have decided that this annual event will be pushed back to a later date.

 

This was not an easy decision for us; our developers and product managers are always eager to share with you news about the PI System face to face. But at the same time we are all interested in attending Microsoft BUILD and learn about upcoming Windows technology, so that we can utilize these technology advancements to bring you an even better PI System in the future. Some of our vCampus Community members are also considering the Microsoft BUILD event to stay abreast on Windows technology. Hence, instead of making it a tough decision between the two events, we decided to reconsider the time of OSIsoft vCampus Live! event.

 

We are also taking this opportunity to evaluate how you want the next OSIsoft vCampus Live! to be like. We have set up a survey about OSIsoft vCampus Live! a couple of weeks ago. If you still haven't given us your feedback, there is still time to do so @ http://www.zoomerang.com/Survey/WEB22CJ99H23K5.

 

In the meantime, stay tuned for more information about OSIsoft vCampus Live!

 

 

 

 

For those who don't remember, Minority Report is a science fiction movie from 2002. I've recently watch the show again, on the plane by chance, you should realize that a lot of the technology advancement we see today are similar to what is depicted in the movie. Some examples:

  • Multi-touch Interfaces
  • Retina scanners
  • personalized advertising, which is still in work but we are getting there (refer to this blog post, written by JD Ruckler)

Looking at it almost 10 years after the film is released, it is incredible to see what used to be like flashy CG effects and non-existing technologies is now becoming a reality. Perhaps this is because the ideas contributed by experts in the film continued to make the ideas into reality or others who have used the ideas depicted in the film as a reference for their work. But no doubt, seeing the ideas turning into reality is amazing.

If you are using SharePoint 2010, You probably have come across Business Connectivity Services (BCS) before. BCS is a set of services and features that connect SharePoint-based solutions to sources of external data. It is a powerful features of SharePoint 2010 to integrate various Line of business (LOB) systems like SAP, Siebel, SQL Server and of cause, PI System as well.

 

BCS was formerly known as Business Data Catalog in SharePoint 2007, and BCS is extended from BDC to support .NET assemblies and WCF services as data source(s), and adding feature to perform Create, Read, Update and Delete (CRUD) operations on the connected LOB systems. Another new aspect of BCS as compared to before is in the creation of the Business Data Connectivity (BDC) Model that defines how BCS should be accessing the LOB system to perform the required operations. There are now tools in SharePoint Designer 2010 as well as project template in Visual Studio 2010 that can help you to create the model.

 

If you are interested to explore BCS as an option to integrate PI System with your SharePoint 2010 environment, attached is a tutorial on "Creating a BDC Model to PI using Visual Studio 2010" that guides you to create a BDC model that searches for PI Point and AF Element in your PI System using Visual Studio 2010.

Filter Blog

By date: By tag: