- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从头开始实现我自己的 OPC DA 客户端(版本 2.02、2.05a、3.00),但不使用任何第三方。我还想利用 OPCEnum.exe 服务来获取已安装 OPC 服务器的列表。是否有任何类型的文档详细说明了实现 OPC 客户端的过程?
最佳答案
我有一个 C# 实现,但实际上很难将其放入此处。我将尝试总结所需的步骤。
大多数情况下,您需要从 OPC 核心组件可再发行组件包中获得 OpcRcw.Comn.dll 和 OpcRcw.Da.dll,可从 Opcfoundation.org 免费下载。安装后,文件位于 C:\Windows\assembly\GAC_MSIL。在您的项目中创建引用。
关于编码,这是你应该做的(你要实现三个对象,Server、Group和Item):
让我们从服务器开始:
Type typeofOPCserver = Type.GetTypeFromProgID(serverName, computerName, true);
m_opcServer = (IOPCServer)Activator.CreateInstance(typeofOPCserver);
m_opcCommon = (IOPCCommon)m_opcServer;
IConnectionPointContainer icpc = (IConnectionPointContainer)m_opcServer;
Guid sinkGUID = typeof(IOPCShutdown).GUID;
icpc.FindConnectionPoint(ref sinkGUID, out m_OPCCP);
m_OPCCP.Advise(this, out m_cookie_CP);
我已经做了很多检查以适应这里,把它作为一个样本......然后你需要在服务器上添加组的方法:
// Parameter as following:
// [in] active, so do OnDataChange callback
// [in] Request this Update Rate from Server
// [in] Client Handle, not necessary in this sample
// [in] No time interval to system UTC time
// [in] No Deadband, so all data changes are reported
// [in] Server uses english language to for text values
// [out] Server handle to identify this group in later calls
// [out] The answer from Server to the requested Update Rate
// [in] requested interface type of the group object
// [out] pointer to the requested interface
m_opcServer.AddGroup(m_groupName, Convert.ToInt32(m_isActive), m_reqUpdateRate, m_clientHandle, pTimeBias, pDeadband, m_LocaleID, out m_serverHandle, out m_revUpdateRate, ref iid, out objGroup);
// Get our reference from the created group
m_OPCGroupStateMgt = (IOPCGroupStateMgt)objGroup;
最后你需要创建项目:
m_OPCItem = (IOPCItemMgt)m_OPCGroupStateMgt;
m_OPCItem.AddItems(itemList.Length, GetAllItemDefs(itemList), out ppResults, out ppErrors);
其中 itemlist 是一个 OPCITEMDEF[] 数组。我使用我的结构中的 GetAllItemDefs 构建上面的内容。
private static OPCITEMDEF[] GetAllItemDefs(params OpcItem[] opcItemList)
{
OPCITEMDEF[] opcItemDefs = new OPCITEMDEF[opcItemList.Length];
for (int i = 0; i < opcItemList.Length; i++)
{
OpcItem opcItem = opcItemList[i];
opcItemDefs[i].szAccessPath = "";
opcItemDefs[i].bActive = Convert.ToInt32(opcItem.IsActive);
opcItemDefs[i].vtRequestedDataType = Convert.ToInt16(opcItem.ItemType, CultureInfo.InvariantCulture);
opcItemDefs[i].dwBlobSize = 0;
opcItemDefs[i].pBlob = IntPtr.Zero;
opcItemDefs[i].hClient = opcItem.ClientHandle;
opcItemDefs[i].szItemID = opcItem.Id;
}
return opcItemDefs;
}
最后,关于枚举服务器,我使用了这两个函数:
/// <summary>
/// Enumerates hosts that may be accessed for server discovery.
/// </summary>
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
public string[] EnumerateHosts()
{
IntPtr pInfo;
int entriesRead = 0;
int totalEntries = 0;
int result = NetServerEnum(
IntPtr.Zero,
LEVEL_SERVER_INFO_100,
out pInfo,
MAX_PREFERRED_LENGTH,
out entriesRead,
out totalEntries,
SV_TYPE_WORKSTATION | SV_TYPE_SERVER,
IntPtr.Zero,
IntPtr.Zero);
if (result != 0)
throw new ApplicationException("NetApi Error = " + String.Format("0x{0,0:X}", result));
string[] computers = new string[entriesRead];
IntPtr pos = pInfo;
for (int ii = 0; ii < entriesRead; ii++)
{
SERVER_INFO_100 info = (SERVER_INFO_100)Marshal.PtrToStructure(pos, typeof(SERVER_INFO_100));
computers[ii] = info.sv100_name;
pos = (IntPtr)(pos.ToInt32() + Marshal.SizeOf(typeof(SERVER_INFO_100)));
}
NetApiBufferFree(pInfo);
return computers;
}
/// <summary>
/// Returns a list of servers that support the specified specification on the specified host.
/// </summary>
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
public string[] GetAvailableServers(Specification specification)
{
lock (this)
{
// connect to the server.
ArrayList servers = new ArrayList();
MULTI_QI[] results = new MULTI_QI[1];
GCHandle hIID = GCHandle.Alloc(IID_IUnknown, GCHandleType.Pinned);
results[0].iid = hIID.AddrOfPinnedObject();
results[0].pItf = null;
results[0].hr = 0;
try
{
// create an instance.
Guid srvid = CLSID;
CoCreateInstanceEx(srvid, null, CLSCTX.CLSCTX_LOCAL_SERVER, IntPtr.Zero, 1, results);
m_server = (IOPCServerList2)results[0].pItf;
// convert the interface version to a guid.
Guid catid = new Guid(specification.ID);
// get list of servers in the specified specification.
IOPCEnumGUID enumerator = null;
m_server.EnumClassesOfCategories(1, new Guid[] { catid }, 0, null, out enumerator);
// read clsids.
Guid[] clsids = ReadClasses(enumerator);
// release enumerator
if (enumerator != null && enumerator.GetType().IsCOMObject)
Marshal.ReleaseComObject(enumerator);
// fetch class descriptions.
foreach (Guid clsid in clsids)
{
try
{
string url = CreateUrl(specification, clsid);
servers.Add(url);
}
catch (Exception) { }
}
}
catch
{
}
finally
{
if (hIID.IsAllocated) hIID.Free();
if (m_server != null && m_server.GetType().IsCOMObject)
Marshal.ReleaseComObject(m_server);
}
return (string[])servers.ToArray(typeof(string));
}
}
我知道我有很多条纹,但也许它仍然可以帮助你 ;)如果您认为我已经清楚了,请将答案标记为正确 ;)亲切的问候,D.
关于opc - 从头开始实现 OPC DA 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17837952/
我试图通过 DA 协议(protocol)从 OPC 读取值。我发现钛是免费的,这就是我的条件。我正在使用 this手册,其中写了如何从 OPC 服务器读取值,但只能从您在 OPC 服务器上使用您自己
我已经接管了一些一直在使用 Firestorm DAO 的代码来自 CodeFutures 的代码生成器。我相信这个许可证很快就会到期,我想知道是否有人可以推荐任何替代品,无论是否开源,以便我可以了解
我已经开始学习 Java,并且在一个简单的程序中遇到问题,该程序应该将一些内容写入 numbers.dat 文件。 我面临两个问题: 我得到的输出如下: 2, 6, 12, 20, 30, 42, 5
我有一些这样的文字: foo'bar' 当我在 'bar' 中执行 da' 时,空格被删除: foo 如何在不删除空格的情况下执行 da',以便得到这个结果? foo 最佳答案 我在 vim 关于 t
我有一个示例数据框,其中 a 列包含如下重复值: a 0 1089, 1089, 1089 1 10A3, 10A3 2 10A3, 10A4, 10A4 3 TEL,
我在设置一个函数来为我生成和绑定(bind)缓冲区时遇到困难。 我有两个函数,如下: GLuint vertex_buffer(const GLfloat * thing) { GLuint
我想从头开始实现我自己的 OPC DA 客户端(版本 2.02、2.05a、3.00),但不使用任何第三方。我还想利用 OPCEnum.exe 服务来获取已安装 OPC 服务器的列表。是否有任何类型的
我想从头开始实现我自己的 OPC DA 客户端(版本 2.02、2.05a、3.00),但不使用任何第三方。我还想利用 OPCEnum.exe 服务来获取已安装 OPC 服务器的列表。是否有任何类型的
我想在 java 代码中接收 opc DA 标签,以进一步处理它。我试过 http://www.digitalpetri.com/ api 但这仅从 UA 标签接收数据。它有一个模式匹配,使DA标签的
我正在用 javascript 制作一个计算器,现在它可以计算:sin, cos, tan, cot, sec, csc 以及所有子类型的 arc 和 hyberbolic,sqrt、cbrt、y 根
我想从头开始实现我自己的 OPC DA 服务器(版本 1.X-2.X),但不使用任何第三方。我有一个经典的 OPC DA 客户端(基于 COM/DCOM)。所以我需要创建一个可以连接到服务器的 opc
本文整理了Java中org.eclipse.scada.da.core.WriteAttributeResults类的一些代码示例,展示了WriteAttributeResults类的具体用法。这些代
我正在使用 GCC 版本 3.3.6。当我用 -fprofile-arcs 检测我的目标文件时和 -ftest-coverage ,合适的*.bb和 *.bbg文件被创建。 然后将目标文件链接到一个静
我正在尝试了解此状态在 ui-router 中的含义: $stateProvider.state('app', { abstract: true, url: '/{lang:(?:da|en)
我经常使用像 ci( 这样的命令和 di{编辑源代码时。 Ruby 块中的参数包含在管道字符内,例如 |a, b| 是否可以扩展此行为以添加对 | 的支持? , 以便像 ci| 这样的命令, da|和
请解释 OPC UA 和 OPC DA 之间的区别是什么? 在哪种情况下应该使用哪个,如果可以为 OPC UA 和 OPC DA 提供任何示例,这将有所帮助 最佳答案 OPC UA 不仅适用于 OPC
我遇到了问题 da.Fill(ds, "Employee") 我没有任何线索来解决这个问题。任何人都可以帮忙吗? 这是我的实际代码: Private Sub btnsearch_Click(ByVa
我无法理解 R = 0、R = S、R = S*Da 的含义,定义在 kCGBlendMode 值,例如 kCGBlendModeClear、kCGBlendModeCopy、kCGBlendMode
对于查询 1 或 2 哪个更好,请给我一些提示。我有一个 GridView ,其中有很多信息,例如数百个。建议使用它来快速查询结果而不出现滞后 QUERY = "从 exdb.sample 中选择 *
亲爱的 CSS/Bootstrap 社区, 我目前正在学习 bootstrap 的设计方面,如何编辑等等 我尝试了很多不同的改变,但我想要实现的仍然暗示着我。 现在,这是我的 CSS: .da-dot
我是一名优秀的程序员,十分优秀!