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......");
}
}
}Updated 11 months ago
Did this page help you?

