Получить имена тегов Proficy Historian через IHUAPI
Как использовать оболочку API пользователя C# для Proficy Historian, как я могу получить все (или отфильтрованный список) имен тегов?
Я нашел метод ihuFetchTagCache, который заполняет кеш, возвращает количество тегов, но я не могу найти способ доступа к этому кешу.
Мой код до сих пор:
string servername = "testServer";
int handle;
ihuErrorCode result;
result = IHUAPI.ihuConnect(servername, "", "", out handle);
if (result != ihuErrorCode.OK)
{//...}
int count;
result = IHUAPI.ihuFetchTagCache(handle, txtFilter.Text, out count);
if (result != ihuErrorCode.OK)
{//...}
Как мне прочитать кэш имен тегов?
1 ответ
Решение
На самом деле лучше использовать новые методы кэширования тегов, представленные в 4.5 и выше. Вот определения импорта DLL, которые я использую.1
[DllImport("ihuapi.dll", EntryPoint = "ihuCreateTagCacheContext@0")]
public static extern IntPtr CreateTagCacheContext();
[DllImport("ihuapi.dll", EntryPoint = "ihuCloseTagCacheEX2@4")]
public static extern ErrorCode CloseTagCacheEx2(IntPtr TagCacheContext);
[DllImport("ihuapi.dll", EntryPoint = "ihuFetchTagCacheEx2@16")]
public static extern ErrorCode FetchTagCacheEx2(IntPtr TagCacheContext, int ServerHandle, string TagMask, ref int NumTagsFound);
[DllImport("ihuapi.dll", EntryPoint = "ihuGetTagnameCacheIndexEx2@12")]
public static extern ErrorCode GetTagnameCacheIndexEx2(IntPtr TagCacheContext, string Tagname, ref int CacheIndex);
[DllImport("ihuapi.dll", EntryPoint = "ihuGetNumericTagPropertyByIndexEx2@16")]
public static extern ErrorCode GetNumericTagPropertyByIndexEx2(IntPtr TagCacheContext, int Index, TagProperty TagProperty, ref double Value);
[DllImport("ihuapi.dll", EntryPoint = "ihuGetStringTagPropertyByIndexEx2@20")]
public static extern ErrorCode GetStringTagPropertyByIndexEx2(IntPtr TagCacheContext, int Index, TagProperty TagProperty, StringBuilder Value, int ValueLength);
Тогда вы можете использовать следующий код.
IntPtr context = IntPtr.Zero;
try
{
context = IHUAPI.CreateTagCacheContext();
if (context != IntPtr.Zero)
{
int number = 0;
ihuErrorCode result = IHUAPI.FetchTagCacheEx2(context, Connection.Handle, mask, ref number);
if (result == ihuErrorCode.OK)
{
for (int i = 0; i < number; i++)
{
StringBuilder text = new StringBuilder();
IHUAPI.GetStringTagPropertyByIndexEx2(context, i, ihuTagProperties.Tagname, text, 128);
Console.WriteLine("Tagname=" + text.ToString());
}
}
}
}
finally
{
if (context != IntPtr.Zero)
{
IHUAPI.CloseTagCacheEx2(context);
}
}
1Обратите внимание, что я не использую предоставленные определения импорта DLL, предоставляемые GE, поэтому мой код может выглядеть немного иначе, но различия должны быть в основном тривиальными.