1

Proficy Historianのc#ユーザーAPIラッパーを使用して、すべての(またはフィルター処理された)タグ名を取得するにはどうすればよいですか?

キャッシュにデータを取り込むメソッド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)
{//...}

タグ名のキャッシュを読み取るにはどうすればよいですか?

4

1 に答える 1

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 GE が提供する DLL インポート定義を使用していないため、コードが若干異なる場合がありますが、違いはほとんどありません。

于 2013-08-26T01:28:50.820 に答える