如何通过IHUAPI的ihuTagAdd接口为GE/Proficy Historian添加标签?
在GE Proficy Historian中使用IHUAPI添加标签的正确方法
你找到的ihuTagAdd@4函数签名是不完整的——GE Proficy Historian的IHUAPI标准标签添加接口需要结合标签属性结构体来使用,仅传入服务器句柄的版本无法完成标签创建,大概率是代码片段遗漏了关键参数。
核心问题说明
ihuTagAdd@4的后缀@4表示该函数仅接收4字节参数(单个int类型的serverhandle),这并不是用于创建标签的完整接口。标准的ihuTagAdd需要两个参数:服务器连接句柄,以及一个包含标签所有属性的ihuTagProperties结构体指针。
正确实现步骤
定义匹配IHUAPI的结构体和枚举
首先在C#中定义与非托管IHUAPI一致的ihuTagProperties结构体和数据类型枚举,确保内存布局匹配:[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct ihuTagProperties { [MarshalAs(UnmanagedType.LPStr)] public string Tagname; public ihuDataType DataType; [MarshalAs(UnmanagedType.LPStr)] public string EngineeringUnits; public float HiEngineeringUnits; public float LoEngineeringUnits; // 可根据需求添加更多属性,比如描述、采集频率等,需参考官方IHUAPI文档 } public enum ihuDataType { IHU_DATA_TYPE_FLOAT = 0, IHU_DATA_TYPE_STRING = 1, IHU_DATA_TYPE_INT32 = 2, IHU_DATA_TYPE_BOOL = 3 // 其他数据类型请参考官方枚举定义 } public enum ihuErrorCode { IHU_SUCCESS = 0, // 其他错误码参考官方定义 }修正DllImport函数签名
替换你之前的导入代码,使用完整的ihuTagAdd接口:private const string DLLNAME = "ihuapi.dll"; // 确保路径正确 [DllImport(DLLNAME, CallingConvention = CallingConvention.StdCall, EntryPoint = "ihuTagAdd")] public static extern ihuErrorCode ihuTagAdd(int serverhandle, ref ihuTagProperties tagProps);填充属性并调用接口
先通过ihuConnect获取有效的服务器句柄,然后填充标签属性,最后调用接口创建标签:// 假设已完成服务器连接,获得有效的serverhandle ihuTagProperties newTag = new ihuTagProperties(); newTag.Tagname = "Production_Pressure_01"; newTag.DataType = ihuDataType.IHU_DATA_TYPE_FLOAT; newTag.EngineeringUnits = "Bar"; newTag.HiEngineeringUnits = 10.0f; newTag.LoEngineeringUnits = 0.0f; ihuErrorCode result = ihuTagAdd(serverhandle, ref newTag); if (result == ihuErrorCode.IHU_SUCCESS) { // 标签创建成功 } else { // 根据错误码排查问题,比如标签名重复、权限不足等 }
额外注意事项
- 确保使用的
ihuapi.dll版本与你的Historian服务器版本匹配,不同版本的结构体字段可能存在差异。 - 操作前需确认连接用户具备创建标签的权限。
- 若需要批量创建标签,可使用
ihuTagAddMultiple接口提升效率。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

