Search code examples
javascriptnode.jsopcnode-opcua

nodejs-How use node-opcua access a remote opc server?


I found a better project node-opcua in github, use the simple example of this project can create a opc server and client, and in the local can access, I need to access a remote opc server now, provide a few parameters are: IP network nodes (such as 10.195.156.150), opc service (for example ArchestrA. FSGateway), opc group (such as ArchestrA), opc TagName (for example HXi1_P201_00. Ia), can I access it use node-opcua? Thank you!

sample_server code:

var opcua = require("node-opcua");
var os = require("os");

// Let's create an instance of OPCUAServer
var server = new opcua.OPCUAServer({port: 4334});
var siteName = 'site01';

var var1 = {nodeId: 'ns=4;s=hook_weight', browseName: 'hook_weight', dataType: 'Double'};
var var2 = {nodeId: 'ns=4;s=rpm', browseName: 'rpm', dataType: 'Double'};
var var3 = {nodeId: 'ns=1;s=free_memory', browseName: 'free_memory', dataType: 'Double'};

function post_initialize(){
    console.log("server initialized");
    function construct_my_address_space(server) {
      server.engine.createFolder("RootFolder",{ browseName: siteName});
        // emulate variable1 changing every 500 ms
        var variable1 = 1;
        setInterval(function(){ variable1 += 1; }, 1000);

        var1.value = {
          get: function(){
            return new opcua.Variant({dataType: opcua.DataType.Double, value: variable1 });
          }
        };
        server.var1 = server.engine.addVariableInFolder(siteName, var1);

        var2.value = {
          get: function(){
            return new opcua.Variant({dataType: opcua.DataType.Double, value: 10});
          }
        };
        server.var2 = server.engine.addVariableInFolder(siteName, var2);

        /**
        /**
         * returns the percentage of free memory on the running machine
         * @return {double}
         */
        function available_memory() {
            // var value = process.memoryUsage().heapUsed / 1000000;
            var percentageMemUsed = os.freemem() / os.totalmem() * 100.0;
            return percentageMemUsed;
        }
        var3.value = {
          get: function(){
            return new opcua.Variant({dataType: opcua.DataType.Double, value: available_memory()});
          }
        };
        server.var3 = server.engine.addVariableInFolder(siteName, var3);

    }

    construct_my_address_space(server);

    server.start(function() {
        console.log("Server is now listening ... ( press CTRL+C to stop)");
        console.log("port ", server.endpoints[0].port);
        var endpointUrl = server.endpoints[0].endpointDescription().endpointUrl;
        console.log(" the primary server endpoint url is ", endpointUrl );
    });
}
server.initialize(post_initialize);

sample_client code:

var opcua = require("node-opcua");
var async = require("async");

var client = new opcua.OPCUAClient();
var endpointUrl = "opc.tcp://" + require("os").hostname().toLowerCase() + ":4334/UA/SampleServer";

var session, subscription;

async.series([
    // step 1 : connect to
    function(callback)  {
      client.connect(endpointUrl,function (err) {
          if(err) { console.log(" cannot connect to endpoint :" , endpointUrl ); }
          else { console.log("connected !"); }
          callback(err);
      });
    },

    // step 2 : createSession
    function(callback) {
      client.createSession( function(err, _session) {
          if(!err) { session = _session; }
          callback(err);
      });
    },

    // step 5: install a subscription and install a monitored item for 10 seconds
    function(callback) {
      subscription=new opcua.ClientSubscription(session,{
          requestedPublishingInterval: 1000,
          requestedLifetimeCount: 10,
          requestedMaxKeepAliveCount: 2,
          maxNotificationsPerPublish: 10,
          publishingEnabled: true,
          priority: 10
      });

      subscription.on("started",function(){
        console.log("subscriptionId=", subscription.subscriptionId);
      }).on("keepalive",function(){ console.log(); })
      .on("terminated",function(){ callback(); });

      setTimeout(function () {
                subscription.terminate();
        }, 10000);

        // install monitored item
        var monitoredItem = subscription.monitor({
                nodeId: opcua.resolveNodeId("ns=1;s=free_memory"),
                attributeId: opcua.AttributeIds.Value
            },
            {
                samplingInterval: 100,
                discardOldest: true,
                queueSize: 100
            },
            opcua.read_service.TimestampsToReturn.Both
        );
        console.log("-------------------------------------");

        monitoredItem.on("changed", function (dataValue) {
            console.log(" % free mem = ", dataValue.value.value);
        });
    },

    // close session
    function (callback) {
        // _"closing session"

        session.close(function (err) {
            if (err) {
                console.log("session closed failed ?");
            }
            callback();
        });
    }
],
function(err) {
  if (err) { console.log(" failure ",err); }
  else { console.log('done!'); }
  client.disconnect(function(){});
});

Solution

  • I am afraid Archestra doesn't have an OPC UA Server, so to access it from node-opcua, you will need to use an OPC UA Gateway, such as https://www.prosysopc.com/products/opc-ua-gateway/, which can convert OPC DA to OPC UA.