Bulk Creation of Equipment Model and configure live data

Bulk Creation of Equipment, Equipment Properties, Equipment Instances , Data Access Source and Data Access Real Time and generate live data from OPC UA Source.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using ABB.Vtrin;
using ABB.Vtrin.Drivers;
using static ABB.Vtrin.Drivers.cMiaClient;

namespace Equipment_creation
{
    public class Equipmentfunctions
    {
        static System.Threading.AutoResetEvent mPushReady = new System.Threading.AutoResetEvent(false);
        static cMiaClient mDriver;
        cDataLoader dataLoader = new cDataLoader()
        {
            ConnectOptions = cDataLoader.cConnectOptions.AcceptServerKeyChanges
        };

        private static SecureString GetPasswordString(string password)
        {
            SecureString _password = new SecureString();
            foreach (var character in password)
            {
                _password.AppendChar(character);
            }
            return _password;
        }

        public void VtrinConnection(string connectionString, string Username, string Password)
        {
            string remotePath = "opc.tcp://127.0.0.1:4841///Path_MOTOR.Motors\\.M1.CURRENT;UaNamespace=\r\nhttp://fi.abb.com/Vtrin";
            var securePassword = GetPasswordString(Password);
            using (mDriver = (cMiaClient)dataLoader.Connect(connectionString,
                       Username, securePassword, false))
            {
                if (mDriver != null)
                {
                    Console.WriteLine("Vtrin Connected");
                    Console.WriteLine("Enter Parent Node Name");
                    string parentNodeName = Console.ReadLine();
                    Console.WriteLine("Enter number of instances");
                    string nooofinstances = Console.ReadLine();
                    Console.WriteLine("Enter InstanceName");
                    string instancename = Console.ReadLine();
                    Console.WriteLine("Enter number of properties");
                    string noofproperties = Console.ReadLine();
                    Console.WriteLine("Enter property Name");
                    string propertyname = Console.ReadLine();
                    Console.WriteLine("Enter number of Equipments");
                    string noofequipments = Console.ReadLine();
                    Console.WriteLine("Enter EquipmentName");
                    string equipmentName = Console.ReadLine();
                    int noofInstances = int.Parse(nooofinstances);
                    int noofProperties = int.Parse(noofproperties);
                    int noofeqps = int.Parse(noofequipments);
                    var props = new cEquipmentProperty[noofProperties];
                    List<string> propertiesList = new List<string>();
                    var subeq = new List<cEquipment>();

                    for (int i = 0; i < noofProperties; i++)
                    {
                        try
                        {
                            props[i] = new cEquipmentProperty(propertyname + i, typeof(Double));
                            propertiesList.Add(propertyname + i);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("*****" + ex.Message);
                        }
                    }

                    List<string> equipmentList = new List<string>();
                    List<string> instancesList = new List<string>();

                    for (int j = 0; j < noofeqps; j++)
                    {
                        equipmentName += j;
                        for (int i = 0; i < noofInstances; i++)
                        {
                            string instanceName = instancename + i + "_" + j;
                            var eq = new cEquipment(Guid.NewGuid(), instanceName, equipmentName, props);
                            subeq.Add(eq);
                            instancesList.Add(parentNodeName + "." + instanceName);
                        }
                        equipmentList.Add(equipmentName);
                    }

                    var my_eq = new cEquipment(ConvertToGuid(parentNodeName), parentNodeName, "Equipment", null, subeq.ToArray());
                    Thread.Sleep(5000);
                    my_eq.Ready += eq_ready;
                    my_eq.Failed += eq_failed;
                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                    mDriver.SubscribeEquipmentSession(my_eq);

                    mPushReady.WaitOne(5000, true);

                    UpdateEquipmentProperties(my_eq);

                    //OWNER Component
                    //0 - OPC
                    //1 - DEVICE API

                    // Create DAS
                    CreateDataAccessSource(mDriver, equipmentList, remotePath, 0, instancesList, propertiesList);

                    // Create DAR
                    CreateDataAccessRealTime(mDriver, 0, equipmentList, propertiesList);

                    Console.WriteLine("End of the creation");
                }

                else
                {
                    Console.WriteLine("Vtrin Not Connected Invalid Arguments");
                }

                Console.WriteLine("Press enter to close...");
                Console.ReadLine();
            }
        }

        public static void eq_ready(object sender, cEquipment eq)
        {
            Console.WriteLine("Ready: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }

        public static void eq_failed(object sender, Exception ex)
        {
            Console.WriteLine("Failed" + ex.ToString());
            mPushReady.Set();
        }

        public static void CreateDataAccessSource(cMiaClient driver,
            List<string> equipmentList,
            string opcUARemotePath,
            int ownerComponent,
            List<string> instanceProcessPathList,
            List<string> properties)
        {
            foreach (var equipment in equipmentList)
            {
                foreach (var eqInstance in instanceProcessPathList)
                {
                    foreach (var property in properties)
                    {
                        string targetPath = $"/Path_{equipment}" + "[" + property + "]" + "/" + "|" + eqInstance;
                        var equipmentdatasorce = driver.Classes["DataAccessSource"].Instances.Add();
                        equipmentdatasorce.SetRawPropertyValue("Target", targetPath);
                        equipmentdatasorce.SetRawPropertyValue("AccessPath", opcUARemotePath);
                        equipmentdatasorce.SetRawPropertyValue("OwnerComponent", ownerComponent);
                        equipmentdatasorce.CommitChanges();
                    }
                }
            }
        }

        public static void CreateDataAccessRealTime(cMiaClient driver,
            int ownerComponent,
            List<string> equipmentList,
            List<string> properties)
        {
            foreach (var equipment in equipmentList)
            {
                foreach (var property in properties)
                {
                    driver.Classes["DataAccessSource"].Instances.Add();
                    TimeSpan interval = new TimeSpan(0, 0, 1);
                    string targetPath = $"/Path_{equipment}" + "[" + property + "]";
                    var dataaccess = driver.Classes["DataAccessRealTime"].Instances.Add();
                    var name = equipment + property;
                    dataaccess.SetRawPropertyValue("Name", name);
                    dataaccess.SetRawPropertyValue("TargetReference", targetPath);
                    dataaccess.SetRawPropertyValue("SamplingInterval", interval);
                    dataaccess.SetRawPropertyValue("PublishingInterval", interval);
                    dataaccess.SetRawPropertyValue("OwnerComponent", ownerComponent);
                    dataaccess.CommitChanges();
                }
            }

        }

        public static Guid CreateATreeItem(cDriverSkeleton driver, string name)
        {
            var id = ConvertToGuid(name);
            var pathClass = driver.Classes["TreeNode"];
            var newInstance = pathClass.Instances.Add();
            newInstance.SetRawPropertyValue("Text", name);
            newInstance.SetRawPropertyValue("Type", 50);
            newInstance.SetRawPropertyValue("Parent", "c206ac08-8588-4832-8e48-c83798d9ff5f");
            newInstance.SetRawPropertyValue("Image", "ui/table.svg");
            newInstance.SetRawPropertyValue("SortKey", 3);
            newInstance.SetRawPropertyValue("Description", "This is for testing");
            newInstance.SetRawPropertyValue("NodeId", id);
            pathClass.Instances.CommitChanges(new[] { newInstance });
            return id;
        }

        /// <summary>
        /// Converts the Given string to GUID
        /// </summary>
        /// <param name="str">String to convert to GUID</param>
        /// <returns>return GUID</returns>
        public static Guid ConvertToGuid(string str)
        {
            if (str == null || str == "") return Guid.Empty;
            HashAlgorithm hash = MD5.Create();
            Encoding enc = Encoding.UTF8;
            byte[] data = enc.GetBytes(str);
            hash.TransformFinalBlock(data, 0, data.Length);
            return new Guid(hash.Hash);
        }

        public static void UpdateEquipmentProperties(cEquipment eq)
        {
            Console.WriteLine("Please wait while the equipment properties are being historized......");
            var subEquipment = eq.SubEquipment.ToList().FirstOrDefault();
            if (subEquipment.Properties != null)
            {
                foreach (var prop in subEquipment.Properties)
                {
                    string propertyNameSuffix = new string(prop.Name.Where(char.IsLetter).ToArray());
                    if (!propertyNameSuffix.Contains("TextArray"))
                    {
                        var findstrprop = "DisplayName Like '" + prop.Name + "'";
                        var propertyClass = mDriver.Classes["EquipmentPropertyInfo"];
                        var equipmentPropertyInfo = mDriver.Classes["EquipmentPropertyInfo"].Instances.GetInstanceSet(findstrprop).FirstOrDefault();

                        if (equipmentPropertyInfo != null)
                        {
                            var i = equipmentPropertyInfo.BeginUpdate();
                            i.SetRawPropertyValue("Historized", true);
                            i.SetRawPropertyValue("CompressionMethod", 0);
                            i.CommitChanges(true);
                        }
                        else
                        {
                            throw new Exception($"The specified Equipment Property {prop.Name} is not available in the syatem");
                        }
                    }
                }
            }
            mPushReady.Set();
            Console.WriteLine("Historizing the equipment properties is completed......");
        }
    }
}


Did this page help you?