기본 콘텐츠로 건너뛰기

OPC UA (freeopcua) example

 GitHub - FreeOpcUa/freeopcua: Open Source C++ OPC-UA Server and Client Library






/// @author Alexander Rykovanov 2013
/// @email rykovanov.as@gmail.com
/// @brief Remote Computer implementaion.
/// @license GNU LGPL
///
/// Distributed under the GNU LGPL License
/// (See accompanying file LICENSE or copy at
/// http://www.gnu.org/licenses/lgpl.html)
///

#include <opc/ua/client/client.h>
#include <opc/ua/node.h>
#include <opc/ua/subscription.h>

#include <opc/common/logger.h>

#include <iostream>
#include <stdexcept>
#include <thread>

using namespace OpcUa;

class SubClient : public SubscriptionHandler
{
void DataChange(uint32_t handle, const Node & node, const Variant & val, AttributeId attr) override
{
std::cout << "Received DataChange event, value of Node " << node << " is now: " << val.ToString() << std::endl;
}
};

int main(int argc, char ** argv)
{
auto logger = spdlog::stderr_color_mt("client");
//logger->set_level(spdlog::level::debug);
try
{
//std::string endpoint = "opc.tcp://192.168.56.101:48030";
//std::string endpoint = "opc.tcp://user:password@192.168.56.101:48030";
std::string endpoint = "opc.tcp://127.0.0.1:4840/freeopcua/server/";
//std::string endpoint = "opc.tcp://localhost:53530/OPCUA/SimulationServer/";
//std::string endpoint = "opc.tcp://localhost:48010";

if (argc > 1)
{ endpoint = argv[1]; }

logger->info("Connecting to: {}", endpoint);

OpcUa::UaClient client(logger);
client.Connect(endpoint);

//get Root node on server
OpcUa::Node root = client.GetRootNode();
logger->info("Root node is: {}", root);

//get and browse Objects node
logger->info("Child of objects node are:");
Node objects = client.GetObjectsNode();

for (OpcUa::Node node : objects.GetChildren())
{ logger->info(" {}", node); }

//get a node from standard namespace using objectId
logger->info("NamespaceArray is:");
OpcUa::Node nsnode = client.GetNode(ObjectId::Server_NamespaceArray);
OpcUa::Variant ns = nsnode.GetValue();

for (std::string d : ns.As<std::vector<std::string>>())
{ logger->info(" {}", d); }

OpcUa::Node myvar;
OpcUa::Node myobject;
OpcUa::Node mymethod;

//Initialize Node myvar:

//Get namespace index we are interested in

// From freeOpcUa Server:
uint32_t idx = client.GetNamespaceIndex("http://examples.freeopcua.github.io");
////Get Node using path (BrowsePathToNodeId call)
//std::vector<std::string> varpath({ std::to_string(idx) + ":NewObject", "MyVariable" });
//myvar = objects.GetChild(varpath);
std::vector<std::string> methodpath({ std::to_string(idx) + ":NewObject" });
myobject = objects.GetChild(methodpath);
methodpath = { std::to_string(idx) + ":NewObject", "MyMethod" };
mymethod = objects.GetChild(methodpath);
std::vector<OpcUa::Variant> arguments;
arguments.push_back(static_cast<uint8_t>(0));
myobject.CallMethod(mymethod.GetId(), arguments);

// Example data from Prosys server:
//std::vector<std::string> varpath({"Objects", "5:Simulation", "5:Random1"});
//myvar = root.GetChild(varpath);

// Example from any UA server, standard dynamic variable node:
std::vector<std::string> varpath{ "Objects", "Server", "ServerStatus", "CurrentTime" };
myvar = root.GetChild(varpath);

logger->info("got node: {}", myvar);

//Subscription
SubClient sclt;
Subscription::SharedPtr sub = client.CreateSubscription(100, sclt);
uint32_t handle = sub->SubscribeDataChange(myvar);
logger->info("Got sub handle: {}, sleeping 5 seconds", handle);
std::this_thread::sleep_for(std::chrono::seconds(5));

logger->info("Disconnecting");
client.Disconnect();
logger->flush();
return 0;
}

catch (const std::exception & exc)
{
logger->error("Error: {}", exc.what());
}

catch (...)
{
logger->error("Unknown error.");
}

return -1;
}

댓글

이 블로그의 인기 게시물

C# - Serial Port ASCII/HEX Format

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace SerialTest1 {     public partial class Form1 : Form     {         delegate void MyDelegate();      //델리게이트 선언(크로스 쓰레드 해결하기 위한 용도)         bool SendForamt = true;          // true : ASCII   false : HEX         bool ReceiveFormat = true;       // true : ASCII   false : HEX         public Form1()         {             InitializeComponent();          ...

C# - Windows Form 에 있는 control 찾기

// 아래 코드는 form 의 최상위 control만 찾을 수 있음. // panle, groubbox ... 내부에 있는 control은 찾지 못함. Control GetControlByName(string Name) {     foreach (Control c in this.Controls)         if (c.Name == Name)             return c;     return null; } // form 의 모든 control을 찾을 수 있음. string name = "btnBit" + (i + 1).ToString("D2"); var tmpBtn = this.Controls.Find(name, true).FirstOrDefault(); if (tmpBtn != null) {     if (value == 1) tmpBtn.BackColor = Color.Lime;     else tmpBtn.BackColor = Color.Gray; }

C# - ARGB 색상

속성 A 이  Color  구조체의 알파 구성 요소 값을 가져옵니다. Alice Blue ARGB 값이  #FFF0F8FF 인 시스템 정의 색을 가져옵니다. Antique White ARGB 값이  #FFFAEBD7 인 시스템 정의 색을 가져옵니다. Aqua ARGB 값이  #FF00FFFF 인 시스템 정의 색을 가져옵니다. Aquamarine ARGB 값이  #FF7FFFD4 인 시스템 정의 색을 가져옵니다. Azure ARGB 값이  #FFF0FFFF 인 시스템 정의 색을 가져옵니다. B 이  Color  구조체의 파랑 구성 요소 값을 가져옵니다. Beige ARGB 값이  #FFF5F5DC 인 시스템 정의 색을 가져옵니다. Bisque ARGB 값이  #FFFFE4C4 인 시스템 정의 색을 가져옵니다. Black ARGB 값이  #FF000000 인 시스템 정의 색을 가져옵니다. Blanched Almond ARGB 값이  #FFFFEBCD 인 시스템 정의 색을 가져옵니다. Blue ARGB 값이  #FF0000FF 인 시스템 정의 색을 가져옵니다. Blue Violet ARGB 값이  #FF8A2BE2 인 시스템 정의 색을 가져옵니다. Brown ARGB 값이  #FFA52A2A 인 시스템 정의 색을 가져옵니다. Burly Wood ARGB 값이  #FFDEB887 인 시스템 정의 색을 가져옵니다. Cadet Blue ARGB 값이  #FF5F9EA0 인 시스템 정의 색을 가져옵니다. Chartreuse ARGB 값이  #FF7FFF00 인 시스템 정의 색을 가져옵니다. Chocolate ARGB 값이  #FFD2691E 인 시스템 정의 색을 가져옵니다. Coral ARGB ...