OPC UA库秉承简单、易用、可靠的设计理念,只需少量接口即可实现所需功能,同时使用者无需考虑多线程,时序等问题
1. 拷贝代码文件
将 \JngOpcUaClient\JngOpcUaClient\Input\ 文件夹拷贝到项目中,添加到项目。
2. 拷贝dll库及SecurityKey
文件路径:\JngOpcUaClient\Debug\
3. 代码使用
3.1 连接及初始化
调用顺序
① 设置认证模式
模式有三种:
1) 无认证
2) 256位加密的签名
3) 256位加密的签名+加密
② 设置变量值改变时候通知的回调函数
③ 连接OPC UA服务器
3.2 遍历服务器元素对象
① 获取节点Node的子元素
如果是root,则不传入Node名
② 返回Node的子Node清单和错误代码
// 第一次初始化
void CJngOpcUaClientDlg::FirstInitNodeID()
{
m_treeNodeID.DeleteAllItems();
HTREEITEM pTreeItem = AddDataToTree("root", NULL, NULL);
// 连接成功,获取清单
std::string pNodeID;
std::list<NODE_INFO_CUR> listSubNodeID;
std::list<NODE_INFO_CUR>::iterator ite;
m_pOpcUaClient.GetVariableList(pNodeID, listSubNodeID);
for (ite = listSubNodeID.begin(); ite != listSubNodeID.end(); ite++)
{
ONE_NODE_DATA* pNodeData = NewNodeData();
pNodeData->pNodeInfo = *ite;
AddDataToTree(ite->pBrowserName, pTreeItem, pNodeData);
}
}
3.3 获取变量值和注册值改变通知
// 添加读取数据
void CJngOpcUaClientDlg::OnBnClickedBtnAdd()
{
if(m_pCurSelNode != NULL)
{
if (m_pCurSelNode->pNodeInfo.nNodeClass == UA_NODE_CLASS::VARIABLE)
{
UA_TYPE::ENUM nType = UA_TYPE::UNSPECIFIED;
m_pOpcUaClient.GetVariableValue(m_pCurSelNode->pNodeInfo.pNodeID,
m_pCurSelNode->pValue,
nType); // 获取值
// 添加到list控件界面
AddOneDataToListCtrl(m_pCurSelNode, nType);
// 设置通知方式
m_pOpcUaClient.SetVariableChangeNotify(m_pCurSelNode->pNodeInfo.pNodeID);
}
}
}
3.4 设置值(写入)
// 设置值
void CJngOpcUaClientDlg::OnBnClickedBtnSetValue()
{
CString pNode;
CString pValue;
CString pValueType;
m_editNode.GetWindowText(pNode);
m_editValue.GetWindowText(pValue);
m_editValueType.GetWindowText(pValueType);
if (pNode.GetLength() > 0)
{
int nType = ::atoi(pValueType);
m_pOpcUaClient.SetVariableValue((LPCSTR)pNode, (LPCSTR)pValue, nType);
}
}
接口源代码下载:www.jngbus.com