Linux/Windows下OPC ua -- 下

读取和写入首先要创建一个variant,将读写的值和节点绑定,指定节点需要节点id和作用域id


void* CXNOpc::GetOpcValueNumberic(UA_UInt16 nsIndex, UA_UInt32 identifier, int Type, int& length)
{
    UA_Variant *val = UA_Variant_new();
    if(!ReadOpcNumberic(nsIndex, identifier, val))
    {
        *m_qOutLog << OutLogTime() << ": Fail to Read NoteId " << identifier << endl;
        return NULL;
    }

    if(val->type == &UA_TYPES[UA_TYPES_STRING])
    {
        UA_Byte* value = (*(UA_String*)val->data).data;
        length = (*(UA_String*)val->data).length;
        return (void*)value;
    }

    if(val->type == &UA_TYPES[Type])
        return val->data;
    else
        return NULL;
}

bool CXNOpc::SetOpcValueNumberic(UA_UInt16 nsIndex, UA_UInt32 identifier, int Type, void* value)
{
    UA_Variant *myVariant = UA_Variant_new();
    UA_Variant_setScalarCopy(myVariant, value, &UA_TYPES[Type]);
    bool bret = WriteOpcNumberic(nsIndex, identifier, myVariant);
    if(!bret)
        *m_qOutLog << OutLogTime() << ": Fail to Write NoteId " << identifier << endl;

    UA_Variant_delete(myVariant);
    return bret;
}

bool CXNOpc::ReadOpcNumberic(UA_UInt16 nsIndex, UA_UInt32 identifier, UA_Variant *val)
{
    UA_NodeId nodeId = UA_NODEID_NUMERIC(nsIndex, identifier);
    UA_StatusCode retval = UA_Client_readValueAttribute(m_pClient,nodeId,val);
    if(retval == UA_STATUSCODE_GOOD && UA_Variant_isScalar(val))
        return true;
    else
        return false;
}

bool CXNOpc::WriteOpcNumberic(UA_UInt16 nsIndex, UA_UInt32 identifier, UA_Variant *myVariant)
{
    if(!m_bIsConnect)
        return false;

    UA_NodeId nodeId = UA_NODEID_NUMERIC(nsIndex, identifier);
    UA_StatusCode code = UA_Client_writeValueAttribute(m_pClient, nodeId, myVariant);
    if (code != UA_STATUSCODE_GOOD)
        return false;
    else
        return true;
}

添加监控首先要创建订阅,然后将监控与订阅绑定,注意的是 无论多少个订阅,新建了几个客户端,同样只能监控500个节点


bool CXNOpc::AddSubscription()
{
    if(!m_bIsConnect)
        return false;

    //UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();//创建默认订阅请求命令

    UA_CreateSubscriptionRequest request;
    UA_CreateSubscriptionRequest_init(&request);

    request.requestedPublishingInterval = 200.0;
    request.requestedLifetimeCount = 10000;
    request.requestedMaxKeepAliveCount = 10;
    request.maxNotificationsPerPublish = 0;
    request.publishingEnabled = true;
    request.priority = 0;

    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(m_pClient, request, NULL, NULL, NULL);//向服务器请求订阅
    m_subId = response.subscriptionId;
    if(response.responseHeader.serviceResult == UA_STATUSCODE_GOOD)
    {
        *m_qOutLog << OutLogTime() << ": Create subscription succeeded, id " << m_subId << endl;
        return true;
    }
    else
    {
        UA_Client_Subscriptions_deleteSingle(m_pClient, m_subId);
        m_subId = -1;
        return false;
    }
}

bool CXNOpc::AddNumbericMonitor(UA_UInt16 nsIndex, vector<UA_UInt32> identifier, UA_Client_DataChangeNotificationCallback callback)
{
    if(!m_bIsConnect)
        return false;

    if(!AddSubscription())
        return false;

    for(vector<UA_UInt32>::iterator it = identifier.begin(); it != identifier.end(); it++)
    {
        UA_NodeId nodeId = UA_NODEID_NUMERIC(nsIndex, *it);
        UA_MonitoredItemCreateRequest monRequest = UA_MonitoredItemCreateRequest_default(nodeId);//创建监控单个节点请求命令
        UA_MonitoredItemCreateResult monResponse = UA_Client_MonitoredItems_createDataChange(m_pClient,
                                                                                             m_subId, UA_TIMESTAMPSTORETURN_BOTH,
                                                                                             monRequest, NULL, callback, NULL);//订阅与监控绑定
        if(monResponse.statusCode == UA_STATUSCODE_GOOD)
            *m_qOutLog << OutLogTime() << ": Monitoring: " << monResponse.monitoredItemId << " Noteid: " << *it << endl;
        else
        {
            *m_qOutLog << OutLogTime() << ": Error! Fail to add numberic id: " << *it << endl;
            return false;
        }
    }
    return true;
}

bool CXNOpc::StartMonitorTask()
{
    m_bStatus = true;
    return true;
}

bool CXNOpc::StopMonitorTask()
{
    m_bStatus = false;
    return true;
}

void CXNOpc::run()
{
    while(m_bStatus)
    {
        if(m_bIsConnect)
        {
           UA_Client_runAsync(m_pClient, m_time);
        }
    }
}


  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 上创建 OPC UA 客户端,可以使用多个 OPC UA 客户端软件,下面介绍两种常用的 OPC UA 客户端软件: 1. UAExpert UAExpert 是一款免费的 OPC UA 客户端软件,可以在 WindowsLinux 和 macOS 上运行。它提供了一个用户友好的界面,可以实现 OPC UA 服务器的数据读写、节点浏览、历史数据读取等功能。使用 UAExpert 创建 OPC UA 客户端,需要按照以下步骤进行: (1)下载并安装 UAExpert 软件; (2)打开 UAExpert 软件,点击菜单栏的“Connection”-“New Connection”; (3)在弹出的“New Connection”对话框中,输入 OPC UA 服务器的地址和端口号,如“opc.tcp://localhost:4840”; (4)点击“OK”按钮,连接到 OPC UA 服务器; (5)在“Address Space”窗口中,可以浏览 OPC UA 服务器中的节点,并读取节点的值。 2. Matrikon OPC Explorer Matrikon OPC Explorer 是一款商用的 OPC UA 客户端软件,可以在 Windows 上运行。它提供了一个用户友好的界面,可以实现 OPC UA 服务器的数据读写、节点浏览、历史数据读取等功能。使用 Matrikon OPC Explorer 创建 OPC UA 客户端,需要按照以下步骤进行: (1)下载并安装 Matrikon OPC Explorer 软件; (2)打开 Matrikon OPC Explorer 软件,点击菜单栏的“File”-“Connect”; (3)在弹出的“Connect”对话框中,选择“OPC UA”选项卡,输入 OPC UA 服务器的地址和端口号,如“opc.tcp://localhost:4840”; (4)点击“Connect”按钮,连接到 OPC UA 服务器; (5)在“Server Explorer”窗口中,可以浏览 OPC UA 服务器中的节点,并读取节点的值。 需要注意的是,在使用 OPC UA 客户端软件时,需要根据 OPC UA 服务器的配置和节点结构进行相应的配置和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值