<?xml version="1.0" encoding="UTF-8" ?>
<!-- created at 2025-12-16 12:17:02 -->
<UANodeSet xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd">
	<Extensions>
		<atvise Version="3.13"/>
	</Extensions>
	<NamespaceUris>
		<Uri>http://www.atvise.com/atServer/UA/</Uri>
	</NamespaceUris>
	<Aliases>
		<!-- data types -->
		<Alias Alias="Boolean">i=1</Alias>
		<Alias Alias="SByte">i=2</Alias>
		<Alias Alias="Byte">i=3</Alias>
		<Alias Alias="Int16">i=4</Alias>
		<Alias Alias="UInt16">i=5</Alias>
		<Alias Alias="Int32">i=6</Alias>
		<Alias Alias="UInt32">i=7</Alias>
		<Alias Alias="Int64">i=8</Alias>
		<Alias Alias="UInt64">i=9</Alias>
		<Alias Alias="Float">i=10</Alias>
		<Alias Alias="Double">i=11</Alias>
		<Alias Alias="String">i=12</Alias>
		<Alias Alias="DateTime">i=13</Alias>
		<Alias Alias="ByteString">i=15</Alias>
		<Alias Alias="XmlElement">i=16</Alias>
		<Alias Alias="NodeId">i=17</Alias>
		<Alias Alias="LocalizedText">i=21</Alias>
		<!-- references -->
		<Alias Alias="Organizes">i=35</Alias>
		<Alias Alias="HasEventSource">i=36</Alias>
		<Alias Alias="HasModellingRule">i=37</Alias>
		<Alias Alias="HasTypeDefinition">i=40</Alias>
		<Alias Alias="HasSubtype">i=45</Alias>
		<Alias Alias="HasProperty">i=46</Alias>
		<Alias Alias="HasComponent">i=47</Alias>
		<Alias Alias="HasNotifier">i=48</Alias>
		<Alias Alias="HasCondition">i=9006</Alias>
		<Alias Alias="HasHistoricalConfiguration">i=56</Alias>
		<!-- types -->
		<Alias Alias="BaseDataType">i=24</Alias>
		<Alias Alias="BaseObjectType">i=58</Alias>
		<Alias Alias="FolderType">i=61</Alias>
		<Alias Alias="BaseVariableType">i=62</Alias>
		<Alias Alias="BaseDataVariableType">i=63</Alias>
		<Alias Alias="PropertyType">i=68</Alias>
		<Alias Alias="AlarmConditionStateType">ns=1;i=1001</Alias>
		<!-- modelling rules -->
		<Alias Alias="New">i=78</Alias>
		<Alias Alias="Shared">i=79</Alias>
		<Alias Alias="SharedExclusive">i=336</Alias>
		<!-- other -->
		<Alias Alias="Server">i=2253</Alias>
		<Alias Alias="Objects">i=85</Alias>
	</Aliases>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.DataGenerator" ExportedBrowseName="1:DataGenerator" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS" BrowseName="1:SERVERSCRIPTS">
		<DisplayName Locale="en">SERVERSCRIPTS</DisplayName>
		<Description Locale="en">SERVERSCRIPTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.DataGenerator" BrowseName="1:DataGenerator" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">DataGenerator</DisplayName>
		<Description Locale="en">DataGenerator</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
			<Reference ReferenceType="HasModellingRule">Shared</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <parameter name="timer" type="timer" trigger="true" relative="false" value="" starttime="00:00:00" repeat="00:00:01"/>
  <parameter name="relativeMode" type="boolean" trigger="false" relative="false" value="false"/>
  <parameter name="browseMode" type="boolean" trigger="false" relative="false" value="false"/>
  <parameter name="recursive" type="boolean" trigger="false" relative="false" value="false"/>
  <code><![CDATA[// **************************************************************************************
// * Writes random numeric values to numeric variable nodes
// * Parameters
// * relativeMode --> Browse base node (true = yes; false = no)
// * browseMode --> Browse nodes in browseList (true = yes; false = no),
// *     can only be activated if relativeMode is set to false
// * recursive --> Browse recursivevly or not (true = yes; false = no)
// *
// * Configuration examples:
// *
// * relativeMode = true; browseMode = true/false; recursive = false
// *     This script's parent node will be browsed and all variable nodes
// *     in the first level receive value changes
// *
// * relativeMode = true; browseMode = true/false; recursive = true
// *     This script's parent node will be browsed recursively and all child
// *     variable nodes receive value changes
// *
// * relativeMode = false; browseMode = true; recursive = false
// *     The listed nodes in browseList will be browsed and all variable nodes
// *     in the first level receive value changes
// *
// * relativeMode = false; browseMode = false; recursive = true/false
// *     The listed nodes in nodeList receive value changes
// *
// **************************************************************************************

var baseNodeId = base.nodeid,
    BaseVarTypeId = "i=62",
    IntTypeIndexes = [4,5,6,7,8,9],
    FloatingTypeIndexes = [10,11],
    MinRandomIntValue = 0,
    MaxRandomIntValue = 100,
    MinRandomFloatValue = 0,
    MaxRandomFloatValue = 10,
    nodeList = [
        "AGENT.OBJECTS.float1",
        "AGENT.OBJECTS.int1"
    ],
    browseList = [
        "AGENT.OBJECTS.Folder1"
    ];

// writes random values for given node list
function writeNodesListValues (nodeList) {
    var nodeObj = {},
        itemIndex = 0;

    for (itemIndex; itemIndex < nodeList.length; itemIndex++) {
        nodeObj = Ua.findNode(nodeList[itemIndex]);
        writeSingleValue(nodeObj, false);
    }
}

// writes random values for given node list
function writeBrowseListValues (browseList) {
    var itemIndex = 0;

    for (itemIndex; itemIndex < browseList.length; itemIndex++) {
        writeBrowsedValues(browseList[itemIndex]);
    }
}

// browses given node id and writes random values for int, float and double nodes
function writeBrowsedValues (browseNodeId) {
    var browseResult = browseNodes(browseNodeId),
        itemIndex = 0;  
    // iterate through result and write random values for number types
    for (itemIndex; itemIndex < browseResult.result.length; itemIndex++) {
        writeSingleValue(browseResult.result[itemIndex], true);
    }
}

// returns variable types for browsed node
function browseNodes (nodeId) {
    var browseNode = Ua.findNode(nodeId);

    return browseNode.result.browse({
        direction: Ua.Node.BROWSEDIRECTION_FORWARD,
        reference: 	Ua.Reference.HASCOMPONENT,
        subType: true,
        nodeClass: 	Ua.NodeClass.VARIABLE,
        maxResult: 0,
        recursive: recursive
    });
}

// writes random value for single node
function writeSingleValue (nodeObj, isBrowseResult) {
    if (isBrowseResult) {
        nodeObj = nodeObj.node;
    }else{
		nodeObj = nodeObj.result;
    }
	if(nodeObj){
		writeRandomValue(nodeObj.nodeId.address);
    }else{
		console.error("Node does not exist");    
    }
}

// checks if node is a variable type
function isVarType(nodeObj) {
    return nodeObj.typedefinition == BaseVarTypeId;
}

// writes random integer value to given browse item
function writeRandomValue (nodeid) {
    var node = Ua.findNode(nodeid);
    //console.log("node "+nodeid);
        var numType = getNumType(node);

    if (numType != "none") {
        node.result.value = numType == "int" ? getRandomInt(MinRandomIntValue, MaxRandomIntValue) : 
            getRandomFloat(MinRandomFloatValue, MaxRandomFloatValue);
    }
}

// checks if the browse item is a numeric variable
function getNumType (node) {
    var splitArray = node.result.dataType.xml.split("i="),
        numIndex = 0;

    if (splitArray.length <= 1) {
        return "none";
    }

    numIndex = parseInt(splitArray[1], 10);

    if (IntTypeIndexes.indexOf(numIndex) > -1) {
        return "int";
    } else if (FloatingTypeIndexes.indexOf(numIndex) > -1) {
        return "float";
    } else {
        return "none";
    }
}


// returns random integer value
function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

// returns random float value
function getRandomFloat(min, max) {
    return Math.random() * (max - min) + min;
};

// abort execution when executed in object type
if (baseNodeId.indexOf("ObjectTypes.PROJECT") > -1) {
    return;
}

if (relativeMode) {
    writeBrowsedValues(baseNodeId);
} else if (browseMode) {
    writeBrowseListValues(browseList);
} else {
    writeNodesListValues(nodeList);
}]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
</UANodeSet>
