diff --git a/.gitignore b/.gitignore index 854ddfe0..5ebd2b45 100644 --- a/.gitignore +++ b/.gitignore @@ -55,7 +55,7 @@ typings/ # Yarn Integrity file .yarn-integrity -# dotenv environment variables file +# dotenv environment dataAssemblies file .env diff --git a/package-lock.json b/package-lock.json index 9100eef5..1b27ae3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,106 +1,112 @@ { "name": "@p2olab/polaris-backend", - "version": "3.0.0-alpha0.1", + "version": "3.0.0-alpha0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@p2olab/polaris-backend", - "version": "3.0.0-alpha0.1", + "version": "3.0.0-alpha0.2", "license": "MIT", "dependencies": { "@p2olab/pimad-core": "0.0.1alpha16", "@p2olab/pimad-types": "1.0.1-alpha1.0", "@p2olab/polaris-interface": "3.0.0-alpha13", "@types/adm-zip": "^0.4.34", - "@types/pino": "^6.3.6", "@types/promise-timeout": "^1.3.0", "@types/uuid": "^8.3.0", - "adm-zip": "^0.5.5", + "adm-zip": "^0.5.9", "assign-deep": "^1.0.1", - "command-line-args": "^5.1.1", + "command-line-args": "^5.2.0", "command-line-usage": "^6.0.2", "cors": "^2.8.5", "expr-eval": "^2.0.2", - "express": "^4.17.1", - "express-async-handler": "^1.1.4", + "express": "^4.17.2", + "express-async-handler": "^1.2.0", "json-parse-better-errors": "^1.0.2", - "multer": "^1.4.2", - "node-opcua": "^2.31.0", + "multer": "^1.4.4", + "node-opcua": "^2.62.7", "node-pid-controller": "^1.0.1", "promise-timeout": "^1.3.0", "timeout-as-promise": "^1.0.0", - "typescript-logging": "^0.6.4", - "underscore": "^1.10.2", + "typescript-logging": "^1.0.0", + "underscore": "^1.13.2", "uuid": "^8.1.0", - "ws": "^7.5.0", - "xstate": "^4.23.1", + "ws": "^8.4.0", + "xstate": "^4.27.0", "yn": "^3.1.1" }, "bin": { "polaris-backend": "bin/polaris-backend" }, "devDependencies": { - "@types/chai": "^4.2.11", - "@types/chai-as-promised": "^7.1.2", - "@types/command-line-args": "^5.0.0", - "@types/command-line-usage": "^5.0.1", + "@types/chai": "^4.3.0", + "@types/chai-as-promised": "^7.1.4", + "@types/command-line-args": "^5.2.0", + "@types/command-line-usage": "^5.0.2", "@types/cors": "^2.8.6", - "@types/express": "^4.17.6", - "@types/mocha": "^8.2.0", - "@types/node": "^14.0.9", - "@types/underscore": "^1.10.7", - "@types/uuid": "^8.0.0", - "@types/ws": "^7.2.0", - "@typescript-eslint/eslint-plugin": "^2.29.0", - "@typescript-eslint/parser": "^2.29.0", - "apidoc": "^0.23.0", + "@types/express": "^4.17.13", + "@types/mocha": "^9.0.0", + "@types/node": "^17.0.8", + "@types/pino": "^7.0.5", + "@types/underscore": "^1.11.4", + "@types/uuid": "^8.3.4", + "@types/ws": "^8.2.2", + "@typescript-eslint/eslint-plugin": "^5.9.0", + "@typescript-eslint/parser": "^5.9.0", + "apidoc": "^0.50.3", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", - "eslint": "^6.8.0", - "eslint-formatter-pretty": "^3.0.1", - "eslint-plugin-tsdoc": "^0.2.4", - "mocha": "^8.2.1", + "eslint": "^8.6.0", + "eslint-formatter-pretty": "^4.0.1", + "eslint-plugin-tsdoc": "^0.2.14", + "mocha": "^9.1.3", "nyc": "^15.1.0", "run-script-os": "^1.1.1", "strict-event-emitter-types": "^2.0.0", - "supertest": "^4.0.2", - "ts-node": "^8.10.2", - "typedoc": "^0.17.8", - "typescript": "^3.9.6", + "supertest": "^6.1.6", + "ts-node": "^10.4.0", + "typedoc": "^0.22.10", + "typescript": "^4.5.4", "xstate": "^4.23.1" } }, "node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "dependencies": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", - "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", - "dev": true + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/core": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.14.tgz", - "integrity": "sha512-wZso/vyF4ki0l0znlgM4inxbdrUvCb+cVz8grxDq+6C9k6qbqoIJteQOKicaKjCipU3ISV+XedCqpL2RJJVehA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-compilation-targets": "^7.13.13", - "@babel/helper-module-transforms": "^7.13.14", - "@babel/helpers": "^7.13.10", - "@babel/parser": "^7.13.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", + "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.7", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -135,14 +141,17 @@ } }, "node_modules/@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz", + "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==", "dev": true, "dependencies": { - "@babel/types": "^7.13.0", + "@babel/types": "^7.16.7", "jsesc": "^2.5.1", "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/generator/node_modules/source-map": { @@ -155,16 +164,19 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0" } @@ -178,137 +190,161 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "node_modules/@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dev": true, "dependencies": { - "@babel/types": "^7.13.12" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dev": true, "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", "dev": true, "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", "dev": true, "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz", + "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -318,30 +354,38 @@ } }, "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz", + "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/traverse/node_modules/globals": { @@ -354,14 +398,37 @@ } }, "node_modules/@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.7.tgz", + "integrity": "sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-consumer": "0.8.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/@dabh/diagnostics": { @@ -375,11 +442,69 @@ "kuler": "^2.0.0" } }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/@hapi/bourne": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz", "integrity": "sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==" }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -396,6 +521,15 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -409,6 +543,19 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -467,29 +614,30 @@ } }, "node_modules/@microsoft/tsdoc": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.0.tgz", - "integrity": "sha512-/8J+4DdvexBH1Qh1yR8VZ6bPay2DL/TDdmSIypAa3dAghJzsdaiZG8COvzpYIML6HV2UVN0g4qbuqzjG4YKgWg==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", + "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", "dev": true }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.14.0.tgz", - "integrity": "sha512-KSj15FwyaxMCGJkC320rvNXxuJNCOVO02pNqIEdf5cbLakvHK8afoHTmcjdBEWl0cfBFZlMu/1DhL4VCzZq0rQ==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", + "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.13.0", + "@microsoft/tsdoc": "0.13.2", "ajv": "~6.12.6", "jju": "~1.4.0", "resolve": "~1.19.0" } }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -497,19 +645,21 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -546,9 +696,9 @@ } }, "node_modules/@ster5/global-mutex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@ster5/global-mutex/-/global-mutex-1.1.1.tgz", - "integrity": "sha512-dyz2Itai4tbpijvia7OnlSoWV0pAXBKBZH2p2+nq2K26lP+84PvbMZG5SBx30mFIWQLWJQPEs6ECK6IZlIAaJQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ster5/global-mutex/-/global-mutex-1.2.0.tgz", + "integrity": "sha512-UmLDijFT0oif4HNuHkXGEolwQe3Eb5x1WX+1fxEMrO92BojeDycn4gjQnZm8d6nZPizzbWrt6SLQgDU+bFALyw==" }, "node_modules/@szmarczak/http-timer": { "version": "1.1.2", @@ -561,6 +711,30 @@ "node": ">=6" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, "node_modules/@types/adm-zip": { "version": "0.4.34", "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.4.34.tgz", @@ -570,14 +744,14 @@ } }, "node_modules/@types/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.6.tgz", - "integrity": "sha512-ZkrXnZLC1mc4b9QLKaSrsxV4oxTRs10OI2kgSApT8G0v1jrmqppSHUVQ15kLorzsFBTjvf7OKF4kAibuuNQ+xA==" + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.12.tgz", + "integrity": "sha512-4i4w4tfNDo73BOjk0qHcB2YJ8A2SjITCrU4BTsgdJFTsVr6atPDXa0T9r0QZTrX3axtWwkqpZqF4B3gR0TqBGw==" }, "node_modules/@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, "dependencies": { "@types/connect": "*", @@ -585,65 +759,85 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.8.tgz", - "integrity": "sha512-Di3AHXV6SS04EyurnOGxGjFXiLWmt2iopQTNtf0UodfvvGPJo+n60YHWfEy2XGF4dBeYQyrf7RpO5cqzrPxE9Q==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/chai": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.16.tgz", - "integrity": "sha512-vI5iOAsez9+roLS3M3+Xx7w+WRuDtSmF8bQkrbcIJ2sC1PcDgVoA0WGpa+bIrJ+y8zqY2oi//fUctkxtIcXJCw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", + "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==", "dev": true }, "node_modules/@types/chai-as-promised": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz", - "integrity": "sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.4.tgz", + "integrity": "sha512-1y3L1cHePcIm5vXkh1DSGf/zQq5n5xDKG1fpCvf18+uOkpce0Z1ozNFPkyWsVswK7ntN1sZBw3oU6gmN+pDUcA==", "dev": true, "dependencies": { "@types/chai": "*" } }, "node_modules/@types/command-line-args": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.0.0.tgz", - "integrity": "sha512-4eOPXyn5DmP64MCMF8ePDvdlvlzt2a+F8ZaVjqmh2yFCpGjc1kI3kGnCFYX9SCsGTjQcWIyVZ86IHCEyjy/MNg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz", + "integrity": "sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==", "dev": true }, "node_modules/@types/command-line-usage": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.1.tgz", - "integrity": "sha512-/xUgezxxYePeXhg5S04hUjxG9JZi+rJTs1+4NwpYPfSaS7BeDa6tVJkH6lN9Cb6rl8d24Fi2uX0s0Ngg2JT6gg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.2.tgz", + "integrity": "sha512-n7RlEEJ+4x4TS7ZQddTmNSxP+zziEG0TNsMfiRIxcIVXt71ENJ9ojeXmGO3wPoTdn7pJcU2xc3CJYMktNT6DPg==", "dev": true }, "node_modules/@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/cors": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", - "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, - "node_modules/@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "node_modules/@types/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.2.tgz", + "integrity": "sha512-TzgYCWoPiTeRg6RQYgtuW7iODtVoKu3RVL72k3WohqhjfaOLK5Mg2T4Tg1o2bSfu0vPkoI48wdQFv5b/Xe04wQ==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, "node_modules/@types/express": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", - "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -653,9 +847,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", - "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", + "version": "4.17.27", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.27.tgz", + "integrity": "sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA==", "dev": true, "dependencies": { "@types/node": "*", @@ -664,15 +858,15 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" + "version": "4.14.177", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.177.tgz", + "integrity": "sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw==" }, "node_modules/@types/mime": { "version": "1.3.2", @@ -681,23 +875,23 @@ "dev": true }, "node_modules/@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz", + "integrity": "sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/mocha": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", - "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", "dev": true }, "node_modules/@types/node": { - "version": "14.14.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.43.tgz", - "integrity": "sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" }, "node_modules/@types/once": { "version": "1.4.0", @@ -705,21 +899,13 @@ "integrity": "sha512-cnEvTAVVRqF6OQg/4SLnbxQ0slZJHqZQDve5BzGhcIQtuMpPv8T5QNS2cBPa/W0jTxciqwn7bmJAIGe/bOJ5Kw==" }, "node_modules/@types/pino": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/@types/pino/-/pino-6.3.6.tgz", - "integrity": "sha512-yVgSyMGzNDYe/XNMJyuIkklDeZbFdGAxRztYLoN1QQrrgiLJ1oJPmnS8Ge5xpzI9ODKEddKH97VFQ7cWO6Pumw==", - "dependencies": { - "@types/node": "*", - "@types/pino-std-serializers": "*", - "@types/sonic-boom": "*" - } - }, - "node_modules/@types/pino-std-serializers": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz", - "integrity": "sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/pino/-/pino-7.0.5.tgz", + "integrity": "sha512-wKoab31pknvILkxAF8ss+v9iNyhw5Iu/0jLtRkUD74cNfOOLJNnqfFKAv0r7wVaTQxRZtWrMpGfShwwBjOcgcg==", + "deprecated": "This is a stub types definition. pino provides its own type definitions, so you do not need this installed.", + "dev": true, "dependencies": { - "@types/node": "*" + "pino": "*" } }, "node_modules/@types/promise-timeout": { @@ -728,76 +914,73 @@ "integrity": "sha512-AtVKSZUtpBoZ4SshXJk5JcTXJllinHKKx615lsRNJUsbbFlI0AI8drlnoiQ+PNvjkeoF9Y8fJUh6UO2khsIBZw==" }, "node_modules/@types/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, "node_modules/@types/serve-static": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", - "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, - "node_modules/@types/sonic-boom": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@types/sonic-boom/-/sonic-boom-0.7.0.tgz", - "integrity": "sha512-AfqR0fZMoUXUNwusgXKxcE9DPlHNDHQp6nKYUd4PSRpLobF5CCevSpyTEBcVZreqaWKCnGBr9KI1fHMTttoB7A==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/underscore": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.1.tgz", - "integrity": "sha512-mW23Xkp9HYgdMV7gnwuzqnPx6aG0J7xg/b7erQszOcyOizWylwCr9cgYM/BVVJHezUDxwyigG6+wCFQwCvyMBw==" + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", + "integrity": "sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==" }, "node_modules/@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, "node_modules/@types/ws": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.1.tgz", - "integrity": "sha512-ISCK1iFnR+jYv7+jLNX0wDqesZ/5RAeY3wUx6QaphmocphU61h+b+PHjS18TF4WIPTu/MMzxIq2PHr32o2TS5Q==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", + "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/experimental-utils": "5.9.0", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/type-utils": "5.9.0", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^2.0.0", - "eslint": "^5.0.0 || ^6.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -806,47 +989,49 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", + "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", + "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", "dev": true, "dependencies": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "debug": "^4.3.2" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -854,82 +1039,367 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", + "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", "dev": true, "dependencies": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", + "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.9.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "*" + }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "node_modules/@typescript-eslint/types": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", + "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", + "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", + "dev": true, "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": ">= 0.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", + "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@typescript-eslint/types": "5.9.0", + "eslint-visitor-keys": "^3.0.0" }, "engines": { - "node": ">=0.4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", + "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", + "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", + "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" } }, "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/adm-zip": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.5.tgz", - "integrity": "sha512-IWwXKnCbirdbyXSfUDvCCrmYrOHANRZcc8NcRrvTlIApdl7PwE9oGcsYvNeJPAVY1M+70b4PxXGKIf8AEuiQ6w==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz", + "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==", "engines": { "node": ">=6.0" } @@ -938,6 +1408,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -962,38 +1433,21 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dependencies": { - "string-width": "^3.0.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" + "string-width": "^4.1.0" } }, "node_modules/ansi-colors": { @@ -1021,11 +1475,11 @@ } }, "node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/ansi-styles": { @@ -1057,52 +1511,53 @@ } }, "node_modules/apidoc": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/apidoc/-/apidoc-0.23.0.tgz", - "integrity": "sha512-bn2QNaqyyL5ihRUlBBqwffElJg+hAgxAWPDdjJiLxDJ66Jiw+jf8uucFLYC9XHFqjdM7YTqLluM2PPshrqzObg==", + "version": "0.50.3", + "resolved": "https://registry.npmjs.org/apidoc/-/apidoc-0.50.3.tgz", + "integrity": "sha512-bRZD7A+RuN4wgXvBz8gePp+R+PdxtsNBS6Sdta1s0nG3+fJr1AAusCZlbQrSVM41k1E+DKaMZlsOFpodVa5/8Q==", "dev": true, + "os": [ + "darwin", + "freebsd", + "linux", + "openbsd", + "win32" + ], "dependencies": { - "apidoc-core": "^0.11.1", - "commander": "^2.20.0", - "fs-extra": "^8.1.0", - "handlebars": "^4.7.6", - "lodash": "^4.17.15", - "markdown-it": "^10.0.0", - "nodemon": "^2.0.3", - "winston": "^3.2.1" + "bootstrap": "3.4.1", + "commander": "^8.3.0", + "diff-match-patch": "^1.0.5", + "esbuild-loader": "^2.16.0", + "expose-loader": "^3.1.0", + "fs-extra": "^10.0.0", + "glob": "^7.2.0", + "handlebars": "^4.7.7", + "iconv-lite": "^0.6.3", + "jquery": "^3.6.0", + "klaw-sync": "^6.0.0", + "lodash": "^4.17.21", + "markdown-it": "^12.2.0", + "nodemon": "^2.0.15", + "path-to-regexp": "^6.2.0", + "prismjs": "^1.25.0", + "semver": "^7.3.5", + "style-loader": "^3.3.1", + "url-parse": "^1.5.3", + "webpack": "^5.64.2", + "webpack-cli": "^4.9.1", + "winston": "^3.3.3" }, "bin": { "apidoc": "bin/apidoc" }, "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/apidoc-core": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/apidoc-core/-/apidoc-core-0.11.1.tgz", - "integrity": "sha512-pt/ICBdFQCZTgL38Aw1XB3G9AajDU1JA5E3yoDEgg0mqbPTCkOL8AyWdysjvNtQS/kkXgSPazCZaZzZYqrPHog==", - "dev": true, - "dependencies": { - "fs-extra": "^8.1.0", - "glob": "^7.1.4", - "iconv-lite": "^0.5.0", - "klaw-sync": "^6.0.0", - "lodash": "~4.17.15", - "semver": "~6.3.0" - }, - "engines": { - "node": ">= 0.10.0" + "node": ">=14.0.0" } }, - "node_modules/apidoc-core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/apidoc/node_modules/path-to-regexp": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", + "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==", + "dev": true }, "node_modules/append-field": { "version": "1.0.0", @@ -1134,13 +1589,10 @@ "dev": true }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/args": { "version": "5.0.1", @@ -1181,14 +1633,15 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, "engines": { "node": ">=8" } }, "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { "safer-buffer": "~2.1.0" } @@ -1229,19 +1682,10 @@ "node": ">=6" } }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -1271,7 +1715,8 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", @@ -1292,6 +1737,15 @@ "node": "*" } }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1309,20 +1763,20 @@ } }, "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", "dependencies": { - "bytes": "3.1.0", + "bytes": "3.1.1", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" }, "engines": { "node": ">= 0.8" @@ -1375,21 +1829,25 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "node_modules/bootstrap": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/boxen": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", - "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", + "string-width": "^4.2.2", "type-fest": "^0.20.2", "widest-line": "^3.1.0", "wrap-ansi": "^7.0.0" @@ -1416,9 +1874,9 @@ } }, "node_modules/boxen/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { "node": ">=10" }, @@ -1427,9 +1885,9 @@ } }, "node_modules/boxen/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1491,6 +1949,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1519,16 +1978,16 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" }, "bin": { "browserslist": "cli.js" @@ -1550,9 +2009,9 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/buffer-indexof": { "version": "1.1.1", @@ -1571,27 +2030,6 @@ "node": ">=0.8.0" } }, - "node_modules/busboy/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/busboy/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/busboy/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, "node_modules/byline": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", @@ -1601,9 +2039,9 @@ } }, "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", "engines": { "node": ">= 0.8" } @@ -1706,9 +2144,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001239", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz", - "integrity": "sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ==", + "version": "1.0.30001298", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz", + "integrity": "sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ==", "dev": true, "funding": { "type": "opencollective", @@ -1757,12 +2195,6 @@ "node": ">=4" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "node_modules/check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -1773,34 +2205,55 @@ } }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, "engines": { "node": ">=6" } @@ -1816,30 +2269,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinner": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", - "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/cli-table": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", - "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", "dependencies": { "colors": "1.0.3" }, @@ -1847,15 +2280,6 @@ "node": ">= 0.2.0" } }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -1866,23 +2290,18 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.0" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/clone-response": { @@ -1894,13 +2313,13 @@ } }, "node_modules/color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dev": true, "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "node_modules/color-convert": { @@ -1917,9 +2336,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "node_modules/color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dev": true, "dependencies": { "color-name": "^1.0.0", @@ -1927,9 +2346,9 @@ } }, "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, "node_modules/colors": { @@ -1941,12 +2360,12 @@ } }, "node_modules/colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "dev": true, "dependencies": { - "color": "3.0.x", + "color": "^3.1.3", "text-hex": "1.0.x" } }, @@ -1963,11 +2382,11 @@ } }, "node_modules/command-line-args": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz", - "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz", + "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==", "dependencies": { - "array-back": "^3.0.1", + "array-back": "^3.1.0", "find-replace": "^3.0.0", "lodash.camelcase": "^4.3.0", "typical": "^4.0.0" @@ -1991,9 +2410,9 @@ } }, "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", - "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "engines": { "node": ">=8" } @@ -2007,10 +2426,13 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } }, "node_modules/commondir": { "version": "1.0.1", @@ -2027,7 +2449,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "node_modules/concat-stream": { "version": "1.6.2", @@ -2043,6 +2466,11 @@ "typedarray": "^0.0.6" } }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -2057,6 +2485,11 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -2082,11 +2515,11 @@ } }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" @@ -2101,18 +2534,24 @@ } }, "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "dependencies": { "safe-buffer": "~5.1.1" } }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "engines": { "node": ">= 0.6" } @@ -2123,15 +2562,15 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "node_modules/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cors": { "version": "2.8.5", @@ -2145,29 +2584,24 @@ "node": ">= 0.10" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": ">= 8" } }, "node_modules/crypto-random-string": { @@ -2178,32 +2612,6 @@ "node": ">=8" } }, - "node_modules/css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2216,17 +2624,17 @@ } }, "node_modules/dateformat": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.5.1.tgz", - "integrity": "sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", "engines": { "node": "*" } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -2297,9 +2705,9 @@ } }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "node_modules/default-require-extensions": { @@ -2330,41 +2738,6 @@ "node": ">= 0.4" } }, - "node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/delayed": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/delayed/-/delayed-2.0.0.tgz", @@ -2412,27 +2785,6 @@ "node": ">=0.8.0" } }, - "node_modules/dicer/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/dicer/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/dicer/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -2442,10 +2794,17 @@ "node": ">=0.3.1" } }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "dev": true + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -2487,65 +2846,6 @@ "node": ">=6.0.0" } }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", - "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", - "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -2577,9 +2877,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron-to-chromium": { - "version": "1.3.757", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.757.tgz", - "integrity": "sha512-kP0ooyrvavDC+Y9UG6G/pUVxfRNM2VTJwtLQLvgsJeyf1V+7shMCb68Wj0/TETmfx8dWv9pToGkVT39udE87wQ==", + "version": "1.4.38", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.38.tgz", + "integrity": "sha512-WhHt3sZazKj0KK/UpgsbGQnUUoFeAHVishzHFExMxagpZgjiGYSC9S0ZlbhCfSH2L2i+2A1yyqOIliTctMx7KQ==", "dev": true }, "node_modules/emoji-regex": { @@ -2587,6 +2887,15 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", @@ -2609,10 +2918,39 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/env-paths": { "version": "2.2.1", @@ -2622,6 +2960,18 @@ "node": ">=6" } }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/error-stack-parser": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz", @@ -2630,27 +2980,326 @@ "stackframe": "^0.3.1" } }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "engines": { - "node": ">=8" - } + "node_modules/esbuild": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.10.tgz", + "integrity": "sha512-ibZb+NwFqBwHHJlpnFMtg4aNmVK+LUtYMFC9CuKs6lDCBEvCHpqCFZFEirpqt1jOugwKGx8gALNGvX56lQyfew==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "optionalDependencies": { + "esbuild-android-arm64": "0.14.10", + "esbuild-darwin-64": "0.14.10", + "esbuild-darwin-arm64": "0.14.10", + "esbuild-freebsd-64": "0.14.10", + "esbuild-freebsd-arm64": "0.14.10", + "esbuild-linux-32": "0.14.10", + "esbuild-linux-64": "0.14.10", + "esbuild-linux-arm": "0.14.10", + "esbuild-linux-arm64": "0.14.10", + "esbuild-linux-mips64le": "0.14.10", + "esbuild-linux-ppc64le": "0.14.10", + "esbuild-linux-s390x": "0.14.10", + "esbuild-netbsd-64": "0.14.10", + "esbuild-openbsd-64": "0.14.10", + "esbuild-sunos-64": "0.14.10", + "esbuild-windows-32": "0.14.10", + "esbuild-windows-64": "0.14.10", + "esbuild-windows-arm64": "0.14.10" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.10.tgz", + "integrity": "sha512-vzkTafHKoiMX4uIN1kBnE/HXYLpNT95EgGanVk6DHGeYgDolU0NBxjO7yZpq4ZGFPOx8384eAdDrBYhO11TAlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.10.tgz", + "integrity": "sha512-DJwzFVB95ZV7C3PQbf052WqaUuuMFXJeZJ0LKdnP1w+QOU0rlbKfX0tzuhoS//rOXUj1TFIwRuRsd0FX6skR7A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.10.tgz", + "integrity": "sha512-RNaaoZDg3nsqs5z56vYCjk/VJ76npf752W0rOaCl5lO5TsgV9zecfdYgt7dtUrIx8b7APhVaNYud+tGsDOVC9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.10.tgz", + "integrity": "sha512-10B3AzW894u6bGZZhWiJOHw1uEHb4AFbUuBdyml1Ht0vIqd+KqWW+iY/yMwQAzILr2WJZqEhbOXRkJtY8aRqOw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.10.tgz", + "integrity": "sha512-mSQrKB7UaWvuryBTCo9leOfY2uEUSimAvcKIaUWbk5Hth9Sg+Try+qNA/NibPgs/vHkX0KFo/Rce6RPea+P15g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.10.tgz", + "integrity": "sha512-lktF09JgJLZ63ANYHIPdYe339PDuVn19Q/FcGKkXWf+jSPkn5xkYzAabboNGZNUgNqSJ/vY7VrOn6UrBbJjgYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.10.tgz", + "integrity": "sha512-K+gCQz2oLIIBI8ZM77e9sYD5/DwEpeYCrOQ2SYXx+R4OU2CT9QjJDi4/OpE7ko4AcYMlMW7qrOCuLSgAlEj4Wg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.10.tgz", + "integrity": "sha512-BYa60dZ/KPmNKYxtHa3LSEdfKWHcm/RzP0MjB4AeBPhjS0D6/okhaBesZIY9kVIGDyeenKsJNOmnVt4+dhNnvQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.10.tgz", + "integrity": "sha512-+qocQuQvcp5wo/V+OLXxqHPc+gxHttJEvbU/xrCGE03vIMqraL4wMua8JQx0SWEnJCWP+Nhf//v8OSwz1Xr5kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.10.tgz", + "integrity": "sha512-nmUd2xoBXpGo4NJCEWoaBj+n4EtDoLEvEYc8Z3aSJrY0Oa6s04czD1flmhd0I/d6QEU8b7GQ9U0g/rtBfhtxBg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.10.tgz", + "integrity": "sha512-vsOWZjm0rZix7HSmqwPph9arRVCyPtUpcURdayQDuIhMG2/UxJxpbdRaa//w4zYqcJzAWwuyH2PAlyy0ZNuxqQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.10.tgz", + "integrity": "sha512-knArKKZm0ypIYWOWyOT7+accVwbVV1LZnl2FWWy05u9Tyv5oqJ2F5+X2Vqe/gqd61enJXQWqoufXopvG3zULOg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-loader": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-2.18.0.tgz", + "integrity": "sha512-AKqxM3bI+gvGPV8o6NAhR+cBxVO8+dh+O0OXBHIXXwuSGumckbPWHzZ17subjBGI2YEGyJ1STH7Haj8aCrwL/w==", + "dev": true, + "dependencies": { + "esbuild": "^0.14.6", + "joycon": "^3.0.1", + "json5": "^2.2.0", + "loader-utils": "^2.0.0", + "tapable": "^2.2.0", + "webpack-sources": "^2.2.0" + }, + "funding": { + "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" + }, + "peerDependencies": { + "webpack": "^4.40.0 || ^5.0.0" + } + }, + "node_modules/esbuild-loader/node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.10.tgz", + "integrity": "sha512-6Gg8neVcLeyq0yt9bZpReb8ntZ8LBEjthxrcYWVrBElcltnDjIy1hrzsujt0+sC2rL+TlSsE9dzgyuvlDdPp2w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ] + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.10.tgz", + "integrity": "sha512-9rkHZzp10zI90CfKbFrwmQjqZaeDmyQ6s9/hvCwRkbOCHuto6RvMYH9ghQpcr5cUxD5OQIA+sHXi0zokRNXjcg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.10.tgz", + "integrity": "sha512-mEU+pqkhkhbwpJj5DiN3vL0GUFR/yrL3qj8ER1amIVyRibKbj02VM1QaIuk1sy5DRVIKiFXXgCaHvH3RNWCHIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ] + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.10.tgz", + "integrity": "sha512-Z5DieUL1N6s78dOSdL95KWf8Y89RtPGxIoMF+LEy8ChDsX+pZpz6uAVCn+YaWpqQXO+2TnrcbgBIoprq2Mco1g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.10.tgz", + "integrity": "sha512-LE5Mm62y0Bilu7RDryBhHIX8rK3at5VwJ6IGM3BsASidCfOBTzqcs7Yy0/Vkq39VKeTmy9/66BAfVoZRNznoDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.10.tgz", + "integrity": "sha512-OJOyxDtabvcUYTc+O4dR0JMzLBz6G9+gXIHA7Oc5d5Fv1xiYa0nUeo8+W5s2e6ZkPRdIwOseYoL70rZz80S5BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } }, "node_modules/escape-html": { "version": "1.0.3", @@ -2666,46 +3315,47 @@ } }, "node_modules/eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", + "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -2713,28 +3363,32 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-formatter-pretty": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-3.0.1.tgz", - "integrity": "sha512-hhQ/ASD4i6BAEalcEfUxesFtJFftT8xFsimCzUpPbTzygJ4J17yCGcJ3XKCB2g7XTJTv0pi7rVTadfHVmtfSRA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", + "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", "dev": true, "dependencies": { + "@types/eslint": "^7.2.13", "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", + "chalk": "^4.1.0", "eslint-rule-docs": "^1.1.5", - "log-symbols": "^3.0.0", - "plur": "^3.0.1", + "log-symbols": "^4.0.0", + "plur": "^4.0.0", "string-width": "^4.2.0", "supports-hyperlinks": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-formatter-pretty/node_modules/ansi-styles": { @@ -2753,16 +3407,19 @@ } }, "node_modules/eslint-formatter-pretty/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/eslint-formatter-pretty/node_modules/color-convert": { @@ -2805,19 +3462,19 @@ } }, "node_modules/eslint-plugin-tsdoc": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.11.tgz", - "integrity": "sha512-vEjGANpmBfrvpKj9rwePGhA+gIe1mp+dhDZsrkxlHqPVOZvzVdFSV9fxu/o3eppmxhybI8brD88jOrLEAIB9Gw==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.14.tgz", + "integrity": "sha512-fJ3fnZRsdIoBZgzkQjv8vAj6NeeOoFkTfgosj6mKsFjX70QV256sA/wq+y/R2+OL4L8E79VVaVWrPeZnKNe8Ng==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.13.0", - "@microsoft/tsdoc-config": "0.14.0" + "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc-config": "0.15.2" } }, "node_modules/eslint-rule-docs": { - "version": "1.1.223", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.223.tgz", - "integrity": "sha512-6HU1vH6b3QBI2RiFyNE1cQWr2pQ+op1zqZRsVXBZsLngF5ePBGDbkwFtr1Ye4Yq1DBKc499TMEkIzx25xVetuw==", + "version": "1.1.231", + "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.231.tgz", + "integrity": "sha512-egHz9A1WG7b8CS0x1P6P/Rj5FqZOjray/VjpJa14tMZalfRKvpE2ONJ3plCM7+PcinmU4tcmbPLv0VtwzSdLVA==", "dev": true }, "node_modules/eslint-scope": { @@ -2834,71 +3491,166 @@ } }, "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" } }, "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/regexpp": { + "node_modules/eslint/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6.5.0" + "node": ">=7.0.0" } }, - "node_modules/eslint/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "dependencies": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" }, "engines": { - "node": ">=6.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/esprima": { @@ -2927,9 +3679,9 @@ } }, "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -2948,9 +3700,9 @@ } }, "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -2982,22 +3734,82 @@ "node": ">= 0.6" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/expose-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-3.1.0.tgz", + "integrity": "sha512-2RExSo0yJiqP+xiUue13jQa2IHE8kLDzTI7b6kn+vUlBVvlzNSiLDzo4e5Pp5J039usvTUnxZ8sUOhv0Kg15NA==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, "node_modules/expr-eval": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expr-eval/-/expr-eval-2.0.2.tgz", "integrity": "sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==" }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", + "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", "dependencies": { "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -3011,13 +3823,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.6", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -3028,9 +3840,9 @@ } }, "node_modules/express-async-handler": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.1.4.tgz", - "integrity": "sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.2.0.tgz", + "integrity": "sha512-rCSVtPXRmQSW8rmik/AIb2P0op6l7r1fMW538yyvTMltCO4xQEWMmobfrIxN2V1/mVrgxB8Az3reYF6yUZw37w==" }, "node_modules/express/node_modules/debug": { "version": "2.6.9", @@ -3045,38 +3857,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3084,19 +3864,31 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz", + "integrity": "sha512-MBwILhhD92sziIrMQwpqcuGERF+BH99ei2a3XsGJuqEKcSycAL+w0HWokFenZXona+kjFr82Lf71eTxNRC06XQ==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/fast-json-stable-stringify": { @@ -3112,22 +3904,29 @@ "dev": true }, "node_modules/fast-redact": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.1.tgz", - "integrity": "sha512-kYpn4Y/valC9MdrISg47tZOpYBNoTXKgT9GYXFpHN/jYFs+lFkPoisY+LcBODdKVMY96ATzvzsWv+ES/4Kmufw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.2.tgz", + "integrity": "sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg==", "engines": { "node": ">=6" } }, "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true }, "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -3146,31 +3945,16 @@ "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==", "dev": true }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=4" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/file-uri-to-path": { @@ -3220,9 +4004,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "dependencies": { "commondir": "^1.0.1", @@ -3273,17 +4057,16 @@ } }, "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=4" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatstr": { @@ -3292,9 +4075,9 @@ "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" }, "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, "node_modules/fn.name": { @@ -3303,11 +4086,6 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", "dev": true }, - "node_modules/foreachasync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", - "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" - }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -3321,92 +4099,34 @@ "node": ">=8.0.0" } }, - "node_modules/foreground-child/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/foreground-child/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" } }, "node_modules/formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", "dev": true, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } }, "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { "node": ">= 0.6" } @@ -3440,23 +4160,24 @@ ] }, "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=12" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "node_modules/fsevents": { "version": "2.3.2", @@ -3550,9 +4271,10 @@ } }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3569,16 +4291,23 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "node_modules/global-dirs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", @@ -3594,12 +4323,12 @@ } }, "node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "dependencies": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" @@ -3609,24 +4338,28 @@ } }, "node_modules/globals/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -3636,14 +4369,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "engines": { - "node": ">= 4" - } - }, "node_modules/got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -3666,9 +4391,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "node_modules/growl": { "version": "1.10.5", @@ -3730,6 +4455,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -3780,15 +4519,6 @@ "hexy": "bin/hexy_cmd.js" } }, - "node_modules/highlight.js": { - "version": "10.7.2", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.2.tgz", - "integrity": "sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/hoek": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", @@ -3799,28 +4529,10 @@ } }, "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, "node_modules/http-cache-semantics": { "version": "4.1.0", @@ -3828,24 +4540,28 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } }, "node_modules/humanize": { "version": "0.0.9", @@ -3856,21 +4572,21 @@ } }, "node_modules/iconv-lite": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -3906,6 +4622,25 @@ "node": ">=4" } }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3918,6 +4653,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "engines": { "node": ">=8" } @@ -3926,6 +4662,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3944,125 +4681,10 @@ "node": ">=10" } }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true, "engines": { "node": ">= 0.10" @@ -4082,20 +4704,21 @@ } }, "node_modules/irregular-plurals": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", - "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", + "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4133,9 +4756,9 @@ } }, "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -4145,9 +4768,12 @@ } }, "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -4172,9 +4798,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4224,14 +4850,6 @@ "node": ">=8" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -4249,13 +4867,25 @@ "node": ">=8" } }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dependencies": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4265,12 +4895,15 @@ } }, "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-typedarray": { @@ -4278,6 +4911,18 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -4293,9 +4938,9 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "node_modules/isemail": { "version": "3.2.0", @@ -4314,10 +4959,19 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { "node": ">=8" @@ -4359,91 +5013,20 @@ "semver": "bin/semver.js" } }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, "engines": { "node": ">=8" } @@ -4458,21 +5041,6 @@ "uuid": "bin/uuid" } }, - "node_modules/istanbul-lib-processinfo/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", @@ -4509,9 +5077,9 @@ } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -4519,13 +5087,13 @@ "source-map": "^0.6.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", + "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -4535,6 +5103,44 @@ "node": ">=8" } }, + "node_modules/jest-worker": { + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -4580,6 +5186,12 @@ "node": ">=6" } }, + "node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", + "dev": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4587,13 +5199,12 @@ "dev": true }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -4653,19 +5264,28 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/jsrsasign": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-10.3.0.tgz", - "integrity": "sha512-irDIKKFW++EAELgP3fjFi5/Fn0XEyfuQTTgpbeFwCGkV6tRIYZl3uraRea2HTXWCstcSZuDaCbdAhU1n+075Bg==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-10.5.1.tgz", + "integrity": "sha512-yW0fq87KNZFw4Pn5ySllXs3ztZAROQZczEheKZTqmiNpCe/Xj9r5NhuAQ7MXTOyEZGJ/+MPHGTsfbgPFaLpwHQ==", "funding": { "url": "https://github.com/kjur/jsrsasign#donations" } @@ -4678,6 +5298,15 @@ "json-buffer": "3.0.0" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/klaw-sync": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", @@ -4713,27 +5342,50 @@ } }, "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", "dev": true, "dependencies": { "uc.micro": "^1.0.1" } }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4765,35 +5417,115 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "chalk": "^2.4.2" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz", + "integrity": "sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ==", "dev": true, "dependencies": { "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", "fecha": "^4.2.0", "ms": "^2.1.1", + "safe-stable-stringify": "^1.1.0", "triple-beam": "^1.3.0" } }, "node_modules/logform/node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.1.tgz", + "integrity": "sha512-urbBmMVnD1vk0mUwCpnWv06P3f16EF+RMTtIXTkylJk5mAdfrMepu9B3hhSnL8DGkc1Ra6pENJHrXTKvcAZ0wA==", "dev": true, "engines": { "node": ">=0.1.90" @@ -4824,11 +5556,11 @@ } }, "node_modules/ltx": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/ltx/-/ltx-2.10.0.tgz", - "integrity": "sha512-RB4zR6Mrp/0wTNS9WxMvpgfht/7u/8QAC9DpPD19opL/4OASPa28uoliFqeDkLUU8pQ4aeAfATBZmz1aSAHkMw==", - "dependencies": { - "inherits": "^2.0.4" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ltx/-/ltx-3.0.0.tgz", + "integrity": "sha512-bu3/4/ApUmMqVNuIkHaRhqVtEi6didYcBDIF56xhPRCzVpdztCipZ62CUuaxMlMBUzaVL93+4LZRqe02fuAG6A==", + "engines": { + "node": ">= 12.4.0" } }, "node_modules/lunr": { @@ -4866,14 +5598,14 @@ "dev": true }, "node_modules/markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "entities": "~2.0.0", - "linkify-it": "^2.0.0", + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, @@ -4882,15 +5614,15 @@ } }, "node_modules/marked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.0.0.tgz", - "integrity": "sha512-Wo+L1pWTVibfrSr+TTtMuiMfNzmZWiOPeO7rZsQUY5bgsxpHesBEcIWJloWVTFnrMXnf/TL30eTFSGJddmQAng==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", "dev": true, "bin": { "marked": "bin/marked" }, "engines": { - "node": ">= 8.16.2" + "node": ">= 12" } }, "node_modules/mdurl": { @@ -4912,10 +5644,17 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "engines": { "node": ">= 8" } @@ -4929,15 +5668,16 @@ } }, "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, "dependencies": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, "node_modules/mime": { @@ -4952,19 +5692,19 @@ } }, "node_modules/mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dependencies": { - "mime-db": "1.47.0" + "mime-db": "1.51.0" }, "engines": { "node": ">= 0.6" @@ -4991,6 +5731,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5007,122 +5748,77 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", - "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 10.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/mocha/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "dependencies": { + "minimist": "^1.2.5" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/mocha/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/mocha": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", + "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" }, "engines": { - "node": ">=8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/mocha/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/mocha/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "ms": "2.1.2" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/mocha/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "node_modules/mocha/node_modules/escape-string-regexp": { @@ -5137,37 +5833,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "node_modules/mocha/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/log-symbols": { + "node_modules/mocha/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "chalk": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/mocha/node_modules/ms": { @@ -5191,21 +5883,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/mocha/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/mri": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", @@ -5221,14 +5898,14 @@ "dev": true }, "node_modules/multer": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", - "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", + "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", "dependencies": { "append-field": "^1.0.0", "busboy": "^0.2.11", "concat-stream": "^1.5.2", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.4", "object-assign": "^4.1.1", "on-finished": "^2.3.0", "type-is": "^1.6.4", @@ -5255,21 +5932,15 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" }, "node_modules/nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -5298,12 +5969,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node_modules/node-expat": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/node-expat/-/node-expat-2.4.0.tgz", @@ -5315,60 +5980,60 @@ } }, "node_modules/node-opcua": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua/-/node-opcua-2.37.0.tgz", - "integrity": "sha512-+0rLLsnVWIjhxtqbFmL+y9Pb96BPV1Gsqv2ibWGhs65gbUdtoN8O7vdoQ0/9dRWZ8efqSw05IJECk+ECi4JkKg==", - "dependencies": { - "chalk": "^4.1.0", - "node-opcua-address-space": "2.37.0", - "node-opcua-address-space-for-conformance-testing": "2.37.0", - "node-opcua-aggregates": "2.37.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-certificate-manager": "2.37.0", - "node-opcua-client": "2.37.0", - "node-opcua-client-crawler": "2.37.0", - "node-opcua-client-proxy": "2.37.0", - "node-opcua-common": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-data-access": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-hostname": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-nodesets": "2.36.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-packet-analyzer": "2.37.0", - "node-opcua-secure-channel": "2.37.0", - "node-opcua-server": "2.37.0", - "node-opcua-server-discovery": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-discovery": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-history": "2.37.0", - "node-opcua-service-node-management": "2.37.0", - "node-opcua-service-query": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-register-node": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-service-session": "2.37.0", - "node-opcua-service-subscription": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-transport": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "node-opcua-vendor-diagnostic": "2.37.0", - "semver": "^7.3.4" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua/-/node-opcua-2.62.7.tgz", + "integrity": "sha512-D56oRaJ1E0/00UhmsC+ZyokzZOUMRQs0coEixNMLCN7YVuJQxlTjnvZ6L/SQEr50cqjRUR3P+PE/y3z+0os/RQ==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-address-space": "2.62.7", + "node-opcua-address-space-for-conformance-testing": "2.62.7", + "node-opcua-aggregates": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-certificate-manager": "2.62.7", + "node-opcua-client": "2.62.7", + "node-opcua-client-crawler": "2.62.7", + "node-opcua-client-proxy": "2.62.7", + "node-opcua-common": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-data-access": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-hostname": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-nodesets": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-packet-analyzer": "2.62.7", + "node-opcua-secure-channel": "2.62.7", + "node-opcua-server": "2.62.7", + "node-opcua-server-discovery": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-discovery": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-service-node-management": "2.62.7", + "node-opcua-service-query": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-register-node": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-service-session": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-transport": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "node-opcua-vendor-diagnostic": "2.62.7", + "semver": "^7.3.5" }, "engines": { "node": ">=8.10" @@ -5378,43 +6043,89 @@ } }, "node_modules/node-opcua-address-space": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-address-space/-/node-opcua-address-space-2.37.0.tgz", - "integrity": "sha512-mFG7OL9pYI5htkJw0vbKFmdGKMq9rrh9ttM8/DuPu96rhF393zOiFw30j9VxpokR4A8jrGFaFYUP5EF5r5ZsFA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-address-space/-/node-opcua-address-space-2.62.7.tgz", + "integrity": "sha512-R+8mOPAdqpjsjJG//Y7d5bUaubrsfpubPjC42juB4GlwNk8lAhcrD+X4Fx48FUSKcDZN+nJK+XHRln4MgrC2WQ==", "dependencies": { - "@types/lodash": "4.14.168", - "async": "^3.2.0", - "chalk": "^4.1.0", + "@types/lodash": "4.14.177", + "async": "^3.2.2", + "chalk": "4.1.2", + "dequeue": "^1.0.5", + "lodash": "4.17.21", + "node-opcua-address-space-base": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-client-dynamic-extension-object": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-access": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-nodeset-ua": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pseudo-session": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "node-opcua-xml2json": "2.62.7", + "set-prototype-of": "^1.0.0", + "thenify": "^3.3.1", + "xml-writer": "^1.7.0" + }, + "engines": { + "node": ">=6.10" + } + }, + "node_modules/node-opcua-address-space-base": { + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-address-space-base/-/node-opcua-address-space-base-2.62.7.tgz", + "integrity": "sha512-VNFZ4gOuBe7qIl9GoIqp4RlKJhUXbfVRsRzH5v7SQDxUYdLt2mgXdk4a6ME53u0HhdxZr9hZvRXfqWqGSIw4FA==", + "dependencies": { + "@types/lodash": "4.14.177", + "async": "^3.2.2", + "chalk": "4.1.2", "dequeue": "^1.0.5", "lodash": "4.17.21", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-client-dynamic-extension-object": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-access": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-pseudo-session": "2.37.0", - "node-opcua-schemas": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-history": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "node-opcua-xml2json": "2.37.0", - "pretty-error": "^3.0.3", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-client-dynamic-extension-object": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-access": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pseudo-session": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "node-opcua-xml2json": "2.62.7", "set-prototype-of": "^1.0.0", "thenify": "^3.3.1", "xml-writer": "^1.7.0" @@ -5423,21 +6134,85 @@ "node": ">=6.10" } }, + "node_modules/node-opcua-address-space-base/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/node-opcua-address-space-base/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/node-opcua-address-space-base/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/node-opcua-address-space-base/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/node-opcua-address-space-base/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/node-opcua-address-space-base/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/node-opcua-address-space-for-conformance-testing": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-address-space-for-conformance-testing/-/node-opcua-address-space-for-conformance-testing-2.37.0.tgz", - "integrity": "sha512-IVXryaVTEertNOSqZ3Sw2DqKC51Cs6iqQUYBWNFTAxDHgu7u6hvQeuwY86zaRI4IBujGzVRf3WroNl5xvSqhJg==", - "dependencies": { - "node-opcua-address-space": "2.37.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-data-access": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-address-space-for-conformance-testing/-/node-opcua-address-space-for-conformance-testing-2.62.7.tgz", + "integrity": "sha512-arAa04mB6UJYK28MSjrw3Dk4uWvCrN7FGWzDoN5yT+DQngd89HuymMSgbvQE806sOD/0dO8YY6SLoqS4CO3Jcw==", + "dependencies": { + "node-opcua-address-space": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-data-access": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node_modules/node-opcua-address-space/node_modules/ansi-styles": { @@ -5455,9 +6230,9 @@ } }, "node_modules/node-opcua-address-space/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5505,33 +6280,32 @@ } }, "node_modules/node-opcua-aggregates": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-aggregates/-/node-opcua-aggregates-2.37.0.tgz", - "integrity": "sha512-DlKNtaVVrOMhVZl/fN19plQ1dxRBsBExKZDAPqspEiOXwzkyr9mNMDkWIziVCV9pgVF7FZUAHwEkVUO9cCFdrw==", - "dependencies": { - "@types/async": "^3.2.5", - "node-opcua-address-space": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-nodesets": "2.36.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-service-history": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-aggregates/-/node-opcua-aggregates-2.62.7.tgz", + "integrity": "sha512-jihyxxBNfuh7dRpbEsYMTng1/SIvIxC5ykWK0DJ2ZF3zrGOus/6BCO8RJYEZAQELZyfqHPTOYFuowL6S0l1WjQ==", + "dependencies": { + "@types/async": "^3.2.10", + "node-opcua-address-space": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-nodesets": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node_modules/node-opcua-assert": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-assert/-/node-opcua-assert-2.37.0.tgz", - "integrity": "sha512-J7E9mhp1bFHX9FCM40Jlekyaj0ZqCtT6VR9M6438Tn6qGPaL2zYwPBNDHmaHt/eFPjLwHRHXvQhDBCA0OvxPrQ==", + "version": "2.55.0", + "resolved": "https://registry.npmjs.org/node-opcua-assert/-/node-opcua-assert-2.55.0.tgz", + "integrity": "sha512-FmgDd7d8/s6V0K277dRyMhVNEH+CRzZxJR2Ix+cJxSQ340tkFvjLeI2CmiwMTKpozIsK2QiV4HY658RSvypiEA==", "dependencies": { "better-assert": "^1.0.2", - "chalk": "^4.1.0", - "pretty-error": "^3.0.3" + "chalk": "4.1.2" } }, "node_modules/node-opcua-assert/node_modules/ansi-styles": { @@ -5549,9 +6323,9 @@ } }, "node_modules/node-opcua-assert/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5599,58 +6373,58 @@ } }, "node_modules/node-opcua-basic-types": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-basic-types/-/node-opcua-basic-types-2.37.0.tgz", - "integrity": "sha512-tEwRzu7AYJpgYCuNojBaKehMj8JOsf0/dhyyNu1ozxpKT81BQUwVY8QW4g1HuhYjKTfbD8FwT27TnEp01gHv3Q==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-basic-types/-/node-opcua-basic-types-2.62.7.tgz", + "integrity": "sha512-MOdSNOW1JNe/Ns4Ju+qZgUjfSACk/yjzwvZk6TsCSU/97Ck8zm7IWMSBf6GI0/1ZRP58fv4bBPCRd4dN423MZA==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-guid": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-guid": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7" } }, "node_modules/node-opcua-binary-stream": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-binary-stream/-/node-opcua-binary-stream-2.37.0.tgz", - "integrity": "sha512-B8SMbyPFngoYi4WV5EPJYgfuVoKYq0zM70Onn7sLDv/PMp4pUwzMnUxvTt1rpo9hdf01tGP+ePDs9HQOATaKIg==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-binary-stream/-/node-opcua-binary-stream-2.62.7.tgz", + "integrity": "sha512-J+SdUdC/mUFcBeHQ5sNGWE/se47c0Svz3U4yG3/BYHq/fhQ0Wdk+oSi7/+qR3qGxxbafyNPwQGftGH9zsaNIoQ==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-buffer-utils": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-buffer-utils": "2.62.7" } }, "node_modules/node-opcua-buffer-utils": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-buffer-utils/-/node-opcua-buffer-utils-2.37.0.tgz", - "integrity": "sha512-5O2XyamlcdqMmbhnN8ZY0vTvoqPy1xfXM58m4A4J8h15P7HK97BTv3bI4ekw6YEONs07yaAFqt7sHE2i69T7FA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-buffer-utils/-/node-opcua-buffer-utils-2.62.7.tgz", + "integrity": "sha512-8RLR/tZovV83S4HMcREebTLA5n+JWYsmSWztUxFqK99PXkjmk5oAqxyk2RUL0NhzkP5gcSdjjnUMhM/hwlo7OQ==", "dependencies": { - "node-opcua-assert": "2.37.0" + "node-opcua-assert": "2.55.0" } }, "node_modules/node-opcua-certificate-manager": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-certificate-manager/-/node-opcua-certificate-manager-2.37.0.tgz", - "integrity": "sha512-o6GmWoJG6pnWTft61HYdG7SbYONrtstRHZALcrwHgnmGigoL4RIiHvxQkrqzbOtg/pOXHRSQZnU0vziBCydCPg==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-certificate-manager/-/node-opcua-certificate-manager-2.62.7.tgz", + "integrity": "sha512-e2j8OAH+ZDqQiW0eN5ypExbOz7i287WvrqBHPRp0a8uk2bNkc94xbY+WiiUlZbw7DvugDU78q02db+7mdP1A3w==", "dependencies": { - "@types/mkdirp": "0.5.2", - "chalk": "^4.1.0", + "@types/mkdirp": "1.0.1", + "chalk": "4.1.2", "delayed": "^2.0.0", - "env-paths": "^2.2.1", - "mkdirp": "0.5.5", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-debug": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-pki": "^2.8.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", + "env-paths": "2.2.1", + "mkdirp": "1.0.4", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-debug": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pki": "^2.13.0", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", "once": "^1.4.0", "thenify": "^3.3.1" } @@ -5670,9 +6444,9 @@ } }, "node_modules/node-opcua-certificate-manager/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5708,6 +6482,17 @@ "node": ">=8" } }, + "node_modules/node-opcua-certificate-manager/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-opcua-certificate-manager/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5720,17 +6505,17 @@ } }, "node_modules/node-opcua-chunkmanager": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-chunkmanager/-/node-opcua-chunkmanager-2.37.0.tgz", - "integrity": "sha512-t6NAU2mFUS6KEgg38O0K5u4xXECaqS5Wh/d73QyEbwCsNcLUrBjo9SkVUwVW7MB8y7We0hyo1raXt0KfR5BfGQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-chunkmanager/-/node-opcua-chunkmanager-2.62.7.tgz", + "integrity": "sha512-RaEnDosux6ZHZWs6f4feVszysCh4Q60NY/7+yJnRK4G4zs/rkpV3x2aP9/dMMZmyYmeoa6JWWzB1sorHis+UzQ==", "dependencies": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-packet-assembler": "2.37.0" + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-packet-assembler": "2.62.7" } }, "node_modules/node-opcua-chunkmanager/node_modules/ansi-styles": { @@ -5748,9 +6533,9 @@ } }, "node_modules/node-opcua-chunkmanager/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5798,103 +6583,105 @@ } }, "node_modules/node-opcua-client": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-client/-/node-opcua-client-2.37.0.tgz", - "integrity": "sha512-p8vjGyw31IVImatoPb7+SQMaXGRcYjyeFuWEuueohGJosgh+qqVySKlQ61ZztoQxwrBTStiYiduVk69shvGF2A==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-client/-/node-opcua-client-2.62.7.tgz", + "integrity": "sha512-q3MNUR+1y1O1DDGot60mLgKJD65fK7JPAD1blTQuj5Co/NGzj1U4ON4t0eD3a90DZwaqQjt3GY8OLSkHYmWPzg==", "dependencies": { - "@types/async": "^3.2.5", + "@ster5/global-mutex": "^1.2.0", + "@types/async": "^3.2.10", "@types/once": "^1.4.0", - "@types/underscore": "^1.11.0", - "async": "^3.2.0", + "@types/underscore": "^1.11.4", + "async": "^3.2.2", "callbackify": "^1.1.0", - "chalk": "^4.1.0", + "chalk": "4.1.2", "delayed": "^2.0.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-certificate-manager": "2.37.0", - "node-opcua-client-dynamic-extension-object": "2.37.0", - "node-opcua-common": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-hostname": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-pki": "^2.8.0", - "node-opcua-pseudo-session": "2.37.0", - "node-opcua-schemas": "2.37.0", - "node-opcua-secure-channel": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-discovery": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-history": "2.37.0", - "node-opcua-service-query": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-register-node": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-service-session": "2.37.0", - "node-opcua-service-subscription": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-certificate-manager": "2.62.7", + "node-opcua-client-dynamic-extension-object": "2.62.7", + "node-opcua-common": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-hostname": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pki": "^2.13.0", + "node-opcua-pseudo-session": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-secure-channel": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-discovery": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-service-query": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-register-node": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-service-session": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", "once": "^1.4.0", "thenify": "^3.3.1", - "underscore": "^1.12.0" + "underscore": "^1.13.1" } }, "node_modules/node-opcua-client-crawler": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-client-crawler/-/node-opcua-client-crawler-2.37.0.tgz", - "integrity": "sha512-JtGvZreN8ovkU/gSvRzKcGRs7XzWZ2N90lJYd3lvIO4uMb26k2JG/nwEQoF7a9PXWB4mJNcb7wsr01vp7bfHJQ==", - "dependencies": { - "@types/underscore": "^1.11.0", - "async": "^3.2.0", - "node-opcua-assert": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "underscore": "^1.12.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-client-crawler/-/node-opcua-client-crawler-2.62.7.tgz", + "integrity": "sha512-ZJIZ4Qh2wERA5wRS1MDYsrLmshLY04FVhp8/cRwXWnmcsSGV2l23ANLFgBcfh+NN0SJ1rNI84GdKRfjaxSCFAA==", + "dependencies": { + "@types/underscore": "^1.11.4", + "async": "^3.2.2", + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "underscore": "^1.13.1" } }, "node_modules/node-opcua-client-dynamic-extension-object": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-client-dynamic-extension-object/-/node-opcua-client-dynamic-extension-object-2.37.0.tgz", - "integrity": "sha512-+C03iThIMcQJ2/rtCIT9oaiphKvHoz0m0WNZxSMXyMuN1ypoOHUj9uKwvXSqOfrlxFzE/pqjURjjb1E/utW8dA==", - "dependencies": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-pseudo-session": "2.37.0", - "node-opcua-schemas": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-client-dynamic-extension-object/-/node-opcua-client-dynamic-extension-object-2.62.7.tgz", + "integrity": "sha512-HeScp0JbRn+Pcwo5uRkEFTBvKitcXrS2NMXxnHCSsorRYxk0UZ9UVkxYJA6TIzoHnvvExa9bOCd8gjZF5NjMyg==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-pseudo-session": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node_modules/node-opcua-client-dynamic-extension-object/node_modules/ansi-styles": { @@ -5912,9 +6699,9 @@ } }, "node_modules/node-opcua-client-dynamic-extension-object/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5962,26 +6749,27 @@ } }, "node_modules/node-opcua-client-proxy": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-client-proxy/-/node-opcua-client-proxy-2.37.0.tgz", - "integrity": "sha512-ULLPqmYsDorgnVSDrRyynO/9w0Ip12v+WdJZGIhjEiPs5j7h3WLoA/9dW6THuVr61anG2Mhy8QQvlhML3uAQGw==", - "dependencies": { - "async": "^3.2.0", - "node-opcua-address-space": "2.37.0", - "node-opcua-assert": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-pseudo-session": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-subscription": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-client-proxy/-/node-opcua-client-proxy-2.62.7.tgz", + "integrity": "sha512-N7e1Pz61BtfO5CMft6chjzDfTLAWY5/JT2eBLgNl1FGFeV0iqugGAVt87WbhO/ClsECZ9UN/Ts2gdbzooPIMSw==", + "dependencies": { + "async": "^3.2.2", + "node-opcua-address-space": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-pseudo-session": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node_modules/node-opcua-client/node_modules/ansi-styles": { @@ -5999,9 +6787,9 @@ } }, "node_modules/node-opcua-client/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6049,35 +6837,35 @@ } }, "node_modules/node-opcua-common": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-common/-/node-opcua-common-2.37.0.tgz", - "integrity": "sha512-Co7qu2MTRaVitu3CNa0M6kWQ2PvbuN+1JKKSetKhazsydpDonkP3It6iW1R9JBNMmdN6ZqhIb+q0ul0PR52jZQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-common/-/node-opcua-common-2.62.7.tgz", + "integrity": "sha512-thxcDDaJ1OUu3TXagOMMWtnZcjN9Y2kMWr+EwqFeqYQBb6xl5eCQ9aqki7g529Czh0//d1UQSFOl6qENWXHmWQ==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-constants": { - "version": "2.35.0", - "resolved": "https://registry.npmjs.org/node-opcua-constants/-/node-opcua-constants-2.35.0.tgz", - "integrity": "sha512-KHHA5X9wNXE86U6Am31DrEzhoVGObbc65VWI4U4xQ7vqXCwESz2mLckGTzbGnp8d5zoCZFHv9kF2uy/f6KNzFw==" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-constants/-/node-opcua-constants-2.62.7.tgz", + "integrity": "sha512-Q1dyR7zkcLplGQRn+FSeHBHTA++WCbHc7Sm8XKMFteKMmhHCf9JBnQRhNAfyM9DiWHjpCjF7//JAkHQKwsteFQ==" }, "node_modules/node-opcua-crypto": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/node-opcua-crypto/-/node-opcua-crypto-1.7.1.tgz", - "integrity": "sha512-h8qKcDKk2bQcsfZww2NxJ1yhYcl7LfBfrBgVpeAwC5w9J7aebM5zb5fuseWpifgvWD2R5CZvOnhlNOypNLkIRQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/node-opcua-crypto/-/node-opcua-crypto-1.8.0.tgz", + "integrity": "sha512-rFFsDKAJg1rxoSCXZ2JOTybyC+Aw/jLm8ksiiROX69ZZoFw9rgoA+Ohiue8fK7Dt0+FjTMBZf0gqOuFXmIbiDg==", "dependencies": { "better-assert": "^1.0.2", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "hexy": "^0.3.1", - "jsrsasign": "^10.1.5", + "jsrsasign": "^10.2.0", "sshpk": "^1.16.1" } }, @@ -6096,9 +6884,9 @@ } }, "node_modules/node-opcua-crypto/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6146,158 +6934,101 @@ } }, "node_modules/node-opcua-data-access": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-data-access/-/node-opcua-data-access-2.37.0.tgz", - "integrity": "sha512-vRCtTX03fOQQtY/anoYF3yOz/muiIsqpNAybkEoDJaVp5bgSrwHbIxiHojuO4MHf0MpdZQ0p62I3meClkyGuXg==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-data-access/-/node-opcua-data-access-2.62.7.tgz", + "integrity": "sha512-IhE+gSjUf2c2fK0D83IB2lpLDmfUWkwvRWM3A7HGGHOrXBXjnJDG7yQ4vjEZ1P3XmDo5yJHX0AqsSum9i3mNbg==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-data-model": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-data-model/-/node-opcua-data-model-2.37.0.tgz", - "integrity": "sha512-6opyyRHQfhKZx3uDMQRzrNAxEQQHUq2S74wPkojudZdihekS5NpOqMjRtatMp8p2IUUP+CKtszGQmvuLTiGZig==", - "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0" - } - }, - "node_modules/node-opcua-data-value": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-data-value/-/node-opcua-data-value-2.37.0.tgz", - "integrity": "sha512-Lr0FqZ76ueRdH+HD2c/rVU4iz6NqSaxnOp5AaqJUr+LRXKzP3NgH5YokK/CztJQN3wcsF5mFOdgzyRmeq1+0xw==", - "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0" - } - }, - "node_modules/node-opcua-date-time": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-date-time/-/node-opcua-date-time-2.37.0.tgz", - "integrity": "sha512-A894FXwAeOY5yT1mWpQcYyK4wpNjiCMpXCThBhH34l+fniQv3xw3bxnJEjb1VJTRFDYt6u28h9MM59Pqe2AMaQ==", - "dependencies": { - "browser-process-hrtime": "^1.0.0", - "long": "^4.0.0", - "node-opcua-assert": "2.37.0" - } - }, - "node_modules/node-opcua-debug": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-debug/-/node-opcua-debug-2.37.0.tgz", - "integrity": "sha512-by80mDU0QqkE3RDh6px2j54Wul8itVu1D3g2TYw382PPl/Xg4A8C6JC1PU8md7nd26GFA7V6M0GzRkDeAvG98Q==", - "dependencies": { - "chalk": "^4.1.0", - "hexy": "^0.3.1", - "node-opcua-assert": "2.37.0", - "node-opcua-buffer-utils": "2.37.0" - } - }, - "node_modules/node-opcua-debug/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/node-opcua-debug/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/node-opcua-debug/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-data-model/-/node-opcua-data-model-2.62.7.tgz", + "integrity": "sha512-Gm672WrQMRHQqahifOddvb0m8PcIwbIc+LFW2JCHcu6cByJTysKRnaxXnEOiqPP1Dp0+dt7FWqv2fabvtWwIZQ==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7" } }, - "node_modules/node-opcua-debug/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/node-opcua-debug/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node_modules/node-opcua-data-value": { + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-data-value/-/node-opcua-data-value-2.62.7.tgz", + "integrity": "sha512-oY8GnTORSGzJDzahVDWpzqykJzK6o8SxDXLVrnZlEElu4up77DoPGYu46V1Cm0mGo7VG0i5j2dWQbUhldnkoMw==", + "dependencies": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, - "node_modules/node-opcua-debug/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/node-opcua-date-time": { + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-date-time/-/node-opcua-date-time-2.62.7.tgz", + "integrity": "sha512-Z6GWDG++VTg57pWcae/mEgqcGN8G3DfdxDzqU1Dw5pMn5mJtd3NiVmorqqLJq3TnKSw5CYGmZ5JU4oXY29/Y9Q==", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "browser-process-hrtime": "^1.0.0", + "long": "^4.0.0", + "node-opcua-assert": "2.55.0" + } + }, + "node_modules/node-opcua-debug": { + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-debug/-/node-opcua-debug-2.62.7.tgz", + "integrity": "sha512-bJQcFXEAqZvSzgyAxUWNjINVPl105TwIYXIaN8O/C0KZJy2PAXC17pZNe338QWrYNhjjudhEVIOqmCpvvGqQwA==", + "dependencies": { + "hexy": "0.3.2", + "node-opcua-assert": "2.55.0", + "node-opcua-buffer-utils": "2.62.7" + } + }, + "node_modules/node-opcua-debug/node_modules/hexy": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.3.2.tgz", + "integrity": "sha512-0LwOkUcdzIX58YzjuyXGu9kdG+reRcOJqPBeRH8i1Fy/kxEZkw9RvFs/Smc5Dw/401dDIWBoNMeriJPv4BNygg==", + "bin": { + "hexy": "bin/hexy_cmd.js" } }, "node_modules/node-opcua-enum": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-enum/-/node-opcua-enum-2.37.0.tgz", - "integrity": "sha512-69wsO8/uM1EYKB7FTcAHN0pxvaEzBvW/iXeA1w+H/JGz2NpAMWA62OcxUzuG+5ExfskfCfM/MkGqOFjtBr+4fw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-enum/-/node-opcua-enum-2.62.7.tgz", + "integrity": "sha512-1VHCrQ22d8reb0Hu+GOfj7Hlvj0xhtomKjuEAXFLkLkZq7rfFs93snGrGeDhxFaabX+ND7i3H1Dm6M39+DH7iA==", "dependencies": { - "node-opcua-assert": "2.37.0" + "node-opcua-assert": "2.55.0" } }, "node_modules/node-opcua-extension-object": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-extension-object/-/node-opcua-extension-object-2.37.0.tgz", - "integrity": "sha512-fM6c3/n0qBASyQHHE65k8epUtm05mFMFOkMI9IOqaU9XE+NP8qFvRQUseh2mMyGZm9l23ds180dlhbAB87QeKQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-extension-object/-/node-opcua-extension-object-2.62.7.tgz", + "integrity": "sha512-g59t2JsP0vtog7KrdT5QRU/78lSVbkP1WR4OAOy1rcsavJMzdlL9Fc8umcAl7xemaeHhnu/C47IAO4WmJsF0WA==", "dependencies": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0" + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7" } }, "node_modules/node-opcua-extension-object/node_modules/ansi-styles": { @@ -6315,9 +7046,9 @@ } }, "node_modules/node-opcua-extension-object/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6365,20 +7096,20 @@ } }, "node_modules/node-opcua-factory": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-factory/-/node-opcua-factory-2.37.0.tgz", - "integrity": "sha512-i5kfuswj4bsy2YiDDkv8F1Qi7yYx0J6pzpPqyLPEeQ18xpxQHTxp5lkCyo+qyrizIuO2w3l1E5rhdm5UDcZQvA==", - "dependencies": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-guid": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-factory/-/node-opcua-factory-2.62.7.tgz", + "integrity": "sha512-xSVD4+/qkrK/M+OI2sCaSCe3N7f7ecerjrG519T9Yp1wm+5ArZJKtugukNQgTe8GWMmz4yuuGlTmNA06lxrlYQ==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-guid": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7" } }, "node_modules/node-opcua-factory/node_modules/ansi-styles": { @@ -6396,9 +7127,9 @@ } }, "node_modules/node-opcua-factory/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6446,29 +7177,29 @@ } }, "node_modules/node-opcua-generator": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-generator/-/node-opcua-generator-2.37.0.tgz", - "integrity": "sha512-xiHgZd/Xi5hZ8Ce+W5LE45+pRzjUfN/gKkDDPRCJf5OPYJvTHrN6yXOs+x9fyeM0/9MdayFSeS0gAUNooOISVw==", - "dependencies": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-guid": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-schemas": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "node-opcua-xml2json": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-generator/-/node-opcua-generator-2.62.7.tgz", + "integrity": "sha512-dQQPWGUdRJ/pqVemlooFFxVRM76CA3cCJ6uLflGsFDBYfwUzH0Lnt4oUJtqwzF9yGTxJX89ZX4iy5QcGiM4q5Q==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-guid": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "node-opcua-xml2json": "2.62.7" } }, "node_modules/node-opcua-generator/node_modules/ansi-styles": { @@ -6486,9 +7217,9 @@ } }, "node_modules/node-opcua-generator/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6536,33 +7267,33 @@ } }, "node_modules/node-opcua-guid": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-guid/-/node-opcua-guid-2.37.0.tgz", - "integrity": "sha512-MiD8QM+uEQvDCHg985tRO0QFW0WVtvdkSHyodCcVf1K3BI0d0zFoR78nwtbjrqXK8GHG3TUcSlDl3B/fzki/Bg==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-guid/-/node-opcua-guid-2.62.7.tgz", + "integrity": "sha512-yZmKadHTH6dAt6WfQvouKmTzpvaCWsVrtoyquYvi/Rx+a0HeehQpZyBzrQgeB2Ra3Rrtt1yhU9Gf0fBOs84qTg==", "dependencies": { - "node-opcua-assert": "2.37.0" + "node-opcua-assert": "2.55.0" } }, "node_modules/node-opcua-hostname": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-hostname/-/node-opcua-hostname-2.37.0.tgz", - "integrity": "sha512-d2nBSuUXwwBXxQO8z3OXuAPWAn9LzzEjT9gzgvvixHJo/qEFZMIKDlGfpuhZYS9RlWRKeYuvDImmFz0N5vtU5A==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-hostname/-/node-opcua-hostname-2.62.7.tgz", + "integrity": "sha512-YvFHJbIdfCwRzKBrtWNdFy22fZ+xFqURznoMoLYTbZW9NchbpWrj2js/O0Obc2TdB0LN6v8qbWs64OwE3BmVTQ==", "dependencies": { - "node-opcua-assert": "2.37.0" + "node-opcua-assert": "2.55.0" } }, "node_modules/node-opcua-nodeid": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-nodeid/-/node-opcua-nodeid-2.37.0.tgz", - "integrity": "sha512-ty3YAIx12jM88cD7aGYDv8Bo8zXweFv9AYfoILMymtJwjW+xx+xV83ghROX2ytyDxTHMr1iQpGPQCdNkaNWPWQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-nodeid/-/node-opcua-nodeid-2.62.7.tgz", + "integrity": "sha512-A/6sl+dCMlZyp5CNp2vhsViPvW433Y3y9YM7kbOYhjytTOJAZ7NKyf5d2csCHAzI4XQF3ioIhYpCBeTiIlumNQ==", "dependencies": { - "@types/lodash": "4.14.168", - "chalk": "^4.1.0", + "@types/lodash": "4.14.177", + "chalk": "4.1.2", "lodash": "4.17.21", - "node-opcua-assert": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-enum": "2.37.0", - "node-opcua-guid": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-guid": "2.62.7" } }, "node_modules/node-opcua-nodeid/node_modules/ansi-styles": { @@ -6580,9 +7311,9 @@ } }, "node_modules/node-opcua-nodeid/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6629,44 +7360,60 @@ "node": ">=8" } }, + "node_modules/node-opcua-nodeset-ua": { + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-nodeset-ua/-/node-opcua-nodeset-ua-2.62.7.tgz", + "integrity": "sha512-Jm9euPV168CSUpDYFHYyhDex7Qy1IFgHIYaYBrjsBKENmQ+Zt/5ZycRbkH9ethsroKEEEGetqxEsLdn9KVHwiw==", + "dependencies": { + "node-opcua-address-space-base": "2.62.7", + "node-opcua-basic-types": "2.62.7", + "node-opcua-data-access": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-variant": "2.62.7" + } + }, "node_modules/node-opcua-nodesets": { - "version": "2.36.0", - "resolved": "https://registry.npmjs.org/node-opcua-nodesets/-/node-opcua-nodesets-2.36.0.tgz", - "integrity": "sha512-nvtX9yRsvrhX3s+LwxGx0uw52vo3JAiLIpvYVOw4i/ybhW4Qh83xytQX1nCMjRgYta04Y4moRhTri+75hyOLoQ==" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-nodesets/-/node-opcua-nodesets-2.62.7.tgz", + "integrity": "sha512-xavVU28d/3+CrLXFudxPvVdqeMwDfsM7FQ0bGSFJLbRWJf31udjkGQktQ46S0YMHhLeO2BwuvLFmmpzCb1KCCQ==" }, "node_modules/node-opcua-numeric-range": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-numeric-range/-/node-opcua-numeric-range-2.37.0.tgz", - "integrity": "sha512-dROLumzbHotyfXYVy+cFqQ4t+/AZGVT79QmsUGCWrJg8kPl52yTl8BpzqoY1DXjzppTTRXW2/kWgBzvfo4779g==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-numeric-range/-/node-opcua-numeric-range-2.62.7.tgz", + "integrity": "sha512-RPasCWNSMP61sY+PkLila5fYjwtRpi1Dj0O8Lx2Hzca+upkBtGTGTAkeIGhRmzQJX3qqgDV4zNmGLkmZGVzCCw==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-status-code": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-status-code": "2.62.7" } }, "node_modules/node-opcua-object-registry": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-object-registry/-/node-opcua-object-registry-2.37.0.tgz", - "integrity": "sha512-gKPwVFjWRlEKjjv6p75lzYw7qlWeHr6m8ZtOgUlW5OrWKrEo/tMxyXxC4dB7856MSbYdKytDlEscU2C7+1+6Rw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-object-registry/-/node-opcua-object-registry-2.62.7.tgz", + "integrity": "sha512-UNRMtWDZcibAl2NTUzsNItPiNy0vWlyq4o9uzdkjez8f9s5Jr5gGKvI9WJW2Wx9kyq5Tn0ARzwCTCUyg/60gMw==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-debug": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-debug": "2.62.7" } }, "node_modules/node-opcua-packet-analyzer": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-packet-analyzer/-/node-opcua-packet-analyzer-2.37.0.tgz", - "integrity": "sha512-6RluDHwtVNKX8PkBhRHYXxyZbeX77E7Vqtfh6xytCq6WJvuyHtDCwi9ZqVzyeao4/Fz/PtQwUPFDiGJRj7tOxw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-packet-analyzer/-/node-opcua-packet-analyzer-2.62.7.tgz", + "integrity": "sha512-vlOGR9xbPRbl0NCZMACYEYsh7d5KPJPei6tiNTYHUUJFWWps0Vxq5u8s3ntwuZWC2LnE76W1QBAARUGxbwgsiA==", "dependencies": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-utils": "2.37.0" + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-utils": "2.62.7" } }, "node_modules/node-opcua-packet-analyzer/node_modules/ansi-styles": { @@ -6684,9 +7431,9 @@ } }, "node_modules/node-opcua-packet-analyzer/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6734,35 +7481,29 @@ } }, "node_modules/node-opcua-packet-assembler": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-packet-assembler/-/node-opcua-packet-assembler-2.37.0.tgz", - "integrity": "sha512-imBhYmIqraLvJwGoTPlZS3tX2izpY1EhWgFncFer0l1bHiFPkM1rmsdljzrFvESHoEAWd8hYVmeopvR+tv2mfw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-packet-assembler/-/node-opcua-packet-assembler-2.62.7.tgz", + "integrity": "sha512-vZTDsvsL8NhaVJ9JWj7tYRNgNCn3aFuvydw+MXzB7dJ6kFCL6cAxyCOJLWR1StMxk4zST9P7/7JwvS49iFvNUw==", "dependencies": { - "node-opcua-assert": "2.37.0" + "node-opcua-assert": "2.55.0" } }, "node_modules/node-opcua-pki": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/node-opcua-pki/-/node-opcua-pki-2.9.7.tgz", - "integrity": "sha512-XuhwQaLeoQ8dNrBiZMR5vRvQ4JfwqUUDp/8oPfWAG9XJb6TWNrIKVMYZFAieyqWByEIFO7adJwVlhiosPjc9bQ==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/node-opcua-pki/-/node-opcua-pki-2.13.0.tgz", + "integrity": "sha512-qi0x36RaGG246Le0XrKbq51IU12d6oBeEqABwVV9ivoWvEa8tvedurc2eblpIZvjErFxKb9g4L3gQa0zOBIuyA==", "dependencies": { - "@ster5/global-mutex": "^1.1.1", - "async": "^3.2.0", - "better-assert": "^1.0.2", + "@ster5/global-mutex": "^1.2.0", "byline": "^5.0.0", - "chalk": "^4.1.0", - "chokidar": "^3.5.1", - "cli-spinner": "^0.2.10", - "cli-table": "^0.3.6", - "del": "6.0.0", - "node-opcua-crypto": "^1.7.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "cli-table": "^0.3.9", + "node-opcua-crypto": "^1.8.0", "progress": "^2.0.3", - "rimraf": "^3.0.2", "thenify": "^3.3.1", "update-notifier": "5.1.0", - "walk": "^2.3.14", "wget-improved": "^3.2.1", - "yargs": "16.2.0", + "yargs": "17.2.1", "yauzl": "^2.10.0" }, "bin": { @@ -6784,9 +7525,9 @@ } }, "node_modules/node-opcua-pki/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6822,20 +7563,6 @@ "node": ">=8" } }, - "node_modules/node-opcua-pki/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/node-opcua-pki/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6847,72 +7574,90 @@ "node": ">=8" } }, + "node_modules/node-opcua-pki/node_modules/yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/node-opcua-pseudo-session": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-pseudo-session/-/node-opcua-pseudo-session-2.37.0.tgz", - "integrity": "sha512-YIqVZtkMPIgE/ipRHCEkfjbzWfQKS+IOQQWj7khALcQsbohOELYLMysRUeLi6I0NjHjM8bc0J8a2q8evu+3ykg==", - "dependencies": { - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-pseudo-session/-/node-opcua-pseudo-session-2.62.7.tgz", + "integrity": "sha512-8RrWZ8BHzFlb+vstQ7Umcl4wQjEIEX8WTnFhs2pUnL6hfs5aQlDHK2sQ5QyiQk/yjG6nQ+glNQDwiD4ICgSI2w==", + "dependencies": { + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node_modules/node-opcua-schemas": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-schemas/-/node-opcua-schemas-2.37.0.tgz", - "integrity": "sha512-zmLV3hl0lFAkeG3L6xsell3z0J1VKJlZdikAH5vxPwWeYj9w4Z4OeTXzUQg8XYOk/ki0w9yWMD+eVUV/kWqUqg==", - "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "node-opcua-xml2json": "2.37.0", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-schemas/-/node-opcua-schemas-2.62.7.tgz", + "integrity": "sha512-e7++0kZxmik66abDAtFNVeOytSVU/X0WZs3JuyXi71OVFbX41t/6f1BvL3/DqIV8tyG1yhCZmdV33VXprxtb7g==", + "dependencies": { + "node-opcua-assert": "2.55.0", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "node-opcua-xml2json": "2.62.7", "thenify": "^3.3.1" } }, "node_modules/node-opcua-secure-channel": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-secure-channel/-/node-opcua-secure-channel-2.37.0.tgz", - "integrity": "sha512-69x/VIkryPVlOVTe53vH41RXbRm0+mVvXuyfzKkpQEXqc1+xfIbT/KerHIVTq0mzTY/KdtLmTEZaGRvDxKja3w==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-secure-channel/-/node-opcua-secure-channel-2.62.7.tgz", + "integrity": "sha512-Khekl83gWsLfpY/l9duXqABgbE0ABeXutHM6KmeH/DvMiRmWMqtnh6plzhSIXjDbdHc+DzopuKjGgqVm+rDzxg==", "dependencies": { - "@types/underscore": "^1.11.0", - "async": "^3.2.0", + "@types/underscore": "1.11.4", + "async": "^3.2.2", "backoff": "^2.5.0", - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-certificate-manager": "2.37.0", - "node-opcua-chunkmanager": "2.37.0", - "node-opcua-common": "2.37.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-packet-analyzer": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-transport": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "underscore": "^1.12.0" + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-certificate-manager": "2.62.7", + "node-opcua-chunkmanager": "2.62.7", + "node-opcua-common": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-packet-analyzer": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-transport": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7" } }, "node_modules/node-opcua-secure-channel/node_modules/ansi-styles": { @@ -6930,9 +7675,9 @@ } }, "node_modules/node-opcua-secure-channel/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6980,360 +7725,363 @@ } }, "node_modules/node-opcua-server": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-server/-/node-opcua-server-2.37.0.tgz", - "integrity": "sha512-uoV6qTpb5tD9glZ2w8uYq+JqiyjBCPzNJvZfHbpJKsc9etDtlbKk5WVRrZqZDUbd5wM8Kr/f5OYCNA9IL6T+1Q==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-server/-/node-opcua-server-2.62.7.tgz", + "integrity": "sha512-uKQgyuCYyucnetV1env4YT7O8kVIdZFS9mN5C9d8lx/U+3LXkPL/YFIksSGDYOf2vaNL3L8GEuhYUhNeWfl18w==", "dependencies": { - "@types/underscore": "^1.11.0", - "async": "^3.2.0", + "@ster5/global-mutex": "^1.2.0", + "@types/underscore": "^1.11.4", + "async": "^3.2.2", "bonjour": "^3.5.0", "browser-process-hrtime": "^1.0.0", "dequeue": "^1.0.5", - "node-opcua-address-space": "2.37.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-certificate-manager": "2.37.0", - "node-opcua-client": "2.37.0", - "node-opcua-client-dynamic-extension-object": "2.37.0", - "node-opcua-common": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-hostname": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-nodesets": "2.36.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-pki": "^2.8.0", - "node-opcua-secure-channel": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-discovery": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-history": "2.37.0", - "node-opcua-service-node-management": "2.37.0", - "node-opcua-service-query": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-register-node": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-service-session": "2.37.0", - "node-opcua-service-subscription": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "underscore": "^1.12.0" + "lodash": "4.17.21", + "node-opcua-address-space": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-certificate-manager": "2.62.7", + "node-opcua-client": "2.62.7", + "node-opcua-client-dynamic-extension-object": "2.62.7", + "node-opcua-common": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-hostname": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-nodesets": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pki": "^2.13.0", + "node-opcua-secure-channel": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-discovery": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-service-node-management": "2.62.7", + "node-opcua-service-query": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-register-node": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-service-session": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node_modules/node-opcua-server-discovery": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-server-discovery/-/node-opcua-server-discovery-2.37.0.tgz", - "integrity": "sha512-wQ1l1rAkaxvOsXvLmz2V/zX/WOi5e2yr6+g01xsTvufWToMivyvi89mBjS2Knw63yMNak1+9blBKgsNxMj4OQA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-server-discovery/-/node-opcua-server-discovery-2.62.7.tgz", + "integrity": "sha512-4CqLCs38VdkC3fdhAOT/U6f8hxePMH3hdYrzKbo4ZUgk5IzEdZ2GT1InLUqNiEskYESgZkjK8esKjlKRGXcANg==", "dependencies": { - "@types/bonjour": "^3.5.8", + "@types/bonjour": "^3.5.9", "bonjour": "^3.5.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-certificate-manager": "2.37.0", - "node-opcua-common": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-hostname": "2.37.0", - "node-opcua-pki": "^2.8.0", - "node-opcua-secure-channel": "2.37.0", - "node-opcua-server": "2.37.0", - "node-opcua-service-discovery": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-status-code": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-certificate-manager": "2.62.7", + "node-opcua-common": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-hostname": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pki": "^2.13.0", + "node-opcua-secure-channel": "2.62.7", + "node-opcua-server": "2.62.7", + "node-opcua-service-discovery": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-status-code": "2.62.7" } }, "node_modules/node-opcua-service-browse": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-browse/-/node-opcua-service-browse-2.37.0.tgz", - "integrity": "sha512-3ajWl19iBv+XZoShx+6kljvO5DiGXXHDIWulkEi7VfuIVhvyIUSMAyh58oc3JFPz2Nj7mkul7ksxRVdsnvJLOA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-browse/-/node-opcua-service-browse-2.62.7.tgz", + "integrity": "sha512-gjQu9QgeYoLu3+FiJJf47jPzRVKPVrnUKc5qBl5FA/wBKDmpXEZsTU/WPMjpSyXmmyzOrSRwDVgJlbMi4XmVXg==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-service-call": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-call/-/node-opcua-service-call-2.37.0.tgz", - "integrity": "sha512-NSYWZZGvndJltDlrcPXjvI0N24hGsWwreU7RAViPzxl4v03tsIuK0FN7ntn6yLZz68QUrXl24Ij1Tc20Sqg8OQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-call/-/node-opcua-service-call-2.62.7.tgz", + "integrity": "sha512-74BMD82oClSn6Z65hTbeh4gCBJ+GQQfaiF/q/SRqbfj9kqyUhHdzzXuPI66BWAQ2c3p5ncXebGHRiC6T/qHn0w==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-variant": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node_modules/node-opcua-service-discovery": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-discovery/-/node-opcua-service-discovery-2.37.0.tgz", - "integrity": "sha512-L5FUml1dhLuz8JNCZqe43Oz8ut7Plh84Nnq5PUo2W2/myX/H+zfst6+QP4Rx1uG4LZufoI5Xst0haAtYHfwC9Q==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-discovery/-/node-opcua-service-discovery-2.62.7.tgz", + "integrity": "sha512-C/LGd4exlpNZmz3pH4NrHlx3ltTXPJnqO0dJ46Z0OfWtd77fxNleASTqq86MVlMH3JeknuPFrzJDvFJ2refe7A==", "dependencies": { - "@types/bonjour": "^3.5.8", + "@types/bonjour": "^3.5.9", "bonjour": "^3.5.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-service-endpoints": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-endpoints/-/node-opcua-service-endpoints-2.37.0.tgz", - "integrity": "sha512-Tcq+met6Izzzx61ugIkHI+2HPJ/8lBcmUWcZzq5x49bOwP3dKsfbOmGBDtPWItipFzpnK+zLqHTSNesS8t8tWg==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-endpoints/-/node-opcua-service-endpoints-2.62.7.tgz", + "integrity": "sha512-HrS9MezxmSPTKRWILdo3CtF56fp9k1lycGFy9iy0ztn5bp2rkoSC9uQqCLWYQd+htnZuprtkTkTaP0GfGfDJmg==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-service-filter": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-filter/-/node-opcua-service-filter-2.37.0.tgz", - "integrity": "sha512-IJA/nPj7T7R9Xa+EWT6XjrA1VA0mloB4jGXYl+u0OrBQTbUdWsFf1XSDf9Cqtnqc0yTfRROzfjoFNrx0/aB72g==", - "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-filter/-/node-opcua-service-filter-2.62.7.tgz", + "integrity": "sha512-ZWH0wQxd4uayIlC63f+otvrVZieqQz/2ekq3wJrx99qxSf8pzuwcBT9BmMg3dASXqmSlE7qXe7BjNzfri229pA==", + "dependencies": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node_modules/node-opcua-service-history": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-history/-/node-opcua-service-history-2.37.0.tgz", - "integrity": "sha512-XqyQVI2K44AclAhMM4305ucmjx+7LrOv64u6Txgd5+ahSUmU/xzHcWpoSn7x5m5TcB9XshkJ73SN9qWZe8wULg==", - "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-history/-/node-opcua-service-history-2.62.7.tgz", + "integrity": "sha512-UpJm/k91mXcDzVXetkU5fIQttvk+HN0giahFR16jmzFKVMG9VMhleFEImkOJQ8C+LQKtEDUdpJpAqKOJN1ycEA==", + "dependencies": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-service-node-management": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-node-management/-/node-opcua-service-node-management-2.37.0.tgz", - "integrity": "sha512-iq/BXlrqZfdoxH5AaY2kO77RNjNrv+6yfaDifjpe4FFhVy7w+Lwse4C558IyqcDqFex+6XwpyHOp/LvB64Sd1Q==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-node-management/-/node-opcua-service-node-management-2.62.7.tgz", + "integrity": "sha512-0Wk5PxYwlzgJiixQ5z2rk9QKrDzVzvnP1hzUgmcvgo3iAbWsbdPBdt/O6gYkB+8yukexF/RzJHjsz7Vfkval5g==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-service-query": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-query/-/node-opcua-service-query-2.37.0.tgz", - "integrity": "sha512-VmoChFCBp7SRyRQuDqOuwF1WmWU87kWSEIog+xVE/BraIupuGJ9Ih8akK0LqOiL3pYheIvm62dt83Rdqb140nA==", - "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-service-subscription": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-types": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-query/-/node-opcua-service-query-2.62.7.tgz", + "integrity": "sha512-8qCXFUsClQJw9jPDS4wkfIiQij9wC5eLcLiSLLmiY7Sbgc8E7SFIRU2Ud3EtbCCXkA3iyrEU2OX2ovscM7hrVA==", + "dependencies": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-service-read": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-read/-/node-opcua-service-read-2.37.0.tgz", - "integrity": "sha512-xinGpzZrO8x6Myfvyvzq+TZH3EWwNY77TRjqh7MApB7LfkgHVzPHxY5+0fHWhH8GzB7lD06R5RhxAt1ry0XS+w==", - "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-read/-/node-opcua-service-read-2.62.7.tgz", + "integrity": "sha512-V1RxpRUPlMxz27LDaiJfpoLEPyQcFXeoE+PoZ7LZq9Fg8V0TyYUfFTYLASFWc3XiH5Te0l80qxMJcZS6n8bPtg==", + "dependencies": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-service-register-node": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-register-node/-/node-opcua-service-register-node-2.37.0.tgz", - "integrity": "sha512-d10HNx2hMKiURpKgM+0xdyuJwkQlj1amucue1YCIC29sIN98gBo2JnvubMWZrP0lTdSRC/9rNB6PMtumHxvXgA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-register-node/-/node-opcua-service-register-node-2.62.7.tgz", + "integrity": "sha512-SDW687t/R1R3Su+t+F81ODjEBsY7MR39p/oRA7LvDxSSWP79UGYEasU7hXnIwF/6sqWunoF/vEXASUOCPqB8XA==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-service-secure-channel": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-secure-channel/-/node-opcua-service-secure-channel-2.37.0.tgz", - "integrity": "sha512-b/c43TIeQXUss6FQQQpuyW+3TLgK+Rjw6QR7XwdBjlQkc4ew0ZP7lwh6vhRs2oK5hT/X1C2SWj8rVd/GMDAMkA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-secure-channel/-/node-opcua-service-secure-channel-2.62.7.tgz", + "integrity": "sha512-lQ4xVGnp0cHwkFBv6MOJ1Defe+5s+3gpuBQ0viHirYp7kVpoa2ckUFKKO8nNwf5zYa3wIrOwwhg+yPtJFNau1Q==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-service-session": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-session/-/node-opcua-service-session-2.37.0.tgz", - "integrity": "sha512-uVO4qPNR5R6wbSAQq/ge6usONZ85D9iP7Wg9GgMIpn+a+QygQStnU33qmzcsXzD0SA2ZGqmjKklbd47oorM3oA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-session/-/node-opcua-service-session-2.62.7.tgz", + "integrity": "sha512-+Vgp8vjY8YpQpadrJFrPjymz3YM/2TXTkVtZdT2MpSAbWvPOZ0dli9EYQA+zSzszAreYSrEdJadI2YQEA26BYA==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-service-subscription": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-subscription/-/node-opcua-service-subscription-2.37.0.tgz", - "integrity": "sha512-uM5qY4D/2Md8qZpy0l4os7RhuH7b4Yjv1pJx7Z3yBJ5fEI5Lqb23OAKDB5DmVuFrb1+miSs7augj8LaZF5Ztjw==", - "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-subscription/-/node-opcua-service-subscription-2.62.7.tgz", + "integrity": "sha512-FqprG7eYFb8UyYNS1gLZVTuRaQ87xvXvKmYlYOkrzyLnk+2k988VCyBAsjiEVhNKrIwLR5UFVYJxxSeHvMymPw==", + "dependencies": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node_modules/node-opcua-service-translate-browse-path": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-translate-browse-path/-/node-opcua-service-translate-browse-path-2.37.0.tgz", - "integrity": "sha512-0eSPU9vOIVSt2+KgWnhi2lH6EnWUQSguovbnozHtf3IAsRuk4xbqMCWRw9ejldlDE9AtCBl1f4+RzNQOyac59A==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-translate-browse-path/-/node-opcua-service-translate-browse-path-2.62.7.tgz", + "integrity": "sha512-TvfaGUdckMJpWVzNJzF0oWbqh6GNijoYijSaqMSxWwn7MEczRdlBoM0Qb3tmzemWvn9sbiRDLFuAo6N47WYUwA==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-service-write": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-write/-/node-opcua-service-write-2.37.0.tgz", - "integrity": "sha512-2M/+MQ/zxiDiXPkwIzVxtRq1dv19p3ddM/Y6TXYLjVHM7BdGd8LTkvp6tzOgs/Sgu3Pa7hqqDZVBUpWTayLHtw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-write/-/node-opcua-service-write-2.62.7.tgz", + "integrity": "sha512-c8q/E9sx7HzRZNrOHROrRXR3Gqbw0TrHfELxDWK+jcczMFjNrp6XEouPIX4HXbfrnDJXNeN82Mux84AShAF9Vw==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node_modules/node-opcua-status-code": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-status-code/-/node-opcua-status-code-2.37.0.tgz", - "integrity": "sha512-4kgDibcWmoUzo1seiuZMjfgAHZNyEYuiCnFdLdaGjV8s+FVx66jPm6iNSs1HfhKZ/SQFRdUH8NaM8QrafaaROQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-status-code/-/node-opcua-status-code-2.62.7.tgz", + "integrity": "sha512-lJdQtEp7hqI7T7ZPZiOekxvvbe+84ZGN8zS9n5vgvnU5EyXYl+TIACqsuW6hVXiS9Z76zXlKb7y+s0BOaX3scA==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-constants": "2.35.0" + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7" } }, "node_modules/node-opcua-transport": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-transport/-/node-opcua-transport-2.37.0.tgz", - "integrity": "sha512-IjVq7VbkA9gto6Q5CtGx0gWXSrJCSSnSwcEEvAYaIogYoYO2bvKWkgWtllfkv7b+Yb6YM/ESMt3Uq9nw8pOGUg==", - "dependencies": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-chunkmanager": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-packet-assembler": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-transport/-/node-opcua-transport-2.62.7.tgz", + "integrity": "sha512-6ez6ags7w/GRyEG5Pug4vTpuYBSyFhBezRN0Q0Ni8ZRyG/JZqNgPpumrK7ztS4AF9LeyNwodzIDSXaD2iDY85w==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-chunkmanager": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-packet-assembler": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7" } }, "node_modules/node-opcua-transport/node_modules/ansi-styles": { @@ -7351,9 +8099,9 @@ } }, "node_modules/node-opcua-transport/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7401,40 +8149,40 @@ } }, "node_modules/node-opcua-types": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-types/-/node-opcua-types-2.37.0.tgz", - "integrity": "sha512-vsUMG9MgpxwMzTCKCWGgd+zVEh3Z8J4JCFyqh3lu4lqbkXKDayIcJRcikH62/fjIq1ZLgmepeFNXiFuIxYDnFA==", - "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-generator": "2.37.0", - "node-opcua-guid": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-packet-analyzer": "2.37.0", - "node-opcua-schemas": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-types/-/node-opcua-types-2.62.7.tgz", + "integrity": "sha512-+4zputt7EYPlOwuaoK3R2Kftk3mUxgTUYCzbPeFKrXfGSx1D/R57+ZY1XyAhjXj52NfCTKDwWoiT/LrjBtC9hw==", + "dependencies": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-generator": "2.62.7", + "node-opcua-guid": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-packet-analyzer": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node_modules/node-opcua-utils": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-utils/-/node-opcua-utils-2.37.0.tgz", - "integrity": "sha512-S80y/PgvL/V3K2u8eyF8vUuf8ZoLleBLBQ5PNseE/CuKqcr6sckVaP70O4jM+fWub3zR7I85595qKibZTKhhKw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-utils/-/node-opcua-utils-2.62.7.tgz", + "integrity": "sha512-DWJbvo19n6ynLZpFAdDU2Ucw4Y7upnkvX59vWAtWbUWemv9ZMCoDi+aCWvfVTVWyqdPPM23OaljF0MmfjtSzwQ==", "dependencies": { "browser-process-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0" + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0" } }, "node_modules/node-opcua-utils/node_modules/ansi-styles": { @@ -7452,9 +8200,9 @@ } }, "node_modules/node-opcua-utils/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7502,44 +8250,44 @@ } }, "node_modules/node-opcua-variant": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-variant/-/node-opcua-variant-2.37.0.tgz", - "integrity": "sha512-cWidURJtzDLU7fx6z/VeXcBP1SxW/uUwatxjLfB1ExsHFUtEIP1OqmEbcGRXZkQlp0oCK9IhnOCVetDvJT1dJQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-variant/-/node-opcua-variant-2.62.7.tgz", + "integrity": "sha512-rOe3gOH8wOEG3wl8BQMc5U+6Agk4JEVzXRUu7i7I2eBzEgDFvTxy9PrqvmojDyuPBMmCnTf+G9Ix6GtZ9sp/rw==", "dependencies": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-utils": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-utils": "2.62.7" } }, "node_modules/node-opcua-vendor-diagnostic": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-vendor-diagnostic/-/node-opcua-vendor-diagnostic-2.37.0.tgz", - "integrity": "sha512-g7yiPp3NfujNeoSWgGiZwotibsMQlPSBNkyjMETJbWQE8mVljc3CY+cX4ACraidltBfJH7m12/IztcCbbwWlTA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-vendor-diagnostic/-/node-opcua-vendor-diagnostic-2.62.7.tgz", + "integrity": "sha512-EIcFCjoT0CTFB5NqnTDlXrA/ayUGv8fvPgdt/pkub1ZDeqnj3R5B449SfgIuiq5tmGO7WyhXTnx6TckhiuYFwg==", "dependencies": { "humanize": "0.0.9", - "node-opcua-address-space": "2.37.0", - "node-opcua-assert": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-server": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-variant": "2.37.0" + "node-opcua-address-space": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7", + "node-opcua-server": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node_modules/node-opcua-xml2json": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-xml2json/-/node-opcua-xml2json-2.37.0.tgz", - "integrity": "sha512-IWDP2mmJhflK5PNrtSAhg64Bvu24CxuEhDM+UKztQpcyxN9al2NM4r5WB2Q2EjDxjvCMeGBe5FzE0IZv4xLe0w==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-xml2json/-/node-opcua-xml2json-2.62.7.tgz", + "integrity": "sha512-SmndD3Shi+xxM1nEl7EapaojrgzI7hDMGzXEPDINP2ObsqYLSSp8v6r9hryy0j1dDn2H72NuBIEpEiNqWny4xw==", "dependencies": { "bomstrip": "^0.1.4", - "ltx": "^2.10.0", - "node-opcua-assert": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-utils": "2.37.0", + "ltx": "^3.0.0", + "node-opcua-assert": "2.55.0", + "node-opcua-debug": "2.62.7", + "node-opcua-utils": "2.62.7", "xml-writer": "^1.7.0" } }, @@ -7558,9 +8306,9 @@ } }, "node_modules/node-opcua/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7628,28 +8376,28 @@ } }, "node_modules/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", "dev": true }, "node_modules/nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", "dev": true, "hasInstallScript": true, "dependencies": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", + "chokidar": "^3.5.2", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", + "pstree.remy": "^1.1.8", "semver": "^5.7.1", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" }, "bin": { "nodemon": "bin/nodemon.js" @@ -7662,86 +8410,6 @@ "url": "https://opencollective.com/nodemon" } }, - "node_modules/nodemon/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/nodemon/node_modules/boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nodemon/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nodemon/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nodemon/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/nodemon/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/nodemon/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -7751,61 +8419,6 @@ "ms": "^2.1.1" } }, - "node_modules/nodemon/node_modules/global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "dependencies": { - "ini": "1.3.7" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nodemon/node_modules/ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - }, - "node_modules/nodemon/node_modules/is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "dependencies": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nodemon/node_modules/is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/nodemon/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -7815,42 +8428,6 @@ "semver": "bin/semver" } }, - "node_modules/nodemon/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nodemon/node_modules/update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dev": true, - "dependencies": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, "node_modules/nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", @@ -7882,15 +8459,16 @@ "node": ">=8" } }, - "node_modules/nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, "dependencies": { - "boolbase": "^1.0.0" + "path-key": "^3.0.0" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "engines": { + "node": ">=8" } }, "node_modules/nyc": { @@ -7934,15 +8512,6 @@ "node": ">=8.9" } }, - "node_modules/nyc/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8039,18 +8608,6 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -8060,33 +8617,6 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nyc/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -8217,31 +8747,22 @@ } }, "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -8281,17 +8802,15 @@ } }, "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/p-try": { @@ -8373,23 +8892,24 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "node_modules/path-to-regexp": { @@ -8401,6 +8921,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "engines": { "node": ">=8" } @@ -8419,10 +8940,16 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -8431,14 +8958,15 @@ } }, "node_modules/pino": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.12.0.tgz", - "integrity": "sha512-5NGopOcUusGuklGHVVv9az0Hv/Dj3urHhD3G+zhl5pBGIRYAeGCi/Ej6YCl16Q2ko28cmYiJz+/qRoJiwy62Rw==", + "version": "6.13.4", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.13.4.tgz", + "integrity": "sha512-g4tHSISmQJYUEKEMVdaZ+ZokWwFnTwZL5JPn+lnBVZ1BuBbrSchrXwQINknkM5+Q4fF6U9NjiI8PWwwMDHt9zA==", "dependencies": { "fast-redact": "^3.0.0", "fast-safe-stringify": "^2.0.8", "flatstr": "^1.0.12", "pino-std-serializers": "^3.1.0", + "process-warning": "^1.0.0", "quick-format-unescaped": "^4.0.3", "sonic-boom": "^1.0.2" }, @@ -8483,9 +9011,9 @@ } }, "node_modules/pino-pretty/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8521,6 +9049,27 @@ "node": ">=8" } }, + "node_modules/pino-pretty/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pino-pretty/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/pino-pretty/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8537,10 +9086,14 @@ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" }, - "node_modules/pino/node_modules/fast-safe-stringify": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz", - "integrity": "sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==" + "node_modules/pino/node_modules/sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } }, "node_modules/pkg-dir": { "version": "4.2.0", @@ -8607,15 +9160,18 @@ } }, "node_modules/plur": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", - "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", "dev": true, "dependencies": { - "irregular-plurals": "^2.0.0" + "irregular-plurals": "^3.2.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/precond": { @@ -8627,9 +9183,9 @@ } }, "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -8643,13 +9199,13 @@ "node": ">=4" } }, - "node_modules/pretty-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.3.tgz", - "integrity": "sha512-nFB0BMeWNJA4YfmrgqPhOH3UQjMQZASZ2ueBfmlyqpVy9+ExLcmwXL/Iu4Wb9pbt/cubQXK4ir8IZUnE8EwFnw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^2.0.5" + "node_modules/prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-HUoH9C5Z3jKkl3UunCyiD5jwk0+Hz0fIgQ2nbwU2Oo/ceuTAQAg+pPVnfdt2TJWRVLcxKh9iuoYDUSc8clb5UQ==", + "dev": true, + "engines": { + "node": ">=6" } }, "node_modules/process-nextick-args": { @@ -8669,6 +9225,11 @@ "node": ">=8" } }, + "node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -8683,11 +9244,11 @@ "integrity": "sha512-5yANTE0tmi5++POym6OgtFmwfDvOXABD9oj/jLQr5GPEyuNEb7jH4wbbANJceJid49jwhi1RddxnhnEAb/doqg==" }, "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, "engines": { @@ -8729,17 +9290,27 @@ } }, "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -8756,9 +9327,9 @@ ] }, "node_modules/quick-format-unescaped": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.3.tgz", - "integrity": "sha512-MaL/oqh02mhEo5m5J2rwsVL23Iw2PEaGVHgT2vFt8AAsr0lfvQA5dpXo9TPu0rz7tSBdUPgkbam0j/fj5ZM8yg==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, "node_modules/randombytes": { "version": "2.1.0", @@ -8778,12 +9349,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.1", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -8830,22 +9401,20 @@ } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -8854,12 +9423,12 @@ } }, "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "dependencies": { - "resolve": "^1.1.6" + "resolve": "^1.9.0" }, "engines": { "node": ">= 0.10" @@ -8889,9 +9458,9 @@ } }, "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "engines": { "node": ">=8" @@ -8934,37 +9503,6 @@ "node": ">=4" } }, - "node_modules/renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8979,6 +9517,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, "node_modules/resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", @@ -8992,6 +9536,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -9009,23 +9574,11 @@ "lowercase-keys": "^1.0.0" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -9037,30 +9590,25 @@ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -9089,28 +9637,54 @@ "run-script-os": "index.js" } }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==", + "dev": true }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -9145,9 +9719,9 @@ } }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "dependencies": { "debug": "2.6.9", "depd": "~1.1.2", @@ -9156,9 +9730,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -9181,28 +9755,28 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" }, "engines": { "node": ">= 0.8.0" @@ -9220,52 +9794,58 @@ "integrity": "sha1-gCIdbaDsaFEd3HQ5CXV60UT8Hf0=" }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } }, "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "node_modules/shiki": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", + "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", "dev": true, "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" + "jsonc-parser": "^3.0.0", + "vscode-oniguruma": "^1.6.1", + "vscode-textmate": "5.2.0" } }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "node_modules/simple-swizzle": { "version": "0.2.2", @@ -9280,41 +9860,16 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/sonic-boom": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", - "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", - "dependencies": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" - } + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true }, "node_modules/source-map": { "version": "0.6.1", @@ -9326,9 +9881,9 @@ } }, "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", @@ -9352,42 +9907,33 @@ "node": ">=8" } }, - "node_modules/spawn-wrap/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "readable-stream": "^3.0.0" } }, - "node_modules/spawn-wrap/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "node_modules/split2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">= 8" + "node": ">= 6" } }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "node_modules/split2/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "readable-stream": "^3.0.0" + "safe-buffer": "~5.2.0" } }, "node_modules/sprintf-js": { @@ -9397,9 +9943,9 @@ "dev": true }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -9497,73 +10043,32 @@ "dev": true }, "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/strip-bom": { @@ -9575,6 +10080,15 @@ "node": ">=8" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -9586,68 +10100,88 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, "node_modules/superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "deprecated": "Please upgrade to v7.0.1+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at . Thanks to @shadowgate15, @spence-s, and @niftylettuce. Superagent is sponsored by Forward Email @ ", "dev": true, "dependencies": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" }, "engines": { - "node": ">= 4.0" + "node": ">= 7.0.0" } }, - "node_modules/superagent/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" } }, "node_modules/superagent/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/superagent/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "node_modules/supertest": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", - "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.6.tgz", + "integrity": "sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg==", "dev": true, "dependencies": { "methods": "^1.1.2", - "superagent": "^3.8.3" + "superagent": "^6.1.0" }, "engines": { "node": ">=6.0.0" @@ -9698,21 +10232,6 @@ "node": ">=8" } }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/table-layout": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", @@ -9728,9 +10247,9 @@ } }, "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", - "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "engines": { "node": ">=8" } @@ -9743,45 +10262,87 @@ "node": ">=8" } }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/terser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "peerDependencies": { + "acorn": "^8.5.0" + }, + "peerDependenciesMeta": { + "acorn": { + "optional": true + } } }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "node_modules/terser-webpack-plugin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", "dev": true, + "dependencies": { + "jest-worker": "^27.4.1", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" } }, "node_modules/test-exclude": { @@ -9818,12 +10379,6 @@ "any-promise": "^1.0.0" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -9834,18 +10389,6 @@ "resolved": "https://registry.npmjs.org/timeout-as-promise/-/timeout-as-promise-1.0.0.tgz", "integrity": "sha1-c2foEfyZKs/Nzaq/LlDfr4shV28=" }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -9875,9 +10418,9 @@ } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } @@ -9916,28 +10459,44 @@ "dev": true }, "node_modules/ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", - "dev": true, - "dependencies": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", + "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", + "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=6.0.0" - }, "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, "node_modules/ts-node/node_modules/diff": { @@ -9984,12 +10543,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" @@ -10042,48 +10601,31 @@ } }, "node_modules/typedoc": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.17.8.tgz", - "integrity": "sha512-/OyrHCJ8jtzu+QZ+771YaxQ9s4g5Z3XsQE3Ma7q+BL392xxBn4UMvvCdVnqKC2T/dz03/VXSLVKOP3lHmDdc/w==", - "dev": true, - "dependencies": { - "fs-extra": "^8.1.0", - "handlebars": "^4.7.6", - "highlight.js": "^10.0.0", - "lodash": "^4.17.15", - "lunr": "^2.3.8", - "marked": "1.0.0", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shelljs": "^0.8.4", - "typedoc-default-themes": "^0.10.2" + "version": "0.22.10", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.10.tgz", + "integrity": "sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA==", + "dev": true, + "dependencies": { + "glob": "^7.2.0", + "lunr": "^2.3.9", + "marked": "^3.0.8", + "minimatch": "^3.0.4", + "shiki": "^0.9.12" }, "bin": { "typedoc": "bin/typedoc" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 12.10.0" }, "peerDependencies": { - "typescript": ">=3.8.3" - } - }, - "node_modules/typedoc-default-themes": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.10.2.tgz", - "integrity": "sha512-zo09yRj+xwLFE3hyhJeVHWRSPuKEIAsFK5r2u47KL/HBKqpwdUSanoaz5L34IKiSATFrjG5ywmIu98hPVMfxZg==", - "dev": true, - "dependencies": { - "lunr": "^2.3.8" - }, - "engines": { - "node": ">= 8" + "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x" } }, "node_modules/typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -10094,9 +10636,9 @@ } }, "node_modules/typescript-logging": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/typescript-logging/-/typescript-logging-0.6.4.tgz", - "integrity": "sha512-jXISCGFyp4Q1uKLKi3zF0o8rwjeEipcIO7+C+jRttks3Ci8+8jDi9e87Jmz+8xuzZq+OcKJhDkiyHriqaWb+4A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typescript-logging/-/typescript-logging-1.0.0.tgz", + "integrity": "sha512-qeHtadCVKOt6ju4Ts20FgWRdlISditeTuplRlNTA+gFy7ENVK3czZ7YCET7yOZSZVnU00R+hGwls4dZv3+IBSg==", "dependencies": { "stacktrace-js": "1.3.1" } @@ -10116,46 +10658,28 @@ "dev": true }, "node_modules/uglify-js": { - "version": "3.13.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.3.tgz", - "integrity": "sha512-otIc7O9LyxpUcQoXzj2hL4LPWKklO6LJWoJUzNa8A17Xgi4fOeDC8FBDOLHnC/Slo1CQgsZMcM6as0M76BZaig==", + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.5.tgz", + "integrity": "sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==", "dev": true, "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "dependencies": { - "debug": "^2.2.0" - } - }, - "node_modules/undefsafe/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/undefsafe/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, "node_modules/underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", + "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==" }, "node_modules/unique-string": { "version": "2.0.0", @@ -10169,12 +10693,12 @@ } }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/unpipe": { @@ -10227,9 +10751,9 @@ } }, "node_modules/update-notifier/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10285,6 +10809,16 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", + "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -10301,11 +10835,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -10336,99 +10865,201 @@ "node": ">= 0.8" } }, - "node_modules/walk": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", - "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", + "node_modules/vscode-oniguruma": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", + "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, + "node_modules/watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, "dependencies": { - "foreachasync": "^3.0.0" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/wget-improved": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/wget-improved/-/wget-improved-3.2.1.tgz", - "integrity": "sha512-bZmRufYav/OFRdS8LerCbzP3b/L8tjRwqap6NhqcvEAfZrBMFwqjtFzbVk2gutEWdG78WKJgIn9yveI+ENQSlA==", + "node_modules/webpack": { + "version": "5.65.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", + "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", + "dev": true, "dependencies": { - "minimist": "1.2.5", - "tunnel": "0.0.6" + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.2" }, "bin": { - "nwget": "bin/nwget" + "webpack": "bin/webpack.js" }, "engines": { - "node": ">= 0.6.18" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/webpack-cli": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz", + "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.0", + "@webpack-cli/info": "^1.4.0", + "@webpack-cli/serve": "^1.6.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" }, "bin": { - "which": "bin/which" + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "dependencies": { - "string-width": "^1.0.2 || 2" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", "dev": true, + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, + "node_modules/wget-improved": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/wget-improved/-/wget-improved-3.2.1.tgz", + "integrity": "sha512-bZmRufYav/OFRdS8LerCbzP3b/L8tjRwqap6NhqcvEAfZrBMFwqjtFzbVk2gutEWdG78WKJgIn9yveI+ENQSlA==", "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "minimist": "1.2.5", + "tunnel": "0.0.6" + }, + "bin": { + "nwget": "bin/nwget" }, "engines": { - "node": ">=4" + "node": ">= 0.6.18" } }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "ansi-regex": "^3.0.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=4" + "node": ">= 8" } }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -10440,6 +11071,12 @@ "node": ">=8" } }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, "node_modules/winston": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", @@ -10461,12 +11098,13 @@ } }, "node_modules/winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.1.tgz", + "integrity": "sha512-ciZRlU4CSjHqHe8RQG1iPxKMRVwv6ZJ0RC7DxStKWd0KjpAhPDy5gVYSCpIUq+5CUsP+IyNOTZy1X0tO2QZqjg==", "dev": true, "dependencies": { - "readable-stream": "^2.3.7", + "logform": "^2.2.0", + "readable-stream": "^3.4.0", "triple-beam": "^1.2.0" }, "engines": { @@ -10474,27 +11112,49 @@ } }, "node_modules/winston-transport/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/winston-transport/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" + } + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" } }, "node_modules/word-wrap": { @@ -10533,9 +11193,9 @@ } }, "node_modules/workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", "dev": true }, "node_modules/wrap-ansi": { @@ -10554,14 +11214,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -10592,34 +11244,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -10632,11 +11261,11 @@ } }, "node_modules/ws": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", - "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.0.tgz", + "integrity": "sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -10681,9 +11310,9 @@ } }, "node_modules/xstate": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.23.1.tgz", - "integrity": "sha512-8ZoCe8d6wDSPfkep+GBgi+fKAdMyXcaizoNf5FKceEhlso4+9n1TeK6oviaDsXZ3Z5O8xKkJOxXPNuD4cA9LCw==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.27.0.tgz", + "integrity": "sha512-ohOwDM9tViC/zSSmY9261CHblDPqiaAk5vyjVbi69uJv9fGWMzlm0VDQwM2OvC61GKfXVBeuWSMkL7LPUsTpfA==", "dev": true, "funding": { "type": "opencollective", @@ -10715,6 +11344,7 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -10752,9 +11382,9 @@ } }, "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { "node": ">=10" @@ -10807,35 +11437,35 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.16.7" } }, "@babel/compat-data": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", - "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", "dev": true }, "@babel/core": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.14.tgz", - "integrity": "sha512-wZso/vyF4ki0l0znlgM4inxbdrUvCb+cVz8grxDq+6C9k6qbqoIJteQOKicaKjCipU3ISV+XedCqpL2RJJVehA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-compilation-targets": "^7.13.13", - "@babel/helper-module-transforms": "^7.13.14", - "@babel/helpers": "^7.13.10", - "@babel/parser": "^7.13.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", + "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.7", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -10859,12 +11489,12 @@ } }, "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz", + "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==", "dev": true, "requires": { - "@babel/types": "^7.13.0", + "@babel/types": "^7.16.7", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -10878,14 +11508,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "dev": true, "requires": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" }, "dependencies": { @@ -10897,162 +11527,152 @@ } } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" } }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" } }, - "@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" + "@babel/types": "^7.16.7" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true }, "@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", "dev": true, "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz", + "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==", "dev": true }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz", + "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -11066,16 +11686,30 @@ } }, "@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.7.tgz", + "integrity": "sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "dev": true, + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, "@dabh/diagnostics": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", @@ -11087,11 +11721,59 @@ "kuler": "^2.0.0" } }, + "@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, "@hapi/bourne": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz", "integrity": "sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==" }, + "@humanwhocodes/config-array": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -11105,6 +11787,15 @@ "resolve-from": "^5.0.0" }, "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -11115,6 +11806,16 @@ "path-exists": "^4.0.0" } }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -11157,43 +11858,46 @@ "dev": true }, "@microsoft/tsdoc": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.0.tgz", - "integrity": "sha512-/8J+4DdvexBH1Qh1yR8VZ6bPay2DL/TDdmSIypAa3dAghJzsdaiZG8COvzpYIML6HV2UVN0g4qbuqzjG4YKgWg==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", + "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", "dev": true }, "@microsoft/tsdoc-config": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.14.0.tgz", - "integrity": "sha512-KSj15FwyaxMCGJkC320rvNXxuJNCOVO02pNqIEdf5cbLakvHK8afoHTmcjdBEWl0cfBFZlMu/1DhL4VCzZq0rQ==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", + "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.13.0", + "@microsoft/tsdoc": "0.13.2", "ajv": "~6.12.6", "jju": "~1.4.0", "resolve": "~1.19.0" } }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, @@ -11224,9 +11928,9 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@ster5/global-mutex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@ster5/global-mutex/-/global-mutex-1.1.1.tgz", - "integrity": "sha512-dyz2Itai4tbpijvia7OnlSoWV0pAXBKBZH2p2+nq2K26lP+84PvbMZG5SBx30mFIWQLWJQPEs6ECK6IZlIAaJQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ster5/global-mutex/-/global-mutex-1.2.0.tgz", + "integrity": "sha512-UmLDijFT0oif4HNuHkXGEolwQe3Eb5x1WX+1fxEMrO92BojeDycn4gjQnZm8d6nZPizzbWrt6SLQgDU+bFALyw==" }, "@szmarczak/http-timer": { "version": "1.1.2", @@ -11236,6 +11940,30 @@ "defer-to-connect": "^1.0.1" } }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, "@types/adm-zip": { "version": "0.4.34", "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.4.34.tgz", @@ -11245,14 +11973,14 @@ } }, "@types/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.6.tgz", - "integrity": "sha512-ZkrXnZLC1mc4b9QLKaSrsxV4oxTRs10OI2kgSApT8G0v1jrmqppSHUVQ15kLorzsFBTjvf7OKF4kAibuuNQ+xA==" + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.12.tgz", + "integrity": "sha512-4i4w4tfNDo73BOjk0qHcB2YJ8A2SjITCrU4BTsgdJFTsVr6atPDXa0T9r0QZTrX3axtWwkqpZqF4B3gR0TqBGw==" }, "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, "requires": { "@types/connect": "*", @@ -11260,65 +11988,85 @@ } }, "@types/bonjour": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.8.tgz", - "integrity": "sha512-Di3AHXV6SS04EyurnOGxGjFXiLWmt2iopQTNtf0UodfvvGPJo+n60YHWfEy2XGF4dBeYQyrf7RpO5cqzrPxE9Q==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", "requires": { "@types/node": "*" } }, "@types/chai": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.16.tgz", - "integrity": "sha512-vI5iOAsez9+roLS3M3+Xx7w+WRuDtSmF8bQkrbcIJ2sC1PcDgVoA0WGpa+bIrJ+y8zqY2oi//fUctkxtIcXJCw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", + "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==", "dev": true }, "@types/chai-as-promised": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz", - "integrity": "sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.4.tgz", + "integrity": "sha512-1y3L1cHePcIm5vXkh1DSGf/zQq5n5xDKG1fpCvf18+uOkpce0Z1ozNFPkyWsVswK7ntN1sZBw3oU6gmN+pDUcA==", "dev": true, "requires": { "@types/chai": "*" } }, "@types/command-line-args": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.0.0.tgz", - "integrity": "sha512-4eOPXyn5DmP64MCMF8ePDvdlvlzt2a+F8ZaVjqmh2yFCpGjc1kI3kGnCFYX9SCsGTjQcWIyVZ86IHCEyjy/MNg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz", + "integrity": "sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==", "dev": true }, "@types/command-line-usage": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.1.tgz", - "integrity": "sha512-/xUgezxxYePeXhg5S04hUjxG9JZi+rJTs1+4NwpYPfSaS7BeDa6tVJkH6lN9Cb6rl8d24Fi2uX0s0Ngg2JT6gg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.2.tgz", + "integrity": "sha512-n7RlEEJ+4x4TS7ZQddTmNSxP+zziEG0TNsMfiRIxcIVXt71ENJ9ojeXmGO3wPoTdn7pJcU2xc3CJYMktNT6DPg==", "dev": true }, "@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, "requires": { "@types/node": "*" } }, "@types/cors": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", - "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "@types/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.2.tgz", + "integrity": "sha512-TzgYCWoPiTeRg6RQYgtuW7iODtVoKu3RVL72k3WohqhjfaOLK5Mg2T4Tg1o2bSfu0vPkoI48wdQFv5b/Xe04wQ==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, "@types/express": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", - "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", "dev": true, "requires": { "@types/body-parser": "*", @@ -11328,9 +12076,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", - "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", + "version": "4.17.27", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.27.tgz", + "integrity": "sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA==", "dev": true, "requires": { "@types/node": "*", @@ -11339,15 +12087,15 @@ } }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" + "version": "4.14.177", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.177.tgz", + "integrity": "sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw==" }, "@types/mime": { "version": "1.3.2", @@ -11356,23 +12104,23 @@ "dev": true }, "@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz", + "integrity": "sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q==", "requires": { "@types/node": "*" } }, "@types/mocha": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", - "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", "dev": true }, "@types/node": { - "version": "14.14.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.43.tgz", - "integrity": "sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" }, "@types/once": { "version": "1.4.0", @@ -11380,21 +12128,12 @@ "integrity": "sha512-cnEvTAVVRqF6OQg/4SLnbxQ0slZJHqZQDve5BzGhcIQtuMpPv8T5QNS2cBPa/W0jTxciqwn7bmJAIGe/bOJ5Kw==" }, "@types/pino": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/@types/pino/-/pino-6.3.6.tgz", - "integrity": "sha512-yVgSyMGzNDYe/XNMJyuIkklDeZbFdGAxRztYLoN1QQrrgiLJ1oJPmnS8Ge5xpzI9ODKEddKH97VFQ7cWO6Pumw==", - "requires": { - "@types/node": "*", - "@types/pino-std-serializers": "*", - "@types/sonic-boom": "*" - } - }, - "@types/pino-std-serializers": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz", - "integrity": "sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/pino/-/pino-7.0.5.tgz", + "integrity": "sha512-wKoab31pknvILkxAF8ss+v9iNyhw5Iu/0jLtRkUD74cNfOOLJNnqfFKAv0r7wVaTQxRZtWrMpGfShwwBjOcgcg==", + "dev": true, "requires": { - "@types/node": "*" + "pino": "*" } }, "@types/promise-timeout": { @@ -11403,104 +12142,140 @@ "integrity": "sha512-AtVKSZUtpBoZ4SshXJk5JcTXJllinHKKx615lsRNJUsbbFlI0AI8drlnoiQ+PNvjkeoF9Y8fJUh6UO2khsIBZw==" }, "@types/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, "@types/serve-static": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", - "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", "dev": true, "requires": { "@types/mime": "^1", "@types/node": "*" } }, - "@types/sonic-boom": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@types/sonic-boom/-/sonic-boom-0.7.0.tgz", - "integrity": "sha512-AfqR0fZMoUXUNwusgXKxcE9DPlHNDHQp6nKYUd4PSRpLobF5CCevSpyTEBcVZreqaWKCnGBr9KI1fHMTttoB7A==", - "requires": { - "@types/node": "*" - } - }, "@types/underscore": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.1.tgz", - "integrity": "sha512-mW23Xkp9HYgdMV7gnwuzqnPx6aG0J7xg/b7erQszOcyOizWylwCr9cgYM/BVVJHezUDxwyigG6+wCFQwCvyMBw==" + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", + "integrity": "sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==" }, "@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, "@types/ws": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.1.tgz", - "integrity": "sha512-ISCK1iFnR+jYv7+jLNX0wDqesZ/5RAeY3wUx6QaphmocphU61h+b+PHjS18TF4WIPTu/MMzxIq2PHr32o2TS5Q==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", "dev": true, "requires": { "@types/node": "*" } }, "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", + "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/experimental-utils": "5.9.0", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/type-utils": "5.9.0", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" } }, "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", + "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", + "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", "dev": true, "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "debug": "^4.3.2" } }, + "@typescript-eslint/scope-manager": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", + "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", + "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.9.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", + "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "dev": true + }, "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", + "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", "dev": true, "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", + "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "eslint-visitor-keys": "^3.0.0" } }, "@ungap/promise-all-settled": { @@ -11509,6 +12284,187 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", + "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", + "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", + "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -11525,27 +12481,41 @@ } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "requires": {} }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, "adm-zip": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.5.tgz", - "integrity": "sha512-IWwXKnCbirdbyXSfUDvCCrmYrOHANRZcc8NcRrvTlIApdl7PwE9oGcsYvNeJPAVY1M+70b4PxXGKIf8AEuiQ6w==" + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz", + "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==" }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -11563,34 +12533,19 @@ "uri-js": "^4.2.2" } }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } + "string-width": "^4.1.0" } }, "ansi-colors": { @@ -11609,9 +12564,9 @@ } }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -11636,39 +12591,39 @@ } }, "apidoc": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/apidoc/-/apidoc-0.23.0.tgz", - "integrity": "sha512-bn2QNaqyyL5ihRUlBBqwffElJg+hAgxAWPDdjJiLxDJ66Jiw+jf8uucFLYC9XHFqjdM7YTqLluM2PPshrqzObg==", - "dev": true, - "requires": { - "apidoc-core": "^0.11.1", - "commander": "^2.20.0", - "fs-extra": "^8.1.0", - "handlebars": "^4.7.6", - "lodash": "^4.17.15", - "markdown-it": "^10.0.0", - "nodemon": "^2.0.3", - "winston": "^3.2.1" - } - }, - "apidoc-core": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/apidoc-core/-/apidoc-core-0.11.1.tgz", - "integrity": "sha512-pt/ICBdFQCZTgL38Aw1XB3G9AajDU1JA5E3yoDEgg0mqbPTCkOL8AyWdysjvNtQS/kkXgSPazCZaZzZYqrPHog==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "glob": "^7.1.4", - "iconv-lite": "^0.5.0", + "version": "0.50.3", + "resolved": "https://registry.npmjs.org/apidoc/-/apidoc-0.50.3.tgz", + "integrity": "sha512-bRZD7A+RuN4wgXvBz8gePp+R+PdxtsNBS6Sdta1s0nG3+fJr1AAusCZlbQrSVM41k1E+DKaMZlsOFpodVa5/8Q==", + "dev": true, + "requires": { + "bootstrap": "3.4.1", + "commander": "^8.3.0", + "diff-match-patch": "^1.0.5", + "esbuild-loader": "^2.16.0", + "expose-loader": "^3.1.0", + "fs-extra": "^10.0.0", + "glob": "^7.2.0", + "handlebars": "^4.7.7", + "iconv-lite": "^0.6.3", + "jquery": "^3.6.0", "klaw-sync": "^6.0.0", - "lodash": "~4.17.15", - "semver": "~6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "lodash": "^4.17.21", + "markdown-it": "^12.2.0", + "nodemon": "^2.0.15", + "path-to-regexp": "^6.2.0", + "prismjs": "^1.25.0", + "semver": "^7.3.5", + "style-loader": "^3.3.1", + "url-parse": "^1.5.3", + "webpack": "^5.64.2", + "webpack-cli": "^4.9.1", + "winston": "^3.3.3" + }, + "dependencies": { + "path-to-regexp": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", + "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==", "dev": true } } @@ -11700,13 +12655,10 @@ "dev": true }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "args": { "version": "5.0.1", @@ -11739,12 +12691,13 @@ "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "requires": { "safer-buffer": "~2.1.0" } @@ -11773,16 +12726,10 @@ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-2.0.2.tgz", "integrity": "sha512-9sBQUQZMKFKcO/C3Bo6Rx4CQany0R0UeVcefNGRRdW2vbmaMOhV1sbmlXcQLcD56juLXbSGTBm0GGuvmrAF8pA==" }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" }, "asynckit": { "version": "0.4.0", @@ -11806,7 +12753,8 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -11824,6 +12772,12 @@ "callsite": "1.0.0" } }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -11838,20 +12792,20 @@ } }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.1", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" }, "dependencies": { "debug": { @@ -11902,21 +12856,22 @@ } } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "bootstrap": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "dev": true }, "boxen": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", - "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "requires": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", + "string-width": "^4.2.2", "type-fest": "^0.20.2", "widest-line": "^3.1.0", "wrap-ansi": "^7.0.0" @@ -11931,14 +12886,14 @@ } }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11981,6 +12936,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -12006,16 +12962,16 @@ "dev": true }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" } }, "buffer-crc32": { @@ -12024,9 +12980,9 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "buffer-indexof": { "version": "1.1.1", @@ -12040,29 +12996,6 @@ "requires": { "dicer": "0.2.5", "readable-stream": "1.1.x" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } } }, "byline": { @@ -12071,9 +13004,9 @@ "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" }, "cacheable-request": { "version": "6.1.0", @@ -12148,9 +13081,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001239", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz", - "integrity": "sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ==", + "version": "1.0.30001298", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz", + "integrity": "sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ==", "dev": true }, "chai": { @@ -12186,12 +13119,6 @@ "supports-color": "^5.3.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -12199,20 +13126,36 @@ "dev": true }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } } }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -12221,41 +13164,22 @@ "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true }, - "cli-spinner": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", - "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==" + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" }, "cli-table": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", - "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", "requires": { "colors": "1.0.3" } }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -12264,21 +13188,17 @@ "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, "clone-response": { @@ -12290,13 +13210,13 @@ } }, "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dev": true, "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "color-convert": { @@ -12313,9 +13233,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -12323,9 +13243,9 @@ } }, "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, "colors": { @@ -12334,12 +13254,12 @@ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" }, "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "dev": true, "requires": { - "color": "3.0.x", + "color": "^3.1.3", "text-hex": "1.0.x" } }, @@ -12353,11 +13273,11 @@ } }, "command-line-args": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz", - "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz", + "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==", "requires": { - "array-back": "^3.0.1", + "array-back": "^3.1.0", "find-replace": "^3.0.0", "lodash.camelcase": "^4.3.0", "typical": "^4.0.0" @@ -12375,9 +13295,9 @@ }, "dependencies": { "array-back": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", - "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" }, "typical": { "version": "5.2.0", @@ -12387,9 +13307,9 @@ } }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true }, "commondir": { @@ -12407,7 +13327,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -12420,6 +13341,11 @@ "typedarray": "^0.0.6" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -12434,6 +13360,11 @@ "util-deprecate": "~1.0.1" } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -12458,11 +13389,11 @@ } }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" } }, "content-type": { @@ -12471,18 +13402,26 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "cookie-signature": { "version": "1.0.6", @@ -12490,15 +13429,15 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cors": { "version": "2.8.5", @@ -12509,25 +13448,21 @@ "vary": "^1" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "crypto-random-string": { @@ -12535,23 +13470,6 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, - "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - } - }, - "css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -12561,14 +13479,14 @@ } }, "dateformat": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.5.1.tgz", - "integrity": "sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==" + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -12616,9 +13534,9 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "default-require-extensions": { @@ -12643,31 +13561,6 @@ "object-keys": "^1.0.12" } }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, "delayed": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/delayed/-/delayed-2.0.0.tgz", @@ -12701,29 +13594,6 @@ "requires": { "readable-stream": "1.1.x", "streamsearch": "0.1.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } } }, "diff": { @@ -12732,10 +13602,17 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "requires": { "path-type": "^4.0.0" } @@ -12771,47 +13648,6 @@ "esutils": "^2.0.2" } }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "domhandler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", - "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", - "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -12840,9 +13676,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.757", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.757.tgz", - "integrity": "sha512-kP0ooyrvavDC+Y9UG6G/pUVxfRNM2VTJwtLQLvgsJeyf1V+7shMCb68Wj0/TETmfx8dWv9pToGkVT39udE87wQ==", + "version": "1.4.38", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.38.tgz", + "integrity": "sha512-WhHt3sZazKj0KK/UpgsbGQnUUoFeAHVishzHFExMxagpZgjiGYSC9S0ZlbhCfSH2L2i+2A1yyqOIliTctMx7KQ==", "dev": true }, "emoji-regex": { @@ -12850,6 +13686,12 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, "enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", @@ -12869,16 +13711,42 @@ "once": "^1.4.0" } }, + "enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true }, "env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, "error-stack-parser": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz", @@ -12887,12 +13755,192 @@ "stackframe": "^0.3.1" } }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, + "esbuild": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.10.tgz", + "integrity": "sha512-ibZb+NwFqBwHHJlpnFMtg4aNmVK+LUtYMFC9CuKs6lDCBEvCHpqCFZFEirpqt1jOugwKGx8gALNGvX56lQyfew==", + "dev": true, + "requires": { + "esbuild-android-arm64": "0.14.10", + "esbuild-darwin-64": "0.14.10", + "esbuild-darwin-arm64": "0.14.10", + "esbuild-freebsd-64": "0.14.10", + "esbuild-freebsd-arm64": "0.14.10", + "esbuild-linux-32": "0.14.10", + "esbuild-linux-64": "0.14.10", + "esbuild-linux-arm": "0.14.10", + "esbuild-linux-arm64": "0.14.10", + "esbuild-linux-mips64le": "0.14.10", + "esbuild-linux-ppc64le": "0.14.10", + "esbuild-linux-s390x": "0.14.10", + "esbuild-netbsd-64": "0.14.10", + "esbuild-openbsd-64": "0.14.10", + "esbuild-sunos-64": "0.14.10", + "esbuild-windows-32": "0.14.10", + "esbuild-windows-64": "0.14.10", + "esbuild-windows-arm64": "0.14.10" + } + }, + "esbuild-android-arm64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.10.tgz", + "integrity": "sha512-vzkTafHKoiMX4uIN1kBnE/HXYLpNT95EgGanVk6DHGeYgDolU0NBxjO7yZpq4ZGFPOx8384eAdDrBYhO11TAlQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.10.tgz", + "integrity": "sha512-DJwzFVB95ZV7C3PQbf052WqaUuuMFXJeZJ0LKdnP1w+QOU0rlbKfX0tzuhoS//rOXUj1TFIwRuRsd0FX6skR7A==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.10.tgz", + "integrity": "sha512-RNaaoZDg3nsqs5z56vYCjk/VJ76npf752W0rOaCl5lO5TsgV9zecfdYgt7dtUrIx8b7APhVaNYud+tGsDOVC9g==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.10.tgz", + "integrity": "sha512-10B3AzW894u6bGZZhWiJOHw1uEHb4AFbUuBdyml1Ht0vIqd+KqWW+iY/yMwQAzILr2WJZqEhbOXRkJtY8aRqOw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.10.tgz", + "integrity": "sha512-mSQrKB7UaWvuryBTCo9leOfY2uEUSimAvcKIaUWbk5Hth9Sg+Try+qNA/NibPgs/vHkX0KFo/Rce6RPea+P15g==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.10.tgz", + "integrity": "sha512-lktF09JgJLZ63ANYHIPdYe339PDuVn19Q/FcGKkXWf+jSPkn5xkYzAabboNGZNUgNqSJ/vY7VrOn6UrBbJjgYA==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.10.tgz", + "integrity": "sha512-K+gCQz2oLIIBI8ZM77e9sYD5/DwEpeYCrOQ2SYXx+R4OU2CT9QjJDi4/OpE7ko4AcYMlMW7qrOCuLSgAlEj4Wg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.10.tgz", + "integrity": "sha512-BYa60dZ/KPmNKYxtHa3LSEdfKWHcm/RzP0MjB4AeBPhjS0D6/okhaBesZIY9kVIGDyeenKsJNOmnVt4+dhNnvQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.10.tgz", + "integrity": "sha512-+qocQuQvcp5wo/V+OLXxqHPc+gxHttJEvbU/xrCGE03vIMqraL4wMua8JQx0SWEnJCWP+Nhf//v8OSwz1Xr5kA==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.10.tgz", + "integrity": "sha512-nmUd2xoBXpGo4NJCEWoaBj+n4EtDoLEvEYc8Z3aSJrY0Oa6s04czD1flmhd0I/d6QEU8b7GQ9U0g/rtBfhtxBg==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.10.tgz", + "integrity": "sha512-vsOWZjm0rZix7HSmqwPph9arRVCyPtUpcURdayQDuIhMG2/UxJxpbdRaa//w4zYqcJzAWwuyH2PAlyy0ZNuxqQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.10.tgz", + "integrity": "sha512-knArKKZm0ypIYWOWyOT7+accVwbVV1LZnl2FWWy05u9Tyv5oqJ2F5+X2Vqe/gqd61enJXQWqoufXopvG3zULOg==", + "dev": true, + "optional": true + }, + "esbuild-loader": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-2.18.0.tgz", + "integrity": "sha512-AKqxM3bI+gvGPV8o6NAhR+cBxVO8+dh+O0OXBHIXXwuSGumckbPWHzZ17subjBGI2YEGyJ1STH7Haj8aCrwL/w==", + "dev": true, + "requires": { + "esbuild": "^0.14.6", + "joycon": "^3.0.1", + "json5": "^2.2.0", + "loader-utils": "^2.0.0", + "tapable": "^2.2.0", + "webpack-sources": "^2.2.0" + }, + "dependencies": { + "joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true + } + } + }, + "esbuild-netbsd-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.10.tgz", + "integrity": "sha512-6Gg8neVcLeyq0yt9bZpReb8ntZ8LBEjthxrcYWVrBElcltnDjIy1hrzsujt0+sC2rL+TlSsE9dzgyuvlDdPp2w==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.10.tgz", + "integrity": "sha512-9rkHZzp10zI90CfKbFrwmQjqZaeDmyQ6s9/hvCwRkbOCHuto6RvMYH9ghQpcr5cUxD5OQIA+sHXi0zokRNXjcg==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.10.tgz", + "integrity": "sha512-mEU+pqkhkhbwpJj5DiN3vL0GUFR/yrL3qj8ER1amIVyRibKbj02VM1QaIuk1sy5DRVIKiFXXgCaHvH3RNWCHIw==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.10.tgz", + "integrity": "sha512-Z5DieUL1N6s78dOSdL95KWf8Y89RtPGxIoMF+LEy8ChDsX+pZpz6uAVCn+YaWpqQXO+2TnrcbgBIoprq2Mco1g==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.10.tgz", + "integrity": "sha512-LE5Mm62y0Bilu7RDryBhHIX8rK3at5VwJ6IGM3BsASidCfOBTzqcs7Yy0/Vkq39VKeTmy9/66BAfVoZRNznoDw==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.10.tgz", + "integrity": "sha512-OJOyxDtabvcUYTc+O4dR0JMzLBz6G9+gXIHA7Oc5d5Fv1xiYa0nUeo8+W5s2e6ZkPRdIwOseYoL70rZz80S5BA==", + "dev": true, + "optional": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -12914,84 +13962,142 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", + "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "regexpp": { + "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, "eslint-formatter-pretty": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-3.0.1.tgz", - "integrity": "sha512-hhQ/ASD4i6BAEalcEfUxesFtJFftT8xFsimCzUpPbTzygJ4J17yCGcJ3XKCB2g7XTJTv0pi7rVTadfHVmtfSRA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", + "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", "dev": true, "requires": { + "@types/eslint": "^7.2.13", "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", + "chalk": "^4.1.0", "eslint-rule-docs": "^1.1.5", - "log-symbols": "^3.0.0", - "plur": "^3.0.1", + "log-symbols": "^4.0.0", + "plur": "^4.0.0", "string-width": "^4.2.0", "supports-hyperlinks": "^2.0.0" }, @@ -13006,9 +14112,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -13048,19 +14154,19 @@ } }, "eslint-plugin-tsdoc": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.11.tgz", - "integrity": "sha512-vEjGANpmBfrvpKj9rwePGhA+gIe1mp+dhDZsrkxlHqPVOZvzVdFSV9fxu/o3eppmxhybI8brD88jOrLEAIB9Gw==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.14.tgz", + "integrity": "sha512-fJ3fnZRsdIoBZgzkQjv8vAj6NeeOoFkTfgosj6mKsFjX70QV256sA/wq+y/R2+OL4L8E79VVaVWrPeZnKNe8Ng==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.13.0", - "@microsoft/tsdoc-config": "0.14.0" + "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc-config": "0.15.2" } }, "eslint-rule-docs": { - "version": "1.1.223", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.223.tgz", - "integrity": "sha512-6HU1vH6b3QBI2RiFyNE1cQWr2pQ+op1zqZRsVXBZsLngF5ePBGDbkwFtr1Ye4Yq1DBKc499TMEkIzx25xVetuw==", + "version": "1.1.231", + "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.231.tgz", + "integrity": "sha512-egHz9A1WG7b8CS0x1P6P/Rj5FqZOjray/VjpJa14tMZalfRKvpE2ONJ3plCM7+PcinmU4tcmbPLv0VtwzSdLVA==", "dev": true }, "eslint-scope": { @@ -13074,29 +14180,37 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", "dev": true }, "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" } }, "esprima": { @@ -13115,9 +14229,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -13132,9 +14246,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -13156,22 +14270,60 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + } + } + }, + "expose-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-3.1.0.tgz", + "integrity": "sha512-2RExSo0yJiqP+xiUue13jQa2IHE8kLDzTI7b6kn+vUlBVvlzNSiLDzo4e5Pp5J039usvTUnxZ8sUOhv0Kg15NA==", + "dev": true, + "requires": {} + }, "expr-eval": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expr-eval/-/expr-eval-2.0.2.tgz", "integrity": "sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==" }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", + "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", "requires": { "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -13185,13 +14337,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.6", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -13214,37 +14366,9 @@ } }, "express-async-handler": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.1.4.tgz", - "integrity": "sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ==" - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.2.0.tgz", + "integrity": "sha512-rCSVtPXRmQSW8rmik/AIb2P0op6l7r1fMW538yyvTMltCO4xQEWMmobfrIxN2V1/mVrgxB8Az3reYF6yUZw37w==" }, "fast-deep-equal": { "version": "3.1.3", @@ -13253,16 +14377,27 @@ "dev": true }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz", + "integrity": "sha512-MBwILhhD92sziIrMQwpqcuGERF+BH99ei2a3XsGJuqEKcSycAL+w0HWokFenZXona+kjFr82Lf71eTxNRC06XQ==", + "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } } }, "fast-json-stable-stringify": { @@ -13278,19 +14413,26 @@ "dev": true }, "fast-redact": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.1.tgz", - "integrity": "sha512-kYpn4Y/valC9MdrISg47tZOpYBNoTXKgT9GYXFpHN/jYFs+lFkPoisY+LcBODdKVMY96ATzvzsWv+ES/4Kmufw==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.2.tgz", + "integrity": "sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg==" }, "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, "requires": { "reusify": "^1.0.4" } @@ -13309,22 +14451,13 @@ "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==", "dev": true }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "file-uri-to-path": { @@ -13370,9 +14503,9 @@ } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -13405,14 +14538,13 @@ "dev": true }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatstr": { @@ -13421,9 +14553,9 @@ "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, "fn.name": { @@ -13432,11 +14564,6 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", "dev": true }, - "foreachasync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", - "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" - }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -13445,72 +14572,29 @@ "requires": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", "dev": true }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fresh": { "version": "0.5.2", @@ -13524,20 +14608,21 @@ "dev": true }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "dev": true, "requires": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "fsevents": { "version": "2.3.2", @@ -13606,9 +14691,10 @@ } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13619,13 +14705,20 @@ } }, "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "requires": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "global-dirs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", @@ -13635,40 +14728,34 @@ } }, "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" }, "dependencies": { "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true } } }, "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" - } } }, "got": { @@ -13690,9 +14777,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "growl": { "version": "1.10.5", @@ -13731,6 +14818,14 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -13765,12 +14860,6 @@ "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.3.1.tgz", "integrity": "sha512-mUarDrcDM53Hwvlm/sMkFQ1TfxOzLhQlDEaSqpIaQV9b+8u7Ba+dPS7zf/Ivx0CVfGzMBbPwuRUUbFy+5vDD7A==" }, - "highlight.js": { - "version": "10.7.2", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.2.tgz", - "integrity": "sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==", - "dev": true - }, "hoek": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", @@ -13782,59 +14871,47 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } + "toidentifier": "1.0.1" } }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "humanize": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz", "integrity": "sha1-GZT/rs3+nEQe0r2sdFK3u0yeQaQ=" }, "iconv-lite": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "ignore-by-default": { @@ -13848,136 +14925,61 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" } }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + }, "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, "ip": { @@ -13991,17 +14993,18 @@ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "irregular-plurals": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", - "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", + "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", "dev": true }, "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-arrayish": { @@ -14027,18 +15030,21 @@ } }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dev": true, "requires": { "has": "^1.0.3" } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-extglob": { "version": "2.1.1", @@ -14051,9 +15057,9 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } @@ -14082,11 +15088,6 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" - }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -14098,19 +15099,28 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "requires": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" + "has-tostringtag": "^1.0.0" } }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-typedarray": { @@ -14118,6 +15128,12 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -14130,9 +15146,9 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "isemail": { "version": "3.2.0", @@ -14148,10 +15164,16 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-hook": { @@ -14198,70 +15220,11 @@ "uuid": "^3.3.3" }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -14294,9 +15257,9 @@ } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -14305,15 +15268,43 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", + "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", "dev": true, "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, + "jest-worker": { + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -14347,6 +15338,12 @@ "resolved": "https://registry.npmjs.org/joycon/-/joycon-2.2.5.tgz", "integrity": "sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==" }, + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -14354,13 +15351,12 @@ "dev": true }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, "jsbn": { @@ -14405,19 +15401,26 @@ "minimist": "^1.2.5" } }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, "jsrsasign": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-10.3.0.tgz", - "integrity": "sha512-irDIKKFW++EAELgP3fjFi5/Fn0XEyfuQTTgpbeFwCGkV6tRIYZl3uraRea2HTXWCstcSZuDaCbdAhU1n+075Bg==" + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-10.5.1.tgz", + "integrity": "sha512-yW0fq87KNZFw4Pn5ySllXs3ztZAROQZczEheKZTqmiNpCe/Xj9r5NhuAQ7MXTOyEZGJ/+MPHGTsfbgPFaLpwHQ==" }, "keyv": { "version": "3.1.0", @@ -14427,6 +15430,12 @@ "json-buffer": "3.0.0" } }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, "klaw-sync": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", @@ -14456,24 +15465,41 @@ "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", "dev": true, "requires": { "uc.micro": "^1.0.1" } }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -14499,32 +15525,90 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^2.4.2" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz", + "integrity": "sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ==", "dev": true, "requires": { "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", "fecha": "^4.2.0", "ms": "^2.1.1", + "safe-stable-stringify": "^1.1.0", "triple-beam": "^1.3.0" }, "dependencies": { "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.1.tgz", + "integrity": "sha512-urbBmMVnD1vk0mUwCpnWv06P3f16EF+RMTtIXTkylJk5mAdfrMepu9B3hhSnL8DGkc1Ra6pENJHrXTKvcAZ0wA==", "dev": true } } @@ -14548,12 +15632,9 @@ } }, "ltx": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/ltx/-/ltx-2.10.0.tgz", - "integrity": "sha512-RB4zR6Mrp/0wTNS9WxMvpgfht/7u/8QAC9DpPD19opL/4OASPa28uoliFqeDkLUU8pQ4aeAfATBZmz1aSAHkMw==", - "requires": { - "inherits": "^2.0.4" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ltx/-/ltx-3.0.0.tgz", + "integrity": "sha512-bu3/4/ApUmMqVNuIkHaRhqVtEi6didYcBDIF56xhPRCzVpdztCipZ62CUuaxMlMBUzaVL93+4LZRqe02fuAG6A==" }, "lunr": { "version": "2.3.9", @@ -14583,22 +15664,22 @@ "dev": true }, "markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", "dev": true, "requires": { - "argparse": "^1.0.7", - "entities": "~2.0.0", - "linkify-it": "^2.0.0", + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" } }, "marked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.0.0.tgz", - "integrity": "sha512-Wo+L1pWTVibfrSr+TTtMuiMfNzmZWiOPeO7rZsQUY5bgsxpHesBEcIWJloWVTFnrMXnf/TL30eTFSGJddmQAng==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", "dev": true }, "mdurl": { @@ -14617,10 +15698,17 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true }, "methods": { "version": "1.1.2", @@ -14628,12 +15716,13 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "mime": { @@ -14642,16 +15731,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" }, "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "requires": { - "mime-db": "1.47.0" + "mime-db": "1.51.0" } }, "mimic-fn": { @@ -14669,6 +15758,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -14687,118 +15777,79 @@ } }, "mocha": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", - "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", + "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", + "glob": "7.1.7", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", "minimatch": "3.0.4", "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", + "workerpool": "6.1.5", "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ms": "2.1.2" }, "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "requires": { - "argparse": "^2.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "log-symbols": { + "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - } + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "ms": { "version": "2.1.3", @@ -14814,15 +15865,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -14838,14 +15880,14 @@ "dev": true }, "multer": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", - "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", + "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", "requires": { "append-field": "^1.0.0", "busboy": "^0.2.11", "concat-stream": "^1.5.2", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.4", "object-assign": "^4.1.1", "on-finished": "^2.3.0", "type-is": "^1.6.4", @@ -14866,21 +15908,15 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" }, "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", "dev": true }, "natural-compare": { @@ -14900,12 +15936,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-expat": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/node-expat/-/node-expat-2.4.0.tgz", @@ -14916,60 +15946,60 @@ } }, "node-opcua": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua/-/node-opcua-2.37.0.tgz", - "integrity": "sha512-+0rLLsnVWIjhxtqbFmL+y9Pb96BPV1Gsqv2ibWGhs65gbUdtoN8O7vdoQ0/9dRWZ8efqSw05IJECk+ECi4JkKg==", - "requires": { - "chalk": "^4.1.0", - "node-opcua-address-space": "2.37.0", - "node-opcua-address-space-for-conformance-testing": "2.37.0", - "node-opcua-aggregates": "2.37.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-certificate-manager": "2.37.0", - "node-opcua-client": "2.37.0", - "node-opcua-client-crawler": "2.37.0", - "node-opcua-client-proxy": "2.37.0", - "node-opcua-common": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-data-access": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-hostname": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-nodesets": "2.36.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-packet-analyzer": "2.37.0", - "node-opcua-secure-channel": "2.37.0", - "node-opcua-server": "2.37.0", - "node-opcua-server-discovery": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-discovery": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-history": "2.37.0", - "node-opcua-service-node-management": "2.37.0", - "node-opcua-service-query": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-register-node": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-service-session": "2.37.0", - "node-opcua-service-subscription": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-transport": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "node-opcua-vendor-diagnostic": "2.37.0", - "semver": "^7.3.4" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua/-/node-opcua-2.62.7.tgz", + "integrity": "sha512-D56oRaJ1E0/00UhmsC+ZyokzZOUMRQs0coEixNMLCN7YVuJQxlTjnvZ6L/SQEr50cqjRUR3P+PE/y3z+0os/RQ==", + "requires": { + "chalk": "4.1.2", + "node-opcua-address-space": "2.62.7", + "node-opcua-address-space-for-conformance-testing": "2.62.7", + "node-opcua-aggregates": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-certificate-manager": "2.62.7", + "node-opcua-client": "2.62.7", + "node-opcua-client-crawler": "2.62.7", + "node-opcua-client-proxy": "2.62.7", + "node-opcua-common": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-data-access": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-hostname": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-nodesets": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-packet-analyzer": "2.62.7", + "node-opcua-secure-channel": "2.62.7", + "node-opcua-server": "2.62.7", + "node-opcua-server-discovery": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-discovery": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-service-node-management": "2.62.7", + "node-opcua-service-query": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-register-node": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-service-session": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-transport": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "node-opcua-vendor-diagnostic": "2.62.7", + "semver": "^7.3.5" }, "dependencies": { "ansi-styles": { @@ -14981,9 +16011,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15018,43 +16048,44 @@ } }, "node-opcua-address-space": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-address-space/-/node-opcua-address-space-2.37.0.tgz", - "integrity": "sha512-mFG7OL9pYI5htkJw0vbKFmdGKMq9rrh9ttM8/DuPu96rhF393zOiFw30j9VxpokR4A8jrGFaFYUP5EF5r5ZsFA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-address-space/-/node-opcua-address-space-2.62.7.tgz", + "integrity": "sha512-R+8mOPAdqpjsjJG//Y7d5bUaubrsfpubPjC42juB4GlwNk8lAhcrD+X4Fx48FUSKcDZN+nJK+XHRln4MgrC2WQ==", "requires": { - "@types/lodash": "4.14.168", - "async": "^3.2.0", - "chalk": "^4.1.0", + "@types/lodash": "4.14.177", + "async": "^3.2.2", + "chalk": "4.1.2", "dequeue": "^1.0.5", "lodash": "4.17.21", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-client-dynamic-extension-object": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-access": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-pseudo-session": "2.37.0", - "node-opcua-schemas": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-history": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "node-opcua-xml2json": "2.37.0", - "pretty-error": "^3.0.3", + "node-opcua-address-space-base": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-client-dynamic-extension-object": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-access": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-nodeset-ua": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pseudo-session": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "node-opcua-xml2json": "2.62.7", "set-prototype-of": "^1.0.0", "thenify": "^3.3.1", "xml-writer": "^1.7.0" @@ -15069,9 +16100,96 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "node-opcua-address-space-base": { + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-address-space-base/-/node-opcua-address-space-base-2.62.7.tgz", + "integrity": "sha512-VNFZ4gOuBe7qIl9GoIqp4RlKJhUXbfVRsRzH5v7SQDxUYdLt2mgXdk4a6ME53u0HhdxZr9hZvRXfqWqGSIw4FA==", + "requires": { + "@types/lodash": "4.14.177", + "async": "^3.2.2", + "chalk": "4.1.2", + "dequeue": "^1.0.5", + "lodash": "4.17.21", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-client-dynamic-extension-object": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-access": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pseudo-session": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "node-opcua-xml2json": "2.62.7", + "set-prototype-of": "^1.0.0", + "thenify": "^3.3.1", + "xml-writer": "^1.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15106,50 +16224,49 @@ } }, "node-opcua-address-space-for-conformance-testing": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-address-space-for-conformance-testing/-/node-opcua-address-space-for-conformance-testing-2.37.0.tgz", - "integrity": "sha512-IVXryaVTEertNOSqZ3Sw2DqKC51Cs6iqQUYBWNFTAxDHgu7u6hvQeuwY86zaRI4IBujGzVRf3WroNl5xvSqhJg==", - "requires": { - "node-opcua-address-space": "2.37.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-data-access": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-address-space-for-conformance-testing/-/node-opcua-address-space-for-conformance-testing-2.62.7.tgz", + "integrity": "sha512-arAa04mB6UJYK28MSjrw3Dk4uWvCrN7FGWzDoN5yT+DQngd89HuymMSgbvQE806sOD/0dO8YY6SLoqS4CO3Jcw==", + "requires": { + "node-opcua-address-space": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-data-access": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node-opcua-aggregates": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-aggregates/-/node-opcua-aggregates-2.37.0.tgz", - "integrity": "sha512-DlKNtaVVrOMhVZl/fN19plQ1dxRBsBExKZDAPqspEiOXwzkyr9mNMDkWIziVCV9pgVF7FZUAHwEkVUO9cCFdrw==", - "requires": { - "@types/async": "^3.2.5", - "node-opcua-address-space": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-nodesets": "2.36.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-service-history": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-aggregates/-/node-opcua-aggregates-2.62.7.tgz", + "integrity": "sha512-jihyxxBNfuh7dRpbEsYMTng1/SIvIxC5ykWK0DJ2ZF3zrGOus/6BCO8RJYEZAQELZyfqHPTOYFuowL6S0l1WjQ==", + "requires": { + "@types/async": "^3.2.10", + "node-opcua-address-space": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-nodesets": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node-opcua-assert": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-assert/-/node-opcua-assert-2.37.0.tgz", - "integrity": "sha512-J7E9mhp1bFHX9FCM40Jlekyaj0ZqCtT6VR9M6438Tn6qGPaL2zYwPBNDHmaHt/eFPjLwHRHXvQhDBCA0OvxPrQ==", + "version": "2.55.0", + "resolved": "https://registry.npmjs.org/node-opcua-assert/-/node-opcua-assert-2.55.0.tgz", + "integrity": "sha512-FmgDd7d8/s6V0K277dRyMhVNEH+CRzZxJR2Ix+cJxSQ340tkFvjLeI2CmiwMTKpozIsK2QiV4HY658RSvypiEA==", "requires": { "better-assert": "^1.0.2", - "chalk": "^4.1.0", - "pretty-error": "^3.0.3" + "chalk": "4.1.2" }, "dependencies": { "ansi-styles": { @@ -15161,9 +16278,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15198,58 +16315,58 @@ } }, "node-opcua-basic-types": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-basic-types/-/node-opcua-basic-types-2.37.0.tgz", - "integrity": "sha512-tEwRzu7AYJpgYCuNojBaKehMj8JOsf0/dhyyNu1ozxpKT81BQUwVY8QW4g1HuhYjKTfbD8FwT27TnEp01gHv3Q==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-basic-types/-/node-opcua-basic-types-2.62.7.tgz", + "integrity": "sha512-MOdSNOW1JNe/Ns4Ju+qZgUjfSACk/yjzwvZk6TsCSU/97Ck8zm7IWMSBf6GI0/1ZRP58fv4bBPCRd4dN423MZA==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-guid": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-guid": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7" } }, "node-opcua-binary-stream": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-binary-stream/-/node-opcua-binary-stream-2.37.0.tgz", - "integrity": "sha512-B8SMbyPFngoYi4WV5EPJYgfuVoKYq0zM70Onn7sLDv/PMp4pUwzMnUxvTt1rpo9hdf01tGP+ePDs9HQOATaKIg==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-binary-stream/-/node-opcua-binary-stream-2.62.7.tgz", + "integrity": "sha512-J+SdUdC/mUFcBeHQ5sNGWE/se47c0Svz3U4yG3/BYHq/fhQ0Wdk+oSi7/+qR3qGxxbafyNPwQGftGH9zsaNIoQ==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-buffer-utils": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-buffer-utils": "2.62.7" } }, "node-opcua-buffer-utils": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-buffer-utils/-/node-opcua-buffer-utils-2.37.0.tgz", - "integrity": "sha512-5O2XyamlcdqMmbhnN8ZY0vTvoqPy1xfXM58m4A4J8h15P7HK97BTv3bI4ekw6YEONs07yaAFqt7sHE2i69T7FA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-buffer-utils/-/node-opcua-buffer-utils-2.62.7.tgz", + "integrity": "sha512-8RLR/tZovV83S4HMcREebTLA5n+JWYsmSWztUxFqK99PXkjmk5oAqxyk2RUL0NhzkP5gcSdjjnUMhM/hwlo7OQ==", "requires": { - "node-opcua-assert": "2.37.0" + "node-opcua-assert": "2.55.0" } }, "node-opcua-certificate-manager": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-certificate-manager/-/node-opcua-certificate-manager-2.37.0.tgz", - "integrity": "sha512-o6GmWoJG6pnWTft61HYdG7SbYONrtstRHZALcrwHgnmGigoL4RIiHvxQkrqzbOtg/pOXHRSQZnU0vziBCydCPg==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-certificate-manager/-/node-opcua-certificate-manager-2.62.7.tgz", + "integrity": "sha512-e2j8OAH+ZDqQiW0eN5ypExbOz7i287WvrqBHPRp0a8uk2bNkc94xbY+WiiUlZbw7DvugDU78q02db+7mdP1A3w==", "requires": { - "@types/mkdirp": "0.5.2", - "chalk": "^4.1.0", + "@types/mkdirp": "1.0.1", + "chalk": "4.1.2", "delayed": "^2.0.0", - "env-paths": "^2.2.1", - "mkdirp": "0.5.5", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-debug": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-pki": "^2.8.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", + "env-paths": "2.2.1", + "mkdirp": "1.0.4", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-debug": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pki": "^2.13.0", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", "once": "^1.4.0", "thenify": "^3.3.1" }, @@ -15263,9 +16380,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15289,6 +16406,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -15300,17 +16422,17 @@ } }, "node-opcua-chunkmanager": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-chunkmanager/-/node-opcua-chunkmanager-2.37.0.tgz", - "integrity": "sha512-t6NAU2mFUS6KEgg38O0K5u4xXECaqS5Wh/d73QyEbwCsNcLUrBjo9SkVUwVW7MB8y7We0hyo1raXt0KfR5BfGQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-chunkmanager/-/node-opcua-chunkmanager-2.62.7.tgz", + "integrity": "sha512-RaEnDosux6ZHZWs6f4feVszysCh4Q60NY/7+yJnRK4G4zs/rkpV3x2aP9/dMMZmyYmeoa6JWWzB1sorHis+UzQ==", "requires": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-packet-assembler": "2.37.0" + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-packet-assembler": "2.62.7" }, "dependencies": { "ansi-styles": { @@ -15322,9 +16444,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15359,58 +16481,59 @@ } }, "node-opcua-client": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-client/-/node-opcua-client-2.37.0.tgz", - "integrity": "sha512-p8vjGyw31IVImatoPb7+SQMaXGRcYjyeFuWEuueohGJosgh+qqVySKlQ61ZztoQxwrBTStiYiduVk69shvGF2A==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-client/-/node-opcua-client-2.62.7.tgz", + "integrity": "sha512-q3MNUR+1y1O1DDGot60mLgKJD65fK7JPAD1blTQuj5Co/NGzj1U4ON4t0eD3a90DZwaqQjt3GY8OLSkHYmWPzg==", "requires": { - "@types/async": "^3.2.5", + "@ster5/global-mutex": "^1.2.0", + "@types/async": "^3.2.10", "@types/once": "^1.4.0", - "@types/underscore": "^1.11.0", - "async": "^3.2.0", + "@types/underscore": "^1.11.4", + "async": "^3.2.2", "callbackify": "^1.1.0", - "chalk": "^4.1.0", + "chalk": "4.1.2", "delayed": "^2.0.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-certificate-manager": "2.37.0", - "node-opcua-client-dynamic-extension-object": "2.37.0", - "node-opcua-common": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-hostname": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-pki": "^2.8.0", - "node-opcua-pseudo-session": "2.37.0", - "node-opcua-schemas": "2.37.0", - "node-opcua-secure-channel": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-discovery": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-history": "2.37.0", - "node-opcua-service-query": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-register-node": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-service-session": "2.37.0", - "node-opcua-service-subscription": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-certificate-manager": "2.62.7", + "node-opcua-client-dynamic-extension-object": "2.62.7", + "node-opcua-common": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-hostname": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pki": "^2.13.0", + "node-opcua-pseudo-session": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-secure-channel": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-discovery": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-service-query": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-register-node": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-service-session": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", "once": "^1.4.0", "thenify": "^3.3.1", - "underscore": "^1.12.0" + "underscore": "^1.13.1" }, "dependencies": { "ansi-styles": { @@ -15422,9 +16545,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15459,48 +16582,49 @@ } }, "node-opcua-client-crawler": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-client-crawler/-/node-opcua-client-crawler-2.37.0.tgz", - "integrity": "sha512-JtGvZreN8ovkU/gSvRzKcGRs7XzWZ2N90lJYd3lvIO4uMb26k2JG/nwEQoF7a9PXWB4mJNcb7wsr01vp7bfHJQ==", - "requires": { - "@types/underscore": "^1.11.0", - "async": "^3.2.0", - "node-opcua-assert": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "underscore": "^1.12.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-client-crawler/-/node-opcua-client-crawler-2.62.7.tgz", + "integrity": "sha512-ZJIZ4Qh2wERA5wRS1MDYsrLmshLY04FVhp8/cRwXWnmcsSGV2l23ANLFgBcfh+NN0SJ1rNI84GdKRfjaxSCFAA==", + "requires": { + "@types/underscore": "^1.11.4", + "async": "^3.2.2", + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "underscore": "^1.13.1" } }, "node-opcua-client-dynamic-extension-object": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-client-dynamic-extension-object/-/node-opcua-client-dynamic-extension-object-2.37.0.tgz", - "integrity": "sha512-+C03iThIMcQJ2/rtCIT9oaiphKvHoz0m0WNZxSMXyMuN1ypoOHUj9uKwvXSqOfrlxFzE/pqjURjjb1E/utW8dA==", - "requires": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-pseudo-session": "2.37.0", - "node-opcua-schemas": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-client-dynamic-extension-object/-/node-opcua-client-dynamic-extension-object-2.62.7.tgz", + "integrity": "sha512-HeScp0JbRn+Pcwo5uRkEFTBvKitcXrS2NMXxnHCSsorRYxk0UZ9UVkxYJA6TIzoHnvvExa9bOCd8gjZF5NjMyg==", + "requires": { + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-pseudo-session": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-variant": "2.62.7" }, "dependencies": { "ansi-styles": { @@ -15512,9 +16636,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15549,58 +16673,59 @@ } }, "node-opcua-client-proxy": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-client-proxy/-/node-opcua-client-proxy-2.37.0.tgz", - "integrity": "sha512-ULLPqmYsDorgnVSDrRyynO/9w0Ip12v+WdJZGIhjEiPs5j7h3WLoA/9dW6THuVr61anG2Mhy8QQvlhML3uAQGw==", - "requires": { - "async": "^3.2.0", - "node-opcua-address-space": "2.37.0", - "node-opcua-assert": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-pseudo-session": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-subscription": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-client-proxy/-/node-opcua-client-proxy-2.62.7.tgz", + "integrity": "sha512-N7e1Pz61BtfO5CMft6chjzDfTLAWY5/JT2eBLgNl1FGFeV0iqugGAVt87WbhO/ClsECZ9UN/Ts2gdbzooPIMSw==", + "requires": { + "async": "^3.2.2", + "node-opcua-address-space": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-pseudo-session": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node-opcua-common": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-common/-/node-opcua-common-2.37.0.tgz", - "integrity": "sha512-Co7qu2MTRaVitu3CNa0M6kWQ2PvbuN+1JKKSetKhazsydpDonkP3It6iW1R9JBNMmdN6ZqhIb+q0ul0PR52jZQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-common/-/node-opcua-common-2.62.7.tgz", + "integrity": "sha512-thxcDDaJ1OUu3TXagOMMWtnZcjN9Y2kMWr+EwqFeqYQBb6xl5eCQ9aqki7g529Czh0//d1UQSFOl6qENWXHmWQ==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-constants": { - "version": "2.35.0", - "resolved": "https://registry.npmjs.org/node-opcua-constants/-/node-opcua-constants-2.35.0.tgz", - "integrity": "sha512-KHHA5X9wNXE86U6Am31DrEzhoVGObbc65VWI4U4xQ7vqXCwESz2mLckGTzbGnp8d5zoCZFHv9kF2uy/f6KNzFw==" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-constants/-/node-opcua-constants-2.62.7.tgz", + "integrity": "sha512-Q1dyR7zkcLplGQRn+FSeHBHTA++WCbHc7Sm8XKMFteKMmhHCf9JBnQRhNAfyM9DiWHjpCjF7//JAkHQKwsteFQ==" }, "node-opcua-crypto": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/node-opcua-crypto/-/node-opcua-crypto-1.7.1.tgz", - "integrity": "sha512-h8qKcDKk2bQcsfZww2NxJ1yhYcl7LfBfrBgVpeAwC5w9J7aebM5zb5fuseWpifgvWD2R5CZvOnhlNOypNLkIRQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/node-opcua-crypto/-/node-opcua-crypto-1.8.0.tgz", + "integrity": "sha512-rFFsDKAJg1rxoSCXZ2JOTybyC+Aw/jLm8ksiiROX69ZZoFw9rgoA+Ohiue8fK7Dt0+FjTMBZf0gqOuFXmIbiDg==", "requires": { "better-assert": "^1.0.2", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "hexy": "^0.3.1", - "jsrsasign": "^10.1.5", + "jsrsasign": "^10.2.0", "sshpk": "^1.16.1" }, "dependencies": { @@ -15613,9 +16738,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15650,139 +16775,100 @@ } }, "node-opcua-data-access": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-data-access/-/node-opcua-data-access-2.37.0.tgz", - "integrity": "sha512-vRCtTX03fOQQtY/anoYF3yOz/muiIsqpNAybkEoDJaVp5bgSrwHbIxiHojuO4MHf0MpdZQ0p62I3meClkyGuXg==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-data-access/-/node-opcua-data-access-2.62.7.tgz", + "integrity": "sha512-IhE+gSjUf2c2fK0D83IB2lpLDmfUWkwvRWM3A7HGGHOrXBXjnJDG7yQ4vjEZ1P3XmDo5yJHX0AqsSum9i3mNbg==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-data-model": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-data-model/-/node-opcua-data-model-2.37.0.tgz", - "integrity": "sha512-6opyyRHQfhKZx3uDMQRzrNAxEQQHUq2S74wPkojudZdihekS5NpOqMjRtatMp8p2IUUP+CKtszGQmvuLTiGZig==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-data-model/-/node-opcua-data-model-2.62.7.tgz", + "integrity": "sha512-Gm672WrQMRHQqahifOddvb0m8PcIwbIc+LFW2JCHcu6cByJTysKRnaxXnEOiqPP1Dp0+dt7FWqv2fabvtWwIZQ==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7" } }, "node-opcua-data-value": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-data-value/-/node-opcua-data-value-2.37.0.tgz", - "integrity": "sha512-Lr0FqZ76ueRdH+HD2c/rVU4iz6NqSaxnOp5AaqJUr+LRXKzP3NgH5YokK/CztJQN3wcsF5mFOdgzyRmeq1+0xw==", - "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-data-value/-/node-opcua-data-value-2.62.7.tgz", + "integrity": "sha512-oY8GnTORSGzJDzahVDWpzqykJzK6o8SxDXLVrnZlEElu4up77DoPGYu46V1Cm0mGo7VG0i5j2dWQbUhldnkoMw==", + "requires": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node-opcua-date-time": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-date-time/-/node-opcua-date-time-2.37.0.tgz", - "integrity": "sha512-A894FXwAeOY5yT1mWpQcYyK4wpNjiCMpXCThBhH34l+fniQv3xw3bxnJEjb1VJTRFDYt6u28h9MM59Pqe2AMaQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-date-time/-/node-opcua-date-time-2.62.7.tgz", + "integrity": "sha512-Z6GWDG++VTg57pWcae/mEgqcGN8G3DfdxDzqU1Dw5pMn5mJtd3NiVmorqqLJq3TnKSw5CYGmZ5JU4oXY29/Y9Q==", "requires": { "browser-process-hrtime": "^1.0.0", "long": "^4.0.0", - "node-opcua-assert": "2.37.0" + "node-opcua-assert": "2.55.0" } }, "node-opcua-debug": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-debug/-/node-opcua-debug-2.37.0.tgz", - "integrity": "sha512-by80mDU0QqkE3RDh6px2j54Wul8itVu1D3g2TYw382PPl/Xg4A8C6JC1PU8md7nd26GFA7V6M0GzRkDeAvG98Q==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-debug/-/node-opcua-debug-2.62.7.tgz", + "integrity": "sha512-bJQcFXEAqZvSzgyAxUWNjINVPl105TwIYXIaN8O/C0KZJy2PAXC17pZNe338QWrYNhjjudhEVIOqmCpvvGqQwA==", "requires": { - "chalk": "^4.1.0", - "hexy": "^0.3.1", - "node-opcua-assert": "2.37.0", - "node-opcua-buffer-utils": "2.37.0" + "hexy": "0.3.2", + "node-opcua-assert": "2.55.0", + "node-opcua-buffer-utils": "2.62.7" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } + "hexy": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.3.2.tgz", + "integrity": "sha512-0LwOkUcdzIX58YzjuyXGu9kdG+reRcOJqPBeRH8i1Fy/kxEZkw9RvFs/Smc5Dw/401dDIWBoNMeriJPv4BNygg==" } } }, "node-opcua-enum": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-enum/-/node-opcua-enum-2.37.0.tgz", - "integrity": "sha512-69wsO8/uM1EYKB7FTcAHN0pxvaEzBvW/iXeA1w+H/JGz2NpAMWA62OcxUzuG+5ExfskfCfM/MkGqOFjtBr+4fw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-enum/-/node-opcua-enum-2.62.7.tgz", + "integrity": "sha512-1VHCrQ22d8reb0Hu+GOfj7Hlvj0xhtomKjuEAXFLkLkZq7rfFs93snGrGeDhxFaabX+ND7i3H1Dm6M39+DH7iA==", "requires": { - "node-opcua-assert": "2.37.0" + "node-opcua-assert": "2.55.0" } }, "node-opcua-extension-object": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-extension-object/-/node-opcua-extension-object-2.37.0.tgz", - "integrity": "sha512-fM6c3/n0qBASyQHHE65k8epUtm05mFMFOkMI9IOqaU9XE+NP8qFvRQUseh2mMyGZm9l23ds180dlhbAB87QeKQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-extension-object/-/node-opcua-extension-object-2.62.7.tgz", + "integrity": "sha512-g59t2JsP0vtog7KrdT5QRU/78lSVbkP1WR4OAOy1rcsavJMzdlL9Fc8umcAl7xemaeHhnu/C47IAO4WmJsF0WA==", "requires": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0" + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7" }, "dependencies": { "ansi-styles": { @@ -15794,9 +16880,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15831,20 +16917,20 @@ } }, "node-opcua-factory": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-factory/-/node-opcua-factory-2.37.0.tgz", - "integrity": "sha512-i5kfuswj4bsy2YiDDkv8F1Qi7yYx0J6pzpPqyLPEeQ18xpxQHTxp5lkCyo+qyrizIuO2w3l1E5rhdm5UDcZQvA==", - "requires": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-guid": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-factory/-/node-opcua-factory-2.62.7.tgz", + "integrity": "sha512-xSVD4+/qkrK/M+OI2sCaSCe3N7f7ecerjrG519T9Yp1wm+5ArZJKtugukNQgTe8GWMmz4yuuGlTmNA06lxrlYQ==", + "requires": { + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-guid": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7" }, "dependencies": { "ansi-styles": { @@ -15856,9 +16942,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15893,29 +16979,29 @@ } }, "node-opcua-generator": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-generator/-/node-opcua-generator-2.37.0.tgz", - "integrity": "sha512-xiHgZd/Xi5hZ8Ce+W5LE45+pRzjUfN/gKkDDPRCJf5OPYJvTHrN6yXOs+x9fyeM0/9MdayFSeS0gAUNooOISVw==", - "requires": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-guid": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-schemas": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "node-opcua-xml2json": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-generator/-/node-opcua-generator-2.62.7.tgz", + "integrity": "sha512-dQQPWGUdRJ/pqVemlooFFxVRM76CA3cCJ6uLflGsFDBYfwUzH0Lnt4oUJtqwzF9yGTxJX89ZX4iy5QcGiM4q5Q==", + "requires": { + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-guid": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "node-opcua-xml2json": "2.62.7" }, "dependencies": { "ansi-styles": { @@ -15927,9 +17013,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15964,33 +17050,33 @@ } }, "node-opcua-guid": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-guid/-/node-opcua-guid-2.37.0.tgz", - "integrity": "sha512-MiD8QM+uEQvDCHg985tRO0QFW0WVtvdkSHyodCcVf1K3BI0d0zFoR78nwtbjrqXK8GHG3TUcSlDl3B/fzki/Bg==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-guid/-/node-opcua-guid-2.62.7.tgz", + "integrity": "sha512-yZmKadHTH6dAt6WfQvouKmTzpvaCWsVrtoyquYvi/Rx+a0HeehQpZyBzrQgeB2Ra3Rrtt1yhU9Gf0fBOs84qTg==", "requires": { - "node-opcua-assert": "2.37.0" + "node-opcua-assert": "2.55.0" } }, "node-opcua-hostname": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-hostname/-/node-opcua-hostname-2.37.0.tgz", - "integrity": "sha512-d2nBSuUXwwBXxQO8z3OXuAPWAn9LzzEjT9gzgvvixHJo/qEFZMIKDlGfpuhZYS9RlWRKeYuvDImmFz0N5vtU5A==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-hostname/-/node-opcua-hostname-2.62.7.tgz", + "integrity": "sha512-YvFHJbIdfCwRzKBrtWNdFy22fZ+xFqURznoMoLYTbZW9NchbpWrj2js/O0Obc2TdB0LN6v8qbWs64OwE3BmVTQ==", "requires": { - "node-opcua-assert": "2.37.0" + "node-opcua-assert": "2.55.0" } }, "node-opcua-nodeid": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-nodeid/-/node-opcua-nodeid-2.37.0.tgz", - "integrity": "sha512-ty3YAIx12jM88cD7aGYDv8Bo8zXweFv9AYfoILMymtJwjW+xx+xV83ghROX2ytyDxTHMr1iQpGPQCdNkaNWPWQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-nodeid/-/node-opcua-nodeid-2.62.7.tgz", + "integrity": "sha512-A/6sl+dCMlZyp5CNp2vhsViPvW433Y3y9YM7kbOYhjytTOJAZ7NKyf5d2csCHAzI4XQF3ioIhYpCBeTiIlumNQ==", "requires": { - "@types/lodash": "4.14.168", - "chalk": "^4.1.0", + "@types/lodash": "4.14.177", + "chalk": "4.1.2", "lodash": "4.17.21", - "node-opcua-assert": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-enum": "2.37.0", - "node-opcua-guid": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-guid": "2.62.7" }, "dependencies": { "ansi-styles": { @@ -16002,9 +17088,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16038,44 +17124,60 @@ } } }, + "node-opcua-nodeset-ua": { + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-nodeset-ua/-/node-opcua-nodeset-ua-2.62.7.tgz", + "integrity": "sha512-Jm9euPV168CSUpDYFHYyhDex7Qy1IFgHIYaYBrjsBKENmQ+Zt/5ZycRbkH9ethsroKEEEGetqxEsLdn9KVHwiw==", + "requires": { + "node-opcua-address-space-base": "2.62.7", + "node-opcua-basic-types": "2.62.7", + "node-opcua-data-access": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-variant": "2.62.7" + } + }, "node-opcua-nodesets": { - "version": "2.36.0", - "resolved": "https://registry.npmjs.org/node-opcua-nodesets/-/node-opcua-nodesets-2.36.0.tgz", - "integrity": "sha512-nvtX9yRsvrhX3s+LwxGx0uw52vo3JAiLIpvYVOw4i/ybhW4Qh83xytQX1nCMjRgYta04Y4moRhTri+75hyOLoQ==" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-nodesets/-/node-opcua-nodesets-2.62.7.tgz", + "integrity": "sha512-xavVU28d/3+CrLXFudxPvVdqeMwDfsM7FQ0bGSFJLbRWJf31udjkGQktQ46S0YMHhLeO2BwuvLFmmpzCb1KCCQ==" }, "node-opcua-numeric-range": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-numeric-range/-/node-opcua-numeric-range-2.37.0.tgz", - "integrity": "sha512-dROLumzbHotyfXYVy+cFqQ4t+/AZGVT79QmsUGCWrJg8kPl52yTl8BpzqoY1DXjzppTTRXW2/kWgBzvfo4779g==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-numeric-range/-/node-opcua-numeric-range-2.62.7.tgz", + "integrity": "sha512-RPasCWNSMP61sY+PkLila5fYjwtRpi1Dj0O8Lx2Hzca+upkBtGTGTAkeIGhRmzQJX3qqgDV4zNmGLkmZGVzCCw==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-status-code": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-status-code": "2.62.7" } }, "node-opcua-object-registry": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-object-registry/-/node-opcua-object-registry-2.37.0.tgz", - "integrity": "sha512-gKPwVFjWRlEKjjv6p75lzYw7qlWeHr6m8ZtOgUlW5OrWKrEo/tMxyXxC4dB7856MSbYdKytDlEscU2C7+1+6Rw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-object-registry/-/node-opcua-object-registry-2.62.7.tgz", + "integrity": "sha512-UNRMtWDZcibAl2NTUzsNItPiNy0vWlyq4o9uzdkjez8f9s5Jr5gGKvI9WJW2Wx9kyq5Tn0ARzwCTCUyg/60gMw==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-debug": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-debug": "2.62.7" } }, "node-opcua-packet-analyzer": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-packet-analyzer/-/node-opcua-packet-analyzer-2.37.0.tgz", - "integrity": "sha512-6RluDHwtVNKX8PkBhRHYXxyZbeX77E7Vqtfh6xytCq6WJvuyHtDCwi9ZqVzyeao4/Fz/PtQwUPFDiGJRj7tOxw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-packet-analyzer/-/node-opcua-packet-analyzer-2.62.7.tgz", + "integrity": "sha512-vlOGR9xbPRbl0NCZMACYEYsh7d5KPJPei6tiNTYHUUJFWWps0Vxq5u8s3ntwuZWC2LnE76W1QBAARUGxbwgsiA==", "requires": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-utils": "2.37.0" + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-utils": "2.62.7" }, "dependencies": { "ansi-styles": { @@ -16087,9 +17189,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16124,35 +17226,29 @@ } }, "node-opcua-packet-assembler": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-packet-assembler/-/node-opcua-packet-assembler-2.37.0.tgz", - "integrity": "sha512-imBhYmIqraLvJwGoTPlZS3tX2izpY1EhWgFncFer0l1bHiFPkM1rmsdljzrFvESHoEAWd8hYVmeopvR+tv2mfw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-packet-assembler/-/node-opcua-packet-assembler-2.62.7.tgz", + "integrity": "sha512-vZTDsvsL8NhaVJ9JWj7tYRNgNCn3aFuvydw+MXzB7dJ6kFCL6cAxyCOJLWR1StMxk4zST9P7/7JwvS49iFvNUw==", "requires": { - "node-opcua-assert": "2.37.0" + "node-opcua-assert": "2.55.0" } }, "node-opcua-pki": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/node-opcua-pki/-/node-opcua-pki-2.9.7.tgz", - "integrity": "sha512-XuhwQaLeoQ8dNrBiZMR5vRvQ4JfwqUUDp/8oPfWAG9XJb6TWNrIKVMYZFAieyqWByEIFO7adJwVlhiosPjc9bQ==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/node-opcua-pki/-/node-opcua-pki-2.13.0.tgz", + "integrity": "sha512-qi0x36RaGG246Le0XrKbq51IU12d6oBeEqABwVV9ivoWvEa8tvedurc2eblpIZvjErFxKb9g4L3gQa0zOBIuyA==", "requires": { - "@ster5/global-mutex": "^1.1.1", - "async": "^3.2.0", - "better-assert": "^1.0.2", + "@ster5/global-mutex": "^1.2.0", "byline": "^5.0.0", - "chalk": "^4.1.0", - "chokidar": "^3.5.1", - "cli-spinner": "^0.2.10", - "cli-table": "^0.3.6", - "del": "6.0.0", - "node-opcua-crypto": "^1.7.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "cli-table": "^0.3.9", + "node-opcua-crypto": "^1.8.0", "progress": "^2.0.3", - "rimraf": "^3.0.2", "thenify": "^3.3.1", "update-notifier": "5.1.0", - "walk": "^2.3.14", "wget-improved": "^3.2.1", - "yargs": "16.2.0", + "yargs": "17.2.1", "yauzl": "^2.10.0" }, "dependencies": { @@ -16165,9 +17261,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16191,14 +17287,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -16206,75 +17294,90 @@ "requires": { "has-flag": "^4.0.0" } + }, + "yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } } } }, "node-opcua-pseudo-session": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-pseudo-session/-/node-opcua-pseudo-session-2.37.0.tgz", - "integrity": "sha512-YIqVZtkMPIgE/ipRHCEkfjbzWfQKS+IOQQWj7khALcQsbohOELYLMysRUeLi6I0NjHjM8bc0J8a2q8evu+3ykg==", - "requires": { - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-pseudo-session/-/node-opcua-pseudo-session-2.62.7.tgz", + "integrity": "sha512-8RrWZ8BHzFlb+vstQ7Umcl4wQjEIEX8WTnFhs2pUnL6hfs5aQlDHK2sQ5QyiQk/yjG6nQ+glNQDwiD4ICgSI2w==", + "requires": { + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node-opcua-schemas": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-schemas/-/node-opcua-schemas-2.37.0.tgz", - "integrity": "sha512-zmLV3hl0lFAkeG3L6xsell3z0J1VKJlZdikAH5vxPwWeYj9w4Z4OeTXzUQg8XYOk/ki0w9yWMD+eVUV/kWqUqg==", - "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "node-opcua-xml2json": "2.37.0", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-schemas/-/node-opcua-schemas-2.62.7.tgz", + "integrity": "sha512-e7++0kZxmik66abDAtFNVeOytSVU/X0WZs3JuyXi71OVFbX41t/6f1BvL3/DqIV8tyG1yhCZmdV33VXprxtb7g==", + "requires": { + "node-opcua-assert": "2.55.0", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7", + "node-opcua-xml2json": "2.62.7", "thenify": "^3.3.1" } }, "node-opcua-secure-channel": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-secure-channel/-/node-opcua-secure-channel-2.37.0.tgz", - "integrity": "sha512-69x/VIkryPVlOVTe53vH41RXbRm0+mVvXuyfzKkpQEXqc1+xfIbT/KerHIVTq0mzTY/KdtLmTEZaGRvDxKja3w==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-secure-channel/-/node-opcua-secure-channel-2.62.7.tgz", + "integrity": "sha512-Khekl83gWsLfpY/l9duXqABgbE0ABeXutHM6KmeH/DvMiRmWMqtnh6plzhSIXjDbdHc+DzopuKjGgqVm+rDzxg==", "requires": { - "@types/underscore": "^1.11.0", - "async": "^3.2.0", + "@types/underscore": "1.11.4", + "async": "^3.2.2", "backoff": "^2.5.0", - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-certificate-manager": "2.37.0", - "node-opcua-chunkmanager": "2.37.0", - "node-opcua-common": "2.37.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-packet-analyzer": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-transport": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "underscore": "^1.12.0" + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-certificate-manager": "2.62.7", + "node-opcua-chunkmanager": "2.62.7", + "node-opcua-common": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-packet-analyzer": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-transport": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7" }, "dependencies": { "ansi-styles": { @@ -16286,9 +17389,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16323,360 +17426,363 @@ } }, "node-opcua-server": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-server/-/node-opcua-server-2.37.0.tgz", - "integrity": "sha512-uoV6qTpb5tD9glZ2w8uYq+JqiyjBCPzNJvZfHbpJKsc9etDtlbKk5WVRrZqZDUbd5wM8Kr/f5OYCNA9IL6T+1Q==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-server/-/node-opcua-server-2.62.7.tgz", + "integrity": "sha512-uKQgyuCYyucnetV1env4YT7O8kVIdZFS9mN5C9d8lx/U+3LXkPL/YFIksSGDYOf2vaNL3L8GEuhYUhNeWfl18w==", "requires": { - "@types/underscore": "^1.11.0", - "async": "^3.2.0", + "@ster5/global-mutex": "^1.2.0", + "@types/underscore": "^1.11.4", + "async": "^3.2.2", "bonjour": "^3.5.0", "browser-process-hrtime": "^1.0.0", "dequeue": "^1.0.5", - "node-opcua-address-space": "2.37.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-certificate-manager": "2.37.0", - "node-opcua-client": "2.37.0", - "node-opcua-client-dynamic-extension-object": "2.37.0", - "node-opcua-common": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-crypto": "^1.7.1", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-hostname": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-nodesets": "2.36.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-pki": "^2.8.0", - "node-opcua-secure-channel": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-call": "2.37.0", - "node-opcua-service-discovery": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-history": "2.37.0", - "node-opcua-service-node-management": "2.37.0", - "node-opcua-service-query": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-register-node": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-service-session": "2.37.0", - "node-opcua-service-subscription": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-service-write": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0", - "underscore": "^1.12.0" + "lodash": "4.17.21", + "node-opcua-address-space": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-certificate-manager": "2.62.7", + "node-opcua-client": "2.62.7", + "node-opcua-client-dynamic-extension-object": "2.62.7", + "node-opcua-common": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-crypto": "^1.7.5", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-hostname": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-nodesets": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pki": "^2.13.0", + "node-opcua-secure-channel": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-call": "2.62.7", + "node-opcua-service-discovery": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-history": "2.62.7", + "node-opcua-service-node-management": "2.62.7", + "node-opcua-service-query": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-register-node": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-service-session": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-service-write": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node-opcua-server-discovery": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-server-discovery/-/node-opcua-server-discovery-2.37.0.tgz", - "integrity": "sha512-wQ1l1rAkaxvOsXvLmz2V/zX/WOi5e2yr6+g01xsTvufWToMivyvi89mBjS2Knw63yMNak1+9blBKgsNxMj4OQA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-server-discovery/-/node-opcua-server-discovery-2.62.7.tgz", + "integrity": "sha512-4CqLCs38VdkC3fdhAOT/U6f8hxePMH3hdYrzKbo4ZUgk5IzEdZ2GT1InLUqNiEskYESgZkjK8esKjlKRGXcANg==", "requires": { - "@types/bonjour": "^3.5.8", + "@types/bonjour": "^3.5.9", "bonjour": "^3.5.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-certificate-manager": "2.37.0", - "node-opcua-common": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-hostname": "2.37.0", - "node-opcua-pki": "^2.8.0", - "node-opcua-secure-channel": "2.37.0", - "node-opcua-server": "2.37.0", - "node-opcua-service-discovery": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-status-code": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-certificate-manager": "2.62.7", + "node-opcua-common": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-hostname": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-pki": "^2.13.0", + "node-opcua-secure-channel": "2.62.7", + "node-opcua-server": "2.62.7", + "node-opcua-service-discovery": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-status-code": "2.62.7" } }, "node-opcua-service-browse": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-browse/-/node-opcua-service-browse-2.37.0.tgz", - "integrity": "sha512-3ajWl19iBv+XZoShx+6kljvO5DiGXXHDIWulkEi7VfuIVhvyIUSMAyh58oc3JFPz2Nj7mkul7ksxRVdsnvJLOA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-browse/-/node-opcua-service-browse-2.62.7.tgz", + "integrity": "sha512-gjQu9QgeYoLu3+FiJJf47jPzRVKPVrnUKc5qBl5FA/wBKDmpXEZsTU/WPMjpSyXmmyzOrSRwDVgJlbMi4XmVXg==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-service-call": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-call/-/node-opcua-service-call-2.37.0.tgz", - "integrity": "sha512-NSYWZZGvndJltDlrcPXjvI0N24hGsWwreU7RAViPzxl4v03tsIuK0FN7ntn6yLZz68QUrXl24Ij1Tc20Sqg8OQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-call/-/node-opcua-service-call-2.62.7.tgz", + "integrity": "sha512-74BMD82oClSn6Z65hTbeh4gCBJ+GQQfaiF/q/SRqbfj9kqyUhHdzzXuPI66BWAQ2c3p5ncXebGHRiC6T/qHn0w==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-variant": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node-opcua-service-discovery": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-discovery/-/node-opcua-service-discovery-2.37.0.tgz", - "integrity": "sha512-L5FUml1dhLuz8JNCZqe43Oz8ut7Plh84Nnq5PUo2W2/myX/H+zfst6+QP4Rx1uG4LZufoI5Xst0haAtYHfwC9Q==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-discovery/-/node-opcua-service-discovery-2.62.7.tgz", + "integrity": "sha512-C/LGd4exlpNZmz3pH4NrHlx3ltTXPJnqO0dJ46Z0OfWtd77fxNleASTqq86MVlMH3JeknuPFrzJDvFJ2refe7A==", "requires": { - "@types/bonjour": "^3.5.8", + "@types/bonjour": "^3.5.9", "bonjour": "^3.5.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-service-endpoints": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-endpoints/-/node-opcua-service-endpoints-2.37.0.tgz", - "integrity": "sha512-Tcq+met6Izzzx61ugIkHI+2HPJ/8lBcmUWcZzq5x49bOwP3dKsfbOmGBDtPWItipFzpnK+zLqHTSNesS8t8tWg==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-endpoints/-/node-opcua-service-endpoints-2.62.7.tgz", + "integrity": "sha512-HrS9MezxmSPTKRWILdo3CtF56fp9k1lycGFy9iy0ztn5bp2rkoSC9uQqCLWYQd+htnZuprtkTkTaP0GfGfDJmg==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-service-filter": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-filter/-/node-opcua-service-filter-2.37.0.tgz", - "integrity": "sha512-IJA/nPj7T7R9Xa+EWT6XjrA1VA0mloB4jGXYl+u0OrBQTbUdWsFf1XSDf9Cqtnqc0yTfRROzfjoFNrx0/aB72g==", - "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-filter/-/node-opcua-service-filter-2.62.7.tgz", + "integrity": "sha512-ZWH0wQxd4uayIlC63f+otvrVZieqQz/2ekq3wJrx99qxSf8pzuwcBT9BmMg3dASXqmSlE7qXe7BjNzfri229pA==", + "requires": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node-opcua-service-history": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-history/-/node-opcua-service-history-2.37.0.tgz", - "integrity": "sha512-XqyQVI2K44AclAhMM4305ucmjx+7LrOv64u6Txgd5+ahSUmU/xzHcWpoSn7x5m5TcB9XshkJ73SN9qWZe8wULg==", - "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-history/-/node-opcua-service-history-2.62.7.tgz", + "integrity": "sha512-UpJm/k91mXcDzVXetkU5fIQttvk+HN0giahFR16jmzFKVMG9VMhleFEImkOJQ8C+LQKtEDUdpJpAqKOJN1ycEA==", + "requires": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-service-node-management": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-node-management/-/node-opcua-service-node-management-2.37.0.tgz", - "integrity": "sha512-iq/BXlrqZfdoxH5AaY2kO77RNjNrv+6yfaDifjpe4FFhVy7w+Lwse4C558IyqcDqFex+6XwpyHOp/LvB64Sd1Q==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-node-management/-/node-opcua-service-node-management-2.62.7.tgz", + "integrity": "sha512-0Wk5PxYwlzgJiixQ5z2rk9QKrDzVzvnP1hzUgmcvgo3iAbWsbdPBdt/O6gYkB+8yukexF/RzJHjsz7Vfkval5g==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-service-query": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-query/-/node-opcua-service-query-2.37.0.tgz", - "integrity": "sha512-VmoChFCBp7SRyRQuDqOuwF1WmWU87kWSEIog+xVE/BraIupuGJ9Ih8akK0LqOiL3pYheIvm62dt83Rdqb140nA==", - "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-service-browse": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-service-subscription": "2.37.0", - "node-opcua-service-translate-browse-path": "2.37.0", - "node-opcua-types": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-query/-/node-opcua-service-query-2.62.7.tgz", + "integrity": "sha512-8qCXFUsClQJw9jPDS4wkfIiQij9wC5eLcLiSLLmiY7Sbgc8E7SFIRU2Ud3EtbCCXkA3iyrEU2OX2ovscM7hrVA==", + "requires": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-service-browse": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-service-subscription": "2.62.7", + "node-opcua-service-translate-browse-path": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-service-read": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-read/-/node-opcua-service-read-2.37.0.tgz", - "integrity": "sha512-xinGpzZrO8x6Myfvyvzq+TZH3EWwNY77TRjqh7MApB7LfkgHVzPHxY5+0fHWhH8GzB7lD06R5RhxAt1ry0XS+w==", - "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-read/-/node-opcua-service-read-2.62.7.tgz", + "integrity": "sha512-V1RxpRUPlMxz27LDaiJfpoLEPyQcFXeoE+PoZ7LZq9Fg8V0TyYUfFTYLASFWc3XiH5Te0l80qxMJcZS6n8bPtg==", + "requires": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-service-register-node": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-register-node/-/node-opcua-service-register-node-2.37.0.tgz", - "integrity": "sha512-d10HNx2hMKiURpKgM+0xdyuJwkQlj1amucue1YCIC29sIN98gBo2JnvubMWZrP0lTdSRC/9rNB6PMtumHxvXgA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-register-node/-/node-opcua-service-register-node-2.62.7.tgz", + "integrity": "sha512-SDW687t/R1R3Su+t+F81ODjEBsY7MR39p/oRA7LvDxSSWP79UGYEasU7hXnIwF/6sqWunoF/vEXASUOCPqB8XA==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-service-secure-channel": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-secure-channel/-/node-opcua-service-secure-channel-2.37.0.tgz", - "integrity": "sha512-b/c43TIeQXUss6FQQQpuyW+3TLgK+Rjw6QR7XwdBjlQkc4ew0ZP7lwh6vhRs2oK5hT/X1C2SWj8rVd/GMDAMkA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-secure-channel/-/node-opcua-service-secure-channel-2.62.7.tgz", + "integrity": "sha512-lQ4xVGnp0cHwkFBv6MOJ1Defe+5s+3gpuBQ0viHirYp7kVpoa2ckUFKKO8nNwf5zYa3wIrOwwhg+yPtJFNau1Q==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-service-session": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-session/-/node-opcua-service-session-2.37.0.tgz", - "integrity": "sha512-uVO4qPNR5R6wbSAQq/ge6usONZ85D9iP7Wg9GgMIpn+a+QygQStnU33qmzcsXzD0SA2ZGqmjKklbd47oorM3oA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-session/-/node-opcua-service-session-2.62.7.tgz", + "integrity": "sha512-+Vgp8vjY8YpQpadrJFrPjymz3YM/2TXTkVtZdT2MpSAbWvPOZ0dli9EYQA+zSzszAreYSrEdJadI2YQEA26BYA==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-endpoints": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-endpoints": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-service-subscription": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-subscription/-/node-opcua-service-subscription-2.37.0.tgz", - "integrity": "sha512-uM5qY4D/2Md8qZpy0l4os7RhuH7b4Yjv1pJx7Z3yBJ5fEI5Lqb23OAKDB5DmVuFrb1+miSs7augj8LaZF5Ztjw==", - "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-filter": "2.37.0", - "node-opcua-service-read": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-subscription/-/node-opcua-service-subscription-2.62.7.tgz", + "integrity": "sha512-FqprG7eYFb8UyYNS1gLZVTuRaQ87xvXvKmYlYOkrzyLnk+2k988VCyBAsjiEVhNKrIwLR5UFVYJxxSeHvMymPw==", + "requires": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-filter": "2.62.7", + "node-opcua-service-read": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node-opcua-service-translate-browse-path": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-translate-browse-path/-/node-opcua-service-translate-browse-path-2.37.0.tgz", - "integrity": "sha512-0eSPU9vOIVSt2+KgWnhi2lH6EnWUQSguovbnozHtf3IAsRuk4xbqMCWRw9ejldlDE9AtCBl1f4+RzNQOyac59A==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-translate-browse-path/-/node-opcua-service-translate-browse-path-2.62.7.tgz", + "integrity": "sha512-TvfaGUdckMJpWVzNJzF0oWbqh6GNijoYijSaqMSxWwn7MEczRdlBoM0Qb3tmzemWvn9sbiRDLFuAo6N47WYUwA==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-constants": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-service-write": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-service-write/-/node-opcua-service-write-2.37.0.tgz", - "integrity": "sha512-2M/+MQ/zxiDiXPkwIzVxtRq1dv19p3ddM/Y6TXYLjVHM7BdGd8LTkvp6tzOgs/Sgu3Pa7hqqDZVBUpWTayLHtw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-service-write/-/node-opcua-service-write-2.62.7.tgz", + "integrity": "sha512-c8q/E9sx7HzRZNrOHROrRXR3Gqbw0TrHfELxDWK+jcczMFjNrp6XEouPIX4HXbfrnDJXNeN82Mux84AShAF9Vw==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-service-secure-channel": "2.37.0", - "node-opcua-types": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-service-secure-channel": "2.62.7", + "node-opcua-types": "2.62.7" } }, "node-opcua-status-code": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-status-code/-/node-opcua-status-code-2.37.0.tgz", - "integrity": "sha512-4kgDibcWmoUzo1seiuZMjfgAHZNyEYuiCnFdLdaGjV8s+FVx66jPm6iNSs1HfhKZ/SQFRdUH8NaM8QrafaaROQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-status-code/-/node-opcua-status-code-2.62.7.tgz", + "integrity": "sha512-lJdQtEp7hqI7T7ZPZiOekxvvbe+84ZGN8zS9n5vgvnU5EyXYl+TIACqsuW6hVXiS9Z76zXlKb7y+s0BOaX3scA==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-constants": "2.35.0" + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7" } }, "node-opcua-transport": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-transport/-/node-opcua-transport-2.37.0.tgz", - "integrity": "sha512-IjVq7VbkA9gto6Q5CtGx0gWXSrJCSSnSwcEEvAYaIogYoYO2bvKWkgWtllfkv7b+Yb6YM/ESMt3Uq9nw8pOGUg==", - "requires": { - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-chunkmanager": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-object-registry": "2.37.0", - "node-opcua-packet-assembler": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-types": "2.37.0", - "node-opcua-utils": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-transport/-/node-opcua-transport-2.62.7.tgz", + "integrity": "sha512-6ez6ags7w/GRyEG5Pug4vTpuYBSyFhBezRN0Q0Ni8ZRyG/JZqNgPpumrK7ztS4AF9LeyNwodzIDSXaD2iDY85w==", + "requires": { + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-chunkmanager": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-object-registry": "2.62.7", + "node-opcua-packet-assembler": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-types": "2.62.7", + "node-opcua-utils": "2.62.7" }, "dependencies": { "ansi-styles": { @@ -16688,9 +17794,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16725,40 +17831,40 @@ } }, "node-opcua-types": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-types/-/node-opcua-types-2.37.0.tgz", - "integrity": "sha512-vsUMG9MgpxwMzTCKCWGgd+zVEh3Z8J4JCFyqh3lu4lqbkXKDayIcJRcikH62/fjIq1ZLgmepeFNXiFuIxYDnFA==", - "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-binary-stream": "2.37.0", - "node-opcua-buffer-utils": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-data-value": "2.37.0", - "node-opcua-date-time": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-generator": "2.37.0", - "node-opcua-guid": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-numeric-range": "2.37.0", - "node-opcua-packet-analyzer": "2.37.0", - "node-opcua-schemas": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-utils": "2.37.0", - "node-opcua-variant": "2.37.0" + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-types/-/node-opcua-types-2.62.7.tgz", + "integrity": "sha512-+4zputt7EYPlOwuaoK3R2Kftk3mUxgTUYCzbPeFKrXfGSx1D/R57+ZY1XyAhjXj52NfCTKDwWoiT/LrjBtC9hw==", + "requires": { + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-binary-stream": "2.62.7", + "node-opcua-buffer-utils": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-data-value": "2.62.7", + "node-opcua-date-time": "2.62.7", + "node-opcua-debug": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-generator": "2.62.7", + "node-opcua-guid": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-numeric-range": "2.62.7", + "node-opcua-packet-analyzer": "2.62.7", + "node-opcua-schemas": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-utils": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node-opcua-utils": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-utils/-/node-opcua-utils-2.37.0.tgz", - "integrity": "sha512-S80y/PgvL/V3K2u8eyF8vUuf8ZoLleBLBQ5PNseE/CuKqcr6sckVaP70O4jM+fWub3zR7I85595qKibZTKhhKw==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-utils/-/node-opcua-utils-2.62.7.tgz", + "integrity": "sha512-DWJbvo19n6ynLZpFAdDU2Ucw4Y7upnkvX59vWAtWbUWemv9ZMCoDi+aCWvfVTVWyqdPPM23OaljF0MmfjtSzwQ==", "requires": { "browser-process-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "node-opcua-assert": "2.37.0" + "chalk": "4.1.2", + "node-opcua-assert": "2.55.0" }, "dependencies": { "ansi-styles": { @@ -16770,9 +17876,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16807,44 +17913,44 @@ } }, "node-opcua-variant": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-variant/-/node-opcua-variant-2.37.0.tgz", - "integrity": "sha512-cWidURJtzDLU7fx6z/VeXcBP1SxW/uUwatxjLfB1ExsHFUtEIP1OqmEbcGRXZkQlp0oCK9IhnOCVetDvJT1dJQ==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-variant/-/node-opcua-variant-2.62.7.tgz", + "integrity": "sha512-rOe3gOH8wOEG3wl8BQMc5U+6Agk4JEVzXRUu7i7I2eBzEgDFvTxy9PrqvmojDyuPBMmCnTf+G9Ix6GtZ9sp/rw==", "requires": { - "node-opcua-assert": "2.37.0", - "node-opcua-basic-types": "2.37.0", - "node-opcua-data-model": "2.37.0", - "node-opcua-enum": "2.37.0", - "node-opcua-extension-object": "2.37.0", - "node-opcua-factory": "2.37.0", - "node-opcua-nodeid": "2.37.0", - "node-opcua-utils": "2.37.0" + "node-opcua-assert": "2.55.0", + "node-opcua-basic-types": "2.62.7", + "node-opcua-data-model": "2.62.7", + "node-opcua-enum": "2.62.7", + "node-opcua-extension-object": "2.62.7", + "node-opcua-factory": "2.62.7", + "node-opcua-nodeid": "2.62.7", + "node-opcua-utils": "2.62.7" } }, "node-opcua-vendor-diagnostic": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-vendor-diagnostic/-/node-opcua-vendor-diagnostic-2.37.0.tgz", - "integrity": "sha512-g7yiPp3NfujNeoSWgGiZwotibsMQlPSBNkyjMETJbWQE8mVljc3CY+cX4ACraidltBfJH7m12/IztcCbbwWlTA==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-vendor-diagnostic/-/node-opcua-vendor-diagnostic-2.62.7.tgz", + "integrity": "sha512-EIcFCjoT0CTFB5NqnTDlXrA/ayUGv8fvPgdt/pkub1ZDeqnj3R5B449SfgIuiq5tmGO7WyhXTnx6TckhiuYFwg==", "requires": { "humanize": "0.0.9", - "node-opcua-address-space": "2.37.0", - "node-opcua-assert": "2.37.0", - "node-opcua-constants": "2.35.0", - "node-opcua-server": "2.37.0", - "node-opcua-status-code": "2.37.0", - "node-opcua-variant": "2.37.0" + "node-opcua-address-space": "2.62.7", + "node-opcua-assert": "2.55.0", + "node-opcua-constants": "2.62.7", + "node-opcua-server": "2.62.7", + "node-opcua-status-code": "2.62.7", + "node-opcua-variant": "2.62.7" } }, "node-opcua-xml2json": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/node-opcua-xml2json/-/node-opcua-xml2json-2.37.0.tgz", - "integrity": "sha512-IWDP2mmJhflK5PNrtSAhg64Bvu24CxuEhDM+UKztQpcyxN9al2NM4r5WB2Q2EjDxjvCMeGBe5FzE0IZv4xLe0w==", + "version": "2.62.7", + "resolved": "https://registry.npmjs.org/node-opcua-xml2json/-/node-opcua-xml2json-2.62.7.tgz", + "integrity": "sha512-SmndD3Shi+xxM1nEl7EapaojrgzI7hDMGzXEPDINP2ObsqYLSSp8v6r9hryy0j1dDn2H72NuBIEpEiNqWny4xw==", "requires": { "bomstrip": "^0.1.4", - "ltx": "^2.10.0", - "node-opcua-assert": "2.37.0", - "node-opcua-debug": "2.37.0", - "node-opcua-utils": "2.37.0", + "ltx": "^3.0.0", + "node-opcua-assert": "2.55.0", + "node-opcua-debug": "2.62.7", + "node-opcua-utils": "2.62.7", "xml-writer": "^1.7.0" } }, @@ -16855,98 +17961,37 @@ }, "node-preload": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, - "nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", - "dev": true, - "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "nodemon": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" + }, + "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -16956,75 +18001,11 @@ "ms": "^2.1.1" } }, - "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "requires": { - "ini": "1.3.7" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - } - }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dev": true, - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - } } } }, @@ -17047,12 +18028,13 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, - "nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, "requires": { - "boolbase": "^1.0.0" + "path-key": "^3.0.0" } }, "nyc": { @@ -17090,12 +18072,6 @@ "yargs": "^15.0.2" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -17168,39 +18144,12 @@ "p-limit": "^2.2.0" } }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -17303,25 +18252,19 @@ } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -17346,9 +18289,10 @@ } }, "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, "requires": { "aggregate-error": "^3.0.0" } @@ -17412,18 +18356,19 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-to-regexp": { @@ -17434,7 +18379,8 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true }, "pathval": { "version": "1.1.1", @@ -17447,28 +18393,39 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pino": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.12.0.tgz", - "integrity": "sha512-5NGopOcUusGuklGHVVv9az0Hv/Dj3urHhD3G+zhl5pBGIRYAeGCi/Ej6YCl16Q2ko28cmYiJz+/qRoJiwy62Rw==", + "version": "6.13.4", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.13.4.tgz", + "integrity": "sha512-g4tHSISmQJYUEKEMVdaZ+ZokWwFnTwZL5JPn+lnBVZ1BuBbrSchrXwQINknkM5+Q4fF6U9NjiI8PWwwMDHt9zA==", "requires": { "fast-redact": "^3.0.0", "fast-safe-stringify": "^2.0.8", "flatstr": "^1.0.12", "pino-std-serializers": "^3.1.0", + "process-warning": "^1.0.0", "quick-format-unescaped": "^4.0.3", "sonic-boom": "^1.0.2" }, "dependencies": { - "fast-safe-stringify": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz", - "integrity": "sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==" + "sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "requires": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } } } }, @@ -17500,9 +18457,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17526,6 +18483,24 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -17590,12 +18565,12 @@ } }, "plur": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", - "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", "dev": true, "requires": { - "irregular-plurals": "^2.0.0" + "irregular-plurals": "^3.2.0" } }, "precond": { @@ -17604,9 +18579,9 @@ "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prepend-http": { @@ -17614,14 +18589,11 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, - "pretty-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.3.tgz", - "integrity": "sha512-nFB0BMeWNJA4YfmrgqPhOH3UQjMQZASZ2ueBfmlyqpVy9+ExLcmwXL/Iu4Wb9pbt/cubQXK4ir8IZUnE8EwFnw==", - "requires": { - "lodash": "^4.17.20", - "renderkid": "^2.0.5" - } + "prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-HUoH9C5Z3jKkl3UunCyiD5jwk0+Hz0fIgQ2nbwU2Oo/ceuTAQAg+pPVnfdt2TJWRVLcxKh9iuoYDUSc8clb5UQ==", + "dev": true }, "process-nextick-args": { "version": "2.0.1", @@ -17637,6 +18609,11 @@ "fromentries": "^1.2.0" } }, + "process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -17648,11 +18625,11 @@ "integrity": "sha512-5yANTE0tmi5++POym6OgtFmwfDvOXABD9oj/jLQr5GPEyuNEb7jH4wbbANJceJid49jwhi1RddxnhnEAb/doqg==" }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, @@ -17685,19 +18662,26 @@ } }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true }, "quick-format-unescaped": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.3.tgz", - "integrity": "sha512-MaL/oqh02mhEo5m5J2rwsVL23Iw2PEaGVHgT2vFt8AAsr0lfvQA5dpXo9TPu0rz7tSBdUPgkbam0j/fj5ZM8yg==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, "randombytes": { "version": "2.1.0", @@ -17714,12 +18698,12 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.1", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -17758,30 +18742,31 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } }, "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "requires": { - "resolve": "^1.1.6" + "resolve": "^1.9.0" } }, "reduce-flatten": { @@ -17799,9 +18784,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "registry-auth-token": { @@ -17829,33 +18814,6 @@ "es6-error": "^4.0.1" } }, - "renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -17867,6 +18825,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, "resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", @@ -17877,6 +18841,23 @@ "path-parse": "^1.0.6" } }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -17891,20 +18872,11 @@ "lowercase-keys": "^1.0.0" } }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true }, "rfdc": { "version": "1.3.0", @@ -17912,24 +18884,19 @@ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -17940,25 +18907,33 @@ "integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==", "dev": true }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==", + "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -17983,9 +18958,9 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -17994,9 +18969,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -18018,30 +18993,30 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, "set-blocking": { @@ -18056,40 +19031,49 @@ "integrity": "sha1-gCIdbaDsaFEd3HQ5CXV60UT8Hf0=" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "shiki": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", + "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", "dev": true, "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "jsonc-parser": "^3.0.0", + "vscode-oniguruma": "^1.6.1", + "vscode-textmate": "5.2.0" } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "simple-swizzle": { "version": "0.2.2", @@ -18103,35 +19087,14 @@ "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, - "sonic-boom": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", - "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", - "requires": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" - } + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true }, "source-map": { "version": "0.6.1", @@ -18140,9 +19103,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -18161,36 +19124,36 @@ "rimraf": "^3.0.0", "signal-exit": "^3.0.2", "which": "^2.0.1" + } + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "requires": { + "readable-stream": "^3.0.0" }, "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "glob": "^7.1.3" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "isexe": "^2.0.0" + "safe-buffer": "~5.2.0" } } } }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "requires": { - "readable-stream": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -18198,9 +19161,9 @@ "dev": true }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -18282,51 +19245,26 @@ "dev": true }, "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -18335,72 +19273,79 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, + "style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "requires": {} + }, "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", "dev": true, "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } } } }, "supertest": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", - "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.6.tgz", + "integrity": "sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg==", "dev": true, "requires": { "methods": "^1.1.2", - "superagent": "^3.8.3" + "superagent": "^6.1.0" } }, "supports-color": { @@ -18438,43 +19383,6 @@ } } }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, "table-layout": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", @@ -18487,9 +19395,9 @@ }, "dependencies": { "array-back": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", - "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" }, "typical": { "version": "5.2.0", @@ -18498,12 +19406,50 @@ } } }, - "term-size": { + "tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, + "terser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "dev": true, + "requires": { + "jest-worker": "^27.4.1", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -18535,12 +19481,6 @@ "any-promise": "^1.0.0" } }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -18551,15 +19491,6 @@ "resolved": "https://registry.npmjs.org/timeout-as-promise/-/timeout-as-promise-1.0.0.tgz", "integrity": "sha1-c2foEfyZKs/Nzaq/LlDfr4shV28=" }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -18580,9 +19511,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "topo": { "version": "3.0.3", @@ -18615,15 +19546,22 @@ "dev": true }, "ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", - "dev": true, - "requires": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", + "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", + "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", "yn": "3.1.1" }, "dependencies": { @@ -18661,12 +19599,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-detect": { @@ -18704,42 +19642,28 @@ } }, "typedoc": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.17.8.tgz", - "integrity": "sha512-/OyrHCJ8jtzu+QZ+771YaxQ9s4g5Z3XsQE3Ma7q+BL392xxBn4UMvvCdVnqKC2T/dz03/VXSLVKOP3lHmDdc/w==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "handlebars": "^4.7.6", - "highlight.js": "^10.0.0", - "lodash": "^4.17.15", - "lunr": "^2.3.8", - "marked": "1.0.0", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shelljs": "^0.8.4", - "typedoc-default-themes": "^0.10.2" - } - }, - "typedoc-default-themes": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.10.2.tgz", - "integrity": "sha512-zo09yRj+xwLFE3hyhJeVHWRSPuKEIAsFK5r2u47KL/HBKqpwdUSanoaz5L34IKiSATFrjG5ywmIu98hPVMfxZg==", + "version": "0.22.10", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.10.tgz", + "integrity": "sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA==", "dev": true, "requires": { - "lunr": "^2.3.8" + "glob": "^7.2.0", + "lunr": "^2.3.9", + "marked": "^3.0.8", + "minimatch": "^3.0.4", + "shiki": "^0.9.12" } }, "typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true }, "typescript-logging": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/typescript-logging/-/typescript-logging-0.6.4.tgz", - "integrity": "sha512-jXISCGFyp4Q1uKLKi3zF0o8rwjeEipcIO7+C+jRttks3Ci8+8jDi9e87Jmz+8xuzZq+OcKJhDkiyHriqaWb+4A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typescript-logging/-/typescript-logging-1.0.0.tgz", + "integrity": "sha512-qeHtadCVKOt6ju4Ts20FgWRdlISditeTuplRlNTA+gFy7ENVK3czZ7YCET7yOZSZVnU00R+hGwls4dZv3+IBSg==", "requires": { "stacktrace-js": "1.3.1" } @@ -18756,42 +19680,22 @@ "dev": true }, "uglify-js": { - "version": "3.13.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.3.tgz", - "integrity": "sha512-otIc7O9LyxpUcQoXzj2hL4LPWKklO6LJWoJUzNa8A17Xgi4fOeDC8FBDOLHnC/Slo1CQgsZMcM6as0M76BZaig==", + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.5.tgz", + "integrity": "sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==", "dev": true, "optional": true }, "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "requires": { - "debug": "^2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true }, "underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", + "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==" }, "unique-string": { "version": "2.0.0", @@ -18802,9 +19706,9 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, "unpipe": { @@ -18842,9 +19746,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18887,6 +19791,16 @@ "punycode": "^2.1.0" } }, + "url-parse": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", + "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -18900,11 +19814,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -18926,12 +19835,114 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "walk": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", - "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", + "vscode-oniguruma": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", + "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "dev": true + }, + "vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, + "watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.65.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", + "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.2" + }, + "dependencies": { + "webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz", + "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.0", + "@webpack-cli/info": "^1.4.0", + "@webpack-cli/serve": "^1.6.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dev": true, "requires": { - "foreachasync": "^3.0.0" + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" } }, "wget-improved": { @@ -18944,9 +19955,9 @@ } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -18958,48 +19969,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -19008,6 +19977,12 @@ "string-width": "^4.0.0" } }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, "winston": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", @@ -19023,40 +19998,59 @@ "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } } }, "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.1.tgz", + "integrity": "sha512-ciZRlU4CSjHqHe8RQG1iPxKMRVwv6ZJ0RC7DxStKWd0KjpAhPDy5gVYSCpIUq+5CUsP+IyNOTZy1X0tO2QZqjg==", "dev": true, "requires": { - "readable-stream": "^2.3.7", + "logform": "^2.2.0", + "readable-stream": "^3.4.0", "triple-beam": "^1.2.0" }, "dependencies": { "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } } } @@ -19090,9 +20084,9 @@ } }, "workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", "dev": true }, "wrap-ansi": { @@ -19105,11 +20099,6 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -19130,14 +20119,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } } } }, @@ -19146,15 +20127,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -19167,9 +20139,9 @@ } }, "ws": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", - "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.0.tgz", + "integrity": "sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ==", "requires": {} }, "xdg-basedir": { @@ -19193,9 +20165,9 @@ } }, "xstate": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.23.1.tgz", - "integrity": "sha512-8ZoCe8d6wDSPfkep+GBgi+fKAdMyXcaizoNf5FKceEhlso4+9n1TeK6oviaDsXZ3Z5O8xKkJOxXPNuD4cA9LCw==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.27.0.tgz", + "integrity": "sha512-ohOwDM9tViC/zSSmY9261CHblDPqiaAk5vyjVbi69uJv9fGWMzlm0VDQwM2OvC61GKfXVBeuWSMkL7LPUsTpfA==", "dev": true }, "xtend": { @@ -19217,6 +20189,7 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -19245,9 +20218,9 @@ }, "dependencies": { "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, "decamelize": { diff --git a/package.json b/package.json index e194df37..7b1db0ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@p2olab/polaris-backend", - "version": "3.0.0-alpha0.1", + "version": "3.0.0-alpha0.2", "main": "./build/src/index.js", "types": "./build/src/index.d.ts", "description": "Server backend for POL recipe execution engine", @@ -32,7 +32,7 @@ "clrTypeDoc:win32": "(IF EXIST typedoc (rd /s /q typedoc))", "dist": "node ./build/index.js", "doc": "npm run apidoc && npm run typedoc", - "lint": "eslint -f pretty --ext .ts --ignore-pattern \"**/*.spec.ts\" --ignore-pattern \"**/*.mockup.ts\" src", + "lint": "eslint -f pretty --ext .ts src", "prebuild": "npm run clrBuild && npm run lint", "start": "ts-node ./src/index.ts", "test": "nyc mocha --exit --require ts-node/register --recursive \"./src/**/*.spec.ts\"", @@ -46,58 +46,58 @@ "@p2olab/pimad-types": "1.0.1-alpha1.0", "@p2olab/polaris-interface": "3.0.0-alpha13", "@types/adm-zip": "^0.4.34", - "@types/pino": "^6.3.6", "@types/promise-timeout": "^1.3.0", "@types/uuid": "^8.3.0", - "adm-zip": "^0.5.5", + "adm-zip": "^0.5.9", "assign-deep": "^1.0.1", - "command-line-args": "^5.1.1", + "command-line-args": "^5.2.0", "command-line-usage": "^6.0.2", "cors": "^2.8.5", "expr-eval": "^2.0.2", - "express": "^4.17.1", - "express-async-handler": "^1.1.4", + "express": "^4.17.2", + "express-async-handler": "^1.2.0", "json-parse-better-errors": "^1.0.2", - "multer": "^1.4.2", - "node-opcua": "^2.31.0", + "multer": "^1.4.4", + "node-opcua": "^2.62.7", "node-pid-controller": "^1.0.1", "promise-timeout": "^1.3.0", "timeout-as-promise": "^1.0.0", - "typescript-logging": "^0.6.4", - "underscore": "^1.10.2", + "typescript-logging": "^1.0.0", + "underscore": "^1.13.2", "uuid": "^8.1.0", - "ws": "^7.5.0", - "xstate": "^4.23.1", + "ws": "^8.4.0", + "xstate": "^4.27.0", "yn": "^3.1.1" }, "devDependencies": { - "@types/chai": "^4.2.11", - "@types/chai-as-promised": "^7.1.2", - "@types/command-line-args": "^5.0.0", - "@types/command-line-usage": "^5.0.1", + "@types/chai": "^4.3.0", + "@types/chai-as-promised": "^7.1.4", + "@types/command-line-args": "^5.2.0", + "@types/command-line-usage": "^5.0.2", "@types/cors": "^2.8.6", - "@types/express": "^4.17.6", - "@types/mocha": "^8.2.0", - "@types/node": "^14.0.9", - "@types/underscore": "^1.10.7", - "@types/uuid": "^8.0.0", - "@types/ws": "^7.2.0", - "@typescript-eslint/eslint-plugin": "^2.29.0", - "@typescript-eslint/parser": "^2.29.0", - "apidoc": "^0.23.0", + "@types/express": "^4.17.13", + "@types/mocha": "^9.0.0", + "@types/node": "^17.0.8", + "@types/pino": "^7.0.5", + "@types/underscore": "^1.11.4", + "@types/uuid": "^8.3.4", + "@types/ws": "^8.2.2", + "@typescript-eslint/eslint-plugin": "^5.9.0", + "@typescript-eslint/parser": "^5.9.0", + "apidoc": "^0.50.3", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", - "eslint": "^6.8.0", - "eslint-formatter-pretty": "^3.0.1", - "eslint-plugin-tsdoc": "^0.2.4", - "mocha": "^8.2.1", + "eslint": "^8.6.0", + "eslint-formatter-pretty": "^4.0.1", + "eslint-plugin-tsdoc": "^0.2.14", + "mocha": "^9.1.3", "nyc": "^15.1.0", "run-script-os": "^1.1.1", "strict-event-emitter-types": "^2.0.0", - "supertest": "^4.0.2", - "ts-node": "^8.10.2", - "typedoc": "^0.17.8", - "typescript": "^3.9.6", + "supertest": "^6.1.6", + "ts-node": "^10.4.0", + "typedoc": "^0.22.10", + "typescript": "^4.5.4", "xstate": "^4.23.1" } } diff --git a/src/componentDiagram.puml b/src/componentDiagram.puml index 68e262be..c7084ceb 100644 --- a/src/componentDiagram.puml +++ b/src/componentDiagram.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml skinparam monochrome true diff --git a/src/index.ts b/src/index.ts index 475176cc..9a31c721 100644 --- a/src/index.ts +++ b/src/index.ts @@ -36,7 +36,7 @@ import {catPEA} from './logging'; const optionDefinitions = [ { name: 'pea', - alias: 'm', + alias: 'p', type: String, multiple: true, typeLabel: '{underline peaPath[]}', @@ -51,12 +51,11 @@ const optionDefinitions = [ description: 'path to recipe.json which should be loaded at startup' }, { - name: 'virtualService', - alias: 'v', + name: 'polService', type: String, multiple: true, - typeLabel: '{underline virtualServicePath[]}', - description: 'path to virtualService.json which should be loaded at startup' + typeLabel: '{underline polServicePath[]}', + description: 'path to polService.json which should be loaded at startup' }, { name: 'help', @@ -78,7 +77,7 @@ const optionDefinitions = [ const sections = [ { header: 'polaris-backend', - content: 'Starts polaris backend engine for controlling services of PEAs.' + content: 'Starts polaris backend engine to interact with PEAs.' }, { header: 'Synopsis', @@ -86,7 +85,7 @@ const sections = [ '$ ./bin/polaris-backend' + '[{bold --pea} {underline peaPath}] ' + '[{bold --recipe} {underline recipePath}] ' + - '[{bold --virtualService} {underline virtualServicePath}] ' + + '[{bold --polService} {underline polServicePath}] ' + '[{bold --externalTrigger} {underline opcuaEndpoint} {underline opcuaNodeid}]' ] }, @@ -109,7 +108,7 @@ const sections = [ let options; try { options = commandLineArgs(optionDefinitions); -} catch (err) { +} catch (err: any) { console.log('Error: Could not parse commandNode line arguments', err.toString()); console.log(commandLineUsage(sections)); } @@ -129,7 +128,7 @@ if (options) { console.log(`Load PEAs from ${options.peas}`); options.peas.forEach((pea: string) => { const peasOptions = JSON.parse(fs.readFileSync(pea).toString()); - manager.loadPEAController(peasOptions, true); + manager.loadPEAController(peasOptions).then(); }); manager.peas.forEach((p) => p.connectAndSubscribe() @@ -147,11 +146,11 @@ if (options) { }); } - if (options.virtualService && options.virtualService.length > 0) { - console.log(`Load virtual service from ${options.virtualService}`); - options.virtualService.forEach((vs: string) => { - const vsOptions = JSON.parse(fs.readFileSync(vs).toString()); - manager.instantiatePOLService(vsOptions); + if (options.polService && options.polService.length > 0) { + console.log(`Load pol service from ${options.polService}`); + options.polService.forEach((ps: string) => { + const psOptions = JSON.parse(fs.readFileSync(ps).toString()); + manager.addPOLService(psOptions); }); } diff --git a/src/logging/index.ts b/src/logging/index.ts index d2c08e51..ec9b59c3 100644 --- a/src/logging/index.ts +++ b/src/logging/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './archive'; export * from './CustomLogger'; export * from './logging'; diff --git a/src/modularPlantManager/ModularPlantManager.puml b/src/modularPlantManager/ModularPlantManager.puml index 7fc557c7..09a37884 100644 --- a/src/modularPlantManager/ModularPlantManager.puml +++ b/src/modularPlantManager/ModularPlantManager.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include ./recipe/Recipe.puml @@ -5,7 +30,7 @@ !include ./polService/POLService.puml !include ./recipe/Player.puml !include ./pea/PEAController.puml -!include ./pea/PiMAdParser/PiMAdParser.puml +!include ./pea/PEAOptionsParser/PEAOptionsParser.puml class ModularPlantManager{ + //readonly// recipes: Recipe[] diff --git a/src/modularPlantManager/ModularPlantManager.spec.ts b/src/modularPlantManager/ModularPlantManager.spec.ts index 17fe2f0e..d700a4f0 100644 --- a/src/modularPlantManager/ModularPlantManager.spec.ts +++ b/src/modularPlantManager/ModularPlantManager.spec.ts @@ -23,22 +23,18 @@ * SOFTWARE. */ -import { - PEAOptions, - ServerSettingsOptions, -} from '@p2olab/polaris-interface'; +import {PEAOptions} from '@p2olab/polaris-interface'; import {ModularPlantManager} from './ModularPlantManager'; -import {PEAController, Service} from './pea'; +import {PEAController} from './pea'; import * as fs from 'fs'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import 'mocha'; -import * as peaOptions from '../../tests/peaOptions.json'; +import * as peaOptions from './peaOptions.spec.json'; chai.use(chaiAsPromised); const expect = chai.expect; -const assert = chai.assert; describe('ModularPlantManager', () => { @@ -47,58 +43,27 @@ describe('ModularPlantManager', () => { expect(modularPlantManager.getAllPEAControllers()).empty; }); - it('addPEAToPimadPool()', async () => { - const modularPlantManager = new ModularPlantManager(); - const peaModel = await modularPlantManager.addPEAToPimadPool({source: 'tests/testpea.zip'}); - expect(peaModel).to.not.be.undefined; - - }); - it('addPEAToPimadPool() fails', () => { - const modularPlantManager = new ModularPlantManager(); - return expect(modularPlantManager.addPEAToPimadPool({source: 'tests/stringview.json'})).to.be.rejected; - }); - - it('getAllPEAsFromPimadPool(), empty', async () => { - const modularPlantManager = new ModularPlantManager(); - return expect(modularPlantManager.getAllPEAsFromPimadPool()).to.be.empty; - }); - - describe('functions, which need PiMAdPEA', () => { + describe('functions, which require PEA', () => { let modularPlantManager = new ModularPlantManager(); - let pimadId = ''; + let identifier = ''; - beforeEach(async () => { + beforeEach(async function () { + this.timeout(5000); modularPlantManager = new ModularPlantManager(); - const peaModel = await modularPlantManager.addPEAToPimadPool({source: 'tests/testpea.zip'}); - pimadId = peaModel.pimadIdentifier; + const peaModel = await modularPlantManager.peaProvider.addPEAToPool({source: 'tests/testpea.zip'}); + identifier = peaModel.pimadIdentifier; }); - it('getPEAFromPimadPool()', () => { - return expect(modularPlantManager.getPEAFromPimadPool(pimadId)).to.not.be.rejected; - }); - it('getPEAFromPimadPool() to fail', () => { - return expect(modularPlantManager.getPEAFromPimadPool('')).to.be.rejected; - }); - - it('getAllPEAsFromPimadPool()', () => { - return expect(modularPlantManager.getAllPEAsFromPimadPool()).to.not.be.rejected; - }); it('loadPEAController()', async () => { - await modularPlantManager.loadPEAController(pimadId); + await modularPlantManager.loadPEAController(identifier); expect(modularPlantManager.peas.length).equal(1); - }); + }).timeout(5000); - it('loadPEAController() to fail, wrong pimadIdentifier', async () => { - return expect(modularPlantManager.loadPEAController('')).to.be.rejectedWith('No valid PiMAd Identifier'); + it('loadPEAController() to fail, wrong identifier', async () => { + return expect(modularPlantManager.loadPEAController('')).to.be.rejectedWith('PEA with identifier [] not found.'); }); - it('deletePEAFromPimadPool()', () => { - return expect(modularPlantManager.deletePEAFromPimadPool(pimadId)).to.not.throw; - }); - it('deletePEAFromPimadPool() to fail', () => { - return expect(modularPlantManager.deletePEAFromPimadPool('')).to.be.rejected; - }); }); describe('functions, which need PEAController instance', () => { @@ -115,6 +80,7 @@ describe('ModularPlantManager', () => { services:[], dataAssemblies:[] }; + beforeEach(async()=>{ peaController = new PEAController(peaOptionsDummy); modularPlantManager = new ModularPlantManager(); @@ -136,30 +102,19 @@ describe('ModularPlantManager', () => { expect(modularPlantManager.peas.length = 0); }); - it('removePEAController() to fail, wrong peaId', () => { + it('removePEAController() should fail with empty peaId', () => { return expect(modularPlantManager.removePEAController('')).to.rejected; }); - it('removePEAController() to fail, protected', async() => { - const peaController = new PEAController(peaOptionsDummy, true); + + it('removePEAController() should fail if pea is protected', async() => { + const peaController = new PEAController(peaOptionsDummy); + peaController.protection = true; modularPlantManager.peas.length = 0; modularPlantManager.peas.push(peaController); - return expect(modularPlantManager.removePEAController(peaId)).to.rejectedWith('PEA test is protected and can\'t be deleted'); - }); - it('updateServerSettings()', async () => { - // instantiate PEAController first - modularPlantManager.peas.push(peaController); - const options: ServerSettingsOptions = { - id: 'test', - username: 'Bob', - password: '1234', - serverUrl: 'url', - }; - modularPlantManager.updateServerSettings(options); - expect(peaController.connection.endpoint).equals('url'); - expect(peaController.connection.username).equals('Bob'); - expect(peaController.connection.password).equals('1234'); + return expect(modularPlantManager.removePEAController(peaId)).to.rejectedWith(`PEA ${peaOptionsDummy.name} can not be deleted since it is protected.`); }); + it('getAllPEAControllers()', () => { expect(modularPlantManager.getAllPEAControllers()).to.not.empty; }); @@ -195,84 +150,20 @@ describe('ModularPlantManager', () => { }); modularPlantManager.peas.push(peaController); }); - it('getServerSettings(), should work', () => { - const settings = modularPlantManager.getServerSettings(peaController.id); - assert.deepEqual(settings,{ serverUrl: 'localhost', username: 'admin', password: '1234' } ); - }); - it('getServerSettings(), should fail, wrong id', () => { - expect(() => modularPlantManager.getServerSettings('wrongId')).to.throw('PEA with id wrongId not found'); - }); - it('updateServerSettings(), should work', () => { - const options: ServerSettingsOptions = { - id: peaController.id, - username: 'Bob', - password: '1234', - serverUrl: 'url', - }; - modularPlantManager.updateServerSettings(options); - expect(peaController.connection.endpoint).equals('url'); - expect(peaController.connection.username).equals('Bob'); - expect(peaController.connection.password).equals('1234'); - - peaController.variables.forEach((dac) => { - expect(dac.connection.endpoint).equals('url'); - expect(dac.connection.username).equals('Bob'); - expect(dac.connection.password).equals('1234'); - }); - peaController.services.forEach((service) => { - expect(service.connection.endpoint).equals('url'); - expect(service.connection.username).equals('Bob'); - expect(service.connection.password).equals('1234'); - }); - }); - it('updateServerSettings(), should fail. wrong Id', () => { - const options: ServerSettingsOptions = { - id: 'wrongId', - username: 'Bob', - password: '1234', - serverUrl: 'url', - }; - expect(() => modularPlantManager.updateServerSettings(options)).to.throw('PEA with id wrongId not found'); - }); - }); - //TODO: test following -/* it('should load with subMP options', () => { - const peasJson = JSON.parse(fs.readFileSync('assets/peas/pea_cif.json').toString()); - const modularPlantManager = new ModularPlantManager(); - modularPlantManager.loadPEAController({subMP: [peasJson]}); - expect(() => modularPlantManager.loadPEAController({subMP: [peasJson]})).to.throw('already in registered PEAs'); }); - it('should load the Achema PEAs', async () => { - const modularPlantManager = new ModularPlantManager(); - const peas = modularPlantManager.loadPEAController( - JSON.parse(fs.readFileSync('assets/peas/achema_demonstrator/peas_achema.json').toString()), - true); - expect(peas).to.have.lengthOf(3); - - expect(modularPlantManager.loadPEAController).to.have.lengthOf(3); - - const service = modularPlantManager.getService('Dose', 'Fill'); - expect(service).to.be.instanceOf(Service); - expect(service.name).to.equal('Fill'); - expect(() => modularPlantManager.getService('Dose', 'NoService')).to.throw(); - expect(() => modularPlantManager.getService('NoPEA', 'NoService')).to.throw(); - - await expect(modularPlantManager.removePEAController('something')).to.be.rejectedWith('PEAController with id something not found'); - });*/ - it('should load and remove recipe', () => { const peasRecipe = - JSON.parse(fs.readFileSync('assets/recipes/test/recipe_time_local.json').toString()); + JSON.parse(fs.readFileSync('src/modularPlantManager/recipe/assets/recipes/recipe_time_local.spec.json').toString()); const modularPlantManager = new ModularPlantManager(); modularPlantManager.loadRecipe(peasRecipe); modularPlantManager.loadRecipe(peasRecipe, true); expect(modularPlantManager.recipes).to.have.lengthOf(2); - expect(() => modularPlantManager.removeRecipe('whatever')).to.throw('not available'); + expect(() => modularPlantManager.removeRecipe('whatever')).to.throw('Recipe whatever not found.'); modularPlantManager.removeRecipe(modularPlantManager.recipes[0].id); expect(modularPlantManager.recipes).to.have.lengthOf(1); @@ -284,7 +175,7 @@ describe('ModularPlantManager', () => { const modularPlantManager = new ModularPlantManager(); expect(modularPlantManager.getPOLServices()).to.have.length(0); - modularPlantManager.instantiatePOLService({name: 'timer1', type: 'timer'}); + modularPlantManager.addPOLService({name: 'timer1', type: 'timer'}); expect(modularPlantManager.getPOLServices()).to.have.length(1); expect(modularPlantManager.getPOLServices()[0]).to.have.property('name', 'timer1'); @@ -297,7 +188,7 @@ describe('ModularPlantManager', () => { it('should instantiate and run pol service', async () => { const modularPlantManager = new ModularPlantManager(); - modularPlantManager.instantiatePOLService({name: 'timer1', type: 'timer'}); + modularPlantManager.addPOLService({name: 'timer1', type: 'timer'}); await modularPlantManager.polServices[0].setParameters([{name: 'duration', value: 100}]); await modularPlantManager.polServices[0].start(); await modularPlantManager.polServices[0].waitForStateChangeWithTimeout('COMPLETED'); diff --git a/src/modularPlantManager/ModularPlantManager.ts b/src/modularPlantManager/ModularPlantManager.ts index 93c22692..3c321cfa 100644 --- a/src/modularPlantManager/ModularPlantManager.ts +++ b/src/modularPlantManager/ModularPlantManager.ts @@ -23,35 +23,15 @@ * SOFTWARE. */ -import { - BackendNotification, - PEAInterface, - POLServiceInterface, - POLServiceOptions, - PEAOptions, - RecipeOptions, - ServiceCommand, - VariableChange, - ServerSettingsOptions, - PEAModel, -} from '@p2olab/polaris-interface'; -import { - Backbone, - PEAPool, - PEAPoolVendor, -} from '@p2olab/pimad-core'; -import {catManager, catOpcUA, ServiceLogEntry} from '../logging'; +import {BackendNotification, PEAInterface, PEAOptions, POLServiceInterface, POLServiceOptions, RecipeOptions, ServiceCommand, VariableChange,} from '@p2olab/polaris-interface'; +import {catManager, ServiceLogEntry} from '../logging'; import {ParameterChange, PEAController, Service} from './pea'; import {ServiceState} from './pea/dataAssembly'; import {POLService, POLServiceFactory} from './polService'; import {Player, Recipe} from './recipe'; import {EventEmitter} from 'events'; import StrictEventEmitter from 'strict-event-emitter-types'; -import PiMAdResponse = Backbone.PiMAdResponse; -import { v4 as uuidv4 } from 'uuid'; -import {PiMAdParser} from './pea/PiMAdParser/PiMAdParser'; -import {ProcedureOptions} from '@p2olab/polaris-interface/dist/service/options'; - +import {PEAProvider} from '../peaProvider/PEAProvider'; interface ModularPlantManagerEvents { /** @@ -73,24 +53,25 @@ export interface LoadOptions { export class ModularPlantManager extends (EventEmitter as new() => ModularPlantManagerEmitter) { + public readonly peaProvider = new PEAProvider(); // loaded recipes public readonly recipes: Recipe[] = []; - // loaded PEAs + // instantiated PEAs public readonly peas: PEAController[] = []; + // instantiated POL services public readonly polServices: POLService[] = []; + public readonly player: Player; public variableArchive: VariableChange[] = []; public serviceArchive: ServiceLogEntry[] = []; - // autoreset timeout in milliseconds - private _autoresetTimeout = 500; - // PiMAd-core - public pimadPool: PEAPool; + + // autoReset determines if a service is automatically reset + private _autoReset = true; + private _autoResetTimeout = 500; //milliseconds constructor() { super(); - this.pimadPool = new PEAPoolVendor().buyDependencyPEAPool(); - this.pimadPool.initializeMTPFreeze202001Importer(); this.player = new Player() .on('started', () => { @@ -107,178 +88,80 @@ export class ModularPlantManager extends (EventEmitter as new() => ModularPlantM }); } - // autoreset determines if a service is automatically reset when - private _autoreset = true; - get autoreset(): boolean { - return this._autoreset; + get autoReset(): boolean { + return this._autoReset; } - set autoreset(value: boolean) { + + set autoReset(value: boolean) { catManager.info(`Set AutoReset to ${value}`); - this._autoreset = value; + this._autoReset = value; } - generateUniqueIdentifier(): string { - // the extinction of all life on earth will occur long before you have a collision (with uuid) (stackoverflow.com) - const identifier = uuidv4(); - return identifier; - } /** * get PEAController by given identifier - * @param peaId + * @param identifier * @returns {PEAController} */ - public getPEAController(peaId: string): PEAController { - const pea = this.peas.find((p) => p.id === peaId); - if (pea) return pea; - else throw Error(`PEA with id ${peaId} not found`); - } - - /** - * Get PEAController from Pimad-Pool by given Pimad-Identifier - * @param pimadIdentifier Pimad-Identifier - * @param callback Response from PiMad... - */ - public getPEAFromPimadPool(pimadIdentifier: string): Promise{ - return new Promise((resolve,reject) => { - this.pimadPool.getPEA(pimadIdentifier, (response: PiMAdResponse) => { - if(response.getMessage()=='Success!') { - const peaModel = response.getContent() as PEAModel; - resolve(peaModel); - } else reject(new Error(response.getMessage())); - }); - }); - } - - /** - * Delete PEAController from Pimad-Pool by given Pimad-Identifier - * //TODO: use more convenient Promise - * @param peaId Pimad-Identifier - * @param callback Response from PiMad... - */ - public deletePEAFromPimadPool(peaId: string): Promise { - return new Promise((resolve,reject)=> { - this.pimadPool.deletePEA(peaId,(response: PiMAdResponse) => { - if(response.getMessage()=='Success!') resolve(); - else reject(new Error(response.getMessage())); - }); - }); - } - - /** - * Get All PEAs from PiMAd-Pool - * @return {Promise} - */ - public getAllPEAsFromPimadPool(): Promise{ - return new Promise((resolve, reject)=>{ - this.pimadPool.getAllPEAs((response: PiMAdResponse) => { - if(response.getMessage()=='Success!') resolve(response.getContent() as PEAModel[]); - else reject(new Error((response.getMessage()))); - }); - }); + public getPEAController(identifier: string): PEAController { + const pea = this.peas.find((p) => p.id === identifier); + if (!pea) { + throw Error(`PEA with id ${identifier} not found`); + } + return pea; } - /** - * add PEAController to PiMaD-Pool by given filepath - * //TODO: use more convenient Promise - * @param filePath - filepath of the uploaded file in /uploads - */ - public addPEAToPimadPool(filePath: { source: string}): Promise{ - return new Promise((resolve, reject)=>{ - this.pimadPool.addPEA(filePath, (response: PiMAdResponse) => { - if(response.getMessage() == 'Success!') resolve(response.getContent() as PEAModel); - else reject(new Error(response.getMessage())); - }); - }); - } /** - * get server settings of PEAController - * @param {string} peaId + * Load PEAControllers by given identifier + * @param {string} identifier */ - public getServerSettings(peaId: string): object{ - const peaControllerCon = this.getPEAController(peaId).connection; - const body= {serverUrl: peaControllerCon.endpoint, username: peaControllerCon.username, password: peaControllerCon.password}; - return body; - } + public async loadPEAController(identifier: string): Promise{ + const newPEAs: PEAController[] = []; + const peaOptions: PEAOptions = await this.peaProvider.getPEAControllerOptionsByPEAIdentifier(identifier); - /** - * update server settings of PEAController - * @param {ServerSettingsOptions} options - */ - public updateServerSettings(options: ServerSettingsOptions){ - const pea = this.getPEAController(options.id); - pea.updateConnection(options); - } + newPEAs.push(new PEAController(peaOptions)); + this.peas.push(...newPEAs); + this.setPEAEventListeners(newPEAs); - /** - * Load PEAControllers by given pimadIdentifier - * //TODO needs refactoring -> input should be Object with pimadIdentifier and protected information - * @param {string} pimadIdentifier - * @param {boolean} protectedPEAs should PEAs be protected from being deleted - */ - public async loadPEAController(pimadIdentifier: string, protectedPEAs = false): Promise{ - const newPEAs: PEAController[] = []; - if (pimadIdentifier) { - const peaOptions: PEAOptions = await PiMAdParser.createPEAOptions(pimadIdentifier, this); - newPEAs.push(new PEAController(peaOptions, protectedPEAs)); - this.peas.push(...newPEAs); - this.setEventListeners(newPEAs); - return newPEAs; - } - else throw new Error('No valid PiMAd Identifier'); - - /*if (options.subMP) { - options.subMP.forEach((subMPOptions) => { - subMPOptions.peas.forEach((peaOptions: PEAOptions) => { - if (this.peas.find((p) => p.id === peaOptions.pea.getPiMAdIdentifier())) { - catManager.warn(`PEAController ${peaOptions.pea.getPiMAdIdentifier()} already in registered PEAs`); - throw new Error(`PEAController ${peaOptions.pea.getPiMAdIdentifier()} already in registered PEAs`); - } else { - newPEAs.push(new PEAController(peaOptions, protectedPEAs)); - } - }); - }); - } else if (options.peas) { - options.peas.forEach((peaOptions: PEAOptions) => { - if (this.peas.find((p) => p.id === peaOptions.pea.getPiMAdIdentifier())) { - catManager.warn(`PEAController ${peaOptions.pea.getPiMAdIdentifier()} already in registered PEAs`); - throw new Error(`PEAController ${peaOptions.pea.getPiMAdIdentifier()} already in registered PEAs`); - } else { - newPEAs.push(new PEAController(peaOptions, protectedPEAs)); - } - });*/ + return newPEAs; } /** * Remove PEAController by given identifier - * @param peaID + * @param identifier */ - public async removePEAController(peaID: string): Promise { - catManager.info(`Remove PEA ${peaID}`); - const pea = this.getPEAController(peaID); + public async removePEAController(identifier: string): Promise { + catManager.info(`Remove PEA ${identifier}`); + const pea = this.getPEAController(identifier); - if (pea.protected) throw new Error(`PEA ${peaID} is protected and can't be deleted`); + if (pea.isProtected()) { + throw new Error(`PEA ${identifier} can not be deleted since it is protected.`); + } - catManager.debug(`Disconnecting pea ${peaID} ...`); + catManager.debug(`Disconnecting pea ${identifier} ...`); await pea.disconnectAndUnsubscribe() .catch((err) => catManager.warn('Something wrong while disconnecting from PEAController: ' + err.toString())); - catManager.debug(`Deleting pea ${peaID} ...`); + catManager.debug(`Deleting pea ${identifier} ...`); const index = this.peas.indexOf(pea, 0); if (pea) this.peas.splice(index, 1); } /** - * get all PEAControllers as json + * get all PEAController as json * @returns {PEAInterface[]} */ public getAllPEAControllers(): PEAInterface[] { return this.peas.map((pea) => pea.json()); } + /** + * get all POLServices as json + * @returns {POLServiceInterface[]} + */ public getPOLServices(): POLServiceInterface[] { return this.polServices.map((ps) => ps.json()); } @@ -291,40 +174,40 @@ export class ModularPlantManager extends (EventEmitter as new() => ModularPlantM } /** - * Abort all services from all loaded PEAs + * Abort all services of all PEAs */ public abortAllServices(): Promise[][]> { const tasks = []; - tasks.push(this.peas.map((p) => p.abort())); + tasks.push(this.peas.map((peaController) => peaController.abortAllServices())); return Promise.all(tasks); } /** - * Stop all services from all loaded PEAs + * Stop all services of all PEAs */ public stopAllServices(): Promise[][]> { const tasks = []; - tasks.push(this.peas.map((p) => p.stop())); + tasks.push(this.peas.map((peaController) => peaController.stopAllServices())); return Promise.all(tasks); } /** - * Reset all services from all loaded PEAs + * Reset all services of all PEAs */ public resetAllServices(): Promise[][]> { const tasks = []; - tasks.push(this.peas.map((p) => p.reset())); + tasks.push(this.peas.map((peaController) => peaController.resetAllServices())); return Promise.all(tasks); } - public removeRecipe(recipeID: string): void { - catManager.debug(`Remove recipe ${recipeID}`); - const recipe = this.recipes.find((r) => r.id === recipeID); + public removeRecipe(identifier: string): void { + catManager.debug(`Remove recipe ${identifier}`); + const recipe = this.recipes.find((r) => r.id === identifier); if (!recipe) { - throw new Error(`Recipe ${recipeID} not available.`); + throw new Error(`Recipe ${identifier} not found.`); } if (recipe.protected) { - throw new Error(`Recipe ${recipeID} can not be deleted since it is protected.`); + throw new Error(`Recipe ${identifier} can not be deleted since it is protected.`); } else { const index = this.recipes.indexOf(recipe, 0); if (index > -1) { @@ -334,17 +217,17 @@ export class ModularPlantManager extends (EventEmitter as new() => ModularPlantM } /** - * find [Service] of a [PEAController] registered in manager - * @param {string} peaName + * find [Service] of a [PEAController] + * @param identifier * @param {string} serviceName * @returns {Service} */ - public getService(peaId: string, serviceName: string): Service { - const pea: PEAController = this.getPEAController(peaId); + public getService(identifier: string, serviceName: string): Service { + const pea: PEAController = this.getPEAController(identifier); return pea.getService(serviceName); } - public instantiatePOLService(options: POLServiceOptions): void { + public addPOLService(options: POLServiceOptions): void { const polService = POLServiceFactory.create(options, this.peas); catManager.info(`instantiated POLService ${polService.name}`); polService.eventEmitter @@ -403,9 +286,9 @@ export class ModularPlantManager extends (EventEmitter as new() => ModularPlantM * @param {Service} service */ private performAutoReset(service: Service): void { - if (this.autoreset) { + if (this.autoReset) { catManager.info(`Service ${service.connection.id}.${service.name} completed. ` + - `Short waiting time (${this._autoresetTimeout}) to AutoReset`); + `Short waiting time (${this._autoResetTimeout}) to AutoReset`); setTimeout(async () => { if (service.connection.isConnected() && service.state === ServiceState.COMPLETED) { catManager.info(`Service ${service.connection.id}.${service.name} completed. ` + @@ -416,16 +299,16 @@ export class ModularPlantManager extends (EventEmitter as new() => ModularPlantM catManager.debug('AutoReset not possible'); } } - }, this._autoresetTimeout); + }, this._autoResetTimeout); } } /** - * set all event listeners for the new PEAControllers - * @param newPEAs - new loaded/instantiated PEAControllers + * set all event listeners for new PEAControllers + * @param newPEAs - new PEAControllers * @private */ - private setEventListeners(newPEAs: PEAController[]): PEAController[] { + private setPEAEventListeners(newPEAs: PEAController[]): void { newPEAs.forEach((p: PEAController) => { p .on('connected', () => { @@ -489,6 +372,5 @@ export class ModularPlantManager extends (EventEmitter as new() => ModularPlantM }); this.emit('notify', {message: 'pea', pea: p.json()}); }); - return newPEAs; } } diff --git a/src/modularPlantManager/_utils/Mockup_Sequence.puml b/src/modularPlantManager/_utils/Mockup_Sequence.puml index 8d541690..fccf7286 100644 --- a/src/modularPlantManager/_utils/Mockup_Sequence.puml +++ b/src/modularPlantManager/_utils/Mockup_Sequence.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml skinparam monochrome true diff --git a/src/modularPlantManager/_utils/idProvider/IDProvider.puml b/src/modularPlantManager/_utils/idProvider/IDProvider.puml new file mode 100644 index 00000000..1e6397ad --- /dev/null +++ b/src/modularPlantManager/_utils/idProvider/IDProvider.puml @@ -0,0 +1,40 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface IDProvider{ + + generateIdentifier(): string; + + validIdentifier(identifier: string): boolean; +} + +class BaseIDProvider{ + + generateIdentifier(): string; + + validIdentifier(identifier: string): boolean; +} + +IDProvider <-- BaseIDProvider +@enduml diff --git a/src/modularPlantManager/_utils/idProvider/IDProvider.spec.ts b/src/modularPlantManager/_utils/idProvider/IDProvider.spec.ts new file mode 100644 index 00000000..1f845145 --- /dev/null +++ b/src/modularPlantManager/_utils/idProvider/IDProvider.spec.ts @@ -0,0 +1,63 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {IDProvider} from './IDProvider'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('IDProvider', () => { + + describe('get identifier', () => { + + it('should create Identifier', () => { + expect(IDProvider.generateIdentifier()).to.not.throw; + }); + + it('should return identifier as string', () => { + const result = IDProvider.generateIdentifier(); + expect(result).to.be.not.undefined; + expect(typeof result).to.equal('string'); + }); + }); + + describe('validate identifier', () => { + + it('should work with valid uuid', async () => { + expect(IDProvider.validIdentifier('6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b')).to.equal(true); + }); + + it('should fail with invalid uuid', async () => { + expect(IDProvider.validIdentifier('invalid154+#0')).to.equal(false); + }); + + it('should fail with empty uuid', async () => { + expect(IDProvider.validIdentifier('')).to.equal(false); + }); + + }); +}); diff --git a/src/modularPlantManager/_utils/idProvider/IDProvider.ts b/src/modularPlantManager/_utils/idProvider/IDProvider.ts new file mode 100644 index 00000000..423be547 --- /dev/null +++ b/src/modularPlantManager/_utils/idProvider/IDProvider.ts @@ -0,0 +1,39 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {v4 as uuidv4, validate} from 'uuid'; + +export class IDProvider { + + public static generateIdentifier(): string { + // the extinction of all life on earth will occur long before you have a collision (with uuid) ;) + // (stackoverflow.com) + return uuidv4(); + } + + public static validIdentifier(identifier: string): boolean { + return validate(identifier); + } +} diff --git a/src/modularPlantManager/_utils/index.ts b/src/modularPlantManager/_utils/index.ts index 6cdb95af..7c007c4e 100644 --- a/src/modularPlantManager/_utils/index.ts +++ b/src/modularPlantManager/_utils/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './peaTestServer'; export * from './specHelper'; export * from './mockupServer'; diff --git a/src/modularPlantManager/_utils/mockupServer.ts b/src/modularPlantManager/_utils/mockupServer.ts index 30c57355..189f5a5f 100644 --- a/src/modularPlantManager/_utils/mockupServer.ts +++ b/src/modularPlantManager/_utils/mockupServer.ts @@ -26,29 +26,33 @@ import {OPCUAServer} from 'node-opcua-server'; import * as net from 'net'; -import {AddressSpace, DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; +import {AccessLevelFlag, AddressSpace, DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; import {catMockupServer} from '../../logging'; +import {PEAOptions} from '@p2olab/polaris-interface'; +import {IDProvider} from './idProvider/IDProvider'; -function validUserFunc(username: string, password: string): boolean { +function validateUser(username: string, password: string): boolean { catMockupServer.info(`Try to login with ${username}:${password}`); return username === 'admin' && password === '1234'; } export class MockupServer { - public externalTrigger: boolean; + public externalTrigger = false; + private server: OPCUAServer; + private serverName = 'MockupServer'; + private initialized = false; - namespace: Namespace | undefined = undefined; - rootComponent: UAObject | undefined = undefined; + private identifier = IDProvider.generateIdentifier(); + private namespace: Namespace | undefined = undefined; + private rootComponent: UAObject | undefined = undefined; private readonly port: number; - private testNumber: number; + private testNumber = 0; constructor(port = 4334) { this.port = port; - this.server = new OPCUAServer({port: this.port, userManager: {isValidUser: validUserFunc}}); - this.externalTrigger = false; - this.testNumber = 0; + this.server = new OPCUAServer({port: this.port, userManager: {isValidUser: validateUser}}); } public async portInUse(): Promise { @@ -81,7 +85,7 @@ export class MockupServer { public async start(): Promise { if(!this.initialized) await this.initialize(); - await new Promise((resolve) => this.server.start(resolve)); + await new Promise((resolve) => this.server.start(resolve)); catMockupServer.info('server started on port ' + this.port); } @@ -91,6 +95,35 @@ export class MockupServer { catMockupServer.info('Shutdown finished'); } + get endpoint(): string{ + return 'opc.tcp://' + require('os').hostname() + ':' + this.endpointPort; + } + + get endpointUrl(): string{ + return 'opc.tcp://' + require('os').hostname() + ':NodeOPCUA-Server'; + } + + get endpointPort(): number{ + return this.port; + } + + get nameSpaceUri(): string { + return this.namespace? this.namespace.namespaceUri : ''; + } + + get nameSpace(): Namespace { + if (!this.namespace) { + throw new Error('Namespace is undefined!'); + } + return this.namespace; + } + + get rootObject(): UAObject { + if (!this.rootComponent) { + throw new Error('Root object is undefined!'); + } + return this.rootComponent; + } private createAddressSpace(): void { @@ -99,35 +132,32 @@ export class MockupServer { throw new Error('AddressSpace is undefined.'); } - const namespace: Namespace = addressSpace.getOwnNamespace(); - if (!namespace){ - throw new Error('Namespace is undefined.'); - } - - this.namespace = namespace; + this.namespace = addressSpace.registerNamespace('urn:P2OLab:NodeOPCUA-Server'); // declare a new object - const myMockup = namespace.addObject({ + const myMockup = this.namespace.addObject({ organizedBy: addressSpace.rootFolder.objects, - browseName: 'MockupServer' + browseName: this.serverName }); this.rootComponent = myMockup; - namespace.addVariable({ + this.namespace.addVariable({ componentOf: myMockup, browseName: 'ExternalTrigger', - nodeId: 'ns=1;s=trigger', + nodeId: 'ns=2;s=trigger', dataType: 'Boolean', + accessLevel: AccessLevelFlag.CurrentRead, value: { get: (): Variant => { return new Variant({dataType: DataType.Boolean, value: this.externalTrigger}); } } }); - namespace.addVariable({ + this.namespace.addVariable({ componentOf: myMockup, browseName: 'TestNumber', - nodeId: 'ns=1;s=testNumber', + nodeId: 'ns=2;s=testNumber', dataType: 'Float', + accessLevel: AccessLevelFlag.CurrentRead + AccessLevelFlag.CurrentWrite, value: { get: (): Variant => { return new Variant({dataType: DataType.Float, value: this.testNumber}); @@ -140,9 +170,19 @@ export class MockupServer { }); } -} -async function start(): Promise { - const mockupServer = new MockupServer(); - await mockupServer.start(); + get basicPEAOptions(): PEAOptions{ + return { + name: this.serverName, + id: this.identifier, + // TODO: Is it wise to provide a default identifier, could be IDProvider.generateIdentifier() + pimadIdentifier: 'a289fc13-72e0-49ac-bad9-dd0e6672fcc7', + services:[], + username: '', + password: '', + hmiUrl: '', + opcuaServerUrl: this.endpoint, + dataAssemblies:[] + }; + } } diff --git a/src/modularPlantManager/_utils/peaTestServer/PEATestVariable/PEATestNumericVariable.ts b/src/modularPlantManager/_utils/peaTestServer/PEATestVariable/PEATestNumericVariable.ts index 8a4034bc..986a79e4 100644 --- a/src/modularPlantManager/_utils/peaTestServer/PEATestVariable/PEATestNumericVariable.ts +++ b/src/modularPlantManager/_utils/peaTestServer/PEATestVariable/PEATestNumericVariable.ts @@ -32,7 +32,7 @@ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; export class PEATestNumericVariable extends PEATestVariable { public v: number; - public vext: number; + public vExt: number; public sclMin: number; public sclMax: number; public unit: number; @@ -43,16 +43,16 @@ export class PEATestNumericVariable extends PEATestVariable { super(namespace, rootNode, variableName); this.v = initialValue; - this.vext = initialValue; + this.vExt = initialValue; this.sclMin = initialMin || initialValue - Math.random() * 100; this.sclMax = initialMax || initialValue + Math.random() * 100; this.unit = initialUnit || Math.floor((Math.random() * 100) + 1000); namespace.addVariable({ componentOf: this.variableNode, - nodeId: `ns=1;s=${variableName}.V`, + nodeId: `ns=${namespace.index};s=${variableName}.V`, browseName: `${variableName}.V`, - dataType: 'Double', + dataType: DataType.Double, value: { get: (): Variant => { return new Variant({dataType: DataType.Double, value: this.v}); @@ -62,9 +62,9 @@ export class PEATestNumericVariable extends PEATestVariable { namespace.addVariable({ componentOf: this.variableNode, - nodeId: `ns=1;s=${variableName}.VUnit`, + nodeId: `ns=${namespace.index};s=${variableName}.VUnit`, browseName: `${variableName}.VUnit`, - dataType: 'Double', + dataType: DataType.Double, value: { get: (): Variant => { return new Variant({dataType: DataType.Double, value: this.unit}); @@ -74,9 +74,9 @@ export class PEATestNumericVariable extends PEATestVariable { namespace.addVariable({ componentOf: this.variableNode, - nodeId: `ns=1;s=${variableName}.VSclMin`, + nodeId: `ns=${namespace.index};s=${variableName}.VSclMin`, browseName: `${variableName}.VSclMin`, - dataType: 'Double', + dataType: DataType.Double, value: { get: (): Variant => { return new Variant({dataType: DataType.Double, value: this.sclMin}); @@ -86,9 +86,9 @@ export class PEATestNumericVariable extends PEATestVariable { namespace.addVariable({ componentOf: this.variableNode, - nodeId: `ns=1;s=${variableName}.VSclMax`, + nodeId: `ns=${namespace.index};s=${variableName}.VSclMax`, browseName: `${variableName}.VSclMax`, - dataType: 'Double', + dataType: DataType.Double, value: { get: (): Variant => { return new Variant({dataType: DataType.Double, value: this.sclMax}); @@ -98,18 +98,18 @@ export class PEATestNumericVariable extends PEATestVariable { namespace.addVariable({ componentOf: this.variableNode, - nodeId: `ns=1;s=${variableName}.VExt`, + nodeId: `ns=${namespace.index};s=${variableName}.VExt`, browseName: `${variableName}.VExt`, - dataType: 'Double', + dataType: DataType.Double, value: { get: (): Variant => { - return new Variant({dataType: DataType.Double, value: this.vext}); + return new Variant({dataType: DataType.Double, value: this.vExt}); }, set: (variant: Variant): StatusCodes => { - this.vext = parseFloat(variant.value); + this.vExt = parseFloat(variant.value); setTimeout(() => { - this.v = this.vext; - }, 500); + this.v = this.vExt; + }, 100); return StatusCodes.Good; } diff --git a/src/modularPlantManager/_utils/peaTestServer/PEATestVariable/PEATestVariable.ts b/src/modularPlantManager/_utils/peaTestServer/PEATestVariable/PEATestVariable.ts index 0d070fcc..87382efa 100644 --- a/src/modularPlantManager/_utils/peaTestServer/PEATestVariable/PEATestVariable.ts +++ b/src/modularPlantManager/_utils/peaTestServer/PEATestVariable/PEATestVariable.ts @@ -24,13 +24,13 @@ */ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; -import {OpModeDAMockup} from '../../../pea/dataAssembly/_extensions/opModeDA/OpModeDA.mockup'; +import {OpModeMockup} from '../../../pea/dataAssembly/baseFunction/opMode/OpMode.mockup'; import {catPEAMockup} from '../../../../logging'; export abstract class PEATestVariable { public readonly name: string; - public opMode: OpModeDAMockup; + public opMode: OpModeMockup; public wqc = 0; public osLevel = 0; protected variableNode: UAObject; @@ -47,7 +47,7 @@ export abstract class PEATestVariable { namespace.addVariable({ componentOf: this.variableNode, - nodeId: `ns=1;s=${variableName}.WQC`, + nodeId: `ns=${namespace.index};s=${variableName}.WQC`, browseName: `${variableName}.WQC`, dataType: DataType.UInt32, value: { @@ -59,7 +59,7 @@ export abstract class PEATestVariable { namespace.addVariable({ componentOf: this.variableNode, - nodeId: `ns=1;s=${variableName}.OSLevel`, + nodeId: `ns=${namespace.index};s=${variableName}.OSLevel`, browseName: `${variableName}.OSLevel`, dataType: DataType.UInt32, value: { @@ -69,6 +69,6 @@ export abstract class PEATestVariable { } }); - this.opMode = new OpModeDAMockup(namespace, this.variableNode, variableName); + this.opMode = new OpModeMockup(namespace, this.variableNode, variableName); } } diff --git a/src/modularPlantManager/_utils/peaTestServer/index.ts b/src/modularPlantManager/_utils/peaTestServer/index.ts index 3a4c4ee2..5c3e642a 100644 --- a/src/modularPlantManager/_utils/peaTestServer/index.ts +++ b/src/modularPlantManager/_utils/peaTestServer/index.ts @@ -1,2 +1,27 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './PEATestVariable/PEATestNumericVariable'; export * from './PEATestVariable/PEATestVariable'; diff --git a/src/modularPlantManager/_utils/specHelper.ts b/src/modularPlantManager/_utils/specHelper.ts index d8f8156b..71f52bbd 100644 --- a/src/modularPlantManager/_utils/specHelper.ts +++ b/src/modularPlantManager/_utils/specHelper.ts @@ -26,7 +26,7 @@ import {PEAController} from '../PEA'; export function waitForParameterChange(pea: PEAController, parameterName: string, expected?: number | string | boolean): Promise { - return new Promise((resolve) => + return new Promise((resolve) => pea.on('parameterChanged', (data) => { if (data.parameter === parameterName && (expected === undefined || data.value === expected)) { resolve(); @@ -37,7 +37,7 @@ export function waitForParameterChange(pea: PEAController, parameterName: string } export function waitForVariableChange(pea: PEAController, variableName: string, expected?: number | string | boolean): Promise { - return new Promise((resolve) => + return new Promise((resolve) => pea.on('variableChanged', function test(data) { if (data.variable === variableName && (expected === undefined || data.value === expected)) { resolve(); diff --git a/src/modularPlantManager/condition/Condition.puml b/src/modularPlantManager/condition/Condition.puml index 1ac09b76..f173ef85 100644 --- a/src/modularPlantManager/condition/Condition.puml +++ b/src/modularPlantManager/condition/Condition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/condition/Condition.spec.ts b/src/modularPlantManager/condition/Condition.spec.ts index 773ab2ef..5df16f3d 100644 --- a/src/modularPlantManager/condition/Condition.spec.ts +++ b/src/modularPlantManager/condition/Condition.spec.ts @@ -23,20 +23,20 @@ * SOFTWARE. */ -import {ConditionOptions, ConditionType} from '@p2olab/polaris-interface'; +import {ConditionType, PEAOptions, ServiceOptions} from '@p2olab/polaris-interface'; import {PEAController} from '../pea'; -import {MockupServer, PEATestNumericVariable, waitForVariableChange} from '../_utils'; -import {ServiceState} from '../pea/dataAssembly'; -import { - Condition, - ConditionFactory, - ExpressionCondition, NotCondition, - TimeCondition, TrueCondition -} from './index'; +import {ConditionFactory, ExpressionCondition, NotCondition, TimeCondition} from './index'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import * as fs from 'fs'; +import * as peaOptions from '../peaOptions.spec.json'; +import {MockupServer, waitForVariableChange} from '../_utils'; +import {AnaViewMockup} from '../pea/dataAssembly/indicatorElement/AnaView/AnaView.mockup'; +import {OpcUaConnection} from '../pea/connection'; +import {ServiceControlMockup} from '../pea/dataAssembly/serviceControl/ServiceControl.mockup'; +import {ProcedureOptions} from '@p2olab/polaris-interface/dist/service/options'; +import {HealthStateViewMockup} from '../pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.mockup'; +import {ServiceMtpCommand} from '../pea/serviceSet/service/enum'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -143,50 +143,79 @@ describe('Condition', () => { expect(value).to.equal(true); }); - it('should fail when pea is not connected', async () => { - const peaJson = JSON.parse(fs.readFileSync('assets/peas/pea_testserver_1.0.0.json', 'utf8')) - .peas[0]; + it('should work with complex expression', async () => { - const pea = new PEAController(peaJson); + const pea = new PEAController(peaOptions as unknown as PEAOptions); const expr = ConditionFactory.create({ type: ConditionType.expression, - expression: 'sin(a)^2 + cos(PEATestServer.Variable001)^2 < 0.5', + expression: 'sin(a)^2 + cos(a)^2 < 0.5', scope: [ { name: 'a', - pea: 'PEATestServer', - dataAssembly: 'Variable001', + pea: `${pea.id}`, + dataAssembly: 'Variable', variable: 'V' } ] }, [pea]) as ExpressionCondition; - expect(() => expr.getValue()).to.throw('not connected'); + expect(expr.getValue()).to.equal(false); }); - }); - }); -//TODO test with MockupServer -/* describe('with MockupServer containing a PEAController', () => { - let mockupServer: MockupServer; - let pea: PEAController; - let var0: PEATestNumericVariable; + + +describe('with MockupServer containing a PEAController', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + let pea: PEAController; + let anaViewMockup: AnaViewMockup; + let serviceControlMockup: ServiceControlMockup; + let healthStateViewMockup: HealthStateViewMockup; beforeEach(async function () { this.timeout(10000); mockupServer = new MockupServer(); + await mockupServer.initialize(); + anaViewMockup = new AnaViewMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + serviceControlMockup = new ServiceControlMockup(mockupServer.nameSpace, mockupServer.rootObject,'Service1'); + healthStateViewMockup = new HealthStateViewMockup(mockupServer.nameSpace, mockupServer.rootObject,'Procedure1'); await mockupServer.start(); - //var0 = peaServer.variables[0] as PEATestNumericVariable; - - const peaJson = JSON.parse(fs.readFileSync('assets/peas/pea_testserver_1.0.0.json', 'utf8')) - .peas[0]; - - pea = new PEAController(peaJson); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + + const procedureOptions: ProcedureOptions = { + dataAssembly: [healthStateViewMockup.getDataAssemblyOptions()], + id: 'Procedure1', + isDefault: true, + isSelfCompleting: false, + name: 'Procedure1', + parameters: [] + }; + + const serviceOptions: ServiceOptions = { + communication: serviceControlMockup.getDataAssemblyOptions().dataItems as any, + name: 'Service1', + procedures: [procedureOptions]}; + + const peaOptions: PEAOptions = { + dataAssemblies: [anaViewMockup.getDataAssemblyOptions()], + id: 'PEATestServer', + name: 'PEATestServer', + opcuaServerUrl: mockupServer.endpoint, + pimadIdentifier: '', + services: [serviceOptions] + }; + + pea = new PEAController(peaOptions); await pea.connectAndSubscribe(); }); afterEach(async () => { - if(pea) await pea.disconnect(); + if(pea) { + await pea.disconnectAndUnsubscribe(); + } await mockupServer.shutdown(); }); @@ -194,21 +223,23 @@ describe('Condition', () => { const condition = ConditionFactory.create({ type: ConditionType.variable, pea: 'PEATestServer', - dataAssembly: 'Variable001', + dataAssembly: 'Variable', variable: 'V', operator: '>', value: 25 }, [pea]); condition.listen(); + expect(condition).to.have.property('fulfilled', undefined); + await new Promise((resolve) => pea.once('variableChanged', resolve)); expect(condition).to.have.property('fulfilled', false); - var0.v = 22; - await waitForVariableChange(pea, 'Variable001', 22); + anaViewMockup.v = 22; + await waitForVariableChange(pea, 'Variable', 22); expect(condition).to.have.property('fulfilled', false); - var0.v = 26; - await new Promise((resolve) => { + anaViewMockup.v = 26; + await new Promise((resolve) => { condition.once('stateChanged', () => { resolve(); }); @@ -216,15 +247,15 @@ describe('Condition', () => { expect(condition).to.have.property('fulfilled', true); condition.clear(); - var0.v = 24.4; + anaViewMockup.v = 24.4; expect(condition).to.have.property('fulfilled', undefined); - var0.v = 37; + anaViewMockup.v = 37; expect(condition).to.have.property('fulfilled', undefined); - }).timeout(5000); + }).timeout(10000); it('specialized as StateCondition should work', async function () { - this.timeout(5000); + const condition = ConditionFactory.create({ type: ConditionType.state, pea: 'PEATestServer', @@ -233,7 +264,7 @@ describe('Condition', () => { }, [pea]); expect(condition.json()).to.deep.equal( { - pea: 'ModuleTestServer', + pea: 'PEATestServer', service: 'Service1', state: 'completed', type: 'state' @@ -244,12 +275,11 @@ describe('Condition', () => { expect(pea.services[0]).to.have.property('name', 'Service1'); expect(condition).to.have.property('fulfilled', false); - //peaServer.services[0].varStatus = ServiceState.EXECUTE; + serviceControlMockup.sendCommand(ServiceMtpCommand.START); await delay(100); expect(condition).to.have.property('fulfilled', false); - - //peaServer.services[0].varStatus = ServiceState.COMPLETED; - await new Promise((resolve) => { + serviceControlMockup.sendCommand(ServiceMtpCommand.COMPLETE); + await new Promise((resolve) => { condition.on('stateChanged', function test(state) { if (state) { condition.removeListener('stateChanged', test); @@ -261,16 +291,17 @@ describe('Condition', () => { condition.clear(); expect(condition).to.have.property('fulfilled', undefined); - //pea.services[0].varStatus = ServiceState.EXECUTE; + serviceControlMockup.sendCommand(ServiceMtpCommand.START); await delay(100); expect(condition).to.have.property('fulfilled', undefined); - //peaServer.services[0].varStatus = ServiceState.COMPLETED; + serviceControlMockup.sendCommand(ServiceMtpCommand.COMPLETE); await delay(100); expect(condition).to.have.property('fulfilled', undefined); - }); + }).timeout(5000); it('should not react on a closed condition', async () => { + const condition = ConditionFactory.create({ type: ConditionType.state, pea: 'PEATestServer', @@ -279,11 +310,8 @@ describe('Condition', () => { }, [pea]); condition.listen(); - //peaServer.services[0].varStatus = ServiceState.IDLE; - await delay(50); expect(condition).to.have.property('fulfilled', false); - - expect(condition.listenerCount('stateChanged')).to.equal(1); + expect(condition.listenerCount('stateChanged')).to.equal(0); condition.clear(); expect(condition).to.have.property('fulfilled', undefined); @@ -292,8 +320,9 @@ describe('Condition', () => { condition.listen(); expect(condition).to.have.property('fulfilled', false); - //peaServer.services[0].varStatus = ServiceState.COMPLETED; - await new Promise((resolve) => { + serviceControlMockup.sendCommand(ServiceMtpCommand.START); + serviceControlMockup.sendCommand(ServiceMtpCommand.COMPLETE); + await new Promise((resolve) => { condition.on('stateChanged', (state) => { if (state) { resolve(); @@ -301,44 +330,44 @@ describe('Condition', () => { }); }); condition.clear(); - }); + }).timeout(5000); describe('ExpressionCondition', () => { it('should work with simple server expression', async () => { const expr = new ExpressionCondition( - {type: ConditionType.expression, expression: 'PEATestServer.Variable001.V>10'}, [pea]); + {type: ConditionType.expression, expression: 'PEATestServer.Variable.V>10'}, [pea]); expr.listen(); expect(expr.getUsedPEAs().size).to.equal(1); - var0.v = 0; - await waitForVariableChange(pea, 'Variable001', 0); + anaViewMockup.v = 0; + await waitForVariableChange(pea, 'Variable', 0); expect(expr).to.have.property('fulfilled', false); let value = expr.getValue(); expect(value).to.equal(false); - var0.v = 11; - await waitForVariableChange(pea, 'Variable001', 11); + anaViewMockup.v = 11; + await waitForVariableChange(pea, 'Variable', 11); value = expr.getValue(); expect(value).to.equal(true); expect(expr).to.have.property('fulfilled', true); - var0.v = 8; + anaViewMockup.v = 8; await Promise.all([ new Promise((resolve) => expr.once('stateChanged', resolve)), - waitForVariableChange(pea, 'Variable001', 8) + waitForVariableChange(pea, 'Variable', 8) ]); value = expr.getValue(); expect(value).to.equal(false); expect(expr).to.have.property('fulfilled', false); expr.clear(); - var0.v = 12; + anaViewMockup.v = 12; expr.once('stateChanged', () => { throw new Error('State has changed after it was cleared'); }); - await waitForVariableChange(pea, 'Variable001', 12); + await waitForVariableChange(pea, 'Variable', 12); value = expr.getValue(); expect(value).to.equal(true); expect(expr).to.have.property('fulfilled', undefined); @@ -347,22 +376,22 @@ describe('Condition', () => { it('should work with semi-complex expression', async () => { const expr: ExpressionCondition = ConditionFactory.create({ type: ConditionType.expression, - expression: 'cos(PEATestServer.Variable001.V)^2 > 0.9' + expression: 'cos(PEATestServer.Variable.V)^2 > 0.9' }, [pea]) as ExpressionCondition; expr.listen(); - var0.v = 3.1; + anaViewMockup.v = 3.1; await Promise.all([ new Promise((resolve) => expr.once('stateChanged', resolve)), - waitForVariableChange(pea, 'Variable001', 3.1) + waitForVariableChange(pea, 'Variable', 3.1) ]); let value = expr.getValue(); expect(value).to.equal(true); - var0.v = 0.7; + anaViewMockup.v = 0.7; await Promise.all([ new Promise((resolve) => expr.once('stateChanged', resolve)), - waitForVariableChange(pea, 'Variable001', 0.7) + waitForVariableChange(pea, 'Variable', 0.7) ]); value = expr.getValue(); expect(value).to.equal(false); @@ -371,18 +400,18 @@ describe('Condition', () => { it('should work with complex expression', async () => { const expr = ConditionFactory.create({ type: ConditionType.expression, - expression: 'sin(a)^2 + cos(PEATestServer.Variable001)^2 < 0.5', + expression: 'sin(a)^2 + cos(PEATestServer.Variable)^2 < 0.5', scope: [ { name: 'a', pea: 'PEATestServer', - dataAssembly: 'Variable001', + dataAssembly: 'Variable', variable: 'V' } ] }, [pea]) as ExpressionCondition; - var0.v = 0.7; + anaViewMockup.v = 0.7; await new Promise((resolve) => pea.once('variableChanged', resolve)); const value = expr.getValue(); @@ -391,6 +420,6 @@ describe('Condition', () => { }); - });*/ + }); }); diff --git a/src/modularPlantManager/condition/Condition.ts b/src/modularPlantManager/condition/Condition.ts index bc15fcbe..4c5b39a4 100644 --- a/src/modularPlantManager/condition/Condition.ts +++ b/src/modularPlantManager/condition/Condition.ts @@ -57,9 +57,9 @@ export abstract class Condition extends (EventEmitter as new() => ConditionEmitt } } - protected _fulfilled = false; + protected _fulfilled: boolean | undefined = undefined; - get fulfilled(): boolean { + get fulfilled(): boolean | undefined { return this._fulfilled; } @@ -72,7 +72,7 @@ export abstract class Condition extends (EventEmitter as new() => ConditionEmitt * Clear listening on condition */ public clear(): void { - this._fulfilled = false; + this._fulfilled = undefined; this.removeAllListeners('stateChanged'); } diff --git a/src/modularPlantManager/condition/ConditionFactory.spec.ts b/src/modularPlantManager/condition/ConditionFactory.spec.ts index 51a661c0..97a6b0e7 100644 --- a/src/modularPlantManager/condition/ConditionFactory.spec.ts +++ b/src/modularPlantManager/condition/ConditionFactory.spec.ts @@ -35,10 +35,10 @@ chai.use(chaiAsPromised); const expect = chai.expect; /** - * Test for [[Condition]] + * Test for [[ConditionFactory]] */ describe('ConditionFactory', () => { - describe('without test server', () => { // TODO: Add Test + describe('without test server', () => { it('should provide TrueCondition if type is undefined', () => { expect(ConditionFactory.create({} as ConditionOptions, [])).to.instanceOf(TrueCondition); diff --git a/src/modularPlantManager/condition/custom/ExpressionCondition.puml b/src/modularPlantManager/condition/custom/ExpressionCondition.puml index 98b820a8..59293c9a 100644 --- a/src/modularPlantManager/condition/custom/ExpressionCondition.puml +++ b/src/modularPlantManager/condition/custom/ExpressionCondition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/condition/custom/ExpressionCondition.spec.ts b/src/modularPlantManager/condition/custom/ExpressionCondition.spec.ts index f5f7e720..db43d4fd 100644 --- a/src/modularPlantManager/condition/custom/ExpressionCondition.spec.ts +++ b/src/modularPlantManager/condition/custom/ExpressionCondition.spec.ts @@ -23,130 +23,145 @@ * SOFTWARE. */ -import {ConditionType} from '@p2olab/polaris-interface'; +import {ConditionType, PEAOptions} from '@p2olab/polaris-interface'; import {PEAController} from '../../pea'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {MockupServer, waitForVariableChange, PEATestNumericVariable} from '../../_utils'; +import {MockupServer, waitForVariableChange} from '../../_utils'; import {ExpressionCondition} from './ExpressionCondition'; import {ConditionFactory} from '../ConditionFactory'; +import {AnaViewMockup} from '../../pea/dataAssembly/indicatorElement/AnaView/AnaView.mockup'; +import {OpcUaConnection} from '../../pea/connection'; chai.use(chaiAsPromised); const expect = chai.expect; /** - * Test for [[Condition]] + * Test for [[ExpressionCondition]] */ -describe('ConditionFactory', () => { - describe('without test server', () => { - // TODO: Add Test - }); +describe('ExpressionCondition', () => { describe('with MockupServer', () => { let mockupServer: MockupServer; + let connection: OpcUaConnection; let pea: PEAController; - let var0: PEATestNumericVariable; + let anaViewMockup: AnaViewMockup; beforeEach(async function () { this.timeout(10000); mockupServer = new MockupServer(); + await mockupServer.initialize(); + anaViewMockup = new AnaViewMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + + const peaOptions: PEAOptions = { + dataAssemblies: [anaViewMockup.getDataAssemblyOptions()], + id: 'PEATestServer', + name: 'PEATestServer', + opcuaServerUrl: mockupServer.endpoint, + pimadIdentifier: '', + services: [] + }; + + pea = new PEAController(peaOptions); + await pea.connectAndSubscribe(); }); afterEach(async () => { + if(pea) { + await pea.disconnectAndUnsubscribe(); + } await mockupServer.shutdown(); }); - describe('ExpressionCondition', () => { - - it('should work with simple server expression', async () => { - const expr = new ExpressionCondition( - {type: ConditionType.expression, expression: 'PEATestServer.Variable001.V>10'}, [pea]); - expr.listen(); - - expect(expr.getUsedPEAs().size).to.equal(1); - - var0.v = 0; - await waitForVariableChange(pea, 'Variable001', 0); - expect(expr).to.have.property('fulfilled', false); - let value = expr.getValue(); - expect(value).to.equal(false); - - var0.v = 11; - await waitForVariableChange(pea, 'Variable001', 11); - value = expr.getValue(); - expect(value).to.equal(true); - expect(expr).to.have.property('fulfilled', true); - - var0.v = 8; - await Promise.all([ - new Promise((resolve) => expr.once('stateChanged', resolve)), - waitForVariableChange(pea, 'Variable001', 8) - ]); - value = expr.getValue(); - expect(value).to.equal(false); - expect(expr).to.have.property('fulfilled', false); - - expr.clear(); - var0.v = 12; - expr.once('stateChanged', () => { - throw new Error('State has changed after it was cleared'); - }); - await waitForVariableChange(pea, 'Variable001', 12); - value = expr.getValue(); - expect(value).to.equal(true); - expect(expr).to.have.property('fulfilled', undefined); - }).timeout(5000); - - it('should work with semi-complex expression', async () => { - const expr: ExpressionCondition = ConditionFactory.create({ - type: ConditionType.expression, - expression: 'cos(PEATestServer.Variable001.V)^2 > 0.9' - }, [pea]) as ExpressionCondition; - expr.listen(); - - var0.v = 3.1; - await Promise.all([ - new Promise((resolve) => expr.once('stateChanged', resolve)), - waitForVariableChange(pea, 'Variable001', 3.1) - ]); - let value = expr.getValue(); - expect(value).to.equal(true); - - var0.v = 0.7; - await Promise.all([ - new Promise((resolve) => expr.once('stateChanged', resolve)), - waitForVariableChange(pea, 'Variable001', 0.7) - ]); - value = expr.getValue(); - expect(value).to.equal(false); - }).timeout(5000); - - it('should work with complex expression', async () => { - const expr = ConditionFactory.create({ - type: ConditionType.expression, - expression: 'sin(a)^2 + cos(PEATestServer.Variable001)^2 < 0.5', - scope: [ - { - name: 'a', - pea: 'PEATestServer', - dataAssembly: 'Variable001', - variable: 'V' - } - ] - }, [pea]) as ExpressionCondition; - - var0.v = 0.7; - await new Promise((resolve) => pea.once('variableChanged', resolve)); - - const value = expr.getValue(); - expect(value).to.equal(false); - }); + it('should work with simple server expression', async () => { + const expressionCondition = new ExpressionCondition( + {type: ConditionType.expression, expression: 'PEATestServer.Variable.V>10'}, [pea]); + expressionCondition.listen(); + + expect(expressionCondition.getUsedPEAs().size).to.equal(1); + + anaViewMockup.v = 0; + await waitForVariableChange(pea, 'Variable', 0); + expect(expressionCondition).to.have.property('fulfilled', false); + let value = expressionCondition.getValue(); + expect(value).to.equal(false); + + anaViewMockup.v = 11; + await waitForVariableChange(pea, 'Variable', 11); + value = expressionCondition.getValue(); + expect(value).to.equal(true); + expect(expressionCondition).to.have.property('fulfilled', true); + + anaViewMockup.v = 8; + await Promise.all([ + new Promise((resolve) => expressionCondition.once('stateChanged', resolve)), + waitForVariableChange(pea, 'Variable', 8) + ]); + value = expressionCondition.getValue(); + expect(value).to.equal(false); + expect(expressionCondition).to.have.property('fulfilled', false); + + expressionCondition.clear(); + anaViewMockup.v = 12; + expressionCondition.once('stateChanged', () => { + throw new Error('State has changed after it was cleared'); + }); + await waitForVariableChange(pea, 'Variable', 12); + value = expressionCondition.getValue(); + expect(value).to.equal(true); + expect(expressionCondition).to.have.property('fulfilled', undefined); + }).timeout(5000); + + it('should work with semi-complex expression', async () => { + const expr: ExpressionCondition = ConditionFactory.create({ + type: ConditionType.expression, + expression: 'cos(PEATestServer.Variable.V)^2 > 0.9' + }, [pea]) as ExpressionCondition; + expr.listen(); + + anaViewMockup.v = 3.1; + await Promise.all([ + new Promise((resolve) => expr.once('stateChanged', resolve)), + waitForVariableChange(pea, 'Variable', 3.1) + ]); + let value = expr.getValue(); + expect(value).to.equal(true); + + anaViewMockup.v = 0.7; + await Promise.all([ + new Promise((resolve) => expr.once('stateChanged', resolve)), + waitForVariableChange(pea, 'Variable', 0.7) + ]); + value = expr.getValue(); + expect(value).to.equal(false); + }).timeout(5000); + + it('should work with complex expression', async () => { + const expr = ConditionFactory.create({ + type: ConditionType.expression, + expression: 'sin(a)^2 + cos(PEATestServer.Variable)^2 < 0.5', + scope: [ + { + name: 'a', + pea: 'PEATestServer', + dataAssembly: 'Variable', + variable: 'V' + } + ] + }, [pea]) as ExpressionCondition; + + anaViewMockup.v = 0.7; + await new Promise((resolve) => pea.once('variableChanged', resolve)); + + const value = expr.getValue(); + expect(value).to.equal(false); }); - }); - }); diff --git a/src/modularPlantManager/condition/custom/ExpressionCondition.ts b/src/modularPlantManager/condition/custom/ExpressionCondition.ts index 447f9fc8..40813ece 100644 --- a/src/modularPlantManager/condition/custom/ExpressionCondition.ts +++ b/src/modularPlantManager/condition/custom/ExpressionCondition.ts @@ -45,7 +45,7 @@ export class ExpressionCondition extends Condition { this.scopeArray = (options.scope || []) .map((item: ScopeOptions) => ScopeItem.extractFromScopeOptions(item, peaSet)); - // evaluate additional variables from expression + // evaluate additional dataAssemblies from expression const extraction = ScopeItem.extractFromExpressionString( options.expression, peaSet, @@ -77,7 +77,7 @@ export class ExpressionCondition extends Condition { // eslint-disable-next-line @typescript-eslint/no-explicit-any public getValue(): any { - // get current variables + // get current dataAssemblies const tasks = this.scopeArray.map((item) => { return item.getScopeValue(); }); diff --git a/src/modularPlantManager/condition/custom/TimeCondition.puml b/src/modularPlantManager/condition/custom/TimeCondition.puml index 1152fb71..28ae0670 100644 --- a/src/modularPlantManager/condition/custom/TimeCondition.puml +++ b/src/modularPlantManager/condition/custom/TimeCondition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/condition/custom/index.ts b/src/modularPlantManager/condition/custom/index.ts index 81d88535..ce3e3e84 100644 --- a/src/modularPlantManager/condition/custom/index.ts +++ b/src/modularPlantManager/condition/custom/index.ts @@ -1,2 +1,27 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './ExpressionCondition'; export * from './TimeCondition'; diff --git a/src/modularPlantManager/condition/index.ts b/src/modularPlantManager/condition/index.ts index 9dd90c71..5145ec61 100644 --- a/src/modularPlantManager/condition/index.ts +++ b/src/modularPlantManager/condition/index.ts @@ -1,6 +1,30 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './Condition'; export * from './ConditionFactory'; - export * from './custom'; export * from './logical'; export * from './peaCondition'; diff --git a/src/modularPlantManager/condition/logical/AndCondition.puml b/src/modularPlantManager/condition/logical/AndCondition.puml index 82db879c..9122e8de 100644 --- a/src/modularPlantManager/condition/logical/AndCondition.puml +++ b/src/modularPlantManager/condition/logical/AndCondition.puml @@ -1,3 +1,29 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/condition/logical/NotCondition.puml b/src/modularPlantManager/condition/logical/NotCondition.puml index 9e99040f..e79c2e81 100644 --- a/src/modularPlantManager/condition/logical/NotCondition.puml +++ b/src/modularPlantManager/condition/logical/NotCondition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/condition/logical/OrCondition.puml b/src/modularPlantManager/condition/logical/OrCondition.puml index ce218faf..8909e7f1 100644 --- a/src/modularPlantManager/condition/logical/OrCondition.puml +++ b/src/modularPlantManager/condition/logical/OrCondition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/condition/logical/TrueCondition.puml b/src/modularPlantManager/condition/logical/TrueCondition.puml index 94d3aede..f1a781fb 100644 --- a/src/modularPlantManager/condition/logical/TrueCondition.puml +++ b/src/modularPlantManager/condition/logical/TrueCondition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/condition/logical/TwoOperandCondition.puml b/src/modularPlantManager/condition/logical/TwoOperandCondition.puml index 65715749..524a1688 100644 --- a/src/modularPlantManager/condition/logical/TwoOperandCondition.puml +++ b/src/modularPlantManager/condition/logical/TwoOperandCondition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include AndCondition.puml diff --git a/src/modularPlantManager/condition/logical/index.ts b/src/modularPlantManager/condition/logical/index.ts index 4226311d..c21da9b0 100644 --- a/src/modularPlantManager/condition/logical/index.ts +++ b/src/modularPlantManager/condition/logical/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './AndCondition'; export * from './NotCondition'; export * from './OrCondition'; diff --git a/src/modularPlantManager/condition/peaCondition/PEACondition.puml b/src/modularPlantManager/condition/peaCondition/PEACondition.puml index 14f6fbbc..bbc6a53b 100644 --- a/src/modularPlantManager/condition/peaCondition/PEACondition.puml +++ b/src/modularPlantManager/condition/peaCondition/PEACondition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include ServiceStateCondition.puml diff --git a/src/modularPlantManager/condition/peaCondition/ServiceStateCondition.puml b/src/modularPlantManager/condition/peaCondition/ServiceStateCondition.puml index c4a70871..c1345c01 100644 --- a/src/modularPlantManager/condition/peaCondition/ServiceStateCondition.puml +++ b/src/modularPlantManager/condition/peaCondition/ServiceStateCondition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/condition/peaCondition/ServiceStateCondition.ts b/src/modularPlantManager/condition/peaCondition/ServiceStateCondition.ts index e65e769c..ec8e5977 100644 --- a/src/modularPlantManager/condition/peaCondition/ServiceStateCondition.ts +++ b/src/modularPlantManager/condition/peaCondition/ServiceStateCondition.ts @@ -78,5 +78,5 @@ export class ServiceStateCondition extends PEACondition { private check = (expectedState: ServiceState): void => { this._fulfilled = (expectedState === this.state); this.emit('stateChanged', this._fulfilled); - } + }; } diff --git a/src/modularPlantManager/condition/peaCondition/VariableCondition.puml b/src/modularPlantManager/condition/peaCondition/VariableCondition.puml index 41fafb3a..fb248795 100644 --- a/src/modularPlantManager/condition/peaCondition/VariableCondition.puml +++ b/src/modularPlantManager/condition/peaCondition/VariableCondition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/condition/peaCondition/VariableCondition.ts b/src/modularPlantManager/condition/peaCondition/VariableCondition.ts index 212e75de..1f9611a4 100644 --- a/src/modularPlantManager/condition/peaCondition/VariableCondition.ts +++ b/src/modularPlantManager/condition/peaCondition/VariableCondition.ts @@ -76,6 +76,6 @@ export class VariableCondition extends PEACondition { } this._fulfilled = result; this.emit('stateChanged', this._fulfilled); - } + }; } diff --git a/src/modularPlantManager/condition/peaCondition/index.ts b/src/modularPlantManager/condition/peaCondition/index.ts index 866205c8..78fd0d0a 100644 --- a/src/modularPlantManager/condition/peaCondition/index.ts +++ b/src/modularPlantManager/condition/peaCondition/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './PEACondition'; export * from './ServiceStateCondition'; export * from './VariableCondition'; diff --git a/src/modularPlantManager/index.ts b/src/modularPlantManager/index.ts index 98da93fe..daf1d913 100644 --- a/src/modularPlantManager/index.ts +++ b/src/modularPlantManager/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './condition'; export * from './pea/connection'; export * from './pea'; diff --git a/src/modularPlantManager/pea/HandshakeSequence.puml b/src/modularPlantManager/pea/HandshakeSequence.puml new file mode 100644 index 00000000..3dcfc19d --- /dev/null +++ b/src/modularPlantManager/pea/HandshakeSequence.puml @@ -0,0 +1,46 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml + +skinparam monochrome false + +participant POL.DataAssemblyController +participant PEA.DataAssembly + + note over PEA.DataAssembly: State:=0 + hnote across: Change Set to 1 should result in Change of State 0->1 + POL.DataAssemblyController -> PEA.DataAssembly: Set := true + ... PEA internal calculation time ... + note over POL.DataAssemblyController : Request was handled by PEA + PEA.DataAssembly -> POL.DataAssemblyController: Set := false + ... PEA internal calculation time ... +alt #Green Successful case + PEA.DataAssembly -> POL.DataAssemblyController: State := true +else #Red Failure + PEA.DataAssembly -> POL.DataAssemblyController: State := false +end + +@enduml diff --git a/src/modularPlantManager/pea/PEA.mockup.spec.ts b/src/modularPlantManager/pea/PEA.mockup.spec.ts index fbf9e7ac..bfd5d70a 100644 --- a/src/modularPlantManager/pea/PEA.mockup.spec.ts +++ b/src/modularPlantManager/pea/PEA.mockup.spec.ts @@ -25,12 +25,10 @@ import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {ClientSession, OPCUAClient} from 'node-opcua-client'; -import {controlEnableToJson, ServiceState} from './serviceSet/service/enum'; +import {OPCUAClient} from 'node-opcua-client'; import {MockupServer} from '../_utils'; chai.use(chaiAsPromised); -const expect = chai.expect; describe('PEATestServer', () => { @@ -47,15 +45,14 @@ describe('PEATestServer', () => { it('should connect to OPC UA server', async () => { const client = OPCUAClient.create({ - // eslint-disable-next-line @typescript-eslint/camelcase - endpoint_must_exist: false, + endpointMustExist: false, connectionStrategy: { maxRetry: 10 } }); await client.connect('opc.tcp://localhost:4334/'); - const session: ClientSession = await client.createSession(); + await client.createSession(); /* let result = await session.read({nodeId: 'ns=1;s=Service1.State'}); expect(result.value.value).to.equal(ServiceState.IDLE); diff --git a/src/modularPlantManager/pea/PEA.mockup.ts b/src/modularPlantManager/pea/PEA.mockup.ts index 0797f569..a3159081 100644 --- a/src/modularPlantManager/pea/PEA.mockup.ts +++ b/src/modularPlantManager/pea/PEA.mockup.ts @@ -23,15 +23,12 @@ * SOFTWARE. */ -import {Category} from 'typescript-logging'; import {ServiceMockup} from './serviceSet/service/Service.mockup'; -import {PEATestNumericVariable} from '../_utils'; +import {MockupServer, PEATestNumericVariable} from '../_utils'; +import {ActiveElementMockup} from './dataAssembly/activeElement/ActiveElement.mockup'; - -export function getPEAMockupReferenceJSON( - namespace: number, - objectBrowseName: string): any { +export function getPEAMockupReferenceJSON(): object { return ({ peas: [ @@ -72,18 +69,22 @@ export class PEAMockup { public variables: PEATestNumericVariable[] = []; public services: ServiceMockup[] = []; + public mockupServer: MockupServer; constructor() { - //do nothing + this.mockupServer = new MockupServer(); + this.mockupServer.initialize().then(); } - public startSimulation(): void { + public async startSimulation(): Promise { + await this.mockupServer.start(); this.variables.forEach((variable) => variable.startRandomOscillation()); this.services.forEach((service) => service.startSimulation()); } - public stopSimulation(): void { + public async stopSimulation(): Promise { this.variables.forEach((variable) => variable.stopRandomOscillation()); this.services.forEach((services) => services.stopSimulation()); + await this.mockupServer.shutdown(); } } diff --git a/src/modularPlantManager/pea/PEAController.puml b/src/modularPlantManager/pea/PEAController.puml index a7f1a024..c530a78e 100644 --- a/src/modularPlantManager/pea/PEAController.puml +++ b/src/modularPlantManager/pea/PEAController.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include ./dataAssembly/DataAssemblyController.puml diff --git a/src/modularPlantManager/pea/PEAController.spec.ts b/src/modularPlantManager/pea/PEAController.spec.ts index 82c59980..5bcf9c32 100644 --- a/src/modularPlantManager/pea/PEAController.spec.ts +++ b/src/modularPlantManager/pea/PEAController.spec.ts @@ -27,12 +27,10 @@ import {PEAController} from './PEAController'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {MockupServer} from '../_utils'; -import * as peaOptions from '../../../tests/peaOptions.json'; -import {namespaceUrl, setNamespaceUrl} from '../../../tests/namespaceUrl'; +import * as peaOptions from '../peaOptions.spec.json'; import {PEAOptions, ServiceCommand} from '@p2olab/polaris-interface'; import {AnaViewMockup} from './dataAssembly/indicatorElement/AnaView/AnaView.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {ServiceControlMockup} from './dataAssembly/ServiceControl/ServiceControl.mockup'; +import {ServiceControlMockup} from './dataAssembly/serviceControl/ServiceControl.mockup'; import {ServiceState} from './serviceSet/service/enum'; import {Service} from './serviceSet'; @@ -47,40 +45,41 @@ describe('PEAController', () => { }); describe('with MockupServer', () => { + let mockupServer: MockupServer; let peaController: PEAController; let service: Service; - //set namespaceUrl in peaOptions - setNamespaceUrl(peaOptions as any); beforeEach(async () => { mockupServer = new MockupServer(); peaController = new PEAController(peaOptions as unknown as PEAOptions); service = peaController.services[0]; await mockupServer.initialize(); - const mockup = new AnaViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const mockupService = new ServiceControlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Trigonometry'); + new AnaViewMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + new ServiceControlMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Trigonometry'); await mockupServer.start(); }); + afterEach(async () => { await peaController.disconnectAndUnsubscribe(); await mockupServer.shutdown(); }); + context('connect, subscribe',()=>{ + it('should connect and subscribe', async() => { return expect(peaController.connectAndSubscribe()).to.not.be.rejected; }); + it('should fail to subscribe, missing variable on mockupServer', async() => { await mockupServer.shutdown(); mockupServer = new MockupServer(); peaController = new PEAController(peaOptions as unknown as PEAOptions); await mockupServer.initialize(); - new AnaViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', false); - new ServiceControlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Trigonometry'); + new AnaViewMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', false); + new ServiceControlMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Trigonometry'); await mockupServer.start(); return expect(peaController.connectAndSubscribe()).to.be.rejectedWith('Timeout: Could not subscribe to Variable.V'); }).timeout(5000); @@ -108,52 +107,53 @@ describe('PEAController', () => { await peaController.disconnectAndUnsubscribe(); }); -/* it('should fail to disconnect and unsubscribe', async() => { - //TODO when could this occure? - });*/ - }); + }).timeout(8000); context('control Services',async ()=> { - it('should stop()', async() => { + + it('should stopAllServices()', async() => { await peaController.connectAndSubscribe(); - await service.executeCommandAndWaitForStateChange(ServiceCommand.start); - await peaController.stop(); + await service.executeCommand(ServiceCommand.start); + await peaController.stopAllServices(); expect(service.state).to.equal(ServiceState.STOPPED); }); - it('should fail to stop(), command not executable',async() => { + + it('should fail to stopAllServices(), command not executable',async() => { await peaController.connectAndSubscribe(); - await peaController.abort(); - return expect(peaController.stop()).to.be.rejectedWith('Command is not executable'); + await peaController.stopAllServices(); + return expect(peaController.stopAllServices()).to.be.rejectedWith('Command is not executable'); }); - it('should abort()', async() => { + it('should abortAllServices()', async() => { await peaController.connectAndSubscribe(); - await service.executeCommandAndWaitForStateChange(ServiceCommand.start); - await peaController.abort(); + await service.executeCommand(ServiceCommand.start); + await peaController.abortAllServices(); expect(service.state).to.equal(ServiceState.ABORTED); }); it('should pause()', async() => { await peaController.connectAndSubscribe(); - await service.executeCommandAndWaitForStateChange(ServiceCommand.start); - await peaController.pause(); + await service.executeCommand(ServiceCommand.start); + await peaController.pauseAllServices(); expect(service.state).to.equal(ServiceState.PAUSED); }); + it('should fail to pause(), command not executable', async() => { await peaController.connectAndSubscribe(); - return expect(peaController.pause()).to.be.rejectedWith('Command is not executable'); + return expect(peaController.pauseAllServices()).to.be.rejectedWith('Command is not executable'); }); it('should resume()', async() => { await peaController.connectAndSubscribe(); - await service.executeCommandAndWaitForStateChange(ServiceCommand.start); - await service.executeCommandAndWaitForStateChange(ServiceCommand.pause); - await peaController.resume(); + await service.executeCommand(ServiceCommand.start); + await service.executeCommand(ServiceCommand.pause); + await peaController.pauseAllServices(); expect(service.state).to.equal(ServiceState.EXECUTE); }).timeout(10000); + it('should fail to resume(), command not executable', async() => { await peaController.connectAndSubscribe(); - return expect(peaController.resume()).to.be.rejectedWith('Command is not executable'); + return expect(peaController.resumeAllServices()).to.be.rejectedWith('Command is not executable'); }); }); }); diff --git a/src/modularPlantManager/pea/PEAController.ts b/src/modularPlantManager/pea/PEAController.ts index 19c253d7..993e511d 100644 --- a/src/modularPlantManager/pea/PEAController.ts +++ b/src/modularPlantManager/pea/PEAController.ts @@ -26,15 +26,14 @@ import { CommandEnableInterface, DataAssemblyOptions, OperationMode, - ParameterInterface, PEAInterface, PEAOptions, ServerSettingsOptions, + ParameterInterface, PEAInterface, PEAOptions, ServiceCommand, ServiceInterface, ServiceOptions, ServiceSourceMode, VariableChange } from '@p2olab/polaris-interface'; -import {DataItemEmitter, OpcUaConnection, OpcUaDataItem} from './connection'; +import {DataItemEmitter, OpcUaConnection, OpcUaConnectionSettings, OpcUaDataItem} from './connection'; import { - DataAssemblyController, - DataAssemblyControllerFactory, + DataAssemblyController, DataAssemblyControllerFactory, ServiceState } from './dataAssembly'; import {Procedure, Service, ServiceEvents} from './serviceSet'; @@ -136,52 +135,64 @@ export class PEAController extends (EventEmitter as new() => PEAEmitter) { public readonly name: string; public services: Service[] = []; - public variables: DataAssemblyController[] = []; + public dataAssemblies: DataAssemblyController[] = []; // PEAController is protected and can't be deleted by the user - public protected = false; + private protected = false; public connection: OpcUaConnection; private readonly description: string; private readonly hmiUrl: string; private readonly logger: Category; - constructor(options: PEAOptions, protectedPEA = false) { + constructor(options: PEAOptions) { super(); + this.logger = catPEA; + this.options = options; this.pimadIdentifier = options.pimadIdentifier; this.name = options.name; this.id = options.id; this.description = options.description || ''; - this.protected = protectedPEA; this.hmiUrl = options.hmiUrl || ''; - this.connection = new OpcUaConnection(this.id, options.opcuaServerUrl, options.username, options.password) + this.connection = new OpcUaConnection() .on('connected', () => this.emit('connected')) .on('disconnected', () => this.emit('disconnected')); - this.logger = catPEA; + this.connection.initialize({endpoint: options.opcuaServerUrl}); + if (options.services) { this.services = options.services.map((serviceOpts: ServiceOptions) => new Service(serviceOpts, this.connection, this.id)); } - if (options) { - this.variables = options.dataAssemblies - .map((variableOptions: DataAssemblyOptions) => - DataAssemblyControllerFactory.create(variableOptions, this.connection) + if (options.dataAssemblies) { + this.dataAssemblies = options.dataAssemblies + .map((dataAssemblyOptions: DataAssemblyOptions) => + DataAssemblyControllerFactory.create(dataAssemblyOptions, this.connection) ); } } + public isProtected(): boolean { + return this.protected; + } + + set protection(value: boolean) { + this.logger.info(`Set Protection to ${value}`); + this.protected = value; + } + /** * recreate OPCUAConnection and dAControllers with new settings. - * @param options {ServerSettingsOptions} + * @param options {OpcUaConnectionSettings} */ - public updateConnection(options: ServerSettingsOptions){ - this.connection = new OpcUaConnection(this.id, options.serverUrl, options.username, options.password) + public updateConnection(options: OpcUaConnectionSettings): void{ + this.connection = new OpcUaConnection() .on('connected', () => this.emit('connected')) .on('disconnected', () => this.emit('disconnected')); + this.connection.initialize(options); // rebuild dAControllers with new connection - this.variables = this.options.dataAssemblies + this.dataAssemblies = this.options.dataAssemblies .map((variableOptions: DataAssemblyOptions) => DataAssemblyControllerFactory.create(variableOptions, this.connection) ); @@ -190,7 +201,7 @@ export class PEAController extends (EventEmitter as new() => PEAEmitter) { } public getService(serviceName: string): Service { - const service = this.services.find((s) => s.name === serviceName); + const service = this.services.find((service) => service.name === serviceName); if (service) { return service; } else if (!serviceName && this.services.length === 1) { @@ -206,15 +217,15 @@ export class PEAController extends (EventEmitter as new() => PEAEmitter) { } /** - * This function connects the PEAController to the OPCUAServer and subscribes to all Variables and Services + * This function connects the PEAController to the OPCUAServer and subscribes to all DataAssemblies and Services */ public async connectAndSubscribe(): Promise { await this.connection.connect(); - const pv = this.subscribeToAllVariables(); + const pv = this.subscribeToAllDataAssemblies(); const pa = this.subscribeToAllServices(); - await this.connection.startListening(); + await this.connection.startMonitoring(); await Promise.all([pv,pa]); - this.logger.info(`[${this.id}] Successfully subscribed to ${this.connection.monitoredItemSize()} assemblies`); + this.logger.info(`[${this.id}] Successfully subscribed to ${this.connection.monitoredNodesCount()} Nodes`); } /** @@ -240,7 +251,7 @@ export class PEAController extends (EventEmitter as new() => PEAEmitter) { id: this.id, pimadIdentifier: this.pimadIdentifier, description: this.description, - endpoint: this.connection.endpoint, + endpoint: this.connection.endpointUrl, hmiUrl: this.hmiUrl, connected: this.isConnected(), services: this.getServiceStates(), @@ -250,15 +261,23 @@ export class PEAController extends (EventEmitter as new() => PEAEmitter) { } /** - * is POL connected to PEAController + * is PEAController connected to actual PEA * @returns {boolean} */ public isConnected(): boolean { return this.connection.isConnected(); } + /** + * get current connection settings of PEAController + */ + public getCurrentConnectionSettings(): object { + return this.connection.settingsInfo; + } + + public listenToDataAssembly(dataAssemblyName: string, variableName: string): DataItemEmitter { - const dataAssembly: DataAssemblyController | undefined = this.variables.find( + const dataAssembly: DataAssemblyController | undefined = this.dataAssemblies.find( (variable) => variable.name === dataAssemblyName); if (!dataAssembly) { throw new Error(`ProcessValue ${dataAssemblyName} is not specified for PEA ${this.id}`); @@ -269,22 +288,13 @@ export class PEAController extends (EventEmitter as new() => PEAEmitter) { } /** - * Abort all services in PEAController - */ - public abort(): Promise { - this.logger.info(`[${this.id}] Abort all services`); - const tasks = this.services.map((service) => service.executeCommandAndWaitForStateChange(ServiceCommand.abort)); - return Promise.all(tasks); - } - - /** - * Pause all services in PEAController which are currently running + * Pause all services in PEAController which are currently in execute state */ - public async pause(): Promise { + public async pauseAllServices(): Promise { this.logger.info(`[${this.id}] Pause all running services`); const tasks = this.services.map(async (service) => { if (service.isCommandExecutable(ServiceCommand.pause)) { - return await service.executeCommandAndWaitForStateChange(ServiceCommand.pause); + return await service.executeCommand(ServiceCommand.pause); } else { throw new Error('Command is not executable'); } @@ -295,11 +305,41 @@ export class PEAController extends (EventEmitter as new() => PEAEmitter) { /** * Resume all services in PEAController which are currently paused */ - public async resume(): Promise { + public async resumeAllServices(): Promise { this.logger.info(`[${this.id}] Resume all paused services`); const tasks = this.services.map(async (service) => { if (service.isCommandExecutable(ServiceCommand.resume)) { - return await service.executeCommandAndWaitForStateChange(ServiceCommand.resume); + return await service.executeCommand(ServiceCommand.resume); + } else { + throw new Error('Command is not executable'); + } + }); + return await Promise.all(tasks); + } + + /** + * Hold all services in PEAController which are currently in execute state + */ + public async holdAllServices(): Promise { + this.logger.info(`[${this.id}] Hold all executed services`); + const tasks = this.services.map(async (service) => { + if (service.isCommandExecutable(ServiceCommand.hold)) { + return await service.executeCommand(ServiceCommand.hold); + } else { + throw new Error('Command is not executable'); + } + }); + return await Promise.all(tasks); + } + + /** + * Unhold all services in PEAController which are currently in held state + */ + public async unholdAllServices(): Promise { + this.logger.info(`[${this.id}] Resume all held services`); + const tasks = this.services.map(async (service) => { + if (service.isCommandExecutable(ServiceCommand.unhold)) { + return await service.executeCommand(ServiceCommand.unhold); } else { throw new Error('Command is not executable'); } @@ -307,14 +347,23 @@ export class PEAController extends (EventEmitter as new() => PEAEmitter) { return await Promise.all(tasks); } + /** + * Abort all services in PEAController + */ + public abortAllServices(): Promise { + this.logger.info(`[${this.id}] Abort all services`); + const tasks = this.services.map((service) => service.executeCommand(ServiceCommand.abort)); + return Promise.all(tasks); + } + /** * Stop all non-idle services in PEAController */ - public async stop(): Promise { + public async stopAllServices(): Promise { this.logger.info(`[${this.id}] Stop all non-idle services`); const tasks = this.services.map(async (service) => { if (service.isCommandExecutable(ServiceCommand.stop)) { - return await service.executeCommandAndWaitForStateChange(ServiceCommand.stop); + return await service.executeCommand(ServiceCommand.stop); } else { throw new Error('Command is not executable'); } @@ -325,38 +374,39 @@ export class PEAController extends (EventEmitter as new() => PEAEmitter) { /** * Reset all services in PEAController */ - public reset(): Promise { + public resetAllServices(): Promise { this.logger.info(`[${this.id}] Reset all services`); - const tasks = this.services.map((service) => service.executeCommandAndWaitForStateChange(ServiceCommand.reset)); + const tasks = this.services.map((service) => service.executeCommand(ServiceCommand.reset)); return Promise.all(tasks); } - private subscribeToAllVariables(): Promise { + + private subscribeToAllDataAssemblies(): Promise { return Promise.all( - this.variables.map((variable: DataAssemblyController) => { - this.logger.info(`[${this.id}] subscribe to process variable ${variable.name}`); - variable.on('V', (data: OpcUaDataItem) => { - this.logger.info(`[${this.id}] variable changed: ${JSON.stringify(variable.toJson())}`); + this.dataAssemblies.map((dataAssemblyController: DataAssemblyController) => { + this.logger.info(`[${this.id}] subscribe to DataAssembly ${dataAssemblyController.name}`); + dataAssemblyController.on('V', (data: OpcUaDataItem) => { + this.logger.info(`[${this.id}] variable changed: ${JSON.stringify(dataAssemblyController.toJson())}`); const entry: VariableChange = { timestampPOL: new Date(), - timestampPEA: data.timestamp, + timestampPEA: data.timestamp!, pea: this.id, - variable: variable.name, + variable: dataAssemblyController.name, value: data.value, - unit: variable.toJson().unit! + unit: dataAssemblyController.toJson().unit! }; this.emit('variableChanged', entry); }); - return variable.subscribe(); + return dataAssemblyController.subscribe(); }) ); } private unsubscribeFromAllVariables(): void { - this.variables.forEach((variable: DataAssemblyController) => variable.unsubscribe()); + this.dataAssemblies.forEach((variable: DataAssemblyController) => variable.unsubscribe()); } - private subscribeToAllServices(): Promise[]>{ + private subscribeToAllServices(): Promise[]>{ return Promise.all(this.services.map((service) => { service.eventEmitter .on('commandExecuted', (data) => { diff --git a/src/modularPlantManager/pea/PEA_POL_Lifecycle.puml b/src/modularPlantManager/pea/PEA_POL_Lifecycle.puml index f0021699..ad27cbf2 100644 --- a/src/modularPlantManager/pea/PEA_POL_Lifecycle.puml +++ b/src/modularPlantManager/pea/PEA_POL_Lifecycle.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml skinparam monochrome true diff --git a/src/modularPlantManager/pea/PiMAdParser/PiMAdParser.puml b/src/modularPlantManager/pea/PiMAdParser/PiMAdParser.puml deleted file mode 100644 index 459a22e6..00000000 --- a/src/modularPlantManager/pea/PiMAdParser/PiMAdParser.puml +++ /dev/null @@ -1,19 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram -!include ../../ModularPlantManager.puml -class PiMAdParser{ -+ {static} createPEAOptions(pimadIdentifier: string, manager: ModularPlantManager): Promise -- {static} createOptionsArrays(peaModel: PEAModel): PiMAdParserInterface -- {static} createDataAssemblyOptionsArray(dataAssemblyModels: DataAssemblyModel[]): DataAssemblyOptions[] -- {static} createServiceOptionsArray(serviceModels: ServiceModel[]): ServiceOptions[] -- {static} createProcedureOptionsArray(procedureModels: ProcedureModel[]): ProcedureOptions[] -- {static} createDataAssemblyOptions(dataAssemblyModel: DataAssemblyModel): DataAssemblyOptions -} -interface PEAModel -interface PEAOptions - -ModularPlantManager <..> PiMAdParser: <> - -PiMAdParser ..>PEAModel : <> -PiMAdParser ..>PEAOptions : <> -@enduml diff --git a/src/modularPlantManager/pea/PiMAdParser/PiMAdParserSequence.puml b/src/modularPlantManager/pea/PiMAdParser/PiMAdParserSequence.puml deleted file mode 100644 index a6949313..00000000 --- a/src/modularPlantManager/pea/PiMAdParser/PiMAdParserSequence.puml +++ /dev/null @@ -1,18 +0,0 @@ -@startuml - -skinparam monochrome false - -participant ModularPlantManager -participant PiMadParser - -ModularPlantManager -> PiMadParser: PiMAdParser.createPEAOptions(...) - -PiMadParser ->ModularPlantManager: getPEAfromPimadPool() -ModularPlantManager->PiMadParser: PEAModel -PiMadParser->PiMadParser: createOptionsArrays using PEAModel -PiMadParser->ModularPlantManager: generateUniqueIdentifier() -ModularPlantManager->PiMadParser: uuidv4 -PiMadParser->PiMadParser: create PEAOptions -PiMadParser ->ModularPlantManager: PEAOptions - -@enduml diff --git a/src/modularPlantManager/pea/SequenceProcessValueExchange.puml b/src/modularPlantManager/pea/SequenceProcessValueExchange.puml index 23712054..a6ad4725 100644 --- a/src/modularPlantManager/pea/SequenceProcessValueExchange.puml +++ b/src/modularPlantManager/pea/SequenceProcessValueExchange.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml skinparam monochrome false diff --git a/src/modularPlantManager/pea/_assets/AML/Manifest.aml b/src/modularPlantManager/pea/_assets/AML/Manifest.aml deleted file mode 100644 index a8a6e995..00000000 --- a/src/modularPlantManager/pea/_assets/AML/Manifest.aml +++ /dev/null @@ -1,14213 +0,0 @@ - - - - - - MTP-Plugin - e!Cockpit - WAGO Kontakttechnik GmbH & Co. KG - https://www.wago.com/global - 0.1.264.0 - - 2019-07-05T15:44:23+02:00 - E:\MoKA\Mixing\Mixing.ecp - - - - - - - - - - - - - 1.1.0 - - - - - - Aktoren.V3310 - - - Zuflussventil B1300 - - - 8769fbce-831d-46aa-8e5b-ea078ea4770a - - - 7bd95706-0e68-4acb-be61-78feaaebee85 - - - dbbe562b-8463-4d3d-bb09-db1c063e31a2 - - - 4e7b5377-8419-46d6-b597-c278de950a2d - - - 79a48861-b406-47f4-bc61-d44c9ff86f04 - - - 8eb58105-38a1-4cf4-9b1a-640d68e6f822 - - - 86bc6cb3-c2ca-4ce5-9971-666bb6bf2534 - - - 52dd92a3-af1f-40fd-a4f3-781eec9ec139 - - - 44280e3b-4d56-4142-8e9a-0328a5f7fdfc - - - a644e42b-c6be-44f7-a91e-f0e6b45662af - - - 1153811a-f006-41fb-92f8-cf22e406b0c1 - - - 56f7775d-4abb-4b90-aabd-5d2c6a5b7ff7 - - - c9234f72-4cd4-4ace-8d44-621174d6e83b - - - feff12ff-5d8d-429f-8254-db04f2bb9919 - - - - - - Aktoren.V3210 - - - Zuflussventil B1200 - - - b933001a-9657-4fcd-9a8d-8c7fea998ee2 - - - dc157e20-d808-4591-b2aa-c5d996976d08 - - - 7a90c371-48f8-4823-980f-1ffde7b195f5 - - - cfbf2562-6d7e-4844-841a-36f6e4dcb912 - - - 0a2c102d-4d68-4536-ba91-ec720fb13ea5 - - - 59acaa72-7c80-4296-b5ab-5449130524e1 - - - e4f23ec9-543e-49be-8248-66ef73bb5911 - - - fcba03a3-82fa-4868-859f-d007f99e6930 - - - 8369c8f3-9ca6-4613-a477-78b67b741796 - - - 4857564a-9359-4571-8012-0387e4a753b3 - - - 5269e69f-5454-469f-bdc4-198fff7fccdf - - - 67b8c5b7-dfb4-4f7a-8d13-a4e9675998e9 - - - 966e723b-79c0-4353-8d7a-190226e87d65 - - - d590a7be-4d29-4298-abff-702f102c89d0 - - - - - - Aktoren.V3110 - - - Zuflussventil B1100 - - - 63dfa226-1369-412c-ae6a-7677720648f3 - - - c739a66f-d6dd-4320-92c9-e71d73e2dda0 - - - 2a53c66a-4962-48cc-a3e8-08cb7124b494 - - - 02398865-76c6-408d-9099-96bf149bc4be - - - d72d3281-a711-431b-988a-c615fc38ecde - - - 2f31db65-a029-4317-9aad-85a6296f58f7 - - - c1228d50-814d-49bc-bae1-3ec700533a03 - - - 57518e63-99d6-4471-8608-a36124d96f28 - - - 177797ec-a424-40b5-b9ff-668dc578b076 - - - d1e5690a-0f96-4d37-af59-14c260449dd6 - - - 06e58d57-320d-4832-9975-562c36419dcf - - - 0c0e9a07-fb8f-4d39-bee3-772e1af4b5c1 - - - 07fa9c63-78ac-4ab7-a3b8-0c2529782377 - - - 2d48e9f6-49d3-4e6f-98f3-65c4174fd665 - - - - - - Aktoren.V3320 - - - Abflussventil B1300 - - - 363fac10-abfb-4be5-9e6e-a37874cbc7d4 - - - 759d2562-bcbd-493f-9888-7e42757010c4 - - - f5fac335-e377-49c8-8f14-636092df2a86 - - - 861224e3-0dc7-4d41-b95b-f2822a8a0e9b - - - 898634e4-ea79-4382-8230-456eb895ad5b - - - 42287ccd-7b78-4245-811c-ed2825713e58 - - - d0edd679-b8bb-41d9-8e81-2ef46b575446 - - - b8ec650e-8d1b-44e2-862b-956573f1788f - - - b3bad014-f9a7-4a6c-95ef-f40f60d4390a - - - 0899e638-542d-41cf-916d-996dbf1a8a7e - - - 22374a3e-30b2-4132-a66e-865f3cf6e609 - - - eb960bb6-aedb-4fde-a5af-fd2f7d23714c - - - df14ef76-ad7a-4ea2-bf8c-dcbf66df68e8 - - - 534ec6b0-53a9-45e8-b26b-50b691d5fa40 - - - - - - Aktoren.V3220 - - - Abflussventil B1200 - - - 9ad82a77-aba9-4c2e-a714-fe693ba8db4b - - - 84eb7a92-8f0c-40ca-a324-f26d75976dc2 - - - ac3ed6aa-530c-43fe-9762-d917dd5854b6 - - - b55b03b8-4c7f-43d3-bb09-7a57d8932218 - - - d72e813a-cdaa-4d1d-96c5-8dca4b49f733 - - - eb928908-de96-4f8b-a5fe-fd28f8808478 - - - f5fdc2da-d540-4e13-ae14-16106d71ad23 - - - dc9a9919-61da-4233-9a3a-8047b328434f - - - 6ef7174e-5977-4929-bdf6-07f57e718a0f - - - 260610c8-7a14-4d2a-9e9f-d86f9d61a157 - - - db6f1cfd-12bc-4b40-bd1b-e802e6e358de - - - ae96b70f-ea70-47b1-9ac9-bae9245e97a4 - - - d1401475-2b9f-4059-a50f-6b0c5343853a - - - 11dd5084-5542-4524-b6af-c72f91b5488a - - - - - - Aktoren.V3120 - - - Abflussventil B1100 - - - af64e379-1ed2-4427-a93e-d9204f99eb15 - - - 836da028-e4cf-4da5-9279-339b7c5f1cf9 - - - 1a7c2574-5d9b-425d-916c-3d871cc08699 - - - ea11d15d-87f6-4a30-9cfa-fe668b97bfab - - - 37a28bac-9e93-4c13-a70f-311f7a4d2dd6 - - - 945997ab-600a-45d4-8e05-11afaf81c184 - - - e2019a80-9095-4f24-aa16-b7fad6580516 - - - 32353e46-5eca-41e8-8df3-f11324d5ee29 - - - 695383c6-68e3-427f-a895-9ef8c7271010 - - - 1f9438cc-cba3-4e0a-b808-3e1cb6e41f21 - - - 0e12da8a-9e86-4c5d-b51a-96cb31ac8a37 - - - ed7c8ae3-f3b7-4d1e-9401-ae90858708d3 - - - ee6f944c-ba53-4f33-a400-46415a808423 - - - 0ddbeb2a-dc01-41b4-9bd2-0123abbb7353 - - - - - - Aktoren.V3410 - - - Rückflussventil - - - 91c11665-74f3-44e9-aa1b-9d827c7e7e46 - - - f60f9a96-dee9-4a72-b656-3c6ec134f2fd - - - af1e50ef-e14c-4da1-97cb-0008d3fa3c8a - - - 17fba07c-195d-4f6c-88ca-820bf9de073a - - - 6385ef2c-b6ef-47bb-8594-82581fadff20 - - - a526d820-5656-4d24-b8e9-e3167a3ea9fd - - - add1a5b7-7a6b-4641-9add-cb6aeb5df59d - - - e08a177a-04ab-4917-8964-20e4bff523aa - - - f44c3f99-63e6-4c61-87de-35183cf65730 - - - 6a2db748-4d31-428c-ac55-545954d32a88 - - - 06e9eae6-31d1-452a-a069-a255840a8eaa - - - a1b9dc1c-ec4e-444a-a433-89b8fb023e76 - - - ad539f50-7c91-42d1-9c6f-e166692719bb - - - 030c3728-26d5-44b1-a664-e36ab4891f52 - - - - - - Aktoren.V3420 - - - Abflussventil - - - c854bb7b-391e-4ffc-bd1d-d82888333a59 - - - 19f94177-2e17-4102-b896-b1dc4c27a87d - - - 63e33a2c-4aad-4b12-833a-1233098a4cb5 - - - c639b610-5818-46cc-b590-5f1a8f29366a - - - ac355383-b6a5-4e3d-9f57-560c486ad1d8 - - - 58e6dd5a-c916-4863-9884-cf7e66649929 - - - c22a6b50-a06d-4a62-bc62-6afe065a7768 - - - 1b687378-c4ff-48e6-9b10-b7ed024b0c89 - - - 1695f5d6-ccbb-4175-b932-7a1eb1f75f32 - - - d3362976-7f31-4be1-bfff-e8e9dc3be1b1 - - - 157b3d60-8f0a-45e7-bfab-f67ea16bead3 - - - 5cc7df6d-e6e8-4628-8151-cab4e7e02de5 - - - 463f5014-ed1e-4380-87f0-8e05e12be006 - - - cdffd550-b3a8-4925-b8cc-8487cf4a2039 - - - - - - Aktoren.P2010 - - - Pumpe Mischbehälter befüllen - - - c4a8600b-06d4-410f-ae90-15330cc375a3 - - - 2fffd469-b649-4c08-84f3-b88d940165be - - - 2e70e046-5100-4d70-a6f8-ec7aa0ba17df - - - 631b9965-7362-44a3-b0fb-cd2e641b6988 - - - a8eb55d3-1139-41ce-bc0c-c05565b5e957 - - - 7607882e-dab9-4bb2-80d4-3bd0672633b7 - - - fcc24d59-f869-4ccd-a1fb-fefe58dd3927 - - - cdfe1931-ec9e-4588-8e8f-edef6902609d - - - 3318809b-c5d9-46c7-a016-fa0dfc8c020c - - - 61e1c870-91da-49da-af3a-27493bfb8bd1 - - - 14df6f84-1c17-40d7-9f41-3ca619d2a021 - - - 26ba7200-cc5c-44b7-8f2b-1395456c3a15 - - - ced92285-7a15-4b1f-a5ee-6f968f8931ee - - - f23c4d2f-9051-46f7-a26f-a744838bd8c0 - - - cbc67774-a330-4b91-8804-efd09add46b1 - - - feda30d0-9d23-4e4d-bbd0-3b87cf835a36 - - - 2894c175-64a7-4756-b824-bf45ac0e2cfe - - - 9552f64d-d96f-4695-a6b2-b53997b2b330 - - - e42c0a07-b4ee-4e1b-bdd5-21a64acbdab2 - - - 008468ff-5d4b-4ecc-a12f-a1cf4327de86 - - - fd19b139-a2e8-4bbb-8950-db49d81c7b5d - - - 4a82e63b-527f-467b-a9f7-de4feea881f8 - - - 8eefd1dd-d68b-4e16-b3e3-0175bb8dd4ae - - - c485d366-db8e-435f-a4eb-02a205eb9c32 - - - 970f2b5a-8b15-46de-9857-8482f9e05647 - - - a48cddba-3676-4b2c-b86b-43b62a9d3d5f - - - - - - Aktoren.P2020 - - - Pumpe Mischbehälter entleeren - - - 552dfe2e-be50-488a-a446-5d3491cd3e2b - - - da94f88b-e47f-41ce-a6c3-221bdae5fa97 - - - 29515b8c-d23e-4a6a-a2bc-d6fec33d70da - - - 93b7aadc-ff68-4f80-8ca9-4963a547792f - - - 5d58ad3b-56a8-4030-958d-862c93f0f9e6 - - - a530b00b-e4e9-4d4f-b1c3-98e221469b63 - - - c677fda5-53f1-4ddf-965c-d3cf01f5d095 - - - 1b4a7c13-d628-4ba0-add4-c4160bb52673 - - - 7d36118f-7fc1-4f4d-a2a6-43528f853ed7 - - - 77343d64-e180-4c1b-ba50-ba84237f407d - - - 9fa162c7-c7a0-467f-b493-f826186f8c0e - - - 12fb49e7-ab5f-424c-9674-3db4540ee484 - - - 6338646f-abbd-4d94-9a00-01327a2a45b5 - - - 065a8917-5d28-43a8-bcdc-c502ecee4ccd - - - 21598dfd-f84a-428b-9e41-bd320d0a296e - - - 64101484-4572-4a66-a78b-5d7f4a5b3a63 - - - a59d3bba-4ad1-4adb-9d53-d99132e1da71 - - - 2560e11c-ab14-4991-b35e-c0630b2db806 - - - 06525e1c-4ea0-4db4-90f0-641fdee289c6 - - - fcf1b718-7be4-4aed-8939-6ab76d1ab409 - - - 56d65077-b4ba-4fb6-abf8-c22fc06fb6bb - - - 13ef84bb-5e91-4cf1-82b4-53d028452690 - - - 675a0aa8-d895-416a-85d7-0467435c780e - - - c0a985c2-bf34-47c0-8761-32dc00660a11 - - - 61ab55a5-95f3-4340-afe9-9d9dc406d693 - - - 188826e1-4199-4d80-80d7-4ae0e0a39902 - - - - - - Sensoren.LIC1402 - - - Füllstand Mischbehälter B1400 - - - 2b1f65db-f400-44ea-95df-e5c906f4b905 - - - 208.95 - - - -94.21 - - - 1038 - - - 71c0851e-8682-4bf4-84e1-028822e0733b - - - d61e790d-e2f6-4281-bfe1-735d1e3a62e0 - - - 776b9026-2a7a-441a-9cc9-2443539ac168 - - - - - - Sensoren.FI2012 - - - Durchflussmessung am Mischbehälter-Eingang - - - 56767b92-7dee-4572-a17c-89cddaa77962 - - - 0 - - - 7.5 - - - 1563 - - - 8dbb1ce9-9c8c-4a50-bd01-e8ec3ffbee39 - - - 04877309-3270-4eb8-a9ab-de068b816a83 - - - 60a6162b-2363-4b37-82b2-de1d18842d13 - - - - - - Sensoren.FI2022 - - - Durchflussmessung am Mischbehälter-Ausgang - - - 77aed452-a0a1-4d4e-ac50-ef0675f36cb3 - - - 0 - - - 7.5 - - - 1563 - - - 8267d8a8-fbab-44e3-84e6-677de38c2b36 - - - d4e52dbc-125e-4188-bc89-f685287efc69 - - - e1fa5dfb-3fa8-4d1c-8af0-d9e1bd425ac1 - - - - - - Sensoren.FI3431 - - - Durchflussmessung am Modul-Ausgang - - - 0cdd3a42-5115-4559-b857-1927b24f4293 - - - 0 - - - 7.5 - - - 1563 - - - 5f988245-3740-4c75-b29e-839824014244 - - - df7a675d-25c2-4193-b057-adb26f80d2b4 - - - 50778c1a-ee62-4747-90fb-6462dc42bbd1 - - - - - - Sensoren.L1102 - - - Füllstand B1100 Maximum - - - baeb4249-3e8a-4af5-bac1-3e000c6530a4 - - - OK - - - Voll - - - cfd5aec3-cf4a-41d7-a520-d1a6e4ac2062 - - - 805ea693-944b-4ecb-bb6c-bd5d700a9b50 - - - 938fa8fe-2faa-44f6-9f00-5687ab8c41be - - - - - - Sensoren.L1103 - - - Füllstand B1100 Minimum - - - a9fbdb8d-a537-4434-9950-0d68a01968b1 - - - Leer - - - OK - - - d57ae1c2-1fc1-4167-9b77-ddde0a20051c - - - 1c7e3226-f49b-40b0-8843-67626365802b - - - bcded1b9-0b80-4430-bec6-3d675f25867f - - - - - - Sensoren.L1101 - - - Füllstandsalarm B1100 voll - - - 937529f4-50d8-46c1-be6c-e0c26215130f - - - OK - - - Voll - - - a8de3783-68bb-4e9c-b476-7b57bdde4490 - - - 30bbac5c-0fd8-44d3-849b-98b58380c5db - - - bfaebec9-3313-438a-95ec-0b0e1eeffac0 - - - - - - Sensoren.L1203 - - - Füllstand B1200 Minimum - - - 0adeeb3c-bb67-434b-987c-9c4c9ca10f94 - - - Leer - - - OK - - - c88a10a3-976f-4ccd-a54f-a8f68c806818 - - - 8d517531-92a6-4dcc-9a50-a9c13492440c - - - 1bc12469-362e-47c6-9a63-2dfe7d4728b0 - - - - - - Sensoren.L1202 - - - Füllstand B1200 Maximum - - - 61e05982-0f71-4f53-a64e-2275fea1be7b - - - OK - - - Voll - - - 57fa2479-54a8-4b72-b1c2-bb9be60e352d - - - 1ef05c03-805d-4e45-9f2d-deb41e50af1d - - - 68e09d56-525b-43b9-9cb4-63fa266cf05f - - - - - - Sensoren.L1201 - - - Füllstandsalarm B1200 voll - - - 41e5515c-8d39-441e-ac00-8df614040422 - - - OK - - - Voll - - - b1228d9f-f385-4124-9b31-c87e789e241f - - - 7a8ea76e-0ae3-4338-bc6f-085a5cd5998f - - - 80c69b3b-a5de-481d-bec0-342ada9c1e6d - - - - - - Sensoren.L1303 - - - Füllstand B1300 Minimum - - - 92b2a0d6-ffa5-4f7f-8d02-c17e019c3b19 - - - Leer - - - OK - - - 5a2e1dfa-cf44-43ca-a514-f60fb7589a6c - - - e3667a52-be2e-4475-9049-bbb730950bc3 - - - b04d2699-dfe5-4810-adbb-ad3f58cdf896 - - - - - - Sensoren.L1302 - - - Füllstand B1300 Maximum - - - ba833d6a-f9e1-4165-88de-0b4b5e935b10 - - - OK - - - Voll - - - b4b30f7c-2af1-40c6-889d-e870ddee6dbc - - - e6ac9473-fcd1-4212-a91d-04fb484f7496 - - - b5a71070-979d-4efd-a8ba-beaeb377fe8e - - - - - - Sensoren.L1301 - - - Füllstandsalarm B1300 voll - - - ff06ce7c-20d4-4450-a696-795a4306b8dd - - - OK - - - Voll - - - 73e5c86d-dc94-4a88-b22e-98b9f0c934bb - - - 517deeca-bb44-41c5-aa48-4c939bd110de - - - be100efd-abc8-4d1a-9804-122615c630db - - - - - - Sensoren.L1401 - - - Füllstandsalarm B1400 voll - - - de88cad5-a877-4650-b312-dd5113f25b5f - - - OK - - - Voll - - - d010c653-bb0c-47c2-ad15-1f48247b8e75 - - - e6432337-90ba-445d-967b-0285f6ea19d6 - - - f53bb0c3-6626-4264-950b-e8167aaa78f4 - - - - - - Dienste.DosingFromB1100 - - - 2ba1cc74-6180-499d-9b5c-a6250926d9b7 - - - 14f012b7-184f-4d7a-83d9-3c0ecfd5fc52 - - - 1ff08569-f6d7-4fc6-8b31-308ca61295c8 - - - c03ae75d-50a6-4ca6-8826-8fd1acd18d4d - - - 4ec5b7f7-e857-4d1d-8078-be5c4d4f3d11 - - - d3f72a75-4b1e-4e6e-9574-cfd93e2927c6 - - - 80ae29ff-5494-4241-b0ad-ab5ff8f6adbe - - - 4f8ac5f3-228a-495a-a89b-f7de8087b83e - - - b1495d7b-e48e-4261-9ed2-4348929e5df8 - - - e0d7e658-c518-4453-ae4d-dcb2d779e3bc - - - 2309e8c3-4218-44aa-860f-8561a29cd017 - - - fea7199d-af5a-492c-ba07-869f03d865fc - - - 1693438e-529c-48fb-a197-a29320849006 - - - 7b9f6a11-580b-4e53-86b5-fb168ff45ad5 - - - b4346ffd-1b2e-4362-a968-68b991de61b7 - - - - - - Dienste.DosingFromB1200 - - - 52473adf-d4ac-4368-8e41-c13c9479aceb - - - 9baf4f89-b3ae-4dcf-a577-5fc1cbdae004 - - - 69257ba8-3af5-4889-97e0-74ef1dcaaaab - - - ef28e4d4-e554-4504-b9d8-b21797879a7e - - - a7738625-9fac-4d04-b0cc-6d38a84ec611 - - - 26dc53a6-62b2-4d8e-b85e-f4110c8261c2 - - - 08d59bd5-7f50-49e0-980d-9f56620c1f3f - - - 99156083-75cf-443e-b6fe-72345e461586 - - - 6e25642f-6921-4fa3-b6cb-a604c3a18ab0 - - - 356ebcfc-3d19-4af9-b131-05cd19d22f67 - - - 9b7841d9-f38d-4cb1-86f0-72f660778415 - - - ee1fd501-3567-45f6-8da4-80c41b0b9aa0 - - - 2374d834-a19d-4b0f-aca2-f5400974e840 - - - 7b1121c0-ffaf-4fc3-8ee5-c475fb77dc5b - - - 12141948-0599-41fe-bf40-2d1288b58a8f - - - - - - Dienste.DosingFromB1300 - - - bf80a5fc-47ca-46a4-be91-1f0037f5ba0a - - - 6937f46c-fc58-428b-b81d-29a107ea90ef - - - a6c3f447-ece7-46ab-b5be-4628b11aa43e - - - ec3b9b87-a5b6-4222-be20-3bbb41953476 - - - 9e0a4122-0501-4410-8f63-e5faf2d97534 - - - 631489cb-9403-4be1-a549-8d08c03c5f18 - - - f01d2729-5ad9-4e6c-9829-3b7758da23fe - - - 69923765-d3da-4488-bd4a-072cf34899a5 - - - 3c562faf-a494-4f27-9f59-470ae6cf85ed - - - caf14e49-8e66-4c26-a74b-3d3ce4819522 - - - 35748df1-dcf9-43e2-9e5b-44a34f2716d2 - - - 2c2020ee-6a76-4f41-8350-729a68d47d30 - - - 8a6c50ff-7164-41d4-b5d2-c65f4d3ebb9c - - - 1355f9f2-18b6-46b9-888f-7038938270b1 - - - 5490e15b-65d9-46bc-832e-a7d3dcd7a93b - - - - - - Dienste.FeedingB1100 - - - 7667bc5d-9ccb-4fd7-b92d-19619f0b23a0 - - - bfb57a06-4434-4465-aa4d-181fc4ae5393 - - - 02752e09-2d5e-4e49-a07a-8f6413104acd - - - b50dac32-2382-402a-b8ca-38adcfaee33d - - - ea5ebf5e-6993-4f14-9e03-3591d381eae1 - - - 515a1476-5d5c-4355-8471-4dc9e5edc441 - - - 52ade01e-83a3-4223-8732-029fd17cf646 - - - 79a4dbd9-d89d-42f1-964e-6765ab1f1552 - - - f2be6426-ffa0-494c-9114-f80f51fa0d85 - - - 411ebc7a-ccb1-4e9f-8599-81fc293073b8 - - - 95e3173c-d164-4229-8078-0bf09a59a38a - - - 9d2c7832-a0da-4d38-b804-a8958f398057 - - - 473360c9-e586-4bc3-9d51-ea8b450175d5 - - - 61cf60a7-773f-4e81-9b83-55d6b93ed3fe - - - 950612a0-42b1-4eab-88cc-94460e748e74 - - - - - - Dienste.FeedingB1200 - - - b1671ae4-6e1e-42b4-a055-d062fee7e3a9 - - - 3327324a-9aed-4f90-997a-25273deb8bc5 - - - 6aa513b9-dade-46d4-84a1-af174d61dda3 - - - f67d74c5-e3e2-485f-a5e9-1d7223923cb4 - - - 1c6df0ca-219c-4bfa-8492-33ebb4e3c293 - - - e4e0b838-ab51-4887-84d6-7c1e4870cb27 - - - 2c04b06d-3edc-431e-95a2-c37d321a773f - - - c8caa935-4672-4115-aa4a-bd2cd3403b5c - - - d6f2c3f1-c880-4722-8d1b-fc36cb5dba31 - - - 0b7dbe54-cdf9-41eb-b0d7-7edb29ed6e3b - - - fa2ac17d-cf7c-402f-939f-952234b6f787 - - - b10d00b8-28b4-4fe5-b989-71a649d253f0 - - - 0ec8fdcf-2ff9-4695-a6a8-bf97622adf72 - - - 78086cf8-ab32-4b41-b11c-5dda279d44b7 - - - 3322ac52-f55c-4efd-a5b7-ef0f25dfc10a - - - - - - Dienste.FeedingB1300 - - - 72687bf5-ac40-440a-869d-31b0f7c7b320 - - - 5a63134a-5e8b-4088-9875-6dd426e27f21 - - - 1085ca16-3d0c-4d42-b1fd-b8772849cc75 - - - aa3be80a-88f2-439c-a47e-265efb6abf0f - - - 0247cf15-eabd-4bd2-b04d-73c3946bbf45 - - - 8d6cad55-e1e8-4ef9-a459-2d33a6ae88e9 - - - 1c717d04-f6af-4889-9b3e-3eaf2c37ec22 - - - 6a86e4f5-f76f-48a1-8eef-2a9c78c2a806 - - - a0e67f7c-05f8-4a3e-905c-312fef2679c4 - - - 5e514cfc-6930-4f40-9060-420263b1f96a - - - 8a473637-a2df-4288-9f62-a6582b16a71e - - - 73846097-1f0a-4e02-b1ca-9958f7c84271 - - - b9dfd668-532f-445c-bdca-c867de00d72f - - - 935fd8da-f331-4253-8458-b02707797044 - - - ef0de31f-439f-4593-b808-e17b33ce8088 - - - - - - Dienste.FillbackToB1100 - - - f3da394c-9ddd-45be-b163-ca39979b829c - - - 494cbfbe-4762-47d6-a5ff-1f9024331533 - - - bd349188-74e9-41ce-8a4e-dec73383db8b - - - 1b57818c-d665-485f-bb7c-cbfd61b391ae - - - 0d537dd9-3056-45b8-b054-dd242174821e - - - a9bbeee6-0d9d-450f-a347-a438235cf67c - - - ee1f56d0-c6c4-4baf-a2bc-1c876fe3bd25 - - - fc517931-eda7-40d8-96e6-9bcf5823acbe - - - 37527f8a-ac59-4e9e-8f2e-57fe5babb8e9 - - - cb899573-e500-4398-9235-0d8e51ee9727 - - - 94da7217-4708-4058-8275-2ca254927c5e - - - cb8082c3-0110-43e7-b79b-25e06d86c4ec - - - f0128782-fcf4-4376-8dd4-463cefde8fc4 - - - 3ed01499-223e-40f6-b22b-275cf6f51f07 - - - 84804143-f71a-49d6-aa6e-4283830bb405 - - - - - - Dienste.FillbackToB1200 - - - d993b26b-6e0e-4d44-b788-273ef4c41e4f - - - 96ed462e-2948-4cd7-b94e-fba6571c835d - - - 4e3cc433-bd07-43fc-b4d0-c08423e26a4c - - - 8ce971c3-1409-4740-916b-5c28439616ca - - - 298b13f4-e439-4d17-94b0-17562feff1fe - - - ce256a1a-68a5-4026-9d28-4cb568adbf9a - - - ca933d36-02ae-4b08-ad09-174deaa3f87c - - - 230bdd14-3b6d-40c1-aa97-b47b7eb1a345 - - - b9b0fbb9-b66b-49d3-9e99-7f4ac2489735 - - - 3fac808f-de36-4273-86ca-4646c670ba09 - - - 1caa8382-d738-49f5-bb97-b6c882e32615 - - - b1b41483-c9e5-4a5d-b5fc-1a02237275ce - - - 29b50424-3177-4640-ae1e-3deb6f79c98c - - - 3e525fdd-0c03-45aa-9e3c-1483d6f02d5e - - - 20a01532-0b74-4878-a11b-b132e1874448 - - - - - - Dienste.FillbackToB1300 - - - 95914eaf-b98f-440b-a196-ce00d312ca7e - - - 0537d315-9408-4d9e-a68c-53f2bed1e213 - - - 17c3f158-55bb-41e6-8ef6-7c2ebd470800 - - - 24f20f45-e919-4351-a186-723094136522 - - - 1423f758-022f-4e73-8329-fbad3e3aa1a7 - - - 2295a03a-5182-4939-82cb-c425ef0f1c4c - - - 0c21db10-2bd6-496a-964a-034a52f41f72 - - - b71b98bf-733a-4d20-be43-9bef7fb827d0 - - - 1fb5d486-bc05-4cb2-a70c-8ce177ec8873 - - - dd9b7a47-0a57-412c-a8a4-6dd1d1ac98be - - - 2e72e470-9283-41b3-bd01-f46933c08d81 - - - 8dd1ec59-7469-4710-a781-2ad92ebf950b - - - 481530d2-3b41-4cc5-a339-09455d388f7d - - - 3901a41b-585d-49ac-89ce-958cd91e5c42 - - - ad99929b-710f-4bf9-b090-b7233d148deb - - - - - - Dienste.MixtureDosingFromB1400 - - - 38baf11e-ee70-4ce9-b35c-4b01b5e60647 - - - 2c03586b-1ecc-48eb-b86b-be021af9469c - - - beb89e22-6f85-4f8a-b6d6-4857dfe3d9bc - - - 2e93ecd4-099c-4e56-8549-5b8916355e3d - - - 807bc6d4-9034-452d-a2cb-31432822b566 - - - 125d2185-13f0-4dea-9280-a8274b9a5a30 - - - e83ac031-20a9-41c5-854d-d7562dae7099 - - - 96878197-4101-4f45-8c55-52383bb63805 - - - 45aa6c94-f512-4519-a393-9967c5416332 - - - 073c391d-c705-45a1-8714-81c45ea51faf - - - d32064cc-b8e4-4e79-bb47-184064d0a279 - - - 7c0377aa-d971-4455-8784-05c00608b93e - - - 9453bfb4-7c98-4244-8ada-155f5eb2e1e4 - - - c2ddcb81-5553-4bc7-ae07-004cd9b59b7e - - - efcf06b4-4b18-4cd5-83ef-86189912c3c0 - - - - - - Dienste.DosingFromB1100.DoseVolume - - - e9854b85-7af1-4d8b-b233-1df293421f77 - - - a59a2cee-698a-4a2f-b0c6-996b5f27d909 - - - a4508d42-e271-4060-87c5-fd9fae664e16 - - - b8c2f478-9d8c-45d4-bbe2-e161c2d618c0 - - - a410554e-1b45-4be0-8c16-6e54ff41adf2 - - - aa707cd8-fff6-4120-b3a9-8b7a729b000a - - - e2511a2f-de28-4ba1-9048-53519b99916a - - - 335a2b83-b9de-44d9-80c4-7000708196b5 - - - 29500882-2c60-46ee-a9a6-548b94c84260 - - - 9d3336f7-25f8-4b8c-9f8b-8376fbc40dce - - - d126a873-87cc-469a-970a-2c1fb6a7701d - - - 4e718d14-2778-4c00-9ef7-b7652cdcd58d - - - c15463ea-0afa-465e-b9f7-47fea0d99d46 - - - ce0244a3-d68f-4b93-91a0-a3b6c0a0c36c - - - - - - Dienste.DosingFromB1100.SetFlowRate - - - e2851d00-5203-40a8-a9cc-d3efca7c0f5a - - - cdcf8219-a63c-49f7-8e75-454c26733c4b - - - b6cd6174-2c86-4ea7-b701-f6f8e2fe6303 - - - 5cc7d9cc-82b2-4aaa-9b8c-4a79d58c7d97 - - - 758bda58-32e1-4d3a-b8bf-66ce4553d2d0 - - - 0e0661cb-b8b4-4aec-9cd9-567faab64b40 - - - 2c8130af-fb17-4a79-b6c8-f7fcbb29497c - - - 08cc6bd8-342b-48e6-8a66-c44031d502a3 - - - bd043649-f3ea-4ec5-892f-9cd88724cd3f - - - 84726c82-ed27-42dd-93b3-a750ab064571 - - - bcb83fab-066d-4550-9986-2d89e7f00eec - - - 36723311-a88d-4ecb-a1dd-0869462bff21 - - - 6e50a574-62d6-4e84-8670-ff987091f19d - - - 94694dd8-0963-46a3-80d2-4481efcc9141 - - - - - - Dienste.DosingFromB1200.DoseVolume - - - d5f29e80-0a85-4e23-beec-c16441e86c08 - - - 678d2c2b-fa8c-4941-a81b-d239bada9281 - - - 23d2503c-a0f9-4c84-88e5-5e22f179c2ca - - - 5e6777b4-2f9c-44c6-bddc-fa505cc749f7 - - - 348e645c-1b7a-4173-a5c3-89cff0943df9 - - - 4714f0b8-153e-4b8b-b573-537fd4ca73ec - - - 67b4dc05-c68b-40d7-8cf6-378a06ececc9 - - - 3926f638-7e15-458c-8a68-05c722dda8bb - - - f0dcf07b-8eee-473a-9266-16653a51b5cd - - - e2848873-23b3-4de6-a704-e3b469fd1e41 - - - 479719a8-3246-41aa-9ddf-966497e66b95 - - - db3e215b-7814-489b-90d4-38e1d12b83c8 - - - 8dc2d57c-214c-4ff0-bfb1-2a55ee322b19 - - - 3c4d4656-eb6d-40b7-8bf0-cba8a1d4af17 - - - - - - Dienste.DosingFromB1200.SetFlowRate - - - a67bc362-2501-4bf5-af8b-be3b01d1337e - - - e4b7799a-2d0d-4b99-bdc1-0f5cfa9ee3a3 - - - d49e5a0e-1375-43a8-99ed-bb1256d972f1 - - - 01a4cfd8-1073-48de-bb36-67acd1942291 - - - ca096fc0-07ec-4c89-b76c-e6cf8bc8ccd5 - - - 53867dec-3042-438f-81d9-331a6e6d5a42 - - - 530c9f64-8e82-4e22-bf69-f5392e8e4908 - - - 1a354105-24f8-42cc-b4d1-9207f52b94bf - - - e6a73aa5-b718-4ead-96be-792561f280a3 - - - 41efd3da-4763-4bf1-92b3-d0f965a1d438 - - - 5a3a2264-5b3f-44d5-a79b-8b5577f05287 - - - aac4aee6-2f14-4daa-86c6-3ad24faa36c6 - - - fd662855-ee3f-4c7b-94b5-7e6331858859 - - - c463f4d7-5282-42c4-b139-04b0f4d988fe - - - - - - Dienste.DosingFromB1300.DoseVolume - - - 3e4d3a58-4aa9-44ca-8cb9-a8497b1a3871 - - - 13a258fe-e44d-4309-b3ee-b5c3acb7c602 - - - 09fff5ed-b2db-42a9-bba3-4a19f06d635b - - - f7e619e7-8232-4fc2-926b-0b4bb20b80af - - - c1771496-90e6-4804-96c3-42ebe7f5d2f0 - - - 62469bc2-2ad7-45b5-9d5b-adbbad77340e - - - 5241c964-fbe0-4961-b465-33ea2755fd2e - - - fb006147-51c4-48a6-86c0-ffe5c4cb3d00 - - - 5d7d55a6-83fe-4132-8348-be2bc06ba4b7 - - - 3540acca-08a0-4d66-bbf4-270a02367784 - - - 9977f4cd-cd14-4167-8ac9-98497e4b3711 - - - 577dfda8-56a4-47f2-9324-295bc180bd50 - - - 18bf4047-e63c-4a33-ae28-d03eb3792f26 - - - ef10af1e-4b42-46d4-ab2c-3238766373c0 - - - - - - Dienste.DosingFromB1300.SetFlowRate - - - 63ee894e-d4ea-443c-aec5-1b0c37ab93fd - - - c0d1f04a-53d9-442e-bcd5-19ee5ae5b6f2 - - - f93cb9f2-f338-485d-a3b7-63bab06dd808 - - - cd607eed-c263-46be-80ce-14cca73418cf - - - 8e5947f9-0261-44a7-9835-dd5829ad38be - - - 6e12ab52-2ac8-4a22-b01e-6c4461b42bdd - - - 847786c8-4e45-493e-9b25-19c7b7f766b9 - - - 7a6b8296-4b83-4cd8-8980-dd9f5c306dda - - - 7ba995f9-0167-4dc8-af0c-93b722ae7e0a - - - 532fedca-8f85-4b79-b3dc-1b5bc4ae11be - - - 9b4dccaf-dbc4-4ce5-ae1c-c3d235261c31 - - - e22c564b-6aa2-4835-88aa-9d5fa8066f1d - - - 9f6368f5-5850-4661-b0cb-d9a2ef770a82 - - - 4ec8e650-ad63-4f58-a67f-a77ceb28642a - - - - - - Dienste.FeedingB1100.Duration - - - 4e524de6-fd79-4378-8adc-0c59e39c2a3b - - - 0c1a15d3-e0d3-40ef-9444-0d97ffe0f9e8 - - - 76df492c-8671-4b85-9df7-023ec9aba60a - - - d066d5cb-0be3-4cf5-a417-95797ea5fefe - - - 0a96366f-1b84-4352-b326-08fa9960a28c - - - af8e3fb1-0a4f-46c0-85c0-4f4b130d3a05 - - - 31ea7c83-fb07-4013-9733-fa5858131991 - - - 34448526-2c76-410b-89fc-0cad437d3a91 - - - a4dc5036-4c6a-43a3-8c24-c06f2d3cd81c - - - 0358a1d7-4d28-4781-ba59-e4d2da841b51 - - - c9ba9146-cb19-4a0e-9bf1-7a2956ffc5da - - - f54d56b9-6b80-4a40-ad21-6d67902e104b - - - 6e14c49e-0673-48e1-ac7e-23449e790519 - - - 3f9ea8b0-b579-45fc-b639-a9871516a9dd - - - - - - Dienste.FeedingB1200.Duration - - - d2b4a0cd-bf30-4a87-8b68-030e3e7e5d5f - - - e14e53e6-4786-4195-9193-bf1dfd1db5a5 - - - ce15f32c-4713-4a26-94ec-2df4bac3d0a8 - - - 99173d2f-c50f-4db2-8970-1a8c929c64eb - - - 321699df-abf4-43fb-ac10-556a06fbfca1 - - - 33d34617-2bf7-44a1-960e-47973f89f4fd - - - fc2705b6-b3c0-4399-bc49-fab82d104d02 - - - 603e53e6-841f-47c5-ab40-fde34b2d28b9 - - - fb43a9de-f614-41ef-8316-e0c84f44f9fc - - - 0db07297-023a-40e4-a120-f4e701bcc2b2 - - - 0a748058-676f-4074-a6e1-275ca899c145 - - - 851f9af7-03f8-438f-9eeb-dbeef80b42e0 - - - 326f1e84-2fb6-48dc-848e-b3a93b0f0438 - - - 732a894f-3b7f-4160-b5ea-94883a88535e - - - - - - Dienste.FeedingB1300.Duration - - - 075db4c8-4531-42ea-b3eb-aba09f16d2cb - - - f9873e89-1c27-4c79-9864-3c321b7a1c9d - - - 2c8b1cbd-a194-4eb2-a499-61737480a26b - - - 43a286c0-76d9-4aec-b9e4-3b0de98d2b86 - - - bf658649-636d-4eba-a87d-e217abd0beee - - - 9e8c3605-66e8-4e37-a16b-49d08722a48f - - - e68ac1da-aecd-425b-92cb-88ba4accfbd7 - - - a848ff14-f0fe-40e8-8b4f-e2963ba2f0c0 - - - 95431c00-d76d-4a51-8633-732e7a421080 - - - 7285d33b-8ba7-41f2-8311-b55fad88dc64 - - - 355ab296-a3a7-456c-b8a9-55c8c5892e17 - - - 35816b4c-d8c1-4877-86ce-93a364ee5925 - - - debc3c8c-f9fa-4312-b2ce-6ea4f30343cb - - - 0d7851c9-33c8-4563-9877-00a14dfe7d7f - - - - - - Dienste.FillbackToB1100.DoseVolume - - - bb05f1c2-4ec0-4ac0-b1c0-3fc30e270599 - - - 5e3b542e-adcc-464a-89d6-1562c3ae9eed - - - 08188035-b5f1-4e36-b61d-676e79e94242 - - - f26d6168-9adc-432c-9de8-a35046cca39a - - - 633c4585-1360-4683-aaed-5e16908fe6f8 - - - d679d4c9-c4c0-4cef-a987-9acd2d9da876 - - - 290fd23e-cdbb-4d14-84f5-ab3760fda4b6 - - - c58a97fc-c34d-4013-9ece-6cf61bfd778a - - - 3dce1bd2-44fe-40b2-92b2-166cb465ffc1 - - - 4253b00f-9c06-41a7-a0dc-96c19d7abee2 - - - b23548d5-c53c-4dac-a50f-a18354d7f57a - - - cd2e8e4b-f962-4fe3-b3f7-efc8ad09535b - - - 731e58ed-4b51-4178-86ea-9bac2ccc68fc - - - 7dff97cc-d004-44f5-a493-6edd79df4e41 - - - - - - Dienste.FillbackToB1100.SetFlowRate - - - a0f77d6f-75f1-4d36-8e70-07a774e9a26d - - - 65ded4a0-d9ff-42c4-878f-17f27e5c776f - - - f45f0322-7555-4846-ae01-32b145538bb2 - - - 7c31f805-9e96-4e19-b04b-bad1123a23c2 - - - 57362c1b-2600-4771-ab2d-7ddeffb7e652 - - - 5abaec48-6352-46fd-b10a-854ad2bda63c - - - 54e916f1-7b17-4117-9232-5a398711e8ba - - - da0dd9c4-7b9c-4710-b207-36be3251d137 - - - 2e3c4a00-56b7-4c34-8c7d-d2fca30b4707 - - - 9e50a3f9-5a72-4b05-a6ad-07a54d12be42 - - - ba57db68-d388-4b74-94d9-64d88338fc2b - - - 656fc016-5ec2-4414-809a-2ed9a84e51e8 - - - ab44af84-fe51-48c1-ab35-a6ac02e52034 - - - c4393584-57cc-46e9-84d0-ef8da62866f5 - - - - - - Dienste.FillbackToB1200.DoseVolume - - - cc1f2faa-c24c-472c-8275-ee5fb663850a - - - 1f01f74d-5368-4eaf-bb4c-497bf509fca4 - - - fa899eb0-8088-4418-8c2d-6e57fd77d38b - - - 69911bc5-5e99-4e82-ba9d-3f78cc63f17b - - - 5aafcd0b-d4a1-4d0e-b9a2-97b7fcf283b7 - - - 4675ffbb-50c0-470d-9b63-b9e5959f5855 - - - 7d679544-6df2-46d7-879d-4a8e7c1ba48f - - - a9b081ad-8b8d-4744-ba20-7a576189a404 - - - 39e43b95-1936-4759-9404-26015c079dbf - - - ee92c19f-8a97-4685-82c3-8ad60b3c7059 - - - 019498ba-8577-4c4f-88a7-4a0613063186 - - - 9b6fcacd-34b6-4c60-bf98-9846e7e140a0 - - - a76c27d2-7d58-4b6e-b7d8-4f1db4910ca1 - - - 48fd7702-bedf-46bb-97ca-278de411c951 - - - - - - Dienste.FillbackToB1200.SetFlowRate - - - 9a16a3e0-71c2-44be-8011-069f076ffdae - - - 646686d3-c48d-4908-b27c-c62a63b3f7ac - - - 839cd323-b5a4-40e6-a090-6c50468ea487 - - - e53d8830-8379-46d2-b64a-a611829867c4 - - - 67a425db-2788-462b-b57e-26bcc1c70a4c - - - 489c4d5a-231c-4d70-bdab-5572166df71b - - - d53e94a7-ea50-4d36-a0e3-b81b386f3db3 - - - 9d1ca467-11e5-479e-8767-b41b0b6ec543 - - - b9aee7ea-3fd1-4725-a4b0-c6f5a33178d6 - - - 1c1e0a05-9522-471d-8af0-537cd8ea8b43 - - - 0498441b-b282-4871-a83c-c936ab069a78 - - - 37b704a0-2e60-4fd1-8f0e-c4fcf78e4093 - - - b5ea3304-3aad-4606-a8dd-b51371f189eb - - - fef891f9-5572-4c29-9c19-eeb75c6d6648 - - - - - - Dienste.FillbackToB1300.DoseVolume - - - 035ea35f-e060-424c-8162-ebc3b1e58564 - - - 4d69fe7b-504b-45f7-b1e8-fb9bd8c34c3f - - - 6cb083e2-bbf9-4517-822e-22dbca1c58e4 - - - b11330da-10f7-4660-a16c-506abcfd2d70 - - - d5c99cea-b1f9-41d7-b17c-f7edcbfa8942 - - - 9c2b25c1-4703-43fe-9410-1481a401523f - - - e344d35b-4cad-4305-9517-5eaf5ce5b0a5 - - - 26e6e2e7-972d-483d-8873-c9ee2a4ed753 - - - 69290a0f-1528-437d-b22e-09955651c4de - - - 0367da42-8711-4ed7-a448-92a8fa2d19c9 - - - 72a3823e-cfc7-4a59-9624-550e12eaac22 - - - 9f61add0-9403-473d-aa46-17298f3acdb6 - - - 8b898eaa-8b4c-4e46-bd9f-1fc43bd663af - - - 8da0152b-0588-4326-a24b-273c5d325615 - - - - - - Dienste.FillbackToB1300.SetFlowRate - - - 061e588d-0acd-4280-a2de-6b09079c3789 - - - f2d00ac3-262d-416b-93c3-331dc4ba95c7 - - - 68b68549-bf3d-440f-b022-8233ae3a4054 - - - b3cf3ce2-b7d8-4e39-bbf5-8b3e1768099a - - - a98248cc-8e1b-4377-a522-d4a0611d6b9b - - - c89a0535-ef37-480e-95ef-1567070bd9b0 - - - f632e949-1fd4-4b41-8265-8f66597144ff - - - bb30b4da-fb31-4255-bf03-041018d43927 - - - e9b43d1f-1b6b-4b8a-a34e-ea8dd41cdacf - - - c2e96958-2aed-48e3-9253-afdf73e9442c - - - 52059e4e-6ad0-409e-bcf9-ca0394e2f82e - - - 67798636-4b31-4dfb-b7af-4d673fc25f27 - - - 16140e55-7786-4df6-8d1d-b9c8b138a270 - - - 035de928-9033-4324-8c82-3500d39d42da - - - - - - Dienste.MixtureDosingFromB1400.DoseVolume - - - ab7ddaae-fbee-44de-9c64-de4b94ff4eb1 - - - 72625412-471d-4114-afa5-5263e1f48409 - - - 7da23636-f6f4-44c4-9f80-89271fc1abbd - - - de9f07d8-28b7-4d80-9157-d36ce598d744 - - - 4a19c6ba-f954-4175-90b5-18e5b9af811b - - - 8195ea0b-2272-4c4d-a623-b97b9043159b - - - a80b5dbd-dd7f-487c-9841-3c8404418223 - - - 40f70b75-5773-4446-9bc2-c4fcd59c99fb - - - bfb39d26-96e7-4c5f-ace8-57bec7673813 - - - 9dae0760-6638-40c8-b49f-97c3ee129aa4 - - - 0a76233a-d641-4add-9fbd-899d517e6be7 - - - 8ed1c337-3df7-4bb8-ba02-353131d801b9 - - - 3562b3ea-bbdd-4780-8624-51f3440fb2b8 - - - 8da40518-4a63-46f0-b67a-90ddb4257d73 - - - - - - Dienste.MixtureDosingFromB1400.SetFlowRate - - - 43df07f7-ee34-4bce-b9b8-19373715dd6e - - - 5163244d-3793-4d6e-bea1-cddc6f629787 - - - 3beb04e4-1db4-405d-baaf-36a22b839870 - - - fc9c1b95-aa4a-497e-9f0f-175e2256c41e - - - 44e26fb1-c10b-4a22-9523-0692f82d6319 - - - 601777d4-958e-405d-8f00-b09217e69fca - - - 2d63fd86-9a82-49c9-b017-203a7ff3fc73 - - - 603c3c99-980f-4733-b562-84873a902ba2 - - - 752520eb-6d8b-4a2f-a246-f01e90f803f8 - - - 518b8cb2-6d1a-42ef-b49d-b575e4140b66 - - - 31cd978f-dd52-4cc5-944e-7fd0ad02f3ff - - - 4935d076-f184-4af5-9684-535ccaedc1cd - - - 75fec9d7-4681-4a66-a589-9ca13709a681 - - - e8c0ffee-7668-44f9-a204-b9d8bc09bd23 - - - - - - - - - opc.tcp://10.6.51.31 - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.OpenLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.CloseLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.Ctrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.SafePos - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.OpenFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.CloseFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.OpenFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.CloseFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.OpenOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.CloseOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3310.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.OpenLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.CloseLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.Ctrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.SafePos - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.OpenFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.CloseFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.OpenFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.CloseFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.OpenOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.CloseOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3210.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.OpenLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.CloseLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.Ctrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.SafePos - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.OpenFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.CloseFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.OpenFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.CloseFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.OpenOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.CloseOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3110.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.OpenLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.CloseLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.Ctrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.SafePos - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.OpenFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.CloseFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.OpenFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.CloseFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.OpenOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.CloseOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3320.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.OpenLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.CloseLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.Ctrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.SafePos - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.OpenFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.CloseFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.OpenFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.CloseFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.OpenOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.CloseOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3220.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.OpenLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.CloseLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.Ctrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.SafePos - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.OpenFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.CloseFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.OpenFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.CloseFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.OpenOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.CloseOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3120.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.OpenLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.CloseLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.Ctrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.SafePos - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.OpenFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.CloseFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.OpenFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.CloseFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.OpenOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.CloseOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3410.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.OpenLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.CloseLi - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.Ctrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.SafePos - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.OpenFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.CloseFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.OpenFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.CloseFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.OpenOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.CloseOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.V3420.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RpmInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RpmSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RpmSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RpmUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RpmMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RpmMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.Rpm - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RpmFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RpmExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.StopOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.FwdOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RevOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.StopLi - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.FwdLi - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RevLi - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.FwdCtrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RevCtrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RevFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.FwdFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.RevFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.FwdFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.Trip - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2010.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RpmInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RpmSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RpmSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RpmUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RpmMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RpmMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.Rpm - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RpmFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RpmExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.StopOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.FwdOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RevOp - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.StopLi - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.FwdLi - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RevLi - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.FwdCtrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RevCtrl - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RevFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.FwdFbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.RevFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.FwdFbkEn - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.Trip - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Aktoren.P2020.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.LIC1402.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.LIC1402.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.LIC1402.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.FI2012.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.FI2012.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.FI2012.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.FI2022.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.FI2022.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.FI2022.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.FI3431.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.FI3431.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.FI3431.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1102.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1102.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1102.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1103.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1103.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1103.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1101.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1101.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1101.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1203.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1203.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1203.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1202.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1202.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1202.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1201.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1201.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1201.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1303.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1303.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1303.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1302.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1302.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1302.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1301.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1301.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1301.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1401.V - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1401.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Sensoren.L1401.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.DoseVolume.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.SetFlowRate.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.DoseVolume.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.SetFlowRate.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.DoseVolume.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.SetFlowRate.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Duration.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Duration.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Duration.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.DoseVolume.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.SetFlowRate.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.DoseVolume.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.SetFlowRate.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.DoseVolume.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.SetFlowRate.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.DoseVolume.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.Sync - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.VInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.VSclMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.VSclMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.VUnit - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.VMin - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.VMax - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.VRbk - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.VOut - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.VExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.SetFlowRate.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.CommandMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.CommandInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.CommandExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.StrategyMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.StrategyInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.StrategyExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.CommandEnable.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.CurrentStrategy - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.Result - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.Locked - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.CurrentState.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1100.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.CommandMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.CommandInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.CommandExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.StrategyMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.StrategyInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.StrategyExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.CommandEnable.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.CurrentStrategy - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.Result - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.Locked - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.CurrentState.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1200.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.CommandMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.CommandInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.CommandExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.StrategyMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.StrategyInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.StrategyExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.CommandEnable.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.CurrentStrategy - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.Result - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.Locked - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.CurrentState.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.DosingFromB1300.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.CommandMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.CommandInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.CommandExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.StrategyMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.StrategyInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.StrategyExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.CommandEnable.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.CurrentStrategy - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Result - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.Locked - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.CurrentState.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1100.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.CommandMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.CommandInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.CommandExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.StrategyMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.StrategyInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.StrategyExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.CommandEnable.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.CurrentStrategy - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Result - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.Locked - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.CurrentState.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1200.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.CommandMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.CommandInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.CommandExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.StrategyMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.StrategyInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.StrategyExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.CommandEnable.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.CurrentStrategy - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Result - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.Locked - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.CurrentState.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FeedingB1300.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.CommandMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.CommandInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.CommandExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.StrategyMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.StrategyInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.StrategyExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.CommandEnable.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.CurrentStrategy - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.Result - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.Locked - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.CurrentState.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1100.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.CommandMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.CommandInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.CommandExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.StrategyMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.StrategyInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.StrategyExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.CommandEnable.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.CurrentStrategy - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.Result - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.Locked - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.CurrentState.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1200.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.CommandMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.CommandInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.CommandExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.StrategyMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.StrategyInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.StrategyExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.CommandEnable.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.CurrentStrategy - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.Result - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.Locked - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.CurrentState.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.FillbackToB1300.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.OpMode.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.CommandMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.CommandInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.CommandExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.StrategyMan - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.StrategyInt - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.StrategyExt - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.CommandEnable.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.CurrentStrategy - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.Result - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.Locked - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.CurrentState.binary - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.WQC - - - CODESYSSPV3/3S/IecVarAccess - - - 1 - - - - - |var|WAGO 750-8204 PFC200 CS 2ETH RS CAN.Application.Dienste.MixtureDosingFromB1400.OSLevelDA - - - CODESYSSPV3/3S/IecVarAccess - - - 3 - - - - - - - - - - - - 752a5c30-f4ed-4f09-a2fd-62c146a1b311 - - - - - - - - e16a98ec-8a7e-4d32-9c13-e17a766b1910 - - - - - - - - - - 0 - - - 1920 - - - 1080 - - - - 1020,520;987,520 - - - - 1020 - - - 520 - - - - - - - 987 - - - 520 - - - - - - - - - 382,741;340,741 - - - - 361 - - - 750 - - - - - - - 340 - - - 741 - - - - - - - 381 - - - 741 - - - - - - - 382 - - - 741 - - - - - - - 361 - - - 738 - - - - - - - - - 381,741;381,769 - - - - 381 - - - 769 - - - - - - - 381 - - - 741 - - - - - - - 381 - - - 754 - - - - - - - 381 - - - 738 - - - - - - - - - 381,895;381,963 - - - - 381 - - - 895 - - - - - - - 381 - - - 963 - - - - - - - - - 1133,837;1133,920 - - - - 1133 - - - 837 - - - - - - - 1133 - - - 904 - - - - - - - - - 382,736;382,768 - - - - 382 - - - 768 - - - - - - - 382 - - - 741 - - - - - - - 381 - - - 754 - - - - - - - 382 - - - 736 - - - - - - - - - 1133,340;1133,418 - - - - 1133 - - - 418 - - - - - - - 1133 - - - 340 - - - - - - - 1133 - - - 341 - - - - - - - - - 380,235;380,262 - - - - 380 - - - 262 - - - - - - - 380 - - - 236 - - - - - - - - - 381,486;381,508 - - - - 381 - - - 508 - - - - - - - 381 - - - 486 - - - - - - - - - 553,427;380,427 - - - - 553 - - - 427 - - - - - - - 464 - - - 420 - - - - - - - 381 - - - 427 - - - - - - - - - 883,598;883,598 - - - - - - 381,392;381,427 - - - - 381 - - - 392 - - - - - - - 381 - - - 427 - - - - - - - - - 671,427;601,427 - - - - 601 - - - 427 - - - - - - - 671 - - - 427 - - - - - - - - - 553,703;380,703 - - - - 553 - - - 703 - - - - - - - 466 - - - 710 - - - - - - - 381 - - - 703 - - - - - - - - - 381,647;381,703 - - - - 381 - - - 647 - - - - - - - 381 - - - 703 - - - - - - - - - 671,703;599,703 - - - - 599 - - - 703 - - - - - - - 671 - - - 703 - - - - - - - - - 556,963;380,963 - - - - 556 - - - 963 - - - - - - - 381 - - - 963 - - - - - - - - - 672,963;599,963 - - - - 599 - - - 963 - - - - - - - 671 - - - 963 - - - - - - - - - 671,341;671,963 - - - - 671 - - - 427 - - - - - - - 671 - - - 703 - - - - - - - 671 - - - 963 - - - - - - - 671 - - - 341 - - - - - - - - - 805,341;670,341 - - - - 671 - - - 341 - - - - - - - - - 1133,341;1050,341 - - - - 1133 - - - 341 - - - - - - - - - 1247,904;1132,904 - - - - 1247 - - - 904 - - - - - - - 1133 - - - 904 - - - - - - - - - 1311,904;1470,904 - - - - 1470 - - - 904 - - - - - - - 1311 - - - 904 - - - - - - - 1442 - - - 904 - - - - - - - - - 1442,1025;210,1025 - - - - 862 - - - 1025 - - - - - - - 1134 - - - 1015 - - - - - - - 1442 - - - 1025 - - - - - - - 210 - - - 1025 - - - - - - - - - 1442,904;1442,1026 - - - - 1442 - - - 904 - - - - - - - 1442 - - - 1025 - - - - - - - - - 210,236;210,1025 - - - - 210 - - - 236 - - - - - - - 215 - - - 463 - - - - - - - 215 - - - 713 - - - - - - - 210 - - - 1025 - - - - - - - 210 - - - 237 - - - - - - - 210 - - - 486 - - - - - - - 210 - - - 736 - - - - - - - - - 382,486;301,486 - - - - 301 - - - 486 - - - - - - - 381 - - - 486 - - - - - - - - - 380,236;300,236 - - - - 300 - - - 236 - - - - - - - 380 - - - 236 - - - - - - - - - 989,341;895,341 - - - - 989 - - - 341 - - - - - - - - - 161,237;255,237 - - - - 255 - - - 237 - - - - - - - 210 - - - 237 - - - - - - - - - 1500,904;1714,904 - - - - 1500 - - - 904 - - - - - - - - - 256,486;211,486 - - - - 256 - - - 486 - - - - - - - 210 - - - 486 - - - - - - - - - 382,736;301,736 - - - - 301 - - - 736 - - - - - - - 361 - - - 738 - - - - - - - 381 - - - 738 - - - - - - - 382 - - - 736 - - - - - - - - - 255,736;210,736 - - - - 255 - - - 736 - - - - - - - 210 - - - 736 - - - - - - - - - 231 - - - 421 - - - 0 - - - - - - 10.1 - - - 36020190 - - - - 1018 - - - 418 - - - - 1020 - - - 520 - - - - - - - 1133 - - - 837 - - - - - - - 1133 - - - 418 - - - - - - - - - 100 - - - 150 - - - 0 - - - - - - 10.1 - - - 36020190 - - - - 330 - - - 750 - - - - 361 - - - 750 - - - - - - - 381 - - - 769 - - - - - - - 381 - - - 895 - - - - - - - 382 - - - 768 - - - - - - - - - 100 - - - 150 - - - 0 - - - - - - 10.1 - - - 36020190 - - - - 330 - - - 250 - - - - 380 - - - 262 - - - - - - - 381 - - - 392 - - - - - - - - - 100 - - - 150 - - - 0 - - - - - - 10.1 - - - 36020190 - - - - 330 - - - 500 - - - - 381 - - - 508 - - - - - - - 381 - - - 647 - - - - - - - - - 140 - - - 115 - - - 0 - - - - - - 10.1 - - - 37010201 - - - - 210 - - - 156 - - - feff12ff-5d8d-429f-8254-db04f2bb9919 - - - - 210 - - - 236 - - - - - - - 300 - - - 236 - - - - - - - 255 - - - 237 - - - - - - - - - 140 - - - 115 - - - 0 - - - - - - 10.1 - - - 37010201 - - - - 210 - - - 406 - - - d590a7be-4d29-4298-abff-702f102c89d0 - - - - 215 - - - 463 - - - - - - - 301 - - - 486 - - - - - - - 256 - - - 486 - - - - - - - - - 140 - - - 115 - - - 0 - - - - - - 10.1 - - - 37010201 - - - - 210 - - - 656 - - - 2d48e9f6-49d3-4e6f-98f3-65c4174fd665 - - - - 340 - - - 741 - - - - - - - 215 - - - 713 - - - - - - - 301 - - - 736 - - - - - - - 255 - - - 736 - - - - - - - - - 140 - - - 115 - - - 0 - - - - - - 10.1 - - - 37010201 - - - - 510 - - - 347 - - - 534ec6b0-53a9-45e8-b26b-50b691d5fa40 - - - - 553 - - - 427 - - - - - - - 601 - - - 427 - - - - - - - - - 140 - - - 115 - - - 0 - - - - - - 10.1 - - - 37010201 - - - - 510 - - - 622 - - - 11dd5084-5542-4524-b6af-c72f91b5488a - - - - 553 - - - 703 - - - - - - - 599 - - - 703 - - - - - - - - - 140 - - - 115 - - - 0 - - - - - - 10.1 - - - 37010201 - - - - 510 - - - 883 - - - 0ddbeb2a-dc01-41b4-9bd2-0123abbb7353 - - - - 556 - - - 963 - - - - - - - 599 - - - 963 - - - - - - - - - 140 - - - 115 - - - 0 - - - - - - 10.1 - - - 37010201 - - - - 792 - - - 945 - - - 030c3728-26d5-44b1-a664-e36ab4891f52 - - - - 862 - - - 1025 - - - - - - - - - 140 - - - 115 - - - 0 - - - - - - 10.1 - - - 37010201 - - - - 1425 - - - 824 - - - cdffd550-b3a8-4925-b8cc-8487cf4a2039 - - - - 1470 - - - 904 - - - - - - - 1442 - - - 904 - - - - - - - 1500 - - - 904 - - - - - - - - - 183 - - - 148 - - - 0 - - - - - - 10.1 - - - 36419090 - - - - 983 - - - 266 - - - a48cddba-3676-4b2c-b86b-43b62a9d3d5f - - - - 1133 - - - 340 - - - - - - - 1133 - - - 341 - - - - - - - 989 - - - 341 - - - - - - - - - 183 - - - 148 - - - 0 - - - - - - 10.1 - - - 36419090 - - - - 1238 - - - 830 - - - 188826e1-4199-4d80-80d7-4ae0e0a39902 - - - - 1247 - - - 904 - - - - - - - 1311 - - - 904 - - - - - - - - - 110 - - - 80 - - - 0 - - - - - - 10.1 - - - 27209090 - - - - 1266 - - - 373 - - - 776b9026-2a7a-441a-9cc9-2443539ac168 - - - - - - 110 - - - 80 - - - 0 - - - - - - 10.1 - - - 27209090 - - - - 792 - - - 372 - - - 60a6162b-2363-4b37-82b2-de1d18842d13 - - - - - - 110 - - - 80 - - - 0 - - - - - - 10.1 - - - 27209090 - - - - 1079 - - - 935 - - - e1fa5dfb-3fa8-4d1c-8af0-d9e1bd425ac1 - - - - 1134 - - - 1015 - - - - - - - - - 110 - - - 80 - - - 0 - - - - - - 10.1 - - - 27209090 - - - - 1582 - - - 935 - - - 50778c1a-ee62-4747-90fb-6462dc42bbd1 - - - - - - 104 - - - 83 - - - 0 - - - - - - 10.1 - - - 27143121 - - - - 413 - - - 264 - - - 938fa8fe-2faa-44f6-9f00-5687ab8c41be - - - - - - 104 - - - 83 - - - 0 - - - - - - 10.1 - - - 27143121 - - - - 412 - - - 340 - - - bcded1b9-0b80-4430-bec6-3d675f25867f - - - - 464 - - - 420 - - - - - - - - - 104 - - - 83 - - - 0 - - - - - - 10.1 - - - 27143121 - - - - 414 - - - 188 - - - bfaebec9-3313-438a-95ec-0b0e1eeffac0 - - - - - - 104 - - - 83 - - - 0 - - - - - - 10.1 - - - 27143121 - - - - 412 - - - 590 - - - 1bc12469-362e-47c6-9a63-2dfe7d4728b0 - - - - - - 104 - - - 83 - - - 0 - - - - - - 10.1 - - - 27143121 - - - - 413 - - - 514 - - - 68e09d56-525b-43b9-9cb4-63fa266cf05f - - - - - - 104 - - - 83 - - - 0 - - - - - - 10.1 - - - 27143121 - - - - 414 - - - 438 - - - 80c69b3b-a5de-481d-bec0-342ada9c1e6d - - - - - - 104 - - - 83 - - - 0 - - - - - - 10.1 - - - 27143121 - - - - 412 - - - 860 - - - b04d2699-dfe5-4810-adbb-ad3f58cdf896 - - - - - - 104 - - - 83 - - - 0 - - - - - - 10.1 - - - 27143121 - - - - 413 - - - 784 - - - b5a71070-979d-4efd-a8ba-beaeb377fe8e - - - - - - 104 - - - 83 - - - 0 - - - - - - 10.1 - - - 27143121 - - - - 414 - - - 708 - - - be100efd-abc8-4d1a-9804-122615c630db - - - - 466 - - - 710 - - - - - - - - - 104 - - - 83 - - - 0 - - - - - - 10.1 - - - 27143121 - - - - 887 - - - 465 - - - f53bb0c3-6626-4264-950b-e8167aaa78f4 - - - - 987 - - - 520 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - b4346ffd-1b2e-4362-a968-68b991de61b7 - - - - 503e911f-07e6-4d4c-92eb-180b2eb5e972 73379a74-460e-464d-a421-2dd764f64b52 - - - true - - - 1 - - - true - - - - - - ce0244a3-d68f-4b93-91a0-a3b6c0a0c36c - - - - - - 94694dd8-0963-46a3-80d2-4481efcc9141 - - - - - - 73379a74-460e-464d-a421-2dd764f64b52 - - - false - - - 2 - - - false - - - - - - - - 12141948-0599-41fe-bf40-2d1288b58a8f - - - - e79b140a-b955-453d-b6ed-3c369f7df8b6 fd739685-4424-4640-ba10-8e6b99493b99 - - - true - - - 1 - - - true - - - - - - 3c4d4656-eb6d-40b7-8bf0-cba8a1d4af17 - - - - - - c463f4d7-5282-42c4-b139-04b0f4d988fe - - - - - - fd739685-4424-4640-ba10-8e6b99493b99 - - - false - - - 2 - - - false - - - - - - - - 5490e15b-65d9-46bc-832e-a7d3dcd7a93b - - - - 363afa1a-85e3-4391-b13e-ddfcf9812488 8768c2e4-29f1-43e4-9c37-8da6f188514f - - - true - - - 1 - - - true - - - - - - ef10af1e-4b42-46d4-ab2c-3238766373c0 - - - - - - 4ec8e650-ad63-4f58-a67f-a77ceb28642a - - - - - - 8768c2e4-29f1-43e4-9c37-8da6f188514f - - - false - - - 2 - - - false - - - - - - - - 950612a0-42b1-4eab-88cc-94460e748e74 - - - - - true - - - 1 - - - true - - - - - - 3f9ea8b0-b579-45fc-b639-a9871516a9dd - - - - - - 84a622e7-94af-4fb2-a40b-f904b414cc53 - - - true - - - 2 - - - false - - - - - - - - 3322ac52-f55c-4efd-a5b7-ef0f25dfc10a - - - - - true - - - 1 - - - true - - - - - - 732a894f-3b7f-4160-b5ea-94883a88535e - - - - - - 01448b61-f7ca-4d35-b5bc-844f294a44ff - - - true - - - 2 - - - false - - - - - - - - ef0de31f-439f-4593-b808-e17b33ce8088 - - - - - true - - - 1 - - - true - - - - - - 0d7851c9-33c8-4563-9877-00a14dfe7d7f - - - - - - af421b0e-2c89-4f6c-b0d0-66d4ca53459d - - - true - - - 2 - - - false - - - - - - - - 84804143-f71a-49d6-aa6e-4283830bb405 - - - - d8ce98f8-bc58-40c0-9a8d-d4333de20c82 a402a197-f0ff-4c31-b888-fc186be7597e - - - true - - - 1 - - - true - - - - - - 7dff97cc-d004-44f5-a493-6edd79df4e41 - - - - - - c4393584-57cc-46e9-84d0-ef8da62866f5 - - - - - - a402a197-f0ff-4c31-b888-fc186be7597e - - - false - - - 2 - - - false - - - - - - a402a197-f0ff-4c31-b888-fc186be7597e - - - true - - - 3 - - - false - - - - - - - - 20a01532-0b74-4878-a11b-b132e1874448 - - - - 85805eb4-e982-41ff-9164-2cae6b314d71 c16cb0b6-a659-47fd-9ada-5a0fa0666458 - - - true - - - 1 - - - true - - - - - - 48fd7702-bedf-46bb-97ca-278de411c951 - - - - - - fef891f9-5572-4c29-9c19-eeb75c6d6648 - - - - - - c16cb0b6-a659-47fd-9ada-5a0fa0666458 - - - false - - - 2 - - - false - - - - - - c16cb0b6-a659-47fd-9ada-5a0fa0666458 - - - true - - - 3 - - - false - - - - - - - - ad99929b-710f-4bf9-b090-b7233d148deb - - - - f6ecdae6-d8bc-420b-be37-194e538b403a 9eca2fbd-c27f-460d-a847-eb7898cc2618 - - - true - - - 1 - - - true - - - - - - 8da0152b-0588-4326-a24b-273c5d325615 - - - - - - 035de928-9033-4324-8c82-3500d39d42da - - - - - - 9eca2fbd-c27f-460d-a847-eb7898cc2618 - - - false - - - 2 - - - false - - - - - - 9eca2fbd-c27f-460d-a847-eb7898cc2618 - - - true - - - 3 - - - false - - - - - - - - efcf06b4-4b18-4cd5-83ef-86189912c3c0 - - - - 49314f1f-f27a-4cb8-b64e-b4cd95147315 e9669534-d99c-4b3f-9326-88a1cb1c6e7e - - - true - - - 1 - - - true - - - - - - 8da40518-4a63-46f0-b67a-90ddb4257d73 - - - - - - e8c0ffee-7668-44f9-a204-b9d8bc09bd23 - - - - - - e9669534-d99c-4b3f-9326-88a1cb1c6e7e - - - false - - - 2 - - - false - - - - - - - - Standard Automation Markup Language Interface Class Library - Part 1 Content extended with Part 3 and Part 4 Content - 2.2.2 - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - InterfaceClassLibrary who contains the base interfaces of a MTP Communication Description - - InterfaceClass who represents the a common source item - all defined source items derive from SourceItem - - Bit Definition: [0] = NoAccess ; [1] = Read ; [2] = Write ; [3] = Read/Write - 0 - - - - Base class for a opc ua data item - - Identifier of the OPC UA Node - IdentifierType (depends on AttributeDataType): xs:string = string ; xs:ID = GUID ; xs:Base64Binary = ByteArray ; xs:int = Integer - - - - - Namespace of the OPC UA Node - - - - - - - - Library with all MTP HMI Interface Classes - - Abstract Connection Interface - - Connection Point for internal Links between two different information ports - - - Connection point for internal links between two different Nozzles - - - - - Automation Markup Language Base Role Class Library - Part 1 Content extended with Part 3 and Part 4 Content - 2.2.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SystemUnitClassLibrary who contains the base elements of a MTP Package - - SystemUnitClass who represents the entry point into a MTP Package - - MTP Package Version - 1.0 - - - - - - - - - - - - - - - SystemUnitClass for the ServiceSet - - - - Base class for the MTP Communication Facet - - - - - - - - SystemUnitClass for the List of DataAssemblies - - - - SystemUnitClass for the List of Server Sources - - - - - Base Class for CrossSet referencing of ObjectInstances - - Reference ID - Relation of different data sets to a complete described Instance Object - - - - - - - - SystemUnitClassLibrary who contains the base elements of a MTP Communication Description - - SystemUnitClass who represents the a common source object - all defined sources derive from SourceAssembly - - - Base class for all opc ua server instances inside the communication facets - - Endpoint URL of the server - like 'opc.tcp://192.186.2.1:5555 - - - - - - - - SystemUnitClassLibrary who contains the base elements of a MTP HMI Description - - SystemUnitClass for the HMISet - - Reference Path to the HMI Description External Reference (xs:anyURI): 'Folder1/hmiFile.aml' Internal Reference (xs:anyURI): 'GUID/' - - - - - HMI Port Object Class - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - Logical Port Object - - - - Measurement Point Object - - - - Nozzle Object - - - - - Topology Object - - X-Coordinate of the Topology Object - 0 - - - - Y-Coordinates of the Topology Object - 0 - - - - - Junction Connection Object - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - - Termination Connection Object - - Reference of identical terminations - - - - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - Sink Connection Object - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - - Source Connection Object - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - - - - HMI Connection Object - - Edgepath Notation x1,y1;x2,y2;x3,y3.. (including the start and end port coordinates in their absolute values) - - - - - - Pipe Connection Object - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - - Function Line Object with a fixed direction from start to end port - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - - Measurement Line Object - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - - X-Coordinate of the Port relative to the Parent Coordinates - 0 - - - - Y-Coordinates of the Port relativ to the Parent Coordinates - 0 - - - - - - - - - HMI Picture Object - - Width of the Picture in Pixel - 1920 - - - - Height of the Picture in Pixel - 1080 - - - - Picture Hierarchy Level - formatted string : x.y.z - - - - - - - HMI Semantic Group Object - - - - HMI Visual Object - Visual Representation of a Data Assembly Structure - - Width of the Picture Item - 0 - - - - Height of the Picture Item - 0 - - - - X-Coordinate of the Picture Item - 0 - - - - Y-Coordinates of the Picture Item - 0 - - - - Rotation Value of the Picture Item - 0 - - - - Type Identifier of the VisualObject to define the view level of a data structure - - - - - The Attribute shall define the version of the eclass catalogue, which the eclass category is related to: i.E. ECLASS-{Major}.{Release} -> ECLASS-1.0 - - - - - The attrtibue shall define the version of the eclass classification class for the aml object. The value shall be the coded name of the classification class as 8-digit integer. Two digits for each hierarchical level - - - - - This attribute shall contain the IRDI of the Class - i.E. 0173-1---ADVANCED_1_1#01-ADN862#003 - - - - - - - SystemUnitClassLibrary from VDI/VDE/NAMUR 2658-3 - 0.1.0 - - MTP DataAssembly Object Class - 0.1.0 - - TagName Field (see TagName) - - - - - - TagDescription Field (see TagDescription) - - - - - - OSLevelDA Variable (see OSLevelDA) - 0 - - - - - Worst Quality Code Variable (see WQC) - 255 - - - - - MTP AnalogView Object Class - 0.1.0 - - Value - 0.0 - - - - - Value Scale Low Limit (see ScaleSettings) - 0.0 - - - - - Value Scale High Limit (see ScaleSettings) - 100.0 - - - - - Value Unit (see UnitSettings) - - - - - - MTP Analog Monitoring Object Class - 0.1.0 - - Enable Alarm High Limit - true - - - - - Limit Value for Alarm High - 95.0 - - - - - Alarm High Active - false - - - - - Enable Warning High Limit - true - - - - - Limit Value for Warning High - 90.0 - - - - - Warning High Active - false - - - - - Enable Tolerance High Limit - true - - - - - Limit Value for Tolerance High - 85.0 - - - - - Tolerance High Active - false - - - - - Enable Tolerance Low Limit - true - - - - - Limit Value for Tolerance Low - 15.0 - - - - - Tolerance Low Active - false - - - - - Enable Warning Low Limit - true - - - - - Limit Value for Warning Low - 10.0 - - - - - Warning Low Active - false - - - - - Enable Alarm Low Limit - true - - - - - Limit Value for Alarm Low - 5.0 - - - - - Alarm Low Active - false - - - - - - - MTP DigitalView Object Class - 0.1.0 - - Value - 0 - - - - - Value Scale Low Limit (see ScaleSettings) - 0 - - - - - Value Scale High Limit (see ScaleSettings) - 100 - - - - - Value Unit (see UnitSettings) - - - - - - MTP Digital Monitoring Object Class - 0.1.0 - - Enable Alarm High Limit - true - - - - - Limit Value for Alarm High - 95 - - - - - Alarm High Active - false - - - - - Enable Warning High Limit - true - - - - - Limit Value for Warning High - 90 - - - - - Warning High Active - false - - - - - Enable Tolerance High Limit - true - - - - - Limit Value for Tolerance High - 85 - - - - - Tolerance High Active - false - - - - - Enable Tolerance Low Limit - true - - - - - Limit Value for Tolerance Low - 15 - - - - - Tolerance Low Active - false - - - - - Enable Warning Low Limit - true - - - - - Limit Value for Warning Low - 10 - - - - - Warning Low Active - false - - - - - Enable Alarm Low Limit - true - - - - - Limit Value for Alarm Low - 5 - - - - - Alarm Low Active - false - - - - - - - MTP BinView Object Class - 0.1.0 - - Binary Value - false - - - - - Text Replacement for false - false - - - - - Text Replacement for true - true - - - - - MTP Binary Monitoring Object Class - 0.1.0 - - Enable Fluttering Recognition - false - - - - - Period of an active signal before it will be recognized as flutter-free - 10.0 - - - - - Counts of the allowed fluttering signals in the defined period FlutTi - 5 - - - - - Fluttering Signal recognized - false - - - - - - - MTP ExtAnaOp Object Class - 0.1.0 - - Value Output - 0.0 - - - - - Value Scale Low Limit (see ScaleSettings) - 0.0 - - - - - Value Scale High Limit (see ScaleSettings) - 100.0 - - - - - Value Unit (see UnitSettings) - - - - - - Value Low Limit (see ValueLimitation) - 0.0 - - - - - Value High Limit (see ValueLimitation) - 100.0 - - - - - Strategy Parameter Value from External Source (external-automatic) - 0.0 - - - - - Readback Value - 0.0 - - - - - MTP ExtIntAnaOp Object Class - 0.1.0 - - External Value (relevant, if external source is active, see OperationMode) - 0.0 - - - - - Internal Value (relevant, if internal source is active, see OperationMode) - 0.0 - - - - - Operation Mode Mask (see OperationMode, only Source Mode used) - 16384 - - - - - MTP AdvAnaOp Object Class - 0.1.0 - - Operation Mode Mask (see OperationMode, BaseOperation and Source Mode used) - 16400 - - - - - - - - MTP ExtDigOp Object Class - 0.1.0 - - Value Output - 0 - - - - - Value Scale Low Limit (see ScaleSettings) - 0 - - - - - Value Scale High Limit (see ScaleSettings) - 100 - - - - - Value Unit (see UnitSettings) - - - - - - Value Low Limit (see ValueLimitation) - 0 - - - - - Value High Limit (see ValueLimitation) - 100 - - - - - Strategy Parameter Value from External Source (external-automatic) - 0 - - - - - Readback Value - 0 - - - - - - MTP clsExtIntDigOp Object Class - 0.1.0 - - External Value (relevant, if external source is active, see OperationMode) - 0 - - - - - Internal Value (relevant, if internal source is active, see OperationMode) - 0 - - - - - Operation Mode Mask (see OperationMode, only Source Mode used) - 16384 - - - - - MTP AdvDigOp Object Class - 0.1.0 - - Operation Mode Mask (see OperationMode, BaseOperation and Source Mode used) - 16400 - - - - - - - - MTP External Binary Operation Object Class - 0.1.0 - - Binary Value Output - false - - - - - Text Replacement for false - false - - - - - Text Replacement for true - true - - - - - External Value - false - - - - - MTP External Internal Operation Object Class - 0.1.0 - - External Value (relevant, if external source is active, see OperationMode) - false - - - - - Internal Value (relevant, if internal source is active, see OperationMode) - false - - - - - Operation Mode Mask (see OperationMode, only Source Mode used) - 16384 - - - - - MTP Advanced Binary Operation Object Class - 0.1.0 - - Operation Mode Mask (see OperationMode, BaseOperation and Source Mode used) - 16400 - - - - - - - - MTP PID Controller Object Class - 0.1.0 - - Operation Mode Mask (see OeprationModes, ExtendedOperation - and SourceModeController used) - 16640 - - - - - Process Value - 0.0 - - - - - Process Value Scale Low Limit (see ScaleSettings) - 0.0 - - - - - Process Value Scale High Limit (see ScaleSettings) - 100.0 - - - - - Process Value Unit (see UnitSettings) - - - - - - Setpoint - 0.0 - - - - - Setpoint Scale Low Limit (see ScaleSettings) - 0.0 - - - - - Setpoint Scale Low Limit (see ScaleSettings) - 100.0 - - - - - Setpoint Unit (see UnitSettings) - - - - - - External Setpoint Low Limit (see ValueLimitation) - 0.0 - - - - - External Setpoint High Limit (see ValueLimitation) - 100.0 - - - - - External Setpoint - 0.0 - - - - - Internal Setpoint Low Limit (see ValueLimitation) - 0.0 - - - - - Internal Setpoint High Limit (see ValueLimitation) - 100.0 - - - - - Internal Setpoint - 0.0 - - - - - Manipulated Value from Operator - 0.0 - - - - - Manipulated Value - 0.0 - - - - - Minimal Manipulated Value (see ValueLimitation) - 0.0 - - - - - Maximal Manipulated Value (see ValueLimitation) - 100.0 - - - - - Manipulated Value Scale Low Limit (see ScaleSettings) - 0.0 - - - - - Manipulated Value Scale High Limit (see ScaleSettings) - 100.0 - - - - - Manipulated Value Unit (see UnitSettings) - - - - - - Propotional Parameter - 1.0 - - - - - Integration Parameter - 1.0 - - - - - Derivation Parameter - 1.0 - - - - - - MTP BinDrv Object Class - 0.1.0 - - Operation Mode Mask (see OeprationModes, ExtendedOperation used) - 256 - - - - - Forward Enable - true - - - - - Reverse Enable - true - - - - - Stop Command from Operator - false - - - - - Forward Command from Operator - false - - - - - Reverse Command from Operator - false - - - - - Stop Command from Internal Link - false - - - - - Forward Command from Internal Link - false - - - - - Reverse Command from Internal Link - false - - - - - Forward Control - false - - - - - Reverse Control - false - - - - - Forward Feedback Enable - false - - - - - Forward Feedback Signal - false - - - - - Reverse Feedback Enable - false - - - - - Reverse Feedback Signal - false - - - - - Safe Position - false - - - - - Drive Protection Indicator - false - - - - - Permit Enable - false - - - - - Permit locks the Entity to be activated - false - - - - - InterlockDA Enable - false - - - - - InterlockDA locks the Entity to the safe state - false - - - - - Protect Enable - false - - - - - Protect locks the Entity to the safe state – a reset is required - false - - - - - ResetDA from internal link - false - - - - - ResetDA from Operator - false - - - - - MTP MonBinDrv Object Class - 0.1.0 - - Monitor Enable - false - - - - - Monitor SafePos - false - - - - - Static Error active - false - - - - - Dynamic Error active - false - - - - - Monitoring Time for uncontrolled changes - 3.0 - - - - - Monitoring Time for controlled changes - 3.0 - - - - - - - MTP AnaDrv Object Class - 0.1.0 - - Operation Mode Mask (see OeprationModes, ExtendedOperation - and SourceModeController used) - 16640 - - - - - Forward Enable - true - - - - - Reverse Enable - true - - - - - Stop Command from Operator - false - - - - - Forward Command from Operator - false - - - - - Reverse Command from Operator - false - - - - - Stop Command from Internal Link - false - - - - - Forward Command from Internal Link - false - - - - - Reverse Command from Internal Link - false - - - - - Forward Control - false - - - - - Reverse Control - false - - - - - Forward Feedback Enable - false - - - - - Forward Feedack Signal - false - - - - - Reverse Feedback Enable - false - - - - - Reverse Feedback Signal - false - - - - - Safe Position - false - - - - - Drive Protection Indicator - false - - - - - RPM Setpoint - 0.0 - - - - - RPM Setpoint Scale Low Limit (see ScaleSettings) - 0.0 - - - - - RPM Setpoint Scale High Limit (see ScaleSettings) - 100.0 - - - - - RPM Setpoint Unit (see UnitSettings) - - - - - - RPM Setpoint Low Limit (see ValueLimitation) - 0.0 - - - - - RPM Setpoint High Limit (see ValueLimitation) - 100.0 - - - - - RPM External Setpoint - 0.0 - - - - - RPM Internal Setpoint - 0.0 - - - - - RPM Feedback Signal - 0.0 - - - - - Permit Enable - false - - - - - Permit locks the Entity to be activated - false - - - - - InterlockDA Enable - false - - - - - InterlockDA locks the Entity to the safe state - false - - - - - Protect Enable - false - - - - - Protect locks the Entity to the safe state – a reset is required - false - - - - - ResetDA from internal link - false - - - - - ResetDA from Operator - false - - - - - MTP MonAnaDrv Object Class - 0.1.0 - - Monitor Enable - false - - - - - Monitor SafePos - false - - - - - Static Error active - false - - - - - Dynamic Error active - false - - - - - Monitoring Time for uncontrolled changes - 3.0 - - - - - Monitoring Time for controlled changes - 3.0 - - - - - Enable Alarm High Limit - true - - - - - Limit Value for Alarm High - 98.0 - - - - - Alarm High Active - false - - - - - Enable Alarm Low Limit - true - - - - - Limit Value for Alarm Low - 2.0 - - - - - Alarm Low Active - false - - - - - RPM Error - 2.0 - - - - - Starting Feedback - false - - - - - Stopping Feedback - false - - - - - - - MTP BinVlv Object Class - 0.1.0 - - Operation Mode Mask (see OeprationModes, ExtendedOperation used) - 256 - - - - - Safe Position - true - - - - - Open Feedback Enable - true - - - - - Close Feedback Enable - true - - - - - Open Command from Operator - false - - - - - Close Command from Operator - false - - - - - Open Command from Internal Link - false - - - - - Close Command from Internal Link - false - - - - - Valve Control - false - - - - - Open Feedback Signal - false - - - - - Close Feedback Signal - false - - - - - Permit Enable - false - - - - - Permit - Avoid to activate the valve - false - - - - - InterlockDA Enable - false - - - - - InterlockDA - Activate Safe Pos, locks the control interface without reset - false - - - - - Protect Enable - false - - - - - Protect - Activate Safe Pos, locks the control interface, reset required - false - - - - - ResetDA from internal link - false - - - - - ResetDA from Operator - false - - - - - MTP MonBinVlv Object Class - 0.1.0 - - Monitor Enable - false - - - - - Set the Error Behaviour, if an error occurs - false - - - - - Static Error active - false - - - - - Dynamic Error active - false - - - - - Monitoring Time for uncontrolled changes - 3.0 - - - - - Monitoring Time for controlled changes - 3.0 - - - - - - - MTP AnaVlv Object Class - 0.1.0 - - Operation Mode Mask (see OeprationModes, ExtendedOperation - and SourceModeController used) - 16640 - - - - - Safe Position - true - - - - - Open Feedback Enable - true - - - - - Close Feedback Enable - true - - - - - Open Command from Operator - false - - - - - Close Command from Operator - false - - - - - Open Command from Internal Link - false - - - - - Close Command from Internal Link - false - - - - - Valve Control - false - - - - - Open Feedack Signal - false - - - - - Close Feedback Signal - false - - - - - Position Setpoint - 0.0 - - - - - Position Setpoint Scale Low Limit (see ScaleSettings) - 0.0 - - - - - Position Setpoint Scale High Limit (see ScaleSettings) - 100.0 - - - - - Position Setpoint Unit (see UnitSettings) - - - - - - Position Setpoint Low Limit (see ValueLimitation) - 0.0 - - - - - Position Setpoint High Limit (see ValueLimitation) - 100.0 - - - - - Position External Setpoint - 0.0 - - - - - Position Internal Setpoint - 0.0 - - - - - Position Feedback Enable - true - - - - - Position Feedack Signal - 0.0 - - - - - Permit Enable - false - - - - - Permit - Avoid to activate the valve - false - - - - - InterlockDA Enable - false - - - - - InterlockDA - Activate Safe Pos, locks the control interface without reset - false - - - - - Protect Enable - false - - - - - Protect - Activate Safe Pos, locks the control interface, reset required - false - - - - - ResetDA from internal link - false - - - - - ResetDA from Operator - false - - - - - MTP MonAnaVlv Object Class - 0.1.0 - - Monitor Enable - false - - - - - Set the Error Behaviour, if an error occurs - false - - - - - Static Error active - false - - - - - Dynamic Error active - false - - - - - Monitoring Time for uncontrolled changes - 3.0 - - - - - Monitoring Time for controlled changes - 3.0 - - - - - Position is changing to open - false - - - - - Position is changing to close - false - - - - - Position reached - false - - - - - Positon Tolerance for Calculation - 1.0 - - - - - Position to define close position - 1.0 - - - - - Position to define open position - 99.0 - - - - - Monitoring Time until position is reached - 3.0 - - - - - Position Error active - false - - - - - Position Open achieved - false - - - - - Position Close achieved - false - - - - - - - MTP InterlockDA View Object Class with 4 Inputs - 0.1.0 - - Logical Behavior - true - - - - - Locking Input 1 - Enable - true - - - - - Locking Input 1 - Value - true - - - - - Locking Input 1 - Quality Code - 255 - - - - - Locking Input 1 - Invertation Enable - true - - - - - Locking Input 1 - Additional Text - - - - - - Locking Input 2 - Enable - true - - - - - Locking Input 2 - Value - true - - - - - Locking Input 2 - Quality Code - 255 - - - - - Locking Input 2 - Invertation Enable - true - - - - - Locking Input 2 - Additional Text - - - - - - Locking Input 3 - Enable - true - - - - - Locking Input 3 - Value - true - - - - - Locking Input 3 - Quality Code - 255 - - - - - Locking Input 3 - Invertation Enable - true - - - - - Locking Input 3 - Additional Text - - - - - - Locking Input 4 - Enable - true - - - - - Locking Input 4 - Value - true - - - - - Locking Input 4 - Quality Code - 255 - - - - - Locking Input 4 - Invertation Enable - true - - - - - Locking Input 4 - Additional Text - - - - - - Locking Result Output - Value - true - - - - - Locking Result Output - Quality Code - 255 - - - - - MTP InterlockDA View Object Class with 8 Inputs - 0.1.0 - - Locking Input 5 - Enable - true - - - - - Locking Input 5 - Value - true - - - - - Locking Input 5 - Quality Code - 255 - - - - - Locking Input 5 - Invertation Enable - true - - - - - Locking Input 5 - Additional Text - - - - - - Locking Input 6 - Enable - true - - - - - Locking Input 6 - Value - true - - - - - Locking Input 6 - Quality Code - 255 - - - - - Locking Input 6 - Invertation Enable - true - - - - - Locking Input 6 - Additional Text - - - - - - Locking Input 7 - Enable - true - - - - - Locking Input 7 - Value - true - - - - - Locking Input 7 - Quality Code - 255 - - - - - Locking Input 7 - Invertation Enable - true - - - - - Locking Input 7 - Additional Text - - - - - - Locking Input 8 - Enable - true - - - - - Locking Input 8 - Value - true - - - - - Locking Input 8 - Quality Code - 255 - - - - - Locking Input 8 - Invertation Enable - true - - - - - Locking Input 8 - Additional Text - - - - - - MTP InterlockDA View Object Class with 16 Inputs - 0.1.0 - - Locking Input 9 - Enable - true - - - - - Locking Input 9 - Value - true - - - - - Locking Input 9 - Quality Code - 255 - - - - - Locking Input 9 - Invertation Enable - true - - - - - Locking Input 9 - Additional Text - - - - - - Locking Input 10 - Enable - true - - - - - Locking Input 10 - Value - true - - - - - Locking Input 10 - Quality Code - 255 - - - - - Locking Input 10 - Invertation Enable - true - - - - - Locking Input 10 - Additional Text - - - - - - Locking Input 11 - Enable - true - - - - - Locking Input 11 - Value - true - - - - - Locking Input 11 - Quality Code - 255 - - - - - Locking Input 11 - Invertation Enable - true - - - - - Locking Input 11 - Additional Text - - - - - - Locking Input 12 - Enable - true - - - - - Locking Input 12 - Value - true - - - - - Locking Input 12 - Quality Code - 255 - - - - - Locking Input 12 - Invertation Enable - true - - - - - Locking Input 12 - Additional Text - - - - - - Locking Input 13 - Enable - true - - - - - Locking Input 13 - Value - true - - - - - Locking Input 13 - Quality Code - 255 - - - - - Locking Input 13 - Invertation Enable - true - - - - - Locking Input 13 - Additional Text - - - - - - Locking Input 14 - Enable - true - - - - - Locking Input 14 - Value - true - - - - - Locking Input 14 - Quality Code - 255 - - - - - Locking Input 14 - Invertation Enable - true - - - - - Locking Input 14 - Additional Text - - - - - - Locking Input 15 - Enable - true - - - - - Locking Input 15 - Value - true - - - - - Locking Input 15 - Quality Code - 255 - - - - - Locking Input 15 - Invertation Enable - true - - - - - Locking Input 15 - Additional Text - - - - - - Locking Input 16 - Enable - true - - - - - Locking Input 16 - Value - true - - - - - Locking Input 16 - Quality Code - 255 - - - - - Locking Input 16 - Invertation Enable - true - - - - - Locking Input 16 - Additional Text - - - - - - - - - MTP String View Object Class - 0.1.0 - - Text Value - Text - - - - - - - - SystemUnitClassLibrary who contains the base elements of a MTP Services - - - Reference Path to the Service Description External Reference (xs:anyURI): 'Folder1/serviceFile.aml' Internal Reference (xs:anyURI): 'GUID/' - - - - - MTP Service Object Class - cross-vendor approach for ACHEMA 2018 - - - Abstract MTP Parameter Object Class - cross-vendor approach for ACHEMA 2018 - - MTP Service Configuration Parameter Class which is related to a service, i.e. pressure value of supply - cross-vendor approach for ACHEMA 2018 - - - MTP Strategy Parameter Class which is related to a service procedure, i.e. a setpoint - cross-vendor approach for ACHEMA 2018 - - - - - MTP Parameter Object Class which is related to the whole servce, i.e. a configuration parameter - cross-vendor approach for ACHEMA 2018 - - Strategy Completation Mode - 0: not self completing, 1: self completing - false - - - - - Strategy Identifier - 0 - - - - - Default Strategy - 1: is default procedure, 0: is not default - only one Strategy shall be default - false - - - - - - - MTP Service Control Object Class for cross-vendor approach - cross-vendor approach for ACHEMA 2018 - - Operation Mode Mask (see OeprationModes, ExtendedOperation - and SourceModeController used) - 16640 - - - - - Command-Variable – Operator (active in manual) - 0 - - - - - Command-Variable – Internal (active in internal automatic) - 0 - - - - - Command-Variable – External (active in external automatic) - 0 - - - - - Select-Variable – Operator (active in manual) - 0 - - - - - Select-Variable – Internal (active in internal automatic) - 0 - - - - - Select-Variable – External (active in external automatic) - 0 - - - - - CommandEnable-Variable – Transition Clearance from the Current State - 0 - - - - - State-Variable – Current State - 0 - - - - - Current Strategy Variable - 0 - - - - - - - - MTP Strategy Analog Parameter Object Class for cross-vendor approach - cross-vendor approach for ACHEMA 2018 - - Strategy Parameter Value from Operator Source (manual) - 0.0 - - - - - - - MTP Strategy Digital Parameter Object Class for cross-vendor approach - cross-vendor approach for ACHEMA 2018 - - Strategy Parameter Value from Operator Source (manual) - 0 - - - - - - - MTP Strategy Binary Parameter Object Class for cross-vendor approach - cross-vendor approach for ACHEMA 2018 - - Strategy Parameter Value from Operator Source (manual) - false - - - - - - - MTP Service Process Value Object Class - siemens-specific extension for ORCA AP4 - - - MTP Service External Process Value Object Class - siemens-specific extension for ORCA AP4 - - - diff --git a/src/modularPlantManager/pea/_assets/JSON/pea_dosierer_1.1.0.json b/src/modularPlantManager/pea/_assets/JSON/pea_dosierer_1.1.0.json deleted file mode 100644 index 099eb327..00000000 --- a/src/modularPlantManager/pea/_assets/JSON/pea_dosierer_1.1.0.json +++ /dev/null @@ -1,2989 +0,0 @@ -{ - "GenerationDate": "20190423T204609", - "peas": [ - { - "id": "Dosierer", - "opcua_server_url": "opc.tcp://10.6.51.200:4840", - "services": [ - { - "name": "Services.Fill", - "communication": { - "TagName": { - "value": "Fill" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.OpMode.binary", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.CommandMan", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.StrategyMan", - "data_type": "UInt32" - }, - "CommandInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.CommandInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.CommandExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.CurrentState.binary", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.CommandEnable.binary", - "data_type": "UInt32" - }, - "CurrentStrategy": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.CurrentStrategy", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Fill_conti", - "default": true, - "sc": false, - "parameters": [] - }, - { - "id": "2", - "name": "Fill_batch", - "default": false, - "sc": true, - "parameters": [ - { - "name": "SetVolume", - "interface_class": "AnaServParam", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VRbk", - "data_type": "Float" - }, - "VInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VInt", - "data_type": "Float" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.OpMode.binary", - "data_type": "UInt32" - }, - "VOp": { - "namespace_index": null, - "node_id": null, - "data_type": "String" - }, - "Sync": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.Sync", - "data_type": "String" - } - } - } - ] - } - ], - "parameters": [] - }, - { - "name": "Services.DoseAmount", - "communication": { - "TagName": { - "value": "DoseAmount" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.OpMode.binary", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.CommandMan", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.StrategyMan", - "data_type": "UInt32" - }, - "CommandInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.CommandInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.CommandExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.CurrentState.binary", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.CommandEnable.binary", - "data_type": "UInt32" - }, - "CurrentStrategy": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.CurrentStrategy", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "DoseAmount_batch", - "default": true, - "sc": true, - "parameters": [ - { - "name": "SetVolume", - "interface_class": "AnaServParam", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VRbk", - "data_type": "Float" - }, - "VInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VInt", - "data_type": "Float" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.OpMode.binary", - "data_type": "UInt32" - }, - "VOp": { - "namespace_index": null, - "node_id": null, - "data_type": "String" - }, - "Sync": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.Sync", - "data_type": "String" - } - } - }, - { - "name": "SetDuration", - "interface_class": "AnaServParam", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VRbk", - "data_type": "Float" - }, - "VInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VInt", - "data_type": "Float" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.OpMode.binary", - "data_type": "UInt32" - }, - "VOp": { - "namespace_index": null, - "node_id": null, - "data_type": "String" - }, - "Sync": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.Sync", - "data_type": "String" - } - } - } - ] - } - ], - "parameters": [] - }, - { - "name": "Services.DoseConti", - "communication": { - "TagName": { - "value": "DoseConti" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.OpMode.binary", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.CommandMan", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.StrategyMan", - "data_type": "UInt32" - }, - "CommandInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.CommandInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.CommandExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.CurrentState.binary", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.CommandEnable.binary", - "data_type": "UInt32" - }, - "CurrentStrategy": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.CurrentStrategy", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Dose_conti", - "default": true, - "sc": false, - "parameters": [ - { - "name": "SetVolumeFlow", - "interface_class": "AnaServParam", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VRbk", - "data_type": "Float" - }, - "VInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VInt", - "data_type": "Float" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.OpMode.binary", - "data_type": "UInt32" - }, - "VOp": { - "namespace_index": null, - "node_id": null, - "data_type": "String" - }, - "Sync": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.Sync", - "data_type": "String" - } - } - } - ] - } - ], - "parameters": [] - }, - { - "name": "Services.Empty", - "communication": { - "TagName": { - "value": "Empty" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.OpMode.binary", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.CommandMan", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.StrategyMan", - "data_type": "UInt32" - }, - "CommandInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.CommandInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.CommandExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.CurrentState.binary", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.CommandEnable.binary", - "data_type": "UInt32" - }, - "CurrentStrategy": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.CurrentStrategy", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Empty_batch", - "default": true, - "sc": true, - "parameters": [] - } - ], - "parameters": [] - } - ], - "process_values": [ - { - "name": "Aktoren.V001", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.OpMode.binary", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.SafePos", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.OpenFbkEn", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.CloseFbkEn", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.OpenOp", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.CloseOp", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.OpenLi", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.CloseLi", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.Ctrl", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.OpenFbk", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.CloseFbk", - "data_type": "Boolean" - }, - "PermEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.PermEn", - "data_type": "Boolean" - }, - "Permit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.Permit", - "data_type": "Boolean" - }, - "IntlEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.IntlEn", - "data_type": "Boolean" - }, - "Interlock": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.Interlock", - "data_type": "Boolean" - }, - "ProtEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.ProtEn", - "data_type": "Boolean" - }, - "Protect": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.Protect", - "data_type": "Boolean" - }, - "ResetLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.ResetLi", - "data_type": "Boolean" - }, - "ResetOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.ResetOp", - "data_type": "Boolean" - }, - "MonEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.MonEn", - "data_type": "Boolean" - }, - "MonSafePos": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.MonSafePos", - "data_type": "Boolean" - }, - "MonStatErr": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.MonStatErr", - "data_type": "Boolean" - }, - "MonDynErr": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.MonDynErr", - "data_type": "Boolean" - }, - "MonStatTi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.MonStatTi", - "data_type": "Float" - }, - "MonDynTi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V001.MonDynTi", - "data_type": "Float" - } - } - }, - { - "name": "Aktoren.V002", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.OpMode.binary", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.SafePos", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.OpenFbkEn", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.CloseFbkEn", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.OpenOp", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.CloseOp", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.OpenLi", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.CloseLi", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.Ctrl", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.OpenFbk", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.CloseFbk", - "data_type": "Boolean" - }, - "PermEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.PermEn", - "data_type": "Boolean" - }, - "Permit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.Permit", - "data_type": "Boolean" - }, - "IntlEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.IntlEn", - "data_type": "Boolean" - }, - "Interlock": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.Interlock", - "data_type": "Boolean" - }, - "ProtEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.ProtEn", - "data_type": "Boolean" - }, - "Protect": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.Protect", - "data_type": "Boolean" - }, - "ResetLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.ResetLi", - "data_type": "Boolean" - }, - "ResetOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.ResetOp", - "data_type": "Boolean" - }, - "MonEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.MonEn", - "data_type": "Boolean" - }, - "MonSafePos": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.MonSafePos", - "data_type": "Boolean" - }, - "MonStatErr": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.MonStatErr", - "data_type": "Boolean" - }, - "MonDynErr": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.MonDynErr", - "data_type": "Boolean" - }, - "MonStatTi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.MonStatTi", - "data_type": "Float" - }, - "MonDynTi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V002.MonDynTi", - "data_type": "Float" - } - } - }, - { - "name": "Aktoren.V003", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.OpMode.binary", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.SafePos", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.OpenFbkEn", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.CloseFbkEn", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.OpenOp", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.CloseOp", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.OpenLi", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.CloseLi", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.Ctrl", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.OpenFbk", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.CloseFbk", - "data_type": "Boolean" - }, - "PermEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.PermEn", - "data_type": "Boolean" - }, - "Permit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.Permit", - "data_type": "Boolean" - }, - "IntlEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.IntlEn", - "data_type": "Boolean" - }, - "Interlock": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.Interlock", - "data_type": "Boolean" - }, - "ProtEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.ProtEn", - "data_type": "Boolean" - }, - "Protect": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.Protect", - "data_type": "Boolean" - }, - "ResetLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.ResetLi", - "data_type": "Boolean" - }, - "ResetOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.ResetOp", - "data_type": "Boolean" - }, - "MonEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.MonEn", - "data_type": "Boolean" - }, - "MonSafePos": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.MonSafePos", - "data_type": "Boolean" - }, - "MonStatErr": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.MonStatErr", - "data_type": "Boolean" - }, - "MonDynErr": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.MonDynErr", - "data_type": "Boolean" - }, - "MonStatTi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.MonStatTi", - "data_type": "Float" - }, - "MonDynTi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.V003.MonDynTi", - "data_type": "Float" - } - } - }, - { - "name": "Aktoren.P001", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.OpMode.binary", - "data_type": "UInt32" - }, - "FwdEn": { - "namespace_index": null, - "node_id": null, - "data_type": "Boolean" - }, - "RevEn": { - "namespace_index": null, - "node_id": null, - "data_type": "Boolean" - }, - "StopOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.StopOp", - "data_type": "Boolean" - }, - "FwdOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.FwdOp", - "data_type": "Boolean" - }, - "RevOp": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RevOp", - "data_type": "Boolean" - }, - "StopLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.StopLi", - "data_type": "Boolean" - }, - "FwdLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.FwdLi", - "data_type": "Boolean" - }, - "RevLi": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RevLi", - "data_type": "Boolean" - }, - "FwdCtrl": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.FwdCtrl", - "data_type": "Boolean" - }, - "RevCtrl": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RevCtrl", - "data_type": "Boolean" - }, - "FwdFbkEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.FwdFbkEn", - "data_type": "Boolean" - }, - "FwdFbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.FwdFbk", - "data_type": "Boolean" - }, - "RevFbkEn": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RevFbkEn", - "data_type": "Boolean" - }, - "RevFbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RevFbk", - "data_type": "Boolean" - }, - "Trip": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.Trip", - "data_type": "Boolean" - }, - "Rpm": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.Rpm", - "data_type": "Float" - }, - "RpmSclMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RpmSclMin", - "data_type": "Float" - }, - "RpmSclMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RpmSclMax", - "data_type": "Float" - }, - "RpmUnit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RpmUnit", - "data_type": "Int16" - }, - "RpmMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RpmMin", - "data_type": "Float" - }, - "RpmMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RpmMax", - "data_type": "Float" - }, - "RpmExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RpmExt", - "data_type": "Float" - }, - "RpmInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Aktoren.P001.RpmInt", - "data_type": "Float" - }, - "RpmRbk": { - "namespace_index": null, - "node_id": null, - "data_type": "Float" - } - } - }, - { - "name": "Sensoren.L001", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.L001.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.L001.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.L001.V", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "30" - }, - "VUnit": { - "value": "1038" - } - } - }, - { - "name": "Sensoren.F001", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.F001.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.F001.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.F001.V", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "2" - }, - "VUnit": { - "value": "1352" - } - } - }, - { - "name": "Sensoren.L002", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.L002.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.L002.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.L002.V", - "data_type": "Boolean" - }, - "VState0": { - "value": "OK" - }, - "VState1": { - "value": "Voll" - } - } - }, - { - "name": "Sensoren.L003", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.L003.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.L003.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.L003.V", - "data_type": "Boolean" - }, - "VState0": { - "value": "Leer" - }, - "VState1": { - "value": "OK" - } - } - }, - { - "name": "Sensoren.M001", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.M001.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.M001.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.M001.V", - "data_type": "Boolean" - }, - "VState0": { - "value": "Leckage" - }, - "VState1": { - "value": "OK" - } - } - }, - { - "name": "Sensoren.NOTHALT", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.NOTHALT.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.NOTHALT.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.NOTHALT.V", - "data_type": "Boolean" - }, - "VState0": { - "value": "Nothalt ausgel\u00f6st" - }, - "VState1": { - "value": "OK" - } - } - }, - { - "name": "Sensoren.P002", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.P002.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.P002.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.P002.V", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "4" - }, - "VUnit": { - "value": "1137" - } - } - }, - { - "name": "Sensoren.P003", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.P003.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.P003.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Sensoren.P003.V", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "4" - }, - "VUnit": { - "value": "1137" - } - } - }, - { - "name": "Services.DoseAmount.SetDuration", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VRbk", - "data_type": "Float" - }, - "VInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.VInt", - "data_type": "Float" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.OpMode.binary", - "data_type": "UInt32" - }, - "VOp": { - "namespace_index": null, - "node_id": null, - "data_type": "String" - }, - "Sync": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetDuration.Sync", - "data_type": "String" - } - } - }, - { - "name": "Services.DoseAmount.SetVolume", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VRbk", - "data_type": "Float" - }, - "VInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.VInt", - "data_type": "Float" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.OpMode.binary", - "data_type": "UInt32" - }, - "VOp": { - "namespace_index": null, - "node_id": null, - "data_type": "String" - }, - "Sync": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.SetVolume.Sync", - "data_type": "String" - } - } - }, - { - "name": "Services.DoseAmount.ActualVolume", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.ActualVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.ActualVolume.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.ActualVolume.V", - "data_type": "Float" - }, - "VSclMin": { - "value": null - }, - "VSclMax": { - "value": null - }, - "VUnit": { - "value": null - } - } - }, - { - "name": "Services.DoseAmount.PumpState", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.PumpState.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.PumpState.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.PumpState.V", - "data_type": "Boolean" - }, - "VState0": { - "value": null - }, - "VState1": { - "value": null - } - } - }, - { - "name": "Services.DoseAmount.ValvePosition", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.ValvePosition.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.ValvePosition.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.ValvePosition.V", - "data_type": "Boolean" - }, - "VState0": { - "value": null - }, - "VState1": { - "value": null - } - } - }, - { - "name": "Services.DoseConti.SetVolumeFlow", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VRbk", - "data_type": "Float" - }, - "VInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.VInt", - "data_type": "Float" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.OpMode.binary", - "data_type": "UInt32" - }, - "VOp": { - "namespace_index": null, - "node_id": null, - "data_type": "String" - }, - "Sync": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.SetVolumeFlow.Sync", - "data_type": "String" - } - } - }, - { - "name": "Services.DoseConti.ActualVolumeFlow", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.ActualVolumeFlow.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.ActualVolumeFlow.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.ActualVolumeFlow.V", - "data_type": "Float" - }, - "VSclMin": { - "value": null - }, - "VSclMax": { - "value": null - }, - "VUnit": { - "value": null - } - } - }, - { - "name": "Services.DoseConti.PumpState", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.PumpState.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.PumpState.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.PumpState.V", - "data_type": "Boolean" - }, - "VState0": { - "value": null - }, - "VState1": { - "value": null - } - } - }, - { - "name": "Services.DoseConti.ValvePosition", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.ValvePosition.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.ValvePosition.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.ValvePosition.V", - "data_type": "Boolean" - }, - "VState0": { - "value": null - }, - "VState1": { - "value": null - } - } - }, - { - "name": "Services.Fill.SetVolume", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VRbk", - "data_type": "Float" - }, - "VInt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.VInt", - "data_type": "Float" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.OpMode.binary", - "data_type": "UInt32" - }, - "VOp": { - "namespace_index": null, - "node_id": null, - "data_type": "String" - }, - "Sync": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.SetVolume.Sync", - "data_type": "String" - } - } - }, - { - "name": "Services.Fill.ActualVolume", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.ActualVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.ActualVolume.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.ActualVolume.V", - "data_type": "Float" - }, - "VSclMin": { - "value": null - }, - "VSclMax": { - "value": null - }, - "VUnit": { - "value": null - } - } - }, - { - "name": "Services.Fill.ValvePosition", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.ValvePosition.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.ValvePosition.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.ValvePosition.V", - "data_type": "Boolean" - }, - "VState0": { - "value": null - }, - "VState1": { - "value": null - } - } - }, - { - "name": "Services.Empty.ActualVolume", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.ActualVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.ActualVolume.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.ActualVolume.V", - "data_type": "Float" - }, - "VSclMin": { - "value": null - }, - "VSclMax": { - "value": null - }, - "VUnit": { - "value": null - } - } - }, - { - "name": "Services.Empty.ValvePosition", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.ValvePosition.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.ValvePosition.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.ValvePosition.V", - "data_type": "Boolean" - }, - "VState0": { - "value": null - }, - "VState1": { - "value": null - } - } - }, - { - "name": "Services.Fill.RemainingVolume", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.RemainingVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.RemainingVolume.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.RemainingVolume.V", - "data_type": "Float" - }, - "VSclMin": { - "value": null - }, - "VSclMax": { - "value": null - }, - "VUnit": { - "value": null - } - } - }, - { - "name": "Services.Fill", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.OpMode.binary", - "data_type": "Int16" - }, - "ControlMan": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "ControlIn": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "ControlExt": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "StrategyMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.StrategyMan", - "data_type": "Int16" - }, - "StrategyIn": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "StrategyExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.StrategyExt", - "data_type": "Int16" - }, - "ControlEnable": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "State": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "CurrentStrategy": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Fill.CurrentStrategy", - "data_type": "Int16" - }, - "InteractQuestion": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "InteractAnswer": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "PosTextId": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - } - } - }, - { - "name": "Services.DoseAmount", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.OpMode.binary", - "data_type": "Int16" - }, - "ControlMan": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "ControlIn": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "ControlExt": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "StrategyMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.StrategyMan", - "data_type": "Int16" - }, - "StrategyIn": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "StrategyExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.StrategyExt", - "data_type": "Int16" - }, - "ControlEnable": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "State": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "CurrentStrategy": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseAmount.CurrentStrategy", - "data_type": "Int16" - }, - "InteractQuestion": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "InteractAnswer": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "PosTextId": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - } - } - }, - { - "name": "Services.DoseConti", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.OpMode.binary", - "data_type": "Int16" - }, - "ControlMan": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "ControlIn": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "ControlExt": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "StrategyMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.StrategyMan", - "data_type": "Int16" - }, - "StrategyIn": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "StrategyExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.StrategyExt", - "data_type": "Int16" - }, - "ControlEnable": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "State": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "CurrentStrategy": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.DoseConti.CurrentStrategy", - "data_type": "Int16" - }, - "InteractQuestion": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "InteractAnswer": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "PosTextId": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - } - } - }, - { - "name": "Services.Empty", - "communication": { - "WQC": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.OpMode.binary", - "data_type": "Int16" - }, - "ControlMan": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "ControlIn": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "ControlExt": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "StrategyMan": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.StrategyMan", - "data_type": "Int16" - }, - "StrategyIn": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "StrategyExt": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.StrategyExt", - "data_type": "Int16" - }, - "ControlEnable": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "State": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "CurrentStrategy": { - "namespace_index": "CODESYSSPV3/3S/IecVarAccess", - "node_id": "|var|WAGO 750-8202 PFC200 2ETH RS.App_Dosing.Services.Empty.CurrentStrategy", - "data_type": "Int16" - }, - "InteractQuestion": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "InteractAnswer": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - }, - "PosTextId": { - "namespace_index": null, - "node_id": null, - "data_type": "Int16" - } - } - } - ], - "hmi": { - "id": "hmi_Dosiermodul.(1.1.0)_edited", - "layoutOptions": {}, - "children": [ - { - "id": "e5e58338-f440-4966-9f6c-6924f8b42d3e", - "name": "V001", - "type": "37010201", - "x": 70, - "y": 30, - "width": 111, - "height": 119, - "rotation": 0, - "ports": [ - { - "id": "0c623a1d-5ba0-460d-87fc-c1735ca96f77", - "name": "Nozzle1", - "class": "Nozzle", - "x": 107, - "y": 113 - }, - { - "id": "6d5cf534-2039-417d-82f6-aacc3bc6bbcb", - "name": "Nozzle2", - "class": "Nozzle", - "x": 140, - "y": 113 - } - ] - }, - { - "id": "b03b216d-d9ea-4c6f-9cda-8a027aa01e19", - "name": "V002", - "type": "37010201", - "x": 800, - "y": 30, - "width": 111, - "height": 119, - "rotation": 0, - "ports": [ - { - "id": "b4b34cfc-6753-4443-9b12-ec4945f77e0c", - "name": "Nozzle1", - "class": "Nozzle", - "x": 835, - "y": 113 - }, - { - "id": "d2f57afc-7ffb-45c4-9c5f-791711fe6163", - "name": "Nozzle2", - "class": "Nozzle", - "x": 870, - "y": 113 - } - ] - }, - { - "id": "51393492-4138-4de0-b9c4-b151149022fe", - "name": "V003", - "type": "37010201", - "x": 80, - "y": 510, - "width": 165, - "height": 82, - "rotation": 270, - "ports": [ - { - "id": "502f632b-b0b2-46d9-8b4d-c1c0c4445875", - "name": "Nozzle1", - "class": "Nozzle", - "x": 92, - "y": 555 - }, - { - "id": "95b4adb8-b3b2-4a6d-8143-dd6ca153e726", - "name": "Nozzle2", - "class": "Nozzle", - "x": 92, - "y": 585 - } - ] - }, - { - "id": "2b9c1c98-0e7c-4d00-b962-83d912584721", - "name": "Tank", - "type": "36020190", - "x": 290, - "y": 170, - "width": 170, - "height": 250, - "rotation": 0, - "ports": [ - { - "id": "72cbe149-4fd4-4f2b-9121-fa8bc61c8454", - "name": "Nozzle1", - "class": "Nozzle", - "x": 375, - "y": 175 - }, - { - "id": "3bfc177b-db41-4b59-a9c2-15d033b19b5a", - "name": "Nozzle2", - "class": "Nozzle", - "x": 375, - "y": 415 - }, - { - "id": "2c5426ed-65bb-4ef8-b59b-fe36e03af751", - "name": "Nozzle2", - "class": "Nozzle", - "x": 360, - "y": 415 - }, - { - "id": "5c0dfa54-435a-443f-ba0e-3487cd610e89", - "name": "ML_1", - "class": "MeasurementPoint", - "x": 296, - "y": 375 - }, - { - "id": "e64eadbe-5737-48d0-9dbd-e2163882a012", - "name": "ML_2", - "class": "MeasurementPoint", - "x": 293, - "y": 235 - }, - { - "id": "96495160-b353-4d1c-bbdc-a0e50b7a3d46", - "name": "ML_3", - "class": "MeasurementPoint", - "x": 445, - "y": 189 - } - ] - }, - { - "id": "16a35ec8-62b9-41de-9710-c36c6656aa40", - "name": "P001", - "type": "36419090", - "x": 700, - "y": 390, - "width": 185, - "height": 92, - "rotation": 90, - "ports": [ - { - "id": "cf1d8651-4d64-4c11-b8b1-bd1b4d8790af", - "name": "Nozzle1", - "class": "Nozzle", - "x": 737, - "y": 470 - }, - { - "id": "a3b0475f-5eb3-475a-b71a-be58adc9a2cf", - "name": "Nozzle2", - "class": "Nozzle", - "x": 737, - "y": 408 - } - ] - }, - { - "id": "6b5fc888-1246-4de9-be37-393a28f2af00", - "name": "L001", - "type": "27209090", - "x": 390, - "y": 70, - "width": 109, - "height": 80, - "rotation": 0, - "ports": [ - { - "id": "a5f918a4-f2ee-4dfb-9180-f98357155e47", - "name": "ML_1", - "class": "MeasurementPoint", - "x": 445, - "y": 145 - } - ] - }, - { - "id": "a2b064e1-3ebb-4883-b8dc-2c7a2e5ff776", - "name": "F001", - "type": "27209090", - "x": 760, - "y": 290, - "width": 109, - "height": 80, - "rotation": 0, - "ports": [ - { - "id": "659454d8-bb55-4179-a13d-8a575f90423e", - "name": "ML_1", - "class": "MeasurementPoint", - "x": 772, - "y": 340 - } - ] - }, - { - "id": "392bc1a5-ac71-4734-9bd4-f592808a1247", - "name": "L002", - "type": "27143121", - "x": 170, - "y": 180, - "width": 104, - "height": 83, - "rotation": 0, - "ports": [ - { - "id": "8da1c0e9-18b0-49c9-bb61-aeb9145f9e28", - "name": "ML_1", - "class": "MeasurementPoint", - "x": 269, - "y": 235 - } - ] - }, - { - "id": "faa9fd54-79c3-4004-a541-bd0445adc3ee", - "name": "L003", - "type": "27143121", - "x": 170, - "y": 320, - "width": 104, - "height": 83, - "rotation": 0, - "ports": [ - { - "id": "aa14571e-04b8-4043-b801-b860796e5046", - "name": "ML_1", - "class": "MeasurementPoint", - "x": 268, - "y": 375 - } - ] - }, - { - "id": "165d29f1-c52a-47c0-ace3-258c7307aa6f", - "name": "M001", - "type": "27143121", - "x": 310, - "y": 620, - "width": 104, - "height": 83, - "rotation": 0, - "ports": [] - }, - { - "id": "d85e9c78-6578-4cd5-a4aa-10572394e9c4", - "name": "NOTHALT", - "type": "27143121", - "x": 860, - "y": 620, - "width": 104, - "height": 83, - "rotation": 0, - "ports": [] - }, - { - "id": "43fb9dcd-b213-4639-888c-efcd0eb41db2", - "name": "P002", - "type": "27209090", - "x": 893, - "y": 136, - "width": 109, - "height": 80, - "rotation": 0, - "ports": [ - { - "id": "a7d5cd23-e780-4232-aec2-0816aeef2756", - "name": "ML_1", - "class": "MeasurementPoint", - "x": 950, - "y": 147 - } - ] - }, - { - "id": "a33afff3-b113-4642-a48a-396bdfd7b489", - "name": "P003", - "type": "27209090", - "x": 595, - "y": 149, - "width": 109, - "height": 80, - "rotation": 0, - "ports": [ - { - "id": "aba7b780-ecb9-4861-a62a-f2230fa72b01", - "name": "ML_1", - "class": "MeasurementPoint", - "x": 702, - "y": 198 - } - ] - }, - { - "id": "f7b322f5-6f12-4772-9542-508a370fee75", - "name": "DoseAmount", - "type": "25241090", - "x": 50, - "y": 70, - "width": 170, - "height": 86, - "rotation": 0, - "ports": [] - }, - { - "id": "4c6736a3-d1a6-4719-8a37-07eb16283aa2", - "name": "DoseConti", - "type": "25241090", - "x": 50, - "y": 350, - "width": 170, - "height": 86, - "rotation": 0, - "ports": [] - }, - { - "id": "91341078-a7d1-4020-88de-5e250d537eee", - "name": "Fill", - "type": "25241090", - "x": 600, - "y": 70, - "width": 170, - "height": 86, - "rotation": 0, - "ports": [] - }, - { - "id": "12fbf50e-503f-4afd-940b-ba00517ca014", - "name": "Empty", - "type": "25241090", - "x": 600, - "y": 350, - "width": 170, - "height": 86, - "rotation": 0, - "ports": [] - }, - { - "id": "f7df89e0-fd0a-491b-a385-038c10e37aa0", - "name": "SetDuration", - "type": "27209090", - "x": 50, - "y": 160, - "width": 136, - "height": 82, - "rotation": 0, - "ports": [] - }, - { - "id": "f69a68a8-760e-4d77-97ad-24493713a1a9", - "name": "SetVolume", - "type": "27209090", - "x": 180, - "y": 160, - "width": 136, - "height": 82, - "rotation": 0, - "ports": [] - }, - { - "id": "a4f04654-9549-4872-96ee-4a38b719e07b", - "name": "ActualVolume", - "type": "27209090", - "x": 50, - "y": 240, - "width": 109, - "height": 80, - "rotation": 0, - "ports": [] - }, - { - "id": "eadfd98a-88e0-4d1f-877a-bd5665580c89", - "name": "PumpState", - "type": "27143121", - "x": 160, - "y": 240, - "width": 104, - "height": 83, - "rotation": 0, - "ports": [] - }, - { - "id": "a78fb1aa-f924-4334-8f7e-e1303a6e5c48", - "name": "ValvePosition", - "type": "27143121", - "x": 270, - "y": 240, - "width": 104, - "height": 83, - "rotation": 0, - "ports": [] - }, - { - "id": "c2498ff0-db6b-4514-9771-ffe9fddc043a", - "name": "SetVolumeFlow", - "type": "27209090", - "x": 50, - "y": 440, - "width": 136, - "height": 82, - "rotation": 0, - "ports": [] - }, - { - "id": "a38f1d10-fd97-4e78-9a75-2878fa769e5d", - "name": "ActualVolumeFlow", - "type": "27209090", - "x": 50, - "y": 520, - "width": 109, - "height": 80, - "rotation": 0, - "ports": [] - }, - { - "id": "6949e2ce-bf4b-4ec1-9a32-cf8349c07fd8", - "name": "PumpState", - "type": "27143121", - "x": 160, - "y": 520, - "width": 104, - "height": 83, - "rotation": 0, - "ports": [] - }, - { - "id": "b382a1a9-351f-40b1-a31d-cda35f271808", - "name": "ValvePosition", - "type": "27143121", - "x": 270, - "y": 520, - "width": 104, - "height": 83, - "rotation": 0, - "ports": [] - }, - { - "id": "bd2a702b-1fe8-4002-b5ba-c4e1fb55ceea", - "name": "SetVolume", - "type": "27209090", - "x": 600, - "y": 160, - "width": 136, - "height": 82, - "rotation": 0, - "ports": [] - }, - { - "id": "a9d626bd-dd76-4343-b059-3a1b1eacbc8a", - "name": "ActualVolume", - "type": "27209090", - "x": 600, - "y": 240, - "width": 109, - "height": 80, - "rotation": 0, - "ports": [] - }, - { - "id": "a0a6378f-1123-45fa-a17c-c2406f533ec8", - "name": "ValvePosition", - "type": "27143121", - "x": 820, - "y": 240, - "width": 104, - "height": 83, - "rotation": 0, - "ports": [] - }, - { - "id": "11d1f40d-f172-4842-a91e-3ffa77209e3c", - "name": "ActualVolume", - "type": "27209090", - "x": 600, - "y": 520, - "width": 109, - "height": 80, - "rotation": 0, - "ports": [] - }, - { - "id": "d312517e-78cc-42a9-a7d1-e0916c96baf1", - "name": "ValvePosition", - "type": "27143121", - "x": 820, - "y": 520, - "width": 104, - "height": 83, - "rotation": 0, - "ports": [] - }, - { - "id": "9a97aa12-add7-490d-adbe-f292f6e2b845", - "name": "RemainingVolume", - "type": "27209090", - "x": 710, - "y": 240, - "width": 109, - "height": 80, - "rotation": 0, - "ports": [ - { - "id": "48a98ad4-9f33-451c-9551-2eee2b9865c6", - "name": "Nozzle1", - "class": "Nozzle", - "x": 30, - "y": 113 - }, - { - "id": "7e8bb80b-c50d-475f-b816-f76c5c5b088f", - "name": "Nozzle1", - "class": "Nozzle", - "x": 988, - "y": 113 - }, - { - "id": "6eadae6f-7740-447f-b795-f16b3662015f", - "name": "Nozzle1", - "class": "Nozzle", - "x": 92, - "y": 720 - } - ] - }, - { - "id": "deb83235-09c8-4eea-8edb-7a9a00ac844f", - "name": "In", - "type": "Source", - "x": 26, - "y": 107, - "width": 45, - "height": 27, - "rotation": 0, - "ports": [] - }, - { - "id": "d2e714e4-1f24-4804-9f4b-2fda0201632c", - "name": "Out", - "type": "Sink", - "x": 983, - "y": 108, - "width": 45, - "height": 27, - "rotation": 0, - "ports": [] - }, - { - "id": "6cbd3b1e-df00-4cd3-9053-b032f2a79d86", - "name": "Out_Waste", - "type": "Sink", - "x": 87, - "y": 715, - "width": 45, - "height": 27, - "rotation": 0, - "ports": [] - } - ], - "ports": [], - "edges": [ - { - "id": "931404a4-f69c-47ff-96bd-12b56fa084fc", - "sourcePort": "0c623a1d-5ba0-460d-87fc-c1735ca96f77", - "targetPort": "48a98ad4-9f33-451c-9551-2eee2b9865c6", - "source": "e5e58338-f440-4966-9f6c-6924f8b42d3e", - "target": "9a97aa12-add7-490d-adbe-f292f6e2b845" - }, - { - "id": "ad26a58a-6faf-4f1e-8018-5933d76cfff3", - "sourcePort": "6d5cf534-2039-417d-82f6-aacc3bc6bbcb", - "targetPort": "72cbe149-4fd4-4f2b-9121-fa8bc61c8454", - "source": "e5e58338-f440-4966-9f6c-6924f8b42d3e", - "target": "2b9c1c98-0e7c-4d00-b962-83d912584721" - }, - { - "id": "3a70f213-dc89-4df0-8efd-ad01916724ff", - "sourcePort": "3bfc177b-db41-4b59-a9c2-15d033b19b5a", - "targetPort": "cf1d8651-4d64-4c11-b8b1-bd1b4d8790af", - "source": "2b9c1c98-0e7c-4d00-b962-83d912584721", - "target": "16a35ec8-62b9-41de-9710-c36c6656aa40" - }, - { - "id": "23b2d734-e410-4d99-97e4-270d9331b820", - "sourcePort": "b4b34cfc-6753-4443-9b12-ec4945f77e0c", - "targetPort": "a3b0475f-5eb3-475a-b71a-be58adc9a2cf", - "source": "b03b216d-d9ea-4c6f-9cda-8a027aa01e19", - "target": "16a35ec8-62b9-41de-9710-c36c6656aa40" - }, - { - "id": "ceae7d77-cbb9-405c-9e77-befa7b04bfdb", - "sourcePort": "d2f57afc-7ffb-45c4-9c5f-791711fe6163", - "targetPort": "7e8bb80b-c50d-475f-b816-f76c5c5b088f", - "source": "b03b216d-d9ea-4c6f-9cda-8a027aa01e19", - "target": "9a97aa12-add7-490d-adbe-f292f6e2b845" - }, - { - "id": "31a6fb31-cbf3-4a26-afc8-c00edc08c619", - "sourcePort": "502f632b-b0b2-46d9-8b4d-c1c0c4445875", - "targetPort": "2c5426ed-65bb-4ef8-b59b-fe36e03af751", - "source": "51393492-4138-4de0-b9c4-b151149022fe", - "target": "2b9c1c98-0e7c-4d00-b962-83d912584721" - }, - { - "id": "a5e36d53-cdd4-4898-b6e9-a6dc943bf683", - "sourcePort": "95b4adb8-b3b2-4a6d-8143-dd6ca153e726", - "targetPort": "6eadae6f-7740-447f-b795-f16b3662015f", - "source": "51393492-4138-4de0-b9c4-b151149022fe", - "target": "9a97aa12-add7-490d-adbe-f292f6e2b845" - }, - { - "id": "bfac7037-dd1c-426e-8675-80863ef2ce7e", - "sourcePort": "5c0dfa54-435a-443f-ba0e-3487cd610e89", - "targetPort": "aa14571e-04b8-4043-b801-b860796e5046", - "source": "2b9c1c98-0e7c-4d00-b962-83d912584721", - "target": "faa9fd54-79c3-4004-a541-bd0445adc3ee" - }, - { - "id": "85f8a148-b0f2-4b85-b832-e95ce84bbc32", - "sourcePort": "e64eadbe-5737-48d0-9dbd-e2163882a012", - "targetPort": "8da1c0e9-18b0-49c9-bb61-aeb9145f9e28", - "source": "2b9c1c98-0e7c-4d00-b962-83d912584721", - "target": "392bc1a5-ac71-4734-9bd4-f592808a1247" - }, - { - "id": "27461d64-0084-4b99-8b41-ca1be28ed2f3", - "sourcePort": "96495160-b353-4d1c-bbdc-a0e50b7a3d46", - "targetPort": "a5f918a4-f2ee-4dfb-9180-f98357155e47", - "source": "2b9c1c98-0e7c-4d00-b962-83d912584721", - "target": "6b5fc888-1246-4de9-be37-393a28f2af00" - } - ] - } - } - ] -} diff --git a/src/modularPlantManager/pea/_assets/JSON/pea_merck_reactor.json b/src/modularPlantManager/pea/_assets/JSON/pea_merck_reactor.json deleted file mode 100644 index f2aa2722..00000000 --- a/src/modularPlantManager/pea/_assets/JSON/pea_merck_reactor.json +++ /dev/null @@ -1,1859 +0,0 @@ -{ - "peas": [ - { - "id": "React", - "opcua_server_url": "opc.tcp://10.6.51.22:4840", - "rest_api_port": "1201", - "services": [ - { - "name": "Fill_Service", - "communication": { - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"OpMode\"", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"ControlOp\"", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"StrategyOp\"", - "data_type": "UInt32" - }, - "CommandInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"ControlInt\"", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"StrategyInt\"", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"ControlExt\"", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"StrategyExt\"", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"State\"", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"ControlEnable\"", - "data_type": "UInt32" - }, - "CurrentStrategy": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"CurrentStrategy\"", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Fill_Clearance_NB", - "default": true, - "sc": false, - "parameters": [] - }, - { - "id": "2", - "name": "Fill_Level_SB", - "default": false, - "sc": true, - "parameters": [] - } - ], - "parameters": [ - { - "name": "Fill_Level_Max", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - }, - { - "name": "Aerate_Service", - "communication": { - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"OpMode\"", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"ControlOp\"", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"StrategyOp\"", - "data_type": "UInt32" - }, - "CommandInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"ControlInt\"", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"StrategyInt\"", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"ControlExt\"", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"StrategyExt\"", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"State\"", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"ControlEnable\"", - "data_type": "UInt32" - }, - "CurrentStrategy": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"CurrentStrategy\"", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Aerate_Continous", - "default": true, - "sc": false, - "parameters": [ - { - "name": "Aerate_Period", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - } - ], - "parameters": [] - }, - { - "name": "Stir_Service", - "communication": { - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"OpMode\"", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"ControlOp\"", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"StrategyOp\"", - "data_type": "UInt32" - }, - "CommandInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"ControlInt\"", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"StrategyInt\"", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"ControlExt\"", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"StrategyExt\"", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"State\"", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"ControlEnable\"", - "data_type": "UInt32" - }, - "CurrentStrategy": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"CurrentStrategy\"", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Stirring_Continous", - "default": true, - "sc": false, - "parameters": [ - { - "name": "Stir_Rotation", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - } - ], - "parameters": [ - { - "name": "Stir_Level_Min", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - }, - { - "name": "Empty_Service", - "communication": { - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"OpMode\"", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"ControlOp\"", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"StrategyOp\"", - "data_type": "UInt32" - }, - "CommandInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"ControlInt\"", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"StrategyInt\"", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"ControlExt\"", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"StrategyExt\"", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"State\"", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"ControlEnable\"", - "data_type": "UInt32" - }, - "CurrentStrategy": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"CurrentStrategy\"", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Empty_Full", - "default": true, - "sc": false, - "parameters": [ - { - "name": "Empty_VolFlow", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOp\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - }, - { - "id": "2", - "name": "Empty_VolFlow", - "default": false, - "sc": false, - "parameters": [ - { - "name": "Empty_VolFlow", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOp\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - } - ], - "parameters": [ - { - "name": "Empty_Level_Tank_DeadBand", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - } - ], - "process_values": [ - { - "name": "AEM01_AnaDrv", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"OSLevel\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"OpMode\"", - "data_type": "UInt32" - }, - "FwdEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdEn\"", - "data_type": "Boolean" - }, - "RevEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevEn\"", - "data_type": "Boolean" - }, - "StopOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"StopOp\"", - "data_type": "Boolean" - }, - "FwdOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdOp\"", - "data_type": "Boolean" - }, - "RevOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevOp\"", - "data_type": "Boolean" - }, - "StopLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"StopLi\"", - "data_type": "Boolean" - }, - "FwdLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdLi\"", - "data_type": "Boolean" - }, - "RevLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevLi\"", - "data_type": "Boolean" - }, - "FwdCtrl": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdCtrl\"", - "data_type": "Boolean" - }, - "RevCtrl": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevCtrl\"", - "data_type": "Boolean" - }, - "FwdFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdFbkEn\"", - "data_type": "Boolean" - }, - "FwdFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdFbk\"", - "data_type": "Boolean" - }, - "RevFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevFbkEn\"", - "data_type": "Boolean" - }, - "RevFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevFbk\"", - "data_type": "Boolean" - }, - "Trip": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"Trip\"", - "data_type": "Boolean" - }, - "Rpm": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"Rpm\"", - "data_type": "Float" - }, - "RpmSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmSclMin\"", - "data_type": "Float" - }, - "RpmSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmSclMax\"", - "data_type": "Float" - }, - "RpmUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmUnit\"", - "data_type": "Int16" - }, - "RpmMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmMin\"", - "data_type": "Float" - }, - "RpmMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmMax\"", - "data_type": "Float" - }, - "RpmExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmExt\"", - "data_type": "Float" - }, - "RpmInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmInt\"", - "data_type": "Float" - }, - "RpmRbk": { - "value": null - } - } - }, - { - "name": "Aerate_Period_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "AUT01_BinView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AUT01\".\"MTP_BinView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AUT01\".\"MTP_BinView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AUT01\".\"MTP_BinView\".\"V\"", - "data_type": "Boolean" - }, - "VState0": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AUT01\".\"MTP_BinView\".\"VState0\"", - "data_type": "xs:string" - }, - "VState1": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AUT01\".\"MTP_BinView\".\"VState1\"", - "data_type": "xs:string" - } - } - }, - { - "name": "Empty_Level_Tank_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Empty_Level_Tank_DeadBand_AchemaAnaParam", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Empty_VolFlow_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOp\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Empty_Volume_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Fill_Level_Max_AchemaAnaParam", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Fill_Volume_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "MCL01_AnaView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"V\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"VUnit\"", - "data_type": "Int16" - } - } - }, - { - "name": "MCL02_BinView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL02\".\"MTP_BinView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL02\".\"MTP_BinView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL02\".\"MTP_BinView\".\"V\"", - "data_type": "Boolean" - }, - "VState0": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL02\".\"MTP_BinView\".\"VState0\"", - "data_type": "xs:string" - }, - "VState1": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL02\".\"MTP_BinView\".\"VState1\"", - "data_type": "xs:string" - } - } - }, - { - "name": "MCT01_AnaView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"V\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"VUnit\"", - "data_type": "Int16" - } - } - }, - { - "name": "MCT02_AnaView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"V\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"VUnit\"", - "data_type": "Int16" - } - } - }, - { - "name": "MCT03_AnaView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"V\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"VUnit\"", - "data_type": "Int16" - } - } - }, - { - "name": "MCT04_AnaView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"V\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"VUnit\"", - "data_type": "Int16" - } - } - }, - { - "name": "MFH01_BinVlv", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OSLevel\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OpMode\"", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"SafePos\"", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OpenFbkEn\"", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"CloseFbkEn\"", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OpenOp\"", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"CloseOp\"", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OpenLi\"", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"CloseLi\"", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"Ctrl\"", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OpenFbk\"", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"CloseFbk\"", - "data_type": "Boolean" - } - } - }, - { - "name": "MFH02_BinVlv", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OSLevel\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OpMode\"", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"SafePos\"", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OpenFbkEn\"", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"CloseFbkEn\"", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OpenOp\"", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"CloseOp\"", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OpenLi\"", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"CloseLi\"", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"Ctrl\"", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OpenFbk\"", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"CloseFbk\"", - "data_type": "Boolean" - } - } - }, - { - "name": "MFH03_BinVlv", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OSLevel\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OpMode\"", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"SafePos\"", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OpenFbkEn\"", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"CloseFbkEn\"", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OpenOp\"", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"CloseOp\"", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OpenLi\"", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"CloseLi\"", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"Ctrl\"", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OpenFbk\"", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"CloseFbk\"", - "data_type": "Boolean" - } - } - }, - { - "name": "Stir_Level_Min_AchemaAnaParam", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Stir_Period_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Stir_Rotation_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - } - ] -} diff --git a/src/modularPlantManager/pea/_assets/JSON/pea_temper.json b/src/modularPlantManager/pea/_assets/JSON/pea_temper.json deleted file mode 100644 index a0022739..00000000 --- a/src/modularPlantManager/pea/_assets/JSON/pea_temper.json +++ /dev/null @@ -1,1031 +0,0 @@ -{ - "id": "Temper", - "opcua_server_url": "opc.tcp://10.6.51.24:4840", - "services": [ - { - "name": "Circulation", - "communication": { - "TagName": { - "value": "Circulation" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:OpMode", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:ControlOp", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:StrategyOp", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:ControlInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:ControlExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:State", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:ControlEnable", - "data_type": "UInt32" - }, - "CurrentStrategy": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:CurrentStrategy", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "ContinuousCirculation", - "default": true, - "sc": false, - "parameters": [] - } - ], - "parameters": [] - }, - { - "name": "Tempering", - "communication": { - "TagName": { - "value": "Tempering" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:OpMode", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:ControlOp", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:StrategyOp", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:ControlInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:ControlExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:State", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:ControlEnable", - "data_type": "UInt32" - }, - "CurrentStrategy": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:CurrentStrategy", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "2", - "name": "SetpointRampTempering", - "default": false, - "sc": false, - "parameters": [ - { - "name": "RampEndtemperature", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampEndtemp\n", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMax", - "data_type": "Float" - }, - "VUnit": { - "value": "1001" - }, - "VMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMinSP", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMaxSP", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampEndtemp\n", - "data_type": "Float" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "RampDuration", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampDuration", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "180000" - }, - "VUnit": { - "value": "1054" - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "180000" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampDuration", - "data_type": "Float" - }, - "VRbk": { - "value": "1" - } - } - } - ] - }, - { - "id": "1", - "name": "ContinuousTempering", - "default": true, - "sc": false, - "parameters": [ - { - "name": "Setpoint", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vSP", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMax", - "data_type": "Float" - }, - "VUnit": { - "value": "1001" - }, - "VMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMinSP", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMaxSP", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vSP", - "data_type": "Float" - }, - "VRbk": { - "value": "0" - } - } - } - ] - } - ], - "parameters": [ - { - "name": "InternalTempSource", - "interface_class": "ExtDigOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCITM", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "3" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "3" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCITM", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "TemperatureControlModeParam", - "interface_class": "ExtDigOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vTmpMode", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "1" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "1" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vTmpMode", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "ProcessTempSource", - "interface_class": "ExtDigOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCETM", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "3" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "3" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCETM", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - } - ] - } - ], - "process_values": [ - { - "name": "Pump", - "communication": { - "WQC": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:OpMode", - "data_type": "UInt32" - }, - "FwdEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdEn", - "data_type": "Boolean" - }, - "RevEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:revEn", - "data_type": "Boolean" - }, - "StopOp": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:StopOp", - "data_type": "Boolean" - }, - "FwdOp": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdOp", - "data_type": "Boolean" - }, - "RevOp": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:RevOp", - "data_type": "Boolean" - }, - "StopLi": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:StopLi", - "data_type": "Boolean" - }, - "FwdLi": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdLi", - "data_type": "Boolean" - }, - "RevLi": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:RevLi", - "data_type": "Boolean" - }, - "FwdCtrl": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdCtrl", - "data_type": "Boolean" - }, - "RevCtrl": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:RevCtrl", - "data_type": "Boolean" - }, - "FwdFbkEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdFbkEn", - "data_type": "Boolean" - }, - "FwdFbk": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdFbk", - "data_type": "Boolean" - }, - "RevFbkEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:RevFbkEn", - "data_type": "Boolean" - }, - "RevFbk": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:RevFbk", - "data_type": "Boolean" - }, - "Trip": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:Trip", - "data_type": "Boolean" - } - } - }, - { - "name": "TI", - "communication": { - "WQC": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:V", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:Vunit", - "data_type": "Int16" - }, - "VAHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VAHEn", - "data_type": "Boolean" - }, - "VAHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VAHLim", - "data_type": "Float" - }, - "VAHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VAHAct", - "data_type": "Boolean" - }, - "VWHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWHEn", - "data_type": "Boolean" - }, - "VWHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWHLim", - "data_type": "Float" - }, - "VWHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWHAct", - "data_type": "Boolean" - }, - "VTHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTHEn", - "data_type": "Boolean" - }, - "VTHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTHLim", - "data_type": "Float" - }, - "VTHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTHAct", - "data_type": "Boolean" - }, - "VTLEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTLEn", - "data_type": "Boolean" - }, - "VTLLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTLLim", - "data_type": "Float" - }, - "VTLAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTLAct", - "data_type": "Boolean" - }, - "VWLEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWLEn", - "data_type": "Boolean" - }, - "VWLLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWLLim", - "data_type": "Float" - }, - "VWLAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWLAct", - "data_type": "Boolean" - }, - "VALEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VALEn", - "data_type": "Boolean" - }, - "VALLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VALLim", - "data_type": "Float" - }, - "VALAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VALAct", - "data_type": "Boolean" - } - } - }, - { - "name": "TE", - "communication": { - "WQC": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:V", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:Vunit", - "data_type": "Int16" - }, - "VAHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VAHEn", - "data_type": "Boolean" - }, - "VAHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VAHLim", - "data_type": "Float" - }, - "VAHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VAHAct", - "data_type": "Boolean" - }, - "VWHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWHEn", - "data_type": "Boolean" - }, - "VWHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWHLim", - "data_type": "Float" - }, - "VWHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWHAct", - "data_type": "Boolean" - }, - "VTHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTHEn", - "data_type": "Boolean" - }, - "VTHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTHLim", - "data_type": "Float" - }, - "VTHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTHAct", - "data_type": "Boolean" - }, - "VTLEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTLEn", - "data_type": "Boolean" - }, - "VTLLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTLLim", - "data_type": "Float" - }, - "VTLAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTLAct", - "data_type": "Boolean" - }, - "VWLEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWLEn", - "data_type": "Boolean" - }, - "VWLLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWLLim", - "data_type": "Float" - }, - "VWLAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWLAct", - "data_type": "Boolean" - }, - "VALEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VALEn", - "data_type": "Boolean" - }, - "VALLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VALLim", - "data_type": "Float" - }, - "VALAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VALAct", - "data_type": "Boolean" - } - } - }, - { - "name": "Tempering.RampDuration", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampDuration", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "180000" - }, - "VUnit": { - "value": "1054" - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "180000" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampDuration", - "data_type": "Float" - }, - "VRbk": { - "value": "1" - } - } - }, - { - "name": "Tempering.InternalTempSource", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCITM", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "3" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "3" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCITM", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "Tempering.Setpoint", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vSP", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMax", - "data_type": "Float" - }, - "VUnit": { - "value": "1001" - }, - "VMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMinSP", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMaxSP", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vSP", - "data_type": "Float" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "Tempering.TemperatureControlModeParam", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vTmpMode", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "1" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "1" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vTmpMode", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "Tempering.ProcessTempSource", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCETM", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "3" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "3" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCETM", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "Tempering.RampEndtemperature", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampEndtemp\n", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMax", - "data_type": "Float" - }, - "VUnit": { - "value": "1001" - }, - "VMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMinSP", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMaxSP", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampEndtemp\n", - "data_type": "Float" - }, - "VRbk": { - "value": "0" - } - } - } - ] -} diff --git a/src/modularPlantManager/pea/_assets/JSON/pea_testserver_1.0.0_2.json b/src/modularPlantManager/pea/_assets/JSON/pea_testserver_1.0.0_2.json deleted file mode 100644 index 0140e93f..00000000 --- a/src/modularPlantManager/pea/_assets/JSON/pea_testserver_1.0.0_2.json +++ /dev/null @@ -1,811 +0,0 @@ -{ - "peas": [ - { - "id": "PEAMockup", - "opcua_server_url": "opc.tcp://127.0.0.1:4334/PEAMockup", - "services": [ - { - "name": "Service1", - "communication": { - "TagName": { - "value": "Service1" - }, - "TagDescription": { - "value": "Sample service which calculates: PVOut = Factor*PVIn + Offset; PVIntegral = PVIntegral_old + PVOut" - }, - "OSLevel": { - "value": 1 - }, - "WQC": { - "value": 0 - }, - "CommandMan": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Command" - }, - "CommandExt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Command" - }, - "State": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.State" - }, - "CommandEnable": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.CommandEnable" - }, - "StateChannel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.StateChannel" - }, - "StateOffAut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.StateOffAut" - }, - "StateOpAut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.StateOpAut" - }, - "StateAutAut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.StateAutAut" - }, - "StateOffOp": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.StateOffOp" - }, - "StateOpOp": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.StateOpOp" - }, - "StateAutOp": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.StateAutOp" - }, - "StateOffAct": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.StateOffAct" - }, - "StateOpAct": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.StateOpAct" - }, - "StateAutAct": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.StateAutAct" - }, - "StrategyMan": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Strategy" - }, - "StrategyExt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Strategy" - }, - "StrategyInt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Strategy" - }, - "CurrentStrategy": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.CurrentStrategy" - } - }, - "procedures": [ - { - "id": "1", - "name": "Strategy 1", - "default": true, - "sc": true, - "parameters": [ - { - "name": "Factor", - "interface_class": "ExtIntAnaOp", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.V" - }, - "VRbk": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.V" - }, - "VOut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.V" - }, - "VExt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.VExt" - }, - "VSclMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.VSclMax" - }, - "VSclMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.VSclMin" - }, - "VMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.VSclMax" - }, - "VMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.VSclMin" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.VUnit" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.OSLevel" - }, - "StateChannel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.StateChannel" - }, - "StateOffAut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.StateOffAut" - }, - "StateOpAut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.StateOpAut" - }, - "StateAutAut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.StateAutAut" - }, - "StateOffOp": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.StateOffOp" - }, - "StateOpOp": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.StateOpOp" - }, - "StateAutOp": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.StateAutOp" - }, - "StateOffAct": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.StateOffAct" - }, - "StateOpAct": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.StateOpAct" - }, - "StateAutAct": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Factor.StateAutAct" - } - } - }, - { - "name": "Offset", - "interface_class": "ExtAnaOp", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.V" - }, - "VRbk": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.V" - }, - "VOut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.V" - }, - "VExt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VExt" - }, - "VSclMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VSclMax" - }, - "VSclMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VSclMin" - }, - "VMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VSclMax" - }, - "VMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VSclMin" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VUnit" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.OSLevel" - } - } - } - ], - "processValuesIn": [ - { - "name": "PvIn", - "interface_class": "ExtAnaOp", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIn.V" - }, - "VRbk": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIn.V" - }, - "VOut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIn.V" - }, - "VExt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIn.VExt" - }, - "VMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIn.VSclMax" - }, - "VMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIn.VSclMin" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIn.VUnit" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIn.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIn.OSLevel" - } - } - } - ], - "processValuesOut": [ - { - "name": "CurrentTime", - "interface_class": "StrView", - "communication": { - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.CurrentTime.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.CurrentTime.OSLevel", - "data_type": "Byte" - }, - "Text": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.CurrentTime.Text", - "data_type": "String" - } - } - }, - { - "name": "PvOut", - "interface_class": "AnaView", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueOut.V" - }, - "VMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueOut.VSclMax" - }, - "VMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueOut.VSclMin" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueOut.VUnit" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueOut.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueOut.OSLevel" - } - } - }, - { - "name": "PvIntegral", - "interface_class": "AnaView", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.V" - }, - "VMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.VSclMax" - }, - "VMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.VSclMin" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.VUnit" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.OSLevel" - } - } - } - ], - "reportParameters": [ - { - "name": "LastTime", - "interface_class": "StrView", - "communication": { - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalTime.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalTime.OSLevel", - "data_type": "Byte" - }, - "Text": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalTime.Text", - "data_type": "String" - } - } - }, - { - "name": "FinalOut", - "interface_class": "AnaView", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalOut.V" - }, - "VMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalOut.VSclMax" - }, - "VMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalOut.VSclMin" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalOut.VUnit" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalOut.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalOut.OSLevel" - } - } - }, - { - "name": "FinalIntegral", - "interface_class": "AnaView", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalIntegral.V" - }, - "VMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalIntegral.VSclMax" - }, - "VMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalIntegral.VSclMin" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalIntegral.VUnit" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalIntegral.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.FinalIntegral.OSLevel" - } - } - } - ] - }, - { - "id": "2", - "name": "Strategy 2", - "default": false, - "sc": false, - "parameters": [ - { - "name": "Offset", - "interface_class": "ExtAnaOp", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.V" - }, - "VRbk": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.V" - }, - "VOut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.V" - }, - "VExt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VExt" - }, - "VSclMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VSclMax" - }, - "VSclMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VSclMin" - }, - "VMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VSclMax" - }, - "VMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VSclMin" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.VUnit" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.Offset.OSLevel" - } - } - }, - { - "name": "CurrentTime", - "interface_class": "StrView", - "communication": { - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.CurrentTime.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.CurrentTime.OSLevel", - "data_type": "Byte" - }, - "Text": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.CurrentTime.Text", - "data_type": "String" - } - } - } - ] - } - ], - "parameters": [ - { - "name": "UpdateRateInMs", - "interface_class": "ExtAnaOp", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.UpdateRate.V" - }, - "VRbk": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.UpdateRate.V" - }, - "VOut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.UpdateRate.V" - }, - "VExt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.UpdateRate.VExt" - }, - "VMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.UpdateRate.VSclMax" - }, - "VMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.UpdateRate.VSclMin" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.UpdateRate.VUnit" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.UpdateRate.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.UpdateRate.OSLevel" - } - } - } - ] - }, - { - "name": "Service2", - "communication": { - "TagName": { - "value": "Service2" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "value": 1 - }, - "WQC": { - "value": 0 - }, - "CommandMan": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.Command" - }, - "CommandExt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.Command" - }, - "State": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.State" - }, - "CommandEnable": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.CommandEnable" - }, - "OpMode": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.OpMode" - }, - "StrategyMan": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.Strategy" - }, - "StrategyExt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.Strategy" - }, - "StrategyInt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.Strategy" - }, - "CurrentStrategy": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.CurrentStrategy" - } - }, - "procedures": [ - { - "id": "1", - "name": "Strategy 1", - "default": true, - "sc": true, - "parameters": [], - "processValuesIn": [ - { - "name": "PvIn", - "interface_class": "ExtAnaOp", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.ProcessValueIn.V" - }, - "VRbk": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.ProcessValueIn.V" - }, - "VOut": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.ProcessValueIn.V" - }, - "VExt": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.ProcessValueIn.VExt" - }, - "VMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.ProcessValueIn.VSclMax" - }, - "VMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.ProcessValueIn.VSclMin" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.ProcessValueIn.VUnit" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.ProcessValueIn.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service2.ProcessValueIn.OSLevel" - } - } - } - ] - } - ], - "parameters": [] - } - ], - "process_values": [ - { - "name": "Variable001", - "interface_class": "AnaView", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable1.V" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable1.VUnit" - }, - "VSclMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable1.VSclMin" - }, - "VSclMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable1.VSclMax" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable1.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable1.OSLevel" - } - } - }, - { - "name": "Variable002", - "interface_class": "AnaView", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable2.V" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable2.VUnit" - }, - "VSclMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable2.VSclMin" - }, - "VSclMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable2.VSclMax" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable2.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Variable2.OSLevel" - } - } - }, - { - "name": "Variable.003", - "interface_class": "AnaView", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "TestServerVariable.3.V" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "TestServerVariable.3.VUnit" - }, - "VSclMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "TestServerVariable.3.VSclMin" - }, - "VSclMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "TestServerVariable.3.VSclMax" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "TestServerVariable.3.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "TestServerVariable.3.OSLevel" - } - } - }, - { - "name": "PvIntegral", - "interface_class": "AnaView", - "communication": { - "V": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.V" - }, - "VMax": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.VSclMax" - }, - "VMin": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.VSclMin" - }, - "VUnit": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.VUnit" - }, - "WQC": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.WQC" - }, - "OSLevel": { - "namespace_index": "urn:NodeOPCUA-Server-default", - "node_id": "Service1.ProcessValueIntegral.OSLevel" - } - } - } - ] - } - ] -} diff --git a/src/modularPlantManager/pea/_assets/JSON/peas_achema.json b/src/modularPlantManager/pea/_assets/JSON/peas_achema.json deleted file mode 100644 index 0d76293c..00000000 --- a/src/modularPlantManager/pea/_assets/JSON/peas_achema.json +++ /dev/null @@ -1,4614 +0,0 @@ -{ - "peas": [ - { - "id": "Dose", - "opcua_server_url": "opc.tcp://10.6.51.21", - "services": [ - { - "name": "Fill", - "communication": { - "TagName": { - "value": "Fill" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.OpMode.binary", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.ControlOp", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.StrategyOp", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.ControlInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.ControlExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.State.binary", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.ControlEnable.binary", - "data_type": "UInt32" - }, - "CurrentProcedure": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.CurrentProcedure", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Fill_conti", - "default": true, - "sc": false, - "parameters": [] - }, - { - "id": "2", - "name": "Fill_batch", - "default": false, - "sc": true, - "parameters": [ - { - "name": "SetVolume", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VRbk", - "data_type": "Float" - } - } - } - ] - } - ], - "parameters": [] - }, - { - "name": "DoseAmount", - "communication": { - "TagName": { - "value": "DoseAmount" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.OpMode.binary", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.ControlOp", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.StrategyOp", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.ControlInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.ControlExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.State.binary", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.ControlEnable.binary", - "data_type": "UInt32" - }, - "CurrentProcedure": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.CurrentProcedure", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Dose_batch", - "default": true, - "sc": true, - "parameters": [ - { - "name": "SetVolume", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VRbk", - "data_type": "Float" - } - } - }, - { - "name": "SetDuration", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VRbk", - "data_type": "Float" - } - } - } - ] - } - ], - "parameters": [] - }, - { - "name": "DoseConti", - "communication": { - "TagName": { - "value": "DoseConti" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.OpMode.binary", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.ControlOp", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.StrategyOp", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.ControlInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.ControlExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.State.binary", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.ControlEnable.binary", - "data_type": "UInt32" - }, - "CurrentProcedure": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.CurrentProcedure", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Dose_conti", - "default": true, - "sc": false, - "parameters": [ - { - "name": "SetVolumeFlow", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VRbk", - "data_type": "Float" - } - } - } - ] - } - ], - "parameters": [] - }, - { - "name": "Empty", - "communication": { - "TagName": { - "value": "Empty" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.OpMode.binary", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.ControlOp", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.StrategyOp", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.ControlInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.ControlExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.State.binary", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.ControlEnable.binary", - "data_type": "UInt32" - }, - "CurrentProcedure": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Empty.CurrentProcedure", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Empty_batch", - "default": true, - "sc": true, - "parameters": [] - } - ], - "parameters": [] - } - ], - "process_values": [ - { - "name": "Aktoren.V001", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.OpMode.binary", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.SafePos", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.OpenFbkEn", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.CloseFbkEn", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.OpenOp", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.CloseOp", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.OpenLi", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.CloseLi", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.Ctrl", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.OpenFbk", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.CloseFbk", - "data_type": "Boolean" - }, - "PermEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.PermEn", - "data_type": "Boolean" - }, - "Permit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.Permit", - "data_type": "Boolean" - }, - "IntlEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.IntlEn", - "data_type": "Boolean" - }, - "Interlock": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.Interlock", - "data_type": "Boolean" - }, - "ProtEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.ProtEn", - "data_type": "Boolean" - }, - "Protect": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.Protect", - "data_type": "Boolean" - }, - "ResetLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.ResetLi", - "data_type": "Boolean" - }, - "ResetOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.ResetOp", - "data_type": "Boolean" - }, - "MonEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.MonEn", - "data_type": "Boolean" - }, - "MonSafePos": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.MonSafePos", - "data_type": "Boolean" - }, - "MonStatErr": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.MonStatErr", - "data_type": "Boolean" - }, - "MonDynErr": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.MonDynErr", - "data_type": "Boolean" - }, - "MonStatTi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.MonStatTi", - "data_type": "Float" - }, - "MonDynTi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V001.MonDynTi", - "data_type": "Float" - } - } - }, - { - "name": "Aktoren.V002", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.OpMode.binary", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.SafePos", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.OpenFbkEn", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.CloseFbkEn", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.OpenOp", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.CloseOp", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.OpenLi", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.CloseLi", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.Ctrl", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.OpenFbk", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.CloseFbk", - "data_type": "Boolean" - }, - "PermEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.PermEn", - "data_type": "Boolean" - }, - "Permit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.Permit", - "data_type": "Boolean" - }, - "IntlEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.IntlEn", - "data_type": "Boolean" - }, - "Interlock": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.Interlock", - "data_type": "Boolean" - }, - "ProtEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.ProtEn", - "data_type": "Boolean" - }, - "Protect": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.Protect", - "data_type": "Boolean" - }, - "ResetLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.ResetLi", - "data_type": "Boolean" - }, - "ResetOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.ResetOp", - "data_type": "Boolean" - }, - "MonEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.MonEn", - "data_type": "Boolean" - }, - "MonSafePos": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.MonSafePos", - "data_type": "Boolean" - }, - "MonStatErr": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.MonStatErr", - "data_type": "Boolean" - }, - "MonDynErr": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.MonDynErr", - "data_type": "Boolean" - }, - "MonStatTi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.MonStatTi", - "data_type": "Float" - }, - "MonDynTi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V002.MonDynTi", - "data_type": "Float" - } - } - }, - { - "name": "Aktoren.V003", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.OpMode.binary", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.SafePos", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.OpenFbkEn", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.CloseFbkEn", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.OpenOp", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.CloseOp", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.OpenLi", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.CloseLi", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.Ctrl", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.OpenFbk", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.CloseFbk", - "data_type": "Boolean" - }, - "PermEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.PermEn", - "data_type": "Boolean" - }, - "Permit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.Permit", - "data_type": "Boolean" - }, - "IntlEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.IntlEn", - "data_type": "Boolean" - }, - "Interlock": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.Interlock", - "data_type": "Boolean" - }, - "ProtEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.ProtEn", - "data_type": "Boolean" - }, - "Protect": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.Protect", - "data_type": "Boolean" - }, - "ResetLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.ResetLi", - "data_type": "Boolean" - }, - "ResetOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.ResetOp", - "data_type": "Boolean" - }, - "MonEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.MonEn", - "data_type": "Boolean" - }, - "MonSafePos": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.MonSafePos", - "data_type": "Boolean" - }, - "MonStatErr": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.MonStatErr", - "data_type": "Boolean" - }, - "MonDynErr": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.MonDynErr", - "data_type": "Boolean" - }, - "MonStatTi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.MonStatTi", - "data_type": "Float" - }, - "MonDynTi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.V003.MonDynTi", - "data_type": "Float" - } - } - }, - { - "name": "Aktoren.P001_PID", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.OpMode.binary", - "data_type": "UInt32" - }, - "PV": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.PV", - "data_type": "Float" - }, - "PVSclMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.PVSclMin", - "data_type": "Float" - }, - "PVSclMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.PVSclMax", - "data_type": "Float" - }, - "PVUnit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.PVUnit", - "data_type": "Int16" - }, - "SP": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.SP", - "data_type": "Float" - }, - "SPSclMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.SPSclMin", - "data_type": "Float" - }, - "SPSclMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.SPSclMax", - "data_type": "Float" - }, - "SPUnit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.SPUnit", - "data_type": "Int16" - }, - "SPExtMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.SPExtMin", - "data_type": "Float" - }, - "SPExtMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.SPExtMax", - "data_type": "Float" - }, - "SPExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.SPExt", - "data_type": "Float" - }, - "SPIntMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.SPIntMin", - "data_type": "Float" - }, - "SPIntMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.SPIntMax", - "data_type": "Float" - }, - "SPInt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.SPInt", - "data_type": "Float" - }, - "MVOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.MVOp", - "data_type": "Float" - }, - "MV": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.MV", - "data_type": "Float" - }, - "MVMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.MVMin", - "data_type": "Float" - }, - "MVMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.MVMax", - "data_type": "Float" - }, - "MVSclMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.MVSclMin", - "data_type": "Float" - }, - "MVSclMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.MVSclMax", - "data_type": "Float" - }, - "MVUnit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.MVUnit", - "data_type": "Int16" - }, - "P": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.P", - "data_type": "Float" - }, - "Ts": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.Ts", - "data_type": "Float" - }, - "Td": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001_PID.Td", - "data_type": "Float" - } - } - }, - { - "name": "Aktoren.P001", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.OpMode.binary", - "data_type": "UInt32" - }, - "FwdEn": { - "namespace_index": null, - "node_id": null, - "data_type": "Boolean" - }, - "RevEn": { - "namespace_index": null, - "node_id": null, - "data_type": "Boolean" - }, - "StopOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.StopOp", - "data_type": "Boolean" - }, - "FwdOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.FwdOp", - "data_type": "Boolean" - }, - "RevOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.RevOp", - "data_type": "Boolean" - }, - "StopLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.StopLi", - "data_type": "Boolean" - }, - "FwdLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.FwdLi", - "data_type": "Boolean" - }, - "RevLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.RevLi", - "data_type": "Boolean" - }, - "FwdCtrl": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.FwdCtrl", - "data_type": "Boolean" - }, - "RevCtrl": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.RevCtrl", - "data_type": "Boolean" - }, - "FwdFbkEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.FwdFbkEn", - "data_type": "Boolean" - }, - "FwdFbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.FwdFbk", - "data_type": "Boolean" - }, - "RevFbkEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.RevFbkEn", - "data_type": "Boolean" - }, - "RevFbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.RevFbk", - "data_type": "Boolean" - }, - "Trip": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.Trip", - "data_type": "Boolean" - }, - "PermEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.PermEn", - "data_type": "Boolean" - }, - "Permit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.Permit", - "data_type": "Boolean" - }, - "IntlEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.IntlEn", - "data_type": "Boolean" - }, - "Interlock": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.Interlock", - "data_type": "Boolean" - }, - "ProtEn": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.ProtEn", - "data_type": "Boolean" - }, - "Protect": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.Protect", - "data_type": "Boolean" - }, - "ResetLi": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.ResetLi", - "data_type": "Boolean" - }, - "ResetOp": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Aktoren.P001.ResetOp", - "data_type": "Boolean" - } - } - }, - { - "name": "Sensoren.L001", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.L001.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.L001.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.L001.V", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "30" - }, - "VUnit": { - "value": "1038" - } - } - }, - { - "name": "Sensoren.F001", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.F001.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.F001.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.F001.V", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "2" - }, - "VUnit": { - "value": "1352" - } - } - }, - { - "name": "Sensoren.L002", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.L002.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.L002.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.L002.V", - "data_type": "Boolean" - }, - "VState0": { - "value": "OK" - }, - "VState1": { - "value": "Voll" - } - } - }, - { - "name": "Sensoren.L003", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.L003.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.L003.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.L003.V", - "data_type": "Boolean" - }, - "VState0": { - "value": "Leer" - }, - "VState1": { - "value": "OK" - } - } - }, - { - "name": "Sensoren.M001", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.M001.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.M001.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.M001.V", - "data_type": "Boolean" - }, - "VState0": { - "value": "Leckage" - }, - "VState1": { - "value": "OK" - } - } - }, - { - "name": "Sensoren.NOTHALT", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.NOTHALT.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.NOTHALT.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.NOTHALT.V", - "data_type": "Boolean" - }, - "VState0": { - "value": "Nothalt ausgel\u00f6st" - }, - "VState1": { - "value": "OK" - } - } - }, - { - "name": "Sensoren.P002", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.P002.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.P002.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.P002.V", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "4" - }, - "VUnit": { - "value": "1137" - } - } - }, - { - "name": "Sensoren.P003", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.P003.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.P003.OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Sensoren.P003.V", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "4" - }, - "VUnit": { - "value": "1137" - } - } - }, - { - "name": "Fill.SetVolume", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.Fill.SetVolume.VRbk", - "data_type": "Float" - } - } - }, - { - "name": "DoseAmount.SetVolume", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VRbk", - "data_type": "Float" - } - } - }, - { - "name": "DoseAmount.SetDuration", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VRbk", - "data_type": "Float" - } - } - }, - { - "name": "DoseConti.SetVolumeFlow", - "communication": { - "WQC": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.OSLevel", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VOut", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VUnit", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VMin", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VMax", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VExt", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "P2OGalaxy", - "node_id": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VRbk", - "data_type": "Float" - } - } - } - ] - }, - { - "id": "React", - "opcua_server_url": "opc.tcp://10.6.51.22:4840", - "services": [ - { - "name": "Fill_Service", - "communication": { - "TagName": { - "value": "Fill_Service" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"OpMode\"", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"CommandMan\"", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"StrategyMan\"", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"ControlInt\"", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"StrategyInt\"", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"CommandExt\"", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"StrategyExt\"", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"State\"", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"CommandEnable\"", - "data_type": "UInt32" - }, - "CurrentProcedure": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Service\".\"MTP\".\"CurrentProcedure\"", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Fill_Clearance_NB", - "default": true, - "sc": false, - "parameters": [] - }, - { - "id": "2", - "name": "Fill_Level_SB", - "default": false, - "sc": true, - "parameters": [] - } - ], - "parameters": [ - { - "name": "Fill_Level_Max", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - }, - { - "name": "Aerate_Service", - "communication": { - "TagName": { - "value": "Aerate_Service" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"OpMode\"", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"CommandMan\"", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"StrategyMan\"", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"ControlInt\"", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"StrategyInt\"", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"CommandExt\"", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"StrategyExt\"", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"State\"", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"CommandEnable\"", - "data_type": "UInt32" - }, - "CurrentProcedure": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Service\".\"MTP\".\"CurrentProcedure\"", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Aerate_Continous", - "default": true, - "sc": false, - "parameters": [ - { - "name": "Aerate_Period", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - } - ], - "parameters": [] - }, - { - "name": "Stir_Service", - "communication": { - "TagName": { - "value": "Stir_Service" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"OpMode\"", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"CommandMan\"", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"StrategyMan\"", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"ControlInt\"", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"StrategyInt\"", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"CommandExt\"", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"StrategyExt\"", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"State\"", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"CommandEnable\"", - "data_type": "UInt32" - }, - "CurrentProcedure": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Service\".\"MTP\".\"CurrentProcedure\"", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Stirring_Continous", - "default": true, - "sc": false, - "parameters": [ - { - "name": "Stir_Rotation", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VOp\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - } - ], - "parameters": [ - { - "name": "Stir_Level_Min", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - }, - { - "name": "Empty_Service", - "communication": { - "TagName": { - "value": "Empty_Service" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"OpMode\"", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"CommandMan\"", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"StrategyMan\"", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"ControlInt\"", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"StrategyInt\"", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"CommandExt\"", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"StrategyExt\"", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"State\"", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"CommandEnable\"", - "data_type": "UInt32" - }, - "CurrentProcedure": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Service\".\"MTP\".\"CurrentProcedure\"", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "Empty_Full", - "default": true, - "sc": false, - "parameters": [ - { - "name": "Empty_VolFlow", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOp\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - }, - { - "id": "2", - "name": "Empty_VolFlow", - "default": false, - "sc": false, - "parameters": [ - { - "name": "Empty_VolFlow", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOp\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - } - ], - "parameters": [ - { - "name": "Empty_Level_Tank_DeadBand", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - } - ], - "process_values": [ - { - "name": "AEM01_AnaDrv", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"OSLevel\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"OpMode\"", - "data_type": "UInt32" - }, - "FwdEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdEn\"", - "data_type": "Boolean" - }, - "RevEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevEn\"", - "data_type": "Boolean" - }, - "StopOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"StopOp\"", - "data_type": "Boolean" - }, - "FwdOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdOp\"", - "data_type": "Boolean" - }, - "RevOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevOp\"", - "data_type": "Boolean" - }, - "StopLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"StopLi\"", - "data_type": "Boolean" - }, - "FwdLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdLi\"", - "data_type": "Boolean" - }, - "RevLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevLi\"", - "data_type": "Boolean" - }, - "FwdCtrl": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdCtrl\"", - "data_type": "Boolean" - }, - "RevCtrl": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevCtrl\"", - "data_type": "Boolean" - }, - "FwdFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdFbkEn\"", - "data_type": "Boolean" - }, - "FwdFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"FwdFbk\"", - "data_type": "Boolean" - }, - "RevFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevFbkEn\"", - "data_type": "Boolean" - }, - "RevFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RevFbk\"", - "data_type": "Boolean" - }, - "Trip": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"Trip\"", - "data_type": "Boolean" - }, - "Rpm": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"Rpm\"", - "data_type": "Float" - }, - "RpmSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmSclMin\"", - "data_type": "Float" - }, - "RpmSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmSclMax\"", - "data_type": "Float" - }, - "RpmUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmUnit\"", - "data_type": "Int16" - }, - "RpmMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmMin\"", - "data_type": "Float" - }, - "RpmMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmMax\"", - "data_type": "Float" - }, - "RpmExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmExt\"", - "data_type": "Float" - }, - "RpmInt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AEM01\".\"MTP_AnaDrv\".\"RpmInt\"", - "data_type": "Float" - }, - "RpmRbk": { - "value": null - } - } - }, - { - "name": "Aerate_Period_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Aerate_Period\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "AUT01_BinView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AUT01\".\"MTP_BinView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AUT01\".\"MTP_BinView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AUT01\".\"MTP_BinView\".\"V\"", - "data_type": "Boolean" - }, - "VState0": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AUT01\".\"MTP_BinView\".\"VState0\"", - "data_type": "xs:string" - }, - "VState1": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"AUT01\".\"MTP_BinView\".\"VState1\"", - "data_type": "xs:string" - } - } - }, - { - "name": "Empty_Level_Tank_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Empty_Level_Tank_DeadBand_AchemaAnaParam", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Level_Tank_DeadBand\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Empty_VolFlow_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VOp\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_VolFlow\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Empty_Volume_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Empty_Volume\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Fill_Level_Max_AchemaAnaParam", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Level_Max\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Fill_Volume_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Fill_Volume\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "MCL01_AnaView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"V\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL01\".\"MTP_AnaView\".\"VUnit\"", - "data_type": "Int16" - } - } - }, - { - "name": "MCL02_BinView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL02\".\"MTP_BinView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL02\".\"MTP_BinView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL02\".\"MTP_BinView\".\"V\"", - "data_type": "Boolean" - }, - "VState0": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL02\".\"MTP_BinView\".\"VState0\"", - "data_type": "xs:string" - }, - "VState1": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCL02\".\"MTP_BinView\".\"VState1\"", - "data_type": "xs:string" - } - } - }, - { - "name": "MCT01_AnaView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"V\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT01\".\"MTP_AnaView\".\"VUnit\"", - "data_type": "Int16" - } - } - }, - { - "name": "MCT02_AnaView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"V\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT02\".\"MTP_AnaView\".\"VUnit\"", - "data_type": "Int16" - } - } - }, - { - "name": "MCT03_AnaView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"V\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT03\".\"MTP_AnaView\".\"VUnit\"", - "data_type": "Int16" - } - } - }, - { - "name": "MCT04_AnaView", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"OSLevel\"", - "data_type": "Byte" - }, - "V": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"V\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MCT04\".\"MTP_AnaView\".\"VUnit\"", - "data_type": "Int16" - } - } - }, - { - "name": "MFH01_BinVlv", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OSLevel\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OpMode\"", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"SafePos\"", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OpenFbkEn\"", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"CloseFbkEn\"", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OpenOp\"", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"CloseOp\"", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OpenLi\"", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"CloseLi\"", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"Ctrl\"", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"OpenFbk\"", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH01\".\"MTP_BinVlv\".\"CloseFbk\"", - "data_type": "Boolean" - } - } - }, - { - "name": "MFH02_BinVlv", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OSLevel\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OpMode\"", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"SafePos\"", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OpenFbkEn\"", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"CloseFbkEn\"", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OpenOp\"", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"CloseOp\"", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OpenLi\"", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"CloseLi\"", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"Ctrl\"", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"OpenFbk\"", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH02\".\"MTP_BinVlv\".\"CloseFbk\"", - "data_type": "Boolean" - } - } - }, - { - "name": "MFH03_BinVlv", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OSLevel\"", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OpMode\"", - "data_type": "UInt32" - }, - "SafePos": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"SafePos\"", - "data_type": "Boolean" - }, - "OpenFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OpenFbkEn\"", - "data_type": "Boolean" - }, - "CloseFbkEn": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"CloseFbkEn\"", - "data_type": "Boolean" - }, - "OpenOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OpenOp\"", - "data_type": "Boolean" - }, - "CloseOp": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"CloseOp\"", - "data_type": "Boolean" - }, - "OpenLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OpenLi\"", - "data_type": "Boolean" - }, - "CloseLi": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"CloseLi\"", - "data_type": "Boolean" - }, - "Ctrl": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"Ctrl\"", - "data_type": "Boolean" - }, - "OpenFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"OpenFbk\"", - "data_type": "Boolean" - }, - "CloseFbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"MFH03\".\"MTP_BinVlv\".\"CloseFbk\"", - "data_type": "Boolean" - } - } - }, - { - "name": "Stir_Level_Min_AchemaAnaParam", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Level_Min\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Stir_Period_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Period\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - }, - { - "name": "Stir_Rotation_AchemaAnaSP", - "communication": { - "WQC": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"WQC\"", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"OSLevel\"", - "data_type": "Byte" - }, - "VOut": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VOut\"", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VSclMin\"", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VSclMax\"", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VUnit\"", - "data_type": "Int16" - }, - "VMin": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VMin\"", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VMax\"", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VExt\"", - "data_type": "Float" - }, - "VRbk": { - "namespace_index": "http://www.siemens.com/simatic-s7-opcua", - "node_id": "\"Stir_Rotation\".\"MTP\".\"VRbk\"", - "data_type": "Float" - } - } - } - ] - }, - { - "id": "Temper", - "opcua_server_url": "opc.tcp://10.6.51.24:4840", - "services": [ - { - "name": "Circulation", - "communication": { - "TagName": { - "value": "Circulation" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:OpMode", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:ControlOp", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:StrategyOp", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:ControlInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:ControlExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:State", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:ControlEnable", - "data_type": "UInt32" - }, - "CurrentProcedure": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:circulation:control:CurrentProcedure", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "1", - "name": "ContinuousCirculation", - "default": true, - "sc": false, - "parameters": [] - } - ], - "parameters": [] - }, - { - "name": "Tempering", - "communication": { - "TagName": { - "value": "Tempering" - }, - "TagDescription": { - "value": "Sample service with different parameters" - }, - "OSLevel": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:OSLevel", - "data_type": "Byte" - }, - "WQC": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:WQC", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:OpMode", - "data_type": "UInt32" - }, - "CommandMan": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:ControlOp", - "data_type": "UInt32" - }, - "StrategyMan": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:StrategyOp", - "data_type": "UInt32" - }, - "ControlInt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:ControlInt", - "data_type": "UInt32" - }, - "StrategyInt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:StrategyInt", - "data_type": "UInt32" - }, - "CommandExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:ControlExt", - "data_type": "UInt32" - }, - "StrategyExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:StrategyExt", - "data_type": "UInt32" - }, - "State": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:State", - "data_type": "UInt32" - }, - "CommandEnable": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:ControlEnable", - "data_type": "UInt32" - }, - "CurrentProcedure": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:control:CurrentProcedure", - "data_type": "UInt32" - } - }, - "procedures": [ - { - "id": "2", - "name": "SetpointRampTempering", - "default": false, - "sc": false, - "parameters": [ - { - "name": "RampEndtemperature", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampEndtemp\n", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMax", - "data_type": "Float" - }, - "VUnit": { - "value": "1001" - }, - "VMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMinSP", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMaxSP", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampEndtemp\n", - "data_type": "Float" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "RampDuration", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampDuration", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "180000" - }, - "VUnit": { - "value": "1054" - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "180000" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampDuration", - "data_type": "Float" - }, - "VRbk": { - "value": "1" - } - } - } - ] - }, - { - "id": "1", - "name": "ContinuousTempering", - "default": true, - "sc": false, - "parameters": [ - { - "name": "Setpoint", - "interface_class": "ExtAnaOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vSP", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMax", - "data_type": "Float" - }, - "VUnit": { - "value": "1001" - }, - "VMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMinSP", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMaxSP", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vSP", - "data_type": "Float" - }, - "VRbk": { - "value": "0" - } - } - } - ] - } - ], - "parameters": [ - { - "name": "InternalTempSource", - "interface_class": "ExtDigOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCITM", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "3" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "3" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCITM", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "TemperatureControlModeParam", - "interface_class": "ExtDigOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vTmpMode", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "1" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "1" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vTmpMode", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "ProcessTempSource", - "interface_class": "ExtDigOp", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCETM", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "3" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "3" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCETM", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - } - ] - } - ], - "process_values": [ - { - "name": "Pump", - "communication": { - "WQC": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:OSLevel", - "data_type": "Byte" - }, - "OpMode": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:OpMode", - "data_type": "UInt32" - }, - "FwdEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdEn", - "data_type": "Boolean" - }, - "RevEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:revEn", - "data_type": "Boolean" - }, - "StopOp": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:StopOp", - "data_type": "Boolean" - }, - "FwdOp": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdOp", - "data_type": "Boolean" - }, - "RevOp": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:RevOp", - "data_type": "Boolean" - }, - "StopLi": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:StopLi", - "data_type": "Boolean" - }, - "FwdLi": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdLi", - "data_type": "Boolean" - }, - "RevLi": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:RevLi", - "data_type": "Boolean" - }, - "FwdCtrl": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdCtrl", - "data_type": "Boolean" - }, - "RevCtrl": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:RevCtrl", - "data_type": "Boolean" - }, - "FwdFbkEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdFbkEn", - "data_type": "Boolean" - }, - "FwdFbk": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:FwdFbk", - "data_type": "Boolean" - }, - "RevFbkEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:RevFbkEn", - "data_type": "Boolean" - }, - "RevFbk": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:RevFbk", - "data_type": "Boolean" - }, - "Trip": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:Pump:Trip", - "data_type": "Boolean" - } - } - }, - { - "name": "TI", - "communication": { - "WQC": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:V", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:Vunit", - "data_type": "Int16" - }, - "VAHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VAHEn", - "data_type": "Boolean" - }, - "VAHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VAHLim", - "data_type": "Float" - }, - "VAHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VAHAct", - "data_type": "Boolean" - }, - "VWHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWHEn", - "data_type": "Boolean" - }, - "VWHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWHLim", - "data_type": "Float" - }, - "VWHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWHAct", - "data_type": "Boolean" - }, - "VTHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTHEn", - "data_type": "Boolean" - }, - "VTHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTHLim", - "data_type": "Float" - }, - "VTHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTHAct", - "data_type": "Boolean" - }, - "VTLEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTLEn", - "data_type": "Boolean" - }, - "VTLLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTLLim", - "data_type": "Float" - }, - "VTLAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VTLAct", - "data_type": "Boolean" - }, - "VWLEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWLEn", - "data_type": "Boolean" - }, - "VWLLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWLLim", - "data_type": "Float" - }, - "VWLAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VWLAct", - "data_type": "Boolean" - }, - "VALEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VALEn", - "data_type": "Boolean" - }, - "VALLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VALLim", - "data_type": "Float" - }, - "VALAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TI:VALAct", - "data_type": "Boolean" - } - } - }, - { - "name": "TE", - "communication": { - "WQC": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:WQC", - "data_type": "Byte" - }, - "OSLevel": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:OSLevel", - "data_type": "Byte" - }, - "V": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:V", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VSclMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VSclMax", - "data_type": "Float" - }, - "VUnit": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:Vunit", - "data_type": "Int16" - }, - "VAHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VAHEn", - "data_type": "Boolean" - }, - "VAHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VAHLim", - "data_type": "Float" - }, - "VAHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VAHAct", - "data_type": "Boolean" - }, - "VWHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWHEn", - "data_type": "Boolean" - }, - "VWHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWHLim", - "data_type": "Float" - }, - "VWHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWHAct", - "data_type": "Boolean" - }, - "VTHEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTHEn", - "data_type": "Boolean" - }, - "VTHLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTHLim", - "data_type": "Float" - }, - "VTHAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTHAct", - "data_type": "Boolean" - }, - "VTLEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTLEn", - "data_type": "Boolean" - }, - "VTLLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTLLim", - "data_type": "Float" - }, - "VTLAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VTLAct", - "data_type": "Boolean" - }, - "VWLEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWLEn", - "data_type": "Boolean" - }, - "VWLLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWLLim", - "data_type": "Float" - }, - "VWLAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VWLAct", - "data_type": "Boolean" - }, - "VALEn": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VALEn", - "data_type": "Boolean" - }, - "VALLim": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VALLim", - "data_type": "Float" - }, - "VALAct": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:hmi:TE:VALAct", - "data_type": "Boolean" - } - } - }, - { - "name": "Tempering.RampDuration", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampDuration", - "data_type": "Float" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "180000" - }, - "VUnit": { - "value": "1054" - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "180000" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampDuration", - "data_type": "Float" - }, - "VRbk": { - "value": "1" - } - } - }, - { - "name": "Tempering.InternalTempSource", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCITM", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "3" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "3" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCITM", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "Tempering.Setpoint", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vSP", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMax", - "data_type": "Float" - }, - "VUnit": { - "value": "1001" - }, - "VMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMinSP", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMaxSP", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vSP", - "data_type": "Float" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "Tempering.TemperatureControlModeParam", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vTmpMode", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "1" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "1" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vTmpMode", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "Tempering.ProcessTempSource", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCETM", - "data_type": "Int32" - }, - "VSclMin": { - "value": "0" - }, - "VSclMax": { - "value": "3" - }, - "VUnit": { - "value": null - }, - "VMin": { - "value": "0" - }, - "VMax": { - "value": "3" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vCETM", - "data_type": "Int32" - }, - "VRbk": { - "value": "0" - } - } - }, - { - "name": "Tempering.RampEndtemperature", - "communication": { - "WQC": { - "value": "16#FF" - }, - "OSLevel": { - "value": "0" - }, - "VOut": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampEndtemp\n", - "data_type": "Float" - }, - "VSclMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMin", - "data_type": "Float" - }, - "VSclMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vDeviceMax", - "data_type": "Float" - }, - "VUnit": { - "value": "1001" - }, - "VMin": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMinSP", - "data_type": "Float" - }, - "VMax": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:config:vMaxSP", - "data_type": "Float" - }, - "VExt": { - "namespace_index": "urn:ModuleTypePackage:DeviceId=1", - "node_id": "mtp:services:tempering:procedure:vRampEndtemp\n", - "data_type": "Float" - }, - "VRbk": { - "value": "0" - } - } - } - ] - } - ] -} diff --git a/src/modularPlantManager/pea/connection/DataItem.puml b/src/modularPlantManager/pea/connection/DataItem.puml index 26e0b95e..e5cf8781 100644 --- a/src/modularPlantManager/pea/connection/DataItem.puml +++ b/src/modularPlantManager/pea/connection/DataItem.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/connection/DataItem.spec.ts b/src/modularPlantManager/pea/connection/DataItem.spec.ts index aea36f54..d636e843 100644 --- a/src/modularPlantManager/pea/connection/DataItem.spec.ts +++ b/src/modularPlantManager/pea/connection/DataItem.spec.ts @@ -23,178 +23,140 @@ * SOFTWARE. */ -import {OpcUaConnection} from './index'; +import {BaseStaticDataItem} from './index'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {OpcUaDataItem} from './OpcUaDataItem'; -import {MockupServer} from '../../_utils'; -import {namespaceUrl} from '../../../../tests/namespaceUrl'; -import {AnaViewMockup} from '../dataAssembly/indicatorElement/AnaView/AnaView.mockup'; -import {Namespace, UAObject} from 'node-opcua'; +import {DataItemOptions} from './DataItemFactory'; chai.use(chaiAsPromised); const expect = chai.expect; describe('DataItem', () => { - describe('static', () => { - const connection = new OpcUaConnection('PEATestServer', 'opc.tcp://127.0.0.1:4334/PEATestServer'); - - it('should work with float', () => { - const di = OpcUaDataItem.createFromOptions( - {value: 1.2, dataType: 'Float', nodeId: 'test', namespaceIndex: 'test2'}, - connection, 'read', 'number'); - expect(di.value).to.equal(1.2); - }); - - it('should work with float conversion', () => { - const di = OpcUaDataItem.createFromOptions( - {value: '1.2', dataType: 'Float', nodeId: 'test', namespaceIndex: 'test2'}, - connection, 'read', 'number'); - expect(di.value).to.equal(1.2); - }); - - it('should work with value = 0', () => { - const di = OpcUaDataItem.createFromOptions( - {value: 0.0, dataType: 'Float', nodeId: 'test', namespaceIndex: 'test2'}, - connection, 'read', 'number'); - expect(di.value).to.equal(0); - }); - - it('should work with negative value', () => { - const di = OpcUaDataItem.createFromOptions( - {value: -2, dataType: 'Float', nodeId: 'test', namespaceIndex: 'test2'}, - connection, 'read', 'number'); - expect(di.value).to.equal(-2.0); - }); - - it('should work with undefined value', () => { - const di = OpcUaDataItem.createFromOptions( - {value: undefined, dataType: 'Float', nodeId: 'test', namespaceIndex: 'test2'}, - connection, 'read', 'number'); - expect(di.value).to.equal(undefined); - expect(di.access).to.equal('read'); - }); - - it('should work with string conversion', () => { - const di = OpcUaDataItem.createFromOptions( - {value: 1.2, dataType: 'Float', nodeId: 'test', namespaceIndex: 'test2'}, - connection, 'read', 'string'); - expect(di.value).to.equal('1.2'); - }); - - it('should reject, when not connected', async () => { - const di = OpcUaDataItem.createFromOptions( - { - namespaceIndex: 'urn:NodeOPCUA-Server-default', - nodeId: 'Service1.Factor.VExt', - dataType: 'Double' - }, connection, 'write', 'number'); - await expect(di.read()).to.be.rejectedWith('Could not read Service1.Factor.VExt'); - }); - }); - - describe('with testserver', () => { - // DO NOT FORGET TO ADJUST NAMESPACEURL IN namespaceUrl.ts - let mockupServer: MockupServer; - let connection: OpcUaConnection; - - before(async function () { - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockup = new AnaViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - }); - - after(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - it('should subscribe', async () => { - const di = OpcUaDataItem.createFromOptions( - { - nodeId: 'trigger', - namespaceIndex: namespaceUrl, - dataType: 'xs:IDREF' - }, connection, 'read'); - di.subscribe(); //Don't use 'await', because without startListening, this won't resolve //TODO: maybe refactor - await connection.startListening(); - await new Promise((resolve) => di.on('changed', resolve)); - expect(di.value).to.equal(false); + describe('BaseStaticDataItem', () => { + + describe('Type number', () => { + + it('should work with float default value', () => { + const options: DataItemOptions = {type: 'number', defaultValue: 1.2}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(1.2); + }); + + it('should work with string default value', () => { + const options: DataItemOptions = {type: 'number', defaultValue: '1.2'}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(1.2); + }); + + it('should work with boolean default value', () => { + const options: DataItemOptions = {type: 'number', defaultValue: true}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(1); + }); + + it('should work with value = 0', () => { + const options: DataItemOptions = {type: 'number', defaultValue: 0.0}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(0); + }); + + it('should work with negative value', () => { + const options: DataItemOptions = {type: 'number', defaultValue: -2}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(-2.0); + }); + + it('should work with undefined value', () => { + const options: DataItemOptions = {type: 'number', defaultValue: undefined}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(0); + }); }); - it('should subscribe, disconnect and resubscribe', async () => { - const di = OpcUaDataItem.createFromOptions( - { - nodeId: 'trigger', - namespaceIndex: namespaceUrl, - dataType: 'xs:IDREF' - }, connection, 'write'); - - di.subscribe(); - await connection.startListening(); - await new Promise((resolve) => di.on('changed', resolve)); - - await connection.disconnect(); - await connection.connect(); - - di.subscribe(); - await connection.startListening(); - await new Promise((resolve) => di.on('changed', resolve)); - }).timeout(5000); - - it('should write', async () => { - const di = OpcUaDataItem.createFromOptions( - { - namespaceIndex: namespaceUrl, - nodeId: 'testNumber', - dataType: 'Float' - }, connection, 'write'); - await di.write(22.0); - const value = await di.read(); - expect(value).to.be.equal(22.0); + describe('Type string', () => { + + it('should work with float default value', () => { + const options: DataItemOptions = {type: 'string', defaultValue: 1.2}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal('1.2'); + }); + + it('should work with string default value', () => { + const options: DataItemOptions = {type: 'string', defaultValue: '1.2'}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal('1.2'); + }); + + it('should work with boolean default value', () => { + const options: DataItemOptions = {type: 'string', defaultValue: true}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal('true'); + }); + + it('should work with value = 0', () => { + const options: DataItemOptions = {type: 'string', defaultValue: 0.0}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(''); + }); + + it('should work with value = 0', () => { + const options: DataItemOptions = {type: 'string', defaultValue: 0}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(''); + }); + + it('should work with negative value', () => { + const options: DataItemOptions = {type: 'string', defaultValue: -2}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal('-2'); + }); + + it('should work with undefined value', () => { + const options: DataItemOptions = {type: 'string', defaultValue: undefined}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(''); + }); }); - it('should fail while writing with wrong datatype', async () => { - const di = OpcUaDataItem.createFromOptions( - { - namespaceIndex: namespaceUrl, - nodeId: 'testNumber', - dataType: 'Float' - }, connection, 'write'); - await expect(di.write('test')).to.be.rejectedWith('value supplied for ' + - 'the attribute is not of the same type'); - const value = await di.read(); - expect(value).to.be.equal(22.0); - //TODO: this should throw error, but it does not, needs to be implemented - }); - - it('should fail while writing with wrong datatype 2', async () => { - const di = OpcUaDataItem.createFromOptions( - { - namespaceIndex: namespaceUrl, - nodeId: 'testNumber', - dataType: 'abc' - }, connection, 'write'); - - await expect(di.write(22)).to.be.rejectedWith('datatype abc must be registered'); - }); - - it('should fail while writing with wrong datatype 3', async () => { - const di = OpcUaDataItem.createFromOptions( - { - namespaceIndex: namespaceUrl, - nodeId: 'testNumber', - dataType: 'Boolean' - }, connection, 'write'); - - await expect(di.write(22)).to.be.rejectedWith( - 'Invalid variant arrayType: Scalar dataType: Boolean value:22 (javascript type = number )'); + describe('Type boolean', () => { + + it('should work with float default value', () => { + const options: DataItemOptions = {type: 'boolean', defaultValue: 1}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(true); + }); + + it('should work with string default value', () => { + const options: DataItemOptions = {type: 'boolean', defaultValue: '1.2'}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(false); + }); + + it('should work with boolean default value', () => { + const options: DataItemOptions = {type: 'boolean', defaultValue: true}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(true); + }); + + it('should work with value = 0', () => { + const options: DataItemOptions = {type: 'boolean', defaultValue: 0.0}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(false); + }); + + it('should work with negative value', () => { + const options: DataItemOptions = {type: 'boolean', defaultValue: -2}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(false); + }); + + it('should work with undefined value', () => { + const options: DataItemOptions = {type: 'boolean', defaultValue: undefined}; + const dataItem = new BaseStaticDataItem(options); + expect(dataItem.value).to.equal(false); + }); }); }); }); diff --git a/src/modularPlantManager/pea/connection/DataItem.ts b/src/modularPlantManager/pea/connection/DataItem.ts index 436641ef..e865f394 100644 --- a/src/modularPlantManager/pea/connection/DataItem.ts +++ b/src/modularPlantManager/pea/connection/DataItem.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -28,35 +27,107 @@ import {EventEmitter} from 'events'; import StrictEventEmitter from 'strict-event-emitter-types'; import {Category} from 'typescript-logging'; import {catDataItem} from '../../../logging'; +import {DataItemOptions, DynamicDataItemOptions} from './DataItemFactory'; +export interface DataItem { + defaultValue: T; + value: T; +} +export interface DynamicDataItem extends DataItem{ + dataType: string; + timestamp: Date | undefined; + writable: boolean; + lastWritten: Date | undefined; +} /** * Events emitted by [[DataItem]] */ -export interface DataItemEvents { +export interface DataItemEvents { /** - * when OpcUaNodeOptions changes its value + * value changed * @event changed */ - changed: { value: any; timestamp: Date; nodeId: string }; + changed: {value: T; timestamp: Date}; } -export type DataItemEmitter = StrictEventEmitter; -//change name -export abstract class DataItem extends (EventEmitter as new() => DataItemEmitter) { - // data type of data item - public dataType!: string; - // recent value - public value: T | undefined = undefined; - // timestamp of last update of value - public timestamp!: Date; - // can DataItem be accessed - public access: 'read' | 'write' = 'read'; +export type DataItemEmitter = StrictEventEmitter>; + +type FalseY = undefined | null; +const parseBoolean = (val: string | boolean | number | FalseY): boolean => { + const s = val && val.toString().toLowerCase().trim(); + return s == 'true' || s == '1'; +}; + +export abstract class DataItem extends (EventEmitter as new() => DataItemEmitter) implements DataItem{ + + public defaultValue!: T; + public value!: T; protected logger: Category = catDataItem; - public abstract async subscribe(samplingInterval: number): Promise; + constructor(options: DataItemOptions) { + super(); + + let parsedValue: T; + + switch (options.type) { + case 'number': + parsedValue = +(options.defaultValue || 0) as T; + break; + case 'string': + if (!options.defaultValue) { + parsedValue = '' as T; + } else { + parsedValue = String(options.defaultValue) as T; + } + break; + case 'boolean': + // parsedValue = !!(options.defaultValue || false) as T; + parsedValue = parseBoolean(options.defaultValue) as T; + break; + } + this.defaultValue = parsedValue; + this.value = parsedValue; + } +} + + + +export abstract class StaticDataItem extends DataItem{ - public abstract write(value: string | number | boolean): Promise; + protected constructor(options: DataItemOptions) { + super(options); + + } +} + +export class BaseStaticDataItem extends StaticDataItem{ + constructor(options: DataItemOptions) { + super(options); + } } + +export abstract class DynamicDataItem extends DataItem { + + // data type of data item + public dataType: string; + public writable = false; + public timestamp: Date | undefined = undefined; + public lastWritten: Date | undefined = undefined; + + protected constructor(options: DynamicDataItemOptions) { + super(options); + this.dataType = options.dynamicDataItemOptions.dataType; + this.writable = options.dynamicDataItemOptions.writable; + } + + public abstract read(): Promise; + public abstract write(value: T): Promise; + public abstract subscribe(): Promise; + public abstract unsubscribe(): Promise; +} + + + diff --git a/src/modularPlantManager/pea/connection/DataItemFactory.ts b/src/modularPlantManager/pea/connection/DataItemFactory.ts new file mode 100644 index 00000000..ce146e60 --- /dev/null +++ b/src/modularPlantManager/pea/connection/DataItemFactory.ts @@ -0,0 +1,77 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {BaseStaticDataItem, DataItem, OpcUaConnection, OpcUaDataItem} from '../connection'; +import {catDataItem} from '../../../logging'; + + +export interface DataItemOptions { + type: 'number' | 'string' | 'boolean'; + defaultValue?: number | string | boolean; +} + +export interface DynamicDataItemOptions extends DataItemOptions{ + dynamicDataItemOptions: OpcUaNodeOptions; +} + +export interface OpcUaNodeOptions { + dataType: string; + writable: boolean; + namespaceIndex: string; + nodeId: string; +} + + +export interface DataItemFactory { + create(options: DataItemOptions): DataItem; +} + + +export class DataItemFactory implements DataItemFactory{ + + + connection: OpcUaConnection | undefined; + + constructor(connection: OpcUaConnection) { + this.connection = connection; + } + + public create(options: DataItemOptions | DynamicDataItemOptions): DataItem { + let result: DataItem; + + catDataItem.debug('Create DataItem'); + + if ( 'dynamicDataItemOptions' in options && this.connection) { + result = new OpcUaDataItem(options, this.connection); + } else { + result = new BaseStaticDataItem(options); + + } + if(!result){ + throw new Error('Creation of DataItem failed.'); + } + return result; + } +} diff --git a/src/modularPlantManager/pea/connection/OpcUaConnection.puml b/src/modularPlantManager/pea/connection/OpcUaConnection.puml index 9f023897..369bd545 100644 --- a/src/modularPlantManager/pea/connection/OpcUaConnection.puml +++ b/src/modularPlantManager/pea/connection/OpcUaConnection.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram @@ -18,12 +43,12 @@ class OpcUaConnection{ + //async// connect(): Promise + //async// disconnect(): Promise + isConnected(): boolean - + //async// readOpcUaNode(nodeId: string, namespaceUrl: string): Promise - + addOpcUaNode(nodeId: string, namespaceUrl: string): string + + //async// readNode(nodeId: string, namespaceUri: string): Promise + + addOpcUaNode(nodeId: string, namespaceUri: string): string + //async// startListening(samplingInterval=100): Promise - + //async// writeOpcUaNode(nodeId: string, namespaceUrl: string, value: number | string | boolean, dataType: string): Promise + + //async// writeNode(nodeId: string, namespaceUri: string, value: number | string | boolean, dataType: string): Promise + monitoredItemSize(): number - - resolveNodeId(nodeId: string, namespaceUrl: string): NodeId + - resolveNodeId(nodeId: string, namespaceUri: string): NodeId - //async// readNameSpaceArray(): Promise - //async// createAndConnectClient(): Promise - //async// createSession() diff --git a/src/modularPlantManager/pea/connection/OpcUaConnection.spec.ts b/src/modularPlantManager/pea/connection/OpcUaConnection.spec.ts index bce66ff7..51ed014b 100644 --- a/src/modularPlantManager/pea/connection/OpcUaConnection.spec.ts +++ b/src/modularPlantManager/pea/connection/OpcUaConnection.spec.ts @@ -28,146 +28,175 @@ import {OpcUaConnection} from './OpcUaConnection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {MockupServer} from '../../_utils'; -import {namespaceUrl} from '../../../../tests/namespaceUrl'; chai.use(chaiAsPromised); const expect = chai.expect; + describe('OpcUaConnection', () => { it('should reject connecting to a server with too high port', async () => { - const connection = new OpcUaConnection('test', 'opc.tcp://127.0.0.1:44447777'); + const connection = new OpcUaConnection(); + connection.initialize({endpoint: 'opc.tcp://127.0.0.1:44447777'}); expect(connection.isConnected()).to.equal(false); await expect(connection.connect()).to.be.rejected; }); it('should reject connecting to a server with not existing endpoint', async () => { - const connection = new OpcUaConnection('test', ''); + const connection = new OpcUaConnection(); + connection.initialize({endpoint: ''}); expect(connection.isConnected()).to.equal(false); await expect(connection.connect()).to.be.rejected; expect(connection.isConnected()).to.equal(false); }).timeout(5000); + it('should connect to a opc ua test server and recognize a shutdown of this server', async () => { -/* const connection = new OpcUaConnection('testserver', 'opc.tcp://localhost:4334'); + const mockupServer = new MockupServer(); await mockupServer.start(); + const connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + expect(connection.isConnected()).to.equal(false); await connection.connect(); expect(connection.isConnected()).to.equal(true); - await new Promise((resolve) => { + await new Promise((resolve) => { connection.once('disconnected', () => { expect(connection.isConnected()).to.equal(false); resolve(); }); mockupServer.shutdown(); - });*/ - // TODO this is currently throwing an error + }); }).timeout(3000); describe('with test server', () => { let mockupServer: MockupServer; + let mockupServerNamespace = ''; before(async () => { mockupServer = new MockupServer(); await mockupServer.start(); + mockupServerNamespace = mockupServer.nameSpaceUri; }); after(async () => { - if(mockupServer) await mockupServer.shutdown(); + if(mockupServer) { + await mockupServer.shutdown(); + } + }); + + it('should add and remove Nodes to connection for monitoring', async () => { + const connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + connection.addNodeToMonitoring('trigger', mockupServerNamespace); + expect(connection.monitoredNodesCount()).to.equal(1); + connection.addNodeToMonitoring('trigger1', mockupServerNamespace); + expect(connection.monitoredNodesCount()).to.equal(2); + connection.clearMonitoredNodes(); + expect(connection.monitoredNodesCount()).to.equal(0); + await connection.disconnect(); }); - it('should connect to a opc ua test server, read an opc item and disconnect', async () => { - const connection = new OpcUaConnection('testserver', 'opc.tcp://localhost:4334'); + + it('should connect to MockupServer, read an opc item and disconnect', async () => { + + const connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); expect(connection.isConnected()).to.equal(false); await connection.connect(); expect(connection.isConnected()).to.equal(true); - await connection.readOpcUaNode('trigger', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); + await connection.readNode('trigger', mockupServerNamespace).then((result) => expect(result?.value.value).to.equal(false)); await connection.disconnect(); }); - it('should connect to a opc ua test server, subscribes to one opc item and disconnect', async () => { - const connection = new OpcUaConnection('testserver', 'opc.tcp://localhost:4334'); + it('should connect to a opc ua test server, subscribe to one opc ua item and disconnect', async () => { + const connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); expect(connection.isConnected()).to.equal(false); await connection.connect(); - expect(connection.isConnected()).to.equal(true); - const eventName = connection.addOpcUaNode('trigger', namespaceUrl); - const eventEmitter = await connection.startListening(); + const eventName = connection.addNodeToMonitoring('trigger', mockupServerNamespace); + await connection.createSubscription(); + const eventEmitter = await connection.startMonitoring(); await new Promise(resolve => eventEmitter.on(eventName, resolve)); await connection.disconnect(); }); it('should work after reconnection', async () => { - const connection = new OpcUaConnection('testserver', 'opc.tcp://localhost:4334'); - expect(connection.isConnected()).to.equal(false); - + const connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); - expect(connection.isConnected()).to.equal(true); - const eventName1 = connection.addOpcUaNode('trigger', namespaceUrl); - await connection.startListening(); - expect(connection.monitoredItemSize()).to.equal(1); + const eventName1 = connection.addNodeToMonitoring('trigger', mockupServerNamespace); + expect(connection.monitoredNodesCount()).to.equal(1); + await connection.createSubscription(); + await connection.startMonitoring(); await new Promise(resolve => connection.eventEmitter.on(eventName1, resolve)); - await connection.disconnect(); - expect(connection.monitoredItemSize()).to.equal(0); + + expect(connection.monitoredNodesCount()).to.equal(1); await connection.connect(); - const eventName2 = connection.addOpcUaNode('trigger', namespaceUrl); + const eventName2 = connection.addNodeToMonitoring('trigger', mockupServerNamespace); expect(eventName1).to.equal(eventName2); - await connection.startListening(); - await new Promise(resolve => connection.eventEmitter.on(eventName1, resolve)); - expect(connection.monitoredItemSize()).to.equal(1); + await connection.createSubscription(); + await connection.startMonitoring(); + await new Promise((resolve) => connection.eventEmitter.on(eventName1, resolve)); + expect(connection.monitoredNodesCount()).to.equal(1); }).timeout(4000); it('should not add same nodeId, invalid namespace should throw, should listen to multiple items', async () => { - const connection = new OpcUaConnection('testserver', 'opc.tcp://localhost:4334'); + const connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); expect(connection.isConnected()).to.equal(false); await connection.connect(); expect(connection.isConnected()).to.equal(true); - connection.addOpcUaNode('trigger', namespaceUrl); - expect(connection.monitoredItemSize()).equals(1); + connection.addNodeToMonitoring('trigger', mockupServerNamespace); + expect(connection.monitoredNodesCount()).equals(1); - connection.addOpcUaNode('trigger', namespaceUrl); - expect(connection.monitoredItemSize()).equals(1); + connection.addNodeToMonitoring('trigger', mockupServerNamespace); + expect(connection.monitoredNodesCount()).equals(1); - connection.addOpcUaNode('nonexistant', namespaceUrl); + connection.addNodeToMonitoring('nonexistant', mockupServerNamespace); - expect(connection.monitoredItemSize()).equals(2); + expect(connection.monitoredNodesCount()).equals(2); - expect(() => connection.addOpcUaNode('nonexistant', 'urn:nan')) - .to.throw('Could not resolve namespace'); - expect(connection.monitoredItemSize()).equals(2); + const invalidUrn = 'urn:nan'; + expect(() => connection.addNodeToMonitoring('nonexistant', invalidUrn)) + .to.throw(`Failed to resolve namespace ${invalidUrn}!`); + expect(connection.monitoredNodesCount()).equals(2); - connection.addOpcUaNode('Service1.OpMode', namespaceUrl); - expect(connection.monitoredItemSize()).equals(3); - await connection.startListening(); + connection.addNodeToMonitoring('Service1.OpMode', mockupServerNamespace); + expect(connection.monitoredNodesCount()).equals(3); + await connection.createSubscription(); + await connection.startMonitoring(); await connection.disconnect(); + }).timeout(5000); it('should connect with username and password', async () => { - const connection = new OpcUaConnection('testserver', 'opc.tcp://localhost:4334', 'admin', '1234'); + const connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); await connection.disconnect(); }); - it('should fail connecting with wrong username and password', async () => { - const connection = new OpcUaConnection('testserver', 'opc.tcp://localhost:4334', 'admin', 'empty'); - await expect(connection.connect()).to.be.rejectedWith('BadUserAccessDenied'); - await connection.disconnect(); + it('updateServerSettings(), should work', () => { + // TODO }); + }); }); diff --git a/src/modularPlantManager/pea/connection/OpcUaConnection.ts b/src/modularPlantManager/pea/connection/OpcUaConnection.ts index b298cec9..a8f75618 100644 --- a/src/modularPlantManager/pea/connection/OpcUaConnection.ts +++ b/src/modularPlantManager/pea/connection/OpcUaConnection.ts @@ -30,8 +30,12 @@ import { ClientSession, ClientSubscription, coerceNodeId, - DataValue, MonitoringMode, NodeId, + DataValue, + MessageSecurityMode, + MonitoringMode, + NodeId, OPCUAClient, + SecurityPolicy, TimestampsToReturn, UserIdentityInfo, UserIdentityInfoUserName, @@ -44,6 +48,50 @@ import {ClientMonitoredItemGroup} from 'node-opcua-client/source/client_monitore import StrictEventEmitter from 'strict-event-emitter-types'; import {Category} from 'typescript-logging'; import {catOpcUA} from '../../../logging'; +import {IDProvider} from '../../_utils/idProvider/IDProvider'; + +export interface OpcUaConnectionSettings{ + endpoint: string; + securitySettings?: OpcUaSecuritySettings; + authenticationSettings?: OpcUaAuthenticationSettings; +} + +export interface OpcUaSecuritySettings{ + securityMode: OpcUaMessageSecurityModes; + securityPolicy: OpcUaSecurityPolicies; +} + +export enum OpcUaMessageSecurityModes { + 'None', + 'Sign', + 'SignAndEncrypt' +} + +export enum OpcUaSecurityPolicies { + 'None', + 'Aes128_Sha256_RsaOaep', + 'Basic128', + 'Basic128Rsa15', + 'Basic192', + 'Basic192Rsa15', + 'Basic256', + 'Basic256Rsa15', + 'Basic256Sha256', + 'PubSub_Aes128_CTR', + 'PubSub_Aes256_CTR', +} + +export interface OpcUaAuthenticationSettings{ + userCredentials?: { userName: string; password: string}; + certificate?: never; +} + +export interface OpcUaConnectionSettingsInfo{ + endpointUrl: string; + securityPolicy: string; + securityMode: string; + userIdentityInfo: string; +} /** * Events emitted by {@link OpcUaConnection} @@ -65,197 +113,312 @@ type OpcUaConnectionEmitter = StrictEventEmitter OpcUaConnectionEmitter) { - public readonly endpoint: string; - public readonly id: string; - public readonly eventEmitter: EventEmitter; + public readonly id: string = IDProvider.generateIdentifier(); + public readonly eventEmitter: EventEmitter = new EventEmitter(); + private readonly logger: Category = catOpcUA; + + private initialized = false; + + private endpoint!: string; + private userIdentitySetting!: UserIdentityInfo; + private securityMode: OpcUaMessageSecurityModes = OpcUaMessageSecurityModes.None; + private securityPolicy: OpcUaSecurityPolicies = OpcUaSecurityPolicies.None; + + private namespaceArray: string[] = []; private session: ClientSession | undefined; private client: OPCUAClient | undefined; private subscription: ClientSubscription | undefined; - private readonly items: Map; - private namespaceArray!: string[]; - private readonly logger: Category; - readonly username: string | undefined; - readonly password: string | undefined; - constructor(targetId: string, endpoint: string, username?: string, password?: string) { + private readonly nodes: Map = new Map(); + + constructor() { super(); - this.id = targetId; - this.endpoint = endpoint; - this.logger = catOpcUA; - this.username = username; - this.password = password; - this.eventEmitter = new EventEmitter(); - this.items = new Map(); + } + + public initialize(connectionSettings: OpcUaConnectionSettings): void { + if (!this.initialized){ + this.endpoint = connectionSettings.endpoint; + this.setAuthenticationSettings(connectionSettings.authenticationSettings || {}); + + const securitySettings = connectionSettings.securitySettings; + if (securitySettings) { + this.setSecuritySettings(securitySettings); + } + this.initialized = true; + } + this.logger.debug('Already initialized.'); + } + + public update(connectionSettings: OpcUaConnectionSettings): void { + if (!this.initialized) { + this.logger.warn('Connection is not initialized.'); + throw new Error('Connection is not initialized.'); + } + if (!this.isConnected()) { + this.logger.warn('Connection is active.'); + throw new Error('Connection is active.'); + } + this.endpoint = connectionSettings.endpoint; + this.setAuthenticationSettings(connectionSettings.authenticationSettings || {}); + + const securitySettings = connectionSettings.securitySettings; + if (securitySettings) { + this.setSecuritySettings(securitySettings); + } else { + this.setSecuritySettings({securityMode: OpcUaMessageSecurityModes.None, securityPolicy: OpcUaSecurityPolicies.None}); + } + } + + public async reconnect(newConnectionSettings?: OpcUaConnectionSettings): Promise { + await this.disconnect(); + if (newConnectionSettings) { + this.logger.debug('Updating settings during reconnect.'); + this.update(newConnectionSettings); + } + await this.connect(); + } + + public get endpointUrl(): string{ + return this.endpoint; + } + + public get settingsInfo(): OpcUaConnectionSettingsInfo { + return { + endpointUrl: this.endpointUrl, + securityPolicy: OpcUaSecurityPolicies[this.securityPolicy], + securityMode: OpcUaMessageSecurityModes[this.securityMode], + userIdentityInfo: (this.userIdentitySetting.type === UserTokenType.Anonymous)? 'Anonymous': 'User', + }; + } + + /** + * Set SecuritySettings of connection + */ + public setSecuritySettings(newSettings: OpcUaSecuritySettings): void { + this.securityMode = newSettings.securityMode; + this.securityPolicy = newSettings.securityPolicy; + } + + + /** + * Set AuthenticationSettings of connection + */ + private setAuthenticationSettings(newSettings: OpcUaAuthenticationSettings): void { + this.setAuthenticationSettingAnonymous(); + const userCredentials = newSettings.userCredentials; + if (userCredentials) { + this.setAuthenticationSettingUserName(userCredentials.userName, userCredentials.password); + } } /** - * Opens connection to server and establish session + * Set UserIdentity to Anonymous + */ + private setAuthenticationSettingAnonymous(): void { + this.userIdentitySetting = {type: UserTokenType.Anonymous}; + } + + + /** + * Applies the current session UserIdentity + * @returns {Promise} + */ + private setAuthenticationSettingUserName(username: string, password: string): void { + this.userIdentitySetting = + { + type: UserTokenType.UserName, + userName: username, + password: password + } as UserIdentityInfoUserName; + } + + + /** + * Applies the current session UserIdentity to current session on the fly + * @returns {Promise} + */ + private async applySessionUserIdentity(): Promise { + if (this.isConnected() && this.session) { + await this.client?.changeSessionIdentity(this.session, this.userIdentitySetting); + } + return Promise.resolve(); + } + + /** + * Open connection to server and establish session + * @returns {Promise} */ public async connect(): Promise { + if (!this.initialized) { + this.logger.warn('Connection is not initialized.'); + throw new Error('Connection is not initialized.'); + } if (this.isConnected()) { this.logger.debug(`[${this.id}] Already connected`); - return Promise.resolve(); } else { - if (this.endpoint === undefined) { - this.logger.warn('Error while connecting to OPC UA. Endpoint undefined.'); - throw new Error('cannot be established'); - } - this.client = await this.createAndConnectClient(); - this.session = await this.createSession(); - this.namespaceArray = await this.readNameSpaceArray(); - this.subscription = await this.createSubscription(); - + this.createClient(); + await this.connectClient(); + await this.createSession(); + await this.readNameSpaceArray(); this.logger.info(`[${this.id}] Successfully connected`); this.emit('connected'); } + return Promise.resolve(); } + /** + * Disconnect client + * @returns {Promise} + */ public async disconnect(): Promise { - if (this.client) { - this.client.removeAllListeners('close') - .removeAllListeners('connection_lost'); - } - if (this.subscription) { - await timeout(this.subscription.terminate(), 1000); - this.subscription = undefined; - } - if (this.session) { - await timeout(this.session.close(), 1000); - this.session = undefined; - } - if (this.client) { - await timeout(this.client.disconnect(), 1000); - this.client = undefined; - } - this.items.clear(); + await this.stopMonitoring(); + await this.stopSubscription(); + await this.closeSession(); + await this.disconnectClient(); this.logger.info(`[${this.id}] OPC UA connection disconnected`); + this.emit('disconnected'); + return Promise.resolve(); } /** - * is pea connected to physical PEAController + * Indicator if this client is currently connected to endpoint * @returns {boolean} */ public isConnected(): boolean { return !!this.client && !!this.session; } - public async readOpcUaNode(nodeId: string, namespaceUrl: string): Promise { - return await this.session?.read({nodeId: this.resolveNodeId(nodeId, namespaceUrl)}); - + /** + * read the value of provided NodeID information + * @returns {Promise} + */ + public async readNode(identifier: string, namespace: string): Promise { + const resolvedID = this.resolveNodeId(identifier, namespace); + return await this.session?.read({nodeId: resolvedID }); } - public addOpcUaNode(nodeId: string, namespaceUrl?: string): string { - let nodeIdResolved; - if (namespaceUrl) { - nodeIdResolved = this.resolveNodeId(nodeId, namespaceUrl); - } else { - nodeIdResolved = nodeId; + /** + * Write the provided value to provided NodeID information + * @returns {Promise} + */ + public async writeNode(nodeId: string, namespaceUri: string, value: number | string | boolean, dataType: string): Promise { + if (!this.isConnected()) { + throw new Error('Can not write node since OPC UA connection is not established'); } + const variant = Variant.coerce({ + value: value, + dataType: dataType, + arrayType: VariantArrayType.Scalar + }); + + const nodeToWrite = { + nodeId: this.resolveNodeId(nodeId, namespaceUri).toString(), + attributeId: AttributeIds.Value, + value: { + value: variant + } + }; + + this.logger.debug(`[${this.id}] Write ${nodeId} - ${JSON.stringify(variant)}`); + if (!this.session) { + throw new Error('Session is undefined'); + } + const statusCode = await this.session.write(nodeToWrite); + + if (statusCode.value !== 0) { + this.logger.warn(`Error while writing to OpcUA ${nodeId}=${value}: ${statusCode.description}`); + throw new Error(statusCode.description); + } + return Promise.resolve(); + } + + /** + * Add Node to the connection and subscription groups + * @returns {string} + */ + public addNodeToMonitoring(identifier: string, namespace: string): string { + + const nodeIdResolved = this.resolveNodeId(identifier, namespace); const monitoredItemKey = nodeIdResolved.toString(); - this.items.set(nodeId, monitoredItemKey); + // TODO: in case of same identifier in different namespaces identifier as Map key might be a problem + this.nodes.set(identifier, monitoredItemKey); + return monitoredItemKey; } - public async startListening(samplingInterval = 100): Promise { - const options = Array.from(this.items.values()).map((item) => { + /** + * Add Node to the connection and subscription groups + * @returns {string} + */ + public removeNodeFromMonitoring(identifier: string): void { + this.nodes.delete(identifier); + } + + public async startMonitoring(samplingInterval = 100): Promise { + const options = Array.from(this.nodes.values()).map((item) => { return { nodeId: item, attributeId: AttributeIds.Value }; }); - if (!this.subscription){throw new Error('Subscription is undefined');} - const monitoredItemGroup: ClientMonitoredItemGroup = await this.subscription.monitorItems( + if (!this.subscription){ + await this.createSubscription(); + } + const monitoredItemGroup: ClientMonitoredItemGroup = await this.subscription!.monitorItems( options, { samplingInterval, discardOldest: true, queueSize: 10 - }, TimestampsToReturn.Both) - ; + }, TimestampsToReturn.Both); + monitoredItemGroup.on('changed', (monitoredItem: ClientMonitoredItemBase, dataValue: DataValue) => { this.logger.trace(`[${this.id}] ${monitoredItem.itemToMonitor.nodeId.toString()} changed to ${dataValue}`); this.eventEmitter.emit(monitoredItem.itemToMonitor.nodeId.toString(), dataValue); }); + await monitoredItemGroup.setMonitoringMode(MonitoringMode.Reporting); + return this.eventEmitter; } - public async writeOpcUaNode(nodeId: string, namespaceUrl: string, value: number | string | boolean, - dataType: string): Promise { - if (!this.isConnected()) { - throw new Error(`Can not write node since OPC UA connection to PEA ${this.id} is not established`); - } else { - const variant = Variant.coerce({ - value: value, - dataType: dataType, - arrayType: VariantArrayType.Scalar - }); - - const nodeToWrite = { - nodeId: this.resolveNodeId(nodeId, namespaceUrl).toString(), - attributeId: AttributeIds.Value, - value: { - value: variant - } - }; + public async stopMonitoring(): Promise{ + if (this.client) { + this.client.removeAllListeners('close') + .removeAllListeners('connection_lost'); + } + } - this.logger.debug(`[${this.id}] Write ${nodeId} - ${JSON.stringify(variant)}`); - if (!this.session) { - throw new Error('Session is undefined'); - } - const statusCode = await this.session.write(nodeToWrite); - if (statusCode.value !== 0) { - this.logger.warn(`Error while writing to OpcUA ${nodeId}=${value}: ${statusCode.description}`); - throw new Error(statusCode.description); - } - } + public monitoredNodesCount(): number { + return this.nodes.size; } - public monitoredItemSize(): number { - return this.items.size; + public clearMonitoredNodes(): void{ + this.nodes.clear(); } - /** - * Resolves a node-id from node-id and namespace url using the namespace array - */ - private resolveNodeId(nodeId: string, namespaceUrl: string): NodeId { - if (!this.namespaceArray) { - throw new Error(`No namespace array read for PEA ${this.id}`); - } else if (!namespaceUrl) { - throw new Error(`namespace index is null in PEA ${this.id}`); - } else if (!nodeId) { - throw new Error('node-id is null'); - } - const nsIndex = this.namespaceArray.indexOf(namespaceUrl); - if (nsIndex === -1) { - throw new Error(`Could not resolve namespace ${namespaceUrl}`); - } - const nodeIdString = `ns=${nsIndex};s=${nodeId}`; + private getNodeOpcUaMessageSecurityMode(): MessageSecurityMode{ + return MessageSecurityMode[OpcUaMessageSecurityModes[this.securityMode] as keyof typeof MessageSecurityMode]; + } - this.logger.debug(`[${this.id}] resolveNodeId ${nodeId} -> ${nodeIdString}`); - return coerceNodeId(nodeIdString); + private getNodeOpcUaSecurityPolicy(): SecurityPolicy{ + return SecurityPolicy[OpcUaMessageSecurityModes[this.securityPolicy] as keyof typeof SecurityPolicy]; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private async readNameSpaceArray(): Promise { - const result: DataValue | undefined = await this.session?.read({nodeId: 'ns=0;i=2255'}); - if (!result) { - throw new Error('Could not read Node ns=0;i=2255'); - } - const namespaceArray = result.value.value; - this.logger.info(`[${this.id}] Got namespace array: ${JSON.stringify(namespaceArray)}`); - return namespaceArray; - } - - private async createAndConnectClient(): Promise { - const client = OPCUAClient.create({ - // eslint-disable-next-line @typescript-eslint/camelcase - endpoint_must_exist: false, - connectionStrategy: { - maxRetry: 0 - } + private createClient(): void { + const connectionStrategy = { + initialDelay: 50, + maxRetry: 0 + }; + + this.client = OPCUAClient.create({ + applicationName: 'NodeOPCUA-Client', + endpointMustExist: false, + securityMode: this.getNodeOpcUaMessageSecurityMode(), + securityPolicy: this.getNodeOpcUaSecurityPolicy(), + connectionStrategy: connectionStrategy, }) .on('close', async () => { this.logger.info(`[${this.id}] Connection closed to OPC UA server`); @@ -270,40 +433,50 @@ export class OpcUaConnection extends (EventEmitter as new() => OpcUaConnectionEm .on('timed_out_request', () => { this.logger.warn(`[${this.id}] timed out request - retrying connection`); }); - this.logger.info(`[${this.id}] connect PEA via ${this.endpoint}`); + } - await timeout(client.connect(this.endpoint), 2000) - .catch((err) => { - client.disconnect(); - throw err; - }); - this.logger.info(`[${this.id}] opc ua server connected via ${this.endpoint}`); - return client; - } - - private async createSession(): Promise { - let userIdentityInfo: UserIdentityInfo = {type: UserTokenType.Anonymous}; - if (this.username && this.password) { - userIdentityInfo = - { - type: UserTokenType.UserName, - userName: this.username, - password: this.password - } as UserIdentityInfoUserName; + private async updateClient(): Promise { + await this.createClient(); + return Promise.resolve(); + } + + private async connectClient(): Promise { + if (!this.client) { + throw new Error('Client must exist'); + } + this.logger.info(`[${this.id}] start connect via endpoint: ${this.endpoint}`); + await timeout(this.client.connect(this.endpoint!), 2000); + this.logger.info(`[${this.id}] connected via endpoint: ${this.endpoint}`); + } + + private async disconnectClient(): Promise { + if (this.client) { + await timeout(this.client.disconnect(), 1000); } + } + + private async createSession(): Promise { if (!this.client) { - throw new Error('Client is undefined'); + throw new Error('Client should exist'); } - const session = await this.client.createSession(userIdentityInfo); - this.logger.debug(`session created (#${session.sessionId})`); - return session; + this.session = await this.client.createSession(this.userIdentitySetting); + this.logger.debug(`session created (#${this.session.sessionId})`); } - private async createSubscription(): Promise { + + private async closeSession(): Promise { + if (this.session) { + await timeout(this.session.close(), 1000); + this.session = undefined; + } + } + + + public async createSubscription(): Promise { if (!this.session) { - throw new Error('Session is undefined'); + throw new Error('Session should exist'); } - const subscription = ClientSubscription.create(this.session, { + const subscriptionItem = ClientSubscription.create(this.session, { requestedPublishingInterval: 100, requestedLifetimeCount: 1000, requestedMaxKeepAliveCount: 12, @@ -312,11 +485,11 @@ export class OpcUaConnection extends (EventEmitter as new() => OpcUaConnectionEm priority: 10 }); - await new Promise((resolve) => - subscription + await new Promise((resolve) => + subscriptionItem .on('started', () => { this.logger.info(`[${this.id}] subscription started - ` + - `subscriptionId=${subscription.subscriptionId}`); + `subscriptionId=${subscriptionItem.subscriptionId}`); resolve(); }) .on('terminated', () => { @@ -328,7 +501,66 @@ export class OpcUaConnection extends (EventEmitter as new() => OpcUaConnectionEm .on('item_added', (data) => this.logger.debug(`[${this.id}] item added: ${data}`)) .on('raw_notification', (data) => this.logger.trace(`[${this.id}] raw_notification: ${data}`)) ); - return subscription; + this.subscription = subscriptionItem; + } + + private async stopSubscription(): Promise { + if (this.subscription) { + await timeout(this.subscription.terminate(), 1000); + this.subscription = undefined; + } } + /** + * Resolves a node-id from identifier and namespace using the namespace array + */ + private resolveNodeId(identifier: string, namespace: string): NodeId { + + const nsIndex = this.resolveNamespaceIndex(namespace); + const nodeIdString = `ns=${nsIndex};s=${identifier}`; + this.logger.debug(`[${this.id}] resolveNodeId ${identifier} -> ${nodeIdString}`); + return coerceNodeId(nodeIdString); + } + + private resolveNamespaceIndex(namespace: string): number { + let result = -1; + if (!this.namespaceArray) { + throw new Error('NamespaceArray is undefined!'); + } + const isURL = isNaN(+namespace); + if (isURL) { + result = this.findNamespaceIndex(namespace); + } else { + // check if provided namespace is a known namespace index + const namespaceIndex = Number(namespace); + const namespaceIndexExists = this.checkNamespaceIndexExists(namespaceIndex); + if (namespaceIndexExists) { + result = namespaceIndex; + } + } + if (result === -1) { + throw new Error(`Failed to resolve namespace ${namespace}!`); + } + return result; + } + + private checkNamespaceIndexExists(namespaceIndex: number): boolean { + return !!this.namespaceArray[namespaceIndex]; + } + + private findNamespaceIndex(namespace: string): number { + return this.namespaceArray.indexOf(namespace); + } + + private async readNameSpaceArray(): Promise { + let namespaceArray: string[] = []; + const result: DataValue | undefined = await this.session?.read({nodeId: 'ns=0;i=2255'}); + if (result) { + this.logger.info(`[${this.id}] Got namespace array: ${JSON.stringify(namespaceArray)}`); + namespaceArray = result.value.value; + } else { + throw new Error('Could not read NamespaceArray at Node \'ns=0;i=2255\''); + } + this.namespaceArray = namespaceArray; + } } diff --git a/src/modularPlantManager/pea/connection/OpcUaDataItem.puml b/src/modularPlantManager/pea/connection/OpcUaDataItem.puml index dd428a0d..8e2ecb1f 100644 --- a/src/modularPlantManager/pea/connection/OpcUaDataItem.puml +++ b/src/modularPlantManager/pea/connection/OpcUaDataItem.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include ./DataItem.puml diff --git a/src/modularPlantManager/pea/connection/OpcUaDataItem.spec.ts b/src/modularPlantManager/pea/connection/OpcUaDataItem.spec.ts new file mode 100644 index 00000000..7eda732d --- /dev/null +++ b/src/modularPlantManager/pea/connection/OpcUaDataItem.spec.ts @@ -0,0 +1,151 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from './index'; + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {OpcUaDataItem} from './OpcUaDataItem'; +import {MockupServer} from '../../_utils'; +import {DynamicDataItemOptions} from './DataItemFactory'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('OpcUaDataItem', () => { + describe('with mockup server', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + before(async function () { + this.timeout(5000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + after(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe', async () => { + const options: DynamicDataItemOptions = { + type: 'boolean', + defaultValue: false, + dynamicDataItemOptions: { + dataType: 'Boolean', + writable: false, + namespaceIndex: mockupServer.nameSpaceUri, + nodeId: 'trigger' + } + }; + const dataItem = new OpcUaDataItem(options, connection); + await dataItem.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve) => dataItem.on('changed', resolve)); + expect(dataItem.value).to.equal(false); + }); + + it('should subscribe, disconnect and resubscribe', async () => { + const options: DynamicDataItemOptions = { + type: 'boolean', + defaultValue: false, + dynamicDataItemOptions: { + dataType: 'Boolean', + writable: false, + namespaceIndex: mockupServer.nameSpaceUri, + nodeId: 'trigger' + } + }; + const dataItem = new OpcUaDataItem(options, connection); + await dataItem.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve) => dataItem.on('changed', resolve)); + await connection.disconnect(); + await connection.connect(); + + await dataItem.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve) => dataItem.on('changed', resolve)); + }).timeout(5000); + + it('should write', async () => { + const options: DynamicDataItemOptions = { + type: 'number', + defaultValue: 0, + dynamicDataItemOptions: { + dataType: 'Float', + writable: true, + namespaceIndex: mockupServer.nameSpaceUri, + nodeId: 'testNumber' + } + }; + const dataItem = new OpcUaDataItem(options, connection); + const valueBefore = await dataItem.read(); + expect(valueBefore).to.be.equal(0); + await dataItem.write(12); + const value = await dataItem.read(); + expect(value).to.be.equal(12); + await expect(dataItem.write('abc')).to.be.fulfilled; + }); + + it('should fail while writing with wrong datatype', async () => { + const options: DynamicDataItemOptions = { + type: 'number', + defaultValue: 0, + dynamicDataItemOptions: { + dataType: 'abc', + writable: true, + namespaceIndex: mockupServer.nameSpaceUri, + nodeId: 'testNumber' + } + }; + const dataItem = new OpcUaDataItem(options, connection); + await expect(dataItem.write(22)).to.be.rejectedWith('datatype abc must be registered'); + }); + + it('should fail while writing with wrong datatype', async () => { + const options: DynamicDataItemOptions = { + type: 'boolean', + defaultValue: 0, + dynamicDataItemOptions: { + dataType: 'Boolean', + writable: true, + namespaceIndex: mockupServer.nameSpaceUri, + nodeId: 'testNumber' + } + }; + const dataItem = new OpcUaDataItem(options, connection); + await expect(dataItem.write(22)).to.be.rejectedWith( + 'Invalid variant arrayType: Scalar dataType: Boolean value:22 (javascript type = number )'); + await expect(dataItem.write('abc')).to.be.rejectedWith( + 'Invalid variant arrayType: Scalar dataType: Boolean value:abc (javascript type = string )'); + }); + }); +}); diff --git a/src/modularPlantManager/pea/connection/OpcUaDataItem.ts b/src/modularPlantManager/pea/connection/OpcUaDataItem.ts index 4b400ff7..a2b89db4 100644 --- a/src/modularPlantManager/pea/connection/OpcUaDataItem.ts +++ b/src/modularPlantManager/pea/connection/OpcUaDataItem.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -24,83 +23,64 @@ * SOFTWARE. */ -import {OpcUaNodeOptions} from '@p2olab/polaris-interface'; import {OpcUaConnection} from './OpcUaConnection'; import {DataType} from 'node-opcua-client'; -import {DataItem} from './DataItem'; -import {catDataItem} from '../../../logging'; +import {DynamicDataItem} from './DataItem'; +import {DynamicDataItemOptions} from './DataItemFactory'; -export class OpcUaDataItem extends DataItem { +export class OpcUaDataItem extends DynamicDataItem { - // this variable contains the *namespace url* of the node public namespaceIndex = ''; - // node id of the node as string (e.g. 's=myNode2' or 'i=12') public nodeId = ''; private connection!: OpcUaConnection; - public static createFromOptions( - options: OpcUaNodeOptions, connection: OpcUaConnection, // attention! before-> type: ... = 'number' - access: 'read' | 'write', type: 'number' | 'string' | 'boolean' = 'string'): OpcUaDataItem { - const item = new OpcUaDataItem(); - if (options) { - if (options.value !== undefined) { - if (type === 'number' && (typeof options.value === 'string')) { - item.value = parseFloat(options.value) as type; - } else if (type === 'string') { - item.value = options.value.toString() as type; - } else if (type === 'boolean') { - item.value = !!options.value as type; - } else { - item.value = options.value as type; - } - } - item.dataType = options.dataType; + constructor(options: DynamicDataItemOptions, opcUaConnection: OpcUaConnection) { + super(options); - item.namespaceIndex = options.namespaceIndex; - item.nodeId = options.nodeId; - if ((!item.nodeId || !item.namespaceIndex) && !item.value) { - catDataItem.warn(`At least node id or value have to be specified during parsing of DataItem: ${JSON.stringify(options)}`); - } - } - item.access = access; - item.connection = connection; - return item; + this.namespaceIndex = options.dynamicDataItemOptions.namespaceIndex; + this.nodeId = options.dynamicDataItemOptions.nodeId; + + this.connection = opcUaConnection; } - public async subscribe(): Promise> { - const eventName = this.connection.addOpcUaNode(this.nodeId, this.namespaceIndex); - this.connection.eventEmitter.on(eventName, + + public async subscribe(): Promise { + const dataItemKey = this.connection.addNodeToMonitoring(this.nodeId, this.namespaceIndex); + this.connection.eventEmitter.on(dataItemKey, (dataValue) => { - this.logger.info(`[${this.connection.id}] Variable Changed (${this.nodeId}) ` + + this.logger.info(`[${this.nodeId}] Variable Changed (${dataItemKey}) ` + `= ${dataValue.value.value.toString()}`); this.value = dataValue.value.value; this.dataType = DataType[dataValue.value.dataType]; this.timestamp = dataValue.serverTimestamp; - this.emit('changed', {value: this.value, timestamp: this.timestamp, nodeId: this.nodeId}); + this.emit('changed', {value: this.value, timestamp: this.timestamp || new Date()}); }); - //set timeout - await new Promise((resolve, reject) => { - //TODO are 3 seconds okay? - //TODO subscription timeout does not work on parameters, fix that - setTimeout(()=> reject(new Error(`Timeout: Could not subscribe to ${this.nodeId}`)),3000); - this.on('changed', resolve); - }); - this.logger.info(`subscribed to Data Item ${this.nodeId}`); - return this; + + //Todo: uncomment + // this.logger.info(`subscribed to DataItem ${this.nodeId}`); } - public async write(value: number | string | boolean): Promise { + public async unsubscribe(): Promise { + this.removeAllListeners(); + this.connection.removeNodeFromMonitoring(this.nodeId); + this.logger.info(`unsubscribed from DataItem ${this.nodeId}`); + } + + public async write(value: T): Promise { + if (!this.writable) { + throw new Error('DataItem not writable.'); + } this.logger.info(`write: ${value} to ${this.nodeId}`); - return this.connection.writeOpcUaNode(this.nodeId, this.namespaceIndex, value, this.dataType); + return this.connection.writeNode(this.nodeId, this.namespaceIndex, value, this.dataType); } /** - * Reads the OpcUA DataItem of the DataItem and use the results for initializing the DataItem + * Reads the OpcUA DataItem of the DataItem */ - public async read(): Promise { - const result = await this.connection.readOpcUaNode(this.nodeId, this.namespaceIndex); + public async read(): Promise { + const result = await this.connection.readNode(this.nodeId, this.namespaceIndex); if (!result) { throw new Error(`Could not read ${this.nodeId.toString()}`); } @@ -109,9 +89,8 @@ export class OpcUaDataItem extends DataItem { throw new Error(`Could not read ${this.nodeId.toString()}: ${result.statusCode.description}`); } this.value = result.value.value; - // readVariableValue does not provide serverTimestamp in node-opcua library - this.timestamp = new Date(); - this.dataType = DataType[result.value.dataType]; + this.timestamp = result.serverTimestamp || new Date(); + //this.dataType = DataType[result.value.dataType]; this.logger.debug(`[${this.connection.id}] initialized Variable: ${this.nodeId.toString()} - ${this.value}`); return this.value; } diff --git a/src/modularPlantManager/pea/connection/index.ts b/src/modularPlantManager/pea/connection/index.ts index 21a28748..e8319200 100644 --- a/src/modularPlantManager/pea/connection/index.ts +++ b/src/modularPlantManager/pea/connection/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './DataItem'; export * from './OpcUaDataItem'; export * from './OpcUaConnection'; diff --git a/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.mockup.spec.ts new file mode 100644 index 00000000..0f559a9d --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.mockup.spec.ts @@ -0,0 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../_utils'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {DataAssemblyControllerMockup, getDataAssemblyDataItemOptions, getDataAssemblyOptions} from './DataAssemblyController.mockup'; +import {BaseDataAssemblyRuntime} from './DataAssemblyController'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('DataAssemblyControllerMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create DataAssemblyControllerMockup', async () => { + const mockup= new DataAssemblyControllerMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getDataAssemblyDataItemOptions('PrettyTag', 'PrettyDescription') as BaseDataAssemblyRuntime; + expect(Object.keys(options).length).to.equal(2); + }); + + it('static DataAssemblyOptions', () => { + const options = getDataAssemblyOptions( 'Test', 'PrettyTag', 'PrettyDescription') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(2); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new DataAssemblyControllerMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(2); + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.mockup.ts b/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.mockup.ts index c17043dc..8febf2f1 100644 --- a/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.mockup.ts @@ -23,9 +23,32 @@ * SOFTWARE. */ -import { Namespace, StatusCodes, UAObject} from 'node-opcua'; +import { Namespace, UAObject} from 'node-opcua'; import {catMockupServer} from '../../../logging'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {IDProvider} from '../../_utils/idProvider/IDProvider'; +function getDataAssemblySpecificDataItemOptions(tagName?: string, tagDescription?: string): object { + return ({ + TagName: {value: tagName || IDProvider.generateIdentifier()}, + TagDescription: {value: tagDescription || 'Not provided'}, + }); +} + +export function getDataAssemblyDataItemOptions(tagName?: string, tagDescription?: string): object { + return ({ + ...getDataAssemblySpecificDataItemOptions(tagName, tagDescription) + }); +} + +export function getDataAssemblyOptions(name?: string, tagName?: string, tagDescription?: string): DataAssemblyOptions { + return ({ + name: name || 'Not provided', + metaModelRef: 'MTPDataObjectSUCLib/DataAssembly', + dataItems: {...getDataAssemblyDataItemOptions(tagName, tagDescription)} as any + } + ); +} export class DataAssemblyControllerMockup { public readonly name: string; @@ -37,13 +60,21 @@ export class DataAssemblyControllerMockup { constructor(namespace: Namespace, rootNode: UAObject, variableName: string, tagName?: string, tagDescription?: string) { - this.tagName = tagName || 'No TagName available!'; + this.tagName = tagName || IDProvider.generateIdentifier(); this.tagDescription = tagDescription || 'No TagDescription available!'; this.name = variableName; this.mockupNode = namespace.addObject({ organizedBy: rootNode, - browseName: variableName, + browseName: this.name }); } + + public getDataAssemblyOptions(): DataAssemblyOptions { + return getDataAssemblyOptions(this.name, this.tagName, this.tagDescription); + } + + public getDataItemOptions(): object { + return getDataAssemblyDataItemOptions(this.tagName, this.tagDescription); + } } diff --git a/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.puml b/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.puml index 49d5af8c..fb87c8e0 100644 --- a/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.puml +++ b/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.puml @@ -1,8 +1,33 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include ServiceControl/ServiceControl.puml !include ./activeElement/ActiveElement.puml -!include ./DiagnosticElement/diagnosticElement.puml +!include ./DiagnosticElement/DiagnosticElement.puml !include ./IndicatorElement/indicatorElement.puml !include ./InputElement/inputElement.puml !include ./OperationElement/operationElement.puml @@ -30,7 +55,7 @@ class DataAssemblyController{ + DataAssemblyController(options: DataAssemblyOptions, connection: OpcUaConnection) + async subscribe(): Promise + unsubscribe(): void - + createDataItem(name: string | string[], access: 'read' | 'write', type?: 'number' | 'string' | 'boolean', silent = false): OpcUaDataItem + + createDataItem(name: string | string[], access: 'read' | 'write', type?: 'number' | 'string' | 'boolean', silent = false): DataItem + getDefaultReadValue(): any | undefined + getLastDefaultReadValueUpdate(): Date | undefined + getDefaultWriteValue(): any | undefined diff --git a/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.spec.ts b/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.spec.ts index 79ea1725..a8fae372 100644 --- a/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.spec.ts @@ -23,38 +23,30 @@ * SOFTWARE. */ -import { - BaseDataAssemblyOptions, BinMonOptions, BinViewOptions, DataAssemblyOptions, DIntMonOptions, MonAnaDrvOptions, - OpcUaNodeOptions, - OperationMode, ServiceControlOptions -} from '@p2olab/polaris-interface'; import {OpcUaConnection} from '../connection'; -import {PEAController} from '../PEAController'; -import { - BinMon, BinView, DataAssemblyController, DataAssemblyControllerFactory, - DIntMon, MonAnaDrv, ServiceControl, ServParam -} from './index'; +import {DataAssemblyController} from './DataAssemblyController'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import * as fs from 'fs'; -import {MockupServer} from '../../_utils'; chai.use(chaiAsPromised); const expect = chai.expect; describe('DataAssembly', () => { + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + it('should create DataAssemblyController', () => { expect(() => { - const da1 = new DataAssemblyController({ + const dataAssemblyController = new DataAssemblyController({ name: 'name', dataItems: {TagName: 'test', TagDescription: 'test',}, metaModelRef: 'analogitem' }, emptyOPCUAConnection); - expect(da1.tagName).to.equal('test'); - expect(da1.tagDescription).to.equal('test'); + expect(dataAssemblyController.communication.TagName.value).to.equal('test'); + expect(dataAssemblyController.communication.TagDescription.value).to.equal('test'); }).to.not.throw(); }); @@ -67,35 +59,10 @@ describe('DataAssembly', () => { ).to.throw('Creating DataAssemblyController Error: No OpcUaConnection provided'); }); - it('should fail with undefined dataitems', () => { + it('should fail with undefined DataItems', () => { expect(() => new DataAssemblyController( - {dataItems:undefined as any, name:'test', metaModelRef:'Test'}, emptyOPCUAConnection) - ).to.throw('Creating DataAssemblyController Error: No Communication variables found in DataAssemblyOptions'); - }); - - describe('dynamic with PEATestServer', () => { - - let mockupServer: MockupServer; - let connection: OpcUaConnection; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should ', async () => { - - }); - + {dataItems: undefined as any, name:'test', metaModelRef:'Test'}, emptyOPCUAConnection) + ).to.throw('Creating DataAssemblyController Error: No Communication dataAssemblies found in DataAssemblyOptions'); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.ts b/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.ts index d6350818..a6c20617 100644 --- a/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.ts +++ b/src/modularPlantManager/pea/dataAssembly/DataAssemblyController.ts @@ -23,15 +23,17 @@ * SOFTWARE. */ -import {DataAssemblyOptions, ParameterInterface} from '@p2olab/polaris-interface'; -import {DataItem, OpcUaConnection, OpcUaDataItem} from '../connection'; +import {DataAssemblyOptions, OpcUaNodeOptions, ParameterInterface} from '@p2olab/polaris-interface'; +import {DataItem, DynamicDataItem, OpcUaConnection, OpcUaDataItem} from '../connection'; import {EventEmitter} from 'events'; import {catDataAssembly} from '../../../logging'; +import {DataItemFactory, DataItemOptions, DynamicDataItemOptions} from '../connection/DataItemFactory'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface BaseDataAssemblyRuntime { - + TagName: DataItem; + TagDescription: DataItem; } export class DataAssemblyController extends EventEmitter { @@ -48,36 +50,36 @@ export class DataAssemblyController extends EventEmitter { public defaultReadDataItemType: any; public defaultWriteDataItem: DataItem | undefined; public defaultWriteDataItemType: any; - public readonly tagName: string; - public readonly tagDescription: string; + public readonly tagName: string = ''; + public readonly tagDescription: string = ''; + + private dataItemFactory: DataItemFactory; constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(); this.options = options; if (!options.dataItems || Object.keys(options.dataItems).length == 0) { - throw new Error('Creating DataAssemblyController Error: No Communication variables found in DataAssemblyOptions'); + throw new Error('Creating DataAssemblyController Error: No Communication dataAssemblies found in DataAssemblyOptions'); } this.connection = connection; if (!this.connection) { throw new Error('Creating DataAssemblyController Error: No OpcUaConnection provided'); } + this.dataItemFactory = new DataItemFactory(this.connection); this.name = options.name; this.metaModelRef = options.metaModelRef; this.subscriptionActive = false; // initialize communication - this.communication = {}; - this.tagName = options.dataItems.TagName; - this.tagDescription = options.dataItems.TagDescription; - - + this.communication = {} as BaseDataAssemblyRuntime; + this.communication.TagName = this.dataItemFactory.create({type: 'string', defaultValue: options.dataItems.TagName}); + this.communication.TagDescription = this.dataItemFactory.create({type: 'string', defaultValue: options.dataItems.TagDescription}); } /** - * subscribe to all changes in any of the variables of a DataAssemblyController + * subscribe to all changes in any of the dataAssemblies of a DataAssemblyController * - * The appropriate variables are detected via the type of the DataAssemblyController - * @param samplingInterval + * The appropriate dataAssemblies are detected via the type of the DataAssemblyController */ public async subscribe(): Promise { if (!this.subscriptionActive) { @@ -90,11 +92,10 @@ export class DataAssemblyController extends EventEmitter { dataItem.nodeId && dataItem.namespaceIndex) .map(([key, dataItem]: [string, OpcUaDataItem]) => { - dataItem.on('changed', (info) => { + dataItem.on('changed', () => { catDataAssembly.trace(`Emit ${this.name}.${key} = ${dataItem.value}`); this.emit(key, dataItem); this.emit('changed'); - if(info.nodeId.includes('StateCur')) this.emit('State'); }); return dataItem.subscribe(); }) @@ -106,7 +107,7 @@ export class DataAssemblyController extends EventEmitter { } /** - * unsubscribe to all changes in any of the variables of a DataAssemblyController + * unsubscribe to all changes in any of the dataAssemblies of a DataAssemblyController * */ public unsubscribe(): void { @@ -126,7 +127,7 @@ export class DataAssemblyController extends EventEmitter { * Creates a data item from provided options of DataAssemblyController by * finding first name to match one of the communication options *!/ - public populateDataItems(silent = false): OpcUaDataItem { + public populateDataItems(silent = false): DataItem { for (const communicationKey of Object.keys(this.communication)) { try { this.communication[communicationKey as keyof BaseDataAssemblyRuntime] = @@ -149,17 +150,34 @@ export class DataAssemblyController extends EventEmitter { * * TODO: Maybe rework this function, because it's hard to understand. */ - public createDataItem(name: string | string[], access: 'read' | 'write', type?: 'number' | 'string' | 'boolean', silent = false): OpcUaDataItem { + public createDataItem(name: string | string[], type: 'number' | 'string' | 'boolean', access: 'read' | 'write' = 'read' , logErrors = false): DataItem { const names = typeof name === 'string' ? [name] : name; for (const [key, value] of names.entries()) { if (this.options.dataItems[value as keyof BaseDataAssemblyRuntime]) { - return OpcUaDataItem.createFromOptions(this.getDataAssemblyProperty( - this.options.dataItems, value as keyof BaseDataAssemblyRuntime), - this.connection, access); + const options = this.getDataAssemblyProperty(this.options.dataItems, value as keyof BaseDataAssemblyRuntime) as any; + let factoryOptions: DynamicDataItemOptions | DataItemOptions; + if ((options as OpcUaNodeOptions).namespaceIndex !== undefined) { + factoryOptions = { + type: type, + defaultValue: options.value, + dynamicDataItemOptions: { + dataType: options.dataType, + writable: access === 'write', + namespaceIndex: options.namespaceIndex, + nodeId: options.nodeId + } as OpcUaNodeOptions + } as DynamicDataItemOptions; + } else { + factoryOptions = { + type: type, + defaultValue: options.value + } as DataItemOptions; + } + return this.dataItemFactory.create(factoryOptions); } } this.parsingErrors.push(names[0]); - if (!silent) { + if (!logErrors) { this.logParsingErrors(); } throw new Error('createDataItem Failed '); @@ -176,7 +194,7 @@ export class DataAssemblyController extends EventEmitter { * Getter of the timestamp from last change of the default ReadDataItem */ public getLastDefaultReadValueUpdate(): Date | undefined { - return this.defaultReadDataItem ? this.defaultReadDataItem.timestamp : undefined; + return this.defaultReadDataItem? ((this.defaultReadDataItem instanceof DynamicDataItem)? this.defaultReadDataItem.timestamp: undefined) : undefined; } /** @@ -190,7 +208,7 @@ export class DataAssemblyController extends EventEmitter { * Getter of the timestamp from last change of the default WriteDataItem */ public getLastDefaultWriteValueUpdate(): Date | undefined { - return this.defaultWriteDataItem ? this.defaultWriteDataItem.timestamp : undefined; + return this.defaultWriteDataItem? ((this.defaultWriteDataItem instanceof DynamicDataItem)? this.defaultWriteDataItem.timestamp: undefined) : undefined; } /** diff --git a/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.puml b/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.puml index e656c7bc..bd74fc8c 100644 --- a/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.puml +++ b/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.puml @@ -1,8 +1,33 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include ServiceControl/ServiceControl.puml !include ./activeElement/ActiveElement.puml -!include ./DiagnosticElement/diagnosticElement.puml +!include ./DiagnosticElement/DiagnosticElement.puml !include ./IndicatorElement/indicatorElement.puml !include ./InputElement/inputElement.puml diff --git a/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.spec.ts b/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.spec.ts index 3d1ae683..90e8be44 100644 --- a/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.spec.ts @@ -24,71 +24,41 @@ */ import { - BaseDataAssemblyOptions, DataAssemblyOptions, - OpcUaNodeOptions + BaseDataAssemblyOptions, DataAssemblyOptions } from '@p2olab/polaris-interface'; import {OpcUaConnection} from '../connection'; -import {PEAController} from '../PEAController'; -import { - AnaMan, - BinMon, BinView, DataAssemblyController, DataAssemblyControllerFactory, - DIntMan, DIntMon, MonAnaDrv, ServiceControl, ServParam -} from './index'; +import {DataAssemblyControllerFactory} from './index'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import * as fs from 'fs'; -import {PEAMockup} from '../PEA.mockup'; -import {MockupServer} from '../../_utils'; -import * as baseDataAssemblyOptions from '../../../../tests/monanadrv.json'; +import {getDataAssemblyOptions} from './DataAssemblyController.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('DataAssemblyFactory', () => { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const parseJson = require('json-parse-better-errors'); + + let dataAssemblyOptions: DataAssemblyOptions; + describe('static', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/', - dataItems: baseDataAssemblyOptions - }; - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + dataAssemblyOptions = getDataAssemblyOptions('Variable', 'Variable', 'Test') as DataAssemblyOptions; + + const emptyOPCUAConnection = new OpcUaConnection(); + it('should use default DataAssemblyController when provided type not found', () => { - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection); + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1.toJson()).to.deep.equal({ + expect(dataAssemblyController.toJson()).to.deep.equal({ name: 'Variable', }); - expect(da1 instanceof DataAssemblyController).to.equal(true); - }); - - it('should fail with xyz', () => { -/* const opcUaNode: OpcUaNodeOptions = { - namespaceIndex: 'CODESYSSPV3/3S/IecVarAccess', - nodeId: 'i=12', - dataType: 'Float' - }; - expect(() => new DataAssemblyController({ - name: 'name', - dataItems: { - TagName: opcUaNode as OpcUaNodeOptions, - TagDescription: opcUaNode as OpcUaNodeOptions, - OSLevel: opcUaNode as OpcUaNodeOptions, - WQC: null, - access: 'read' - } as any, - metaModelRef: 'analogitem' - }, emptyOPCUAConnection) - ).to.throw('Cannot set property \'TagName\' of undefined');*/ }); it('should fail without provided PEA', async () => { expect(() => DataAssemblyControllerFactory.create( {name: 'test', metaModelRef: 'none', dataItems: {} as BaseDataAssemblyOptions}, emptyOPCUAConnection) - ).to.throw('Creating DataAssemblyController Error: No Communication variables found in DataAssemblyOptions'); + ).to.throw('Creating DataAssemblyController Error: No Communication dataAssemblies found in DataAssemblyOptions'); }); }); @@ -102,8 +72,8 @@ describe('DataAssemblyFactory', () => { beforeEach(async () => { mockupServer = new MockupServer(); await mockupServer.start(); - - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://127.0.0.1:4334/PEATestServer'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: 'opc.tcp://localhost:4334/PEATestServer'}); await connection.connect(); }); @@ -173,7 +143,7 @@ describe('DataAssemblyFactory', () => { await pea.connectAndSubscribe(); const da = pea.services[0].procedures[0].parameters[0] as ServParam; - const inputDa = pea.variables[0]; + const inputDa = pea.dataAssemblies[0]; await da.subscribe(); await inputDa.subscribe(); diff --git a/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.ts b/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.ts index c4c70bb0..329fc765 100644 --- a/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.ts +++ b/src/modularPlantManager/pea/dataAssembly/DataAssemblyControllerFactory.ts @@ -38,8 +38,8 @@ import { import {catDataAssembly} from '../../../logging'; export class DataAssemblyControllerFactory { - public static create(variableOptions: DataAssemblyOptions, connection: OpcUaConnection): DataAssemblyController { - catDataAssembly.debug(`Create DataAssembly ${variableOptions.name} (${variableOptions.metaModelRef})`); + public static create(dataAssemblyOptions: DataAssemblyOptions, connection: OpcUaConnection): DataAssemblyController { + catDataAssembly.debug(`Create DataAssembly ${dataAssemblyOptions.name} (${dataAssemblyOptions.metaModelRef})`); const types = { 'DataAssembly': DataAssemblyController, @@ -93,18 +93,18 @@ export class DataAssemblyControllerFactory { 'DIntServParam': DIntServParam, 'StringServParam': StringServParam }; - let type = types[variableOptions.metaModelRef.split('/').pop() as keyof typeof types]; + let type = types[dataAssemblyOptions.metaModelRef.split('/').pop() as keyof typeof types]; if (!type) { - if (!variableOptions.metaModelRef) { - catDataAssembly.debug(`No Interface Class specified for DataAssembly ${variableOptions.name}. ` + + if (!dataAssemblyOptions.metaModelRef) { + catDataAssembly.debug(`No Interface Class specified for DataAssembly ${dataAssemblyOptions.name}. ` + 'Fallback to standard DataAssemblyController.'); } else { - catDataAssembly.warn(`No DataAssembly implemented for ${variableOptions.metaModelRef} ` + - `of ${variableOptions.name}. Fallback to standard DataAssembly.`); + catDataAssembly.warn(`No DataAssembly implemented for ${dataAssemblyOptions.metaModelRef} ` + + `of ${dataAssemblyOptions.name}. Fallback to standard DataAssembly.`); } type = DataAssemblyController; } - return new type(variableOptions, connection); + return new type(dataAssemblyOptions, connection); } } diff --git a/src/modularPlantManager/pea/dataAssembly/ParameterRequest.ts b/src/modularPlantManager/pea/dataAssembly/ParameterRequest.ts new file mode 100644 index 00000000..882ab14f --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/ParameterRequest.ts @@ -0,0 +1,316 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {ParameterOptions} from '@p2olab/polaris-interface'; + +import {EventEmitter} from 'events'; +import StrictEventEmitter from 'strict-event-emitter-types'; +import {Category} from 'typescript-logging'; +import {catParameter, catScopeItem} from '../../../logging'; +import {DataAssemblyController} from './DataAssemblyController'; +import {PEAController} from '../PEAController'; +import {DataItem} from '../connection'; +import {Procedure, Service} from '../serviceSet'; +import {ServiceState} from '../serviceSet/service/enum'; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const assign = require('assign-deep'); +import {ScopeOptions} from '@p2olab/polaris-interface'; + +import {Expression, Parser} from 'expr-eval'; + +class ScopeItem { + + /** name of variable which should be replaced in value */ + public readonly name: string; + public readonly dataAssembly: DataAssemblyController; + public readonly pea: PEAController; + public readonly variableName: string; + public readonly dataItem: DataItem; + + constructor(name: string, pea: PEAController, dataAssembly: DataAssemblyController, variableName = '') { + this.name = name; + this.pea = pea; + this.dataAssembly = dataAssembly; + this.variableName = variableName; + this.dataItem = this.dataAssembly.communication[variableName as keyof typeof dataAssembly.communication] || + this.dataAssembly.defaultReadDataItem; + } + + /** + * + * @param {string} expression + * @param peas PEAs to be searched in for variable names (default: all PEAs in manager) + * @param {string[]} ignoredNames don't try to find scopeItems for this variable names + */ + public static extractFromExpressionString(expression: string, peas: PEAController[], ignoredNames: string[] = []): { expression: Expression; scopeItems: ScopeItem[] } { + const parser: Parser = new Parser({allowMemberAccess: true}); + const value = expression.replace(new RegExp('\\\\.', 'g'), '__') + .replace('@', ''); + const expressionObject = parser.parse(value); + const scopeItems = expressionObject + .variables({withMembers: true}) + .filter((variable) => !ignoredNames.find((n) => n === variable)) + .map((variable) => ScopeItem.extractFromExpressionVariable(variable, peas)) + .filter(Boolean); + return {expression: expressionObject, scopeItems: scopeItems}; + } + + /** + * + * @param {ScopeOptions} item + * @param {PEAController[]} peas to be searched in for variable names (default: all PEAs in manager) + * @returns {ScopeItem} + */ + public static extractFromScopeOptions(item: ScopeOptions, peas: PEAController[]): ScopeItem { + const pea = peas.find((peaObj) => peaObj.id === item.pea); + if (!pea){ + throw new Error(`PEA "${item.pea}" couldn't be found`); + } + const dataAssembly = pea.dataAssemblies.find((v) => v.name === item.dataAssembly); + if (!dataAssembly){ + throw new Error(`DataAssembly "${item.dataAssembly}" couldn't be found within PEA "${item.pea}"`); + } + return new ScopeItem(item.name, pea, dataAssembly, item.variable); + } + + /** + * Extract scope item from expression variable + * + * @param {string} variable + * @param {PEAController[]} peas to be searched in for variable names + * @returns {ScopeItem} + */ + public static extractFromExpressionVariable(variable: string, peas: PEAController[]): ScopeItem { + catScopeItem.debug(`Extract ScopeItem from "${variable}"`); + let dataAssembly: DataAssemblyController | undefined; + const components = variable.split('.').map((tokenT: string) => tokenT.replace(new RegExp('__', 'g'), '.')); + let token = components.shift(); + + // find PEAController + let pea = peas.find((p) => p.id === token); + if (pea === undefined) { + if (peas.length === 1) { + pea = peas[0]; + } else { + throw new Error(`Could not evaluate variable "${variable}": PEA "${token}" not found in ` + + `${JSON.stringify(peas.map((p) => p.id))}`); + } + } else { + token = components.shift(); + } + catScopeItem.debug(`Found PEA "${pea.id}" for expression "${variable}"`); + + // find service + const service: Service | undefined = pea.services.find((s) => s.name === token); + let procedure: Procedure | undefined; + if (service) { + catScopeItem.debug(`Found service "${service.name}" for expression "${variable}"`); + procedure = service.getCurrentProcedure(); + if (!procedure) { + procedure = service.getDefaultProcedure(); + if (!procedure){ + throw new Error(`Neither a default nor current procedure was found for service "${service.name}"`); + } + } + token = components.shift(); + + dataAssembly = service.parameters.find((p: DataAssemblyController) => p.name === token); + if (!dataAssembly) { + procedure.parameters.find((p: DataAssemblyController) => p.name === token); + } + if (!dataAssembly) { + procedure.processValuesIn.find((p: DataAssemblyController) => p.name === token); + } + if (!dataAssembly) { + procedure.processValuesOut.find((p: DataAssemblyController) => p.name === token); + } + if (!dataAssembly) { + procedure.reportParameters.find((p: DataAssemblyController) => p.name === token); + } + + if (!dataAssembly) { + if (token === 'state') { + return new ScopeItem(variable, pea, service.serviceControl, 'State'); + } else { + catScopeItem.warn(`Could not evaluate variable "${variable}": ` + + `Token "${token}" not found as service parameter ` + + `in Service ${service.qualifiedName}.${procedure.name}`); + } + } + } else { + // find DataAssemblyController in ProcessValues + if (pea.dataAssemblies.find((v) => v.name === token)) { + dataAssembly = pea.dataAssemblies.find((v) => v.name === token); + } else { + catScopeItem.warn(`Could not evaluate variable "${variable}": ` + + `Token "${token}" not found as dataAssembly ` + + `in PEA ${pea.id}: ${pea.dataAssemblies.map((v) => v.name)}`); + } + } + if (!dataAssembly) { + throw new Error(`Could not evaluate variable "${variable}": ` + + `Token "${token}" not found as dataAssembly ` + + `in PEA ${pea.id}: ${pea.dataAssemblies.map((v) => v.name)}`); + } + + // find DataAssemblyController variable + token = components.shift(); + + return new ScopeItem(variable, pea, dataAssembly, token); + } + + /** + * Returning an nested object following the name construction. The leaf contains the current value + * as object suitable for expr-eval.evaluate() + */ + public getScopeValue(): object { + let value = this.dataItem.value; + if (this.variableName === 'State') { + value = ServiceState[value as ServiceState]; + } + if (value === undefined) { + throw new Error(`Could not evaluate ScopeItem ${this.name} since it seems not connected`); + } + return this.name.split('.').reduceRight((previous, current) => { + const a: any = {}; + a[current] = previous; + return a; + }, value); + } + +} + + +/** + * Static or Dynamic Parameter. Dynamic Parameters can depend on dataAssemblies of the same or + * other PEAs. These can also be continuously updated (specified via continuous property) + */ +export class ParameterRequest { + + /** + * name of parameter which should be updated + */ + public readonly name: string; + /** + * Expression to be calculated and used as value. + * Can contain dataAssemblies, which can be declared inside scopeArray or by using correct variable names + * following this syntax "[pea].[processValue].[variable]". PEAController can be omitted if only one PEAController + * is loaded. TestServerVariable can be omitted. Then "V" is used as variable. + * "." in the name of PEAs or processVariables can be escaped with "\\." + * @example + * "PEATestServer.Sensoren\.L001.V" + */ + public readonly value: string | number | boolean; + public readonly scopeArray: ScopeItem[]; + public readonly eventEmitter: StrictEventEmitter = new EventEmitter(); + + /** + * should parameter continuously be updated + */ + public readonly continuous: boolean; + private readonly options: ParameterOptions; + private readonly expression: Expression; + private readonly logger: Category; + private active = false; + + /** + * + * @param {ParameterOptions} parameterOptions + * @param peas PEAs where expression can be matched + * + */ + constructor(parameterOptions: ParameterOptions, peas: PEAController[] = []) { + catParameter.info(`Create Parameter: ${JSON.stringify(parameterOptions)}`); + + this.options = parameterOptions; + this.name = parameterOptions.name; + this.value = parameterOptions.value || 0; + this.continuous = parameterOptions.continuous || false; + + this.logger = catParameter; + + // evaluate scopeArray + this.scopeArray = (parameterOptions.scope || []) + .map((item: ScopeOptions) => ScopeItem.extractFromScopeOptions(item, peas)); + // evaluate additional dataAssemblies from expression + try { + const extraction = ScopeItem.extractFromExpressionString( + this.value.toString(), peas, this.scopeArray.map((scope) => scope.name) + ); + this.expression = extraction.expression; + this.scopeArray.push(...extraction.scopeItems); + } catch (err: any) { + throw new Error('Parsing error for Parameter ' + err.toString()); + } + this.logger.debug(`Scope array: ${this.scopeArray.map((s) => s.dataAssembly.name)}`); + + this.notify = this.notify.bind(this); + } + + public listenToScopeArray(): EventEmitter { + if (this.active) { + this.logger.info('Provide existent emitter'); + } else { + this.logger.info(`Listening to parameter ${this.name}; ` + + `subscribe to changes of ${this.scopeArray.map((s) => s.dataAssembly.name)}`); + this.active = true; + this.scopeArray.forEach((item) => { + item.dataAssembly.on('changed', this.notify); + }); + } + return this.eventEmitter; + } + + public unlistenToScopeArray(): void { + if (this.active) { + this.scopeArray.forEach((item) => { + item.dataAssembly.removeListener('changed', this.notify); + }); + this.active = false; + } + } + + /** + * calculate value from current scopeArray + * @returns number | boolean + */ + public getValue(): number | boolean { + // get current dataAssemblies + const tasks = this.scopeArray.map((item) => item.getScopeValue()); + + const scope = assign(...tasks); + const result = this.expression.evaluate(scope); + catParameter.debug(`Specific parameters: ${this.name} = ${this.value} (${JSON.stringify(scope)}) = ${result}`); + return result; + } + + private notify(): void { + const newValue = this.getValue(); + this.logger.debug(`Parameter has updated due to dependant variable to: ${newValue}`); + this.eventEmitter.emit('changed', newValue); + } + +} diff --git a/src/modularPlantManager/pea/dataAssembly/SequenceHandshake.puml b/src/modularPlantManager/pea/dataAssembly/SequenceHandshake.puml deleted file mode 100644 index 97ca46a0..00000000 --- a/src/modularPlantManager/pea/dataAssembly/SequenceHandshake.puml +++ /dev/null @@ -1,27 +0,0 @@ -@startuml - -skinparam monochrome false - -participant POL -participant DataAssemblyController - -rnote over DataAssemblyController - State = false -endrnote - - -POL --> DataAssemblyController : Set := true -POL <-- DataAssemblyController : Set := false -rnote over DataAssemblyController - State = true -endrnote -POL <-- DataAssemblyController : State == true -... -POL --> DataAssemblyController : Reset := true -POL <-- DataAssemblyController : Reset := false -rnote over DataAssemblyController - State = false -endrnote -POL <-- DataAssemblyController : State == false - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/ServiceControl/SequenceServiceOperatorInteraction.puml b/src/modularPlantManager/pea/dataAssembly/ServiceControl/SequenceServiceOperatorInteraction.puml deleted file mode 100644 index 8e615eb4..00000000 --- a/src/modularPlantManager/pea/dataAssembly/ServiceControl/SequenceServiceOperatorInteraction.puml +++ /dev/null @@ -1,50 +0,0 @@ -@startuml - -skinparam monochrome false - -participant Service -participant POL -actor Operator - -group initial condition - -rnote over POL - MTP imported - >possible questions - >valid answers -endrnote - -rnote over Service - InteractQuestionID = 0 - InteractAnswerID = 0 -endrnote - -end - -loop - Service <-- POL : await InteractQuestionID change' - rnote over Service - InteractQuestionID > 0 - endrnote - Service --> POL : receive InteractQuestionID' -end -rnote over POL - Get Question String - Get pot. answers -endrnote - -POL --> Operator : Question & potential Answers -rnote over Operator - Pick Answer -endrnote -POL <-- Operator : AnswerID - -Service <-- POL : write InteractAnswerID - -rnote over Service #F00 - Reset - InteractQuestionID = 0 - InteractAnswerID = 0 -endrnote - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.mockup.spec.ts deleted file mode 100644 index c64fba38..00000000 --- a/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.mockup.spec.ts +++ /dev/null @@ -1,137 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../_utils'; -import {ServiceControlMockup} from './ServiceControl.mockup'; -import {OpcUaConnection} from '../../connection'; -import {namespaceUrl} from '../../../../../tests/namespaceUrl'; -import {OperationMode, ServiceSourceMode} from '@p2olab/polaris-interface'; -import {ServiceMtpCommand} from '../../serviceSet/service/enum'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('ServiceControlMockup', () => { - - describe('static', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create ServiceControlMockup', async () => { - const mockup= new ServiceControlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - - }); - it('getServiceControlMockupReferenceJSON()', () => { - const mockup = new ServiceControlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getServiceControlInstanceMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(32); - //TODO check all variables - }); - }); - describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: ServiceControlMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new ServiceControlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - await mockupServer.start(); - - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - // CommandOp - it('set and get CommandOp, should work', async () => { - // set up mockup - mockup.operationMode.opMode = OperationMode.Operator; - mockup.commandEn = 1; - - await connection.writeOpcUaNode('Variable.CommandOp', namespaceUrl, 1, 'UInt32'); - await connection.readOpcUaNode('Variable.CommandOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }); - it('set CommandOp, value not valid, should fail', async () => { - return expect(connection.writeOpcUaNode('Variable.CommandOp', namespaceUrl, 100, 'UInt32')) - .rejectedWith('One or more arguments are invalid.'); - }); - it('set CommandOp, not Operator, should fail', async () => { - return expect(connection.writeOpcUaNode('Variable.CommandOp', namespaceUrl, 1, 'UInt32')) - .rejectedWith('One or more arguments are invalid.'); - }); - it('set CommandOp, commandEn=0, should fail', async () => { - mockup.operationMode.opMode = OperationMode.Operator; // set up mockup - return expect(connection.writeOpcUaNode('Variable.CommandOp', namespaceUrl, 1, 'UInt32')) - .rejectedWith('One or more arguments are invalid.'); - }); - - // CommandExt - it('set CommandExt, should change state', async () => { - // set up mockup - mockup.operationMode.opMode = OperationMode.Automatic; - mockup.serviceSourceMode.srcMode = ServiceSourceMode.Extern; - await connection.writeOpcUaNode('Variable.CommandExt', namespaceUrl, 4, 'UInt32'); - await connection.readOpcUaNode('Variable.StateCur', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(64)); - - }); - it('set CommandExt, value not valid, should fail', async () => { - return expect(connection.writeOpcUaNode('Variable.CommandExt', namespaceUrl, 100, 'UInt32')) - .rejectedWith('One or more arguments are invalid.'); - }); - it('set CommandExt, not Automatic, should fail', async () => { - return expect(connection.writeOpcUaNode('Variable.CommandExt', namespaceUrl, 1, 'UInt32')) - .rejectedWith('One or more arguments are invalid.'); - }); - it('set CommandExt, commandEn=0, should fail', async () => { - mockup.operationMode.opMode = OperationMode.Automatic; - return expect(connection.writeOpcUaNode('Variable.CommandExt', namespaceUrl, 1, 'UInt32')) - .rejectedWith('One or more arguments are invalid.'); - }); - - //ProcedureOp - it('set and get ProcedureOp, should work', async () => { - // set up mockup - mockup.operationMode.opMode = OperationMode.Operator; - await connection.writeOpcUaNode('Variable.ProcedureOp', namespaceUrl, 1, 'UInt32'); - await connection.readOpcUaNode('Variable.ProcedureOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }); - it('set and get ProcedureOp, should fail', async () => { - return expect(connection.writeOpcUaNode('Variable.ProcedureOp', namespaceUrl, 1, 'UInt32')) - .rejectedWith('One or more arguments are invalid.'); - }); - - //ProcedureExt - it('set and get ProcedureExt, should work', async () => { - //TODO test needs to be adjusted - // set up mockup - mockup.operationMode.opMode = OperationMode.Automatic; - mockup.serviceSourceMode.srcMode = ServiceSourceMode.Extern; - await connection.writeOpcUaNode('Variable.ProcedureExt', namespaceUrl, 1, 'UInt32'); - await connection.readOpcUaNode('Variable.ProcedureExt', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }); - it('set and get ProcedureExt, should fail', async () => { - return expect(connection.writeOpcUaNode('Variable.ProcedureExt', namespaceUrl, 1, 'UInt32')) - .rejectedWith('One or more arguments are invalid.'); - }); - - //TODO get the rest - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.mockup.ts b/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.mockup.ts deleted file mode 100644 index 2e1eab14..00000000 --- a/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.mockup.ts +++ /dev/null @@ -1,397 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../_extensions/opModeDA/OpModeDA.mockup'; -import { - getServiceSourceModeDAMockupReferenceJSON, - ServiceSourceModeDAMockup -} from '../_extensions/serviceSourceModeDA/ServiceSourceModeDA.mockup'; -import {ServiceMtpCommand, ServiceState, ServiceStateString} from '../../serviceSet/service/enum'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON} from '../_extensions/osLevelDA/OSLevelDA.mockup'; -import {DataAssemblyControllerMockup} from '../DataAssemblyController.mockup'; -import {MtpStateMachine, UserDefinedActions, UserDefinedGuard} from '../../StateMachine/MtpStateMachine'; - -export function getServiceControlMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - - ...getWQCDAMockupReferenceJSON(namespace,objectBrowseName), - ...getOSLevelDAMockupReferenceJSON(namespace,objectBrowseName), - ...getServiceSourceModeDAMockupReferenceJSON(namespace,objectBrowseName), - ...getOpModeDAMockupReferenceJSON(namespace,objectBrowseName), - CommandOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.CommandOp`, - dataType: 'Int32' - }, - CommandInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.CommandInt`, - dataType: 'Int32' - }, - CommandExt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.CommandExt`, - dataType: 'Int32' - }, - CommandEn: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.CommandEn`, - dataType: 'Int32' - }, - StateCur: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StateCur`, - dataType: 'Int32' - }, - ProcedureOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.ProcedureOp`, - dataType: 'Int32' - }, - ProcedureExt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.ProcedureExt`, - dataType: 'Int32' - }, - ProcedureInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.ProcedureInt`, - dataType: 'Int32' - }, - ProcedureCur: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.ProcedureCur`, - dataType: 'Int32' - }, - ProcedureReq: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.ProcedureReq`, - dataType: 'Int32' - }, - InteractQuestionID: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.InteractQuestionID`, - dataType: 'Int32' - }, - InteractAnswerID: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.InteractAnswerID`, - dataType: 'Int32' - }, - PosTextID: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosTextID`, - dataType: 'Int32' - } - }); -} - -export class ServiceControlMockup extends DataAssemblyControllerMockup{ - public serviceSourceMode: ServiceSourceModeDAMockup; - public operationMode: OpModeDAMockup; - protected wqc: WQCDAMockup; - - protected commandOp = 0; - protected commandInt = 0; - protected commandExt = 0; - - - protected procedureExt = 0; - - commandEn = 268; - - protected posTextID = 0; - protected interactAnswerID = 0; - protected interactQuestionID = 0; - - protected stateMachine: MtpStateMachine; - private procedureOp = 0; - private procedureInt = 0; - - public get state(): ServiceStateString { - return this.stateMachine.getState(); - } - - constructor(namespace: Namespace, rootNode: UAObject, variableName: string){ - super(namespace, rootNode, variableName); - this.operationMode = new OpModeDAMockup(namespace, this.mockupNode, variableName); - this.serviceSourceMode = new ServiceSourceModeDAMockup(namespace, this.mockupNode, variableName); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, variableName); - - this.stateMachine = new MtpStateMachine(variableName, {} as UserDefinedGuard, {} as UserDefinedActions); - this.stateMachine.start(); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.CommandOp`, - browseName: `${variableName}.CommandOp`, - dataType: 'UInt32', - value: { - get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.commandOp}); - }, - set: (variant: Variant) => { - const reqCommandOp = parseInt(variant.value, 10); - if(!Object.values(ServiceMtpCommand).includes(reqCommandOp)) { - return StatusCodes.BadInvalidArgument; - } - if(this.operationMode.stateOpAct){ - if(this.commandEn===reqCommandOp){ - this.commandOp = reqCommandOp; - return StatusCodes.Good; - } - } - this.commandOp = ServiceMtpCommand.UNDEFINED; - return StatusCodes.BadInvalidArgument; - }, - }, - }); - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.CommandInt`, - browseName: `${variableName}.CommandInt`, - dataType: 'UInt32', - value: { - get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.commandInt}); - }, - }, - }); - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.CommandExt`, - browseName: `${variableName}.CommandExt`, - dataType: 'UInt32', - value: { - get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.commandExt}); - }, - set: (variant: Variant) => { - const reqCommandExt = parseInt(variant.value, 10); - if(!Object.values(ServiceMtpCommand).includes(reqCommandExt)) { - return StatusCodes.BadInvalidArgument; - } - if(this.operationMode.stateAutAct && this.serviceSourceMode.srcExtAct){ - /* if(this.commandEn===reqCommandExt){ - this.commandExt = reqCommandExt; - return StatusCodes.Good; - }*/ - this.logger.info(`Set service CommandExt (${this.name}): ${ServiceMtpCommand[reqCommandExt]} (${reqCommandExt})`); - const result = this.stateMachine.triggerEvent(reqCommandExt); - if (result) { - return StatusCodes.Good; - } - } - this.commandExt = ServiceMtpCommand.UNDEFINED; - return StatusCodes.BadInvalidArgument; - }, - }, - }); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.ProcedureOp`, - browseName: `${variableName}.ProcedureOp`, - dataType: 'UInt32', - value: { - get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.procedureOp}); - }, - set: (variant: Variant) => { - const reqProcedureOp = parseInt(variant.value, 10); - if(this.operationMode.stateOpAct){ - // TODO: check if procedure is valid - this.procedureOp = reqProcedureOp; - return StatusCodes.Good; - } - return StatusCodes.BadInvalidArgument; - }, - }, - }); - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.ProcedureInt`, - browseName: `${variableName}.ProcedureInt`, - dataType: 'UInt32', - value: { - get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.procedureInt}); - }, - }, - }); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.ProcedureExt`, - browseName: `${variableName}.ProcedureExt`, - dataType: 'UInt32', - value: { - get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.procedureExt}); - }, - set: (variant: Variant) => { - const reqProcedureExt = parseInt(variant.value, 10); - if(this.operationMode.stateAutAct && this.serviceSourceMode.srcExtAct){ - // TODO: check if procedure is valid - this.stateMachine.setProcedureReq(reqProcedureExt); - this.logger.info( - `Set ProcedureReq by ProcedureExt (${this.name}): ProcedureReq: ${this.stateMachine.getProcedureReq()}`); - - return StatusCodes.Good; - } - return StatusCodes.BadInvalidArgument; - }, - }, - }); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.StateCur`, - browseName: `${variableName}.StateCur`, - dataType: 'UInt32', - value: { - get: (): Variant => { - const stateCur: ServiceState = ServiceState[this.state]; - return new Variant({dataType: DataType.UInt32, value: stateCur}); - }, - }, - }); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.CommandEn`, - browseName: `${variableName}.CommandEn`, - dataType: 'UInt32', - value: { - get: (): Variant => { - let enabled = 0; - for (const [key, value] of this.stateMachine.getCommandEnabled()) { - if (value) { - enabled += ServiceMtpCommand[key]; - } - } - return new Variant({dataType: DataType.UInt32, value: enabled}); - }, - }, - }); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.ProcedureCur`, - browseName: `${variableName}.ProcedureCur`, - dataType: 'UInt32', - value: { - get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.procedureCur}); - }, - }, - }); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.ProcedureReq`, - browseName: `${variableName}.ProcedureReq`, - dataType: 'UInt32', - value: { - get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.procedureReq}); - }, - }, - }); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.PosTextID`, - browseName: `${variableName}.PosTextID`, - dataType: 'UInt32', - value: { - get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.posTextID}); - }, - }, - }); - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.InteractQuestionID`, - browseName: `${variableName}.InteractQuestionID`, - dataType: 'UInt32', - value: { - get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.interactQuestionID}); - }, - }, - }); - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.InteractAnswerID`, - browseName: `${variableName}.InteractAnswerID`, - dataType: 'UInt32', - value: { - get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.interactAnswerID}); - }, - }, - }); - } -/* - public set procedureInt(procedureInt: number) { - const procedure = Math.trunc(procedureInt); - if(this.operationMode.stateAutAct && this.serviceSourceMode.isIntSource) { - this.stateMachine.setProcedureReq(procedure); - this.logger.info( - `Set ProcedureReq by ProcedureInt (${this.name}): ProcedureReq: ${this.stateMachine.getProcedureReq()}`); - } - } - - public set procedureOp(procedureOp: number) { - const procedure = Math.trunc(procedureOp); - if(this.operationMode.stateOpAct && this.osLevel === 0){ - // TODO: check if procedure is valid - this.stateMachine.setProcedureReq(procedure); - this.logger.info( - `Set ProcedureReq by ProcedureOp (${this.name}): ProcedureReq: ${this.stateMachine.getProcedureReq()}`); - } - } -*/ - - public get procedureCur(): number { - return this.stateMachine.getProcedureCur(); - } - - public get procedureReq(): number { - return this.stateMachine.getProcedureReq(); - } - - public getServiceControlInstanceMockupJSON(){ - return getServiceControlMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); - } -} diff --git a/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.puml b/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.puml deleted file mode 100644 index 0ddbef27..00000000 --- a/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.puml +++ /dev/null @@ -1,18 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram -!include ../_extensions/wqcDA/WQC.puml -!include ../_extensions/opModeDA/OpModeController.puml -!include ../_extensions/serviceSourceModeDA/ServiceSourceModeController.puml -class ServiceControl{ - + readonly communication!: ServiceControlRuntime - + readonly wqc: WQC - + readonly opMode: OpModeController - + readonly serviceSourceMode: ServiceSourceModeController -} - -ServiceControl *- ServiceControlRuntime -ServiceControl *- WQC -ServiceControl *- OpModeController -ServiceControl *- ServiceSourceModeController - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.spec.ts b/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.spec.ts deleted file mode 100644 index 8a354825..00000000 --- a/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.spec.ts +++ /dev/null @@ -1,136 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import { - DataAssemblyOptions, -} from '@p2olab/polaris-interface'; -import {OpcUaConnection} from '../../connection'; -import { - ServiceControl -} from '../index'; - -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import * as baseDataAssemblyOptions from '../../../../../tests/servicecontrol.json'; -import {namespaceUrl} from '../../../../../tests/namespaceUrl'; -import {MockupServer} from '../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {ServiceControlMockup} from './ServiceControl.mockup'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('ServiceControl', () => { - - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'ServiceControl', - dataItems: baseDataAssemblyOptions - }; - - describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create ServiceControl', async () => { - const da1 = new ServiceControl(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1.opMode).to.not.equal(undefined); - expect(da1.serviceSourceMode).to.not.equal(undefined); - - expect(da1.communication.WQC).to.not.equal(undefined); - expect(da1.communication.CommandOp).to.not.equal(undefined); - expect(da1.communication.CommandExt).to.not.equal(undefined); - expect(da1.communication.CommandInt).to.not.equal(undefined); - expect(da1.communication.CommandEn).to.not.equal(undefined); - expect(da1.communication.StateCur).to.not.equal(undefined); - expect(da1.communication.ProcedureOp).to.not.equal(undefined); - expect(da1.communication.ProcedureExt).to.not.equal(undefined); - expect(da1.communication.ProcedureInt).to.not.equal(undefined); - expect(da1.communication.ProcedureCur).to.not.equal(undefined); - expect(da1.communication.ProcedureReq).to.not.equal(undefined); - expect(da1.communication.InteractQuestionID).to.not.equal(undefined); - expect(da1.communication.InteractAnswerID).to.not.equal(undefined); - expect(da1.communication.PosTextID).to.not.equal(undefined); - }); - }); - - - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockup = new ServiceControlMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new ServiceControl(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.WQC.value).equal(0); - expect((da1).communication.StateChannel.value).equal(false); - expect((da1).communication.StateOffAut.value).equal(false); - expect((da1).communication.StateOpAut.value).equal(false); - expect((da1).communication.StateAutAut.value).equal(false); - expect((da1).communication.StateOffOp.value).equal(false); - expect((da1).communication.StateOpOp.value).equal(false); - expect((da1).communication.StateAutOp.value).equal(false); - expect((da1).communication.StateOpAct.value).equal(false); - expect((da1).communication.StateAutAct.value).equal(false); - expect((da1).communication.StateOffAct.value).equal(true); - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcExtAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcExtOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcExtAct.value).equal(false); - - }).timeout(4000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/_helper/index.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/_helper/index.ts deleted file mode 100644 index 2b3d8cff..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/_helper/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './mixins'; diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/basicDefinitions.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/basicDefinitions.puml deleted file mode 100644 index 5c94695f..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/basicDefinitions.puml +++ /dev/null @@ -1,31 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram -!include feedbackMonitoringDA/FeedbackMonitoring.puml -!include interlockDA/Interlock.puml -!include limitMonitoringDA/LimitMonitoring.puml -!include opModeDA/OpModeController.puml -!include osLevelDA/OSLevel.puml -!include resetDA/Reset.puml -!include scaleSettingsDA/ScaleSettings.puml -!include serviceSourceModeDA/ServiceSourceModeController.puml -!include sourceModeDA/SourceModeController.puml -!include unitDA/UnitSettings.puml -!include valueLimitationDA/ValueLimitation.puml -!include wqcDA/WQC.puml - -abstract class DataAssemblyController - -DataAssemblyController "0..1" o-- FeedbackMonitoringDA -DataAssemblyController "0..1" o-- InterlockDA -DataAssemblyController "0..1" o-- LimitMonitoringDA -DataAssemblyController "0..1" o-- OpModeDA -DataAssemblyController "0..1" o-- OSLevelDA -DataAssemblyController "0..1" o-- ResetDA -DataAssemblyController "0..1" o-- ScaleSettingDA -DataAssemblyController "0..1" o-- ServiceSourceModeDA -DataAssemblyController "0..1" o-- SourceModeDA -DataAssemblyController "0..1" o-- UnitDA -DataAssemblyController "0..1" o-- ValueLimitationDA -DataAssemblyController "0..1" o-- WQCDA - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoring.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoring.puml deleted file mode 100644 index fc4b391a..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoring.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - - -class FeedbackMonitoring{ - - dAController: any - - initialize(): void -} - -FeedbackMonitoring *- FeedbackMonitoringDASpec -FeedbackMonitoringDASpec ..> FeedbackMonitoringDAMockup : <> -FeedbackMonitoring *- FeedbackMonitoringDAMockup - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup.spec.ts deleted file mode 100644 index eb039982..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup.spec.ts +++ /dev/null @@ -1,94 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataType, Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {FeedbackMonitoringDAMockup} from './FeedbackMonitoringDA.mockup'; -import {BinMonMockup} from '../../indicatorElement/BinView/BinMon.mockup'; -import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('FeedbackMonitoringDAMockup', () => { - describe('static', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create FeedbackMonitoringDAMockup', async () => { - const mockup= new FeedbackMonitoringDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - }); - - it('getFeedbackMonitoringMockupReferenceJSON()', () => { - const mockup = new FeedbackMonitoringDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getFeedbackMonitoringDAInstanceMockupJSON(); - - expect(Object.keys(json).length).to.equal(6); - expect(json.MonDynTi).to.not.be.undefined; - expect(json.MonStatTi).to.not.be.undefined; - expect(json.MonDynErr).to.not.be.undefined; - expect(json.MonEn).to.not.be.undefined; - expect(json.MonStatErr).to.not.be.undefined; - expect(json.MonSafePos).to.not.be.undefined; - }); - }); - - describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: FeedbackMonitoringDAMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new FeedbackMonitoringDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set and get MonEn', async () => { - await connection.writeOpcUaNode('Variable.MonEn', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.MonEn', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(true)); - }).timeout(5000); - - it('get MonSafePos', async () => { - await connection.readOpcUaNode('Variable.MonSafePos', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - }).timeout(5000); - - it('get MonStatErr', async () => { - await connection.readOpcUaNode('Variable.MonStatErr', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - }).timeout(5000); - - it('get MonDynErr', async () => { - await connection.readOpcUaNode('Variable.MonDynErr', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - }).timeout(5000); - - it('get MonStatTi', async () => { - await connection.readOpcUaNode('Variable.MonStatTi', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(0)); - }).timeout(5000); - it('get MonDynTi', async () => { - await connection.readOpcUaNode('Variable.MonDynTi', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(0)); - }).timeout(5000); - - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/index.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/index.ts deleted file mode 100644 index 99b8cf82..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * from './feedbackMonitoringDA/FeedbackMonitoring'; -export * from './interlockDA/Interlock'; -export * from './limitMonitoringDA/LimitMonitoring'; -export * from './opModeDA/OpModeController'; -export * from './osLevelDA/OSLevel'; -export * from './resetDA/Reset'; -export * from './scaleSettingsDA/ScaleSettings'; -export * from './sourceModeDA/SourceModeController'; -export * from './unitDA/UnitSettings'; -export * from './valueLimitationDA/ValueLimitation'; -export * from './wqcDA/WQC'; diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/Interlock.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/Interlock.puml deleted file mode 100644 index 27422141..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/Interlock.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - - -class Interlock{ - - dAController: any - - initialize(): void -} - -Interlock *- InterlockDASpec -InterlockDASpec ..> InterlockDAMockup : <> -Interlock *- InterlockDAMockup - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/InterlockDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/InterlockDA.mockup.spec.ts deleted file mode 100644 index 5000bea0..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/InterlockDA.mockup.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataType, Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {InterlockDAMockup} from './InterlockDA.mockup'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('InterlockDAMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - it('should create InterlockDAMockup', async () => { - const mockup= new InterlockDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - }); - it('getAnaServParamMockupReferenceJSON()', () => { - const mockup = new InterlockDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getInterlockDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(6); - expect(json.PermEn).to.not.be.undefined; - expect(json.Interlock).to.not.be.undefined; - expect(json.IntlEn).to.not.be.undefined; - expect(json.Permit).to.not.be.undefined; - expect(json.Protect).to.not.be.undefined; - expect(json.ProtEn).to.not.be.undefined; - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoring.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoring.puml deleted file mode 100644 index 677a8018..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoring.puml +++ /dev/null @@ -1,13 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - - -class LimitMonitoring{ - - dAController: any - - initialize(): void -} - -LimitMonitoring *- LimitMonitoringDASpec -LimitMonitoringDASpec ..> LimitMonitoringDAMockup : <> -LimitMonitoring *- LimitMonitoringDAMockup -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoringDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoringDA.mockup.spec.ts deleted file mode 100644 index 55f70de7..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoringDA.mockup.spec.ts +++ /dev/null @@ -1,148 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataType, Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {LimitMonitoringDAMockup} from './LimitMonitoringDA.mockup'; -import {FeedbackMonitoringDAMockup} from '../feedbackMonitoringDA/FeedbackMonitoringDA.mockup'; -import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('LimitMonitoringDAMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create LimitMonitoringDAMockup, Int32', async () => { - const mockup= new LimitMonitoringDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Int32); - expect(mockup).to.not.be.undefined; - }); - - it('should create LimitMonitoringDAMockup, Double', async () => { - const mockup= new LimitMonitoringDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Double); - expect(mockup).to.not.be.undefined; - }); - - it('getAnaServParamMockupReferenceJSON()', () => { - const mockup = new LimitMonitoringDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Int32); - const json = mockup.getLimitMonitoringDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(18); - //TODO more testing? - }); - - }); - describe('dynamic, Double', () => { - // we need to check if the nodes was added successfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: LimitMonitoringDAMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new LimitMonitoringDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Double); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set and get VAHLim', async () => { - await connection.writeOpcUaNode('Variable.VAHLim', namespaceUrl, 1, 'Double'); - await connection.readOpcUaNode('Variable.VAHLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - it('set and get VWHLim', async () => { - await connection.writeOpcUaNode('Variable.VWHLim', namespaceUrl, 1, 'Double'); - await connection.readOpcUaNode('Variable.VWHLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - it('set and get VTHLim', async () => { - await connection.writeOpcUaNode('Variable.VTHLim', namespaceUrl, 1, 'Double'); - await connection.readOpcUaNode('Variable.VTHLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - it('set and get VTLLim', async () => { - await connection.writeOpcUaNode('Variable.VTLLim', namespaceUrl, 1, 'Double'); - await connection.readOpcUaNode('Variable.VTLLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - it('set and get VALLim', async () => { - await connection.writeOpcUaNode('Variable.VALLim', namespaceUrl, 1, 'Double'); - await connection.readOpcUaNode('Variable.VALLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - it('set and get VWLLim', async () => { - await connection.writeOpcUaNode('Variable.VWLLim', namespaceUrl, 1, 'Double'); - await connection.readOpcUaNode('Variable.VWLLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - //TODO: get the rest of values - - }); - describe('dynamic, Int32', () => { - // we need to check if the nodes was added successfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: LimitMonitoringDAMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new LimitMonitoringDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Int32); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set and get VAHLim', async () => { - await connection.writeOpcUaNode('Variable.VAHLim', namespaceUrl, 1, 'Int32'); - await connection.readOpcUaNode('Variable.VAHLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - it('set and get VWHLim', async () => { - await connection.writeOpcUaNode('Variable.VWHLim', namespaceUrl, 1, 'Int32'); - await connection.readOpcUaNode('Variable.VWHLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - it('set and get VTHLim', async () => { - await connection.writeOpcUaNode('Variable.VTHLim', namespaceUrl, 1, 'Int32'); - await connection.readOpcUaNode('Variable.VTHLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - it('set and get VTLLim', async () => { - await connection.writeOpcUaNode('Variable.VTLLim', namespaceUrl, 1, 'Int32'); - await connection.readOpcUaNode('Variable.VTLLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - it('set and get VALLim', async () => { - await connection.writeOpcUaNode('Variable.VALLim', namespaceUrl, 1, 'Int32'); - await connection.readOpcUaNode('Variable.VALLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - it('set and get VWLLim', async () => { - await connection.writeOpcUaNode('Variable.VWLLim', namespaceUrl, 1, 'Int32'); - await connection.readOpcUaNode('Variable.VWLLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(2000); - //TODO: get the rest of values - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoringDA.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoringDA.spec.ts deleted file mode 100644 index d6dc12a7..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoringDA.spec.ts +++ /dev/null @@ -1,149 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../connection'; - -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/anamon.json'; -import {LimitMonitoring} from './LimitMonitoring'; -import {DataAssemblyController} from '../../DataAssemblyController'; -import {AnaMon} from '../../indicatorElement'; -import {MockupServer} from '../../../../_utils'; -import {DataType, Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {LimitMonitoringDAMockup} from './LimitMonitoringDA.mockup'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('LimitMonitoring', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaMon', - dataItems: baseDataAssemblyOptions - }; - - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create LimitMonitoring', async () => { - - const da1 = new AnaMon(dataAssemblyOptions, emptyOPCUAConnection); - const limitMonitoring = new LimitMonitoring(da1); - - expect(limitMonitoring).to.not.be.undefined; - - expect(da1.communication.VAHEn).to.not.be.undefined; - expect(da1.communication.VAHLim).to.not.be.undefined; - expect(da1.communication.VAHAct).to.not.be.undefined; - - expect(da1.communication.VWHEn).to.not.be.undefined; - expect(da1.communication.VWHLim).to.not.be.undefined; - expect(da1.communication.VWHAct).to.not.be.undefined; - - expect(da1.communication.VTHEn).to.not.be.undefined; - expect(da1.communication.VTHLim).to.not.be.undefined; - expect(da1.communication.VTHAct).to.not.be.undefined; - - expect(da1.communication.VTLEn).to.not.be.undefined; - expect(da1.communication.VTLLim).to.not.be.undefined; - expect(da1.communication.VTLAct).to.not.be.undefined; - - expect(da1.communication.VWLEn).to.not.be.undefined; - expect(da1.communication.VWLLim).to.not.be.undefined; - expect(da1.communication.VWLAct).to.not.be.undefined; - - expect(da1.communication.VALEn).to.not.be.undefined; - expect(da1.communication.VALLim).to.not.be.undefined; - expect(da1.communication.VALAct).to.not.be.undefined; - }); - }); - - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - let mockup: LimitMonitoringDAMockup; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new LimitMonitoringDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable', DataType.Double); - //TODO: do for Int32 - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - new LimitMonitoring(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.VAHEn.value).to.equal(false); - expect(da1.communication.VAHLim.value).to.equal(0); - expect(da1.communication.VAHAct.value).to.equal(false); - - expect(da1.communication.VWHEn.value).to.equal(false); - expect(da1.communication.VWHLim.value).to.equal(0); - expect(da1.communication.VWHAct.value).to.equal(false); - - expect(da1.communication.VTHEn.value).to.equal(false); - expect(da1.communication.VTHLim.value).to.equal(0); - expect(da1.communication.VTHAct.value).to.equal(false); - - expect(da1.communication.VTLEn.value).to.equal(false); - expect(da1.communication.VTLLim.value).to.equal(0); - expect(da1.communication.VTLAct.value).to.equal(false); - - expect(da1.communication.VWLEn.value).to.equal(false); - expect(da1.communication.VWLLim.value).to.equal(0); - expect(da1.communication.VWLAct.value).to.equal(false); - - expect(da1.communication.VALEn.value).to.equal(false); - expect(da1.communication.VALLim.value).to.equal(0); - expect(da1.communication.VALAct.value).to.equal(false); - }).timeout(5000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeController.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeController.puml deleted file mode 100644 index 7d7d691c..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeController.puml +++ /dev/null @@ -1,13 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class OpModeController{ - - dAController: any - - initialize(): void -} - -OpModeController *- OpModeDASpec -OpModeDASpec ..> OpModeDAMockup : <> -OpModeController *- OpModeDAMockup - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeDA.mockup.spec.ts deleted file mode 100644 index cf43a448..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeDA.mockup.spec.ts +++ /dev/null @@ -1,174 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {OpModeDAMockup} from './OpModeDA.mockup'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {OpcUaConnection} from '../../../connection'; -import {OperationMode} from '@p2olab/polaris-interface'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('OpModeDAMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create OpModeDAMockup', async () => { - const mockup= new OpModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - }); - it('OpModeDAMockupReferenceJSON()', () => { - const mockup = new OpModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getOpModeDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(10); - expect(json.StateChannel).to.not.be.undefined; - expect(json.StateOffAut).to.not.be.undefined; - expect(json.StateOpAut).to.not.be.undefined; - expect(json.StateAutAut).to.not.be.undefined; - expect(json.StateOffOp).to.not.be.undefined; - expect(json.StateOpOp).to.not.be.undefined; - expect(json.StateAutOp).to.not.be.undefined; - expect(json.StateOpAct).to.not.be.undefined; - expect(json.StateAutAct).to.not.be.undefined; - expect(json.StateOffAct).to.not.be.undefined; - }); - - it('get stateOpAct', async () => { - const mockup= new OpModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup.stateOpAct).to.be.false; - }); - it('get stateAutAct', async () => { - const mockup= new OpModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup.stateAutAct).to.be.false; - }); - it('get stateOffAct', async () => { - const mockup= new OpModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup.stateOffAct).to.be.true; - }); - - }); - describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: OpModeDAMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(10000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new OpModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set and get StateOffOp', async () => { - mockup.opMode = OperationMode.Operator; - await connection.writeOpcUaNode('Variable.StateOffOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.StateOffOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.opMode).to.equal(OperationMode.Offline); - }).timeout(2000); - - it('set and get StateOpOp', async () => { - await connection.writeOpcUaNode('Variable.StateOpOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.StateOpOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.opMode).to.equal(OperationMode.Operator); - }).timeout(2000); - - it('set and get StateAutOp', async () => { - mockup.opMode = OperationMode.Operator; - await connection.writeOpcUaNode('Variable.StateAutOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.StateAutOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.opMode).to.equal(OperationMode.Automatic); - }).timeout(2000); - - it('set and get StateOffOp, write false', async () => { - mockup.opMode = OperationMode.Operator; - await connection.writeOpcUaNode('Variable.StateOffOp', namespaceUrl, false, 'Boolean'); - await connection.readOpcUaNode('Variable.StateOffOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.opMode).to.equal(OperationMode.Operator); - }).timeout(2000); - - it('set and get StateOpOp, write false', async () => { - await connection.writeOpcUaNode('Variable.StateOpOp', namespaceUrl, false, 'Boolean'); - await connection.readOpcUaNode('Variable.StateOpOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.opMode).to.equal(OperationMode.Offline); - }).timeout(2000); - - it('set and get StateAutOp, write false', async () => { - mockup.opMode = OperationMode.Operator; - await connection.writeOpcUaNode('Variable.StateAutOp', namespaceUrl, false, 'Boolean'); - await connection.readOpcUaNode('Variable.StateAutOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.opMode).to.equal(OperationMode.Operator); - }).timeout(2000); - //TODO get the rest - - }); - describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: OpModeDAMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(10000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new OpModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - mockup.stateChannel = true; - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set and get StateOffOp', async () => { - mockup.opMode = OperationMode.Operator; - await connection.writeOpcUaNode('Variable.StateOffOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.StateOffOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.opMode).to.equal(OperationMode.Operator); - }).timeout(2000); - - it('set and get StateOpOp', async () => { - await connection.writeOpcUaNode('Variable.StateOpOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.StateOpOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.opMode).to.equal(OperationMode.Offline); - }).timeout(2000); - - it('set and get StateAutOp', async () => { - mockup.opMode = OperationMode.Operator; - await connection.writeOpcUaNode('Variable.StateAutOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.StateAutOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.opMode).to.equal(OperationMode.Operator); - }).timeout(2000); - - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/StatemachineOpMode.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/StatemachineOpMode.puml deleted file mode 100644 index d8d8ae62..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/StatemachineOpMode.puml +++ /dev/null @@ -1,23 +0,0 @@ -@startuml - -[*] --> Offline - -Offline : StateOffAct = 1 -Offline : StateOpAct = 0 -Offline : StateAutAct = 0 - -Operator : StateOffAct = 0 -Operator : StateOpAct = 1 -Operator : StateAutAct = 0 - -Automatic : StateOffAct = 0 -Automatic : StateOpAct = 0 -Automatic : StateAutAct = 1 - -Offline -> Operator : StateOpAut(if StateChannel) \n StateOpAut(if not StateChannel) -Operator -> Offline : StateOffAut(if StateChannel) \n StateOffOp(if not StateChannel) - -Operator -> Automatic : StateAutAut(if StateChannel) \n StateAutOp(if not StateChannel) -Automatic -> Operator : StateOpAut(if StateChannel) \n StateOpAut(if not StateChannel) - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevel.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevel.puml deleted file mode 100644 index 8c7beb41..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevel.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class OSLevel{ - - dAController: any - + osLevel: number | undefined - - initialize(): void - + OSLevel(): number | undefined -} - -OSLevel *- OSLevelDASpec -OSLevelDASpec ..> OSLevelDAMockup : <> -OSLevel *- OSLevelDAMockup -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevel.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevel.spec.ts deleted file mode 100644 index 7b088edd..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevel.spec.ts +++ /dev/null @@ -1,133 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../connection'; -import * as baseDataAssemblyOptions from '../../../../../../tests/binmon.json'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptionsStatic from '../../../../../../tests/binmon_static.json'; -import {OSLevel} from './OSLevel'; -import {DataAssemblyController} from '../../DataAssemblyController'; -import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {OSLevelDAMockup} from './OSLevelDA.mockup'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('OSLevel', () => { - const dataAssemblyOptionsStatic: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinMon', - dataItems: baseDataAssemblyOptionsStatic - }; - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinMon', - dataItems: baseDataAssemblyOptions - }; - - describe('static', () => { - let oslevelObject: any; - let da: any; - describe('static OSLevel',()=>{ - beforeEach(()=>{ - const emptyOPCUAConnection = new OpcUaConnection('', ''); - da = new DataAssemblyController(dataAssemblyOptionsStatic, emptyOPCUAConnection) as any; - oslevelObject = new OSLevel(da); - }); - it('should create OSLevel', async () => { - expect(oslevelObject.OSLevel).to.equal(0); - expect(da.communication.OSLevel).to.be.undefined; - }); - - it('getter', async () => { - expect(oslevelObject.OSLevel).to.equal(0); - }); - //TODO: toJson(); - }); - describe('dynamic OSLevel', () => { - let oslevelObject: any; - let da: any; - beforeEach(()=>{ - const emptyOPCUAConnection = new OpcUaConnection('', ''); - da = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection); - oslevelObject = new OSLevel(da); - }); - - it('should create OSLevel', async () => { - expect(oslevelObject.OSLevel).to.be.undefined; - expect(da.communication.OSLevel).to.not.be.undefined; - }); - - it('getter', async () => { - expect(oslevelObject.OSLevel).to.be.undefined; - }); - //TODO: toJson(); - }); - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - let mockup: OSLevelDAMockup; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new OSLevelDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - new OSLevel(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.OSLevel.value).to.equal(0); - }).timeout(5000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevelDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevelDA.mockup.spec.ts deleted file mode 100644 index b08cd3c5..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevelDA.mockup.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {OSLevelDAMockup} from './OSLevelDA.mockup'; -import {OpModeDAMockup} from '../opModeDA/OpModeDA.mockup'; -import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('OSLevelDAMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - afterEach(async () => { - - }); - it('should create OSLevelDAMockup', async () => { - const mockup= new OSLevelDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - - }); - it('getAnaServParamMockupReferenceJSON()', () => { - const mockup = new OSLevelDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getOSLevelDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(1); - expect(json.OSLevel).to.not.be.undefined; - }); - }); - -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevelDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevelDA.mockup.ts deleted file mode 100644 index e8a05a11..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevelDA.mockup.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; - -export function getOSLevelDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - - return ({ - OSLevel: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.OSLevel`, - dataType: 'Byte' - } - }); -} - -export class OSLevelDAMockup { - protected osLevel = 0; - protected mockupNode: UAObject; - - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - - /*this.mockupNode = namespace.addObject({ - organizedBy: rootNode, - browseName: variableName, - });*/ - this.mockupNode = rootNode; - - namespace.addVariable({ - componentOf: rootNode, - nodeId: `ns=${namespace.index};s=${variableName}.OSLevel`, - browseName: `${variableName}.OSLevel`, - dataType: DataType.Byte, - value: { - get: (): Variant => { - return new Variant({dataType: DataType.Byte, value: this.osLevel}); - }, - }, - }); - } - - public getOSLevelDAInstanceMockupJSON() { - return getOSLevelDAMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); - } -} diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/Reset.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/Reset.puml deleted file mode 100644 index ebfecb3c..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/Reset.puml +++ /dev/null @@ -1,12 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class Reset{ - - dAController: any - - initialize(): void -} - -Reset *- ResetDASpec -ResetDASpec ..> ResetDAMockup : <> -Reset *- ResetDAMockup -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/ResetDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/ResetDA.mockup.spec.ts deleted file mode 100644 index f1155ef0..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/ResetDA.mockup.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {ResetDAMockup} from './ResetDA.mockup'; -import {OSLevelDAMockup} from '../osLevelDA/OSLevelDA.mockup'; -import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('ResetDAMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create ResetDAMockup', async () => { - const mockup= new ResetDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - - }); - it('getResetDAMockupReferenceJSON()', () => { - const mockup = new ResetDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getResetDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(2); - expect(json.ResetOp).to.not.be.undefined; - expect(json.ResetAut).to.not.be.undefined; - }); - }); - describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: ResetDAMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(10000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new ResetDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set and get ResetOp', async () => { - await connection.writeOpcUaNode('Variable.ResetOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.ResetOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(true)); - }).timeout(2000); - - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettingDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettingDA.mockup.spec.ts deleted file mode 100644 index 099a2252..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettingDA.mockup.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataType, Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {ScaleSettingDAMockup} from './ScaleSettingDA.mockup'; -import {OperationMode, ServiceSourceMode} from '@p2olab/polaris-interface'; -import {OpModeDAMockup} from '../opModeDA/OpModeDA.mockup'; -import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {ServiceSourceModeDAMockup} from '../serviceSourceModeDA/ServiceSourceModeDA.mockup'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('ScaleSettingDAMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create ScaleSettingDAMockup, Double', async () => { - const mockup= new ScaleSettingDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Double); - expect(mockup).to.not.be.undefined; - }); - it('should create ScaleSettingDAMockup', async () => { - const mockup= new ScaleSettingDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Int32); - expect(mockup).to.not.be.undefined; - }); - it('getScaleSettingDAMockupReferenceJSON(), Double', () => { - const mockup = new ScaleSettingDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Double); - const json = mockup.getScaleSettingDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(2); - expect(json.VSclMax).to.not.be.undefined; - expect(json.VSclMin).to.not.be.undefined; - }); - it('getScaleSettingDAMockupReferenceJSON()', () => { - const mockup = new ScaleSettingDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Int32); - const json = mockup.getScaleSettingDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(2); - expect(json.VSclMax).to.not.be.undefined; - expect(json.VSclMin).to.not.be.undefined; - }); - - }); - - -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettings.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettings.puml deleted file mode 100644 index 51a4ffbe..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettings.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class ScaleSettings{ - - dAController: any - - initialize(): void - + scaleSettingsToJson(): ParameterInterface -} - -ScaleSettings *- ScaleSettingDASpec -ScaleSettingDASpec ..> ScaleSettingDAMockup : <> -ScaleSettings *- ScaleSettingDAMockup - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeController.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeController.puml deleted file mode 100644 index ce43855a..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeController.puml +++ /dev/null @@ -1,9 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class ServiceSourceModeController - -ServiceSourceModeController *- ServiceSourceModeDASpec -ServiceSourceModeDASpec ..> ServiceSourceModeDAMockup : <> -ServiceSourceModeController *- ServiceSourceModeDAMockup -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeController.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeController.spec.ts deleted file mode 100644 index 3a0f03da..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeController.spec.ts +++ /dev/null @@ -1,234 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../connection'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions, ServiceSourceMode} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/anaserveparam.json'; -import {DataAssemblyController} from '../../DataAssemblyController'; -import {ServiceSourceModeController} from './ServiceSourceModeController'; -import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {ServiceSourceModeDAMockup} from './ServiceSourceModeDA.mockup'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('ServiceSourceMode', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperatorElement/AnaServParam', - dataItems: baseDataAssemblyOptions - }; - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create ServiceSourceMode', () => { - const da = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection) as any; - const serviceSourceMode = new ServiceSourceModeController(da); - expect(serviceSourceMode).to.not.be.undefined; - expect(da.communication.SrcChannel).to.not.be.undefined; - expect(da.communication.SrcExtAut).to.not.be.undefined; - expect(da.communication.SrcIntAut).to.not.be.undefined; - expect(da.communication.SrcIntOp).to.not.be.undefined; - expect(da.communication.SrcExtOp).to.not.be.undefined; - expect(da.communication.SrcIntAct).to.not.be.undefined; - expect(da.communication.SrcExtAct).to.not.be.undefined; - }); - }); - - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - let mockup: ServiceSourceModeDAMockup; - - beforeEach(async function () { - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new ServiceSourceModeDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - new ServiceSourceModeController(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcExtAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcExtOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcExtAct.value).equal(false); - }).timeout(5000); - }); - - describe('dynamic functions, Extern on', async () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - let mockup: ServiceSourceModeDAMockup; - let ssMode: ServiceSourceModeController; - let da1: any; - - beforeEach(async function () { - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new ServiceSourceModeDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - ssMode = new ServiceSourceModeController(da1); - await connection.connect(); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('getServiceSourceMode, should be intern', () => { - expect(ssMode.getServiceSourceMode()).to.equal(ServiceSourceMode.Intern); - }); - it('isServiceSourceMode', () => { - expect(ssMode.isServiceSourceMode(ServiceSourceMode.Intern)).to.be.true; - expect(ssMode.isServiceSourceMode(ServiceSourceMode.Extern)).to.be.false; - }); - it('setToExternalServiceSourceMode(), nothing should happen', async () => { - await ssMode.setToExternalServiceSourceMode(); - expect(mockup.srcIntAct).to.be.false; - expect(mockup.srcExtAct).to.be.true; - }).timeout(4000); - }); - - describe('dynamic functions, Intern on', async () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - let mockup: ServiceSourceModeDAMockup; - let ssMode: ServiceSourceModeController; - let da1: any; - beforeEach(async function () { - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockupNode = (mockupServer.namespace as Namespace).addObject({ - organizedBy: mockupServer.rootComponent as UAObject, - browseName: 'Variable', - }); - mockup = new ServiceSourceModeDAMockup( - mockupServer.namespace as Namespace, - mockupNode, - 'Variable'); - mockup.srcMode= ServiceSourceMode.Intern; - await mockupServer.start(); - - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - da1 = new DataAssemblyController(dataAssemblyOptions, connection); - ssMode = new ServiceSourceModeController(da1); - await connection.connect(); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - }); - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('getServiceSourceMode', async () => { - expect(ssMode.getServiceSourceMode()).to.equal(ServiceSourceMode.Intern); - }); - - it('isServiceSourceMode', async () => { - expect(ssMode.isServiceSourceMode(ServiceSourceMode.Intern)).to.be.true; - expect(ssMode.isServiceSourceMode(ServiceSourceMode.Extern)).to.be.false; - }); - - it('writeServiceSourceMode, should set Extern', async () => { - await ssMode.writeServiceSourceMode(ServiceSourceMode.Extern); - expect(mockup.srcExtAct).to.be.true; - expect(mockup.srcIntAct).to.be.false; - await new Promise(f => setTimeout(f, 500)); // we have to wait for emit change - expect(da1.communication.SrcExtAct.value).to.be.true; - expect(da1.communication.SrcIntAct.value).to.be.false; - }).timeout(4000); - - it('waitForServiceSourceModeToPassSpecificTest, promise should resolve instantly', async () => { - da1.communication.SrcExtAct.value = true; - await ssMode.waitForServiceSourceModeToPassSpecificTest(ServiceSourceMode.Extern); - }); - - it('waitForServiceSourceModeToPassSpecificTest, promise should resolve after a while', async () => { - await da1.communication.SrcExtOp.write(true); - await ssMode.waitForServiceSourceModeToPassSpecificTest(ServiceSourceMode.Extern); - }).timeout(4000); - - it('waitForServiceSourceModeToPassSpecificTest, timeout', async () => { - expect(da1.communication.SrcExtAct.value).to.be.false; - expect(da1.communication.SrcIntAct.value).to.be.true; - return expect(ssMode.waitForServiceSourceModeToPassSpecificTest(ServiceSourceMode.Extern)).to.be - .rejectedWith('Timeout: ServiceSourceMode did not change'); - }).timeout(4000); - - it('setToExternalServiceSourceMode()', async () => { - await ssMode.setToExternalServiceSourceMode(); - expect(mockup.srcExtAct).to.be.true; - expect(mockup.srcIntAct).to.be.false; - expect(da1.communication.SrcExtAct.value).to.be.true; - expect(da1.communication.SrcIntAct.value).to.be.false; - }).timeout(4000); - }); - -}); - diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeDA.mockup.spec.ts deleted file mode 100644 index 7fcd5474..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeDA.mockup.spec.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {ServiceSourceModeDAMockup} from './ServiceSourceModeDA.mockup'; -import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {ServiceSourceMode} from '@p2olab/polaris-interface'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('ServiceSourceModeDAMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create ServiceSourceModeDAMockup', async () => { - const mockup= new ServiceSourceModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - }); - - it('getServiceSourceModeMockupReferenceJSON()', () => { - const mockup = new ServiceSourceModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getServiceSourceModeDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(7); - expect(json.SrcChannel).to.not.be.undefined; - expect(json.SrcExtAut).to.not.be.undefined; - expect(json.SrcIntAut).to.not.be.undefined; - expect(json.SrcExtOp).to.not.be.undefined; - expect(json.SrcIntOp).to.not.be.undefined; - expect(json.SrcExtAct).to.not.be.undefined; - expect(json.SrcIntAct).to.not.be.undefined; - }); - }); - describe('dynamic', () => { - // we need to check if the nodes was added successfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: ServiceSourceModeDAMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(10000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new ServiceSourceModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set and get SrcExtOp', async () => { - await connection.writeOpcUaNode('Variable.SrcExtOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcExtOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.false; - expect(mockup.srcExtAct).to.true; - expect(mockup.srcMode).to.equal(ServiceSourceMode.Extern); - }).timeout(3000); - - it('set and get SrcIntOp', async () => { - mockup.srcMode= ServiceSourceMode.Extern; - await connection.writeOpcUaNode('Variable.SrcIntOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcIntOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.true; - expect(mockup.srcExtAct).to.false; - expect(mockup.srcMode).to.equal(ServiceSourceMode.Intern); - }).timeout(3000); - - it('set and get SrcExtOp, write false, nothing should change', async () => { - await connection.writeOpcUaNode('Variable.SrcExtOp', namespaceUrl, false, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcExtOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.true; - expect(mockup.srcExtAct).to.false; - }).timeout(3000); - - it('set and get SrcIntOp, write false, nothing should change', async () => { - await connection.writeOpcUaNode('Variable.SrcIntOp', namespaceUrl, false, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcIntOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.true; - expect(mockup.srcExtAct).to.false; - }).timeout(3000); - - //TODO get the rest - - }); - describe('dynamic, srcChannel is true , nothing should happen', () => { - let mockupServer: MockupServer; - let mockup: ServiceSourceModeDAMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new ServiceSourceModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - mockup.srcChannel= true; - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set and get SrcExtOp, nothing should change', async () => { - await connection.writeOpcUaNode('Variable.SrcExtOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcExtOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.true; - expect(mockup.srcExtAct).to.false; - }).timeout(3000); - - it('set and get SrcIntOp, nothing should change', async () => { - await connection.writeOpcUaNode('Variable.SrcIntOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcIntOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.true; - expect(mockup.srcExtAct).to.false; - }).timeout(3000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeController.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeController.puml deleted file mode 100644 index 0b2077a5..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeController.puml +++ /dev/null @@ -1,9 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class SourceModeController - -SourceModeController *- SourceModeDASpec -SourceModeDASpec ..> SourceModeDAMockup : <> -SourceModeController *- SourceModeDAMockup -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeDA.mockup.spec.ts deleted file mode 100644 index 47e2408f..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeDA.mockup.spec.ts +++ /dev/null @@ -1,140 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataType, Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {SourceModeDAMockup} from './SourceModeDA.mockup'; -import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {ServiceSourceMode, SourceMode} from '@p2olab/polaris-interface'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - - -describe('SourceModeDAMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create SourceModeDAMockup', async () => { - const mockup= new SourceModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - }); - - it('getSourceModeMockupReferenceJSON()', () => { - const mockup = new SourceModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getSourceModeDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(7); - expect(json.SrcChannel).to.not.be.undefined; - expect(json.SrcManAut).to.not.be.undefined; - expect(json.SrcIntAut).to.not.be.undefined; - expect(json.SrcManOp).to.not.be.undefined; - expect(json.SrcIntOp).to.not.be.undefined; - expect(json.SrcManAct).to.not.be.undefined; - expect(json.SrcIntAct).to.not.be.undefined; - }); - }); - describe('dynamic', () => { - // we need to check if the nodes was added successfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: SourceModeDAMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(10000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new SourceModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set and get SrcManOp', async () => { - await connection.writeOpcUaNode('Variable.SrcManOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcManOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.false; - expect(mockup.srcManAct).to.true; - expect(mockup.srcMode).to.equal(SourceMode.Manual); - }).timeout(3000); - - it('set and get SrcIntOp', async () => { - await connection.writeOpcUaNode('Variable.SrcIntOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcIntOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.true; - expect(mockup.srcManAct).to.false; - expect(mockup.srcMode).to.equal(SourceMode.Intern); - }).timeout(3000); - - it('set and get SrcManOp, write false', async () => { - await connection.writeOpcUaNode('Variable.SrcManOp', namespaceUrl, false, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcManOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.true; - expect(mockup.srcManAct).to.false; - expect(mockup.srcMode).to.equal(SourceMode.Intern); - }).timeout(3000); - - it('set and get SrcIntOp, write false', async () => { - await connection.writeOpcUaNode('Variable.SrcIntOp', namespaceUrl, false, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcIntOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.true; - expect(mockup.srcManAct).to.false; - expect(mockup.srcMode).to.equal(ServiceSourceMode.Intern); - }).timeout(3000); - - //TODO get the rest - - }); - describe('dynamic, srcChannel is true', () => { - // we need to check if the nodes was added successfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: SourceModeDAMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(10000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new SourceModeDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - mockup.srcChannel = true; - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set and get SrcManOp, nothing should change', async () => { - await connection.writeOpcUaNode('Variable.SrcManOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcManOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.true; - expect(mockup.srcManAct).to.false; - expect(mockup.srcMode).to.equal(SourceMode.Intern); - }).timeout(3000); - - it('set and get SrcIntOp, nothing should change', async () => { - await connection.writeOpcUaNode('Variable.SrcIntOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.SrcIntOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(false)); - expect(mockup.srcIntAct).to.true; - expect(mockup.srcManAct).to.false; - expect(mockup.srcMode).to.equal(ServiceSourceMode.Intern); - }).timeout(3000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/StatemachineSourceMode.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/StatemachineSourceMode.puml deleted file mode 100644 index 17d59a87..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/StatemachineSourceMode.puml +++ /dev/null @@ -1,16 +0,0 @@ -@startuml - -[*] --> Internal -[*] --> Manual - -Manual : SrcManAct = 1 -Manual : SrcIntAct = 0 - -Internal : SrcManAct = 0 -Internal : SrcIntAct = 1 - -Manual -> Internal : SrcIntAut(if SrcChannel) \n SrcIntAut(if not SrcChannel) -Internal -> Manual : SrcManAut(if SrcChannel) \n SrcManOp(if not SrcChannel) - - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitDA.mockup.spec.ts deleted file mode 100644 index cf299426..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitDA.mockup.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataType, Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {UnitDAMockup} from './UnitDA.mockup'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('UnitDAMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - afterEach(async () => { - - }); - it('should create UnitDAMockup', async () => { - const mockup= new UnitDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - }); - - it('getUnitMockupReferenceJSON()', () => { - const mockup = new UnitDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getUnitDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(1); - expect(json.VUnit).to.not.be.undefined; - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitSettings.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitSettings.puml deleted file mode 100644 index b3d55120..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitSettings.puml +++ /dev/null @@ -1,13 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class UnitSettings{ - - dAController: any - - initialize(): void - + Unit(): string -} - -UnitSettings *- UnitDASpec -UnitDASpec ..> UnitDAMockup : <> -UnitSettings *- UnitDAMockup -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitation.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitation.puml deleted file mode 100644 index 8f1cc377..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitation.puml +++ /dev/null @@ -1,10 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -abstract class ValueLimitation - -ValueLimitation *- ValueLimitationDASpec -ValueLimitationDASpec ..> ValueLimitationDAMockup : <> -ValueLimitation *- ValueLimitationDAMockup - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValuelimitationDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValuelimitationDA.mockup.spec.ts deleted file mode 100644 index 83072f45..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValuelimitationDA.mockup.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataType, Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {ValueLimitationDAMockup} from './ValueLimitationDA.mockup'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('ValueLimitationDAMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create ValueLimitationDAMockup', async () => { - const mockup= new ValueLimitationDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Double); - expect(mockup).to.not.be.undefined; - }); - - it('getValueLimitationMockupReferenceJSON(), Double', () => { - const mockup = new ValueLimitationDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Double); - const json = mockup.getValueLimitationDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(2); - expect(json.VMin).to.not.be.undefined; - expect(json.VMax).to.not.be.undefined; - }); - it('getValueLimitationMockupReferenceJSON(), Int32', () => { - const mockup = new ValueLimitationDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable', DataType.Int32); - const json = mockup.getValueLimitationDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(2); - expect(json.VMin).to.not.be.undefined; - expect(json.VMax).to.not.be.undefined; - }); - //TODO get/read values - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQC.puml b/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQC.puml deleted file mode 100644 index 82cce24e..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQC.puml +++ /dev/null @@ -1,9 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class WQC - -WQC *- WQCDASpec -WQCDASpec ..> WQCDAMockup : <> -WQC *- WQCDAMockup -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQCDA.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQCDA.mockup.spec.ts deleted file mode 100644 index ba1e113c..00000000 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQCDA.mockup.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {WQCDAMockup} from './WQCDA.mockup'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('WQCDAMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - afterEach(async () => { - - }); - it('should create WQCDAMockup', async () => { - const mockup= new WQCDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - - expect(mockup).to.not.be.undefined; - - }); - it('getAnaServParamMockupReferenceJSON()', () => { - const mockup = new WQCDAMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getWQCDAInstanceMockupJSON(); - expect(Object.keys(json).length).to.equal(1); - expect(json.WQC).to.not.be.undefined; - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.mockup.spec.ts index bcce8f73..e88c16d9 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.mockup.spec.ts @@ -1,32 +1,72 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; import {MockupServer} from '../../../_utils'; -import {ActiveElementMockup} from './ActiveElement.mockup'; +import {ActiveElementMockup, getActiveElementDataItemOptions, getActiveElementOptions} from './ActiveElement.mockup'; +import {ActiveElementRuntime} from './ActiveElement'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; chai.use(chaiAsPromised); const expect = chai.expect; describe('ActiveElementMockup', () => { - describe('', () => { - let mockupServer: any; + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create ActiveElementMockup', async () => { - const mockup= new ActiveElementMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new ActiveElementMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; }); - it('getActiveElementMockupReferenceJSON()', () => { - const mockup = new ActiveElementMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getActiveElementMockupJSON(); - expect(Object.keys(json).length).to .equal(2); + + it('static DataItemOptions', () => { + const options = getActiveElementDataItemOptions(1, 'Test') as ActiveElementRuntime; + expect(Object.keys(options).length).to.equal(2); + }); + + it('static DataAssemblyOptions', () => { + const options = getActiveElementOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(4); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new ActiveElementMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(4); }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.mockup.ts index 40d0f697..a0cd5a34 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.mockup.ts @@ -24,36 +24,51 @@ */ import {Namespace, UAObject} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../_extensions/osLevelDA/OSLevelDA.mockup'; -import {DataAssemblyControllerMockup} from '../DataAssemblyController.mockup'; +import {getWQCDataItemOptions, WQCMockup} from '../baseFunction/wqc/WQC.mockup'; +import {getOSLevelDataItemOptions, OSLevelMockup} from '../baseFunction/osLevel/OSLevel.mockup'; +import {DataAssemblyControllerMockup, getDataAssemblyOptions} from '../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getActiveElementMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement'; + +export function getActiveElementDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getWQCDAMockupReferenceJSON(namespace,objectBrowseName), - ...getOSLevelDAMockupReferenceJSON(namespace,objectBrowseName) - } - ); + ...getWQCDataItemOptions(namespace, objectBrowseName), + ...getOSLevelDataItemOptions(namespace, objectBrowseName), + }); +} + +export function getActiveElementOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getActiveElementDataItemOptions(namespace, objectBrowseName)}; + return options; } export class ActiveElementMockup extends DataAssemblyControllerMockup{ - public wqc: WQCDAMockup; - public osLevel: OSLevelDAMockup; + public wqc: WQCMockup; + public osLevel: OSLevelMockup; constructor(namespace: Namespace, rootNode: UAObject, variableName: string){ super(namespace, rootNode, variableName); - this.osLevel = new OSLevelDAMockup(namespace, this.mockupNode, this.name); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); + + this.wqc = new WQCMockup(namespace, this.mockupNode, this.name); + this.osLevel = new OSLevelMockup(namespace, this.mockupNode, this.name); } - public getActiveElementMockupJSON() { - return getActiveElementMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.wqc.getDataItemOptions(), + ...this.osLevel.getDataItemOptions(), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.spec.ts index 01b33ce2..6ded4d45 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.spec.ts @@ -24,59 +24,47 @@ */ import {OpcUaConnection} from '../../connection'; -import { - ActiveElement -} from './ActiveElement'; - -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; +import {ActiveElement} from './ActiveElement'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../tests/monanadrv.json'; import {MockupServer} from '../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../tests/namespaceUrl'; -import {ActiveElementMockup} from './ActiveElement.mockup'; +import {ActiveElementMockup, getActiveElementOptions} from './ActiveElement.mockup'; +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; chai.use(chaiAsPromised); const expect = chai.expect; describe('ActiveElement', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; + describe('static', () => { + it('should create ActiveElement', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - const da1 = new ActiveElement(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.be.not.undefined; - expect(da1.wqc).to.be.not.undefined; - expect(da1.osLevel).to.not.be.undefined; + const emptyOPCUAConnection = new OpcUaConnection(); + emptyOPCUAConnection.initialize({endpoint : ''}); + dataAssemblyOptions = getActiveElementOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + const dataAssemblyController = new ActiveElement(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.wqc).to.be.not.undefined; + expect(dataAssemblyController.osLevel).to.not.be.undefined; }); }); describe('dynamic', () => { + let mockupServer: MockupServer; let connection: OpcUaConnection; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } + beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new ActiveElementMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - + const mockup = new ActiveElementMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + dataAssemblyOptions = mockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint : mockupServer.endpoint}); await connection.connect(); }); @@ -87,12 +75,14 @@ describe('ActiveElement', () => { }); it('should subscribe successfully', async () => { - const da1 = new ActiveElement(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - expect(da1.communication.OSLevel.value).equal(0); + + const dataAssemblyController = new ActiveElement(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect(dataAssemblyController.communication.OSLevel.value).equal(0); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.ts index 8f066e34..7703610f 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/ActiveElement.ts @@ -25,10 +25,8 @@ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; import {OpcUaConnection} from '../../connection'; -import {OSLevelRuntime, WQCRuntime} from '../_extensions'; +import {OSLevel, OSLevelRuntime, WQC, WQCRuntime} from '../baseFunction'; import {BaseDataAssemblyRuntime, DataAssemblyController} from '../DataAssemblyController'; -import {OSLevel} from '../_extensions/osLevelDA/OSLevel'; -import {WQC} from '../_extensions/wqcDA/WQC'; export type ActiveElementRuntime = BaseDataAssemblyRuntime & WQCRuntime & OSLevelRuntime; diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.mockup.spec.ts index 8dbd5129..7c3a4f7f 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.mockup.spec.ts @@ -1,52 +1,89 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {PIDCtrlMockup} from './PIDCtrl.mockup'; +import {getPIDCtrlDataItemOptions, getPIDCtrlOptions, PIDCtrlMockup} from './PIDCtrl.mockup'; import {MockupServer} from '../../../../_utils'; import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {PIDCtrlRuntime} from './PIDCtrl'; chai.use(chaiAsPromised); const expect = chai.expect; describe('PIDCtrlMockup', () => { - describe('', () => { - let mockupServer: any; + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create PIDCtrlMockup', async () => { - const mockup= new PIDCtrlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new PIDCtrlMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; }); - it('getPIDCtrlMockupReferenceJSON()', () => { - const mockup = new PIDCtrlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getPIDCtrlMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(43); - //TODO test more? + + it('static DataItemOptions', () => { + const options = getPIDCtrlDataItemOptions(1, 'Test') as PIDCtrlRuntime; + expect(Object.keys(options).length).to.equal(43); + }); + + it('static DataAssemblyOptions', () => { + const options = getPIDCtrlOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(45); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new PIDCtrlMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(45); }); }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: PIDCtrlMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new PIDCtrlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new PIDCtrlMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); afterEach(async () => { @@ -55,15 +92,15 @@ describe('PIDCtrlMockup', () => { }); it('set and get SPMan', async () => { - await connection.writeOpcUaNode('Variable.SPMan', namespaceUrl, 1.1, 'Double'); - await connection.readOpcUaNode('Variable.SPMan', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1.1)); + await connection.writeNode('Variable.SPMan', mockupServer.nameSpaceUri, 1.1, 'Double'); + await connection.readNode('Variable.SPMan', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1.1)); }).timeout(3000); it('set and get SPMan', async () => { - await connection.writeOpcUaNode('Variable.MVMan', namespaceUrl, 1.1, 'Double'); - await connection.readOpcUaNode('Variable.MVMan', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1.1)); + await connection.writeNode('Variable.MVMan', mockupServer.nameSpaceUri, 1.1, 'Double'); + await connection.readNode('Variable.MVMan', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1.1)); }).timeout(3000); //TODO get the rest diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.mockup.ts index f9b1c446..ba562c6d 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.mockup.ts @@ -24,152 +24,165 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../_extensions/opModeDA/OpModeDA.mockup'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getSourceModeDAMockupReferenceJSON, SourceModeDAMockup} from '../../_extensions/sourceModeDA/SourceModeDA.mockup'; -import {getActiveElementMockupReferenceJSON} from '../ActiveElement.mockup'; +import {getOpModeDataItemOptions, OpModeMockup} from '../../baseFunction/opMode/OpMode.mockup'; +import {getSourceModeDataItemOptions, SourceModeMockup} from '../../baseFunction/sourceMode/SourceMode.mockup'; +import {ActiveElementMockup, getActiveElementDataItemOptions} from '../ActiveElement.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {getDataAssemblyOptions} from '../../DataAssemblyController.mockup'; +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/PIDCtrl'; + +function getPIDCtrlSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + PV: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PV`, + dataType: 'Float' + } as OpcUaNodeOptions, + PVSclMin: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PVSclMin`, + dataType: 'Float' + } as OpcUaNodeOptions, + PVSclMax: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PVSclMax`, + dataType: 'Float' + } as OpcUaNodeOptions, + PVUnit: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PVUnit`, + dataType: 'Int16' + } as OpcUaNodeOptions, + SP: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SP`, + dataType: 'Float' + } as OpcUaNodeOptions, + SPSclMin: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SPSclMin`, + dataType: 'Float' + } as OpcUaNodeOptions, + SPSclMax: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SPSclMax`, + dataType: 'Float' + } as OpcUaNodeOptions, + SPUnit: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SPUnit`, + dataType: 'Int16' + } as OpcUaNodeOptions, + SPMan: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SPMan`, + dataType: 'Float' + } as OpcUaNodeOptions, + SPManMin: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SPManMin`, + dataType: 'Float' + } as OpcUaNodeOptions, + SPManMax: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SPManMax`, + dataType: 'Float' + } as OpcUaNodeOptions, + SPInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SPInt`, + dataType: 'Float' + } as OpcUaNodeOptions, + SPIntMin: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SPIntMin`, + dataType: 'Float' + } as OpcUaNodeOptions, + SPIntMax: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SPIntMax`, + dataType: 'Float' + } as OpcUaNodeOptions, + MV: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MV`, + dataType: 'Float' + } as OpcUaNodeOptions, + MVMan: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MVMan`, + dataType: 'Float' + } as OpcUaNodeOptions, + MVSclMin: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MVSclMin`, + dataType: 'Float' + } as OpcUaNodeOptions, + MVSclMax: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MVSclMax`, + dataType: 'Float' + } as OpcUaNodeOptions, + MVUnit: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MVUnit`, + dataType: 'Int16' + } as OpcUaNodeOptions, + MVMin: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MVMin`, + dataType: 'Float' + } as OpcUaNodeOptions, + MVMax: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MVMax`, + dataType: 'Float' + } as OpcUaNodeOptions, + P: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.P`, + dataType: 'Float' + } as OpcUaNodeOptions, + Ti: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Ti`, + dataType: 'Float' + } as OpcUaNodeOptions, + Td: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Td`, + dataType: 'Float' + } as OpcUaNodeOptions + }); +} -export function getPIDCtrlMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +export function getPIDCtrlDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getActiveElementMockupReferenceJSON(namespace,objectBrowseName), - ...getSourceModeDAMockupReferenceJSON(namespace,objectBrowseName), - ...getOpModeDAMockupReferenceJSON(namespace, objectBrowseName), - PV: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PV`, - dataType: 'Float' - }, - PVSclMin: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PVSclMin`, - dataType: 'Float' - }, - PVSclMax: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PVSclMax`, - dataType: 'Float' - }, - PVUnit: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PVUnit`, - dataType: 'Int16' - }, - SP: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SP`, - dataType: 'Float' - }, - SPSclMin: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SPSclMin`, - dataType: 'Float' - }, - SPSclMax: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SPSclMax`, - dataType: 'Float' - }, - SPUnit: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SPUnit`, - dataType: 'Int16' - }, - SPMan: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SPMan`, - dataType: 'Float' - }, - SPManMin: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SPManMin`, - dataType: 'Float' - }, - SPManMax: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SPManMax`, - dataType: 'Float' - }, - SPInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SPInt`, - dataType: 'Float' - }, - SPIntMin: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SPIntMin`, - dataType: 'Float' - }, - SPIntMax: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SPIntMax`, - dataType: 'Float' - }, - MV: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MV`, - dataType: 'Float' - }, - MVMan: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MVMan`, - dataType: 'Float' - }, - MVSclMin: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MVSclMin`, - dataType: 'Float' - }, - MVSclMax: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MVSclMax`, - dataType: 'Float' - }, - MVUnit: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MVUnit`, - dataType: 'Int16' - }, - MVMin: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MVMin`, - dataType: 'Float' - }, - MVMax: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MVMax`, - dataType: 'Float' - }, - P: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.P`, - dataType: 'Float' - }, - Ti: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Ti`, - dataType: 'Float' - }, - Td: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Td`, - dataType: 'Float' - } - } + ...getActiveElementDataItemOptions(namespace, objectBrowseName), + ...getSourceModeDataItemOptions(namespace, objectBrowseName), + ...getOpModeDataItemOptions(namespace, objectBrowseName), + ...getPIDCtrlSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } -export class PIDCtrlMockup { +export function getPIDCtrlOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getPIDCtrlDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class PIDCtrlMockup extends ActiveElementMockup { + + public opMode: OpModeMockup; + public sourceMode: SourceModeMockup; - public readonly name: string; - public wqc: WQCDAMockup; - public osLevel: OSLevelDAMockup; - public opMode: OpModeDAMockup; - public sourceMode: SourceModeDAMockup; public pv= 0; public pvSclMin= 0; public pvSclMax= 0; @@ -197,22 +210,12 @@ export class PIDCtrlMockup { public p= 0; public ti= 0; public td= 0; - - protected mockupNode: UAObject; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); - this.name = variableName; - - this.mockupNode = namespace.addObject({ - organizedBy: rootNode, - browseName: variableName - }); - - this.osLevel = new OSLevelDAMockup(namespace, this.mockupNode, this.name); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); - this.opMode = new OpModeDAMockup(namespace, this.mockupNode, this.name); - this.sourceMode = new SourceModeDAMockup(namespace, this.mockupNode, this.name); + this.opMode = new OpModeMockup(namespace, this.mockupNode, this.name); + this.sourceMode = new SourceModeMockup(namespace, this.mockupNode, this.name); namespace.addVariable({ componentOf: this.mockupNode, @@ -383,7 +386,7 @@ export class PIDCtrlMockup { get: (): Variant => { return new Variant({dataType: DataType.Double, value: this.mvMan}); }, - set: (variant: Variant) => { + set: (variant: Variant): StatusCodes => { this.mvMan = parseFloat(variant.value); return StatusCodes.Good; }, @@ -490,9 +493,15 @@ export class PIDCtrlMockup { }); } - public getPIDCtrlMockupJSON() { - return getPIDCtrlMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.opMode.getDataItemOptions(), + ...this.sourceMode.getDataItemOptions(), + ...getPIDCtrlDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.puml index 6c39d5d6..0c59eeb6 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.puml +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.puml @@ -1,10 +1,35 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram class PIDCtrl{ + readonly communication!: PIDCtrlRuntime + sourceMode: SourceModeController - + opMode: OpModeController + + opMode: OpMode } PIDCtrl *- PIDCtrlSpec @@ -12,7 +37,7 @@ PIDCtrlSpec ..> PIDCtrlMockup : <> PIDCtrl *- PIDCtrlMockup PIDCtrl *- PIDCtrlRuntime PIDCtrl *- SourceModeController -PIDCtrl *- OpModeController +PIDCtrl *- OpMode diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.spec.ts index 116f0962..75c98701 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.spec.ts @@ -29,87 +29,77 @@ import {PIDCtrl} from './PIDCtrl'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/pidctrl.json'; -import {Vlv} from '../vlv'; import {MockupServer} from '../../../../_utils'; -import {AnaProcessValueInMockup} from '../../inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {DataAssemblyControllerFactory} from '../../DataAssemblyControllerFactory'; -import {AnaProcessValueIn} from '../../inputElement'; -import {PIDCtrlMockup} from './PIDCtrl.mockup'; -import {AnaServParam, BinManInt} from '../../operationElement'; +import {getPIDCtrlOptions, PIDCtrlMockup} from './PIDCtrl.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('PIDCtrl', () => { - const parseJson = require('json-parse-better-errors'); - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/PIDCtrl', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + dataAssemblyOptions = getPIDCtrlOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create PIDCtrl', async () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - - const da1 = new PIDCtrl(dataAssemblyOptions, emptyOPCUAConnection); - - expect(da1.wqc).to.be.not.undefined; - expect(da1.osLevel).to.not.be.undefined; - expect(da1.sourceMode).to.be.not.undefined; - expect(da1.opMode).to.be.not.undefined; - - expect(da1.communication.PV).to.not.be.undefined; - expect(da1.communication.PVSclMax).to.not.be.undefined; - expect(da1.communication.PVSclMin).to.not.be.undefined; - expect(da1.communication.PVUnit).to.not.be.undefined; - - expect(da1.communication.SP).to.not.be.undefined; - expect(da1.communication.SPSclMax).to.not.be.undefined; - expect(da1.communication.SPSclMin).to.not.be.undefined; - expect(da1.communication.SPUnit).to.not.be.undefined; - - expect(da1.communication.SPMan).to.not.be.undefined; - expect(da1.communication.SPManMin).to.not.be.undefined; - expect(da1.communication.SPManMax).to.not.be.undefined; - - expect(da1.communication.SPInt).to.not.be.undefined; - expect(da1.communication.SPIntMin).to.not.be.undefined; - expect(da1.communication.SPIntMax).to.not.be.undefined; - - expect(da1.communication.MV).to.not.be.undefined; - expect(da1.communication.MVMan).to.not.be.undefined; - expect(da1.communication.MVMin).to.not.be.undefined; - expect(da1.communication.MVMax).to.not.be.undefined; - expect(da1.communication.MVSclMax).to.not.be.undefined; - expect(da1.communication.MVSclMin).to.not.be.undefined; - expect(da1.communication.MVUnit).to.not.be.undefined; - - expect(da1.communication.P).to.not.be.undefined; - expect(da1.communication.Ti).to.not.be.undefined; - expect(da1.communication.Td).to.not.be.undefined; - - expect(Object.keys(da1.communication).length).to.equal(43); + const emptyOPCUAConnection = new OpcUaConnection(); + + const dataAssemblyController = new PIDCtrl(dataAssemblyOptions, emptyOPCUAConnection); + + expect(dataAssemblyController.wqc).to.be.not.undefined; + expect(dataAssemblyController.osLevel).to.not.be.undefined; + expect(dataAssemblyController.sourceMode).to.be.not.undefined; + expect(dataAssemblyController.opMode).to.be.not.undefined; + + expect(dataAssemblyController.communication.PV).to.not.be.undefined; + expect(dataAssemblyController.communication.PVSclMax).to.not.be.undefined; + expect(dataAssemblyController.communication.PVSclMin).to.not.be.undefined; + expect(dataAssemblyController.communication.PVUnit).to.not.be.undefined; + + expect(dataAssemblyController.communication.SP).to.not.be.undefined; + expect(dataAssemblyController.communication.SPSclMax).to.not.be.undefined; + expect(dataAssemblyController.communication.SPSclMin).to.not.be.undefined; + expect(dataAssemblyController.communication.SPUnit).to.not.be.undefined; + + expect(dataAssemblyController.communication.SPMan).to.not.be.undefined; + expect(dataAssemblyController.communication.SPManMin).to.not.be.undefined; + expect(dataAssemblyController.communication.SPManMax).to.not.be.undefined; + + expect(dataAssemblyController.communication.SPInt).to.not.be.undefined; + expect(dataAssemblyController.communication.SPIntMin).to.not.be.undefined; + expect(dataAssemblyController.communication.SPIntMax).to.not.be.undefined; + + expect(dataAssemblyController.communication.MV).to.not.be.undefined; + expect(dataAssemblyController.communication.MVMan).to.not.be.undefined; + expect(dataAssemblyController.communication.MVMin).to.not.be.undefined; + expect(dataAssemblyController.communication.MVMax).to.not.be.undefined; + expect(dataAssemblyController.communication.MVSclMax).to.not.be.undefined; + expect(dataAssemblyController.communication.MVSclMin).to.not.be.undefined; + expect(dataAssemblyController.communication.MVUnit).to.not.be.undefined; + + expect(dataAssemblyController.communication.P).to.not.be.undefined; + expect(dataAssemblyController.communication.Ti).to.not.be.undefined; + expect(dataAssemblyController.communication.Td).to.not.be.undefined; + + expect(Object.keys(dataAssemblyController.communication).length).to.equal(45); }); }); + describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: PIDCtrlMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new PIDCtrlMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const pidCtrlMockup =new PIDCtrlMockup( mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + dataAssemblyOptions = pidCtrlMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -120,69 +110,63 @@ describe('PIDCtrl', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new PIDCtrl(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.OSLevel.value).equal(0); - expect(da1.communication.WQC.value).equal(0); - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcManAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcManOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcManAct.value).equal(false); - - expect(da1.communication.StateChannel.value).equal(false); - expect(da1.communication.StateOffAut.value).equal(false); - expect(da1.communication.StateOpAut.value).equal(false); - expect(da1.communication.StateAutAut.value).equal(false); - expect(da1.communication.StateOffOp.value).equal(false); - expect(da1.communication.StateOpOp.value).equal(false); - expect(da1.communication.StateAutOp.value).equal(false); - expect(da1.communication.StateOpAct.value).equal(false); - expect(da1.communication.StateAutAct.value).equal(false); - expect(da1.communication.StateOffAct.value).equal(true); - - expect(da1.communication.PV.value).equal(0); - expect(da1.communication.PVSclMax.value).equal(0); - expect(da1.communication.PVSclMin.value).equal(0); - expect(da1.communication.PVUnit.value).equal(0); - - expect(da1.communication.SP.value).equal(0); - expect(da1.communication.SPSclMax.value).equal(0); - expect(da1.communication.SPSclMin.value).equal(0); - expect(da1.communication.SPUnit.value).equal(0); - - expect(da1.communication.SPMan.value).equal(0); - expect(da1.communication.SPManMin.value).equal(0); - expect(da1.communication.SPManMax.value).equal(0); - - expect(da1.communication.SPInt.value).equal(0); - expect(da1.communication.SPIntMin.value).equal(0); - expect(da1.communication.SPIntMax.value).equal(0); - - expect(da1.communication.MV.value).equal(0); - expect(da1.communication.MVMan.value).equal(0); - expect(da1.communication.MVMin.value).equal(0); - expect(da1.communication.MVMax.value).equal(0); - expect(da1.communication.MVSclMax.value).equal(0); - expect(da1.communication.MVSclMin.value).equal(0); - expect(da1.communication.MVUnit.value).equal(0); - - expect(da1.communication.P.value).equal(0); - expect(da1.communication.Ti.value).equal(0); - expect(da1.communication.Td.value).equal(0); + + const dataAssemblyController = new PIDCtrl(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.OSLevel.value).equal(0); + expect(dataAssemblyController.communication.WQC.value).equal(0); + + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcManAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcManOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcManAct.value).equal(false); + + expect(dataAssemblyController.communication.StateChannel.value).equal(false); + expect(dataAssemblyController.communication.StateOffAut.value).equal(false); + expect(dataAssemblyController.communication.StateOpAut.value).equal(false); + expect(dataAssemblyController.communication.StateAutAut.value).equal(false); + expect(dataAssemblyController.communication.StateOffOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpOp.value).equal(false); + expect(dataAssemblyController.communication.StateAutOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpAct.value).equal(false); + expect(dataAssemblyController.communication.StateAutAct.value).equal(false); + expect(dataAssemblyController.communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.PV.value).equal(0); + expect(dataAssemblyController.communication.PVSclMax.value).equal(0); + expect(dataAssemblyController.communication.PVSclMin.value).equal(0); + expect(dataAssemblyController.communication.PVUnit.value).equal(0); + + expect(dataAssemblyController.communication.SP.value).equal(0); + expect(dataAssemblyController.communication.SPSclMax.value).equal(0); + expect(dataAssemblyController.communication.SPSclMin.value).equal(0); + expect(dataAssemblyController.communication.SPUnit.value).equal(0); + + expect(dataAssemblyController.communication.SPMan.value).equal(0); + expect(dataAssemblyController.communication.SPManMin.value).equal(0); + expect(dataAssemblyController.communication.SPManMax.value).equal(0); + + expect(dataAssemblyController.communication.SPInt.value).equal(0); + expect(dataAssemblyController.communication.SPIntMin.value).equal(0); + expect(dataAssemblyController.communication.SPIntMax.value).equal(0); + + expect(dataAssemblyController.communication.MV.value).equal(0); + expect(dataAssemblyController.communication.MVMan.value).equal(0); + expect(dataAssemblyController.communication.MVMin.value).equal(0); + expect(dataAssemblyController.communication.MVMax.value).equal(0); + expect(dataAssemblyController.communication.MVSclMax.value).equal(0); + expect(dataAssemblyController.communication.MVSclMin.value).equal(0); + expect(dataAssemblyController.communication.MVUnit.value).equal(0); + + expect(dataAssemblyController.communication.P.value).equal(0); + expect(dataAssemblyController.communication.Ti.value).equal(0); + expect(dataAssemblyController.communication.Td.value).equal(0); }).timeout(5000); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.ts index e10df1a6..0f7aa0de 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/PIDCtrl/PIDCtrl.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,83 +24,85 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; -import {OpModeRuntime, SourceModeRuntime} from '../../_extensions'; +import {OpcUaConnection, DataItem} from '../../../connection'; +import { + OpMode, OpModeRuntime, + SourceModeController, SourceModeRuntime +} from '../../baseFunction'; import {ActiveElement, ActiveElementRuntime} from '../ActiveElement'; -import {SourceModeController} from '../../_extensions/sourceModeDA/SourceModeController'; -import {OpModeController} from '../../_extensions/opModeDA/OpModeController'; export type PIDCtrlRuntime = ActiveElementRuntime & OpModeRuntime & SourceModeRuntime & { - PV: OpcUaDataItem; - PVSclMin: OpcUaDataItem; - PVSclMax: OpcUaDataItem; - PVUnit: OpcUaDataItem; + PV: DataItem; + PVSclMin: DataItem; + PVSclMax: DataItem; + PVUnit: DataItem; - SPMan: OpcUaDataItem; - SPInt: OpcUaDataItem; - SPSclMin: OpcUaDataItem; - SPSclMax: OpcUaDataItem; - SPUnit: OpcUaDataItem; - SPIntMin: OpcUaDataItem; - SPIntMax: OpcUaDataItem; - SPManMin: OpcUaDataItem; - SPManMax: OpcUaDataItem; - SP: OpcUaDataItem; + SPMan: DataItem; + SPInt: DataItem; + SPSclMin: DataItem; + SPSclMax: DataItem; + SPUnit: DataItem; + SPIntMin: DataItem; + SPIntMax: DataItem; + SPManMin: DataItem; + SPManMax: DataItem; + SP: DataItem; - MVMan: OpcUaDataItem; - MV: OpcUaDataItem; - MVSclMin: OpcUaDataItem; - MVSclMax: OpcUaDataItem; - MVUnit: OpcUaDataItem; - MVMin: OpcUaDataItem; - MVMax: OpcUaDataItem; + MVMan: DataItem; + MV: DataItem; + MVSclMin: DataItem; + MVSclMax: DataItem; + MVUnit: DataItem; + MVMin: DataItem; + MVMax: DataItem; - P: OpcUaDataItem; - Ti: OpcUaDataItem; - Td: OpcUaDataItem; + P: DataItem; + Ti: DataItem; + Td: DataItem; }; export class PIDCtrl extends ActiveElement { public readonly communication!: PIDCtrlRuntime; sourceMode: SourceModeController; - opMode: OpModeController; + opMode: OpMode; constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); this.sourceMode = new SourceModeController(this); - this.opMode = new OpModeController(this); + this.opMode = new OpMode(this); - this.communication.PV = this.createDataItem('PV', 'read', 'number'); - this.communication.PVSclMin = this.createDataItem('PVSclMin', 'read', 'number'); - this.communication.PVSclMax = this.createDataItem('PVSclMax', 'read', 'number'); - this.communication.PVUnit = this.createDataItem('PVUnit', 'read', 'number'); + this.communication.PV = this.createDataItem('PV', 'number'); + this.communication.PVSclMin = this.createDataItem('PVSclMin', 'number'); + this.communication.PVSclMax = this.createDataItem('PVSclMax', 'number'); + this.communication.PVUnit = this.createDataItem('PVUnit', 'number'); - this.communication.SPMan = this.createDataItem('SPMan', 'write', 'number'); - this.communication.SPInt = this.createDataItem('SPInt', 'read', 'number'); - this.communication.SPSclMin = this.createDataItem('SPSclMin', 'read', 'number'); - this.communication.SPSclMax = this.createDataItem('SPSclMax', 'read', 'number'); - this.communication.SPUnit = this.createDataItem('SPUnit', 'read', 'number'); - this.communication.SPIntMin = this.createDataItem('SPIntMin', 'read', 'number'); - this.communication.SPIntMax = this.createDataItem('SPIntMax', 'read', 'number'); - this.communication.SPManMin = this.createDataItem('SPManMin', 'read', 'number'); - this.communication.SPManMax = this.createDataItem('SPManMax', 'read', 'number'); - this.communication.SP = this.createDataItem('SP', 'read', 'number'); + this.communication.SPMan = this.createDataItem('SPMan', 'number', 'write'); + this.communication.SPInt = this.createDataItem('SPInt', 'number'); + this.communication.SPSclMin = this.createDataItem('SPSclMin', 'number'); + this.communication.SPSclMax = this.createDataItem('SPSclMax', 'number'); + this.communication.SPUnit = this.createDataItem('SPUnit', 'number'); + this.communication.SPIntMin = this.createDataItem('SPIntMin', 'number'); + this.communication.SPIntMax = this.createDataItem('SPIntMax', 'number'); + this.communication.SPManMin = this.createDataItem('SPManMin', 'number'); + this.communication.SPManMax = this.createDataItem('SPManMax', 'number'); + this.communication.SP = this.createDataItem('SP', 'number'); - this.communication.MVMan = this.createDataItem('MVMan', 'write', 'number'); - this.communication.MV = this.createDataItem('MV', 'read', 'number'); - this.communication.MVSclMin = this.createDataItem('MVSclMin', 'read', 'number'); - this.communication.MVSclMax = this.createDataItem('MVSclMax', 'read', 'number'); - this.communication.MVUnit = this.createDataItem('MVUnit', 'read', 'number'); - this.communication.MVMin = this.createDataItem('MVMin', 'read', 'number'); - this.communication.MVMax = this.createDataItem('MVMax', 'read', 'number'); + this.communication.MVMan = this.createDataItem('MVMan', 'number', 'write'); + this.communication.MV = this.createDataItem('MV', 'number'); + this.communication.MVSclMin = this.createDataItem('MVSclMin', 'number'); + this.communication.MVSclMax = this.createDataItem('MVSclMax', 'number'); + this.communication.MVUnit = this.createDataItem('MVUnit', 'number'); + this.communication.MVMin = this.createDataItem('MVMin', 'number'); + this.communication.MVMax = this.createDataItem('MVMax', 'number'); - this.communication.P = this.createDataItem('P', 'read', 'number'); - this.communication.Ti = this.createDataItem('Ti', 'read', 'number'); - this.communication.Td = this.createDataItem('Td', 'read', 'number'); + this.communication.P = this.createDataItem('P', 'number'); + this.communication.Ti = this.createDataItem('Ti', 'number'); + this.communication.Td = this.createDataItem('Td', 'number'); this.defaultReadDataItem = this.communication.PV; this.defaultReadDataItemType = 'number'; + this.defaultWriteDataItem = this.communication.SPMan; this.defaultWriteDataItemType = 'number'; } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/activeElement.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/activeElement.puml index c7ec912f..2294378e 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/activeElement.puml +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/activeElement.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include PIDCtrl/PIDCtrl.puml diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.mockup.spec.ts index 16adb9fa..8a2d6c17 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.mockup.spec.ts @@ -1,53 +1,90 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {DrvMockup} from './Drv.mockup'; +import {DrvMockup, getDrvDataItemOptions, getDrvOptions} from './Drv.mockup'; import {MockupServer} from '../../../../_utils'; import {BinDrvMockup} from './binDrv/BinDrv.mockup'; import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {DrvRuntime} from './Drv'; chai.use(chaiAsPromised); const expect = chai.expect; describe('DrvMockup', () => { - describe('', () => { - let mockupServer: any; + describe('static', () => { + + let mockupServer: MockupServer; beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create DrvMockup', async () => { - const mockup= new DrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new DrvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; }); - it('getDrvMockupReferenceJSON()', () => { - const mockup = new DrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getDrvMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(37); - //TODO test more + + it('static DataItemOptions', () => { + const options = getDrvDataItemOptions(1, 'Test') as DrvRuntime; + expect(Object.keys(options).length).to.equal(37); + }); + + it('static DataAssemblyOptions', () => { + const options = getDrvOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(39); }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new DrvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(39); + }); + }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: BinDrvMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new BinDrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new BinDrvMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); afterEach(async () => { @@ -56,22 +93,22 @@ describe('DrvMockup', () => { }); it('set and get StopOp', async () => { - await connection.writeOpcUaNode('Variable.StopOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.StopOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(true)); + await connection.writeNode('Variable.StopOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.StopOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(true)); }).timeout(3000); it('set and get FwdOp', async () => { - await connection.writeOpcUaNode('Variable.FwdOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.FwdOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(true)); + await connection.writeNode('Variable.FwdOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.FwdOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(true)); }).timeout(3000); it('set and get RevOp', async () => { - await connection.writeOpcUaNode('Variable.RevOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.RevOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(true)); + await connection.writeNode('Variable.RevOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.RevOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(true)); }).timeout(3000); //TODO get the rest diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.mockup.ts index 4148e79b..5345193d 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.mockup.ts @@ -24,126 +24,137 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../_extensions/opModeDA/OpModeDA.mockup'; -import {getInterlockDAMockupReferenceJSON, InterlockDAMockup} from '../../_extensions/interlockDA/InterlockDA.mockup'; -import {getResetDAMockupReferenceJSON, ResetDAMockup} from '../../_extensions/resetDA/ResetDA.mockup'; -import {getActiveElementMockupReferenceJSON} from '../ActiveElement.mockup'; +import {getOpModeDataItemOptions, OpModeMockup} from '../../baseFunction/opMode/OpMode.mockup'; +import {getInterlockDataItemOptions, InterlockMockup} from '../../baseFunction/interlock/Interlock.mockup'; +import {getResetDataItemOptions, ResetMockup} from '../../baseFunction/reset/Reset.mockup'; +import {ActiveElementMockup, getActiveElementDataItemOptions} from '../ActiveElement.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../DataAssemblyController.mockup'; +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement'; -export function getDrvMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getDrvSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + SafePos: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SafePos`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + SafePosAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SafePosAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + FwdAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.FwdAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + FwdCtrl: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.FwdCtrl`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + FwdEn: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.FwdEn`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + FwdFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.FwdFbk`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + FwdFbkCalc: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.FwdFbkCalc`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + FwdOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.FwdOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + RevAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RevAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + RevCtrl: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RevCtrl`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + RevEn: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RevEn`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + RevFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RevFbk`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + RevFbkCalc: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RevFbkCalc`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + RevOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RevOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StopAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StopAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StopOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StopOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + Trip: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Trip`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} + +export function getDrvDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - - ...getActiveElementMockupReferenceJSON(namespace,objectBrowseName), - ...getOpModeDAMockupReferenceJSON(namespace,objectBrowseName), - ...getInterlockDAMockupReferenceJSON(namespace,objectBrowseName), - ...getResetDAMockupReferenceJSON(namespace,objectBrowseName), - SafePos: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SafePos`, - dataType: 'Boolean' - }, - SafePosAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SafePosAct`, - dataType: 'Boolean' - }, - FwdAut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.FwdAut`, - dataType: 'Boolean' - }, - FwdCtrl: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.FwdCtrl`, - dataType: 'Boolean' - }, - FwdEn: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.FwdEn`, - dataType: 'Boolean' - }, - FwdFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.FwdFbk`, - dataType: 'Boolean' - }, - FwdFbkCalc: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.FwdFbkCalc`, - dataType: 'Boolean' - }, - FwdOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.FwdOp`, - dataType: 'Boolean' - }, - RevAut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RevAut`, - dataType: 'Boolean' - }, - RevCtrl: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RevCtrl`, - dataType: 'Boolean' - }, - RevEn: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RevEn`, - dataType: 'Boolean' - }, - RevFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RevFbk`, - dataType: 'Boolean' - }, - RevFbkCalc: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RevFbkCalc`, - dataType: 'Boolean' - }, - RevOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RevOp`, - dataType: 'Boolean' - }, - StopAut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StopAut`, - dataType: 'Boolean' - }, - StopOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StopOp`, - dataType: 'Boolean' - }, - Trip: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Trip`, - dataType: 'Boolean' - } - } + ...getActiveElementDataItemOptions(namespace, objectBrowseName), + ...getOpModeDataItemOptions(namespace, objectBrowseName), + ...getInterlockDataItemOptions(namespace, objectBrowseName), + ...getResetDataItemOptions(namespace, objectBrowseName), + ...getDrvSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } -export class DrvMockup { - public readonly name: string; - public wqc: WQCDAMockup; - public osLevel: OSLevelDAMockup; - public operationMode: OpModeDAMockup; - public interlock: InterlockDAMockup; - public reset: ResetDAMockup; +export function getDrvOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getDrvDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class DrvMockup extends ActiveElementMockup{ + + public operationMode: OpModeMockup; + public interlock: InterlockMockup; + public reset: ResetMockup; public safePos = false; public safePosAct = false; - public fwdEn= false; public revEn= false; public stopOp= false; @@ -160,22 +171,12 @@ export class DrvMockup { public fwdFbk= false; public trip= false; - protected mockupNode: UAObject; - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); - this.name = variableName; - - this.mockupNode = namespace.addObject({ - organizedBy: rootNode, - browseName: variableName - }); - - this.osLevel = new OSLevelDAMockup(namespace, this.mockupNode, this.name); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); - this.operationMode = new OpModeDAMockup(namespace,this.mockupNode,this.name); - this.interlock= new InterlockDAMockup(namespace,this.mockupNode,this.name); - this.reset= new ResetDAMockup(namespace,this.mockupNode,this.name); + this.operationMode = new OpModeMockup(namespace,this.mockupNode,this.name); + this.interlock= new InterlockMockup(namespace,this.mockupNode,this.name); + this.reset= new ResetMockup(namespace,this.mockupNode,this.name); namespace.addVariable({ componentOf: this.mockupNode, @@ -382,9 +383,16 @@ export class DrvMockup { } - public getDrvMockupJSON() { - return getDrvMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.operationMode.getDataItemOptions(), + ...this.reset.getDataItemOptions(), + ...this.interlock.getDataItemOptions(), + ...getDrvSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.puml index 26341518..3750f0d6 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.puml +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include anaDrv/AnaDrv.puml @@ -7,7 +32,7 @@ class Drv{ + readonly communication!: DrvRuntime + readonly reset: Reset + readonly interlock: Interlock - + readonly opMode: OpModeController + + readonly opMode: OpMode } Drv *- DrvSpec diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.spec.ts index 2eb60e88..96da4510 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.spec.ts @@ -31,82 +31,71 @@ import { import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/monanadrv.json'; import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {DrvMockup} from './Drv.mockup'; +import {DrvMockup, getDrvOptions} from './Drv.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; -const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/BinDrv', - dataItems: baseDataAssemblyOptions -}; describe('Drv', () => { - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create Drv/BinDrv', () => { - const da1 = new Drv(dataAssemblyOptions, emptyOPCUAConnection); - - expect(da1.reset).to.be.not.undefined; - expect(da1.interlock).to.be.not.undefined; - expect(da1.opMode).to.be.not.undefined; - - expect(da1.communication.SafePos).to.be.not.undefined; - expect(da1.communication.SafePosAct).to.be.not.undefined; - - expect(da1.communication.FwdAut).to.be.not.undefined; - expect(da1.communication.FwdCtrl).to.be.not.undefined; - expect(da1.communication.FwdEn).to.be.not.undefined; - expect(da1.communication.FwdFbk).to.be.not.undefined; - expect(da1.communication.FwdFbkCalc).to.be.not.undefined; - expect(da1.communication.FwdOp).to.be.not.undefined; - - expect(da1.communication.RevAut).to.be.not.undefined; - expect(da1.communication.RevCtrl).to.be.not.undefined; - expect(da1.communication.RevEn).to.be.not.undefined; - expect(da1.communication.RevFbk).to.be.not.undefined; - expect(da1.communication.RevFbkCalc).to.be.not.undefined; - expect(da1.communication.RevOp).to.be.not.undefined; - - expect(da1.communication.StopAut).to.be.not.undefined; - expect(da1.communication.StopOp).to.be.not.undefined; - expect(da1.communication.Trip).to.be.not.undefined; - - expect(Object.keys(da1.communication).length).to.equal(37); + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getDrvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create Drv', () => { + const dataAssemblyController = new Drv(dataAssemblyOptions, emptyOPCUAConnection); + + expect(dataAssemblyController.reset).to.be.not.undefined; + expect(dataAssemblyController.interlock).to.be.not.undefined; + expect(dataAssemblyController.opMode).to.be.not.undefined; + + expect(dataAssemblyController.communication.SafePos).to.be.not.undefined; + expect(dataAssemblyController.communication.SafePosAct).to.be.not.undefined; + + expect(dataAssemblyController.communication.FwdAut).to.be.not.undefined; + expect(dataAssemblyController.communication.FwdCtrl).to.be.not.undefined; + expect(dataAssemblyController.communication.FwdEn).to.be.not.undefined; + expect(dataAssemblyController.communication.FwdFbk).to.be.not.undefined; + expect(dataAssemblyController.communication.FwdFbkCalc).to.be.not.undefined; + expect(dataAssemblyController.communication.FwdOp).to.be.not.undefined; + + expect(dataAssemblyController.communication.RevAut).to.be.not.undefined; + expect(dataAssemblyController.communication.RevCtrl).to.be.not.undefined; + expect(dataAssemblyController.communication.RevEn).to.be.not.undefined; + expect(dataAssemblyController.communication.RevFbk).to.be.not.undefined; + expect(dataAssemblyController.communication.RevFbkCalc).to.be.not.undefined; + expect(dataAssemblyController.communication.RevOp).to.be.not.undefined; + + expect(dataAssemblyController.communication.StopAut).to.be.not.undefined; + expect(dataAssemblyController.communication.StopOp).to.be.not.undefined; + expect(dataAssemblyController.communication.Trip).to.be.not.undefined; + + expect(Object.keys(dataAssemblyController.communication).length).to.equal(39); }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: DrvMockup; - let da1: Drv; + let dataAssemblyController: Drv; beforeEach(async function () { this.timeout(10000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new DrvMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const drvMockup = new DrvMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + dataAssemblyOptions = drvMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - da1 = new Drv(dataAssemblyOptions, connection) ; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; + dataAssemblyController = new Drv(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); }); afterEach(async function () { @@ -116,50 +105,50 @@ describe('Drv', () => { }); it('should subscribe successfully', async () => { - expect((da1).communication.OSLevel.value).equal(0); - expect((da1).communication.WQC.value).equal(0); - - expect((da1).communication.StateChannel.value).equal(false); - expect((da1).communication.StateOffAut.value).equal(false); - expect((da1).communication.StateOpAut.value).equal(false); - expect((da1).communication.StateAutAut.value).equal(false); - expect((da1).communication.StateOffOp.value).equal(false); - expect((da1).communication.StateOpOp.value).equal(false); - expect((da1).communication.StateAutOp.value).equal(false); - expect((da1).communication.StateOpAct.value).equal(false); - expect((da1).communication.StateAutAct.value).equal(false); - expect((da1).communication.StateOffAct.value).equal(true); - - expect(da1.communication.ResetOp.value).equal(false); - expect(da1.communication.ResetAut.value).equal(false); - - expect(da1.communication.PermEn.value).equal(false); - expect(da1.communication.Permit.value).equal(false); - expect(da1.communication.IntlEn.value).equal(false); - expect(da1.communication.Interlock.value).equal(false); - expect(da1.communication.ProtEn.value).equal(false); - expect(da1.communication.Protect.value).equal(false); + expect((dataAssemblyController).communication.OSLevel.value).equal(0); + expect((dataAssemblyController).communication.WQC.value).equal(0); + + expect((dataAssemblyController).communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.ResetOp.value).equal(false); + expect(dataAssemblyController.communication.ResetAut.value).equal(false); + + expect(dataAssemblyController.communication.PermEn.value).equal(false); + expect(dataAssemblyController.communication.Permit.value).equal(false); + expect(dataAssemblyController.communication.IntlEn.value).equal(false); + expect(dataAssemblyController.communication.Interlock.value).equal(false); + expect(dataAssemblyController.communication.ProtEn.value).equal(false); + expect(dataAssemblyController.communication.Protect.value).equal(false); - expect(da1.communication.SafePos.value).equal(false); - expect(da1.communication.SafePosAct.value).equal(false); - - expect(da1.communication.FwdAut.value).equal(false); - expect(da1.communication.FwdCtrl.value).equal(false); - expect(da1.communication.FwdEn.value).equal(false); - expect(da1.communication.FwdFbk.value).equal(false); - expect(da1.communication.FwdFbkCalc.value).equal(false); - expect(da1.communication.FwdOp.value).equal(false); - - expect(da1.communication.RevAut.value).equal(false); - expect(da1.communication.RevCtrl.value).equal(false); - expect(da1.communication.RevEn.value).equal(false); - expect(da1.communication.RevFbk.value).equal(false); - expect(da1.communication.RevFbkCalc.value).equal(false); - expect(da1.communication.RevOp.value).equal(false); - - expect(da1.communication.StopAut.value).equal(false); - expect(da1.communication.StopOp.value).equal(false); - expect(da1.communication.Trip.value).equal(false); + expect(dataAssemblyController.communication.SafePos.value).equal(false); + expect(dataAssemblyController.communication.SafePosAct.value).equal(false); + + expect(dataAssemblyController.communication.FwdAut.value).equal(false); + expect(dataAssemblyController.communication.FwdCtrl.value).equal(false); + expect(dataAssemblyController.communication.FwdEn.value).equal(false); + expect(dataAssemblyController.communication.FwdFbk.value).equal(false); + expect(dataAssemblyController.communication.FwdFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.FwdOp.value).equal(false); + + expect(dataAssemblyController.communication.RevAut.value).equal(false); + expect(dataAssemblyController.communication.RevCtrl.value).equal(false); + expect(dataAssemblyController.communication.RevEn.value).equal(false); + expect(dataAssemblyController.communication.RevFbk.value).equal(false); + expect(dataAssemblyController.communication.RevFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.RevOp.value).equal(false); + + expect(dataAssemblyController.communication.StopAut.value).equal(false); + expect(dataAssemblyController.communication.StopOp.value).equal(false); + expect(dataAssemblyController.communication.Trip.value).equal(false); }).timeout(4000); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.ts index 11c6148f..59c00d6b 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/Drv.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,33 +24,35 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; -import {InterlockRuntime, OpModeController, OpModeRuntime, ResetRuntime} from '../../_extensions'; +import {OpcUaConnection, DataItem} from '../../../connection'; +import { + Interlock, InterlockRuntime, + OpMode, OpModeRuntime, + Reset, ResetRuntime +} from '../../baseFunction'; import {ActiveElement, ActiveElementRuntime} from '../ActiveElement'; -import {Reset} from '../../_extensions/resetDA/Reset'; -import {Interlock} from '../../_extensions/interlockDA/Interlock'; export type DrvRuntime = ActiveElementRuntime & OpModeRuntime & InterlockRuntime & ResetRuntime & { - SafePos: OpcUaDataItem; - SafePosAct: OpcUaDataItem; + SafePos: DataItem; + SafePosAct: DataItem; - FwdAut: OpcUaDataItem; - FwdCtrl: OpcUaDataItem; - FwdEn: OpcUaDataItem; - FwdFbk: OpcUaDataItem; - FwdFbkCalc: OpcUaDataItem; - FwdOp: OpcUaDataItem; + FwdAut: DataItem; + FwdCtrl: DataItem; + FwdEn: DataItem; + FwdFbk: DataItem; + FwdFbkCalc: DataItem; + FwdOp: DataItem; - RevAut: OpcUaDataItem; - RevCtrl: OpcUaDataItem; - RevEn: OpcUaDataItem; - RevFbk: OpcUaDataItem; - RevFbkCalc: OpcUaDataItem; - RevOp: OpcUaDataItem; + RevAut: DataItem; + RevCtrl: DataItem; + RevEn: DataItem; + RevFbk: DataItem; + RevFbkCalc: DataItem; + RevOp: DataItem; - StopAut: OpcUaDataItem; - StopOp: OpcUaDataItem; - Trip: OpcUaDataItem; + StopAut: DataItem; + StopOp: DataItem; + Trip: DataItem; }; export class Drv extends ActiveElement { @@ -59,34 +60,34 @@ export class Drv extends ActiveElement { public readonly communication!: DrvRuntime; public readonly reset: Reset; public readonly interlock: Interlock; - public readonly opMode: OpModeController; + public readonly opMode: OpMode; constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); this.reset = new Reset(this); this.interlock = new Interlock(this); - this.opMode = new OpModeController(this); + this.opMode = new OpMode(this); - this.communication.SafePos = this.createDataItem('SafePos', 'read', 'boolean'); - this.communication.SafePosAct = this.createDataItem('SafePosAct', 'read', 'boolean'); + this.communication.SafePos = this.createDataItem('SafePos', 'boolean'); + this.communication.SafePosAct = this.createDataItem('SafePosAct', 'boolean'); - this.communication.FwdAut = this.createDataItem('FwdAut', 'read', 'boolean'); - this.communication.FwdCtrl = this.createDataItem('FwdCtrl', 'read', 'boolean'); - this.communication.FwdEn = this.createDataItem('FwdEn', 'read', 'boolean'); - this.communication.FwdFbk = this.createDataItem('FwdFbk', 'read', 'boolean'); - this.communication.FwdFbkCalc = this.createDataItem('FwdFbkCalc', 'read', 'boolean'); - this.communication.FwdOp = this.createDataItem('FwdOp', 'write', 'boolean'); + this.communication.FwdAut = this.createDataItem('FwdAut', 'boolean'); + this.communication.FwdCtrl = this.createDataItem('FwdCtrl', 'boolean'); + this.communication.FwdEn = this.createDataItem('FwdEn', 'boolean'); + this.communication.FwdFbk = this.createDataItem('FwdFbk', 'boolean'); + this.communication.FwdFbkCalc = this.createDataItem('FwdFbkCalc', 'boolean'); + this.communication.FwdOp = this.createDataItem('FwdOp', 'boolean', 'write'); - this.communication.RevAut = this.createDataItem('RevAut', 'read', 'boolean'); - this.communication.RevCtrl = this.createDataItem('RevCtrl', 'read', 'boolean'); - this.communication.RevEn = this.createDataItem('RevEn', 'read', 'boolean'); - this.communication.RevFbk = this.createDataItem('RevFbk', 'read', 'boolean'); - this.communication.RevFbkCalc = this.createDataItem('RevFbkCalc', 'read', 'boolean'); - this.communication.RevOp = this.createDataItem('RevOp', 'write', 'boolean'); + this.communication.RevAut = this.createDataItem('RevAut', 'boolean'); + this.communication.RevCtrl = this.createDataItem('RevCtrl', 'boolean'); + this.communication.RevEn = this.createDataItem('RevEn', 'boolean'); + this.communication.RevFbk = this.createDataItem('RevFbk', 'boolean'); + this.communication.RevFbkCalc = this.createDataItem('RevFbkCalc', 'boolean'); + this.communication.RevOp = this.createDataItem('RevOp', 'boolean', 'write'); - this.communication.StopAut = this.createDataItem('StopAut', 'read', 'boolean'); - this.communication.StopOp = this.createDataItem('StopOp', 'write', 'boolean'); - this.communication.Trip = this.createDataItem('Trip', 'read', 'boolean'); + this.communication.StopAut = this.createDataItem('StopAut', 'boolean'); + this.communication.StopOp = this.createDataItem('StopOp', 'boolean', 'write'); + this.communication.Trip = this.createDataItem('Trip', 'boolean'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.mockup.spec.ts index 7fdc591c..955125fb 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.mockup.spec.ts @@ -1,67 +1,99 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {AnaDrvMockup} from './AnaDrv.mockup'; +import {AnaDrvMockup, getAnaDrvDataItemOptions, getAnaDrvOptions} from './AnaDrv.mockup'; import {MockupServer} from '../../../../../_utils'; -import {FeedbackMonitoringDAMockup} from '../../../_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaDrvRuntime} from './AnaDrv'; chai.use(chaiAsPromised); const expect = chai.expect; describe('AnaDrvMockup', () => { - describe('', () => { - let mockupServer: any; + describe('static ', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create AnaDrvMockup', async () => { - const mockup= new AnaDrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new AnaDrvMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; + }); + it('static DataItemOptions', () => { + const options = getAnaDrvDataItemOptions(1, 'Test') as AnaDrvRuntime; + expect(Object.keys(options).length).to.equal(55); }); - it('getAnaDrvMockupReferenceJSON()', () => { - const mockup = new AnaDrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getAnaDrvMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(55); - //TODO test more? + + it('static DataAssemblyOptions', () => { + const options = getAnaDrvOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(57); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new AnaDrvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(57); }); }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: AnaDrvMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new AnaDrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new AnaDrvMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); + afterEach(async () => { await connection.disconnect(); await mockupServer.shutdown(); }); it('set and get RpmMan', async () => { - await connection.writeOpcUaNode('Variable.RpmMan', namespaceUrl, 1.1, 'Double'); - await connection.readOpcUaNode('Variable.RpmMan', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1.1)); + await connection.writeNode('Variable.RpmMan', mockupServer.nameSpaceUri, 1.1, 'Double'); + await connection.readNode('Variable.RpmMan', mockupServer.nameSpaceUri) + .then((dataValue) => expect(dataValue?.value.value).to.equal(1.1)); }).timeout(3000); - - //TODO get the rest - }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.mockup.ts index 0d9b9c25..2ca0073c 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.mockup.ts @@ -24,88 +24,98 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../../_extensions/opModeDA/OpModeDA.mockup'; -import {getInterlockDAMockupReferenceJSON, InterlockDAMockup} from '../../../_extensions/interlockDA/InterlockDA.mockup'; -import {getResetDAMockupReferenceJSON, ResetDAMockup} from '../../../_extensions/resetDA/ResetDA.mockup'; import { - getSourceModeDAMockupReferenceJSON, - SourceModeDAMockup -} from '../../../_extensions/sourceModeDA/SourceModeDA.mockup'; -import {getActiveElementMockupReferenceJSON} from '../../ActiveElement.mockup'; -import {DrvMockup, getDrvMockupReferenceJSON} from '../Drv.mockup'; + getSourceModeDataItemOptions, + SourceModeMockup +} from '../../../baseFunction/sourceMode/SourceMode.mockup'; +import {DrvMockup, getDrvDataItemOptions} from '../Drv.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/AnaDrv'; -export function getAnaDrvMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getAnaDrvSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + RpmSclMax: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmSclMax`, + dataType: 'Float' + } as OpcUaNodeOptions, + RpmSclMin: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmSclMin`, + dataType: 'Float' + } as OpcUaNodeOptions, + RpmUnit: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmUnit`, + dataType: 'Int16' + } as OpcUaNodeOptions, + RpmMax: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmMax`, + dataType: 'Float' + } as OpcUaNodeOptions, + RpmMin: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmMin`, + dataType: 'Float' + } as OpcUaNodeOptions, + RpmInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmInt`, + dataType: 'Float' + } as OpcUaNodeOptions, + RpmMan: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmMan`, + dataType: 'Float' + } as OpcUaNodeOptions, + Rpm: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Rpm`, + dataType: 'Float' + } as OpcUaNodeOptions, + RpmFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmFbk`, + dataType: 'Float' + } as OpcUaNodeOptions, + RpmFbkCalc: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmFbkCalc`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + RpmRbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmRbk`, + dataType: 'Float' + } as OpcUaNodeOptions + }); +} +export function getAnaDrvDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getSourceModeDAMockupReferenceJSON(namespace,objectBrowseName), - ...getDrvMockupReferenceJSON(namespace,objectBrowseName), - RpmSclMax: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmSclMax`, - dataType: 'Float' - }, - RpmSclMin: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmSclMin`, - dataType: 'Float' - }, - RpmUnit: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmUnit`, - dataType: 'Int16' - }, - RpmMax: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmMax`, - dataType: 'Float' - }, - RpmMin: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmMin`, - dataType: 'Float' - }, - RpmInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmInt`, - dataType: 'Float' - }, - RpmMan: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmMan`, - dataType: 'Float' - }, - Rpm: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Rpm`, - dataType: 'Float' - }, - RpmFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmFbk`, - dataType: 'Float' - }, - RpmFbkCalc: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmFbkCalc`, - dataType: 'Boolean' - }, - RpmRbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmRbk`, - dataType: 'Float' - } - } + ...getDrvDataItemOptions(namespace, objectBrowseName), + ...getSourceModeDataItemOptions(namespace, objectBrowseName), + ...getAnaDrvSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getAnaDrvOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getAnaDrvDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class AnaDrvMockup extends DrvMockup{ - public sourceMode: SourceModeDAMockup; + public sourceMode: SourceModeMockup; public rpmSclMin= 0; public rpmSclMax= 0; @@ -122,7 +132,7 @@ export class AnaDrvMockup extends DrvMockup{ constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { super(namespace, rootNode, variableName); - this.sourceMode= new SourceModeDAMockup(namespace,this.mockupNode,this.name); + this.sourceMode = new SourceModeMockup(namespace,this.mockupNode,this.name); namespace.addVariable({ componentOf: this.mockupNode, @@ -260,9 +270,14 @@ export class AnaDrvMockup extends DrvMockup{ } - public getAnaDrvMockupJSON() { - return getAnaDrvMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.sourceMode.getDataItemOptions(), + ...getAnaDrvSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.puml index 74a77cef..5f1fa89e 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.puml +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.puml @@ -1,6 +1,31 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include MonAnaDrv.puml +!include monAnaDrv/MonAnaDrv.puml class AnaDrv{ + readonly communication!: AnaDrvRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.spec.ts index 7a998c5d..e6ee68a0 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.spec.ts @@ -29,7 +29,7 @@ import {AnaDrv} from './AnaDrv'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/monanadrv.json'; +import {getAnaDrvOptions} from './AnaDrv.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -37,31 +37,29 @@ const expect = chai.expect; describe('AnaDrv', () => { describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + it('should create AnaDrv', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/AnaDrv', - dataItems: baseDataAssemblyOptions - }; - const da1 = new AnaDrv(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1.sourceMode).to.not.be.undefined; + const dataAssemblyOptions: DataAssemblyOptions = getAnaDrvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + const dataAssemblyController = new AnaDrv(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController.sourceMode).to.not.be.undefined; - expect(da1.communication.RpmSclMax).to.not.be.undefined; - expect(da1.communication.RpmSclMin).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmSclMax).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmSclMin).to.not.be.undefined; - expect(da1.communication.RpmUnit).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmUnit).to.not.be.undefined; - expect(da1.communication.RpmMin).to.not.be.undefined; - expect(da1.communication.RpmMax).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmMin).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmMax).to.not.be.undefined; - expect(da1.communication.RpmInt).to.not.be.undefined; - expect(da1.communication.RpmMan).to.not.be.undefined; - expect(da1.communication.Rpm).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmInt).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmMan).to.not.be.undefined; + expect(dataAssemblyController.communication.Rpm).to.not.be.undefined; - expect(da1.communication.RpmFbk).to.not.be.undefined; - expect(da1.communication.RpmFbkCalc).to.not.be.undefined; - expect(da1.communication.RpmRbk).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmFbk).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmFbkCalc).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmRbk).to.not.be.undefined; }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.ts index 745ccbba..ac8944c2 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/AnaDrv.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,27 +24,26 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; +import {OpcUaConnection, DataItem} from '../../../../connection'; import {Drv, DrvRuntime} from '../Drv'; -import {SourceModeRuntime} from '../../../_extensions'; -import {SourceModeController} from '../../../_extensions/sourceModeDA/SourceModeController'; +import {SourceModeController, SourceModeRuntime} from '../../../baseFunction'; export type AnaDrvRuntime = DrvRuntime & SourceModeRuntime & { - RpmSclMax: OpcUaDataItem; - RpmSclMin: OpcUaDataItem; + RpmSclMax: DataItem; + RpmSclMin: DataItem; - RpmUnit: OpcUaDataItem; + RpmUnit: DataItem; - RpmMin: OpcUaDataItem; - RpmMax: OpcUaDataItem; + RpmMin: DataItem; + RpmMax: DataItem; - RpmInt: OpcUaDataItem; - RpmMan: OpcUaDataItem; + RpmInt: DataItem; + RpmMan: DataItem; - Rpm: OpcUaDataItem; - RpmFbk: OpcUaDataItem; - RpmFbkCalc: OpcUaDataItem; - RpmRbk: OpcUaDataItem; + Rpm: DataItem; + RpmFbk: DataItem; + RpmFbkCalc: DataItem; + RpmRbk: DataItem; }; export class AnaDrv extends Drv { @@ -58,21 +56,21 @@ export class AnaDrv extends Drv { this.sourceMode = new SourceModeController(this); - this.communication.RpmSclMax = this.createDataItem('RpmSclMax', 'read', 'number'); - this.communication.RpmSclMin = this.createDataItem('RpmSclMin', 'read', 'number'); + this.communication.RpmSclMax = this.createDataItem('RpmSclMax', 'number'); + this.communication.RpmSclMin = this.createDataItem('RpmSclMin', 'number'); - this.communication.RpmUnit = this.createDataItem('RpmUnit', 'read', 'number'); + this.communication.RpmUnit = this.createDataItem('RpmUnit', 'number'); - this.communication.RpmMin = this.createDataItem('RpmMin', 'read', 'number'); - this.communication.RpmMax = this.createDataItem('RpmMax', 'read', 'number'); + this.communication.RpmMin = this.createDataItem('RpmMin', 'number'); + this.communication.RpmMax = this.createDataItem('RpmMax', 'number'); - this.communication.RpmInt = this.createDataItem('RpmInt', 'read', 'number'); - this.communication.RpmMan = this.createDataItem('RpmMan', 'write', 'number'); + this.communication.RpmInt = this.createDataItem('RpmInt', 'number'); + this.communication.RpmMan = this.createDataItem('RpmMan', 'number'); - this.communication.Rpm = this.createDataItem('Rpm', 'read', 'number'); - this.communication.RpmFbk = this.createDataItem('RpmFbk', 'read', 'number'); - this.communication.RpmFbkCalc = this.createDataItem('RpmFbkCalc', 'read', 'boolean'); - this.communication.RpmRbk = this.createDataItem('RpmRbk', 'read', 'number'); + this.communication.Rpm = this.createDataItem('Rpm', 'number'); + this.communication.RpmFbk = this.createDataItem('RpmFbk', 'number'); + this.communication.RpmFbkCalc = this.createDataItem('RpmFbkCalc', 'boolean'); + this.communication.RpmRbk = this.createDataItem('RpmRbk', 'number'); this.defaultReadDataItem = this.communication.RpmFbk; this.defaultReadDataItemType = 'number'; diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.mockup.spec.ts deleted file mode 100644 index 2d582793..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.mockup.spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; - -import {MonAnaDrvMockup} from './MonAnaDrv.mockup'; -import {MockupServer} from '../../../../../_utils'; -import {AnaDrvMockup} from './AnaDrv.mockup'; -import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('MonAnaDrvMockup', () => { - - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create MonAnaDrvMockup', async () => { - const mockup= new MonAnaDrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - - }); - it('getMonAnaDrvMockupReferenceJSON()', () => { - const mockup = new MonAnaDrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getMonAnaDrvMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(68); - //TODO test more? - }); - }); - describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: MonAnaDrvMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new MonAnaDrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set and get RpmAHLim, Double', async () => { - await connection.writeOpcUaNode('Variable.RpmAHLim', namespaceUrl, 1.1, 'Double'); - await connection.readOpcUaNode('Variable.RpmAHLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1.1)); - }).timeout(3000); - - it('set and get RpmALLim, Double', async () => { - await connection.writeOpcUaNode('Variable.RpmALLim', namespaceUrl, 1.1, 'Double'); - await connection.readOpcUaNode('Variable.RpmALLim', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1.1)); - }).timeout(3000); - - //TODO get the rest - - - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.puml deleted file mode 100644 index 9d12867f..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class MonAnaDrv{ - + readonly communication!: MonAnaDrvRuntime - + readonly feedbackMonitoring: FeedbackMonitoring -} - -MonAnaDrv *- MonAnaDrvSpec -MonAnaDrvSpec ..> MonAnaDrvMockup : <> -MonAnaDrv *- MonAnaDrvMockup -MonAnaDrv *- "1" MonAnaDrvRuntime -MonAnaDrv *- "1" FeedbackMonitoring -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.spec.ts deleted file mode 100644 index a6287689..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.spec.ts +++ /dev/null @@ -1,152 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../../connection'; -import {MonAnaDrv} from './MonAnaDrv'; - -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/monanadrv.json'; -import {MockupServer} from '../../../../../_utils'; -import {DrvMockup} from '../Drv.mockup'; -import {Drv} from '../Drv'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; -import {MonAnaDrvMockup} from './MonAnaDrv.mockup'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('MonAnaDrv', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/MonAnaDrv', - dataItems: baseDataAssemblyOptions - }; - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create MonAnaDrv', () => { - const da1 = new MonAnaDrv(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1.feedbackMonitoring).to.not.be.undefined; - expect(da1.sourceMode).to.not.be.undefined; - - expect(da1.communication.RpmErr).to.not.be.undefined; - - expect(da1.communication.RpmAHEn).to.not.be.undefined; - expect(da1.communication.RpmAHLim).to.not.be.undefined; - expect(da1.communication.RpmAHAct).to.not.be.undefined; - expect(da1.communication.RpmALEn).to.not.be.undefined; - expect(da1.communication.RpmALAct).to.not.be.undefined; - expect(da1.communication.RpmALLim).to.not.be.undefined; - expect(Object.keys(da1.communication).length).to.equal(68); - }); - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - let mockup: DrvMockup; - let da1: Drv; - - beforeEach(async function () { - this.timeout(10000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new MonAnaDrvMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - da1 = new MonAnaDrv(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - expect((da1).communication.OSLevel.value).equal(0); - expect((da1).communication.WQC.value).equal(0); - - expect((da1).communication.StateChannel.value).equal(false); - expect((da1).communication.StateOffAut.value).equal(false); - expect((da1).communication.StateOpAut.value).equal(false); - expect((da1).communication.StateAutAut.value).equal(false); - expect((da1).communication.StateOffOp.value).equal(false); - expect((da1).communication.StateOpOp.value).equal(false); - expect((da1).communication.StateAutOp.value).equal(false); - expect((da1).communication.StateOpAct.value).equal(false); - expect((da1).communication.StateAutAct.value).equal(false); - expect((da1).communication.StateOffAct.value).equal(true); - - expect(da1.communication.ResetOp.value).equal(false); - expect(da1.communication.ResetAut.value).equal(false); - - expect(da1.communication.PermEn.value).equal(false); - expect(da1.communication.Permit.value).equal(false); - expect(da1.communication.IntlEn.value).equal(false); - expect(da1.communication.Interlock.value).equal(false); - expect(da1.communication.ProtEn.value).equal(false); - expect(da1.communication.Protect.value).equal(false); - - expect(da1.communication.SafePos.value).equal(false); - expect(da1.communication.SafePosAct.value).equal(false); - - expect(da1.communication.FwdAut.value).equal(false); - expect(da1.communication.FwdCtrl.value).equal(false); - expect(da1.communication.FwdEn.value).equal(false); - expect(da1.communication.FwdFbk.value).equal(false); - expect(da1.communication.FwdFbkCalc.value).equal(false); - expect(da1.communication.FwdOp.value).equal(false); - - expect(da1.communication.RevAut.value).equal(false); - expect(da1.communication.RevCtrl.value).equal(false); - expect(da1.communication.RevEn.value).equal(false); - expect(da1.communication.RevFbk.value).equal(false); - expect(da1.communication.RevFbkCalc.value).equal(false); - expect(da1.communication.RevOp.value).equal(false); - - expect(da1.communication.StopAut.value).equal(false); - expect(da1.communication.StopOp.value).equal(false); - expect(da1.communication.Trip.value).equal(false); - }).timeout(4000); - - }); - -}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.mockup.spec.ts new file mode 100644 index 00000000..1177cd4d --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.mockup.spec.ts @@ -0,0 +1,110 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {getMonAnaDrvDataItemOptions, getMonAnaDrvOptions, MonAnaDrvMockup} from './MonAnaDrv.mockup'; +import {MockupServer} from '../../../../../../_utils'; +import {OpcUaConnection} from '../../../../../connection'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MonAnaDrvRuntime} from './MonAnaDrv'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('MonAnaDrvMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create MonAnaDrvMockup', async () => { + const mockup= new MonAnaDrvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + + }); + + it('static DataItemOptions', () => { + const options = getMonAnaDrvDataItemOptions(1, 'Test') as MonAnaDrvRuntime; + expect(Object.keys(options).length).to.equal(68); + }); + + it('static DataAssemblyOptions', () => { + const options = getMonAnaDrvOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(70); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new MonAnaDrvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(70); + }); + + }); + describe('dynamic', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(5000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + new MonAnaDrvMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get RpmAHLim, Double', async () => { + await connection.writeNode('Variable.RpmAHLim', mockupServer.nameSpaceUri, 1.1, 'Double'); + await connection.readNode('Variable.RpmAHLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1.1)); + }).timeout(3000); + + it('set and get RpmALLim, Double', async () => { + await connection.writeNode('Variable.RpmALLim', mockupServer.nameSpaceUri, 1.1, 'Double'); + await connection.readNode('Variable.RpmALLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1.1)); + }).timeout(3000); + + //TODO get the rest + + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.mockup.ts similarity index 61% rename from src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.mockup.ts index de5c085e..ef69af6d 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.mockup.ts @@ -24,99 +24,104 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../../_extensions/opModeDA/OpModeDA.mockup'; -import {getInterlockDAMockupReferenceJSON, InterlockDAMockup} from '../../../_extensions/interlockDA/InterlockDA.mockup'; -import {getResetDAMockupReferenceJSON, ResetDAMockup} from '../../../_extensions/resetDA/ResetDA.mockup'; import { - getSourceModeDAMockupReferenceJSON, - SourceModeDAMockup -} from '../../../_extensions/sourceModeDA/SourceModeDA.mockup'; -import { - FeedbackMonitoringDAMockup, - getFeedbackMonitoringDAMockupReferenceJSON -} from '../../../_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup'; -import {AnaDrvMockup, getAnaDrvMockupReferenceJSON} from './AnaDrv.mockup'; -import {MonAnaDrv} from './MonAnaDrv'; + FeedbackMonitoringMockup, getFeedbackMonitoringDataItemOptions +} from '../../../../baseFunction/feedbackMonitoring/FeedbackMonitoring.mockup'; +import {AnaDrvMockup, getAnaDrvDataItemOptions} from '../AnaDrv.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../../DataAssemblyController.mockup'; + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/AnaDrv/MonAnaDrv'; +function getMonAnaDrvSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + RpmErr: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmErr`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + RpmAHEn: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmAHEn`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + RpmAHLim: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmAHLim`, + dataType: 'Float' + } as OpcUaNodeOptions, + RpmAHAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmAHAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + RpmALEn: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmALEn`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + RpmALLim: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmALLim`, + dataType: 'Float' + } as OpcUaNodeOptions, + RpmALAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.RpmALAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} -export function getMonAnaDrvMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +export function getMonAnaDrvDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getAnaDrvMockupReferenceJSON(namespace, objectBrowseName), - ...getFeedbackMonitoringDAMockupReferenceJSON(namespace,objectBrowseName), - RpmErr: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmErr`, - dataType: 'Boolean' - }, - RpmAHEn: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmAHEn`, - dataType: 'Boolean' - }, - RpmAHLim: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmAHLim`, - dataType: 'Float' - }, - RpmAHAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmAHAct`, - dataType: 'Boolean' - }, - RpmALEn: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmALEn`, - dataType: 'Boolean' - }, - RpmALLim: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmALLim`, - dataType: 'Float' - }, - RpmALAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.RpmALAct`, - dataType: 'Boolean' - }, - } + ...getAnaDrvDataItemOptions(namespace, objectBrowseName), + ...getFeedbackMonitoringDataItemOptions(namespace, objectBrowseName), + ...getMonAnaDrvSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } -export class MonAnaDrvMockup extends AnaDrvMockup { +export function getMonAnaDrvOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getMonAnaDrvDataItemOptions(namespace, objectBrowseName)}; + return options; +} - public feedbackMonitoring: FeedbackMonitoringDAMockup; +export class MonAnaDrvMockup extends AnaDrvMockup { - // TODO some values are not listed in VDI paper 3, check that - public rpmErr = 0.0; + public feedbackMonitoring: FeedbackMonitoringMockup; + + public rpmErr = 0; public rpmAHEn = false; - public rpmAHLim: string | number | DataType | undefined = 0; + public rpmAHLim = 0; public rpmAHAct = false; public rpmWHEn = false; - public rpmWHLim: string | number | DataType | undefined = undefined; + public rpmWHLim = 0; public rpmWHAct = false; public rpmTHEn = false; - public rpmTHLim: string | number | DataType | undefined = undefined; + public rpmTHLim = 0; public rpmTHAct = false; public rpmTLEn = false; - public rpmTLLim: string | number | DataType | undefined = undefined; + public rpmTLLim = 0; public rpmTLAct = false; public rpmWLEn = false; - public rpmWLLim: string | number | DataType | undefined = undefined; + public rpmWLLim = 0; public rpmWLAct = false; public rpmALEn = false; - public rpmALLim: string | number | DataType | undefined = 0; + public rpmALLim = 0; public rpmALAct = false; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { super(namespace, rootNode, variableName); - this.feedbackMonitoring= new FeedbackMonitoringDAMockup(namespace,this.mockupNode,this.name); + this.feedbackMonitoring= new FeedbackMonitoringMockup(namespace,this.mockupNode,this.name); namespace.addVariable({ componentOf: rootNode, @@ -150,20 +155,9 @@ export class MonAnaDrvMockup extends AnaDrvMockup { return new Variant({dataType: DataType.Double, value: this.rpmAHLim}); }, - set: (variant: Variant) => { + set: (variant: Variant): StatusCodes => { this.rpmAHLim = parseFloat(variant.value); return StatusCodes.Good; -/* switch (typeof this.rpmAHLim) { - //TODO why undefined - case 'undefined': - return StatusCodes.BadTypeDefinitionInvalid; - case DataType.Double.toString(): - this.rpmAHLim = parseFloat(variant.value); - return StatusCodes.Good; - default: //TODO why int - this.rpmAHLim = parseInt(variant.value,10); - return StatusCodes.Good; - }*/ }, }, }); @@ -178,7 +172,7 @@ export class MonAnaDrvMockup extends AnaDrvMockup { }, }, }); - /* + namespace.addVariable({ componentOf: rootNode, nodeId: `ns=${namespace.index};s=${variableName}.RpmWHEn`, @@ -199,21 +193,13 @@ export class MonAnaDrvMockup extends AnaDrvMockup { get: (): Variant => { return new Variant({dataType: DataType.Double, value: this.rpmWHLim}); }, - - set: (variant: Variant) => { - switch (typeof this.rpmWHLim) { - case 'undefined': - return StatusCodes.BadTypeDefinitionInvalid; - case DataType.Double.toString(): - this.rpmWHLim = parseFloat(variant.value); - return StatusCodes.Good; - default: - this.rpmWHLim = parseInt(variant.value,10); - return StatusCodes.Good; - } - }, + set: (variant: Variant): StatusCodes => { + this.rpmWHLim = parseFloat(variant.value); + return StatusCodes.Good; + } }, }); + namespace.addVariable({ componentOf: rootNode, nodeId: `ns=${namespace.index};s=${variableName}.RpmWHAct`, @@ -246,21 +232,13 @@ export class MonAnaDrvMockup extends AnaDrvMockup { return new Variant({dataType: DataType.Double, value: this.rpmTHLim}); }, - set: (variant: Variant) => { - switch (typeof this.rpmTHLim) { - case 'undefined': - return StatusCodes.BadTypeDefinitionInvalid; - case DataType.Double.toString(): - this.rpmTHLim = parseFloat(variant.value); - return StatusCodes.Good; - default: - this.rpmTHLim = parseInt(variant.value,10); - return StatusCodes.Good; - } + set: (variant: Variant): StatusCodes => { + this.rpmTHLim = parseFloat(variant.value); + return StatusCodes.Good; }, }, - });*/ -/* namespace.addVariable({ + }); + namespace.addVariable({ componentOf: rootNode, nodeId: `ns=${namespace.index};s=${variableName}.RpmTHAct`, browseName: `${variableName}.RpmTHAct`, @@ -292,17 +270,9 @@ export class MonAnaDrvMockup extends AnaDrvMockup { return new Variant({dataType: DataType.Double, value: this.rpmTLLim}); }, - set: (variant: Variant) => { - switch (typeof this.rpmTLLim) { - case 'undefined': - return StatusCodes.BadTypeDefinitionInvalid; - case DataType.Double.toString(): - this.rpmTLLim = parseFloat(variant.value); - return StatusCodes.Good; - default: - this.rpmTLLim = parseInt(variant.value,10); - return StatusCodes.Good; - } + set: (variant: Variant): StatusCodes => { + this.rpmTLLim = parseFloat(variant.value); + return StatusCodes.Good; }, }, }); @@ -339,16 +309,8 @@ export class MonAnaDrvMockup extends AnaDrvMockup { }, set: (variant: Variant): StatusCodes => { - switch (typeof this.rpmWLLim) { - case 'undefined': - return StatusCodes.BadTypeDefinitionInvalid; - case DataType.Double.toString(): - this.rpmWLLim = parseFloat(variant.value); - return StatusCodes.Good; - default: - this.rpmWLLim = parseInt(variant.value,10); - return StatusCodes.Good; - } + this.rpmWLLim = parseFloat(variant.value); + return StatusCodes.Good; }, }, }); @@ -362,7 +324,7 @@ export class MonAnaDrvMockup extends AnaDrvMockup { return new Variant({dataType: DataType.Boolean, value: this.rpmWLAct}); }, }, - });*/ + }); namespace.addVariable({ componentOf: rootNode, nodeId: `ns=${namespace.index};s=${variableName}.RpmALEn`, @@ -387,16 +349,6 @@ export class MonAnaDrvMockup extends AnaDrvMockup { set: (variant: Variant): StatusCodes => { this.rpmALLim = parseFloat(variant.value); return StatusCodes.Good; -/* switch (typeof this.rpmALLim) { - case 'undefined': - return StatusCodes.BadTypeDefinitionInvalid; - case DataType.Double.toString(): - this.rpmALLim = parseFloat(variant.value); - return StatusCodes.Good; - default: - this.rpmALLim = parseInt(variant.value,10); - return StatusCodes.Good; - }*/ }, }, }); @@ -414,9 +366,14 @@ export class MonAnaDrvMockup extends AnaDrvMockup { } - public getMonAnaDrvMockupJSON() { - return getMonAnaDrvMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.feedbackMonitoring.getDataItemOptions(), + ...getMonAnaDrvSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.puml new file mode 100644 index 00000000..4c466d42 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.puml @@ -0,0 +1,39 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +class MonAnaDrv{ + + readonly communication!: MonAnaDrvRuntime + + readonly feedbackMonitoring: FeedbackMonitoring +} + +MonAnaDrv *- MonAnaDrvSpec +MonAnaDrvSpec ..> MonAnaDrvMockup : <> +MonAnaDrv *- MonAnaDrvMockup +MonAnaDrv *- "1" MonAnaDrvRuntime +MonAnaDrv *- "1" FeedbackMonitoring +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.spec.ts new file mode 100644 index 00000000..acdefed1 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.spec.ts @@ -0,0 +1,140 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../../connection'; +import {MonAnaDrv} from './MonAnaDrv'; + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MockupServer} from '../../../../../../_utils'; + +import {getMonAnaDrvOptions, MonAnaDrvMockup} from './MonAnaDrv.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('MonAnaDrv', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getMonAnaDrvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create MonAnaDrv', () => { + const dataAssemblyController = new MonAnaDrv(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController.feedbackMonitoring).to.not.be.undefined; + expect(dataAssemblyController.sourceMode).to.not.be.undefined; + + expect(dataAssemblyController.communication.RpmErr).to.not.be.undefined; + + expect(dataAssemblyController.communication.RpmAHEn).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmAHLim).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmAHAct).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmALEn).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmALAct).to.not.be.undefined; + expect(dataAssemblyController.communication.RpmALLim).to.not.be.undefined; + expect(Object.keys(dataAssemblyController.communication).length).to.equal(70); + }); + }); + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(10000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const monAnaDrvMockup =new MonAnaDrvMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + dataAssemblyOptions = monAnaDrvMockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + const dataAssemblyController = new MonAnaDrv(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect((dataAssemblyController).communication.OSLevel.value).equal(0); + expect((dataAssemblyController).communication.WQC.value).equal(0); + + expect((dataAssemblyController).communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.ResetOp.value).equal(false); + expect(dataAssemblyController.communication.ResetAut.value).equal(false); + + expect(dataAssemblyController.communication.PermEn.value).equal(false); + expect(dataAssemblyController.communication.Permit.value).equal(false); + expect(dataAssemblyController.communication.IntlEn.value).equal(false); + expect(dataAssemblyController.communication.Interlock.value).equal(false); + expect(dataAssemblyController.communication.ProtEn.value).equal(false); + expect(dataAssemblyController.communication.Protect.value).equal(false); + + expect(dataAssemblyController.communication.SafePos.value).equal(false); + expect(dataAssemblyController.communication.SafePosAct.value).equal(false); + + expect(dataAssemblyController.communication.FwdAut.value).equal(false); + expect(dataAssemblyController.communication.FwdCtrl.value).equal(false); + expect(dataAssemblyController.communication.FwdEn.value).equal(false); + expect(dataAssemblyController.communication.FwdFbk.value).equal(false); + expect(dataAssemblyController.communication.FwdFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.FwdOp.value).equal(false); + + expect(dataAssemblyController.communication.RevAut.value).equal(false); + expect(dataAssemblyController.communication.RevCtrl.value).equal(false); + expect(dataAssemblyController.communication.RevEn.value).equal(false); + expect(dataAssemblyController.communication.RevFbk.value).equal(false); + expect(dataAssemblyController.communication.RevFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.RevOp.value).equal(false); + + expect(dataAssemblyController.communication.StopAut.value).equal(false); + expect(dataAssemblyController.communication.StopOp.value).equal(false); + expect(dataAssemblyController.communication.Trip.value).equal(false); + }).timeout(4000); + + }); + +}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.ts similarity index 74% rename from src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.ts rename to src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.ts index 3e2fed18..e3db6ba6 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/MonAnaDrv.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/anaDrv/monAnaDrv/MonAnaDrv.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,19 +24,19 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; -import {FeedbackMonitoring, FeedbackMonitoringRuntime} from '../../../_extensions'; -import {AnaDrv, AnaDrvRuntime} from './AnaDrv'; +import {OpcUaConnection, DataItem} from '../../../../../connection'; +import {FeedbackMonitoring, FeedbackMonitoringRuntime} from '../../../../baseFunction'; +import {AnaDrv, AnaDrvRuntime} from '../AnaDrv'; export type MonAnaDrvRuntime = AnaDrvRuntime & FeedbackMonitoringRuntime & { - RpmErr: OpcUaDataItem; - - RpmAHEn: OpcUaDataItem; - RpmAHLim: OpcUaDataItem; - RpmAHAct: OpcUaDataItem; - RpmALEn: OpcUaDataItem; - RpmALLim: OpcUaDataItem; - RpmALAct: OpcUaDataItem; + RpmErr: DataItem; + + RpmAHEn: DataItem; + RpmAHLim: DataItem; + RpmAHAct: DataItem; + RpmALEn: DataItem; + RpmALLim: DataItem; + RpmALAct: DataItem; }; export class MonAnaDrv extends AnaDrv { @@ -49,14 +48,14 @@ export class MonAnaDrv extends AnaDrv { this.feedbackMonitoring = new FeedbackMonitoring(this); - this.communication.RpmErr = this.createDataItem('RpmErr', 'read') as OpcUaDataItem; + this.communication.RpmErr = this.createDataItem('RpmErr', 'number'); - this.communication.RpmAHEn = this.createDataItem('RpmAHEn', 'read',); - this.communication.RpmAHLim = this.createDataItem('RpmAHLim', 'write'); - this.communication.RpmAHAct = this.createDataItem('RpmAHAct', 'read'); + this.communication.RpmAHEn = this.createDataItem('RpmAHEn', 'boolean'); + this.communication.RpmAHLim = this.createDataItem('RpmAHLim', 'number', 'write'); + this.communication.RpmAHAct = this.createDataItem('RpmAHAct', 'boolean'); - this.communication.RpmALEn = this.createDataItem('RpmALEn', 'read'); - this.communication.RpmALLim = this.createDataItem('RpmALLim', 'write'); - this.communication.RpmALAct = this.createDataItem('RpmALAct', 'read'); + this.communication.RpmALEn = this.createDataItem('RpmALEn', 'boolean'); + this.communication.RpmALLim = this.createDataItem('RpmALLim', 'number', 'write'); + this.communication.RpmALAct = this.createDataItem('RpmALAct', 'boolean'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.mockup.spec.ts index fabfdad3..6b73dcb0 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.mockup.spec.ts @@ -1,40 +1,74 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; - -import {BinDrvMockup} from './BinDrv.mockup'; +import {BinDrvMockup, getBinDrvDataItemOptions, getBinDrvOptions} from './BinDrv.mockup'; import {MockupServer} from '../../../../../_utils'; -import {FeedbackMonitoringDAMockup} from '../../../_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup'; -import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {BinDrvRuntime} from './BinDrv'; chai.use(chaiAsPromised); const expect = chai.expect; describe('BinDrvMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async function() { + this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create BinDrvMockup', async () => { - const mockup= new BinDrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new BinDrvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; }); - it('getBinDrvMockupReferenceJSON()', () => { - const mockup = new BinDrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getBinDrvMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(37); - //TODO test more? + + it('static DataItemOptions', () => { + const options = getBinDrvDataItemOptions(1, 'Test') as BinDrvRuntime; + expect(Object.keys(options).length).to.equal(37); }); - }); - //rest is already tested in DrvMockup + it('static DataAssemblyOptions', () => { + const options = getBinDrvOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(39); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new BinDrvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(39); + }).timeout(8000); + + }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.mockup.ts index 874a6744..ae28729a 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.mockup.ts @@ -23,34 +23,41 @@ * SOFTWARE. */ -import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../../_extensions/opModeDA/OpModeDA.mockup'; -import {getInterlockDAMockupReferenceJSON, InterlockDAMockup} from '../../../_extensions/interlockDA/InterlockDA.mockup'; -import {getResetDAMockupReferenceJSON, ResetDAMockup} from '../../../_extensions/resetDA/ResetDA.mockup'; -import {DrvMockup, getDrvMockupReferenceJSON} from '../Drv.mockup'; +import {Namespace, UAObject} from 'node-opcua'; +import {DrvMockup, getDrvDataItemOptions} from '../Drv.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getBinDrvMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/BinDrv'; + +export function getBinDrvDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getDrvMockupReferenceJSON(namespace, objectBrowseName) - } + ...getDrvDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getBinDrvOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinDrvDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class BinDrvMockup extends DrvMockup { constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { super(namespace, rootNode, variableName); } - public getBinDrvMockupJSON() { - return getBinDrvMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.puml index ddad6c60..f2e2d800 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.puml +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.puml @@ -1,6 +1,31 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include MonBinDrv.puml +!include monBinDrv/MonBinDrv.puml class BinDrv{ + readonly communication!: BinDrvRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.spec.ts index 8037f5c5..4fc7af9b 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.spec.ts @@ -22,91 +22,80 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -//monanadrv.json overlaps with bindrv -import * as baseDataAssemblyOptions from '../../../../../../../tests/monanadrv.json'; + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; - -import {Namespace, UAObject} from 'node-opcua'; import {OpcUaConnection} from '../../../../connection'; import {BinDrv} from './BinDrv'; import {MockupServer} from '../../../../../_utils'; -import {BinDrvMockup} from './BinDrv.mockup'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; - +import {BinDrvMockup, getBinDrvOptions} from './BinDrv.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; -const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/BinBinDrv', - dataItems: baseDataAssemblyOptions -}; + describe('BinDrv', () => { - //TODO maybe doesnt need to be tested that much, because already tested in Drv class more or less + + let dataAssemblyOptions: DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getBinDrvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create BinDrv', () => { - const da1 = new BinDrv(dataAssemblyOptions, emptyOPCUAConnection); - - expect(da1.reset).to.be.not.undefined; - expect(da1.interlock).to.be.not.undefined; - expect(da1.opMode).to.be.not.undefined; - - expect(da1.communication.SafePos).to.be.not.undefined; - expect(da1.communication.SafePosAct).to.be.not.undefined; - - expect(da1.communication.FwdAut).to.be.not.undefined; - expect(da1.communication.FwdCtrl).to.be.not.undefined; - expect(da1.communication.FwdEn).to.be.not.undefined; - expect(da1.communication.FwdFbk).to.be.not.undefined; - expect(da1.communication.FwdFbkCalc).to.be.not.undefined; - expect(da1.communication.FwdOp).to.be.not.undefined; - - expect(da1.communication.RevAut).to.be.not.undefined; - expect(da1.communication.RevCtrl).to.be.not.undefined; - expect(da1.communication.RevEn).to.be.not.undefined; - expect(da1.communication.RevFbk).to.be.not.undefined; - expect(da1.communication.RevFbkCalc).to.be.not.undefined; - expect(da1.communication.RevOp).to.be.not.undefined; - - expect(da1.communication.StopAut).to.be.not.undefined; - expect(da1.communication.StopOp).to.be.not.undefined; - expect(da1.communication.Trip).to.be.not.undefined; - - expect(Object.keys(da1.communication).length).to.equal(37); + const dataAssemblyController = new BinDrv(dataAssemblyOptions, emptyOPCUAConnection); + + expect(dataAssemblyController.reset).to.be.not.undefined; + expect(dataAssemblyController.interlock).to.be.not.undefined; + expect(dataAssemblyController.opMode).to.be.not.undefined; + + expect(dataAssemblyController.communication.SafePos).to.be.not.undefined; + expect(dataAssemblyController.communication.SafePosAct).to.be.not.undefined; + + expect(dataAssemblyController.communication.FwdAut).to.be.not.undefined; + expect(dataAssemblyController.communication.FwdCtrl).to.be.not.undefined; + expect(dataAssemblyController.communication.FwdEn).to.be.not.undefined; + expect(dataAssemblyController.communication.FwdFbk).to.be.not.undefined; + expect(dataAssemblyController.communication.FwdFbkCalc).to.be.not.undefined; + expect(dataAssemblyController.communication.FwdOp).to.be.not.undefined; + + expect(dataAssemblyController.communication.RevAut).to.be.not.undefined; + expect(dataAssemblyController.communication.RevCtrl).to.be.not.undefined; + expect(dataAssemblyController.communication.RevEn).to.be.not.undefined; + expect(dataAssemblyController.communication.RevFbk).to.be.not.undefined; + expect(dataAssemblyController.communication.RevFbkCalc).to.be.not.undefined; + expect(dataAssemblyController.communication.RevOp).to.be.not.undefined; + + expect(dataAssemblyController.communication.StopAut).to.be.not.undefined; + expect(dataAssemblyController.communication.StopOp).to.be.not.undefined; + expect(dataAssemblyController.communication.Trip).to.be.not.undefined; + + expect(Object.keys(dataAssemblyController.communication).length).to.equal(39); }); }); + describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: BinDrvMockup; - let da1: BinDrv; + let dataAssemblyController: BinDrv; beforeEach(async function () { this.timeout(10000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new BinDrvMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const binDrvMockup = new BinDrvMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + dataAssemblyOptions = binDrvMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - da1 = new BinDrv(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; + + dataAssemblyController = new BinDrv(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); }); afterEach(async function () { @@ -116,50 +105,50 @@ describe('BinDrv', () => { }); it('should subscribe successfully', async () => { - expect((da1).communication.OSLevel.value).equal(0); - expect((da1).communication.WQC.value).equal(0); - - expect((da1).communication.StateChannel.value).equal(false); - expect((da1).communication.StateOffAut.value).equal(false); - expect((da1).communication.StateOpAut.value).equal(false); - expect((da1).communication.StateAutAut.value).equal(false); - expect((da1).communication.StateOffOp.value).equal(false); - expect((da1).communication.StateOpOp.value).equal(false); - expect((da1).communication.StateAutOp.value).equal(false); - expect((da1).communication.StateOpAct.value).equal(false); - expect((da1).communication.StateAutAct.value).equal(false); - expect((da1).communication.StateOffAct.value).equal(true); - - expect(da1.communication.ResetOp.value).equal(false); - expect(da1.communication.ResetAut.value).equal(false); - - expect(da1.communication.PermEn.value).equal(false); - expect(da1.communication.Permit.value).equal(false); - expect(da1.communication.IntlEn.value).equal(false); - expect(da1.communication.Interlock.value).equal(false); - expect(da1.communication.ProtEn.value).equal(false); - expect(da1.communication.Protect.value).equal(false); - - expect(da1.communication.SafePos.value).equal(false); - expect(da1.communication.SafePosAct.value).equal(false); - - expect(da1.communication.FwdAut.value).equal(false); - expect(da1.communication.FwdCtrl.value).equal(false); - expect(da1.communication.FwdEn.value).equal(false); - expect(da1.communication.FwdFbk.value).equal(false); - expect(da1.communication.FwdFbkCalc.value).equal(false); - expect(da1.communication.FwdOp.value).equal(false); - - expect(da1.communication.RevAut.value).equal(false); - expect(da1.communication.RevCtrl.value).equal(false); - expect(da1.communication.RevEn.value).equal(false); - expect(da1.communication.RevFbk.value).equal(false); - expect(da1.communication.RevFbkCalc.value).equal(false); - expect(da1.communication.RevOp.value).equal(false); - - expect(da1.communication.StopAut.value).equal(false); - expect(da1.communication.StopOp.value).equal(false); - expect(da1.communication.Trip.value).equal(false); + expect((dataAssemblyController).communication.OSLevel.value).equal(0); + expect((dataAssemblyController).communication.WQC.value).equal(0); + + expect((dataAssemblyController).communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.ResetOp.value).equal(false); + expect(dataAssemblyController.communication.ResetAut.value).equal(false); + + expect(dataAssemblyController.communication.PermEn.value).equal(false); + expect(dataAssemblyController.communication.Permit.value).equal(false); + expect(dataAssemblyController.communication.IntlEn.value).equal(false); + expect(dataAssemblyController.communication.Interlock.value).equal(false); + expect(dataAssemblyController.communication.ProtEn.value).equal(false); + expect(dataAssemblyController.communication.Protect.value).equal(false); + + expect(dataAssemblyController.communication.SafePos.value).equal(false); + expect(dataAssemblyController.communication.SafePosAct.value).equal(false); + + expect(dataAssemblyController.communication.FwdAut.value).equal(false); + expect(dataAssemblyController.communication.FwdCtrl.value).equal(false); + expect(dataAssemblyController.communication.FwdEn.value).equal(false); + expect(dataAssemblyController.communication.FwdFbk.value).equal(false); + expect(dataAssemblyController.communication.FwdFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.FwdOp.value).equal(false); + + expect(dataAssemblyController.communication.RevAut.value).equal(false); + expect(dataAssemblyController.communication.RevCtrl.value).equal(false); + expect(dataAssemblyController.communication.RevEn.value).equal(false); + expect(dataAssemblyController.communication.RevFbk.value).equal(false); + expect(dataAssemblyController.communication.RevFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.RevOp.value).equal(false); + + expect(dataAssemblyController.communication.StopAut.value).equal(false); + expect(dataAssemblyController.communication.StopOp.value).equal(false); + expect(dataAssemblyController.communication.Trip.value).equal(false); }).timeout(4000); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.ts index 25bb650d..71301683 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/BinDrv.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.mockup.spec.ts deleted file mode 100644 index dbe6f04b..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.mockup.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; - -import {MonBinDrvMockup} from './MonBinDrv.mockup'; -import {MockupServer} from '../../../../../_utils'; -import {BinDrvMockup} from './BinDrv.mockup'; -import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('MonBinDrvMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create MonBinDrvMockup', async () => { - const mockup= new MonBinDrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - - }); - it('getMonBinDrvMockupReferenceJSON()', () => { - const mockup = new MonBinDrvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getMonBinDrvMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(43); - //TODO test more? - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.mockup.ts deleted file mode 100644 index 5cd1b3e6..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.mockup.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../../_extensions/opModeDA/OpModeDA.mockup'; -import {getInterlockDAMockupReferenceJSON, InterlockDAMockup} from '../../../_extensions/interlockDA/InterlockDA.mockup'; -import {getResetDAMockupReferenceJSON, ResetDAMockup} from '../../../_extensions/resetDA/ResetDA.mockup'; -import { - FeedbackMonitoringDAMockup, - getFeedbackMonitoringDAMockupReferenceJSON -} from '../../../_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup'; -import {BinDrvMockup, getBinDrvMockupReferenceJSON} from './BinDrv.mockup'; - - -export function getMonBinDrvMockupReferenceJSON(namespace: number, objectBrowseName: string) { - return ({ - ...getBinDrvMockupReferenceJSON(namespace, objectBrowseName), - ...getFeedbackMonitoringDAMockupReferenceJSON(namespace,objectBrowseName), - } - ); -} - -export class MonBinDrvMockup extends BinDrvMockup{ - - public feedbackMonitoring: FeedbackMonitoringDAMockup; - - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - super(namespace, rootNode, variableName); - this.feedbackMonitoring= new FeedbackMonitoringDAMockup(namespace,this.mockupNode,this.name); - } - - public getMonBinDrvMockupJSON() { - return getMonBinDrvMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); - } -} diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.puml deleted file mode 100644 index d6dbff7f..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.puml +++ /dev/null @@ -1,15 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class MonBinDrv{ - + readonly communication!: MonBinDrvRuntime - + readonly feedbackMonitoring: FeedbackMonitoring -} -MonBinDrv *- MonBinDrvSpec -MonBinDrvSpec ..> MonBinDrvMockup : <> -MonBinDrv *- MonBinDrvMockup -MonBinDrv *- "1" MonBinDrvRuntime -MonBinDrv *- "1" FeedbackMonitoring - - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.spec.ts deleted file mode 100644 index 3eef32e8..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.spec.ts +++ /dev/null @@ -1,141 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../../connection'; -import {MonBinDrv} from './MonBinDrv'; - -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -// MonBinDrv overlaps with MonAnaDrv -import * as baseDataAssemblyOptions from '../../../../../../../tests/monanadrv.json'; -import {MockupServer} from '../../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; -import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; -import {MonBinDrvMockup} from './MonBinDrv.mockup'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('MonBinDrv', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/MonBinDrv', - dataItems: baseDataAssemblyOptions - }; - describe('', () => { - it('should create MonBinDrv',() => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - - const da1 = new MonBinDrv(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1.feedBackMonitoring).to.be.not.undefined; - }); - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - let mockup: MonBinDrvMockup; - let da1: MonBinDrv; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new MonBinDrvMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as MonBinDrv; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - expect((da1).communication.OSLevel.value).equal(0); - expect((da1).communication.WQC.value).equal(0); - - expect((da1).communication.StateChannel.value).equal(false); - expect((da1).communication.StateOffAut.value).equal(false); - expect((da1).communication.StateOpAut.value).equal(false); - expect((da1).communication.StateAutAut.value).equal(false); - expect((da1).communication.StateOffOp.value).equal(false); - expect((da1).communication.StateOpOp.value).equal(false); - expect((da1).communication.StateAutOp.value).equal(false); - expect((da1).communication.StateOpAct.value).equal(false); - expect((da1).communication.StateAutAct.value).equal(false); - expect((da1).communication.StateOffAct.value).equal(true); - - expect(da1.communication.ResetOp.value).equal(false); - expect(da1.communication.ResetAut.value).equal(false); - - expect(da1.communication.PermEn.value).equal(false); - expect(da1.communication.Permit.value).equal(false); - expect(da1.communication.IntlEn.value).equal(false); - expect(da1.communication.Interlock.value).equal(false); - expect(da1.communication.ProtEn.value).equal(false); - expect(da1.communication.Protect.value).equal(false); - - expect(da1.communication.SafePos.value).equal(false); - expect(da1.communication.SafePosAct.value).equal(false); - - expect(da1.communication.FwdAut.value).equal(false); - expect(da1.communication.FwdCtrl.value).equal(false); - expect(da1.communication.FwdEn.value).equal(false); - expect(da1.communication.FwdFbk.value).equal(false); - expect(da1.communication.FwdFbkCalc.value).equal(false); - expect(da1.communication.FwdOp.value).equal(false); - - expect(da1.communication.RevAut.value).equal(false); - expect(da1.communication.RevCtrl.value).equal(false); - expect(da1.communication.RevEn.value).equal(false); - expect(da1.communication.RevFbk.value).equal(false); - expect(da1.communication.RevFbkCalc.value).equal(false); - expect(da1.communication.RevOp.value).equal(false); - - expect(da1.communication.StopAut.value).equal(false); - expect(da1.communication.StopOp.value).equal(false); - expect(da1.communication.Trip.value).equal(false); - }).timeout(4000); - - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.mockup.spec.ts new file mode 100644 index 00000000..55b229d9 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.mockup.spec.ts @@ -0,0 +1,72 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {getMonBinDrvDataItemOptions, getMonBinDrvOptions, MonBinDrvMockup} from './MonBinDrv.mockup'; +import {MockupServer} from '../../../../../../_utils'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MonBinDrvRuntime} from './MonBinDrv'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('MonBinDrvMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create MonBinDrvMockup', async () => { + const mockup= new MonBinDrvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + + }); + + it('static DataItemOptions', () => { + const options = getMonBinDrvDataItemOptions(1, 'Test') as MonBinDrvRuntime; + expect(Object.keys(options).length).to.equal(43); + }); + + it('static DataAssemblyOptions', () => { + const options = getMonBinDrvOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(45); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new MonBinDrvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(45); + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.mockup.ts new file mode 100644 index 00000000..d354f2f7 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.mockup.ts @@ -0,0 +1,75 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {Namespace, UAObject} from 'node-opcua'; +import { + FeedbackMonitoringMockup, getFeedbackMonitoringDataItemOptions +} from '../../../../baseFunction/feedbackMonitoring/FeedbackMonitoring.mockup'; +import {BinDrvMockup, getBinDrvDataItemOptions} from '../BinDrv.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../../DataAssemblyController.mockup'; + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/BinDrv/MonBinDrv'; + + +export function getMonBinDrvDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getBinDrvDataItemOptions(namespace, objectBrowseName), + ...getFeedbackMonitoringDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions + ); +} + +export function getMonBinDrvOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getMonBinDrvDataItemOptions(namespace, objectBrowseName)}; + return options; +} + + +export class MonBinDrvMockup extends BinDrvMockup{ + + public feedbackMonitoring: FeedbackMonitoringMockup; + + constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); + this.feedbackMonitoring= new FeedbackMonitoringMockup(namespace, this.mockupNode, this.name); + } + + + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.feedbackMonitoring.getDataItemOptions() + }; + return options; + } +} diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.puml new file mode 100644 index 00000000..5dccc880 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.puml @@ -0,0 +1,40 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +class MonBinDrv{ + + readonly communication!: MonBinDrvRuntime + + readonly feedbackMonitoring: FeedbackMonitoring +} +MonBinDrv *- MonBinDrvSpec +MonBinDrvSpec ..> MonBinDrvMockup : <> +MonBinDrv *- MonBinDrvMockup +MonBinDrv *- "1" MonBinDrvRuntime +MonBinDrv *- "1" FeedbackMonitoring + + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.spec.ts new file mode 100644 index 00000000..487590a7 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.spec.ts @@ -0,0 +1,129 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../../connection'; +import {MonBinDrv} from './MonBinDrv'; + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MockupServer} from '../../../../../../_utils'; +import {DataAssemblyControllerFactory} from '../../../../DataAssemblyControllerFactory'; +import {getMonBinDrvOptions, MonBinDrvMockup} from './MonBinDrv.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('MonBinDrv', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + dataAssemblyOptions = getMonBinDrvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create MonBinDrv',() => { + + const emptyOPCUAConnection = new OpcUaConnection(); + const dataAssemblyController = new MonBinDrv(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController.feedBackMonitoring).to.be.not.undefined; + }); + }); + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + let dataAssemblyController: MonBinDrv; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const monBinDrvMockup = new MonBinDrvMockup( mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + dataAssemblyOptions = monBinDrvMockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + + dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as MonBinDrv; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + expect((dataAssemblyController).communication.OSLevel.value).equal(0); + expect((dataAssemblyController).communication.WQC.value).equal(0); + + expect((dataAssemblyController).communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.ResetOp.value).equal(false); + expect(dataAssemblyController.communication.ResetAut.value).equal(false); + + expect(dataAssemblyController.communication.PermEn.value).equal(false); + expect(dataAssemblyController.communication.Permit.value).equal(false); + expect(dataAssemblyController.communication.IntlEn.value).equal(false); + expect(dataAssemblyController.communication.Interlock.value).equal(false); + expect(dataAssemblyController.communication.ProtEn.value).equal(false); + expect(dataAssemblyController.communication.Protect.value).equal(false); + + expect(dataAssemblyController.communication.SafePos.value).equal(false); + expect(dataAssemblyController.communication.SafePosAct.value).equal(false); + + expect(dataAssemblyController.communication.FwdAut.value).equal(false); + expect(dataAssemblyController.communication.FwdCtrl.value).equal(false); + expect(dataAssemblyController.communication.FwdEn.value).equal(false); + expect(dataAssemblyController.communication.FwdFbk.value).equal(false); + expect(dataAssemblyController.communication.FwdFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.FwdOp.value).equal(false); + + expect(dataAssemblyController.communication.RevAut.value).equal(false); + expect(dataAssemblyController.communication.RevCtrl.value).equal(false); + expect(dataAssemblyController.communication.RevEn.value).equal(false); + expect(dataAssemblyController.communication.RevFbk.value).equal(false); + expect(dataAssemblyController.communication.RevFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.RevOp.value).equal(false); + + expect(dataAssemblyController.communication.StopAut.value).equal(false); + expect(dataAssemblyController.communication.StopOp.value).equal(false); + expect(dataAssemblyController.communication.Trip.value).equal(false); + }).timeout(4000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.ts similarity index 84% rename from src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.ts rename to src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.ts index 0bbe2d86..f3ad635c 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/MonBinDrv.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/binDrv/monBinDrv/MonBinDrv.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,10 +24,10 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection} from '../../../../connection'; -import {FeedbackMonitoringRuntime} from '../../../_extensions'; -import {BinDrv, BinDrvRuntime} from './BinDrv'; -import {FeedbackMonitoring} from '../../../_extensions/feedbackMonitoringDA/FeedbackMonitoring'; +import {OpcUaConnection} from '../../../../../connection'; +import {FeedbackMonitoringRuntime} from '../../../../baseFunction'; +import {BinDrv, BinDrvRuntime} from '../BinDrv'; +import {FeedbackMonitoring} from '../../../../baseFunction/feedbackMonitoring/FeedbackMonitoring'; export type MonBinDrvRuntime = BinDrvRuntime & FeedbackMonitoringRuntime; diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/index.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/index.ts index 0ecaa566..dba3b393 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/drv/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/drv/index.ts @@ -1,5 +1,30 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './Drv'; export * from './anaDrv/AnaDrv'; export * from './binDrv/BinDrv'; -export * from './anaDrv/MonAnaDrv'; -export * from './binDrv/MonBinDrv'; +export * from './anaDrv/monAnaDrv/MonAnaDrv'; +export * from './binDrv/monBinDrv/MonBinDrv'; diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/index.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/index.ts index 22169e2b..520bb609 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './ActiveElement'; export * from './drv'; export * from './vlv'; diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.mockup.spec.ts index 9858f7f3..49b297d6 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.mockup.spec.ts @@ -1,55 +1,90 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {VlvMockup} from './Vlv.mockup'; +import {getVlvDataItemOptions, getVlvOptions, VlvMockup} from './Vlv.mockup'; import {MockupServer} from '../../../../_utils'; -import {BinDrvMockup} from '../drv/binDrv/BinDrv.mockup'; import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {VlvRuntime} from './Vlv'; chai.use(chaiAsPromised); const expect = chai.expect; describe('VlvMockup', () => { - describe('', () => { - let mockupServer: any; + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); - afterEach(async () => { - }); it('should create VlvMockup', async () => { - const mockup= new VlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new VlvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; + }); + it('static DataItemOptions', () => { + const options = getVlvDataItemOptions(1, 'Test') as VlvRuntime; + expect(Object.keys(options).length).to.equal(31); }); - it('getVlvMockupReferenceJSON()', () => { - const mockup = new VlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getVlvMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(31); - //TODO test more? + + it('static DataAssemblyOptions', () => { + const options = getVlvOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(33); }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new VlvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(33); + }); + }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: VlvMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new VlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new VlvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); afterEach(async () => { @@ -58,15 +93,15 @@ describe('VlvMockup', () => { }); it('set and get OpenOp', async () => { - await connection.writeOpcUaNode('Variable.OpenOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.OpenOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(true)); + await connection.writeNode('Variable.OpenOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.OpenOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(true)); }).timeout(3000); it('set and get CloseOp', async () => { - await connection.writeOpcUaNode('Variable.CloseOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.CloseOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(true)); + await connection.writeNode('Variable.CloseOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.CloseOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(true)); }).timeout(3000); //TODO get the rest diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.mockup.ts index b75ae321..5bf57528 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.mockup.ts @@ -24,91 +24,103 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getSourceModeDAMockupReferenceJSON} from '../../_extensions/sourceModeDA/SourceModeDA.mockup'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../_extensions/opModeDA/OpModeDA.mockup'; -import {getInterlockDAMockupReferenceJSON, InterlockDAMockup} from '../../_extensions/interlockDA/InterlockDA.mockup'; -import {getResetDAMockupReferenceJSON, ResetDAMockup} from '../../_extensions/resetDA/ResetDA.mockup'; -import {getActiveElementMockupReferenceJSON} from '../ActiveElement.mockup'; +import {getOpModeDataItemOptions, OpModeMockup} from '../../baseFunction/opMode/OpMode.mockup'; +import {getInterlockDataItemOptions, InterlockMockup} from '../../baseFunction/interlock/Interlock.mockup'; +import {getResetDataItemOptions, ResetMockup} from '../../baseFunction/reset/Reset.mockup'; +import {ActiveElementMockup, getActiveElementDataItemOptions} from '../ActiveElement.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../DataAssemblyController.mockup'; +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement'; + +function getVlvSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + SafePos: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SafePos`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + SafePosEn: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SafePosEn`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + SafePosAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SafePosAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + OpenAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.OpenAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + OpenFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.OpenFbk`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + OpenFbkCalc: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.OpenFbkCalc`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + OpenOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.OpenOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + CloseAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.CloseAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + CloseFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.CloseFbk`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + CloseFbkCalc: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.CloseFbkCalc`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + CloseOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.CloseOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} -export function getVlvMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +export function getVlvDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getActiveElementMockupReferenceJSON(namespace, objectBrowseName), - ...getOpModeDAMockupReferenceJSON(namespace,objectBrowseName), - ...getInterlockDAMockupReferenceJSON(namespace,objectBrowseName), - ...getResetDAMockupReferenceJSON(namespace,objectBrowseName), - SafePos: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SafePos`, - dataType: 'Boolean' - }, - SafePosEn: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SafePosEn`, - dataType: 'Boolean' - }, - SafePosAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SafePosAct`, - dataType: 'Boolean' - }, - OpenAut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.OpenAut`, - dataType: 'Boolean' - }, - OpenFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.OpenFbk`, - dataType: 'Boolean' - }, - OpenFbkCalc: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.OpenFbkCalc`, - dataType: 'Boolean' - }, - OpenOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.OpenOp`, - dataType: 'Boolean' - }, - CloseAut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.CloseAut`, - dataType: 'Boolean' - }, - CloseFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.CloseFbk`, - dataType: 'Boolean' - }, - CloseFbkCalc: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.CloseFbkCalc`, - dataType: 'Boolean' - }, - CloseOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.CloseOp`, - dataType: 'Boolean' - } - } + ...getActiveElementDataItemOptions(namespace, objectBrowseName), + ...getOpModeDataItemOptions(namespace, objectBrowseName), + ...getInterlockDataItemOptions(namespace, objectBrowseName), + ...getResetDataItemOptions(namespace, objectBrowseName), + ...getVlvSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } -export class VlvMockup { - public readonly name: string; - public wqc: WQCDAMockup; - public osLevel: OSLevelDAMockup; - public operationMode: OpModeDAMockup; - public interlock: InterlockDAMockup; - public reset: ResetDAMockup; +export function getVlvOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getVlvDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class VlvMockup extends ActiveElementMockup{ + + public operationMode: OpModeMockup; + public interlock: InterlockMockup; + public reset: ResetMockup; public safePos = false; public safePosEn = false; @@ -123,22 +135,12 @@ export class VlvMockup { public closeFbkCalc = false; public closeFbk = false; - protected mockupNode: UAObject; - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); - this.name = variableName; - - this.mockupNode = namespace.addObject({ - organizedBy: rootNode, - browseName: variableName - }); - - this.osLevel = new OSLevelDAMockup(namespace, this.mockupNode, this.name); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); - this.operationMode = new OpModeDAMockup(namespace,this.mockupNode,this.name); - this.interlock= new InterlockDAMockup(namespace,this.mockupNode,this.name); - this.reset= new ResetDAMockup(namespace,this.mockupNode,this.name); + this.operationMode = new OpModeMockup(namespace,this.mockupNode,this.name); + this.interlock= new InterlockMockup(namespace,this.mockupNode,this.name); + this.reset= new ResetMockup(namespace,this.mockupNode,this.name); namespace.addVariable({ componentOf: this.mockupNode, @@ -271,9 +273,16 @@ export class VlvMockup { }); } - public getVlvMockupJSON() { - return getVlvMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.operationMode.getDataItemOptions(), + ...this.reset.getDataItemOptions(), + ...this.interlock.getDataItemOptions(), + ...getVlvSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.puml index 69e665ce..2cd88836 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.puml +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include anaVlv/AnaVlv.puml @@ -7,7 +32,7 @@ class Vlv{ + readonly communication!: VlvRuntime + readonly reset: Reset + readonly interlock: Interlock - + readonly opMode: OpModeController + + readonly opMode: OpMode } Vlv *- VlvSpec @@ -16,7 +41,7 @@ Vlv *- VlvMockup Vlv *- VlvRuntime Vlv *- Reset Vlv *- Interlock -Vlv *- OpModeController +Vlv *- OpMode Vlv <|-- AnaVlv Vlv <|-- BinVlv diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.spec.ts index 14e3d0e9..c98e8c54 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.spec.ts @@ -29,62 +29,58 @@ import {Vlv} from './Vlv'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/monbinvlv.json'; import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {VlvMockup} from './Vlv.mockup'; +import {getVlvOptions, VlvMockup} from './Vlv.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('Vlv', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/', - dataItems: baseDataAssemblyOptions - }; - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getVlvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create Vlv', () => { - const da1 = new Vlv(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.be.not.undefined; - expect(da1.osLevel).to.be.not.undefined; - expect(da1.wqc).to.be.not.undefined; - expect(da1.reset).to.be.not.undefined; - expect(da1.opMode).to.be.not.undefined; - expect(da1.interlock).to.be.not.undefined; - - expect(da1.communication.SafePos).to.be.not.undefined; - expect(da1.communication.SafePosEn).to.be.not.undefined; - expect(da1.communication.SafePosAct).to.be.not.undefined; - expect(da1.communication.OpenAut).to.be.not.undefined; - expect(da1.communication.OpenFbk).to.be.not.undefined; - expect(da1.communication.OpenFbkCalc).to.be.not.undefined; - expect(da1.communication.OpenOp).to.be.not.undefined; - expect(da1.communication.CloseAut).to.be.not.undefined; - expect(da1.communication.CloseFbk).to.be.not.undefined; - expect(da1.communication.CloseFbkCalc).to.be.not.undefined; - expect(da1.communication.CloseOp).to.be.not.undefined; + const dataAssemblyController = new Vlv(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.osLevel).to.be.not.undefined; + expect(dataAssemblyController.wqc).to.be.not.undefined; + expect(dataAssemblyController.reset).to.be.not.undefined; + expect(dataAssemblyController.opMode).to.be.not.undefined; + expect(dataAssemblyController.interlock).to.be.not.undefined; + + expect(dataAssemblyController.communication.SafePos).to.be.not.undefined; + expect(dataAssemblyController.communication.SafePosEn).to.be.not.undefined; + expect(dataAssemblyController.communication.SafePosAct).to.be.not.undefined; + expect(dataAssemblyController.communication.OpenAut).to.be.not.undefined; + expect(dataAssemblyController.communication.OpenFbk).to.be.not.undefined; + expect(dataAssemblyController.communication.OpenFbkCalc).to.be.not.undefined; + expect(dataAssemblyController.communication.OpenOp).to.be.not.undefined; + expect(dataAssemblyController.communication.CloseAut).to.be.not.undefined; + expect(dataAssemblyController.communication.CloseFbk).to.be.not.undefined; + expect(dataAssemblyController.communication.CloseFbkCalc).to.be.not.undefined; + expect(dataAssemblyController.communication.CloseOp).to.be.not.undefined; }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: VlvMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new VlvMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const vlvMockup = new VlvMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = vlvMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -95,53 +91,47 @@ describe('Vlv', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new Vlv(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.OSLevel.value).equal(0); - expect(da1.communication.WQC.value).equal(0); - - expect(da1.communication.PermEn.value).equal(false); - expect(da1.communication.Permit.value).equal(false); - expect(da1.communication.IntlEn.value).equal(false); - expect(da1.communication.Interlock.value).equal(false); - expect(da1.communication.ProtEn.value).equal(false); - expect(da1.communication.Protect.value).equal(false); - - expect(da1.communication.ResetAut.value).equal(false); - expect(da1.communication.ResetOp.value).equal(false); - - expect(da1.communication.StateChannel.value).equal(false); - expect(da1.communication.StateOffAut.value).equal(false); - expect(da1.communication.StateOpAut.value).equal(false); - expect(da1.communication.StateAutAut.value).equal(false); - expect(da1.communication.StateOffOp.value).equal(false); - expect(da1.communication.StateOpOp.value).equal(false); - expect(da1.communication.StateAutOp.value).equal(false); - expect(da1.communication.StateOpAct.value).equal(false); - expect(da1.communication.StateAutAct.value).equal(false); - expect(da1.communication.StateOffAct.value).equal(true); - - expect(da1.communication.SafePos.value).equal(false); - expect(da1.communication.SafePosEn.value).equal(false); - expect(da1.communication.SafePosAct.value).equal(false); - expect(da1.communication.OpenAut.value).equal(false); - expect(da1.communication.OpenFbk.value).equal(false); - expect(da1.communication.OpenFbkCalc.value).equal(false); - expect(da1.communication.OpenOp.value).equal(false); - expect(da1.communication.CloseAut.value).equal(false); - expect(da1.communication.CloseFbk.value).equal(false); - expect(da1.communication.CloseFbkCalc.value).equal(false); - expect(da1.communication.CloseOp.value).equal(false); + + const dataAssemblyController = new Vlv(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.OSLevel.value).equal(0); + expect(dataAssemblyController.communication.WQC.value).equal(0); + + expect(dataAssemblyController.communication.PermEn.value).equal(false); + expect(dataAssemblyController.communication.Permit.value).equal(false); + expect(dataAssemblyController.communication.IntlEn.value).equal(false); + expect(dataAssemblyController.communication.Interlock.value).equal(false); + expect(dataAssemblyController.communication.ProtEn.value).equal(false); + expect(dataAssemblyController.communication.Protect.value).equal(false); + + expect(dataAssemblyController.communication.ResetAut.value).equal(false); + expect(dataAssemblyController.communication.ResetOp.value).equal(false); + + expect(dataAssemblyController.communication.StateChannel.value).equal(false); + expect(dataAssemblyController.communication.StateOffAut.value).equal(false); + expect(dataAssemblyController.communication.StateOpAut.value).equal(false); + expect(dataAssemblyController.communication.StateAutAut.value).equal(false); + expect(dataAssemblyController.communication.StateOffOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpOp.value).equal(false); + expect(dataAssemblyController.communication.StateAutOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpAct.value).equal(false); + expect(dataAssemblyController.communication.StateAutAct.value).equal(false); + expect(dataAssemblyController.communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.SafePos.value).equal(false); + expect(dataAssemblyController.communication.SafePosEn.value).equal(false); + expect(dataAssemblyController.communication.SafePosAct.value).equal(false); + expect(dataAssemblyController.communication.OpenAut.value).equal(false); + expect(dataAssemblyController.communication.OpenFbk.value).equal(false); + expect(dataAssemblyController.communication.OpenFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.OpenOp.value).equal(false); + expect(dataAssemblyController.communication.CloseAut.value).equal(false); + expect(dataAssemblyController.communication.CloseFbk.value).equal(false); + expect(dataAssemblyController.communication.CloseFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.CloseOp.value).equal(false); }).timeout(5000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.ts index c6d93f5a..97f2c6d5 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/Vlv.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,53 +24,51 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; -import {InterlockRuntime, OpModeController, OpModeRuntime, ResetRuntime} from '../../_extensions'; +import {OpcUaConnection, DataItem} from '../../../connection'; +import {Interlock, InterlockRuntime, OpMode, OpModeRuntime, Reset, ResetRuntime} from '../../baseFunction'; import {ActiveElement, ActiveElementRuntime} from '../ActiveElement'; -import {Reset} from '../../_extensions/resetDA/Reset'; -import {Interlock} from '../../_extensions/interlockDA/Interlock'; export type VlvRuntime = ActiveElementRuntime & OpModeRuntime & InterlockRuntime & ResetRuntime & { - SafePos: OpcUaDataItem; - SafePosEn: OpcUaDataItem; - SafePosAct: OpcUaDataItem; + SafePos: DataItem; + SafePosEn: DataItem; + SafePosAct: DataItem; - OpenAut: OpcUaDataItem; - OpenFbk: OpcUaDataItem; - OpenFbkCalc: OpcUaDataItem; - OpenOp: OpcUaDataItem; + OpenAut: DataItem; + OpenFbk: DataItem; + OpenFbkCalc: DataItem; + OpenOp: DataItem; - CloseAut: OpcUaDataItem; - CloseFbk: OpcUaDataItem; - CloseFbkCalc: OpcUaDataItem; - CloseOp: OpcUaDataItem; + CloseAut: DataItem; + CloseFbk: DataItem; + CloseFbkCalc: DataItem; + CloseOp: DataItem; }; export class Vlv extends ActiveElement { public readonly communication!: VlvRuntime; public readonly reset: Reset; public readonly interlock: Interlock; - public readonly opMode: OpModeController; + public readonly opMode: OpMode; constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); this.reset = new Reset(this); this.interlock = new Interlock(this); - this.opMode = new OpModeController(this); + this.opMode = new OpMode(this); - this.communication.SafePos = this.createDataItem('SafePos', 'read', 'boolean'); - this.communication.SafePosEn = this.createDataItem('SafePosEn', 'read', 'boolean'); - this.communication.SafePosAct = this.createDataItem('SafePosAct', 'read', 'boolean'); + this.communication.SafePos = this.createDataItem('SafePos', 'boolean'); + this.communication.SafePosEn = this.createDataItem('SafePosEn', 'boolean'); + this.communication.SafePosAct = this.createDataItem('SafePosAct', 'boolean'); - this.communication.OpenAut = this.createDataItem('OpenAut', 'read', 'boolean'); - this.communication.OpenFbk = this.createDataItem('OpenFbk', 'read', 'boolean'); - this.communication.OpenFbkCalc = this.createDataItem('OpenFbkCalc', 'read', 'boolean'); - this.communication.OpenOp = this.createDataItem('OpenOp', 'write', 'boolean'); + this.communication.OpenAut = this.createDataItem('OpenAut', 'boolean'); + this.communication.OpenFbk = this.createDataItem('OpenFbk', 'boolean'); + this.communication.OpenFbkCalc = this.createDataItem('OpenFbkCalc', 'boolean'); + this.communication.OpenOp = this.createDataItem('OpenOp', 'boolean', 'write'); - this.communication.CloseAut = this.createDataItem('CloseAut', 'read', 'boolean'); - this.communication.CloseFbk = this.createDataItem('CloseFbk', 'read', 'boolean'); - this.communication.CloseFbkCalc = this.createDataItem('CloseFbkCalc', 'read', 'boolean'); - this.communication.CloseOp = this.createDataItem('CloseOp', 'write', 'boolean'); + this.communication.CloseAut = this.createDataItem('CloseAut', 'boolean'); + this.communication.CloseFbk = this.createDataItem('CloseFbk', 'boolean'); + this.communication.CloseFbkCalc = this.createDataItem('CloseFbkCalc', 'boolean'); + this.communication.CloseOp = this.createDataItem('CloseOp', 'boolean', 'write'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.mockup.spec.ts index 1a4b1020..877a5074 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.mockup.spec.ts @@ -1,65 +1,102 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {AnaVlvMockup} from './AnaVlv.mockup'; +import {AnaVlvMockup, getAnaVlvDataItemOptions, getAnaVlvOptions} from './AnaVlv.mockup'; import {MockupServer} from '../../../../../_utils'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaVlvRuntime} from './AnaVlv'; chai.use(chaiAsPromised); const expect = chai.expect; describe('AnaVlvMockup', () => { - describe('', () => { - let mockupServer: any; + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); + it('should create AnaVlvMockup', async () => { - const mockup= new AnaVlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new AnaVlvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; expect(mockup.sourceModeMockup).to.not.be.undefined; }); - it('getAnaAnaVlvMockupReferenceJSON()', () => { - const mockup = new AnaVlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getAnaVlvMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(51); - //TODO test more? + + it('static DataItemOptions', () => { + const options = getAnaVlvDataItemOptions(2, 'Test') as AnaVlvRuntime; + expect(Object.keys(options).length).to.equal(51); + }); + + it('static DataAssemblyOptions', () => { + const options = getAnaVlvOptions(2, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(53); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new AnaVlvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(53); }); }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: AnaVlvMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new AnaVlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new AnaVlvMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); + afterEach(async () => { await connection.disconnect(); await mockupServer.shutdown(); }); it('set and get PosMan', async () => { - await connection.writeOpcUaNode('Variable.PosMan', namespaceUrl, 1.1, 'Double'); - await connection.readOpcUaNode('Variable.PosMan', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1.1)); + await connection.writeNode('Variable.PosMan', mockupServer.nameSpaceUri, 1.1, 'Double'); + await connection.readNode('Variable.PosMan', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1.1)); }).timeout(3000); - - //TODO get the rest }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.mockup.ts index 28b1ced4..bfc3aac4 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.mockup.ts @@ -24,98 +24,106 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import { - getSourceModeDAMockupReferenceJSON, - SourceModeDAMockup -} from '../../../_extensions/sourceModeDA/SourceModeDA.mockup'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../../_extensions/opModeDA/OpModeDA.mockup'; -import {getInterlockDAMockupReferenceJSON, InterlockDAMockup} from '../../../_extensions/interlockDA/InterlockDA.mockup'; -import {getResetDAMockupReferenceJSON, ResetDAMockup} from '../../../_extensions/resetDA/ResetDA.mockup'; -import {getActiveElementMockupReferenceJSON} from '../../ActiveElement.mockup'; -import {getVlvMockupReferenceJSON, VlvMockup} from '../Vlv.mockup'; +import {getSourceModeDataItemOptions, SourceModeMockup} from '../../../baseFunction/sourceMode/SourceMode.mockup'; +import {getVlvDataItemOptions, VlvMockup} from '../Vlv.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/AnaVlv'; + +function getAnaVlvSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + Pos: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Pos`, + dataType: 'Float' + } as OpcUaNodeOptions, + PosFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosFbk`, + dataType: 'Float' + } as OpcUaNodeOptions, + PosFbkCalc: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosFbkCalc`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + PosRbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosRbk`, + dataType: 'Float' + } as OpcUaNodeOptions, + PosInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosInt`, + dataType: 'Float' + } as OpcUaNodeOptions, + PosMan: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosMan`, + dataType: 'Float' + } as OpcUaNodeOptions, + PosUnit: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosUnit`, + dataType: 'Int16' + } as OpcUaNodeOptions, + PosSclMin: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosSclMin`, + dataType: 'Float' + } as OpcUaNodeOptions, + PosSclMax: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosSclMax`, + dataType: 'Float' + } as OpcUaNodeOptions, + PosMin: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosMin`, + dataType: 'Float' + } as OpcUaNodeOptions, + PosMax: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosMax`, + dataType: 'Float' + } as OpcUaNodeOptions, + OpenAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.OpenAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + CloseAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.CloseAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} -export function getAnaVlvMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +export function getAnaVlvDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getVlvMockupReferenceJSON(namespace, objectBrowseName), - ...getSourceModeDAMockupReferenceJSON(namespace,objectBrowseName), - Pos: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Pos`, - dataType: 'Float' - }, - PosFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosFbk`, - dataType: 'Float' - }, - PosFbkCalc: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosFbkCalc`, - dataType: 'Boolean' - }, - PosRbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosRbk`, - dataType: 'Float' - }, - PosInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosInt`, - dataType: 'Float' - }, - PosMan: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosMan`, - dataType: 'Float' - }, - PosUnit: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosUnit`, - dataType: 'Int16' - }, - PosSclMin: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosSclMin`, - dataType: 'Float' - }, - PosSclMax: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosSclMax`, - dataType: 'Float' - }, - PosMin: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosMin`, - dataType: 'Float' - }, - PosMax: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosMax`, - dataType: 'Float' - }, - OpenAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.OpenAct`, - dataType: 'Boolean' - }, - CloseAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.CloseAct`, - dataType: 'Boolean' - } - } + ...getVlvDataItemOptions(namespace, objectBrowseName), + ...getSourceModeDataItemOptions(namespace, objectBrowseName), + ...getAnaVlvSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getAnaVlvOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getAnaVlvDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class AnaVlvMockup extends VlvMockup{ - public sourceModeMockup: SourceModeDAMockup; + public sourceModeMockup: SourceModeMockup; public posSclMin = 0; public posSclMax = 0; @@ -135,7 +143,7 @@ export class AnaVlvMockup extends VlvMockup{ super(namespace, rootNode, variableName); - this.sourceModeMockup = new SourceModeDAMockup(namespace, rootNode, variableName); + this.sourceModeMockup = new SourceModeMockup(namespace, rootNode, variableName); namespace.addVariable({ componentOf: this.mockupNode, @@ -240,7 +248,7 @@ export class AnaVlvMockup extends VlvMockup{ get: (): Variant => { return new Variant({dataType: DataType.Double, value: this.posMan}); }, - set: (variant: Variant) => { + set: (variant: Variant): StatusCodes => { this.posMan = parseFloat(variant.value); return StatusCodes.Good; }, @@ -292,9 +300,14 @@ export class AnaVlvMockup extends VlvMockup{ }); } - public getAnaVlvMockupJSON() { - return getAnaVlvMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.sourceModeMockup.getDataItemOptions(), + ...getAnaVlvSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.puml index 474fe2b2..c0690be9 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.puml +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.puml @@ -1,6 +1,31 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include MonAnaVlv.puml +!include monAnaVlv/MonAnaVlv.puml class AnaVlv{ + readonly communication!: AnaVlvRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.spec.ts index 3dd8a4c9..0747db9e 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.spec.ts @@ -28,66 +28,59 @@ import {AnaVlv} from './AnaVlv'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/monanavlv.json'; import {MockupServer} from '../../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; -import {AnaVlvMockup} from './AnaVlv.mockup'; +import {AnaVlvMockup, getAnaVlvOptions} from './AnaVlv.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('AnaVlv', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaVlv', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getAnaVlvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create AnaVlv', () => { - const da1 = new AnaVlv(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.not.be.undefined; - - expect(da1.sourceMode).to.not.be.undefined; - expect(da1.interlock).to.not.be.undefined; - expect(da1.reset).to.not.be.undefined; - expect(da1.opMode).to.not.be.undefined; - - expect(da1.communication.Pos).to.not.be.undefined; - expect(da1.communication.PosFbk).to.not.be.undefined; - expect(da1.communication.PosFbkCalc).to.not.be.undefined; - expect(da1.communication.PosRbk).to.not.be.undefined; - expect(da1.communication.PosInt).to.not.be.undefined; - expect(da1.communication.PosMan).to.not.be.undefined; - expect(da1.communication.PosUnit).to.not.be.undefined; - expect(da1.communication.PosSclMax).to.not.be.undefined; - expect(da1.communication.PosSclMin).to.not.be.undefined; - expect(da1.communication.PosMin).to.not.be.undefined; - expect(da1.communication.PosMax).to.not.be.undefined; - expect(da1.communication.OpenAct).to.not.be.undefined; - expect(da1.communication.CloseAct).to.not.be.undefined; - - // rest is tested in Vlv class + const dataAssemblyController = new AnaVlv(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController).to.not.be.undefined; + + expect(dataAssemblyController.sourceMode).to.not.be.undefined; + expect(dataAssemblyController.interlock).to.not.be.undefined; + expect(dataAssemblyController.reset).to.not.be.undefined; + expect(dataAssemblyController.opMode).to.not.be.undefined; + + expect(dataAssemblyController.communication.Pos).to.not.be.undefined; + expect(dataAssemblyController.communication.PosFbk).to.not.be.undefined; + expect(dataAssemblyController.communication.PosFbkCalc).to.not.be.undefined; + expect(dataAssemblyController.communication.PosRbk).to.not.be.undefined; + expect(dataAssemblyController.communication.PosInt).to.not.be.undefined; + expect(dataAssemblyController.communication.PosMan).to.not.be.undefined; + expect(dataAssemblyController.communication.PosUnit).to.not.be.undefined; + expect(dataAssemblyController.communication.PosSclMax).to.not.be.undefined; + expect(dataAssemblyController.communication.PosSclMin).to.not.be.undefined; + expect(dataAssemblyController.communication.PosMin).to.not.be.undefined; + expect(dataAssemblyController.communication.PosMax).to.not.be.undefined; + expect(dataAssemblyController.communication.OpenAct).to.not.be.undefined; + expect(dataAssemblyController.communication.CloseAct).to.not.be.undefined; }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: AnaVlvMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new AnaVlvMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const anaVlvMockup = new AnaVlvMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = anaVlvMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -98,75 +91,69 @@ describe('AnaVlv', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new AnaVlv(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.OSLevel.value).equal(0); - expect(da1.communication.WQC.value).equal(0); - - expect(da1.communication.PermEn.value).equal(false); - expect(da1.communication.Permit.value).equal(false); - expect(da1.communication.IntlEn.value).equal(false); - expect(da1.communication.Interlock.value).equal(false); - expect(da1.communication.ProtEn.value).equal(false); - expect(da1.communication.Protect.value).equal(false); - - expect(da1.communication.ResetAut.value).equal(false); - expect(da1.communication.ResetOp.value).equal(false); - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcManAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcManOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcManAct.value).equal(false); - - expect(da1.communication.StateChannel.value).equal(false); - expect(da1.communication.StateOffAut.value).equal(false); - expect(da1.communication.StateOpAut.value).equal(false); - expect(da1.communication.StateAutAut.value).equal(false); - expect(da1.communication.StateOffOp.value).equal(false); - expect(da1.communication.StateOpOp.value).equal(false); - expect(da1.communication.StateAutOp.value).equal(false); - expect(da1.communication.StateOpAct.value).equal(false); - expect(da1.communication.StateAutAct.value).equal(false); - expect(da1.communication.StateOffAct.value).equal(true); - - expect(da1.communication.SafePos.value).equal(false); - expect(da1.communication.SafePosEn.value).equal(false); - expect(da1.communication.SafePosAct.value).equal(false); - expect(da1.communication.OpenAut.value).equal(false); - expect(da1.communication.OpenFbk.value).equal(false); - expect(da1.communication.OpenFbkCalc.value).equal(false); - expect(da1.communication.OpenOp.value).equal(false); - expect(da1.communication.CloseAut.value).equal(false); - expect(da1.communication.CloseFbk.value).equal(false); - expect(da1.communication.CloseFbkCalc.value).equal(false); - expect(da1.communication.CloseOp.value).equal(false); - - expect(da1.communication.Pos.value).equal(0); - expect(da1.communication.PosFbk.value).equal(0); - expect(da1.communication.PosFbkCalc.value).equal(false); - expect(da1.communication.PosRbk.value).equal(0); - expect(da1.communication.PosInt.value).equal(0); - expect(da1.communication.PosMan.value).equal(0); - expect(da1.communication.PosUnit.value).equal(0); - expect(da1.communication.PosSclMax.value).equal(0); - expect(da1.communication.PosSclMin.value).equal(0); - expect(da1.communication.PosMin.value).equal(0); - expect(da1.communication.PosMax.value).equal(0); - expect(da1.communication.OpenAct.value).equal(false); - expect(da1.communication.CloseAct.value).equal(false); + + const dataAssemblyController = new AnaVlv(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.OSLevel.value).equal(0); + expect(dataAssemblyController.communication.WQC.value).equal(0); + + expect(dataAssemblyController.communication.PermEn.value).equal(false); + expect(dataAssemblyController.communication.Permit.value).equal(false); + expect(dataAssemblyController.communication.IntlEn.value).equal(false); + expect(dataAssemblyController.communication.Interlock.value).equal(false); + expect(dataAssemblyController.communication.ProtEn.value).equal(false); + expect(dataAssemblyController.communication.Protect.value).equal(false); + + expect(dataAssemblyController.communication.ResetAut.value).equal(false); + expect(dataAssemblyController.communication.ResetOp.value).equal(false); + + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcManAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcManOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(false); + expect(dataAssemblyController.communication.SrcManAct.value).equal(false); + + expect(dataAssemblyController.communication.StateChannel.value).equal(false); + expect(dataAssemblyController.communication.StateOffAut.value).equal(false); + expect(dataAssemblyController.communication.StateOpAut.value).equal(false); + expect(dataAssemblyController.communication.StateAutAut.value).equal(false); + expect(dataAssemblyController.communication.StateOffOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpOp.value).equal(false); + expect(dataAssemblyController.communication.StateAutOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpAct.value).equal(false); + expect(dataAssemblyController.communication.StateAutAct.value).equal(false); + expect(dataAssemblyController.communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.SafePos.value).equal(false); + expect(dataAssemblyController.communication.SafePosEn.value).equal(false); + expect(dataAssemblyController.communication.SafePosAct.value).equal(false); + expect(dataAssemblyController.communication.OpenAut.value).equal(false); + expect(dataAssemblyController.communication.OpenFbk.value).equal(false); + expect(dataAssemblyController.communication.OpenFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.OpenOp.value).equal(false); + expect(dataAssemblyController.communication.CloseAut.value).equal(false); + expect(dataAssemblyController.communication.CloseFbk.value).equal(false); + expect(dataAssemblyController.communication.CloseFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.CloseOp.value).equal(false); + + expect(dataAssemblyController.communication.Pos.value).equal(0); + expect(dataAssemblyController.communication.PosFbk.value).equal(0); + expect(dataAssemblyController.communication.PosFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.PosRbk.value).equal(0); + expect(dataAssemblyController.communication.PosInt.value).equal(0); + expect(dataAssemblyController.communication.PosMan.value).equal(0); + expect(dataAssemblyController.communication.PosUnit.value).equal(0); + expect(dataAssemblyController.communication.PosSclMax.value).equal(0); + expect(dataAssemblyController.communication.PosSclMin.value).equal(0); + expect(dataAssemblyController.communication.PosMin.value).equal(0); + expect(dataAssemblyController.communication.PosMax.value).equal(0); + expect(dataAssemblyController.communication.OpenAct.value).equal(false); + expect(dataAssemblyController.communication.CloseAct.value).equal(false); }).timeout(5000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.ts index 0877231d..08e6ab5a 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/AnaVlv.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,26 +24,25 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; +import {OpcUaConnection, DataItem} from '../../../../connection'; import {Vlv, VlvRuntime} from '../Vlv'; -import {SourceModeRuntime} from '../../../_extensions'; -import {SourceModeController} from '../../../_extensions/sourceModeDA/SourceModeController'; +import {SourceModeController, SourceModeRuntime} from '../../../baseFunction'; export type AnaVlvRuntime = VlvRuntime & SourceModeRuntime & { - Pos: OpcUaDataItem; - PosFbk: OpcUaDataItem; - PosFbkCalc: OpcUaDataItem; - PosRbk: OpcUaDataItem; - PosInt: OpcUaDataItem; - PosMan: OpcUaDataItem; - PosUnit: OpcUaDataItem; - PosSclMin: OpcUaDataItem; - PosSclMax: OpcUaDataItem; - PosMin: OpcUaDataItem; - PosMax: OpcUaDataItem; + Pos: DataItem; + PosFbk: DataItem; + PosFbkCalc: DataItem; + PosRbk: DataItem; + PosInt: DataItem; + PosMan: DataItem; + PosUnit: DataItem; + PosSclMin: DataItem; + PosSclMax: DataItem; + PosMin: DataItem; + PosMax: DataItem; - OpenAct: OpcUaDataItem; - CloseAct: OpcUaDataItem; + OpenAct: DataItem; + CloseAct: DataItem; }; export class AnaVlv extends Vlv { @@ -55,21 +53,20 @@ export class AnaVlv extends Vlv { super(options, connection); this.sourceMode = new SourceModeController(this); - - this.communication.Pos = this.createDataItem('Pos', 'read', 'number'); - this.communication.PosFbk = this.createDataItem('PosFbk', 'read', 'number'); - this.communication.PosFbkCalc = this.createDataItem('PosFbkCalc', 'read', 'boolean'); - this.communication.PosRbk = this.createDataItem('PosRbk', 'read', 'number'); - this.communication.PosInt = this.createDataItem('PosInt', 'read', 'number'); - this.communication.PosMan = this.createDataItem('PosMan', 'read', 'number'); - this.communication.PosUnit = this.createDataItem('PosUnit', 'read', 'number'); - this.communication.PosSclMin = this.createDataItem('PosSclMin', 'read', 'number'); - this.communication.PosSclMax = this.createDataItem('PosSclMax', 'read', 'number'); - this.communication.PosMin = this.createDataItem('PosMin', 'read', 'number'); - this.communication.PosMax = this.createDataItem('PosMax', 'read', 'number'); + this.communication.Pos = this.createDataItem('Pos', 'number'); + this.communication.PosFbk = this.createDataItem('PosFbk', 'number'); + this.communication.PosFbkCalc = this.createDataItem('PosFbkCalc','boolean'); + this.communication.PosRbk = this.createDataItem('PosRbk', 'number'); + this.communication.PosInt = this.createDataItem('PosInt','number'); + this.communication.PosMan = this.createDataItem('PosMan', 'number'); + this.communication.PosUnit = this.createDataItem('PosUnit', 'number'); + this.communication.PosSclMin = this.createDataItem('PosSclMin', 'number'); + this.communication.PosSclMax = this.createDataItem('PosSclMax', 'number'); + this.communication.PosMin = this.createDataItem('PosMin', 'number'); + this.communication.PosMax = this.createDataItem('PosMax', 'number'); - this.communication.OpenAct = this.createDataItem('OpenAct', 'read', 'boolean'); - this.communication.CloseAct = this.createDataItem('CloseAct', 'read', 'boolean'); + this.communication.OpenAct = this.createDataItem('OpenAct', 'boolean'); + this.communication.CloseAct = this.createDataItem('CloseAct', 'boolean'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.mockup.spec.ts deleted file mode 100644 index e773863b..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.mockup.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MonAnaVlvMockup} from './MonAnaVlv.mockup'; -import {MockupServer} from '../../../../../_utils'; -import {AnaVlvMockup} from './AnaVlv.mockup'; -import {OpcUaConnection} from '../../../../connection'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('MonAnaVlvMockup', () => { - - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - afterEach(async () => { - - }); - it('should create MonAnaVlvMockup', async () => { - const mockup= new MonAnaVlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - - }); - it('getMonAnaVlvMockupReferenceJSON()', () => { - const mockup = new MonAnaVlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getMonAnaVlvMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(61); - //TODO test more - }); - }); - - describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: MonAnaVlvMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new MonAnaVlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it(' get ...', async () => { - //TODO get the rest - }).timeout(3000); - - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.puml deleted file mode 100644 index 88d5aa3e..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class MonAnaVlv{ - + readonly communication!: MonAnaVlvRuntime - + readonly feedbackMonitoring: FeedbackMonitoring - } -MonAnaVlv *- MonAnaVlvSpec -MonAnaVlvSpec ..> MonAnaVlvMockup : <> -MonAnaVlv *- MonAnaVlvMockup -MonAnaVlv *- FeedbackMonitoring - - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.spec.ts deleted file mode 100644 index b0a51c74..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.spec.ts +++ /dev/null @@ -1,162 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../../connection'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/monanavlv.json'; -import {MockupServer} from '../../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; -import {MonAnaVlvMockup} from './MonAnaVlv.mockup'; -import {MonAnaVlv} from './MonAnaVlv'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; -const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/MonAnaMonAnaVlv', - dataItems: baseDataAssemblyOptions -}; - -describe('MonAnaVlv', () => { - describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create MonAnaMonAnaVlv', () => { - - const da1 = new MonAnaVlv(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.not.be.undefined; - expect(da1.feedBackMonitoring).to.not.be.undefined; - expect(da1.communication.PosReachedFbk).to.not.be.undefined; - expect(da1.communication.PosTolerance).to.not.be.undefined; - expect(da1.communication.MonPosTi).to.not.be.undefined; - expect(da1.communication.MonPosErr).to.not.be.undefined; - }); - }); - - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - let mockup: MonAnaVlvMockup; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new MonAnaVlvMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new MonAnaVlv(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.OSLevel.value).equal(0); - expect(da1.communication.WQC.value).equal(0); - - expect(da1.communication.PermEn.value).equal(false); - expect(da1.communication.Permit.value).equal(false); - expect(da1.communication.IntlEn.value).equal(false); - expect(da1.communication.Interlock.value).equal(false); - expect(da1.communication.ProtEn.value).equal(false); - expect(da1.communication.Protect.value).equal(false); - - expect(da1.communication.ResetAut.value).equal(false); - expect(da1.communication.ResetOp.value).equal(false); - - expect(da1.communication.StateChannel.value).equal(false); - expect(da1.communication.StateOffAut.value).equal(false); - expect(da1.communication.StateOpAut.value).equal(false); - expect(da1.communication.StateAutAut.value).equal(false); - expect(da1.communication.StateOffOp.value).equal(false); - expect(da1.communication.StateOpOp.value).equal(false); - expect(da1.communication.StateAutOp.value).equal(false); - expect(da1.communication.StateOpAct.value).equal(false); - expect(da1.communication.StateAutAct.value).equal(false); - expect(da1.communication.StateOffAct.value).equal(true); - - expect(da1.communication.SafePos.value).equal(false); - expect(da1.communication.SafePosEn.value).equal(false); - expect(da1.communication.SafePosAct.value).equal(false); - expect(da1.communication.OpenAut.value).equal(false); - expect(da1.communication.OpenFbk.value).equal(false); - expect(da1.communication.OpenFbkCalc.value).equal(false); - expect(da1.communication.OpenOp.value).equal(false); - expect(da1.communication.CloseAut.value).equal(false); - expect(da1.communication.CloseFbk.value).equal(false); - expect(da1.communication.CloseFbkCalc.value).equal(false); - expect(da1.communication.CloseOp.value).equal(false); - - expect(da1.communication.Pos.value).equal(0); - expect(da1.communication.PosFbk.value).equal(0); - expect(da1.communication.PosFbkCalc.value).equal(false); - expect(da1.communication.PosRbk.value).equal(0); - expect(da1.communication.PosInt.value).equal(0); - expect(da1.communication.PosMan.value).equal(0); - expect(da1.communication.PosUnit.value).equal(0); - expect(da1.communication.PosSclMax.value).equal(0); - expect(da1.communication.PosSclMin.value).equal(0); - expect(da1.communication.PosMin.value).equal(0); - expect(da1.communication.PosMax.value).equal(0); - expect(da1.communication.OpenAct.value).equal(false); - expect(da1.communication.CloseAct.value).equal(false); - - expect(da1.communication.MonEn.value).equal(false); - expect(da1.communication.MonSafePos.value).equal(false); - expect(da1.communication.MonStatErr.value).equal(false); - expect(da1.communication.MonDynErr.value).equal(false); - expect(da1.communication.MonStatTi.value).equal(0); - expect(da1.communication.MonDynTi.value).equal(0); - - expect(da1.communication.PosReachedFbk.value).equal(false); - expect(da1.communication.PosTolerance.value).equal(0); - expect(da1.communication.MonPosTi.value).equal(0); - expect(da1.communication.MonPosErr.value).equal(false); - - }).timeout(5000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.mockup.spec.ts new file mode 100644 index 00000000..96d26292 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.mockup.spec.ts @@ -0,0 +1,95 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {getMonAnaVlvDataItemOptions, getMonAnaVlvOptions, MonAnaVlvMockup} from './MonAnaVlv.mockup'; +import {MockupServer} from '../../../../../../_utils'; +import {OpcUaConnection} from '../../../../../connection'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MonAnaVlvRuntime} from './MonAnaVlv'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('MonAnaVlvMockup', () => { + + describe('', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create MonAnaVlvMockup', async () => { + const mockup= new MonAnaVlvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + + }); + + it('static DataItemOptions', () => { + const options = getMonAnaVlvDataItemOptions(1, 'Test') as MonAnaVlvRuntime; + expect(Object.keys(options).length).to.equal(61); + }); + + it('static DataAssemblyOptions', () => { + const options = getMonAnaVlvOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(63); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new MonAnaVlvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(63); + }); + }); + + describe('dynamic', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(5000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + new MonAnaVlvMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.mockup.ts similarity index 53% rename from src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.mockup.ts index 74100e44..888a0bba 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.mockup.ts @@ -23,54 +23,64 @@ * SOFTWARE. */ -import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getSourceModeDAMockupReferenceJSON} from '../../../_extensions/sourceModeDA/SourceModeDA.mockup'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../../_extensions/opModeDA/OpModeDA.mockup'; -import {getInterlockDAMockupReferenceJSON, InterlockDAMockup} from '../../../_extensions/interlockDA/InterlockDA.mockup'; -import {getResetDAMockupReferenceJSON, ResetDAMockup} from '../../../_extensions/resetDA/ResetDA.mockup'; +import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; import { - FeedbackMonitoringDAMockup, - getFeedbackMonitoringDAMockupReferenceJSON -} from '../../../_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup'; -import {AnaVlvMockup, getAnaVlvMockupReferenceJSON} from './AnaVlv.mockup'; + FeedbackMonitoringMockup, getFeedbackMonitoringDataItemOptions +} from '../../../../baseFunction/feedbackMonitoring/FeedbackMonitoring.mockup'; +import {AnaVlvMockup, getAnaVlvDataItemOptions} from '../AnaVlv.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/AnaVlv/MonAnaVlv'; -export function getMonAnaVlvMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getMonAnaVlvSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + PosReachedFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosReachedFbk`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + PosTolerance: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosTolerance`, + dataType: 'Float' + } as OpcUaNodeOptions, + MonPosTi: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MonPosTi`, + dataType: 'Float' + } as OpcUaNodeOptions, + MonPosErr: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MonPosErr`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} + +export function getMonAnaVlvDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getAnaVlvMockupReferenceJSON(namespace, objectBrowseName), - ...getFeedbackMonitoringDAMockupReferenceJSON(namespace,objectBrowseName), - PosReachedFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosReachedFbk`, - dataType: 'Boolean' - }, - PosTolerance: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PosTolerance`, - dataType: 'Float' - }, - MonPosTi: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MonPosTi`, - dataType: 'Float' - }, - MonPosErr: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MonPosErr`, - dataType: 'Boolean' - } - } + ...getAnaVlvDataItemOptions(namespace, objectBrowseName), + ...getFeedbackMonitoringDataItemOptions(namespace, objectBrowseName), + ...getMonAnaVlvSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getMonAnaVlvOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getMonAnaVlvDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class MonAnaVlvMockup extends AnaVlvMockup { - public feedbackMonitoring: FeedbackMonitoringDAMockup; + public feedbackMonitoring: FeedbackMonitoringMockup; public posReachedFbk = false; public posTolerance = 0.0; @@ -81,7 +91,7 @@ export class MonAnaVlvMockup extends AnaVlvMockup { super(namespace, rootNode, variableName); - this.feedbackMonitoring= new FeedbackMonitoringDAMockup(namespace,this.mockupNode,this.name); + this.feedbackMonitoring= new FeedbackMonitoringMockup(namespace,this.mockupNode,this.name); namespace.addVariable({ componentOf: this.mockupNode, @@ -129,9 +139,14 @@ export class MonAnaVlvMockup extends AnaVlvMockup { }); } - public getMonAnaVlvMockupJSON() { - return getMonAnaVlvMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.feedbackMonitoring.getDataItemOptions(), + ...getMonAnaVlvSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.puml new file mode 100644 index 00000000..6df80aa4 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.puml @@ -0,0 +1,39 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +class MonAnaVlv{ + + readonly communication!: MonAnaVlvRuntime + + readonly feedbackMonitoring: FeedbackMonitoring + } +MonAnaVlv *- MonAnaVlvSpec +MonAnaVlvSpec ..> MonAnaVlvMockup : <> +MonAnaVlv *- MonAnaVlvMockup +MonAnaVlv *- FeedbackMonitoring + + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.spec.ts new file mode 100644 index 00000000..7286dbd2 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.spec.ts @@ -0,0 +1,152 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../../connection'; +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MockupServer} from '../../../../../../_utils'; +import {getMonAnaVlvOptions, MonAnaVlvMockup} from './MonAnaVlv.mockup'; +import {MonAnaVlv} from './MonAnaVlv'; + + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('MonAnaVlv', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getMonAnaVlvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create MonAnaMonAnaVlv', () => { + + const dataAssemblyController = new MonAnaVlv(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController).to.not.be.undefined; + expect(dataAssemblyController.feedBackMonitoring).to.not.be.undefined; + expect(dataAssemblyController.communication.PosReachedFbk).to.not.be.undefined; + expect(dataAssemblyController.communication.PosTolerance).to.not.be.undefined; + expect(dataAssemblyController.communication.MonPosTi).to.not.be.undefined; + expect(dataAssemblyController.communication.MonPosErr).to.not.be.undefined; + }); + }); + + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const monAnaVlvMockup = new MonAnaVlvMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = monAnaVlvMockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new MonAnaVlv(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.OSLevel.value).equal(0); + expect(dataAssemblyController.communication.WQC.value).equal(0); + + expect(dataAssemblyController.communication.PermEn.value).equal(false); + expect(dataAssemblyController.communication.Permit.value).equal(false); + expect(dataAssemblyController.communication.IntlEn.value).equal(false); + expect(dataAssemblyController.communication.Interlock.value).equal(false); + expect(dataAssemblyController.communication.ProtEn.value).equal(false); + expect(dataAssemblyController.communication.Protect.value).equal(false); + + expect(dataAssemblyController.communication.ResetAut.value).equal(false); + expect(dataAssemblyController.communication.ResetOp.value).equal(false); + + expect(dataAssemblyController.communication.StateChannel.value).equal(false); + expect(dataAssemblyController.communication.StateOffAut.value).equal(false); + expect(dataAssemblyController.communication.StateOpAut.value).equal(false); + expect(dataAssemblyController.communication.StateAutAut.value).equal(false); + expect(dataAssemblyController.communication.StateOffOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpOp.value).equal(false); + expect(dataAssemblyController.communication.StateAutOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpAct.value).equal(false); + expect(dataAssemblyController.communication.StateAutAct.value).equal(false); + expect(dataAssemblyController.communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.SafePos.value).equal(false); + expect(dataAssemblyController.communication.SafePosEn.value).equal(false); + expect(dataAssemblyController.communication.SafePosAct.value).equal(false); + expect(dataAssemblyController.communication.OpenAut.value).equal(false); + expect(dataAssemblyController.communication.OpenFbk.value).equal(false); + expect(dataAssemblyController.communication.OpenFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.OpenOp.value).equal(false); + expect(dataAssemblyController.communication.CloseAut.value).equal(false); + expect(dataAssemblyController.communication.CloseFbk.value).equal(false); + expect(dataAssemblyController.communication.CloseFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.CloseOp.value).equal(false); + + expect(dataAssemblyController.communication.Pos.value).equal(0); + expect(dataAssemblyController.communication.PosFbk.value).equal(0); + expect(dataAssemblyController.communication.PosFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.PosRbk.value).equal(0); + expect(dataAssemblyController.communication.PosInt.value).equal(0); + expect(dataAssemblyController.communication.PosMan.value).equal(0); + expect(dataAssemblyController.communication.PosUnit.value).equal(0); + expect(dataAssemblyController.communication.PosSclMax.value).equal(0); + expect(dataAssemblyController.communication.PosSclMin.value).equal(0); + expect(dataAssemblyController.communication.PosMin.value).equal(0); + expect(dataAssemblyController.communication.PosMax.value).equal(0); + expect(dataAssemblyController.communication.OpenAct.value).equal(false); + expect(dataAssemblyController.communication.CloseAct.value).equal(false); + + expect(dataAssemblyController.communication.MonEn.value).equal(false); + expect(dataAssemblyController.communication.MonSafePos.value).equal(false); + expect(dataAssemblyController.communication.MonStatErr.value).equal(false); + expect(dataAssemblyController.communication.MonDynErr.value).equal(false); + expect(dataAssemblyController.communication.MonStatTi.value).equal(0); + expect(dataAssemblyController.communication.MonDynTi.value).equal(0); + + expect(dataAssemblyController.communication.PosReachedFbk.value).equal(false); + expect(dataAssemblyController.communication.PosTolerance.value).equal(0); + expect(dataAssemblyController.communication.MonPosTi.value).equal(0); + expect(dataAssemblyController.communication.MonPosErr.value).equal(false); + + }).timeout(5000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.ts similarity index 77% rename from src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.ts rename to src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.ts index 4fa51f82..79d5e57f 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/MonAnaVlv.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/anaVlv/monAnaVlv/MonAnaVlv.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,16 +24,16 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; -import {FeedbackMonitoringRuntime} from '../../../_extensions'; -import {AnaVlv, AnaVlvRuntime} from './AnaVlv'; -import {FeedbackMonitoring} from '../../../_extensions/feedbackMonitoringDA/FeedbackMonitoring'; +import {OpcUaConnection, DataItem} from '../../../../../connection'; +import {FeedbackMonitoringRuntime} from '../../../../baseFunction'; +import {AnaVlv, AnaVlvRuntime} from '../AnaVlv'; +import {FeedbackMonitoring} from '../../../../baseFunction'; export type MonAnaVlvRuntime = AnaVlvRuntime & FeedbackMonitoringRuntime & { - PosReachedFbk: OpcUaDataItem; - PosTolerance: OpcUaDataItem; - MonPosTi: OpcUaDataItem; - MonPosErr: OpcUaDataItem; + PosReachedFbk: DataItem; + PosTolerance: DataItem; + MonPosTi: DataItem; + MonPosErr: DataItem; }; export class MonAnaVlv extends AnaVlv { @@ -46,9 +45,9 @@ export class MonAnaVlv extends AnaVlv { this.feedBackMonitoring = new FeedbackMonitoring(this); - this.communication.PosReachedFbk = this.createDataItem('PosReachedFbk', 'read', 'boolean'); - this.communication.PosTolerance = this.createDataItem('PosTolerance', 'read', 'number'); - this.communication.MonPosTi = this.createDataItem('MonPosTi', 'read', 'number'); - this.communication.MonPosErr = this.createDataItem('MonPosErr', 'read', 'boolean'); + this.communication.PosReachedFbk = this.createDataItem('PosReachedFbk', 'boolean'); + this.communication.PosTolerance = this.createDataItem('PosTolerance', 'number'); + this.communication.MonPosTi = this.createDataItem('MonPosTi', 'number'); + this.communication.MonPosErr = this.createDataItem('MonPosErr', 'boolean'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.mockup.spec.ts index aebe2fef..35480374 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.mockup.spec.ts @@ -1,9 +1,34 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {BinVlvMockup} from './BinVlv.mockup'; +import {BinVlvMockup, getBinVlvDataItemOptions, getBinVlvOptions} from './BinVlv.mockup'; import {MockupServer} from '../../../../../_utils'; -import {OpcUaConnection} from '../../../../connection'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {BinVlvRuntime} from './BinVlv'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -11,50 +36,37 @@ const expect = chai.expect; describe('BinVlvMockup', () => { describe('static', () => { - let mockupServer: any; + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create BinBinVlvMockup', async () => { - const mockup= new BinVlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new BinVlvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; }); - it('getBinVlvMockupReferenceJSON()', () => { - const mockup = new BinVlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getBinVlvMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(32); - //TODO test more? - }); - }); - describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable - let mockupServer: MockupServer; - let mockup: BinVlvMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new BinVlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); + + it('static DataItemOptions', () => { + const options = getBinVlvDataItemOptions(1, 'Test') as BinVlvRuntime; + expect(Object.keys(options).length).to.equal(32); }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); + + it('static DataAssemblyOptions', () => { + const options = getBinVlvOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(34); }); - it(' get ...', async () => { - //TODO get the rest - }).timeout(3000); + it('dynamic DataAssemblyOptions', () => { + const mockup = new BinVlvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + expect(Object.keys(options.dataItems).length).to.equal(34); + }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.mockup.ts index d532681b..00ff5871 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.mockup.ts @@ -23,28 +23,44 @@ * SOFTWARE. */ -import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../../_extensions/opModeDA/OpModeDA.mockup'; -import {getInterlockDAMockupReferenceJSON, InterlockDAMockup} from '../../../_extensions/interlockDA/InterlockDA.mockup'; -import {getResetDAMockupReferenceJSON, ResetDAMockup} from '../../../_extensions/resetDA/ResetDA.mockup'; -import {getVlvMockupReferenceJSON, VlvMockup} from '../Vlv.mockup'; -import {Vlv} from '../Vlv'; +import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; +import {getVlvDataItemOptions, VlvMockup} from '../Vlv.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; -export function getBinVlvMockupReferenceJSON(namespace: number, objectBrowseName: string) { +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/BinVlv'; + +function getBinVlvSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + Ctrl: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Ctrl`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} + + +export function getBinVlvDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getVlvMockupReferenceJSON(namespace, objectBrowseName), - Ctrl: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Ctrl`, - dataType: 'Boolean' - } - } + ...getVlvDataItemOptions(namespace, objectBrowseName), + ...getBinVlvSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getBinVlvOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinVlvDataItemOptions(namespace, objectBrowseName)}; + return options; +} + + export class BinVlvMockup extends VlvMockup { public ctrl = false; @@ -64,9 +80,13 @@ export class BinVlvMockup extends VlvMockup { }); } - public getBinVlvMockupJSON() { - return getBinVlvMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinVlvSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.puml index e4ad969c..fde51aa8 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.puml +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.puml @@ -1,6 +1,31 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include MonBinVlv.puml +!include monBinVlv/MonBinVlv.puml class BinVlv{ + readonly communication!: BinVlvRuntime; diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.spec.ts index edeeb997..ee293c1f 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.spec.ts @@ -27,46 +27,42 @@ import {OpcUaConnection} from '../../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/monbinvlv.json'; import {MockupServer} from '../../../../../_utils'; -import {BinVlvMockup} from '../BinVlv/BinVlv.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; -import {BinVlv} from '../BinVlv/BinVlv'; +import {BinVlvMockup, getBinVlvOptions} from './BinVlv.mockup'; + +import {BinVlv} from './BinVlv'; chai.use(chaiAsPromised); const expect = chai.expect; describe('BinVlv', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/BinVlv', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getBinVlvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create BinVlv', () => { - const da1 = new BinVlv(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.not.be.undefined; - expect(da1.communication.Ctrl).to.not.be.undefined; + const dataAssemblyController = new BinVlv(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController).to.not.be.undefined; + expect(dataAssemblyController.communication.Ctrl).to.not.be.undefined; }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: BinVlvMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new BinVlvMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const binVlvMockup = new BinVlvMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = binVlvMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -77,55 +73,49 @@ describe('BinVlv', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new BinVlv(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.OSLevel.value).equal(0); - expect(da1.communication.WQC.value).equal(0); - - expect(da1.communication.PermEn.value).equal(false); - expect(da1.communication.Permit.value).equal(false); - expect(da1.communication.IntlEn.value).equal(false); - expect(da1.communication.Interlock.value).equal(false); - expect(da1.communication.ProtEn.value).equal(false); - expect(da1.communication.Protect.value).equal(false); - - expect(da1.communication.ResetAut.value).equal(false); - expect(da1.communication.ResetOp.value).equal(false); - - expect(da1.communication.StateChannel.value).equal(false); - expect(da1.communication.StateOffAut.value).equal(false); - expect(da1.communication.StateOpAut.value).equal(false); - expect(da1.communication.StateAutAut.value).equal(false); - expect(da1.communication.StateOffOp.value).equal(false); - expect(da1.communication.StateOpOp.value).equal(false); - expect(da1.communication.StateAutOp.value).equal(false); - expect(da1.communication.StateOpAct.value).equal(false); - expect(da1.communication.StateAutAct.value).equal(false); - expect(da1.communication.StateOffAct.value).equal(true); - - expect(da1.communication.SafePos.value).equal(false); - expect(da1.communication.SafePosEn.value).equal(false); - expect(da1.communication.SafePosAct.value).equal(false); - expect(da1.communication.OpenAut.value).equal(false); - expect(da1.communication.OpenFbk.value).equal(false); - expect(da1.communication.OpenFbkCalc.value).equal(false); - expect(da1.communication.OpenOp.value).equal(false); - expect(da1.communication.CloseAut.value).equal(false); - expect(da1.communication.CloseFbk.value).equal(false); - expect(da1.communication.CloseFbkCalc.value).equal(false); - expect(da1.communication.CloseOp.value).equal(false); - - expect(da1.communication.Ctrl.value).equal(false); + + const dataAssemblyController = new BinVlv(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.OSLevel.value).equal(0); + expect(dataAssemblyController.communication.WQC.value).equal(0); + + expect(dataAssemblyController.communication.PermEn.value).equal(false); + expect(dataAssemblyController.communication.Permit.value).equal(false); + expect(dataAssemblyController.communication.IntlEn.value).equal(false); + expect(dataAssemblyController.communication.Interlock.value).equal(false); + expect(dataAssemblyController.communication.ProtEn.value).equal(false); + expect(dataAssemblyController.communication.Protect.value).equal(false); + + expect(dataAssemblyController.communication.ResetAut.value).equal(false); + expect(dataAssemblyController.communication.ResetOp.value).equal(false); + + expect(dataAssemblyController.communication.StateChannel.value).equal(false); + expect(dataAssemblyController.communication.StateOffAut.value).equal(false); + expect(dataAssemblyController.communication.StateOpAut.value).equal(false); + expect(dataAssemblyController.communication.StateAutAut.value).equal(false); + expect(dataAssemblyController.communication.StateOffOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpOp.value).equal(false); + expect(dataAssemblyController.communication.StateAutOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpAct.value).equal(false); + expect(dataAssemblyController.communication.StateAutAct.value).equal(false); + expect(dataAssemblyController.communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.SafePos.value).equal(false); + expect(dataAssemblyController.communication.SafePosEn.value).equal(false); + expect(dataAssemblyController.communication.SafePosAct.value).equal(false); + expect(dataAssemblyController.communication.OpenAut.value).equal(false); + expect(dataAssemblyController.communication.OpenFbk.value).equal(false); + expect(dataAssemblyController.communication.OpenFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.OpenOp.value).equal(false); + expect(dataAssemblyController.communication.CloseAut.value).equal(false); + expect(dataAssemblyController.communication.CloseFbk.value).equal(false); + expect(dataAssemblyController.communication.CloseFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.CloseOp.value).equal(false); + + expect(dataAssemblyController.communication.Ctrl.value).equal(false); }).timeout(5000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.ts index 0634ac28..95373224 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/BinVlv.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,11 +24,11 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; +import {OpcUaConnection, DataItem} from '../../../../connection'; import {Vlv, VlvRuntime} from '../Vlv'; export type BinVlvRuntime = VlvRuntime & { - Ctrl: OpcUaDataItem; + Ctrl: DataItem; }; export class BinVlv extends Vlv { @@ -38,6 +37,6 @@ export class BinVlv extends Vlv { constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.Ctrl = this.createDataItem('Ctrl', 'read', 'boolean'); + this.communication.Ctrl = this.createDataItem('Ctrl', 'boolean'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.mockup.spec.ts deleted file mode 100644 index 4b9b8131..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.mockup.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; - -import {MonBinVlvMockup} from './MonBinVlv.mockup'; -import {MockupServer} from '../../../../../_utils'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('MonBinVlvMockup', () => { - describe('static', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create MonBinVlvMockup', async () => { - const mockup= new MonBinVlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - expect(mockup.feedbackMonitoring).to.not.be.undefined; - }); - - it('getMonBinVlvMockupReferenceJSON()', () => { - const mockup = new MonBinVlvMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getMonBinVlvMockupJSON(); - expect(json).to.not.be.undefined; - expect(Object.keys(json).length).to.equal(38); - //TODO test more? - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.mockup.ts deleted file mode 100644 index 9ce20f79..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.mockup.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../../_extensions/opModeDA/OpModeDA.mockup'; -import {getInterlockDAMockupReferenceJSON, InterlockDAMockup} from '../../../_extensions/interlockDA/InterlockDA.mockup'; -import {getResetDAMockupReferenceJSON, ResetDAMockup} from '../../../_extensions/resetDA/ResetDA.mockup'; -import { - FeedbackMonitoringDAMockup, - getFeedbackMonitoringDAMockupReferenceJSON -} from '../../../_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup'; -import {BinVlvMockup, getBinVlvMockupReferenceJSON} from './BinVlv.mockup'; - -export function getMonBinVlvMockupReferenceJSON(namespace: number, objectBrowseName: string) { - return ({ - ...getBinVlvMockupReferenceJSON(namespace,objectBrowseName), - ...getFeedbackMonitoringDAMockupReferenceJSON(namespace,objectBrowseName), - } - ); -} - -export class MonBinVlvMockup extends BinVlvMockup{ - - public feedbackMonitoring: FeedbackMonitoringDAMockup; - - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - - super(namespace, rootNode, variableName); - this.feedbackMonitoring= new FeedbackMonitoringDAMockup(namespace, rootNode, this.name); - - } - - public getMonBinVlvMockupJSON() { - return getMonBinVlvMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); - } -} diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.puml deleted file mode 100644 index 82715b86..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class MonBinVlv{ - + readonly communication!: MonBinVlvRuntime - + readonly feedbackMonitoring: FeedbackMonitoring -} - -MonBinVlv *- MonBinVlvSpec -MonBinVlvSpec ..> MonBinVlvMockup : <> -MonBinVlv *- MonBinVlvMockup -MonBinVlv *- MonBinVlvRuntime - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.spec.ts deleted file mode 100644 index e9a3c2db..00000000 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.spec.ts +++ /dev/null @@ -1,140 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../../connection'; - -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/monbinvlv.json'; -import {MockupServer} from '../../../../../_utils'; -import {MonBinVlvMockup} from '../BinVlv/MonBinVlv.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; -import {MonBinVlv} from './MonBinVlv'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('MonBinVlv', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/MonBinVlv', - dataItems: baseDataAssemblyOptions - }; - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create MonBinVlv', () => { - - const da1 = new MonBinVlv(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.not.be.undefined; - expect(da1.feedBackMonitoring).to.not.be.undefined; - - }); - }); - - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - let mockup: MonBinVlvMockup; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new MonBinVlvMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new MonBinVlv(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.OSLevel.value).equal(0); - expect(da1.communication.WQC.value).equal(0); - - expect(da1.communication.PermEn.value).equal(false); - expect(da1.communication.Permit.value).equal(false); - expect(da1.communication.IntlEn.value).equal(false); - expect(da1.communication.Interlock.value).equal(false); - expect(da1.communication.ProtEn.value).equal(false); - expect(da1.communication.Protect.value).equal(false); - - expect(da1.communication.ResetAut.value).equal(false); - expect(da1.communication.ResetOp.value).equal(false); - - expect(da1.communication.StateChannel.value).equal(false); - expect(da1.communication.StateOffAut.value).equal(false); - expect(da1.communication.StateOpAut.value).equal(false); - expect(da1.communication.StateAutAut.value).equal(false); - expect(da1.communication.StateOffOp.value).equal(false); - expect(da1.communication.StateOpOp.value).equal(false); - expect(da1.communication.StateAutOp.value).equal(false); - expect(da1.communication.StateOpAct.value).equal(false); - expect(da1.communication.StateAutAct.value).equal(false); - expect(da1.communication.StateOffAct.value).equal(true); - - expect(da1.communication.SafePos.value).equal(false); - expect(da1.communication.SafePosEn.value).equal(false); - expect(da1.communication.SafePosAct.value).equal(false); - expect(da1.communication.OpenAut.value).equal(false); - expect(da1.communication.OpenFbk.value).equal(false); - expect(da1.communication.OpenFbkCalc.value).equal(false); - expect(da1.communication.OpenOp.value).equal(false); - expect(da1.communication.CloseAut.value).equal(false); - expect(da1.communication.CloseFbk.value).equal(false); - expect(da1.communication.CloseFbkCalc.value).equal(false); - expect(da1.communication.CloseOp.value).equal(false); - - expect(da1.communication.MonEn.value).equal(false); - expect(da1.communication.MonSafePos.value).equal(false); - expect(da1.communication.MonStatErr.value).equal(false); - expect(da1.communication.MonDynErr.value).equal(false); - expect(da1.communication.MonStatTi.value).equal(0); - expect(da1.communication.MonDynTi.value).equal(0); - - }).timeout(5000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.mockup.spec.ts new file mode 100644 index 00000000..421ff08f --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.mockup.spec.ts @@ -0,0 +1,72 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; + +import {getMonBinVlvDataItemOptions, getMonBinVlvOptions, MonBinVlvMockup} from './MonBinVlv.mockup'; +import {MockupServer} from '../../../../../../_utils'; +import {DataAssemblyOptions, MonBinVlvOptions} from '@p2olab/polaris-interface'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('MonBinVlvMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create MonBinVlvMockup', async () => { + const mockup= new MonBinVlvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + expect(mockup.feedbackMonitoring).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getMonBinVlvDataItemOptions(1, 'Test') as MonBinVlvOptions; + expect(Object.keys(options).length).to.equal(38); + }); + + it('static DataAssemblyOptions', () => { + const options = getMonBinVlvOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(40); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new MonBinVlvMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(40); + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.mockup.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.mockup.ts new file mode 100644 index 00000000..bd185006 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.mockup.ts @@ -0,0 +1,74 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {Namespace, UAObject} from 'node-opcua'; +import { + FeedbackMonitoringMockup, getFeedbackMonitoringDataItemOptions, +} from '../../../../baseFunction/feedbackMonitoring/FeedbackMonitoring.mockup'; +import {BinVlvMockup, getBinVlvDataItemOptions} from '../BinVlv.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../../DataAssemblyController.mockup'; + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/BinVlv/MonBinVlv'; + +export function getMonBinVlvDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getBinVlvDataItemOptions(namespace, objectBrowseName), + ...getFeedbackMonitoringDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions + ); +} + +export function getMonBinVlvOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getMonBinVlvDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class MonBinVlvMockup extends BinVlvMockup{ + + public feedbackMonitoring: FeedbackMonitoringMockup; + + constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + + super(namespace, rootNode, variableName); + this.feedbackMonitoring= new FeedbackMonitoringMockup(namespace, rootNode, this.name); + + } + + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.feedbackMonitoring.getDataItemOptions() + }; + return options; + } +} diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.puml b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.puml new file mode 100644 index 00000000..0ac1c936 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.puml @@ -0,0 +1,39 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +class MonBinVlv{ + + readonly communication!: MonBinVlvRuntime + + readonly feedbackMonitoring: FeedbackMonitoring +} + +MonBinVlv *- MonBinVlvSpec +MonBinVlvSpec ..> MonBinVlvMockup : <> +MonBinVlv *- MonBinVlvMockup +MonBinVlv *- MonBinVlvRuntime + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.spec.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.spec.ts new file mode 100644 index 00000000..4ef3f944 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.spec.ts @@ -0,0 +1,130 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../../connection'; + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MockupServer} from '../../../../../../_utils'; +import {getMonBinVlvOptions, MonBinVlvMockup} from './MonBinVlv.mockup'; + +import {MonBinVlv} from './MonBinVlv'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('MonBinVlv', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getMonBinVlvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create MonBinVlv', () => { + + const dataAssemblyController = new MonBinVlv(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController).to.not.be.undefined; + expect(dataAssemblyController.feedBackMonitoring).to.not.be.undefined; + }); + }); + + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const monBinVlvMockup = new MonBinVlvMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = monBinVlvMockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new MonBinVlv(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.OSLevel.value).equal(0); + expect(dataAssemblyController.communication.WQC.value).equal(0); + + expect(dataAssemblyController.communication.PermEn.value).equal(false); + expect(dataAssemblyController.communication.Permit.value).equal(false); + expect(dataAssemblyController.communication.IntlEn.value).equal(false); + expect(dataAssemblyController.communication.Interlock.value).equal(false); + expect(dataAssemblyController.communication.ProtEn.value).equal(false); + expect(dataAssemblyController.communication.Protect.value).equal(false); + + expect(dataAssemblyController.communication.ResetAut.value).equal(false); + expect(dataAssemblyController.communication.ResetOp.value).equal(false); + + expect(dataAssemblyController.communication.StateChannel.value).equal(false); + expect(dataAssemblyController.communication.StateOffAut.value).equal(false); + expect(dataAssemblyController.communication.StateOpAut.value).equal(false); + expect(dataAssemblyController.communication.StateAutAut.value).equal(false); + expect(dataAssemblyController.communication.StateOffOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpOp.value).equal(false); + expect(dataAssemblyController.communication.StateAutOp.value).equal(false); + expect(dataAssemblyController.communication.StateOpAct.value).equal(false); + expect(dataAssemblyController.communication.StateAutAct.value).equal(false); + expect(dataAssemblyController.communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.SafePos.value).equal(false); + expect(dataAssemblyController.communication.SafePosEn.value).equal(false); + expect(dataAssemblyController.communication.SafePosAct.value).equal(false); + expect(dataAssemblyController.communication.OpenAut.value).equal(false); + expect(dataAssemblyController.communication.OpenFbk.value).equal(false); + expect(dataAssemblyController.communication.OpenFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.OpenOp.value).equal(false); + expect(dataAssemblyController.communication.CloseAut.value).equal(false); + expect(dataAssemblyController.communication.CloseFbk.value).equal(false); + expect(dataAssemblyController.communication.CloseFbkCalc.value).equal(false); + expect(dataAssemblyController.communication.CloseOp.value).equal(false); + + expect(dataAssemblyController.communication.MonEn.value).equal(false); + expect(dataAssemblyController.communication.MonSafePos.value).equal(false); + expect(dataAssemblyController.communication.MonStatErr.value).equal(false); + expect(dataAssemblyController.communication.MonDynErr.value).equal(false); + expect(dataAssemblyController.communication.MonStatTi.value).equal(0); + expect(dataAssemblyController.communication.MonDynTi.value).equal(0); + + }).timeout(5000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.ts similarity index 85% rename from src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.ts rename to src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.ts index 6accd9bf..8e7a07f1 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/MonBinVlv.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/binVlv/monBinVlv/MonBinVlv.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,12 +24,12 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection} from '../../../../connection'; -import {FeedbackMonitoringRuntime} from '../../../_extensions'; +import {OpcUaConnection} from '../../../../../connection'; +import {FeedbackMonitoringRuntime} from '../../../../baseFunction'; import { BinVlv, BinVlvRuntime -} from './BinVlv'; -import {FeedbackMonitoring} from '../../../_extensions/feedbackMonitoringDA/FeedbackMonitoring'; +} from '../BinVlv'; +import {FeedbackMonitoring} from '../../../../baseFunction/feedbackMonitoring/FeedbackMonitoring'; export type MonBinVlvRuntime = BinVlvRuntime & FeedbackMonitoringRuntime; diff --git a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/index.ts b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/index.ts index d3580055..d0dbfbc2 100644 --- a/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/activeElement/vlv/index.ts @@ -1,5 +1,30 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './Vlv'; export * from './anaVlv/AnaVlv'; export * from './binVlv/BinVlv'; -export * from './anaVlv/MonAnaVlv'; -export * from './binVlv/MonBinVlv'; +export * from './anaVlv/monAnaVlv/MonAnaVlv'; +export * from './binVlv/monBinVlv/MonBinVlv'; diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/_helper/index.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/_helper/index.ts new file mode 100644 index 00000000..3dc52f98 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/_helper/index.ts @@ -0,0 +1,26 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export * from './mixins'; diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/_helper/mixins.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/_helper/mixins.ts similarity index 94% rename from src/modularPlantManager/pea/dataAssembly/_extensions/_helper/mixins.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/_helper/mixins.ts index e6e6f8bf..2d6097cb 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/_helper/mixins.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/_helper/mixins.ts @@ -28,4 +28,4 @@ * see https://basarat.gitbooks.io/typescript/docs/types/mixins.html */ // eslint-disable-next-line @typescript-eslint/no-explicit-any -export type Constructor = new (...args: any[]) => T; +export type Constructor> = new (...args: any[]) => T; diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/baseFunction.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/baseFunction.puml new file mode 100644 index 00000000..199ddd53 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/baseFunction.puml @@ -0,0 +1,56 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram +!include FeedbackMonitoring/FeedbackMonitoring.puml +!include Interlock/Interlock.puml +!include limitMonitoring/LimitMonitoring.puml +!include opMode/OpMode.puml +!include OSLevel/OSLevel.puml +!include reset/Reset.puml +!include scaleSettings/ScaleSettings.puml +!include serviceSourceMode/ServiceSourceModeController.puml +!include sourceMode/SourceModeController.puml +!include unit/UnitSettings.puml +!include valueLimitation/ValueLimitation.puml +!include wqc/WQC.puml + +abstract class DataAssemblyController + +DataAssemblyController "0..1" o-- FeedbackMonitoring +DataAssemblyController "0..1" o-- Interlock +DataAssemblyController "0..1" o-- LimitMonitoring +DataAssemblyController "0..1" o-- OpMode +DataAssemblyController "0..1" o-- OSLevel +DataAssemblyController "0..1" o-- Reset +DataAssemblyController "0..1" o-- ScaleSettings +DataAssemblyController "0..1" o-- ServiceSourceModeController +DataAssemblyController "0..1" o-- SourceModeController +DataAssemblyController "0..1" o-- UnitSettings +DataAssemblyController "0..1" o-- ValueLimitation +DataAssemblyController "0..1" o-- WQC + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.mockup.spec.ts new file mode 100644 index 00000000..46d51a02 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.mockup.spec.ts @@ -0,0 +1,127 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {FeedbackMonitoringMockup, getFeedbackMonitoringDataItemOptions} from './FeedbackMonitoring.mockup'; +import {OpcUaConnection} from '../../../connection'; +import {FeedbackMonitoringRuntime} from './FeedbackMonitoring'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('FeedbackMonitoringMockup', () => { + describe('static', () => { + let mockupServer: MockupServer; + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create FeedbackMonitoringMockup', async () => { + const mockup= new FeedbackMonitoringMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('generic FeedbackMonitoring DataItemOptions', () => { + const options = getFeedbackMonitoringDataItemOptions(1, 'Test') as FeedbackMonitoringRuntime; + + expect(Object.keys(options).length).to.equal(6); + expect(options.MonDynTi).to.not.be.undefined; + expect(options.MonStatTi).to.not.be.undefined; + expect(options.MonDynErr).to.not.be.undefined; + expect(options.MonEn).to.not.be.undefined; + expect(options.MonStatErr).to.not.be.undefined; + expect(options.MonSafePos).to.not.be.undefined; + }); + + it('dynamic FeedbackMonitoring DataItemOptions', () => { + const mockup = new FeedbackMonitoringMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Test'); + const options = mockup.getDataItemOptions() as FeedbackMonitoringRuntime; + + expect(Object.keys(options).length).to.equal(6); + expect(options.MonDynTi).to.not.be.undefined; + expect(options.MonStatTi).to.not.be.undefined; + expect(options.MonDynErr).to.not.be.undefined; + expect(options.MonEn).to.not.be.undefined; + expect(options.MonStatErr).to.not.be.undefined; + expect(options.MonSafePos).to.not.be.undefined; + }); + }); + + describe('dynamic', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(5000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + new FeedbackMonitoringMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get MonEn', async () => { + await connection.writeNode('Variable.MonEn', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.MonEn', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(true)); + }).timeout(5000); + + it('get MonSafePos', async () => { + await connection.readNode('Variable.MonSafePos', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + }).timeout(5000); + + it('get MonStatErr', async () => { + await connection.readNode('Variable.MonStatErr', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + }).timeout(5000); + + it('get MonDynErr', async () => { + await connection.readNode('Variable.MonDynErr', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + }).timeout(5000); + + it('get MonStatTi', async () => { + await connection.readNode('Variable.MonStatTi', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(0)); + }).timeout(5000); + it('get MonDynTi', async () => { + await connection.readNode('Variable.MonDynTi', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(0)); + }).timeout(5000); + + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.mockup.ts similarity index 73% rename from src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.mockup.ts index 7225f30f..f1ee9cdc 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoringDA.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.mockup.ts @@ -24,46 +24,50 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; -export function getFeedbackMonitoringDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getFeedbackMonitoringSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - MonEn: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MonEn`, - dataType: 'Boolean' - }, - MonSafePos: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MonSafePos`, - dataType: 'Boolean' - }, - MonStatErr: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MonStatErr`, - dataType: 'Boolean' - }, - MonDynErr: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MonDynErr`, - dataType: 'Boolean' - }, - MonStatTi: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MonStatTi`, - dataType: 'Float' - }, - MonDynTi: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.MonDynTi`, - dataType: 'Float' - } - } - ); + MonEn: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MonEn`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + MonSafePos: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MonSafePos`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + MonStatErr: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MonStatErr`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + MonDynErr: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MonDynErr`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + MonStatTi: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MonStatTi`, + dataType: 'Float' + } as OpcUaNodeOptions, + MonDynTi: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.MonDynTi`, + dataType: 'Float' + } as OpcUaNodeOptions + }); } -export class FeedbackMonitoringDAMockup { + +export function getFeedbackMonitoringDataItemOptions(namespace: number, objectBrowseName: string): object { + return getFeedbackMonitoringSpecificDataItemOptions(namespace, objectBrowseName); +} + + +export class FeedbackMonitoringMockup { protected varMonEn = false; protected varMonSafePos = false; protected varMonStatErr = false; @@ -85,7 +89,7 @@ export class FeedbackMonitoringDAMockup { get: (): Variant => { return new Variant({dataType: DataType.Boolean, value: this.varMonEn}); }, - set: (variant: Variant) => { + set: (variant: Variant): StatusCodes => { this.varMonEn = variant.value; return StatusCodes.Good; }, @@ -148,8 +152,8 @@ export class FeedbackMonitoringDAMockup { }); } - public getFeedbackMonitoringDAInstanceMockupJSON() { - return getFeedbackMonitoringDAMockupReferenceJSON( + public getDataItemOptions(): object { + return getFeedbackMonitoringDataItemOptions( this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string); } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.puml new file mode 100644 index 00000000..5e663665 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.puml @@ -0,0 +1,47 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface FeedbackMonitoringRuntime{ + + MonEn: DataItem + + MonSafePos: DataItem + + MonStatErr: DataItem + + MonDynErr: DataItem + + MonStatTi: DataItem + + MonDynTi: DataItem +} + +class FeedbackMonitoring{ + - dAController: any + - initialize(): void +} + +FeedbackMonitoringRuntime <-- FeedbackMonitoring +FeedbackMonitoringSpec --> FeedbackMonitoring : <> +FeedbackMonitoringSpec --> FeedbackMonitoringMockup : <> + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoring.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.spec.ts similarity index 51% rename from src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoring.spec.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.spec.ts index 142068ad..3ef289a7 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoring.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.spec.ts @@ -29,52 +29,48 @@ import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyController} from '../../DataAssemblyController'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/monbinvlv.json'; import {FeedbackMonitoring} from './FeedbackMonitoring'; import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {FeedbackMonitoringDAMockup} from './FeedbackMonitoringDA.mockup'; +import {FeedbackMonitoringMockup} from './FeedbackMonitoring.mockup'; +import {getMonBinVlvOptions} from '../../activeElement/vlv/binVlv/monBinVlv/MonBinVlv.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('FeedbackMonitoring', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/MonBinVlv', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + it('should create FeedbackMonitoring', () => { - const da1 = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection) as any; - const feedbackMonitoring = new FeedbackMonitoring(da1); + + dataAssemblyOptions = getMonBinVlvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection) as any; + const feedbackMonitoring = new FeedbackMonitoring(dataAssemblyController); expect(feedbackMonitoring).to.not.to.undefined; - expect(da1.communication.MonEn).to.not.to.undefined; - expect(da1.communication.MonSafePos).to.not.to.undefined; - expect(da1.communication.MonStatErr).to.not.to.undefined; - expect(da1.communication.MonDynErr).to.not.to.undefined; - expect(da1.communication.MonStatTi).to.not.to.undefined; - expect(da1.communication.MonDynTi).to.not.to.undefined; + expect(dataAssemblyController.communication.MonEn).to.not.to.undefined; + expect(dataAssemblyController.communication.MonSafePos).to.not.to.undefined; + expect(dataAssemblyController.communication.MonStatErr).to.not.to.undefined; + expect(dataAssemblyController.communication.MonDynErr).to.not.to.undefined; + expect(dataAssemblyController.communication.MonStatTi).to.not.to.undefined; + expect(dataAssemblyController.communication.MonDynTi).to.not.to.undefined; }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: FeedbackMonitoringDAMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new FeedbackMonitoringDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + new FeedbackMonitoringMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -85,26 +81,20 @@ describe('FeedbackMonitoring', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - // instantiating FeedbackMonitoring, which will manipulate dataAssemblyController - new FeedbackMonitoring(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.MonEn.value).equal(false); - expect(da1.communication.MonSafePos.value).equal(false); - expect(da1.communication.MonStatErr.value).equal(false); - expect(da1.communication.MonDynErr.value).equal(false); - expect(da1.communication.MonStatTi.value).equal(0); - expect(da1.communication.MonDynTi.value).equal(0); + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + + new FeedbackMonitoring(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.MonEn.value).equal(false); + expect(dataAssemblyController.communication.MonSafePos.value).equal(false); + expect(dataAssemblyController.communication.MonStatErr.value).equal(false); + expect(dataAssemblyController.communication.MonDynErr.value).equal(false); + expect(dataAssemblyController.communication.MonStatTi.value).equal(0); + expect(dataAssemblyController.communication.MonDynTi.value).equal(0); }).timeout(5000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoring.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.ts similarity index 74% rename from src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoring.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.ts index 61e924ee..315a518f 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/feedbackMonitoringDA/FeedbackMonitoring.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/feedbackMonitoring/FeedbackMonitoring.ts @@ -23,17 +23,16 @@ * SOFTWARE. */ -import {OpcUaDataItem} from '../../../connection'; -import {BaseDataAssemblyRuntime, DataAssemblyController} from '../../DataAssemblyController'; -import {Constructor} from '../_helper'; +import {DataItem} from '../../../connection'; +import {BaseDataAssemblyRuntime} from '../../DataAssemblyController'; export interface FeedbackMonitoringRuntime extends BaseDataAssemblyRuntime { - MonEn: OpcUaDataItem; - MonSafePos: OpcUaDataItem; - MonStatErr: OpcUaDataItem; - MonDynErr: OpcUaDataItem; - MonStatTi: OpcUaDataItem; - MonDynTi: OpcUaDataItem; + MonEn: DataItem; + MonSafePos: DataItem; + MonStatErr: DataItem; + MonDynErr: DataItem; + MonStatTi: DataItem; + MonDynTi: DataItem; } export class FeedbackMonitoring { @@ -44,12 +43,12 @@ export class FeedbackMonitoring { this.initialize(); } - private initialize() { - this.dAController.communication.MonEn = this.dAController.createDataItem('MonEn', 'write'); - this.dAController.communication.MonSafePos = this.dAController.createDataItem('MonSafePos', 'read'); - this.dAController.communication.MonStatErr = this.dAController.createDataItem('MonStatErr', 'read'); - this.dAController.communication.MonDynErr = this.dAController.createDataItem('MonDynErr', 'read'); - this.dAController.communication.MonStatTi = this.dAController.createDataItem('MonStatTi', 'read'); - this.dAController.communication.MonDynTi = this.dAController.createDataItem('MonDynTi', 'read'); + private initialize(): void { + this.dAController.communication.MonEn = this.dAController.createDataItem('MonEn', 'boolean', 'write'); + this.dAController.communication.MonSafePos = this.dAController.createDataItem('MonSafePos', 'boolean'); + this.dAController.communication.MonStatErr = this.dAController.createDataItem('MonStatErr', 'boolean'); + this.dAController.communication.MonDynErr = this.dAController.createDataItem('MonDynErr', 'boolean'); + this.dAController.communication.MonStatTi = this.dAController.createDataItem('MonStatTi', 'number'); + this.dAController.communication.MonDynTi = this.dAController.createDataItem('MonDynTi', 'number'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/index.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/index.ts new file mode 100644 index 00000000..6104db7c --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/index.ts @@ -0,0 +1,36 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export * from './feedbackMonitoring/FeedbackMonitoring'; +export * from './interlock/Interlock'; +export * from './limitMonitoring/LimitMonitoring'; +export * from './opMode/OpMode'; +export * from './osLevel/OSLevel'; +export * from './reset/Reset'; +export * from './scaleSettings/ScaleSettings'; +export * from './sourceMode/SourceModeController'; +export * from './unitSettings/UnitSettings'; +export * from './valueLimitation/ValueLimitation'; +export * from './wqc/WQC'; diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.mockup.spec.ts new file mode 100644 index 00000000..9cb89320 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.mockup.spec.ts @@ -0,0 +1,74 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {getInterlockDataItemOptions, InterlockMockup} from './Interlock.mockup'; +import {InterlockRuntime} from './Interlock'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('InterlockMockup', () => { + describe('static', () => { + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create InterlockMockup', async () => { + const mockup= new InterlockMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static Interlock DataItemOptions', () => { + const options = getInterlockDataItemOptions(1, 'Test') as InterlockRuntime; + + expect(Object.keys(options).length).to.equal(6); + expect(options.PermEn).to.not.be.undefined; + expect(options.Interlock).to.not.be.undefined; + expect(options.IntlEn).to.not.be.undefined; + expect(options.Permit).to.not.be.undefined; + expect(options.Protect).to.not.be.undefined; + expect(options.ProtEn).to.not.be.undefined; + }); + + it('dynamic Interlock DataItemOptions', () => { + const mockup = new InterlockMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + const options = mockup.getDataItemOptions() as InterlockRuntime; + + expect(Object.keys(options).length).to.equal(6); + expect(options.PermEn).to.not.be.undefined; + expect(options.Interlock).to.not.be.undefined; + expect(options.IntlEn).to.not.be.undefined; + expect(options.Permit).to.not.be.undefined; + expect(options.Protect).to.not.be.undefined; + expect(options.ProtEn).to.not.be.undefined; + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/InterlockDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.mockup.ts similarity index 72% rename from src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/InterlockDA.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.mockup.ts index 8577a666..11b79b25 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/InterlockDA.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.mockup.ts @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2020 P2O-Lab , + * Copyright (c) 2021 P2O-Lab , * Chair for Process Control Systems, Technische Universität Dresden * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -24,47 +24,49 @@ */ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; -export function getInterlockDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - +function getInterlockSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - PermEn: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.PermEn`, - dataType: 'Boolean' - }, - Permit: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Permit`, - dataType: 'Boolean' - }, - IntlEn: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.IntlEn`, - dataType: 'Boolean' - }, - Interlock: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Interlock`, - dataType: 'Boolean' - }, - ProtEn: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.ProtEn`, - dataType: 'Boolean' - }, - Protect: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Protect`, - dataType: 'Boolean' - } - } - ); + PermEn: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PermEn`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + Permit: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Permit`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + IntlEn: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.IntlEn`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + Interlock: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Interlock`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + ProtEn: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.ProtEn`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + Protect: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Protect`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} + + +export function getInterlockDataItemOptions(namespace: number, objectBrowseName: string): object { + return getInterlockSpecificDataItemOptions(namespace, objectBrowseName); } -export class InterlockDAMockup { +export class InterlockMockup { protected varPermEn = false; protected varPermit = false; protected varIntlEn = false; @@ -145,8 +147,8 @@ export class InterlockDAMockup { }); } - public getInterlockDAInstanceMockupJSON() { - return getInterlockDAMockupReferenceJSON( + public getDataItemOptions(): object { + return getInterlockDataItemOptions( this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string); } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.puml new file mode 100644 index 00000000..3a713e63 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.puml @@ -0,0 +1,47 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface InterlockRuntime{ + + PermEn: DataItem + + Permit: DataItem + + IntlEn: DataItem + + Interlock: DataItem + + ProtEn: DataItem + + Protect: DataItem +} + +class Interlock{ + - dAController: any + - initialize(): void +} + +InterlockRuntime <-- Interlock +InterlockSpec --> Interlock : <> +InterlockSpec --> InterlockMockup : <> + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/Interlock.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.spec.ts similarity index 52% rename from src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/Interlock.spec.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.spec.ts index c2178545..7567033e 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/Interlock.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.spec.ts @@ -28,54 +28,50 @@ import {OpcUaConnection} from '../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/monbinvlv.json'; import {DataAssemblyController} from '../../DataAssemblyController'; import {MonBinVlv} from '../../activeElement'; import {Interlock} from './Interlock'; import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {InterlockDAMockup} from './InterlockDA.mockup'; +import {InterlockMockup} from './Interlock.mockup'; +import {getMonBinVlvOptions} from '../../activeElement/vlv/binVlv/monBinVlv/MonBinVlv.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('Interlock', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/ActiveElement/MonBinVlv', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getMonBinVlvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create Interlock', () => { - const da1 = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection) as MonBinVlv; - const interlock = new Interlock(da1); //this will set communication variables + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection) as MonBinVlv; + const interlock = new Interlock(dataAssemblyController); expect(interlock).to.not.to.undefined; - expect(da1.communication.PermEn).to.not.to.undefined; - expect(da1.communication.Permit).to.not.to.undefined; - expect(da1.communication.IntlEn).to.not.to.undefined; - expect(da1.communication.Interlock).to.not.to.undefined; - expect(da1.communication.ProtEn).to.not.to.undefined; - expect(da1.communication.Protect).to.not.to.undefined; + expect(dataAssemblyController.communication.PermEn).to.not.to.undefined; + expect(dataAssemblyController.communication.Permit).to.not.to.undefined; + expect(dataAssemblyController.communication.IntlEn).to.not.to.undefined; + expect(dataAssemblyController.communication.Interlock).to.not.to.undefined; + expect(dataAssemblyController.communication.ProtEn).to.not.to.undefined; + expect(dataAssemblyController.communication.Protect).to.not.to.undefined; }); }); + describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: InterlockDAMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new InterlockDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + new InterlockMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -86,25 +82,19 @@ describe('Interlock', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - new Interlock(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.PermEn.value).equal(false); - expect(da1.communication.Permit.value).equal(false); - expect(da1.communication.IntlEn.value).equal(false); - expect(da1.communication.Interlock.value).equal(false); - expect(da1.communication.ProtEn.value).equal(false); - expect(da1.communication.Protect.value).equal(false); + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + new Interlock(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.PermEn.value).equal(false); + expect(dataAssemblyController.communication.Permit.value).equal(false); + expect(dataAssemblyController.communication.IntlEn.value).equal(false); + expect(dataAssemblyController.communication.Interlock.value).equal(false); + expect(dataAssemblyController.communication.ProtEn.value).equal(false); + expect(dataAssemblyController.communication.Protect.value).equal(false); }).timeout(5000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/Interlock.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.ts similarity index 75% rename from src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/Interlock.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.ts index f56fb4bd..d482c3fc 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/interlockDA/Interlock.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/interlock/Interlock.ts @@ -23,17 +23,16 @@ * SOFTWARE. */ -import {OpcUaDataItem} from '../../../connection'; -import {BaseDataAssemblyRuntime, DataAssemblyController} from '../../DataAssemblyController'; -import {Constructor} from '../_helper'; +import {DataItem} from '../../../connection'; +import {BaseDataAssemblyRuntime} from '../../DataAssemblyController'; export type InterlockRuntime = BaseDataAssemblyRuntime & { - PermEn: OpcUaDataItem; - Permit: OpcUaDataItem; - IntlEn: OpcUaDataItem; - Interlock: OpcUaDataItem; - ProtEn: OpcUaDataItem; - Protect: OpcUaDataItem; + PermEn: DataItem; + Permit: DataItem; + IntlEn: DataItem; + Interlock: DataItem; + ProtEn: DataItem; + Protect: DataItem; }; export class Interlock{ @@ -44,12 +43,12 @@ export class Interlock{ this.initialize(); } - private initialize(){ - this.dAController.communication.PermEn = this.dAController.createDataItem('PermEn', 'read'); - this.dAController.communication.Permit = this.dAController.createDataItem('Permit', 'read'); - this.dAController.communication.IntlEn = this.dAController.createDataItem('IntlEn', 'read'); - this.dAController.communication.Interlock = this.dAController.createDataItem('Interlock', 'read'); - this.dAController.communication.ProtEn = this.dAController.createDataItem('ProtEn', 'read'); - this.dAController.communication.Protect = this.dAController.createDataItem('Protect', 'read'); + private initialize(): void { + this.dAController.communication.PermEn = this.dAController.createDataItem('PermEn', 'boolean'); + this.dAController.communication.Permit = this.dAController.createDataItem('Permit', 'boolean'); + this.dAController.communication.IntlEn = this.dAController.createDataItem('IntlEn', 'boolean'); + this.dAController.communication.Interlock = this.dAController.createDataItem('Interlock', 'boolean'); + this.dAController.communication.ProtEn = this.dAController.createDataItem('ProtEn', 'boolean'); + this.dAController.communication.Protect = this.dAController.createDataItem('Protect', 'boolean'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.mockup.spec.ts new file mode 100644 index 00000000..ddd9f472 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.mockup.spec.ts @@ -0,0 +1,279 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {getLimitMonitoringDataItemOptions, LimitMonitoringMockup} from './LimitMonitoring.mockup'; +import {OpcUaConnection} from '../../../connection'; +import {LimitMonitoringRuntime} from './LimitMonitoring'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('LimitMonitoringMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async () => { + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + describe('DIntLimitMonitoring', () => { + + it('should create DIntLimitMonitoring', async () => { + const mockup = new LimitMonitoringMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'DInt'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getLimitMonitoringDataItemOptions(1, 'Test', 'DInt') as LimitMonitoringRuntime; + + expect(Object.keys(options).length).to.equal(18); + expect(options.VAHEn).to.not.be.undefined; + expect(options.VAHLim).to.not.be.undefined; + expect(options.VAHAct).to.not.be.undefined; + expect(options.VWHEn).to.not.be.undefined; + expect(options.VWHLim).to.not.be.undefined; + expect(options.VWHAct).to.not.be.undefined; + expect(options.VTHEn).to.not.be.undefined; + expect(options.VTHLim).to.not.be.undefined; + expect(options.VTHAct).to.not.be.undefined; + expect(options.VALEn).to.not.be.undefined; + expect(options.VALLim).to.not.be.undefined; + expect(options.VALAct).to.not.be.undefined; + expect(options.VWLEn).to.not.be.undefined; + expect(options.VWLLim).to.not.be.undefined; + expect(options.VWLAct).to.not.be.undefined; + expect(options.VTLEn).to.not.be.undefined; + expect(options.VTLLim).to.not.be.undefined; + expect(options.VTLAct).to.not.be.undefined; + }); + + it('dynamic DataItemOptions', () => { + const mockup = new LimitMonitoringMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'DInt'); + const options = mockup.getDataItemOptions() as LimitMonitoringRuntime; + + expect(Object.keys(options).length).to.equal(18); + expect(options.VAHEn).to.not.be.undefined; + expect(options.VAHLim).to.not.be.undefined; + expect(options.VAHAct).to.not.be.undefined; + expect(options.VWHEn).to.not.be.undefined; + expect(options.VWHLim).to.not.be.undefined; + expect(options.VWHAct).to.not.be.undefined; + expect(options.VTHEn).to.not.be.undefined; + expect(options.VTHLim).to.not.be.undefined; + expect(options.VTHAct).to.not.be.undefined; + expect(options.VALEn).to.not.be.undefined; + expect(options.VALLim).to.not.be.undefined; + expect(options.VALAct).to.not.be.undefined; + expect(options.VWLEn).to.not.be.undefined; + expect(options.VWLLim).to.not.be.undefined; + expect(options.VWLAct).to.not.be.undefined; + expect(options.VTLEn).to.not.be.undefined; + expect(options.VTLLim).to.not.be.undefined; + expect(options.VTLAct).to.not.be.undefined; + }); + + }); + + describe('AnaLimitMonitoring', () => { + + it('should create AnaLimitMonitoring', async () => { + const mockup = new LimitMonitoringMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'Ana'); + expect(mockup).to.not.be.undefined; + }); + + it('static AnaLimitMonitoring DataItemOptions', () => { + const options = getLimitMonitoringDataItemOptions(1, 'Test', 'Ana') as LimitMonitoringRuntime; + + expect(Object.keys(options).length).to.equal(18); + expect(options.VAHEn).to.not.be.undefined; + expect(options.VAHLim).to.not.be.undefined; + expect(options.VAHAct).to.not.be.undefined; + expect(options.VWHEn).to.not.be.undefined; + expect(options.VWHLim).to.not.be.undefined; + expect(options.VWHAct).to.not.be.undefined; + expect(options.VTHEn).to.not.be.undefined; + expect(options.VTHLim).to.not.be.undefined; + expect(options.VTHAct).to.not.be.undefined; + expect(options.VALEn).to.not.be.undefined; + expect(options.VALLim).to.not.be.undefined; + expect(options.VALAct).to.not.be.undefined; + expect(options.VWLEn).to.not.be.undefined; + expect(options.VWLLim).to.not.be.undefined; + expect(options.VWLAct).to.not.be.undefined; + expect(options.VTLEn).to.not.be.undefined; + expect(options.VTLLim).to.not.be.undefined; + expect(options.VTLAct).to.not.be.undefined; + }); + + it('dynamic AnaLimitMonitoring DataItemOptions', () => { + const mockup = new LimitMonitoringMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'Ana'); + + const options = mockup.getDataItemOptions() as LimitMonitoringRuntime; + + expect(Object.keys(options).length).to.equal(18); + expect(options.VAHEn).to.not.be.undefined; + expect(options.VAHLim).to.not.be.undefined; + expect(options.VAHAct).to.not.be.undefined; + expect(options.VWHEn).to.not.be.undefined; + expect(options.VWHLim).to.not.be.undefined; + expect(options.VWHAct).to.not.be.undefined; + expect(options.VTHEn).to.not.be.undefined; + expect(options.VTHLim).to.not.be.undefined; + expect(options.VTHAct).to.not.be.undefined; + expect(options.VALEn).to.not.be.undefined; + expect(options.VALLim).to.not.be.undefined; + expect(options.VALAct).to.not.be.undefined; + expect(options.VWLEn).to.not.be.undefined; + expect(options.VWLLim).to.not.be.undefined; + expect(options.VWLAct).to.not.be.undefined; + expect(options.VTLEn).to.not.be.undefined; + expect(options.VTLLim).to.not.be.undefined; + expect(options.VTLAct).to.not.be.undefined; + }); + }); + + }); + + describe('dynamic', () => { + + describe('AnaLimitMonitoring', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(5000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + new LimitMonitoringMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable', 'Ana'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get VAHLim', async () => { + await connection.writeNode('Variable.VAHLim', mockupServer.nameSpaceUri, 1, 'Double'); + await connection.readNode('Variable.VAHLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + it('set and get VWHLim', async () => { + await connection.writeNode('Variable.VWHLim', mockupServer.nameSpaceUri, 1, 'Double'); + await connection.readNode('Variable.VWHLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + it('set and get VTHLim', async () => { + await connection.writeNode('Variable.VTHLim', mockupServer.nameSpaceUri, 1, 'Double'); + await connection.readNode('Variable.VTHLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + it('set and get VTLLim', async () => { + await connection.writeNode('Variable.VTLLim', mockupServer.nameSpaceUri, 1, 'Double'); + await connection.readNode('Variable.VTLLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + it('set and get VALLim', async () => { + await connection.writeNode('Variable.VALLim', mockupServer.nameSpaceUri, 1, 'Double'); + await connection.readNode('Variable.VALLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + it('set and get VWLLim', async () => { + await connection.writeNode('Variable.VWLLim', mockupServer.nameSpaceUri, 1, 'Double'); + await connection.readNode('Variable.VWLLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + //TODO: get the rest of values + + }); + + + describe('DIntLimitMonitoring', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + beforeEach(async function () { + this.timeout(5000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + new LimitMonitoringMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable', 'DInt'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get VAHLim', async () => { + await connection.writeNode('Variable.VAHLim', mockupServer.nameSpaceUri, 1, 'Int32'); + await connection.readNode('Variable.VAHLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + it('set and get VWHLim', async () => { + await connection.writeNode('Variable.VWHLim', mockupServer.nameSpaceUri, 1, 'Int32'); + await connection.readNode('Variable.VWHLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + it('set and get VTHLim', async () => { + await connection.writeNode('Variable.VTHLim', mockupServer.nameSpaceUri, 1, 'Int32'); + await connection.readNode('Variable.VTHLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + it('set and get VTLLim', async () => { + await connection.writeNode('Variable.VTLLim', mockupServer.nameSpaceUri, 1, 'Int32'); + await connection.readNode('Variable.VTLLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + it('set and get VALLim', async () => { + await connection.writeNode('Variable.VALLim', mockupServer.nameSpaceUri, 1, 'Int32'); + await connection.readNode('Variable.VALLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + it('set and get VWLLim', async () => { + await connection.writeNode('Variable.VWLLim', mockupServer.nameSpaceUri, 1, 'Int32'); + await connection.readNode('Variable.VWLLim', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(2000); + //TODO: get the rest of values + }); + + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoringDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.mockup.ts similarity index 79% rename from src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoringDA.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.mockup.ts index 4071e663..f2260972 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoringDA.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.mockup.ts @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2020 P2O-Lab , + * Copyright (c) 2021 P2O-Lab , * Chair for Process Control Systems, Technische Universität Dresden * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -24,105 +24,112 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; +import {OpcUaNodeOptions} from '../../../connection/DataItemFactory'; -export function getLimitMonitoringDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getLimitMonitoringSpecificDataItemOptions(namespace: number, objectBrowseName: string, type: T): object { return ({ VAHEn: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VAHEn`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, VAHLim: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VAHLim`, - dataType: 'Float' - }, + dataType: (type === 'Ana')? 'Float': 'Int32' + } as OpcUaNodeOptions, VAHAct: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VAHAct`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, VWHEn: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VWHEn`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, VWHLim: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VWHLim`, - dataType: 'Float' - }, + dataType: (type === 'Ana')? 'Float': 'Int32' + } as OpcUaNodeOptions, VWHAct: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VWHAct`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, VTHEn: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VTHEn`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, VTHLim: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VTHLim`, - dataType: 'Float' - }, + dataType: (type === 'Ana')? 'Float': 'Int32' + } as OpcUaNodeOptions, VTHAct: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VTHAct`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, VALEn: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VALEn`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, VALLim: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VALLim`, - dataType: 'Float' - }, + dataType: (type === 'Ana')? 'Float': 'Int32' + } as OpcUaNodeOptions, VALAct: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VALAct`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, VWLEn: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VWLEn`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, VWLLim: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VWLLim`, - dataType: 'Float' - }, + dataType: (type === 'Ana')? 'Float': 'Int32' + } as OpcUaNodeOptions, VWLAct: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VWLAct`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, VTLEn: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VTLEn`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, VTLLim: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VTLLim`, - dataType: 'Float' - }, + dataType: (type === 'Ana')? 'Float': 'Int32' + } as OpcUaNodeOptions, VTLAct: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VTLAct`, dataType: 'Boolean' - } + } as OpcUaNodeOptions }); } -export class LimitMonitoringDAMockup { + +export function getLimitMonitoringDataItemOptions(namespace: number, objectBrowseName: string, type: T): object { + return getLimitMonitoringSpecificDataItemOptions(namespace, objectBrowseName, type); +} + +export class LimitMonitoringMockup{ + private readonly type: 'Ana' | 'DInt'; + private readonly dataType: DataType; + protected varAHEn = false; protected varAHLim = 0; protected varAHAct = false; @@ -130,7 +137,7 @@ export class LimitMonitoringDAMockup { - return new Variant({dataType: limDataType, value: this.varAHLim}); + return new Variant({dataType: this.dataType, value: this.varAHLim}); }, - set: (variant: Variant) => { - switch (limDataType) { + set: (variant: Variant): StatusCodes => { + switch (this.dataType) { case DataType.Double: this.varAHLim = parseFloat(variant.value); return StatusCodes.Good; @@ -209,14 +215,14 @@ export class LimitMonitoringDAMockup { - return new Variant({dataType: limDataType, value: this.varWHLim}); + return new Variant({dataType: this.dataType, value: this.varWHLim}); }, - set: (variant: Variant) => { - switch (limDataType) { + set: (variant: Variant): StatusCodes => { + switch (this.dataType) { case DataType.Double: this.varWHLim = parseFloat(variant.value); return StatusCodes.Good; @@ -253,14 +259,14 @@ export class LimitMonitoringDAMockup { - return new Variant({dataType: limDataType, value: this.varTHLim}); + return new Variant({dataType: this.dataType, value: this.varTHLim}); }, - set: (variant: Variant) => { - switch (limDataType) { + set: (variant: Variant): StatusCodes => { + switch (this.dataType) { case DataType.Double: this.varTHLim = parseFloat(variant.value); return StatusCodes.Good; @@ -297,14 +303,14 @@ export class LimitMonitoringDAMockup { - return new Variant({dataType: limDataType, value: this.varTLLim}); + return new Variant({dataType: this.dataType, value: this.varTLLim}); }, - set: (variant: Variant) => { - switch (limDataType) { + set: (variant: Variant): StatusCodes => { + switch (this.dataType) { case DataType.Double: this.varTLLim = parseFloat(variant.value); return StatusCodes.Good; @@ -341,14 +347,14 @@ export class LimitMonitoringDAMockup { - return new Variant({dataType: limDataType, value: this.varWLLim}); + return new Variant({dataType: this.dataType, value: this.varWLLim}); }, - set: (variant: Variant) => { - switch (limDataType) { + set: (variant: Variant): StatusCodes => { + switch (this.dataType) { case DataType.Double: this.varWLLim = parseFloat(variant.value); return StatusCodes.Good; @@ -385,14 +391,14 @@ export class LimitMonitoringDAMockup { - return new Variant({dataType: limDataType, value: this.varALLim}); + return new Variant({dataType: this.dataType, value: this.varALLim}); }, - set: (variant: Variant) => { - switch (limDataType) { + set: (variant: Variant): StatusCodes => { + switch (this.dataType) { case DataType.Double: this.varALLim = parseFloat(variant.value); return StatusCodes.Good; @@ -416,9 +422,10 @@ export class LimitMonitoringDAMockup , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface LimitMonitoringRuntime { ++ VAHEn: DataItem ++ VAHLim: DataItem ++ VAHAct: DataItem ++ VWHEn: DataItem ++ VWHLim: DataItem ++ VWHAct: DataItem ++ VTHEn: DataItem ++ VTHLim: DataItem ++ VTHAct: DataItem ++ VALEn: DataItem ++ VALLim: DataItem ++ VALAct: DataItem ++ VWLEn: DataItem ++ VWLLim: DataItem ++ VWLAct: DataItem ++ VTLEn: DataItem ++ VTLLim: DataItem ++ VTLAct: DataItem +} + +class LimitMonitoring{ + - dAController: any + - initialize(): void +} + +LimitMonitoringRuntime <-- LimitMonitoring +LimitMonitoringSpec --> LimitMonitoring : <> +LimitMonitoringSpec --> LimitMonitoringMockup : <> +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.spec.ts new file mode 100644 index 00000000..3238e8ec --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.spec.ts @@ -0,0 +1,138 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../connection'; + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {LimitMonitoring} from './LimitMonitoring'; +import {DataAssemblyController} from '../../DataAssemblyController'; +import {AnaMon} from '../../indicatorElement'; +import {MockupServer} from '../../../../_utils'; +import {LimitMonitoringMockup} from './LimitMonitoring.mockup'; +import {getAnaMonOptions} from '../../indicatorElement/AnaView/AnaMon/AnaMon.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('LimitMonitoring', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getAnaMonOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create LimitMonitoring', async () => { + + const dataAssemblyController = new AnaMon(dataAssemblyOptions, emptyOPCUAConnection); + const limitMonitoring = new LimitMonitoring(dataAssemblyController); + + expect(limitMonitoring).to.not.be.undefined; + + expect(dataAssemblyController.communication.VAHEn).to.not.be.undefined; + expect(dataAssemblyController.communication.VAHLim).to.not.be.undefined; + expect(dataAssemblyController.communication.VAHAct).to.not.be.undefined; + + expect(dataAssemblyController.communication.VWHEn).to.not.be.undefined; + expect(dataAssemblyController.communication.VWHLim).to.not.be.undefined; + expect(dataAssemblyController.communication.VWHAct).to.not.be.undefined; + + expect(dataAssemblyController.communication.VTHEn).to.not.be.undefined; + expect(dataAssemblyController.communication.VTHLim).to.not.be.undefined; + expect(dataAssemblyController.communication.VTHAct).to.not.be.undefined; + + expect(dataAssemblyController.communication.VTLEn).to.not.be.undefined; + expect(dataAssemblyController.communication.VTLLim).to.not.be.undefined; + expect(dataAssemblyController.communication.VTLAct).to.not.be.undefined; + + expect(dataAssemblyController.communication.VWLEn).to.not.be.undefined; + expect(dataAssemblyController.communication.VWLLim).to.not.be.undefined; + expect(dataAssemblyController.communication.VWLAct).to.not.be.undefined; + + expect(dataAssemblyController.communication.VALEn).to.not.be.undefined; + expect(dataAssemblyController.communication.VALLim).to.not.be.undefined; + expect(dataAssemblyController.communication.VALAct).to.not.be.undefined; + }); + }); + + describe('dynamic', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + new LimitMonitoringMockup( mockupServer.nameSpace, mockupServer.rootObject, 'Variable', 'Ana'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + new LimitMonitoring(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.VAHEn.value).to.equal(false); + expect(dataAssemblyController.communication.VAHLim.value).to.equal(0); + expect(dataAssemblyController.communication.VAHAct.value).to.equal(false); + + expect(dataAssemblyController.communication.VWHEn.value).to.equal(false); + expect(dataAssemblyController.communication.VWHLim.value).to.equal(0); + expect(dataAssemblyController.communication.VWHAct.value).to.equal(false); + + expect(dataAssemblyController.communication.VTHEn.value).to.equal(false); + expect(dataAssemblyController.communication.VTHLim.value).to.equal(0); + expect(dataAssemblyController.communication.VTHAct.value).to.equal(false); + + expect(dataAssemblyController.communication.VTLEn.value).to.equal(false); + expect(dataAssemblyController.communication.VTLLim.value).to.equal(0); + expect(dataAssemblyController.communication.VTLAct.value).to.equal(false); + + expect(dataAssemblyController.communication.VWLEn.value).to.equal(false); + expect(dataAssemblyController.communication.VWLLim.value).to.equal(0); + expect(dataAssemblyController.communication.VWLAct.value).to.equal(false); + + expect(dataAssemblyController.communication.VALEn.value).to.equal(false); + expect(dataAssemblyController.communication.VALLim.value).to.equal(0); + expect(dataAssemblyController.communication.VALAct.value).to.equal(false); + }).timeout(5000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoring.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.ts similarity index 66% rename from src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoring.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.ts index 73ad007a..b25e9666 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/limitMonitoringDA/LimitMonitoring.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/limitMonitoring/LimitMonitoring.ts @@ -23,29 +23,28 @@ * SOFTWARE. */ -import {OpcUaDataItem} from '../../../connection'; -import {Constructor} from '../_helper'; -import {BaseDataAssemblyRuntime, DataAssemblyController} from '../../DataAssemblyController'; +import {DataItem} from '../../../connection'; +import {BaseDataAssemblyRuntime} from '../../DataAssemblyController'; export type LimitMonitoringRuntime = BaseDataAssemblyRuntime & { - VAHEn: OpcUaDataItem; - VAHLim: OpcUaDataItem; - VAHAct: OpcUaDataItem; - VWHEn: OpcUaDataItem; - VWHLim: OpcUaDataItem; - VWHAct: OpcUaDataItem; - VTHEn: OpcUaDataItem; - VTHLim: OpcUaDataItem; - VTHAct: OpcUaDataItem; - VALEn: OpcUaDataItem; - VALLim: OpcUaDataItem; - VALAct: OpcUaDataItem; - VWLEn: OpcUaDataItem; - VWLLim: OpcUaDataItem; - VWLAct: OpcUaDataItem; - VTLEn: OpcUaDataItem; - VTLLim: OpcUaDataItem; - VTLAct: OpcUaDataItem; + VAHEn: DataItem; + VAHLim: DataItem; + VAHAct: DataItem; + VWHEn: DataItem; + VWHLim: DataItem; + VWHAct: DataItem; + VTHEn: DataItem; + VTHLim: DataItem; + VTHAct: DataItem; + VALEn: DataItem; + VALLim: DataItem; + VALAct: DataItem; + VWLEn: DataItem; + VWLLim: DataItem; + VWLAct: DataItem; + VTLEn: DataItem; + VTLLim: DataItem; + VTLAct: DataItem; }; export class LimitMonitoring { @@ -57,24 +56,24 @@ export class LimitMonitoring { } private initialize(): void{ - this.dAController.communication.VAHEn = this.dAController.createDataItem('VAHEn', 'read'); - this.dAController.communication.VAHLim = this.dAController.createDataItem('VAHLim', 'write'); - this.dAController.communication.VAHAct = this.dAController.createDataItem('VAHAct', 'read'); - this.dAController.communication.VWHEn = this.dAController.createDataItem('VWHEn', 'read'); - this.dAController.communication.VWHLim = this.dAController.createDataItem('VWHLim', 'write'); - this.dAController.communication.VWHAct = this.dAController.createDataItem('VWHAct', 'read'); - this.dAController.communication.VTHEn = this.dAController.createDataItem('VTHEn', 'read'); - this.dAController.communication.VTHLim = this.dAController.createDataItem('VTHLim', 'write'); - this.dAController.communication.VTHAct = this.dAController.createDataItem('VTHAct', 'read'); - this.dAController.communication.VALEn = this.dAController.createDataItem('VALEn', 'read'); - this.dAController.communication.VALLim = this.dAController.createDataItem('VALLim', 'write'); - this.dAController.communication.VALAct = this.dAController.createDataItem('VALAct', 'read'); - this.dAController.communication.VWLEn = this.dAController.createDataItem('VWLEn', 'read'); - this.dAController.communication.VWLLim = this.dAController.createDataItem('VWLLim', 'write'); - this.dAController.communication.VWLAct = this.dAController.createDataItem('VWLAct', 'read'); - this.dAController.communication.VTLEn = this.dAController.createDataItem('VTLEn', 'read'); - this.dAController.communication.VTLLim = this.dAController.createDataItem('VTLLim', 'write'); - this.dAController.communication.VTLAct = this.dAController.createDataItem('VTLAct', 'read'); + this.dAController.communication.VAHEn = this.dAController.createDataItem('VAHEn', 'boolean'); + this.dAController.communication.VAHLim = this.dAController.createDataItem('VAHLim', 'number', 'write'); + this.dAController.communication.VAHAct = this.dAController.createDataItem('VAHAct', 'boolean'); + this.dAController.communication.VWHEn = this.dAController.createDataItem('VWHEn', 'boolean'); + this.dAController.communication.VWHLim = this.dAController.createDataItem('VWHLim', 'number', 'write'); + this.dAController.communication.VWHAct = this.dAController.createDataItem('VWHAct', 'boolean'); + this.dAController.communication.VTHEn = this.dAController.createDataItem('VTHEn', 'boolean'); + this.dAController.communication.VTHLim = this.dAController.createDataItem('VTHLim', 'number', 'write'); + this.dAController.communication.VTHAct = this.dAController.createDataItem('VTHAct', 'boolean'); + this.dAController.communication.VALEn = this.dAController.createDataItem('VALEn', 'boolean'); + this.dAController.communication.VALLim = this.dAController.createDataItem('VALLim', 'number', 'write'); + this.dAController.communication.VALAct = this.dAController.createDataItem('VALAct', 'boolean'); + this.dAController.communication.VWLEn = this.dAController.createDataItem('VWLEn', 'boolean'); + this.dAController.communication.VWLLim = this.dAController.createDataItem('VWLLim', 'number', 'write'); + this.dAController.communication.VWLAct = this.dAController.createDataItem('VWLAct', 'boolean'); + this.dAController.communication.VTLEn = this.dAController.createDataItem('VTLEn', 'boolean'); + this.dAController.communication.VTLLim = this.dAController.createDataItem('VTLLim', 'number', 'write'); + this.dAController.communication.VTLAct = this.dAController.createDataItem('VTLAct', 'boolean'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.mockup.spec.ts new file mode 100644 index 00000000..bc9fdbae --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.mockup.spec.ts @@ -0,0 +1,175 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {getOpModeDataItemOptions, OpModeMockup} from './OpMode.mockup'; +import {OpcUaConnection} from '../../../connection'; +import {OperationMode} from '@p2olab/polaris-interface'; +import {OpModeRuntime} from './OpMode'; + + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('OpModeMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async () => { + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create OpModeMockup', async () => { + const mockup = new OpModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static OpMode DataItemOptions', () => { + const options = getOpModeDataItemOptions(1, 'Test') as OpModeRuntime; + + expect(Object.keys(options).length).to.equal(10); + expect(options.StateChannel).to.not.be.undefined; + expect(options.StateOffAut).to.not.be.undefined; + expect(options.StateOpAut).to.not.be.undefined; + expect(options.StateAutAut).to.not.be.undefined; + expect(options.StateOffOp).to.not.be.undefined; + expect(options.StateOpOp).to.not.be.undefined; + expect(options.StateAutOp).to.not.be.undefined; + expect(options.StateOpAct).to.not.be.undefined; + expect(options.StateAutAct).to.not.be.undefined; + expect(options.StateOffAct).to.not.be.undefined; + }); + + it('dynamic OpMode DataItemOptions', () => { + const mockup = new OpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + const options = mockup.getDataItemOptions() as OpModeRuntime; + + expect(Object.keys(options).length).to.equal(10); + expect(options.StateChannel).to.not.be.undefined; + expect(options.StateOffAut).to.not.be.undefined; + expect(options.StateOpAut).to.not.be.undefined; + expect(options.StateAutAut).to.not.be.undefined; + expect(options.StateOffOp).to.not.be.undefined; + expect(options.StateOpOp).to.not.be.undefined; + expect(options.StateAutOp).to.not.be.undefined; + expect(options.StateOpAct).to.not.be.undefined; + expect(options.StateAutAct).to.not.be.undefined; + expect(options.StateOffAct).to.not.be.undefined; + }); + + it('get stateOpAct', async () => { + const mockup = new OpModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup.stateOpAct).to.be.false; + }); + + it('get stateAutAct', async () => { + const mockup = new OpModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup.stateAutAct).to.be.false; + }); + + it('get stateOffAct', async () => { + const mockup = new OpModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup.stateOffAct).to.be.true; + }); + + }); + describe('dynamic', () => { + + let mockupServer: MockupServer; + let mockup: OpModeMockup; + let connection: OpcUaConnection; + beforeEach(async function () { + this.timeout(10000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + mockup = new OpModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get StateOffOp', async () => { + mockup.opMode = OperationMode.Operator; + await connection.writeNode('Variable.StateOffOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.StateOffOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Offline); + }).timeout(2000); + + it('set and get StateOpOp', async () => { + await connection.writeNode('Variable.StateOpOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.StateOpOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Operator); + }).timeout(2000); + + it('set and get StateAutOp', async () => { + mockup.opMode = OperationMode.Operator; + await connection.writeNode('Variable.StateAutOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.StateAutOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Automatic); + }).timeout(2000); + + it('set and get StateOffOp, write false', async () => { + mockup.opMode = OperationMode.Operator; + await connection.writeNode('Variable.StateOffOp', mockupServer.nameSpaceUri, false, 'Boolean'); + await connection.readNode('Variable.StateOffOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Operator); + }).timeout(2000); + + it('set and get StateOpOp, write false', async () => { + await connection.writeNode('Variable.StateOpOp', mockupServer.nameSpaceUri, false, 'Boolean'); + await connection.readNode('Variable.StateOpOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Offline); + }).timeout(2000); + + it('set and get StateAutOp, write false', async () => { + mockup.opMode = OperationMode.Operator; + await connection.writeNode('Variable.StateAutOp', mockupServer.nameSpaceUri, false, 'Boolean'); + await connection.readNode('Variable.StateAutOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Operator); + }).timeout(2000); + + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.mockup.ts similarity index 75% rename from src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeDA.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.mockup.ts index dbbd2eef..ba543816 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeDA.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.mockup.ts @@ -25,67 +25,71 @@ import {OperationMode} from '@p2olab/polaris-interface'; import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; -export function getOpModeDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getOpModeSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - StateChannel: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StateChannel`, - dataType: 'Boolean' - }, - StateOffAut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StateOffAut`, - dataType: 'Boolean' - }, - StateOpAut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StateOpAut`, - dataType: 'Boolean' - }, - StateAutAut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StateAutAut`, - dataType: 'Boolean' - }, - StateOffOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StateOffOp`, - dataType: 'Boolean' - }, - StateOpOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StateOpOp`, - dataType: 'Boolean' - }, - StateAutOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StateAutOp`, - dataType: 'Boolean' - }, - StateOpAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StateOpAct`, - dataType: 'Boolean' - }, - StateAutAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StateAutAct`, - dataType: 'Boolean' - }, - StateOffAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.StateOffAct`, - dataType: 'Boolean' - } - } - ); + StateChannel: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateChannel`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOffAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOffAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOpAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOpAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateAutAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateAutAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOffOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOffOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOpOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOpOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateAutOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateAutOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOpAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOpAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateAutAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateAutAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOffAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOffAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); } -export class OpModeDAMockup { + +export function getOpModeDataItemOptions(namespace: number, objectBrowseName: string): object { + return getOpModeSpecificDataItemOptions(namespace, objectBrowseName); +} + + +export class OpModeMockup { public opMode: OperationMode = OperationMode.Offline; public stateChannel = false; public stateOffAut = false; @@ -157,7 +161,7 @@ export class OpModeDAMockup { get: (): Variant => { return new Variant({dataType: DataType.Boolean, value: this.stateOffOp}); }, - set: (variant: any) => { + set: (variant: Variant): StatusCodes => { this.stateOffOp = variant.value; if (this.stateOffOp) { if (this.stateOpAct && !this.stateChannel) { @@ -178,7 +182,7 @@ export class OpModeDAMockup { get: (): Variant => { return new Variant({dataType: DataType.Boolean, value: this.stateOpOp}); }, - set: (variant: any) => { + set: (variant: Variant): StatusCodes => { this.stateOpOp = variant.value; if (this.stateOpOp) { if (!this.stateChannel) { @@ -199,7 +203,7 @@ export class OpModeDAMockup { get: (): Variant => { return new Variant({dataType: DataType.Boolean, value: this.stateAutOp}); }, - set: (variant: any) => { + set: (variant: Variant): StatusCodes => { this.stateAutOp = variant.value; if (this.stateAutOp) { if (this.stateOpAct && !this.stateChannel) { @@ -259,8 +263,8 @@ export class OpModeDAMockup { return this.opMode === OperationMode.Offline; } - public getOpModeDAInstanceMockupJSON() { - return getOpModeDAMockupReferenceJSON( + public getDataItemOptions(): object { + return getOpModeDataItemOptions( this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string); } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.puml new file mode 100644 index 00000000..70f94d8f --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.puml @@ -0,0 +1,68 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface OpModeRuntime{ + + StateChannel: DataItem + + StateOffAut: DataItem + + StateOpAut: DataItem + + StateAutAut: DataItem + + StateOffOp: DataItem + + StateOpOp: DataItem + + StateAutOp: DataItem + + StateOpAct: DataItem + + StateAutAct: DataItem + + StateOffAct: DataItem +} + +enum OperationMode{ + Offline + Operator + Automatic +} + +class OpMode{ + - dAController: any + - initialize(): void + + getOperationMode(): OperationMode + + isOpMode(expectedOpMode: OperationMode): boolean + + async waitForOpModeToPassSpecificTest(expectedOpMode: OperationMode): Promise + + async setToAutomaticOperationMode(): Promise + + async setToOperatorOperationMode(): Promise + + async setToOfflineOperationMode(): Promise + + async writeOpMode(opMode: OperationMode): Promise + + isOfflineState(): boolean + + isOperatorState(): boolean + + isAutomaticState(): boolean +} + +OpModeRuntime <-- OpMode +OperationMode <-- OpMode +OpModeSpec --> OpMode : <> +OpModeSpec --> OpModeMockup : <> + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeController.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.spec.ts similarity index 54% rename from src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeController.spec.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.spec.ts index 83186a15..1e8c107b 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeController.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.spec.ts @@ -27,35 +27,25 @@ import {OpcUaConnection} from '../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions, OperationMode} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/anaserveparam.json'; import {DataAssemblyController} from '../../DataAssemblyController'; import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {OpModeDAMockup} from './OpModeDA.mockup'; -import {OpModeController} from './OpModeController'; +import {OpModeMockup} from './OpMode.mockup'; +import {OpMode} from './OpMode'; +import {getAnaServParamOptions} from '../../operationElement/servParam/anaServParam/AnaServParam.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('OpMode', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperatorElement/AnaServParam', - dataItems: baseDataAssemblyOptions - }; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } + + const dataAssemblyOptions = getAnaServParamOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create OpModeController', () => { + const emptyOPCUAConnection = new OpcUaConnection(); + it('should create OpMode', () => { + const da = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection) as any; - const opMode = new OpModeController(da); + const opMode = new OpMode(da); expect(opMode).to.not.be.undefined; expect((da).communication.StateChannel).to.not.be.undefined; @@ -70,21 +60,19 @@ describe('OpMode', () => { expect((da).communication.StateOffAct).to.not.be.undefined; }); }); + describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: OpModeDAMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new OpModeDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + new OpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -95,47 +83,47 @@ describe('OpMode', () => { }); it('should subscribe successfully', async () => { - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - new OpModeController(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect((da1).communication.StateChannel.value).equal(false); - expect((da1).communication.StateOffAut.value).equal(false); - expect((da1).communication.StateOpAut.value).equal(false); - expect((da1).communication.StateAutAut.value).equal(false); - expect((da1).communication.StateOffOp.value).equal(false); - expect((da1).communication.StateOpOp.value).equal(false); - expect((da1).communication.StateAutOp.value).equal(false); - expect((da1).communication.StateOpAct.value).equal(false); - expect((da1).communication.StateAutAct.value).equal(false); - expect((da1).communication.StateOffAct.value).equal(true); + + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + new OpMode(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect((dataAssemblyController).communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); }).timeout(5000); }); describe('dynamic functions, Offline', async () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: OpModeDAMockup; - let opMode: OpModeController; - let da1: any; + let mockup: OpModeMockup; + let opMode: OpMode; + let dataAssemblyController: any; beforeEach(async function () { mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new OpModeDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + mockup = new OpModeMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - opMode = new OpModeController(da1); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + + dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + opMode = new OpMode(dataAssemblyController); await connection.connect(); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); }); afterEach(async function () { @@ -152,45 +140,51 @@ describe('OpMode', () => { expect(opMode.isOpMode(OperationMode.Operator)).to.be.false; expect(opMode.isOpMode(OperationMode.Automatic)).to.be.false; }); - it('isOffState', () => { - expect(opMode.isOffState()).to.be.true; + it('isOfflineState', () => { + expect(opMode.isOfflineState()).to.be.true; }); it('setToAutomaticOperationMode(), should set to Automatic', async () => { await opMode.setToAutomaticOperationMode(); - expect(da1.communication.StateAutAct.value).to.be.true; + expect(dataAssemblyController.communication.StateAutAct.value).to.be.true; expect(mockup.opMode = OperationMode.Automatic); }); it('setToOperatorOperationMode(), should set to Operator', async () => { await opMode.setToOperatorOperationMode(); - expect(da1.communication.StateOpAct.value).to.be.true; + expect(dataAssemblyController.communication.StateOpAct.value).to.be.true; expect(mockup.opMode = OperationMode.Operator); }); + + it('setToOfflineOperationMode(), should set to Offline', async () => { + await opMode.setToOfflineOperationMode(); + expect(dataAssemblyController.communication.StateOffAct.value).to.be.true; + expect(mockup.opMode = OperationMode.Offline); + }); }); describe('dynamic functions, Operator', async () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: OpModeDAMockup; - let opMode: OpModeController; - let da1: any; + let mockup: OpModeMockup; + let opMode: OpMode; + let dataAssemblyController: any; beforeEach(async function () { mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new OpModeDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable', OperationMode.Operator); + // initialize with Operator OperationMode + mockup = new OpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable', OperationMode.Operator); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - opMode = new OpModeController(da1); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + + dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + opMode = new OpMode(dataAssemblyController); await connection.connect(); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); }); afterEach(async function () { @@ -202,45 +196,44 @@ describe('OpMode', () => { it('getOperationMode, should be Operator', () => { expect(opMode.getOperationMode()).to.equal(OperationMode.Operator); }); - it('isOpMode', () => { + it('Verify correct State recognition', () => { expect(opMode.isOpMode(OperationMode.Offline)).to.be.false; expect(opMode.isOpMode(OperationMode.Operator)).to.be.true; expect(opMode.isOpMode(OperationMode.Automatic)).to.be.false; }); it('setToAutomaticOperationMode(), should set to Automatic', async () => { await opMode.setToAutomaticOperationMode(); - expect(da1.communication.StateAutAct.value).to.be.true; + expect(dataAssemblyController.communication.StateAutAct.value).to.be.true; expect(mockup.opMode = OperationMode.Automatic); }); it('setToOperatorOperationMode(), nothing should happen', async () => { await opMode.setToOperatorOperationMode(); - expect(da1.communication.StateOpAct.value).to.be.true; + expect(dataAssemblyController.communication.StateOpAct.value).to.be.true; expect(mockup.opMode = OperationMode.Operator); }); }); describe('dynamic functions, Automatic', async () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: OpModeDAMockup; - let opMode: OpModeController; - let da1: any; + let mockup: OpModeMockup; + let opMode: OpMode; + let dataAssemblyController: any; beforeEach(async function () { mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new OpModeDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable', OperationMode.Automatic); + // initialize with Automatic OperationMode + mockup = new OpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable', OperationMode.Automatic); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - opMode = new OpModeController(da1); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + opMode = new OpMode(dataAssemblyController); await connection.connect(); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); }); afterEach(async function () { @@ -252,22 +245,36 @@ describe('OpMode', () => { it('getOperationMode, should be Automatic', () => { expect(opMode.getOperationMode()).to.equal(OperationMode.Automatic); }); - it('isOpMode', () => { + + it('Verify correct state recognition', () => { + expect(opMode.isOfflineState()).to.be.false; + expect(opMode.isOperatorState()).to.be.false; + expect(opMode.isAutomaticState()).to.be.true; + }); + + it('Verify correct state check', () => { expect(opMode.isOpMode(OperationMode.Offline)).to.be.false; expect(opMode.isOpMode(OperationMode.Operator)).to.be.false; expect(opMode.isOpMode(OperationMode.Automatic)).to.be.true; }); - it('isOffState', () => { - expect(opMode.isOffState()).to.be.false; - }); - it('setToAutomaticOperationMode(), nothing should happen', async () => { + it('setToAutomaticOperationMode() while already in Automatic --> nothing should happen', async () => { await opMode.setToAutomaticOperationMode(); - expect(da1.communication.StateAutAct.value).to.be.true; + expect(dataAssemblyController.communication.StateAutAct.value).to.be.true; expect(mockup.opMode = OperationMode.Automatic); }); + it('setToOperatorOperationMode()', async () => { + await opMode.setToOperatorOperationMode(); + expect(dataAssemblyController.communication.StateOpAct.value).to.be.true; + expect(mockup.opMode = OperationMode.Operator); + }); + + it('setToOfflineOperationMode()', async () => { + await opMode.setToOfflineOperationMode(); + expect(dataAssemblyController.communication.StateOffAct.value).to.be.true; + expect(mockup.opMode = OperationMode.Offline); + }); + }); - //TODO test more }); - diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeController.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.ts similarity index 68% rename from src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeController.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.ts index 046799dc..880330e7 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/opModeDA/OpModeController.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpMode.ts @@ -24,24 +24,24 @@ */ import {OperationMode} from '@p2olab/polaris-interface'; -import {OpcUaDataItem} from '../../../connection'; +import {DataItem} from '../../../connection'; import {BaseDataAssemblyRuntime} from '../../DataAssemblyController'; import {catDataAssembly} from '../../../../../logging'; export type OpModeRuntime = BaseDataAssemblyRuntime & { - StateChannel: OpcUaDataItem; - StateOffAut: OpcUaDataItem; - StateOpAut: OpcUaDataItem; - StateAutAut: OpcUaDataItem; - StateOffOp: OpcUaDataItem; - StateOpOp: OpcUaDataItem; - StateAutOp: OpcUaDataItem; - StateOpAct: OpcUaDataItem; - StateAutAct: OpcUaDataItem; - StateOffAct: OpcUaDataItem; + StateChannel: DataItem; + StateOffAut: DataItem; + StateOpAut: DataItem; + StateAutAut: DataItem; + StateOffOp: DataItem; + StateOpOp: DataItem; + StateAutOp: DataItem; + StateOpAct: DataItem; + StateAutAct: DataItem; + StateOffAct: DataItem; }; -export class OpModeController { +export class OpMode { private dAController: any; @@ -50,26 +50,26 @@ export class OpModeController { this.initialize(); } - private initialize(){ - this.dAController.communication.StateChannel = this.dAController.createDataItem('StateChannel', 'read', 'boolean'); + private initialize(): void { + this.dAController.communication.StateChannel = this.dAController.createDataItem('StateChannel', 'boolean'); - this.dAController.communication.StateOffAut = this.dAController.createDataItem('StateOffAut', 'read', 'boolean'); - this.dAController.communication.StateOpAut = this.dAController.createDataItem('StateOpAut', 'read', 'boolean'); - this.dAController.communication.StateAutAut = this.dAController.createDataItem('StateAutAut', 'read', 'boolean'); + this.dAController.communication.StateOffAut = this.dAController.createDataItem('StateOffAut', 'boolean'); + this.dAController.communication.StateOpAut = this.dAController.createDataItem('StateOpAut', 'boolean'); + this.dAController.communication.StateAutAut = this.dAController.createDataItem('StateAutAut', 'boolean'); - this.dAController.communication.StateOffOp = this.dAController.createDataItem('StateOffOp', 'write', 'boolean'); - this.dAController.communication.StateOpOp = this.dAController.createDataItem('StateOpOp', 'write', 'boolean'); - this.dAController.communication.StateAutOp = this.dAController.createDataItem('StateAutOp', 'write', 'boolean'); + this.dAController.communication.StateOffOp = this.dAController.createDataItem('StateOffOp', 'boolean', 'write'); + this.dAController.communication.StateOpOp = this.dAController.createDataItem('StateOpOp', 'boolean', 'write'); + this.dAController.communication.StateAutOp = this.dAController.createDataItem('StateAutOp', 'boolean', 'write'); - this.dAController.communication.StateOffAct = this.dAController.createDataItem('StateOffAct', 'read', 'boolean'); - this.dAController.communication.StateOpAct = this.dAController.createDataItem('StateOpAct', 'read', 'boolean'); - this.dAController.communication.StateAutAct = this.dAController.createDataItem('StateAutAct', 'read', 'boolean'); + this.dAController.communication.StateOffAct = this.dAController.createDataItem('StateOffAct', 'boolean'); + this.dAController.communication.StateOpAct = this.dAController.createDataItem('StateOpAct', 'boolean'); + this.dAController.communication.StateAutAct = this.dAController.createDataItem('StateAutAct', 'boolean'); } public getOperationMode(): OperationMode { - if (this.isOffState()) { + if (this.isOfflineState()) { return OperationMode.Offline; - } else if (this.isManualState()) { + } else if (this.isOperatorState()) { return OperationMode.Operator; } else if (this.isAutomaticState()) { return OperationMode.Automatic; @@ -82,9 +82,9 @@ export class OpModeController { case OperationMode.Automatic: return this.isAutomaticState(); case OperationMode.Operator: - return this.isManualState(); + return this.isOperatorState(); case OperationMode.Offline: - return this.isOffState(); + return this.isOfflineState(); } } @@ -108,19 +108,19 @@ export class OpModeController { } /** - * Set data assembly to automatic operation mode and source to external source + * Set data assembly to automatic operation mode * */ public async setToAutomaticOperationMode(): Promise { catDataAssembly.info(`[${this.dAController.name}] Current opMode = ${this.getOperationMode()}`); - if (this.isOffState()) { + if (this.isOfflineState()) { catDataAssembly.trace(`[${this.dAController.name}] First go to Manual state`); this.writeOpMode(OperationMode.Operator); await this.waitForOpModeToPassSpecificTest(OperationMode.Operator); } catDataAssembly.info(`[${this.dAController.name}] Current opMode = ${this.getOperationMode()}`); - if (this.isManualState()) { + if (this.isOperatorState()) { catDataAssembly.trace(`[${this.dAController.name}] Then to automatic`); this.writeOpMode(OperationMode.Automatic); await this.waitForOpModeToPassSpecificTest(OperationMode.Automatic); @@ -128,13 +128,38 @@ export class OpModeController { catDataAssembly.info(`[${this.dAController.name}] Current opMode = ${this.getOperationMode()}`); } + /** + * Set data assembly to operator operation mode + * + */ public async setToOperatorOperationMode(): Promise { - if (!this.isManualState()) { + if (!this.isOperatorState()) { this.writeOpMode(OperationMode.Operator); await this.waitForOpModeToPassSpecificTest(OperationMode.Operator); } } + /** + * Set data assembly to offline operation mode + * + */ + public async setToOfflineOperationMode(): Promise { + catDataAssembly.info(`[${this.dAController.name}] Current opMode = ${this.getOperationMode()}`); + if (this.isAutomaticState()) { + catDataAssembly.trace(`[${this.dAController.name}] First go to Manual state`); + this.writeOpMode(OperationMode.Operator); + await this.waitForOpModeToPassSpecificTest(OperationMode.Operator); + } + catDataAssembly.info(`[${this.dAController.name}] Current opMode = ${this.getOperationMode()}`); + + if (this.isOperatorState()) { + catDataAssembly.trace(`[${this.dAController.name}] Then to offline`); + this.writeOpMode(OperationMode.Offline); + await this.waitForOpModeToPassSpecificTest(OperationMode.Offline); + } + catDataAssembly.info(`[${this.dAController.name}] Current opMode = ${this.getOperationMode()}`); + } + public async writeOpMode(opMode: OperationMode): Promise { catDataAssembly.info(`[${this.dAController.name}] Write opMode: ${opMode}`); if (opMode === OperationMode.Automatic) { @@ -144,10 +169,10 @@ export class OpModeController { } else if (opMode === OperationMode.Offline) { await this.dAController.communication.StateOffOp.write(true); } - catDataAssembly.info(`[${this.dAController.name}] Setting opMode successfully`); + catDataAssembly.info(`[${this.dAController.name}] OpMode changed successfully`); } - public isOffState(): boolean { + public isOfflineState(): boolean { return this.dAController.communication.StateOffAct.value === true; } @@ -155,7 +180,7 @@ export class OpModeController { return this.dAController.communication.StateAutAct.value === true; } - public isManualState(): boolean { + public isOperatorState(): boolean { return this.dAController.communication.StateOpAct.value === true; } } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpModeStatemachine.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpModeStatemachine.puml new file mode 100644 index 00000000..e894a849 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/opMode/OpModeStatemachine.puml @@ -0,0 +1,48 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml + +[*] --> Offline + +Offline : StateOffAct = 1 +Offline : StateOpAct = 0 +Offline : StateAutAct = 0 + +Operator : StateOffAct = 0 +Operator : StateOpAct = 1 +Operator : StateAutAct = 0 + +Automatic : StateOffAct = 0 +Automatic : StateOpAct = 0 +Automatic : StateAutAct = 1 + +Offline -> Operator : StateOpAut(if StateChannel) \n StateOpOp(if not StateChannel) +Operator -> Offline : StateOffAut(if StateChannel) \n StateOffOp(if not StateChannel) + +Operator -> Automatic : StateAutAut(if StateChannel) \n StateAutOp(if not StateChannel) +Automatic -> Operator : StateOpAut(if StateChannel) \n StateOpOp(if not StateChannel) + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.mockup.spec.ts new file mode 100644 index 00000000..245633a3 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.mockup.spec.ts @@ -0,0 +1,104 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {getOSLevelDataItemOptions, OSLevelMockup} from './OSLevel.mockup'; +import {OSLevelRuntime} from './OSLevel'; +import {OpcUaConnection} from '../../../connection'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('OSLevelMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create OSLevelMockup', async () => { + const mockup= new OSLevelMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + + }); + + it('static OSLevel DataItemOptions', () => { + const options = getOSLevelDataItemOptions(1, 'Test') as OSLevelRuntime; + + expect(Object.keys(options).length).to.equal(1); + expect(options.OSLevel).to.not.be.undefined; + }); + + it('dynamic OSLevel DataItemOptions', () => { + const mockup = new OSLevelMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + const options = mockup.getDataItemOptions() as OSLevelRuntime; + + expect(Object.keys(options).length).to.equal(1); + expect(options.OSLevel).to.not.be.undefined; + }); + }); + + describe('dynamic', () => { + + let mockupServer: MockupServer; + let mockup: OSLevelMockup; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(10000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + mockup = new OSLevelMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get OsLevel', async () => { + mockup.osLevel = 12; + await connection.readNode('Variable.OSLevel', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(12)); + await connection.writeNode('Variable.OSLevel', mockupServer.nameSpaceUri, 1, 'Byte'); + await connection.readNode('Variable.OSLevel', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + expect(mockup.osLevel).to.equal(1); + }).timeout(2000); + + }); + +}); diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.mockup.ts new file mode 100644 index 00000000..23c5cf5a --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.mockup.ts @@ -0,0 +1,80 @@ +/* + * MIT License + * + * Copyright (c) 2020 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {AccessLevelFlag, DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; + + +function getOSLevelSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + OSLevel: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.OSLevel`, + dataType: 'Byte' + } as OpcUaNodeOptions + }); +} + +export function getOSLevelDataItemOptions(namespace: number, objectBrowseName: string): object { + return getOSLevelSpecificDataItemOptions(namespace, objectBrowseName); +} + +export class OSLevelMockup { + public osLevel = 0; + protected mockupNode: UAObject; + + constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + + this.mockupNode = rootNode; + + namespace.addVariable({ + componentOf: rootNode, + nodeId: `ns=${namespace.index};s=${variableName}.OSLevel`, + browseName: `${variableName}.OSLevel`, + dataType: DataType.Byte, + accessLevel: AccessLevelFlag.CurrentRead + AccessLevelFlag.CurrentWrite, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Byte, value: this.osLevel}); + }, + set: (variant: Variant): StatusCodes => { + let response = StatusCodes.Bad; + const reqOSLevel = parseInt(variant.value, 10); + if (reqOSLevel <= 255 && reqOSLevel >= 0) { + this.osLevel = reqOSLevel; + response = StatusCodes.Good; + } + return response; + }, + }, + }); + } + + public getDataItemOptions(): object { + return getOSLevelDataItemOptions( + this.mockupNode.namespaceIndex, + this.mockupNode.browseName.name as string); + } +} diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.puml new file mode 100644 index 00000000..244f2739 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.puml @@ -0,0 +1,42 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface OSLevel{ + + DataItem +} + +class OSLevel{ + - dAController: any + - initialize(): void + + OSLevel(): number | undefined +} + +OSLevelRuntime <-- OSLevel +OSLevelSpec --> OSLevel : <> +OSLevelSpec --> OSLevelMockup : <> +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.spec.ts new file mode 100644 index 00000000..5e534fb4 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.spec.ts @@ -0,0 +1,97 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../connection'; +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OSLevel} from './OSLevel'; +import {DataAssemblyController} from '../../DataAssemblyController'; +import {MockupServer} from '../../../../_utils'; +import {OSLevelMockup} from './OSLevel.mockup'; +import {getBinMonOptions} from '../../indicatorElement/BinView/BinMon/BinMon.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('OSLevel', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + dataAssemblyOptions = getBinMonOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + let osLevelObject: OSLevel; + let da: any; + + beforeEach(()=>{ + const emptyOPCUAConnection = new OpcUaConnection(); + da = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection); + osLevelObject = new OSLevel(da); + }); + + it('should create OSLevel', async () => { + expect(osLevelObject.OSLevel).to.equal(0); + expect(da.communication.OSLevel).to.not.be.undefined; + }); + + it('getter', async () => { + expect(osLevelObject.OSLevel).to.equal(0); + }); + + }); + describe('dynamic', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + new OSLevelMockup( mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + new OSLevel(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + expect(dataAssemblyController.communication.OSLevel.value).to.equal(0); + }).timeout(5000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevel.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.ts similarity index 62% rename from src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevel.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.ts index 1bc2a7ac..7ea9072a 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/osLevelDA/OSLevel.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/osLevel/OSLevel.ts @@ -23,35 +23,21 @@ * SOFTWARE. */ -import {OpcUaDataItem} from '../../../connection'; -import {Constructor} from '../_helper'; -import {BaseDataAssemblyRuntime, DataAssemblyController} from '../../DataAssemblyController'; +import {DataItem} from '../../../connection'; -export interface OSLevelRuntime extends BaseDataAssemblyRuntime { - OSLevel: OpcUaDataItem; +export interface OSLevelRuntime { + OSLevel: DataItem; } export class OSLevel { private dAController: any; - osLevel: number | undefined; constructor(dAController: any) { this.dAController = dAController; - this.initialize(); + this.dAController.communication.OSLevel = this.dAController.createDataItem('OSLevel', 'number', 'write'); } - private initialize(): void{ - //handle static and dynamic variables - if(typeof this.dAController.options.dataItems.OSLevel == 'string'){ - this.osLevel = Number(this.dAController.options.dataItems.OSLevel); - } - else{ - this.dAController.communication.OSLevel = this.dAController.createDataItem('OSLevel', 'write'); - } - } - - get OSLevel(): number | undefined { - if(this.osLevel!=undefined) return this.osLevel; //static - else return this.dAController.communication.OSLevel.value; //dynamic + get OSLevel(): number { + return this.dAController.communication.OSLevel.value; } } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.mockup.spec.ts new file mode 100644 index 00000000..a793e6e0 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.mockup.spec.ts @@ -0,0 +1,100 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {getResetDataItemOptions, ResetMockup} from './Reset.mockup'; +import {OpcUaConnection} from '../../../connection'; +import {ResetRuntime} from './Reset'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('ResetMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create ResetMockup', async () => { + const mockup= new ResetMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + + }); + + it('static Reset DataItemOptions', () => { + const options = getResetDataItemOptions(1, 'Test') as ResetRuntime; + + expect(Object.keys(options).length).to.equal(2); + expect(options.ResetOp).to.not.be.undefined; + expect(options.ResetAut).to.not.be.undefined; + }); + + it('dynamic Reset DataItemOptions', () => { + const mockup = new ResetMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + const options = mockup.getDataItemOptions() as ResetRuntime; + + expect(Object.keys(options).length).to.equal(2); + expect(options.ResetOp).to.not.be.undefined; + expect(options.ResetAut).to.not.be.undefined; + }); + }); + + describe('dynamic', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(10000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + new ResetMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get ResetOp', async () => { + await connection.writeNode('Variable.ResetOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.ResetOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(true)); + }).timeout(2000); + + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/ResetDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.mockup.ts similarity index 83% rename from src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/ResetDA.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.mockup.ts index f70822a2..22f3379e 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/ResetDA.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.mockup.ts @@ -24,26 +24,31 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; -export function getResetDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getResetSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ ResetOp: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.ResetOp`, dataType: 'Boolean' - }, + } as OpcUaNodeOptions, ResetAut: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.ResetAut`, dataType: 'Boolean' - } + } as OpcUaNodeOptions }); } -export class ResetDAMockup { + +export function getResetDataItemOptions(namespace: number, objectBrowseName: string): object { + return getResetSpecificDataItemOptions(namespace, objectBrowseName); +} + + +export class ResetMockup { protected resetOp = false; protected resetAut = false; protected mockupNode: UAObject; @@ -64,7 +69,7 @@ export class ResetDAMockup { get: (): Variant => { return new Variant({dataType: DataType.Boolean, value: this.resetOp}); }, - set: (variant: Variant) => { + set: (variant: Variant): StatusCodes => { this.resetOp = variant.value; return StatusCodes.Good; }, @@ -84,8 +89,8 @@ export class ResetDAMockup { }); } - public getResetDAInstanceMockupJSON() { - return getResetDAMockupReferenceJSON( + public getDataItemOptions(): object { + return getResetDataItemOptions( this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string); } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.puml new file mode 100644 index 00000000..b6d9acbc --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.puml @@ -0,0 +1,42 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface ResetRuntime{ + + ResetOp: DataItem + + ResetAut: DataItem +} + +class Reset{ + - dAController: any + - initialize(): void +} + +ResetRuntime <-- Reset +ResetSpec --> Reset : <> +ResetSpec --> ResetMockup : <> +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/Reset.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.spec.ts similarity index 57% rename from src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/Reset.spec.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.spec.ts index 7a303d9f..4f7a2f88 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/Reset.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.spec.ts @@ -28,51 +28,44 @@ import {OpcUaConnection} from '../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/monbinvlv.json'; import {DataAssemblyController} from '../../DataAssemblyController'; import {MonBinVlv} from '../../activeElement'; import {Reset} from './Reset'; import {MockupServer} from '../../../../_utils'; -import {OSLevelDAMockup} from '../osLevelDA/OSLevelDA.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {OSLevel} from '../osLevelDA/OSLevel'; -import {ResetDAMockup} from './ResetDA.mockup'; +import {ResetMockup} from './Reset.mockup'; +import {getMonBinVlvOptions} from '../../activeElement/vlv/binVlv/monBinVlv/MonBinVlv.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('Reset', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/MonBinVlv', - dataItems: baseDataAssemblyOptions - }; + + const dataAssemblyOptions = getMonBinVlvOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + it('should create Reset', () => { - const da1 = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection) as MonBinVlv; - const reset = new Reset(da1); //this will set communication variables + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection) as MonBinVlv; + const reset = new Reset(dataAssemblyController); //this will set communication dataAssemblies expect(reset).to.not.to.undefined; - expect(da1.communication.ResetAut).to.not.to.undefined; - expect(da1.communication.ResetOp).to.not.to.undefined; + expect(dataAssemblyController.communication.ResetAut).to.not.to.undefined; + expect(dataAssemblyController.communication.ResetOp).to.not.to.undefined; }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: ResetDAMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new ResetDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + new ResetMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -83,20 +76,14 @@ describe('Reset', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - new Reset(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.ResetAut.value).to.be.false; - expect(da1.communication.ResetOp.value).to.be.false; + + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + new Reset(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + expect(dataAssemblyController.communication.ResetAut.value).to.be.false; + expect(dataAssemblyController.communication.ResetOp.value).to.be.false; }).timeout(5000); }); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/Reset.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.ts similarity index 80% rename from src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/Reset.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.ts index d87e42aa..d8314158 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/resetDA/Reset.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/reset/Reset.ts @@ -23,13 +23,12 @@ * SOFTWARE. */ -import {OpcUaDataItem} from '../../../connection'; -import {Constructor} from '../_helper'; -import {BaseDataAssemblyRuntime, DataAssemblyController} from '../../DataAssemblyController'; +import {DataItem} from '../../../connection'; +import {BaseDataAssemblyRuntime} from '../../DataAssemblyController'; export interface ResetRuntime extends BaseDataAssemblyRuntime { - ResetOp: OpcUaDataItem; - ResetAut: OpcUaDataItem; + ResetOp: DataItem; + ResetAut: DataItem; } export class Reset { @@ -37,12 +36,7 @@ export class Reset { constructor(dAController: any) { this.dAController = dAController; - this.initialize(); + this.dAController.communication.ResetOp= this.dAController.createDataItem('ResetOp', 'boolean', 'write'); + this.dAController.communication.ResetAut = this.dAController.createDataItem('ResetAut', 'boolean', 'write'); } - - private initialize(){ - this.dAController.communication.ResetOp= this.dAController.createDataItem('ResetOp', 'write'); - this.dAController.communication.ResetAut = this.dAController.createDataItem('ResetAut', 'write'); - } - } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSetting.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSetting.mockup.spec.ts new file mode 100644 index 00000000..67557804 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSetting.mockup.spec.ts @@ -0,0 +1,109 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {getScaleSettingsDataItemOptions, ScaleSettingMockup} from './ScaleSetting.mockup'; +import {ScaleSettingsRuntime} from './ScaleSettings'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('ScaleSettingsMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + describe('DIntScaleSettings', () => { + + it('should create DIntScaleSettingsMockup', async () => { + const mockup= new ScaleSettingMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'DInt'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getScaleSettingsDataItemOptions(1, 'Test', 'DInt') as ScaleSettingsRuntime; + + expect(Object.keys(options).length).to.equal(2); + expect(options.VSclMax).to.not.be.undefined; + expect(options.VSclMin).to.not.be.undefined; + }); + + it('dynamic DataItemOptions', () => { + const mockup = new ScaleSettingMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'DInt'); + const options = mockup.getDataItemOptions() as ScaleSettingsRuntime; + + expect(Object.keys(options).length).to.equal(2); + expect(options.VSclMax).to.not.be.undefined; + expect(options.VSclMin).to.not.be.undefined; + }); + }); + + describe('AnaScaleSettings', () => { + + it('should create AnaScaleSettingsMockup', async () => { + const mockup= new ScaleSettingMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'Ana'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getScaleSettingsDataItemOptions(1, 'Test', 'Ana') as ScaleSettingsRuntime; + + expect(Object.keys(options).length).to.equal(2); + expect(options.VSclMax).to.not.be.undefined; + expect(options.VSclMin).to.not.be.undefined; + }); + + it('dynamic DataItemOptions', () => { + const mockup = new ScaleSettingMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'Ana'); + const options = mockup.getDataItemOptions() as ScaleSettingsRuntime; + + expect(Object.keys(options).length).to.equal(2); + expect(options.VSclMax).to.not.be.undefined; + expect(options.VSclMin).to.not.be.undefined; + }); + }); + + it('should create DIntScaleSettingsMockup', async () => { + const mockup= new ScaleSettingMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'DInt'); + expect(mockup).to.not.be.undefined; + }); + + }); + + +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettingDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSetting.mockup.ts similarity index 68% rename from src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettingDA.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSetting.mockup.ts index ce2f93dd..40ddff60 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettingDA.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSetting.mockup.ts @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2020 P2O-Lab , + * Copyright (c) 2021 P2O-Lab , * Chair for Process Control Systems, Technische Universität Dresden * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -25,43 +25,47 @@ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; -export function getScaleSettingDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string, - type: T) { - +function getScaleSettingsSpecificDataItemOptions(namespace: number, objectBrowseName: string, type: T): object { return ({ VSclMin: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VSclMin`, - dataType: type + dataType: (type === 'Ana')? 'Float': 'Int32' }, VSclMax: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VSclMax`, - dataType: type + dataType: (type === 'Ana')? 'Float': 'Int32' } }); } -export class ScaleSettingDAMockup { + +export function getScaleSettingsDataItemOptions(namespace: number, objectBrowseName: string, type: T): object { + return getScaleSettingsSpecificDataItemOptions(namespace, objectBrowseName, type); +} + + +export class ScaleSettingMockup { public vSclMin = 0; public vSclMax = 0; - private readonly type: DataType; + private readonly type: 'Ana' | 'DInt'; + private readonly dataType: DataType; protected mockupNode: UAObject; constructor(namespace: Namespace, rootNode: UAObject, variableName: string, type: T) { this.type = type; + this.dataType = (type === 'Ana')? DataType.Double : DataType.Int32; this.mockupNode = rootNode; namespace.addVariable({ componentOf: this.mockupNode, nodeId: `ns=${namespace.index};s=${variableName}.VSclMin`, browseName: `${variableName}.VSclMin`, - dataType: this.type, + dataType: this.dataType, value: { get: (): Variant => { - return new Variant({dataType: this.type, value: this.vSclMin}); + return new Variant({dataType: this.dataType, value: this.vSclMin}); }, }, }); @@ -70,20 +74,19 @@ export class ScaleSettingDAMockup { componentOf: this.mockupNode, nodeId: `ns=${namespace.index};s=${variableName}.VSclMax`, browseName: `${variableName}.VSclMax`, - dataType: this.type, + dataType: this.dataType, value: { get: (): Variant => { - return new Variant({dataType: this.type, value: this.vSclMax}); + return new Variant({dataType: this.dataType, value: this.vSclMax}); }, }, }); } - public getScaleSettingDAInstanceMockupJSON() { - return getScaleSettingDAMockupReferenceJSON( + public getDataItemOptions(): object { + return getScaleSettingsDataItemOptions( this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string, - (this.type === DataType.Double)? 'Float' : 'Int32' - ); + this.type); } } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSettings.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSettings.puml new file mode 100644 index 00000000..972a4f38 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSettings.puml @@ -0,0 +1,43 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface ScaleSettingsRuntime{ + + VSclMin: DataItem + + VSclMax: DataItem +} + +class ScaleSettings{ + - dAController: any + - initialize(): void +} + +ScaleSettingsRuntime <-- ScaleSettings +ScaleSettingsSpec --> ScaleSettings : <> +ScaleSettingsSpec --> ScaleSettingsMockup : <> + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettings.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSettings.spec.ts similarity index 64% rename from src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettings.spec.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSettings.spec.ts index a728a4b6..c0475ef1 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettings.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSettings.spec.ts @@ -28,26 +28,21 @@ import {OpcUaConnection} from '../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/dintmanint.json'; import {DataAssemblyController} from '../../DataAssemblyController'; import {ScaleSettings} from './ScaleSettings'; import {MockupServer} from '../../../../_utils'; -import {DataType, Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {ScaleSettingDAMockup} from './ScaleSettingDA.mockup'; +import {ScaleSettingMockup} from './ScaleSetting.mockup'; +import {getDIntManOptions} from '../../operationElement/man/dintMan/DIntMan.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('ScaleSettings', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperatorElement/DIntMan', - dataItems: baseDataAssemblyOptions - }; + + const dataAssemblyOptions = getDIntManOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + const emptyOPCUAConnection = new OpcUaConnection(); it('should create ScaleSettings', async () => { const da = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection) as any; const scaleSettings = new ScaleSettings(da); @@ -57,21 +52,18 @@ describe('ScaleSettings', () => { }); }); describe('dynamic', () => { + let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: ScaleSettingDAMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new ScaleSettingDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable', DataType.Double); - //TODO do for Int32? + new ScaleSettingMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable', 'Ana'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -82,20 +74,14 @@ describe('ScaleSettings', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - new ScaleSettings(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(0); + + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + new ScaleSettings(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(0); }).timeout(5000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettings.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSettings.ts similarity index 72% rename from src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettings.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSettings.ts index 02cedd59..fbfcfd6e 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/scaleSettingsDA/ScaleSettings.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/scaleSettings/ScaleSettings.ts @@ -23,15 +23,12 @@ * SOFTWARE. */ -import {ParameterInterface} from '@p2olab/polaris-interface'; -import {OpcUaDataItem} from '../../../connection'; -import {Constructor} from '../_helper'; -import {BaseDataAssemblyRuntime, DataAssemblyController} from '../../DataAssemblyController'; -import {AnaView} from '../../indicatorElement'; +import {DataItem} from '../../../connection'; +import {BaseDataAssemblyRuntime} from '../../DataAssemblyController'; export interface ScaleSettingsRuntime extends BaseDataAssemblyRuntime { - VSclMin: OpcUaDataItem; - VSclMax: OpcUaDataItem; + VSclMin: DataItem; + VSclMax: DataItem; } export class ScaleSettings { @@ -42,17 +39,8 @@ export class ScaleSettings { this.initialize(); } - private initialize(){ - this.dAController.communication.VSclMax = this.dAController.createDataItem('VSclMax', 'read'); - this.dAController.communication.VSclMin = this.dAController.createDataItem('VSclMin', 'read'); + private initialize(): void{ + this.dAController.communication.VSclMax = this.dAController.createDataItem('VSclMax', 'number'); + this.dAController.communication.VSclMin = this.dAController.createDataItem('VSclMin', 'number'); } - - //TODO: adjust function -/* public scaleSettingsToJson(): ParameterInterface { - return { - ...super.toJson(), - unit: this.getUnit() - }; - }*/ - } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.mockup.spec.ts new file mode 100644 index 00000000..4fc9c1ef --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.mockup.spec.ts @@ -0,0 +1,170 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {OpcUaConnection} from '../../../connection'; +import {getServiceOpModeDataItemOptions, ServiceOpModeMockup} from './ServiceOpMode.mockup'; +import {OperationMode} from '@p2olab/polaris-interface'; +import {ServiceOpModeRuntime} from './ServiceOpMode'; + + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('ServiceOpModeMockup', () => { + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create ServiceOpModeMockup', async () => { + const mockup= new ServiceOpModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getServiceOpModeDataItemOptions(1, 'Test') as ServiceOpModeRuntime; + + expect(Object.keys(options).length).to.equal(10); + expect(options.StateChannel).to.not.be.undefined; + expect(options.StateOffAut).to.not.be.undefined; + expect(options.StateOpAut).to.not.be.undefined; + expect(options.StateAutAut).to.not.be.undefined; + expect(options.StateOffOp).to.not.be.undefined; + expect(options.StateOpOp).to.not.be.undefined; + expect(options.StateAutOp).to.not.be.undefined; + expect(options.StateOpAct).to.not.be.undefined; + expect(options.StateAutAct).to.not.be.undefined; + expect(options.StateOffAct).to.not.be.undefined; + }); + + it('dynamic DataItemOptions', () => { + const mockup = new ServiceOpModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataItemOptions() as ServiceOpModeRuntime; + + expect(Object.keys(options).length).to.equal(10); + expect(options.StateChannel).to.not.be.undefined; + expect(options.StateOffAut).to.not.be.undefined; + expect(options.StateOpAut).to.not.be.undefined; + expect(options.StateAutAut).to.not.be.undefined; + expect(options.StateOffOp).to.not.be.undefined; + expect(options.StateOpOp).to.not.be.undefined; + expect(options.StateAutOp).to.not.be.undefined; + expect(options.StateOpAct).to.not.be.undefined; + expect(options.StateAutAct).to.not.be.undefined; + expect(options.StateOffAct).to.not.be.undefined; + }); + + it('get stateOpAct', async () => { + const mockup= new ServiceOpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + expect(mockup.stateOpAct).to.be.false; + }); + it('get stateAutAct', async () => { + const mockup= new ServiceOpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + expect(mockup.stateAutAct).to.be.false; + }); + it('get stateOffAct', async () => { + const mockup= new ServiceOpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + expect(mockup.stateOffAct).to.be.true; + }); + + }); + describe('dynamic', () => { + + let mockupServer: MockupServer; + let mockup: ServiceOpModeMockup; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(10000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + mockup = new ServiceOpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get StateOffOp', async () => { + mockup.opMode = OperationMode.Operator; + await connection.writeNode('Variable.StateOffOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.StateOffOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Offline); + }).timeout(2000); + + it('set and get StateOpOp', async () => { + await connection.writeNode('Variable.StateOpOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.StateOpOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Operator); + }).timeout(2000); + + it('set and get StateAutOp', async () => { + mockup.opMode = OperationMode.Operator; + await connection.writeNode('Variable.StateAutOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.StateAutOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Automatic); + }).timeout(2000); + + it('set and get StateOffOp, write false', async () => { + mockup.opMode = OperationMode.Operator; + await connection.writeNode('Variable.StateOffOp', mockupServer.nameSpaceUri, false, 'Boolean'); + await connection.readNode('Variable.StateOffOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Operator); + }).timeout(2000); + + it('set and get StateOpOp, write false', async () => { + await connection.writeNode('Variable.StateOpOp', mockupServer.nameSpaceUri, false, 'Boolean'); + await connection.readNode('Variable.StateOpOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Offline); + }).timeout(2000); + + it('set and get StateAutOp, write false', async () => { + mockup.opMode = OperationMode.Operator; + await connection.writeNode('Variable.StateAutOp', mockupServer.nameSpaceUri, false, 'Boolean'); + await connection.readNode('Variable.StateAutOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.opMode).to.equal(OperationMode.Operator); + }).timeout(2000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.mockup.ts new file mode 100644 index 00000000..3a8c249a --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.mockup.ts @@ -0,0 +1,270 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OperationMode} from '@p2olab/polaris-interface'; +import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; + +function getServiceOpModeSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + StateChannel: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateChannel`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOffAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOffAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOpAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOpAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateAutAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateAutAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOffOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOffOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOpOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOpOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateAutOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateAutOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOpAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOpAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateAutAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateAutAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + StateOffAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateOffAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} + + +export function getServiceOpModeDataItemOptions(namespace: number, objectBrowseName: string): object { + return getServiceOpModeSpecificDataItemOptions(namespace, objectBrowseName); +} + +export class ServiceOpModeMockup { + public opMode: OperationMode = OperationMode.Offline; + public stateChannel = false; + public stateOffAut = false; + public stateOpAut = false; + public stateAutAut = false; + public stateOffOp = false; + public stateOpOp = false; + public stateAutOp = false; + protected mockupNode: UAObject; + + constructor(namespace: Namespace, rootNode: UAObject, variableName: string, operationMode?: OperationMode) { + + //for testing + if(operationMode) this.opMode = operationMode; + + this.mockupNode = rootNode; + + namespace.addVariable({ + componentOf: rootNode, + nodeId: `ns=${namespace.index};s=${variableName}.StateChannel`, + browseName: `${variableName}.StateChannel`, + dataType: DataType.Boolean, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Boolean, value: this.stateChannel}); + } + } + }); + + namespace.addVariable({ + componentOf: rootNode, + nodeId: `ns=${namespace.index};s=${variableName}.StateOffAut`, + browseName: `${variableName}.StateOffAut`, + dataType: DataType.Boolean, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Boolean, value: this.stateOffAut}); + } + } + }); + namespace.addVariable({ + componentOf: rootNode, + nodeId: `ns=${namespace.index};s=${variableName}.StateOpAut`, + browseName: `${variableName}.StateOpAut`, + dataType: DataType.Boolean, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Boolean, value: this.stateOpAut}); + } + } + }); + namespace.addVariable({ + componentOf: rootNode, + nodeId: `ns=${namespace.index};s=${variableName}.StateAutAut`, + browseName: `${variableName}.StateAutAut`, + dataType: DataType.Boolean, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Boolean, value: this.stateAutAut}); + } + } + }); + + namespace.addVariable({ + componentOf: rootNode, + nodeId: `ns=${namespace.index};s=${variableName}.StateOffOp`, + browseName: `${variableName}.StateOffOp`, + dataType: DataType.Boolean, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Boolean, value: this.stateOffOp}); + }, + set: (variant: Variant): StatusCodes => { + this.stateOffOp = variant.value; + if (this.stateOffOp) { + if (!this.stateChannel) { + this.opMode = OperationMode.Offline; + } + this.stateOffOp = false; + } + return StatusCodes.Good; + } + } + }); + namespace.addVariable({ + componentOf: rootNode, + nodeId: `ns=${namespace.index};s=${variableName}.StateOpOp`, + browseName: `${variableName}.StateOpOp`, + dataType: DataType.Boolean, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Boolean, value: this.stateOpOp}); + }, + set: (variant: Variant): StatusCodes => { + this.stateOpOp = variant.value; + if (this.stateOpOp) { + if (!this.stateChannel) { + this.opMode = OperationMode.Operator; + } + this.stateOpOp = false; + } + return StatusCodes.Good; + } + } + }); + namespace.addVariable({ + componentOf: rootNode, + nodeId: `ns=${namespace.index};s=${variableName}.StateAutOp`, + browseName: `${variableName}.StateAutOp`, + dataType: DataType.Boolean, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Boolean, value: this.stateAutOp}); + }, + set: (variant: Variant): StatusCodes => { + this.stateAutOp = variant.value; + if (this.stateAutOp) { + if (!this.stateChannel) { + this.opMode = OperationMode.Automatic; + } + this.stateAutOp = false; + } + return StatusCodes.Good; + } + } + }); + + namespace.addVariable({ + componentOf: rootNode, + nodeId: `ns=${namespace.index};s=${variableName}.StateOffAct`, + browseName: `${variableName}.StateOffAct`, + dataType: DataType.Boolean, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Boolean, value: this.stateOffAct}); + } + } + }); + namespace.addVariable({ + componentOf: rootNode, + nodeId: `ns=${namespace.index};s=${variableName}.StateOpAct`, + browseName: `${variableName}.StateOpAct`, + dataType: DataType.Boolean, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Boolean, value: this.stateOpAct}); + } + } + }); + namespace.addVariable({ + componentOf: rootNode, + nodeId: `ns=${namespace.index};s=${variableName}.StateAutAct`, + browseName: `${variableName}.StateAutAct`, + dataType: DataType.Boolean, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Boolean, value: this.stateAutAct}); + } + } + }); + } + + public get stateOpAct(): boolean { + return this.opMode === OperationMode.Operator; + } + + public get stateAutAct(): boolean { + return this.opMode === OperationMode.Automatic; + } + + public get stateOffAct(): boolean { + return this.opMode === OperationMode.Offline; + } + + public getDataItemOptions(): object { + return getServiceOpModeDataItemOptions( + this.mockupNode.namespaceIndex, + this.mockupNode.browseName.name as string); + } +} diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.puml new file mode 100644 index 00000000..1409f86f --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.puml @@ -0,0 +1,61 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface ServiceOpModeRuntime{ + + StateChannel: DataItem + + StateOffAut: DataItem + + StateOpAut: DataItem + + StateAutAut: DataItem + + StateOffOp: DataItem + + StateOpOp: DataItem + + StateAutOp: DataItem + + StateOpAct: DataItem + + StateAutAct: DataItem + + StateOffAct: DataItem +} + +class ServiceOpMode{ + - dAController: any + - initialize(): void + - writeOpMode(opMode: OperationMode): Promise + + getServiceOperationMode(): OperationMode + + isServiceOpMode(expectedOpMode: OperationMode): boolean + + waitForServiceOpModeToPassSpecificTest(expectedOpMode: OperationMode): Promise + + setToAutomaticOperationMode(): Promise + + setToOperatorOperationMode(): Promise + + setToOfflineOperationMode(): Promise + + isOfflineState(): boolean + + isOperatorState(): boolean + + isAutomaticState(): boolean +} + +ServiceOpModeRuntime <-- ServiceOpMode +ServiceOpModeSpec --> ServiceOpMode : <> +ServiceOpModeSpec --> ServiceOpModeMockup : <> + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.spec.ts new file mode 100644 index 00000000..3c8f3477 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.spec.ts @@ -0,0 +1,258 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../connection'; +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions, OperationMode} from '@p2olab/polaris-interface'; +import {DataAssemblyController} from '../../DataAssemblyController'; +import {MockupServer} from '../../../../_utils'; +import {ServiceOpMode} from './ServiceOpMode'; +import {ServiceOpModeMockup} from './ServiceOpMode.mockup'; +import {getAnaServParamOptions} from '../../operationElement/servParam/anaServParam/AnaServParam.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('ServiceOpMode', () => { + + const dataAssemblyOptions = getAnaServParamOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + describe('static', () => { + const emptyOPCUAConnection = new OpcUaConnection(); + it('should create ServiceOpMode', () => { + + const da = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection) as any; + const opMode = new ServiceOpMode(da); + + expect(opMode).to.not.be.undefined; + expect((da).communication.StateChannel).to.not.be.undefined; + expect((da).communication.StateOffAut).to.not.be.undefined; + expect((da).communication.StateOpAut).to.not.be.undefined; + expect((da).communication.StateAutAut).to.not.be.undefined; + expect((da).communication.StateOffOp).to.not.be.undefined; + expect((da).communication.StateOpOp).to.not.be.undefined; + expect((da).communication.StateAutOp).to.not.be.undefined; + expect((da).communication.StateOpAct).to.not.be.undefined; + expect((da).communication.StateAutAct).to.not.be.undefined; + expect((da).communication.StateOffAct).to.not.be.undefined; + }); + }); + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + new ServiceOpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + new ServiceOpMode(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); + }).timeout(5000); + }); + + describe('dynamic functions, Offline', async () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + let mockup: ServiceOpModeMockup; + let opMode: ServiceOpMode; + let dataAssemblyController: any; + + beforeEach(async function () { + mockupServer = new MockupServer(); + await mockupServer.initialize(); + mockup = new ServiceOpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + + dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + opMode = new ServiceOpMode(dataAssemblyController); + await connection.connect(); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('getOperationMode, should be Offline', () => { + expect(opMode.getServiceOperationMode()).to.equal(OperationMode.Offline); + }); + it('isOpMode', () => { + expect(opMode.isServiceOpMode(OperationMode.Offline)).to.be.true; + expect(opMode.isServiceOpMode(OperationMode.Operator)).to.be.false; + expect(opMode.isServiceOpMode(OperationMode.Automatic)).to.be.false; + }); + it('isOffState', () => { + expect(opMode.isOfflineState()).to.be.true; + }); + + it('setToAutomaticOperationMode(), should set to Automatic', async () => { + await opMode.setToAutomaticOperationMode(); + expect(dataAssemblyController.communication.StateAutAct.value).to.be.true; + expect(mockup.opMode = OperationMode.Automatic); + }); + + it('setToOperatorOperationMode(), should set to Operator', async () => { + await opMode.setToOperatorOperationMode(); + expect(dataAssemblyController.communication.StateOpAct.value).to.be.true; + expect(mockup.opMode = OperationMode.Operator); + }); + }); + + describe('dynamic functions, Operator', async () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + let mockup: ServiceOpModeMockup; + let opMode: ServiceOpMode; + let dataAssemblyController: any; + + beforeEach(async function () { + mockupServer = new MockupServer(); + await mockupServer.initialize(); + // initialize with operator + mockup = new ServiceOpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable', OperationMode.Operator); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + + dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + opMode = new ServiceOpMode(dataAssemblyController); + await connection.connect(); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('getOperationMode, should be Operator', () => { + expect(opMode.getServiceOperationMode()).to.equal(OperationMode.Operator); + }); + + it('isOpMode', () => { + expect(opMode.isServiceOpMode(OperationMode.Offline)).to.be.false; + expect(opMode.isServiceOpMode(OperationMode.Operator)).to.be.true; + expect(opMode.isServiceOpMode(OperationMode.Automatic)).to.be.false; + }); + it('setToAutomaticOperationMode(), should set to Automatic', async () => { + await opMode.setToAutomaticOperationMode(); + expect(dataAssemblyController.communication.StateAutAct.value).to.be.true; + expect(mockup.opMode = OperationMode.Automatic); + }); + + it('setToOperatorOperationMode(), nothing should happen', async () => { + await opMode.setToOperatorOperationMode(); + expect(dataAssemblyController.communication.StateOpAct.value).to.be.true; + expect(mockup.opMode = OperationMode.Operator); + }); + }); + describe('dynamic functions, Automatic', async () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + let mockup: ServiceOpModeMockup; + let opMode: ServiceOpMode; + let dataAssemblyController: any; + + beforeEach(async function () { + mockupServer = new MockupServer(); + await mockupServer.initialize(); + // initialize with Automatic + mockup = new ServiceOpModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable', OperationMode.Automatic); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + opMode = new ServiceOpMode(dataAssemblyController); + await connection.connect(); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('getServiceOperationMode, should be Automatic', () => { + expect(opMode.getServiceOperationMode()).to.equal(OperationMode.Automatic); + }); + it('isServiceOpMode', () => { + expect(opMode.isServiceOpMode(OperationMode.Offline)).to.be.false; + expect(opMode.isServiceOpMode(OperationMode.Operator)).to.be.false; + expect(opMode.isServiceOpMode(OperationMode.Automatic)).to.be.true; + }); + it('isOffState', () => { + expect(opMode.isOfflineState()).to.be.false; + }); + + it('setToAutomaticOperationMode(), nothing should happen', async () => { + await opMode.setToAutomaticOperationMode(); + expect(dataAssemblyController.communication.StateAutAct.value).to.be.true; + expect(mockup.opMode = OperationMode.Automatic); + }); + + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.ts new file mode 100644 index 00000000..168cbe15 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpMode.ts @@ -0,0 +1,172 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OperationMode} from '@p2olab/polaris-interface'; +import {DataItem} from '../../../connection'; +import {BaseDataAssemblyRuntime} from '../../DataAssemblyController'; +import {catDataAssembly} from '../../../../../logging'; + +export type ServiceOpModeRuntime = BaseDataAssemblyRuntime & { + StateChannel: DataItem; + StateOffAut: DataItem; + StateOpAut: DataItem; + StateAutAut: DataItem; + StateOffOp: DataItem; + StateOpOp: DataItem; + StateAutOp: DataItem; + StateOpAct: DataItem; + StateAutAct: DataItem; + StateOffAct: DataItem; +}; + +export class ServiceOpMode { + + private dAController: any; + + constructor(dAController: any) { + this.dAController = dAController; + this.initialize(); + } + + private initialize(): void { + this.dAController.communication.StateChannel = this.dAController.createDataItem('StateChannel', 'boolean'); + + this.dAController.communication.StateOffAut = this.dAController.createDataItem('StateOffAut', 'boolean'); + this.dAController.communication.StateOpAut = this.dAController.createDataItem('StateOpAut', 'boolean'); + this.dAController.communication.StateAutAut = this.dAController.createDataItem('StateAutAut', 'boolean'); + + this.dAController.communication.StateOffOp = this.dAController.createDataItem('StateOffOp', 'boolean', 'write'); + this.dAController.communication.StateOpOp = this.dAController.createDataItem('StateOpOp', 'boolean', 'write'); + this.dAController.communication.StateAutOp = this.dAController.createDataItem('StateAutOp', 'boolean', 'write'); + + this.dAController.communication.StateOffAct = this.dAController.createDataItem('StateOffAct', 'boolean'); + this.dAController.communication.StateOpAct = this.dAController.createDataItem('StateOpAct', 'boolean'); + this.dAController.communication.StateAutAct = this.dAController.createDataItem('StateAutAct', 'boolean'); + } + + public getServiceOperationMode(): OperationMode { + if (this.isOfflineState()) { + return OperationMode.Offline; + } else if (this.isOperatorState()) { + return OperationMode.Operator; + } else if (this.isAutomaticState()) { + return OperationMode.Automatic; + } + return OperationMode.Offline; + } + + public isServiceOpMode(expectedOpMode: OperationMode): boolean { + switch (expectedOpMode) { + case OperationMode.Automatic: + return this.isAutomaticState(); + case OperationMode.Operator: + return this.isOperatorState(); + case OperationMode.Offline: + return this.isOfflineState(); + } + } + + public async waitForServiceOpModeToPassSpecificTest(expectedOpMode: OperationMode): Promise { + await this.dAController.subscribe(); + return new Promise((resolve) => { + if (this.isServiceOpMode(expectedOpMode)) { + resolve(); + } else { + // eslint-disable-next-line @typescript-eslint/no-this-alias + const da = this; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.dAController.on('changed', function test(this: any) { + if (da.isServiceOpMode(expectedOpMode)) { + this.removeListener('ServiceOpMode', test); + resolve(); + } + }); + } + }); + } + + /** + * Set service data assembly to automatic operation mode + * + */ + public async setToAutomaticOperationMode(): Promise { + catDataAssembly.info(`[${this.dAController.name}] Current ServiceOpMode = ${this.getServiceOperationMode()}`); + if (!this.isAutomaticState()) { + this.writeOpMode(OperationMode.Automatic); + await this.waitForServiceOpModeToPassSpecificTest(OperationMode.Automatic); + } + catDataAssembly.info(`[${this.dAController.name}] Current ServiceOpMode = ${this.getServiceOperationMode()}`); + } + + /** + * Set service data assembly to operator operation mode + * + */ + public async setToOperatorOperationMode(): Promise { + catDataAssembly.info(`[${this.dAController.name}] Current ServiceOpMode = ${this.getServiceOperationMode()}`); + if (!this.isOperatorState()) { + this.writeOpMode(OperationMode.Operator); + await this.waitForServiceOpModeToPassSpecificTest(OperationMode.Operator); + } + catDataAssembly.info(`[${this.dAController.name}] Current ServiceOpMode = ${this.getServiceOperationMode()}`); + } + + /** + * Set service data assembly to offline operation mode + * + */ + public async setToOfflineOperationMode(): Promise { + catDataAssembly.info(`[${this.dAController.name}] Current ServiceOpMode = ${this.getServiceOperationMode()}`); + if (!this.isOfflineState()) { + this.writeOpMode(OperationMode.Offline); + await this.waitForServiceOpModeToPassSpecificTest(OperationMode.Offline); + } + catDataAssembly.info(`[${this.dAController.name}] Current ServiceOpMode = ${this.getServiceOperationMode()}`); + } + + private async writeOpMode(opMode: OperationMode): Promise { + catDataAssembly.info(`[${this.dAController.name}] Write opMode: ${opMode}`); + if (opMode === OperationMode.Automatic) { + await this.dAController.communication.StateAutOp.write(true); + } else if (opMode === OperationMode.Operator) { + await this.dAController.communication.StateOpOp.write(true); + } else if (opMode === OperationMode.Offline) { + await this.dAController.communication.StateOffOp.write(true); + } + catDataAssembly.info(`[${this.dAController.name}] Setting opMode successfully`); + } + + public isOfflineState(): boolean { + return this.dAController.communication.StateOffAct.value === true; + } + + public isAutomaticState(): boolean { + return this.dAController.communication.StateAutAct.value === true; + } + + public isOperatorState(): boolean { + return this.dAController.communication.StateOpAct.value === true; + } +} diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpModeStatemachine.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpModeStatemachine.puml new file mode 100644 index 00000000..cf6e4749 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceOpMode/ServiceOpModeStatemachine.puml @@ -0,0 +1,51 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml + +[*] --> Offline + +Offline : StateOffAct = 1 +Offline : StateOpAct = 0 +Offline : StateAutAct = 0 + +Operator : StateOffAct = 0 +Operator : StateOpAct = 1 +Operator : StateAutAct = 0 + +Automatic : StateOffAct = 0 +Automatic : StateOpAct = 0 +Automatic : StateAutAct = 1 + +Offline --> Operator : StateOpAut(if StateChannel) \n StateOpOp(if not StateChannel) +Operator --> Offline : StateOffAut(if StateChannel) \n StateOffOp(if not StateChannel) + +Operator --> Automatic : StateAutAut(if StateChannel) \n StateAutOp(if not StateChannel) +Automatic --> Operator : StateOpAut(if StateChannel) \n StateOpOp(if not StateChannel) + +Offline --> Automatic : StateAutAut(if StateChannel) \n StateAutOp(if not StateChannel) +Automatic --> Offline : StateOffAut(if StateChannel) \n StateOffOp(if not StateChannel) + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceMode.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceMode.mockup.spec.ts new file mode 100644 index 00000000..cc678ead --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceMode.mockup.spec.ts @@ -0,0 +1,183 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {getServiceSourceModeDataItemOptions, ServiceSourceModeMockup} from './ServiceSourceMode.mockup'; +import {OpcUaConnection} from '../../../connection'; +import {ServiceSourceMode} from '@p2olab/polaris-interface'; +import {ServiceSourceModeRuntime} from './ServiceSourceModeController'; + + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('ServiceSourceModeMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create ServiceSourceModeMockup', async () => { + const mockup= new ServiceSourceModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getServiceSourceModeDataItemOptions(1, 'Test') as ServiceSourceModeRuntime; + + expect(Object.keys(options).length).to.equal(7); + expect(options.SrcChannel).to.not.be.undefined; + expect(options.SrcExtAut).to.not.be.undefined; + expect(options.SrcIntAut).to.not.be.undefined; + expect(options.SrcExtOp).to.not.be.undefined; + expect(options.SrcIntOp).to.not.be.undefined; + expect(options.SrcExtAct).to.not.be.undefined; + expect(options.SrcIntAct).to.not.be.undefined; + }); + + it('dynamic DataItemOptions', () => { + const mockup = new ServiceSourceModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataItemOptions() as ServiceSourceModeRuntime; + + expect(Object.keys(options).length).to.equal(7); + expect(options.SrcChannel).to.not.be.undefined; + expect(options.SrcExtAut).to.not.be.undefined; + expect(options.SrcIntAut).to.not.be.undefined; + expect(options.SrcExtOp).to.not.be.undefined; + expect(options.SrcIntOp).to.not.be.undefined; + expect(options.SrcExtAct).to.not.be.undefined; + expect(options.SrcIntAct).to.not.be.undefined; + }); + }); + describe('dynamic', () => { + + let mockupServer: MockupServer; + let mockup: ServiceSourceModeMockup; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(10000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + mockup = new ServiceSourceModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get SrcExtOp', async () => { + await connection.writeNode('Variable.SrcExtOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.SrcExtOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.false; + expect(mockup.srcExtAct).to.true; + expect(mockup.srcMode).to.equal(ServiceSourceMode.Extern); + }).timeout(3000); + + it('set and get SrcIntOp', async () => { + mockup.srcMode= ServiceSourceMode.Extern; + await connection.writeNode('Variable.SrcIntOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.SrcIntOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.true; + expect(mockup.srcExtAct).to.false; + expect(mockup.srcMode).to.equal(ServiceSourceMode.Intern); + }).timeout(3000); + + it('set and get SrcExtOp, write false, nothing should change', async () => { + await connection.writeNode('Variable.SrcExtOp', mockupServer.nameSpaceUri, false, 'Boolean'); + await connection.readNode('Variable.SrcExtOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.true; + expect(mockup.srcExtAct).to.false; + }).timeout(3000); + + it('set and get SrcIntOp, write false, nothing should change', async () => { + await connection.writeNode('Variable.SrcIntOp', mockupServer.nameSpaceUri, false, 'Boolean'); + await connection.readNode('Variable.SrcIntOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.true; + expect(mockup.srcExtAct).to.false; + }).timeout(3000); + + }); + + describe('dynamic with SrcChannel:= true, nothing should happen', () => { + + let mockupServer: MockupServer; + let mockup: ServiceSourceModeMockup; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(5000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + mockup = new ServiceSourceModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + mockup.srcChannel= true; + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get SrcExtOp, nothing should change', async () => { + await connection.writeNode('Variable.SrcExtOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.SrcExtOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.true; + expect(mockup.srcExtAct).to.false; + }).timeout(3000); + + it('set and get SrcIntOp, nothing should change', async () => { + await connection.writeNode('Variable.SrcIntOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.SrcIntOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.true; + expect(mockup.srcExtAct).to.false; + }).timeout(3000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceMode.mockup.ts similarity index 74% rename from src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeDA.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceMode.mockup.ts index ee718fee..ac93884d 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeDA.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceMode.mockup.ts @@ -25,52 +25,54 @@ import {ServiceSourceMode} from '@p2olab/polaris-interface'; import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; -export function getServiceSourceModeDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getServiceSourceModeSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - SrcChannel: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SrcChannel`, - dataType: 'Boolean' - }, - SrcIntAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SrcIntAct`, - dataType: 'Boolean' - }, - SrcIntAut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SrcIntAut`, - dataType: 'Boolean' - }, - SrcIntOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SrcIntOp`, - dataType: 'Boolean' - }, - SrcExtAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SrcExtAct`, - dataType: 'Boolean' - }, - SrcExtAut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SrcExtAut`, - dataType: 'Boolean' - }, - SrcExtOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.SrcExtOp`, - dataType: 'Boolean' - } - } - ); + SrcChannel: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SrcChannel`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + SrcIntAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SrcIntAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + SrcIntAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SrcIntAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + SrcIntOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SrcIntOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + SrcExtAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SrcExtAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + SrcExtAut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SrcExtAut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + SrcExtOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.SrcExtOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); } -export class ServiceSourceModeDAMockup { +export function getServiceSourceModeDataItemOptions(namespace: number, objectBrowseName: string): object { + return getServiceSourceModeSpecificDataItemOptions(namespace, objectBrowseName); +} + +export class ServiceSourceModeMockup { public srcMode: ServiceSourceMode = ServiceSourceMode.Intern; public srcChannel = false; public srcIntAut = false; @@ -125,7 +127,7 @@ export class ServiceSourceModeDAMockup { get: (): Variant => { return new Variant({dataType: DataType.Boolean, value: this.srcIntOp}); }, - set: (variant: Variant) => { + set: (variant: Variant): StatusCodes => { this.srcIntOp = variant.value; if (this.srcIntOp) { if (!this.srcChannel) { @@ -148,7 +150,7 @@ export class ServiceSourceModeDAMockup { get: (): Variant => { return new Variant({dataType: DataType.Boolean, value: this.srcExtOp}); }, - set: (variant: Variant) => { + set: (variant: Variant): StatusCodes => { this.srcExtOp = variant.value; if (this.srcExtOp) { if (!this.srcChannel) { @@ -187,6 +189,7 @@ export class ServiceSourceModeDAMockup { }); } + public get srcExtAct(): boolean { return this.srcMode === ServiceSourceMode.Extern; } @@ -195,13 +198,10 @@ export class ServiceSourceModeDAMockup { return this.srcMode === ServiceSourceMode.Intern; } - - - public getServiceSourceModeDAInstanceMockupJSON() { - return getServiceSourceModeDAMockupReferenceJSON( + public getDataItemOptions(): object { + return getServiceSourceModeDataItemOptions( this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string); } - } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeController.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeController.puml new file mode 100644 index 00000000..398e5458 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeController.puml @@ -0,0 +1,62 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface ServiceSourceModeRuntime{ + SrcChannel: DataItem + SrcIntAct: DataItem + SrcIntAut: DataItem + SrcIntOp: DataItem + SrcExtAct: DataItem + SrcExtAut: DataItem + SrcExtOp: DataItem +} + +enum ServiceSourceMode{ +Intern +Extern +} + + +class ServiceSourceModeController{ + - dAController: any + - initialize(): void + + getServiceSourceMode(): ServiceSourceMode + + isServiceSourceMode(expectedServiceSourceMode: ServiceSourceMode): boolean + + async waitForServiceSourceModeToPassSpecificTest(expectedServiceSourceMode: ServiceSourceMode): Promise + + async setToExternalServiceSourceMode(): Promise + + async setToInternalServiceSourceMode(): Promise + + async writeServiceSourceMode(serviceSourceMode: ServiceSourceMode): Promise + + isExtSource(): boolean + + isIntSource(): boolean +} + +ServiceSourceMode <-- ServiceSourceModeController +ServiceSourceModeRuntime <-- ServiceSourceModeController +ServiceSourceModeSpec --> ServiceSourceModeController : <> +ServiceSourceModeSpec --> ServiceSourceModeMockup : <> +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeController.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeController.spec.ts new file mode 100644 index 00000000..e0af0dfb --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeController.spec.ts @@ -0,0 +1,220 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../connection'; +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions, ServiceSourceMode} from '@p2olab/polaris-interface'; +import {DataAssemblyController} from '../../DataAssemblyController'; +import {ServiceSourceModeController} from './ServiceSourceModeController'; +import {MockupServer} from '../../../../_utils'; +import {ServiceSourceModeMockup} from './ServiceSourceMode.mockup'; +import {getAnaServParamOptions} from '../../operationElement/servParam/anaServParam/AnaServParam.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('ServiceSourceMode', () => { + + const dataAssemblyOptions = getAnaServParamOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + + it('should create ServiceSourceMode', () => { + const da = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection) as any; + const serviceSourceModeController = new ServiceSourceModeController(da); + expect(serviceSourceModeController).to.not.be.undefined; + expect(da.communication.SrcChannel).to.not.be.undefined; + expect(da.communication.SrcExtAut).to.not.be.undefined; + expect(da.communication.SrcIntAut).to.not.be.undefined; + expect(da.communication.SrcIntOp).to.not.be.undefined; + expect(da.communication.SrcExtOp).to.not.be.undefined; + expect(da.communication.SrcIntAct).to.not.be.undefined; + expect(da.communication.SrcExtAct).to.not.be.undefined; + }); + }); + + describe('dynamic', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(5000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + new ServiceSourceModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + new ServiceSourceModeController(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcExtAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcExtOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcExtAct.value).equal(false); + }).timeout(5000); + }); + + describe('dynamic functions, Extern on', async () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + let mockup: ServiceSourceModeMockup; + let serviceSourceModeController: ServiceSourceModeController; + let dataAssemblyController: any; + + beforeEach(async function () { + mockupServer = new MockupServer(); + await mockupServer.initialize(); + mockup = new ServiceSourceModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + serviceSourceModeController = new ServiceSourceModeController(dataAssemblyController); + await connection.connect(); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('getServiceSourceMode, should be intern', () => { + expect(serviceSourceModeController.getServiceSourceMode()).to.equal(ServiceSourceMode.Intern); + }); + + it('isServiceSourceMode', () => { + expect(serviceSourceModeController.isServiceSourceMode(ServiceSourceMode.Intern)).to.be.true; + expect(serviceSourceModeController.isServiceSourceMode(ServiceSourceMode.Extern)).to.be.false; + }); + + it('setToExternalServiceSourceMode(), nothing should happen', async () => { + await serviceSourceModeController.setToExternalServiceSourceMode(); + expect(mockup.srcIntAct).to.be.false; + expect(mockup.srcExtAct).to.be.true; + }).timeout(4000); + }); + + describe('dynamic functions, Intern on', async () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + let mockup: ServiceSourceModeMockup; + let serviceSourceModeController: ServiceSourceModeController; + let dataAssemblyController: any; + beforeEach(async function () { + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const mockupNode = (mockupServer.nameSpace).addObject({ + organizedBy: mockupServer.rootObject, + browseName: 'Variable', + }); + mockup = new ServiceSourceModeMockup( + mockupServer.nameSpace, + mockupNode, + 'Variable'); + mockup.srcMode= ServiceSourceMode.Intern; + await mockupServer.start(); + + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection); + serviceSourceModeController = new ServiceSourceModeController(dataAssemblyController); + await connection.connect(); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('getServiceSourceMode', async () => { + expect(serviceSourceModeController.getServiceSourceMode()).to.equal(ServiceSourceMode.Intern); + }); + + it('isServiceSourceMode', async () => { + expect(serviceSourceModeController.isServiceSourceMode(ServiceSourceMode.Intern)).to.be.true; + expect(serviceSourceModeController.isServiceSourceMode(ServiceSourceMode.Extern)).to.be.false; + }); + + it('waitForServiceSourceModeToPassSpecificTest, promise should resolve instantly', async () => { + dataAssemblyController.communication.SrcExtAct.value = true; + await serviceSourceModeController.waitForServiceSourceModeToPassSpecificTest(ServiceSourceMode.Extern); + }); + + it('waitForServiceSourceModeToPassSpecificTest, promise should resolve after a while', async () => { + await dataAssemblyController.communication.SrcExtOp.write(true); + await serviceSourceModeController.waitForServiceSourceModeToPassSpecificTest(ServiceSourceMode.Extern); + }).timeout(4000); + + it('waitForServiceSourceModeToPassSpecificTest, timeout', async () => { + expect(dataAssemblyController.communication.SrcExtAct.value).to.be.false; + expect(dataAssemblyController.communication.SrcIntAct.value).to.be.true; + return expect(serviceSourceModeController.waitForServiceSourceModeToPassSpecificTest(ServiceSourceMode.Extern)).to.be + .rejectedWith('Timeout: ServiceSourceMode did not change'); + }).timeout(4000); + + it('should change ServiceSourceMode to external and back to internal', async () => { + await serviceSourceModeController.setToExternalServiceSourceMode(); + expect(mockup.srcExtAct).to.be.true; + expect(mockup.srcIntAct).to.be.false; + expect(dataAssemblyController.communication.SrcExtAct.value).to.be.true; + expect(dataAssemblyController.communication.SrcIntAct.value).to.be.false; + await serviceSourceModeController.setToInternalServiceSourceMode(); + expect(mockup.srcExtAct).to.be.false; + expect(mockup.srcIntAct).to.be.true; + expect(dataAssemblyController.communication.SrcExtAct.value).to.be.false; + expect(dataAssemblyController.communication.SrcIntAct.value).to.be.true; + }).timeout(4000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeController.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeController.ts similarity index 77% rename from src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeController.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeController.ts index c457626d..98c2d65f 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/serviceSourceModeDA/ServiceSourceModeController.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeController.ts @@ -24,24 +24,19 @@ */ import {ServiceSourceMode} from '@p2olab/polaris-interface'; -import {OpcUaDataItem} from '../../../connection'; -import {BaseDataAssemblyRuntime, DataAssemblyController} from '../../DataAssemblyController'; -import {Constructor} from '../_helper'; +import {DataItem} from '../../../connection'; import {catDataAssembly} from '../../../../../logging'; -import {AnaServParamMockup} from '../../operationElement/servParam/anaServParam/AnaServParam.mockup'; -import {AnaServParam} from '../../operationElement'; - -export interface ServiceSourceModeRuntime extends BaseDataAssemblyRuntime { - SrcChannel: OpcUaDataItem; - SrcIntAct: OpcUaDataItem; - SrcIntAut: OpcUaDataItem; - SrcIntOp: OpcUaDataItem; - SrcExtAct: OpcUaDataItem; - SrcExtAut: OpcUaDataItem; - SrcExtOp: OpcUaDataItem; + +export interface ServiceSourceModeRuntime { + SrcChannel: DataItem; + SrcIntAct: DataItem; + SrcIntAut: DataItem; + SrcIntOp: DataItem; + SrcExtAct: DataItem; + SrcExtAut: DataItem; + SrcExtOp: DataItem; } -// TODO: Maybe rename this class export class ServiceSourceModeController{ private dAController: any; @@ -50,17 +45,17 @@ export class ServiceSourceModeController{ this.initialize(); } - private initialize(){ - this.dAController.communication.SrcChannel = this.dAController.createDataItem('SrcChannel', 'read', 'boolean'); + private initialize(): void { + this.dAController.communication.SrcChannel = this.dAController.createDataItem('SrcChannel', 'boolean'); - this.dAController.communication.SrcExtAut = this.dAController.createDataItem('SrcExtAut', 'read', 'boolean'); - this.dAController.communication.SrcIntAut = this.dAController.createDataItem('SrcIntAut', 'read', 'boolean'); + this.dAController.communication.SrcExtAut = this.dAController.createDataItem('SrcExtAut', 'boolean'); + this.dAController.communication.SrcIntAut = this.dAController.createDataItem('SrcIntAut', 'boolean'); - this.dAController.communication.SrcExtOp = this.dAController.createDataItem('SrcExtOp', 'write', 'boolean'); - this.dAController.communication.SrcIntOp = this.dAController.createDataItem('SrcIntOp', 'write', 'boolean'); + this.dAController.communication.SrcExtOp = this.dAController.createDataItem('SrcExtOp', 'boolean', 'write'); + this.dAController.communication.SrcIntOp = this.dAController.createDataItem('SrcIntOp', 'boolean', 'write'); - this.dAController.communication.SrcExtAct = this.dAController.createDataItem('SrcExtAct', 'read', 'boolean'); - this.dAController.communication.SrcIntAct = this.dAController.createDataItem('SrcIntAct', 'read', 'boolean'); + this.dAController.communication.SrcExtAct = this.dAController.createDataItem('SrcExtAct', 'boolean'); + this.dAController.communication.SrcIntAct = this.dAController.createDataItem('SrcIntAct', 'boolean'); } public getServiceSourceMode(): ServiceSourceMode { @@ -83,7 +78,7 @@ export class ServiceSourceModeController{ public async waitForServiceSourceModeToPassSpecificTest(expectedServiceSourceMode: ServiceSourceMode): Promise { await this.dAController.subscribe(); - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { if (this.isServiceSourceMode(expectedServiceSourceMode)) { resolve(); } else { @@ -107,14 +102,28 @@ export class ServiceSourceModeController{ * Set data assembly to external ServiceSourceMode */ public async setToExternalServiceSourceMode(): Promise { - if (!this.isExtSource()) { + if (this.isIntSource()) { catDataAssembly.trace(`[${this.dAController.name}] Finally to Ext`); await this.writeServiceSourceMode(ServiceSourceMode.Extern); await this.waitForServiceSourceModeToPassSpecificTest(ServiceSourceMode.Extern); } } - public async writeServiceSourceMode(serviceSourceMode: ServiceSourceMode): Promise { + /** + * Set data assembly to internal ServiceSourceMode + */ + public async setToInternalServiceSourceMode(): Promise { + if (this.isExtSource()) { + catDataAssembly.trace(`[${this.dAController.name}] Finally to Int`); + await this.writeServiceSourceMode(ServiceSourceMode.Intern); + await this.waitForServiceSourceModeToPassSpecificTest(ServiceSourceMode.Intern); + } + } + + /** + * Write ServiceSourceMode to DataItem + */ + private async writeServiceSourceMode(serviceSourceMode: ServiceSourceMode): Promise { catDataAssembly.debug(`[${this.dAController.name}] Write serviceSourceMode: ${serviceSourceMode}`); if (serviceSourceMode === ServiceSourceMode.Extern) { await this.dAController.communication.SrcExtOp.write(true); diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeStatemachine.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeStatemachine.puml new file mode 100644 index 00000000..3c1bd9c9 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/serviceSourceMode/ServiceSourceModeStatemachine.puml @@ -0,0 +1,39 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml + +[*] --> Internal + +Internal : SrcExtAct = 0 +Internal : SrcIntAct = 1 + +External : SrcExtAct = 1 +External : SrcIntAct = 0 + +Internal -> External : SrcExtAut(if StateChannel) \n SrcExtOp(if not StateChannel) +External -> Internal : SrcIntAut(if StateChannel) \n SrcIntOp(if not StateChannel) + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceMode.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceMode.mockup.spec.ts new file mode 100644 index 00000000..1bc9574d --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceMode.mockup.spec.ts @@ -0,0 +1,182 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {getSourceModeDataItemOptions, SourceModeMockup} from './SourceMode.mockup'; +import {OpcUaConnection} from '../../../connection'; +import {ServiceSourceMode, SourceMode} from '@p2olab/polaris-interface'; +import {SourceModeRuntime} from './SourceModeController'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('SourceModeMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create SourceModeMockup', async () => { + const mockup= new SourceModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getSourceModeDataItemOptions(1, 'Test') as SourceModeRuntime; + + expect(Object.keys(options).length).to.equal(7); + expect(options.SrcChannel).to.not.be.undefined; + expect(options.SrcManAut).to.not.be.undefined; + expect(options.SrcIntAut).to.not.be.undefined; + expect(options.SrcManOp).to.not.be.undefined; + expect(options.SrcIntOp).to.not.be.undefined; + expect(options.SrcManAct).to.not.be.undefined; + expect(options.SrcIntAct).to.not.be.undefined; + }); + + it('dynamic DataItemOptions', () => { + const mockup = new SourceModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataItemOptions() as SourceModeRuntime; + + expect(Object.keys(options).length).to.equal(7); + expect(options.SrcChannel).to.not.be.undefined; + expect(options.SrcManAut).to.not.be.undefined; + expect(options.SrcIntAut).to.not.be.undefined; + expect(options.SrcManOp).to.not.be.undefined; + expect(options.SrcIntOp).to.not.be.undefined; + expect(options.SrcManAct).to.not.be.undefined; + expect(options.SrcIntAct).to.not.be.undefined; + }); + + }); + describe('dynamic', () => { + + let mockupServer: MockupServer; + let mockup: SourceModeMockup; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(10000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + mockup = new SourceModeMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get SrcManOp', async () => { + await connection.writeNode('Variable.SrcManOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.SrcManOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.false; + expect(mockup.srcManAct).to.true; + expect(mockup.srcMode).to.equal(SourceMode.Manual); + }).timeout(3000); + + it('set and get SrcIntOp', async () => { + await connection.writeNode('Variable.SrcIntOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.SrcIntOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.true; + expect(mockup.srcManAct).to.false; + expect(mockup.srcMode).to.equal(SourceMode.Intern); + }).timeout(3000); + + it('set and get SrcManOp, write false', async () => { + await connection.writeNode('Variable.SrcManOp', mockupServer.nameSpaceUri, false, 'Boolean'); + await connection.readNode('Variable.SrcManOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.true; + expect(mockup.srcManAct).to.false; + expect(mockup.srcMode).to.equal(SourceMode.Intern); + }).timeout(3000); + + it('set and get SrcIntOp, write false', async () => { + await connection.writeNode('Variable.SrcIntOp', mockupServer.nameSpaceUri, false, 'Boolean'); + await connection.readNode('Variable.SrcIntOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.true; + expect(mockup.srcManAct).to.false; + expect(mockup.srcMode).to.equal(ServiceSourceMode.Intern); + }).timeout(3000); + }); + + describe('dynamic, srcChannel is true', () => { + + let mockupServer: MockupServer; + let mockup: SourceModeMockup; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(10000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + mockup = new SourceModeMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + mockup.srcChannel = true; + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set and get SrcManOp, nothing should change', async () => { + await connection.writeNode('Variable.SrcManOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.SrcManOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.true; + expect(mockup.srcManAct).to.false; + expect(mockup.srcMode).to.equal(SourceMode.Intern); + }).timeout(3000); + + it('set and get SrcIntOp, nothing should change', async () => { + await connection.writeNode('Variable.SrcIntOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.SrcIntOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(false)); + expect(mockup.srcIntAct).to.true; + expect(mockup.srcManAct).to.false; + expect(mockup.srcMode).to.equal(ServiceSourceMode.Intern); + }).timeout(3000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceMode.mockup.ts similarity index 90% rename from src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeDA.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceMode.mockup.ts index cf1fbbb2..9e1c0232 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeDA.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceMode.mockup.ts @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2020 P2O-Lab , + * Copyright (c) 2021 P2O-Lab , * Chair for Process Control Systems, Technische Universität Dresden * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -24,12 +24,9 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {ServiceSourceMode, SourceMode} from '@p2olab/polaris-interface'; - -export function getSourceModeDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +import {SourceMode} from '@p2olab/polaris-interface'; +function getSourceModeSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ SrcChannel: { namespaceIndex: `${namespace}`, @@ -69,7 +66,13 @@ export function getSourceModeDAMockupReferenceJSON( }); } -export class SourceModeDAMockup { + +export function getSourceModeDataItemOptions(namespace: number, objectBrowseName: string): object { + return getSourceModeSpecificDataItemOptions(namespace, objectBrowseName); +} + + +export class SourceModeMockup { srcMode: SourceMode = SourceMode.Intern; public srcChannel = false; protected srcManAut = false; @@ -124,7 +127,7 @@ export class SourceModeDAMockup { get: (): Variant => { return new Variant({dataType: DataType.Boolean, value: this.srcIntOp}); }, - set: (variant: Variant) => { + set: (variant: Variant): StatusCodes => { this.srcIntOp = variant.value; if (this.srcIntOp) { if (!this.srcChannel) { @@ -147,7 +150,7 @@ export class SourceModeDAMockup { get: (): Variant => { return new Variant({dataType: DataType.Boolean, value: this.srcManOp}); }, - set: (variant: Variant) => { + set: (variant: Variant): StatusCodes => { this.srcManOp = variant.value; if (this.srcManOp) { if (!this.srcChannel) { @@ -194,9 +197,8 @@ export class SourceModeDAMockup { return this.srcMode === SourceMode.Intern; } - - public getSourceModeDAInstanceMockupJSON() { - return getSourceModeDAMockupReferenceJSON( + public getDataItemOptions(): object { + return getSourceModeDataItemOptions( this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string); } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeController.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeController.puml new file mode 100644 index 00000000..72dc742a --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeController.puml @@ -0,0 +1,62 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface SourceModeRuntime{ + + SrcChannel: DataItem + + SrcIntAct: DataItem + + SrcIntAut: DataItem + + SrcIntOp: DataItem + + SrcManAct: DataItem + + SrcManAut: DataItem + + SrcManOp: DataItem +} + +enum SourceMode { + Internal + Manual +} + +class SourceModeController{ + - dAController: any + - initialize(): void + - async writeSourceMode(sourceMode: SourceMode): Promise + + getSourceMode(): SourceMode + + isSourceMode(expectedSourceMode: SourceMode): boolean + + async waitForSourceModeToPassSpecificTest(expectedSourceMode: SourceMode): Promise + + async setToManualSourceMode(): Promise + + async setToInternalSourceMode(): Promise + + isManualSource(): boolean + + isInternalSource(): boolean + +} + +SourceMode <-- SourceModeController +SourceModeRuntime <-- SourceModeController +SourceModeSpec --> SourceModeController : <> +SourceModeSpec --> SourceModeMockup : <> +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeController.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeController.spec.ts similarity index 59% rename from src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeController.spec.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeController.spec.ts index fdb97f04..b7ec4b38 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeController.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeController.spec.ts @@ -28,36 +28,28 @@ import {OpcUaConnection} from '../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyController} from '../../DataAssemblyController'; -import {DataAssemblyOptions, ServiceSourceMode, SourceMode} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/binmanint.json'; +import {DataAssemblyOptions, SourceMode} from '@p2olab/polaris-interface'; import {BinManInt} from '../../operationElement'; import {MockupServer} from '../../../../_utils'; -import {SourceModeDAMockup} from './SourceModeDA.mockup'; -import {Namespace, UAObject} from 'node-opcua'; +import {SourceModeMockup} from './SourceMode.mockup'; import {SourceModeController} from './SourceModeController'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; +import {getBinManIntOptions} from '../../operationElement/man/binMan/binManInt/BinManInt.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('SourceModeController', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinManInt', - dataItems: baseDataAssemblyOptions - }; - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } + + const dataAssemblyOptions = getBinManIntOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + it('should create SourceModeController', async () => { const da = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection); - const sourceModeController = new SourceModeController(da); + new SourceModeController(da); expect((da as BinManInt).communication.SrcChannel).to.be.not.undefined; expect((da as BinManInt).communication.SrcManAut).to.be.not.undefined; expect((da as BinManInt).communication.SrcIntAut).to.be.not.undefined; @@ -68,24 +60,23 @@ describe('SourceModeController', () => { }); }); + describe('dynamic', () => { + let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: SourceModeDAMockup; beforeEach(async function () { mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockupNode = (mockupServer.namespace as Namespace).addObject({ - organizedBy: mockupServer.rootComponent as UAObject, + const mockupNode = (mockupServer.nameSpace).addObject({ + organizedBy: mockupServer.rootObject, browseName: 'Variable', }); - mockup = new SourceModeDAMockup( - mockupServer.namespace as Namespace, - mockupNode, - 'Variable'); + new SourceModeMockup(mockupServer.nameSpace, mockupNode,'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); }); afterEach(async function () { @@ -95,50 +86,56 @@ describe('SourceModeController', () => { }); it('should subscribe successfully', async () => { - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - const sourceMode = new SourceModeController(da1); + + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + new SourceModeController(dataAssemblyController); + await connection.connect(); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcManAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcManOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcManAct.value).equal(false); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcManAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcManOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcManAct.value).equal(false); }).timeout(5000); }); describe('dynamic functions, manual', async () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: SourceModeDAMockup; + let mockup: SourceModeMockup; let sourceMode: SourceModeController; - let da1: any; + let dataAssemblyController: any; + beforeEach(async function () { mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockupNode = (mockupServer.namespace as Namespace).addObject({ - organizedBy: mockupServer.rootComponent as UAObject, + const mockupNode = (mockupServer.nameSpace).addObject({ + organizedBy: mockupServer.rootObject, browseName: 'Variable', }); - mockup = new SourceModeDAMockup( - mockupServer.namespace as Namespace, + mockup = new SourceModeMockup( + mockupServer.nameSpace, mockupNode, 'Variable'); mockup.srcMode = SourceMode.Manual; await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - da1 = new DataAssemblyController(dataAssemblyOptions, connection); - sourceMode = new SourceModeController(da1); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection); + sourceMode = new SourceModeController(dataAssemblyController); await connection.connect(); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); }); + afterEach(async function () { this.timeout(4000); await connection.disconnect(); @@ -148,28 +145,24 @@ describe('SourceModeController', () => { it('getSourceMode, should be manual', () => { expect(sourceMode.getSourceMode()).to.equal(SourceMode.Manual); }); + it('isSourceMode', () => { expect(sourceMode.isSourceMode(SourceMode.Manual)).to.be.true; expect(sourceMode.isSourceMode(SourceMode.Intern)).to.be.false; }); - it('setToManualalSourceMode(), nothing should happen', async () => { + + it('setToManualSourceMode(), nothing should happen', async () => { await sourceMode.setToManualSourceMode(); - expect(da1.communication.SrcManAct.value).to.be.true; - expect(da1.communication.SrcIntAct.value).to.be.false; + expect(dataAssemblyController.communication.SrcManAct.value).to.be.true; + expect(dataAssemblyController.communication.SrcIntAct.value).to.be.false; }); - it('writeSourceMode, should set Intern', async () => { - await sourceMode.writeSourceMode(SourceMode.Intern); - await new Promise(f => setTimeout(f, 500)); // we have to wait for emit change - expect(da1.communication.SrcManAct.value).to.be.false; - expect(da1.communication.SrcIntAct.value).to.be.true; - }).timeout(4000); it('waitForSourceModeToPassSpecificTest, promise should resolve instantly', async () => { await sourceMode.waitForSourceModeToPassSpecificTest(SourceMode.Manual); }); it('waitForSourceModeToPassSpecificTest, promise should resolve after a while', async () => { - await da1.communication.SrcIntOp.write(true); + await dataAssemblyController.communication.SrcIntOp.write(true); await sourceMode.waitForSourceModeToPassSpecificTest(SourceMode.Intern); }).timeout(4000); @@ -180,32 +173,32 @@ describe('SourceModeController', () => { }); describe('dynamic functions, Intern on', async () => { + let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: SourceModeDAMockup; let sourceMode: SourceModeController; - let da1: any; + let dataAssemblyController: any; + beforeEach(async function () { mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockupNode = (mockupServer.namespace as Namespace).addObject({ - organizedBy: mockupServer.rootComponent as UAObject, + const mockupNode = (mockupServer.nameSpace).addObject({ + organizedBy: mockupServer.rootObject, browseName: 'Variable', }); - mockup = new SourceModeDAMockup( - mockupServer.namespace as Namespace, - mockupNode, - 'Variable'); + new SourceModeMockup(mockupServer.nameSpace, mockupNode, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); - da1 = new DataAssemblyController(dataAssemblyOptions, connection); - sourceMode = new SourceModeController(da1); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection); + sourceMode = new SourceModeController(dataAssemblyController); await connection.connect(); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); }); + afterEach(async function () { this.timeout(4000); await connection.disconnect(); @@ -221,20 +214,13 @@ describe('SourceModeController', () => { expect(sourceMode.isSourceMode(SourceMode.Manual)).to.be.false; }); - it('writeSourceMode, should set Manual', async () => { - await sourceMode.writeSourceMode(SourceMode.Manual); - await new Promise(f => setTimeout(f, 500)); // we have to wait for emit change - expect(da1.communication.SrcManAct.value).to.be.true; - expect(da1.communication.SrcIntAct.value).to.be.false; - }).timeout(4000); - it('waitForSourceModeToPassSpecificTest, promise should resolve instantly', async () => { - da1.communication.SrcManAct.value = true; + dataAssemblyController.communication.SrcManAct.value = true; await sourceMode.waitForSourceModeToPassSpecificTest(SourceMode.Manual); }); it('waitForSourceModeToPassSpecificTest, promise should resolve after a while', async () => { - await da1.communication.SrcManOp.write(true); + await dataAssemblyController.communication.SrcManOp.write(true); await sourceMode.waitForSourceModeToPassSpecificTest(SourceMode.Manual); }).timeout(4000); @@ -245,8 +231,8 @@ describe('SourceModeController', () => { it('setToManualSourceMode()', async () => { await sourceMode.setToManualSourceMode(); - expect(da1.communication.SrcManAct.value).to.be.true; - expect(da1.communication.SrcIntAct.value).to.be.false; + expect(dataAssemblyController.communication.SrcManAct.value).to.be.true; + expect(dataAssemblyController.communication.SrcIntAct.value).to.be.false; }).timeout(4000); }); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeController.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeController.ts similarity index 69% rename from src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeController.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeController.ts index e63ab702..2ba5dc28 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/sourceModeDA/SourceModeController.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeController.ts @@ -24,18 +24,17 @@ */ import {SourceMode} from '@p2olab/polaris-interface'; -import {OpcUaDataItem} from '../../../connection'; -import {BaseDataAssemblyRuntime} from '../../DataAssemblyController'; +import {DataItem} from '../../../connection'; import {catDataAssembly} from '../../../../../logging'; -export interface SourceModeRuntime extends BaseDataAssemblyRuntime { - SrcChannel: OpcUaDataItem; - SrcIntAct: OpcUaDataItem; - SrcIntAut: OpcUaDataItem; - SrcIntOp: OpcUaDataItem; - SrcManAct: OpcUaDataItem; - SrcManAut: OpcUaDataItem; - SrcManOp: OpcUaDataItem; +export type SourceModeRuntime = { + SrcChannel: DataItem; + SrcIntAct: DataItem; + SrcIntAut: DataItem; + SrcIntOp: DataItem; + SrcManAct: DataItem; + SrcManAut: DataItem; + SrcManOp: DataItem; } export class SourceModeController { @@ -46,20 +45,20 @@ export class SourceModeController { this.initialize(); } - private initialize(){ - this.dAController.communication.SrcChannel = this.dAController.createDataItem('SrcChannel', 'read', 'boolean'); - this.dAController.communication.SrcManAut = this.dAController.createDataItem('SrcManAut', 'read', 'boolean'); - this.dAController.communication.SrcIntAut = this.dAController.createDataItem('SrcIntAut', 'read', 'boolean'); - this.dAController.communication.SrcManOp = this.dAController.createDataItem('SrcManOp', 'write', 'boolean'); - this.dAController.communication.SrcIntOp = this.dAController.createDataItem('SrcIntOp', 'write', 'boolean'); - this.dAController.communication.SrcManAct = this.dAController.createDataItem('SrcManAct', 'read', 'boolean'); - this.dAController.communication.SrcIntAct = this.dAController.createDataItem('SrcIntAct', 'read', 'boolean'); + private initialize(): void { + this.dAController.communication.SrcChannel = this.dAController.createDataItem('SrcChannel', 'boolean'); + this.dAController.communication.SrcManAut = this.dAController.createDataItem('SrcManAut', 'boolean'); + this.dAController.communication.SrcIntAut = this.dAController.createDataItem('SrcIntAut', 'boolean'); + this.dAController.communication.SrcManOp = this.dAController.createDataItem('SrcManOp', 'boolean', 'write'); + this.dAController.communication.SrcIntOp = this.dAController.createDataItem('SrcIntOp', 'boolean', 'write'); + this.dAController.communication.SrcManAct = this.dAController.createDataItem('SrcManAct', 'boolean'); + this.dAController.communication.SrcIntAct = this.dAController.createDataItem('SrcIntAct','boolean'); } public getSourceMode(): SourceMode { - if (this.isExtSource()) { + if (this.isManualSourceMode()) { return SourceMode.Manual; - } else if (this.isIntSource()) { + } else if (this.isInternalSourceMode()) { return SourceMode.Intern; } return SourceMode.Manual; @@ -68,9 +67,9 @@ export class SourceModeController { public isSourceMode(expectedSourceMode: SourceMode): boolean { switch (expectedSourceMode) { case SourceMode.Intern: - return this.isIntSource(); + return this.isInternalSourceMode(); case SourceMode.Manual: - return this.isExtSource(); + return this.isManualSourceMode(); } } @@ -97,31 +96,42 @@ export class SourceModeController { } /** - * Set data assembly to external source mode + * Set data assembly to manual source mode */ public async setToManualSourceMode(): Promise { - if (!this.isExtSource()) { - catDataAssembly.trace(`[${this.dAController.name}] Finally to Man`); + if (this.isInternalSourceMode()) { + catDataAssembly.trace(`[${this.dAController.name}] Change SourceMode to Manual`); await this.writeSourceMode(SourceMode.Manual); await this.waitForSourceModeToPassSpecificTest(SourceMode.Manual); } } - public async writeSourceMode(sourceMode: SourceMode): Promise { - catDataAssembly.debug(`[${this.dAController.name}] Write sourceMode: ${sourceMode}`); + /** + * Set data assembly to internal source mode + */ + public async setToInternalSourceMode(): Promise { + if (this.isInternalSourceMode()) { + catDataAssembly.trace(`[${this.dAController.name}] Change SourceMode to Internal`); + await this.writeSourceMode(SourceMode.Intern); + await this.waitForSourceModeToPassSpecificTest(SourceMode.Intern); + } + } + + private async writeSourceMode(sourceMode: SourceMode): Promise { + catDataAssembly.debug(`[${this.dAController.name}] Write SourceMode: ${sourceMode}`); if (sourceMode === SourceMode.Manual) { await this.dAController.communication.SrcManOp.write(true); } else if (sourceMode === SourceMode.Intern) { await this.dAController.communication.SrcIntOp.write(true); } - catDataAssembly.debug(`[${this.dAController.name}] Setting sourceMode successfully`); + catDataAssembly.debug(`[${this.dAController.name}] Changed SourceMode successfully`); } - public isExtSource(): boolean { + public isManualSourceMode(): boolean { return this.dAController.communication.SrcManAct?.value === true; } - public isIntSource(): boolean { + public isInternalSourceMode(): boolean { return this.dAController.communication.SrcIntAct?.value === true; } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeStatemachine.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeStatemachine.puml new file mode 100644 index 00000000..9f53f1ad --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/sourceMode/SourceModeStatemachine.puml @@ -0,0 +1,41 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml + +[*] --> Internal +[*] --> Manual + +Manual : SrcManAct = 1 +Manual : SrcIntAct = 0 + +Internal : SrcManAct = 0 +Internal : SrcIntAct = 1 + +Manual -> Internal : SrcIntAut(if SrcChannel) \n SrcIntAut(if not SrcChannel) +Internal -> Manual : SrcManAut(if SrcChannel) \n SrcManOp(if not SrcChannel) + + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/Unit.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitCollection.ts similarity index 97% rename from src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/Unit.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitCollection.ts index e0bd6041..8f73ac1d 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/Unit.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitCollection.ts @@ -1,7 +1,32 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + /** * physical unit as they are used within the MTP */ -export const UNIT: Array<{ value: number; unit: string; name: string; nameEnglish: string }> = [ +export const UnitCollection: Array<{ value: number; unit: string; name: string; nameEnglish: string }> = [ {value: 1000, unit: 'K', name: 'Kelvin', nameEnglish: 'Kelvin'}, {value: 1001, unit: '°C', name: 'Grad Celsius', nameEnglish: 'Degrees Celsius'}, {value: 1002, unit: '°F', name: 'Grad Fahrenheit', nameEnglish: 'Degrees Fahrenheit'}, diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.mockup.spec.ts new file mode 100644 index 00000000..a8ce8fc6 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.mockup.spec.ts @@ -0,0 +1,68 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {getUnitSettingsDataItemOptions, UnitSettingsMockup} from './UnitSettings.mockup'; +import {UnitSettingsRuntime} from './UnitSettings'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('UnitMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create UnitMockup', async () => { + const mockup= new UnitSettingsMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getUnitSettingsDataItemOptions(1, 'Test') as UnitSettingsRuntime; + + expect(Object.keys(options).length).to.equal(1); + expect(options.VUnit).to.not.be.undefined; + }); + + it('dynamic DataItemOptions', () => { + const mockup = new UnitSettingsMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataItemOptions() as UnitSettingsRuntime; + + expect(Object.keys(options).length).to.equal(1); + expect(options.VUnit).to.not.be.undefined; + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.mockup.ts similarity index 79% rename from src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitDA.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.mockup.ts index 530778ce..e051b875 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitDA.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.mockup.ts @@ -25,10 +25,8 @@ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; -export function getUnitDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getUnitSettingsSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ VUnit: { namespaceIndex: `${namespace}`, @@ -38,7 +36,13 @@ export function getUnitDAMockupReferenceJSON( }); } -export class UnitDAMockup { + +export function getUnitSettingsDataItemOptions(namespace: number, objectBrowseName: string): object { + return getUnitSettingsSpecificDataItemOptions(namespace, objectBrowseName); +} + + +export class UnitSettingsMockup { protected unit = 0; protected mockupNode: UAObject; @@ -50,17 +54,17 @@ export class UnitDAMockup { componentOf: rootNode, nodeId: `ns=${namespace.index};s=${variableName}.VUnit`, browseName: `${variableName}.VUnit`, - dataType: DataType.UInt32, + dataType: DataType.Int16, value: { get: (): Variant => { - return new Variant({dataType: DataType.UInt32, value: this.unit}); + return new Variant({dataType: DataType.Int16, value: this.unit}); }, }, }); } - public getUnitDAInstanceMockupJSON() { - return getUnitDAMockupReferenceJSON( + public getDataItemOptions(): object { + return getUnitSettingsDataItemOptions( this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string); } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.puml new file mode 100644 index 00000000..e89dab95 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.puml @@ -0,0 +1,42 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface UnitSettingsRuntime{ + + VUnit: DataItem +} + +class UnitSettings{ + - dAController: any + - initialize(): void + + Unit(): string +} + +UnitSettingsRuntime <-- UnitSettings +UnitSpec --> UnitSettings : <> +UnitSpec --> UnitMockup : <> +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitSettings.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.spec.ts similarity index 64% rename from src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitSettings.spec.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.spec.ts index f668d4ca..d4872f72 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitSettings.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.spec.ts @@ -28,36 +28,24 @@ import {OpcUaConnection} from '../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/dintmanint.json'; import {DataAssemblyController} from '../../DataAssemblyController'; -import {ScaleSettings} from '../scaleSettingsDA/ScaleSettings'; import {DIntMan} from '../../operationElement'; import {UnitSettings} from './UnitSettings'; import {MockupServer} from '../../../../_utils'; -import {OSLevelDAMockup} from '../osLevelDA/OSLevelDA.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {OSLevel} from '../osLevelDA/OSLevel'; -import {UnitDAMockup} from './UnitDA.mockup'; +import {UnitSettingsMockup} from './UnitSettings.mockup'; +import {getDIntManOptions} from '../../operationElement/man/dintMan/DIntMan.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('UnitSettings', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperatorElement/DIntMan', - dataItems: baseDataAssemblyOptions - }; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } + + const dataAssemblyOptions = getDIntManOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + it('should create UnitSettings', () => { const da = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection); const unitSettings = new UnitSettings(da); @@ -66,21 +54,20 @@ describe('UnitSettings', () => { expect(unitSettings.Unit).to.be.empty; }); }); + describe('dynamic', () => { + let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: UnitDAMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new UnitDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + new UnitSettingsMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -91,12 +78,14 @@ describe('UnitSettings', () => { }); it('should subscribe successfully', async () => { - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - new UnitSettings(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.VUnit.value).to.equal(0); + + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + new UnitSettings(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.VUnit.value).to.equal(0); }).timeout(5000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitSettings.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.ts similarity index 66% rename from src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitSettings.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.ts index c0d9f899..0281ec3a 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/unitDA/UnitSettings.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/unitSettings/UnitSettings.ts @@ -23,14 +23,11 @@ * SOFTWARE. */ -import {ParameterInterface} from '@p2olab/polaris-interface'; -import {OpcUaDataItem} from '../../../connection'; -import {Constructor} from '../_helper'; -import {BaseDataAssemblyRuntime, DataAssemblyController} from '../../DataAssemblyController'; -import {UNIT} from './Unit'; +import {DataItem} from '../../../connection'; +import {UnitCollection} from './UnitCollection'; -export interface UnitDataAssemblyRuntime extends BaseDataAssemblyRuntime { - VUnit: OpcUaDataItem; +export type UnitSettingsRuntime = { + VUnit: DataItem; } export class UnitSettings { @@ -39,26 +36,11 @@ export class UnitSettings { constructor(dAController: any) { this.dAController = dAController; - this.initialize(); - } - - private initialize(): void{ - this.dAController.communication.VUnit = this.dAController.createDataItem('VUnit', 'read'); + this.dAController.communication.VUnit = this.dAController.createDataItem('VUnit', 'number'); } get Unit(): string { - const unit = UNIT.find((item) => item.value === this.dAController.communication.VUnit?.value); + const unit = UnitCollection.find((item) => item.value === this.dAController.communication.VUnit.value); return unit ? unit.unit : ''; } - - // TODO: adjust function -/* public unitToJson(): ParameterInterface { - return { - ...super.toJson(), - max: this.communication.VSclMax?.value, - min: this.communication.VSclMin?.value - }; - }*/ } - - diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.mockup.spec.ts new file mode 100644 index 00000000..650863bf --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.mockup.spec.ts @@ -0,0 +1,102 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {getValueLimitationDataItemOptions, ValueLimitationMockup} from './ValueLimitation.mockup'; +import {ValueLimitationRuntime} from './ValueLimitation'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('ValueLimitationMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + describe('DIntValueMonitoring', () => { + + it('should create ValueLimitationMockup', async () => { + const mockup= new ValueLimitationMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'DInt'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getValueLimitationDataItemOptions(1, 'Test', 'DInt') as ValueLimitationRuntime; + + expect(Object.keys(options).length).to.equal(2); + expect(options.VMin).to.not.be.undefined; + expect(options.VMax).to.not.be.undefined; + }); + + it('dynamic DataItemOptions', () => { + const mockup = new ValueLimitationMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'DInt'); + const options = mockup.getDataItemOptions() as ValueLimitationRuntime; + + expect(Object.keys(options).length).to.equal(2); + expect(options.VMin).to.not.be.undefined; + expect(options.VMax).to.not.be.undefined; + }); + }); + + describe('AnaValueMonitoring', () => { + + it('should create ValueLimitationMockup', async () => { + const mockup= new ValueLimitationMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'Ana'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getValueLimitationDataItemOptions(1, 'Test', 'Ana') as ValueLimitationRuntime; + + expect(Object.keys(options).length).to.equal(2); + expect(options.VMin).to.not.be.undefined; + expect(options.VMax).to.not.be.undefined; + }); + + it('dynamic DataItemOptions', () => { + const mockup = new ValueLimitationMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable', 'Ana'); + const options = mockup.getDataItemOptions() as ValueLimitationRuntime; + + expect(Object.keys(options).length).to.equal(2); + expect(options.VMin).to.not.be.undefined; + expect(options.VMax).to.not.be.undefined; + }); + }); + + + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitationDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.mockup.ts similarity index 68% rename from src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitationDA.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.mockup.ts index 6e841ea0..e605c699 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitationDA.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.mockup.ts @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2020 P2O-Lab , + * Copyright (c) 2021 P2O-Lab , * Chair for Process Control Systems, Technische Universität Dresden * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -25,33 +25,38 @@ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; -export function getValueLimitationDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string, - type: T) { - +function getValueLimitationSpecificDataItemOptions(namespace: number, objectBrowseName: string, type: T): object { return ({ VMin: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VMin`, - dataType: type + dataType: (type === 'Ana')? 'Float': 'Int32' }, VMax: { namespaceIndex: `${namespace}`, nodeId: `${objectBrowseName}.VMax`, - dataType: type + dataType: (type === 'Ana')? 'Float': 'Int32' } }); } -export class ValueLimitationDAMockup { +export function getValueLimitationDataItemOptions(namespace: number, objectBrowseName: string, type: T): object { + return getValueLimitationSpecificDataItemOptions(namespace, objectBrowseName, type); +} + +export class ValueLimitationMockup { + + private readonly type: 'Ana' | 'DInt'; + private readonly dataType: DataType; + protected vMin = 0; protected vMax = 0; - private readonly type: DataType; + protected mockupNode: UAObject; constructor(namespace: Namespace, rootNode: UAObject, variableName: string, type: T) { this.type = type; + this.dataType = (type === 'Ana')? DataType.Double : DataType.Int32; this.mockupNode = namespace.addObject({ organizedBy: rootNode, @@ -62,10 +67,10 @@ export class ValueLimitationDAMockup componentOf: this.mockupNode, nodeId: `ns=${namespace.index};s=${variableName}.VMin`, browseName: `${variableName}.VMin`, - dataType: this.type, + dataType: this.dataType, value: { get: (): Variant => { - return new Variant({dataType: this.type, value: this.vMin}); + return new Variant({dataType: this.dataType, value: this.vMin}); }, }, }); @@ -74,19 +79,19 @@ export class ValueLimitationDAMockup componentOf: this.mockupNode, nodeId: `ns=${namespace.index};s=${variableName}.VMax`, browseName: `${variableName}.VMax`, - dataType: this.type, + dataType: this.dataType, value: { get: (): Variant => { - return new Variant({dataType: this.type, value: this.vMax}); + return new Variant({dataType: this.dataType, value: this.vMax}); }, }, }); } - public getValueLimitationDAInstanceMockupJSON() { - return getValueLimitationDAMockupReferenceJSON( + public getDataItemOptions(): object { + return getValueLimitationDataItemOptions( this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string, - (this.type === DataType.Double)? 'Float' : 'Int32'); + this.type); } } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.puml new file mode 100644 index 00000000..93f128a3 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.puml @@ -0,0 +1,43 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface ValueLimitationRuntime { + + VMin: DataItem + + VMax: DataItem +} + +class ValueLimitation{ + - dAController: any + - initialize(): void +} + +ValueLimitationRuntime <-- ValueLimitation +ValueLimitationSpec --> ValueLimitation : <> +ValueLimitationSpec --> ValueLimitationMockup : <> + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitation.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.spec.ts similarity index 64% rename from src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitation.spec.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.spec.ts index 044fd202..c16002eb 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitation.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.spec.ts @@ -28,35 +28,23 @@ import {OpcUaConnection} from '../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/dintmanint.json'; import {DataAssemblyController} from '../../DataAssemblyController'; import {DIntMan} from '../../operationElement'; import {ValueLimitation} from './ValueLimitation'; import {MockupServer} from '../../../../_utils'; -import {DataType, Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {ValueLimitationDAMockup} from './ValueLimitationDA.mockup'; +import {ValueLimitationMockup} from './ValueLimitation.mockup'; +import {getDIntManOptions} from '../../operationElement/man/dintMan/DIntMan.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('ValueLimitation', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperatorElement/DIntMan', - dataItems: baseDataAssemblyOptions - }; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } + + const dataAssemblyOptions = getDIntManOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create ValueLimitationDA', () => { + const emptyOPCUAConnection = new OpcUaConnection(); + it('should create ValueLimitation', () => { const da = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection); const valueLimitation = new ValueLimitation(da); expect(valueLimitation).to.not.be.undefined; @@ -67,18 +55,15 @@ describe('ValueLimitation', () => { describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: ValueLimitationDAMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new ValueLimitationDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable', DataType.Double); + new ValueLimitationMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable', 'Ana'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -89,13 +74,14 @@ describe('ValueLimitation', () => { }); it('should subscribe successfully', async () => { - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - new ValueLimitation(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.VMax.value).to.equal(0); - expect(da1.communication.VMin.value).to.equal(0); + + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + new ValueLimitation(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + expect(dataAssemblyController.communication.VMax.value).to.equal(0); + expect(dataAssemblyController.communication.VMin.value).to.equal(0); }).timeout(5000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitation.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.ts similarity index 78% rename from src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitation.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.ts index b6558b52..c848c3f6 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/valueLimitationDA/ValueLimitation.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/valueLimitation/ValueLimitation.ts @@ -23,14 +23,11 @@ * SOFTWARE. */ -import {ParameterInterface} from '@p2olab/polaris-interface'; -import {OpcUaDataItem} from '../../../connection'; -import {BaseDataAssemblyRuntime, DataAssemblyController} from '../../DataAssemblyController'; -import {Constructor} from '../_helper'; +import {DataItem} from '../../../connection'; -export type ValueLimitationRuntime = BaseDataAssemblyRuntime & { - VMin: OpcUaDataItem; - VMax: OpcUaDataItem; +export type ValueLimitationRuntime = { + VMin: DataItem; + VMax: DataItem; }; export class ValueLimitation{ @@ -42,7 +39,7 @@ export class ValueLimitation{ } private initialize(): void{ - this.dAController.communication.VMax = this.dAController.createDataItem('VMax', 'read'); - this.dAController.communication.VMin = this.dAController.createDataItem('VMin', 'read'); + this.dAController.communication.VMax = this.dAController.createDataItem('VMax', 'number'); + this.dAController.communication.VMin = this.dAController.createDataItem('VMin', 'number'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.mockup.spec.ts new file mode 100644 index 00000000..f2063d8c --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.mockup.spec.ts @@ -0,0 +1,67 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../_utils'; +import {getWQCDataItemOptions, WQCMockup} from './WQC.mockup'; +import {WQCRuntime} from './WQC'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('WQCMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create WQCMockup', async () => { + const mockup= new WQCMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getWQCDataItemOptions(1, 'Test') as WQCRuntime; + + expect(Object.keys(options).length).to.equal(1); + expect(options.WQC).to.not.be.undefined; + }); + + it('dynamic DataItemOptions', () => { + const mockup = new WQCMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataItemOptions() as WQCRuntime; + + expect(Object.keys(options).length).to.equal(1); + expect(options.WQC).to.not.be.undefined; + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQCDA.mockup.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.mockup.ts similarity index 79% rename from src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQCDA.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.mockup.ts index 2dcd679d..725db20a 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQCDA.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.mockup.ts @@ -24,26 +24,33 @@ */ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; -export function getWQCDAMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getWQCSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - WQC: { + WQC: { namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.TagName`, + nodeId: `${objectBrowseName}.WQC`, dataType: 'Byte' - } + } as OpcUaNodeOptions }); } -export class WQCDAMockup { + +export function getWQCDataItemOptions(namespace: number, objectBrowseName: string): object { + return getWQCSpecificDataItemOptions(namespace, objectBrowseName); +} + + +export class WQCMockup { protected wqc = 0; protected mockupNode: UAObject; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + this.mockupNode = rootNode; + namespace.addVariable({ componentOf: rootNode, nodeId: `ns=${namespace.index};s=${variableName}.WQC`, @@ -57,8 +64,8 @@ export class WQCDAMockup { }); } - public getWQCDAInstanceMockupJSON() { - return getWQCDAMockupReferenceJSON( + public getDataItemOptions(): object { + return getWQCDataItemOptions( this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string); } diff --git a/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.puml b/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.puml new file mode 100644 index 00000000..2cb70ee2 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.puml @@ -0,0 +1,42 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +interface WQCRuntime { + + WQC: DataItem; +} + +class WQC{ + - dAController: any + - initialize(): void + + WQC: number +} + +WQCRuntime <-- WQC +WQCSpec --> WQC : <> +WQCSpec --> WQCMockup : <> +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQC.spec.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.spec.ts similarity index 53% rename from src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQC.spec.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.spec.ts index 115f6aa2..dab170e1 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQC.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.spec.ts @@ -28,93 +28,78 @@ import {OpcUaConnection} from '../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptionsStatic from '../../../../../../tests/binmon_static.json'; -import {BinMon, IndicatorElement} from '../../indicatorElement'; +import {BinMon} from '../../indicatorElement'; import {DataAssemblyController} from '../../DataAssemblyController'; import {WQC} from './WQC'; -import * as baseDataAssemblyOptions from '../../../../../../tests/binmon.json'; import {MockupServer} from '../../../../_utils'; -import {UnitDAMockup} from '../unitDA/UnitDA.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {UnitSettings} from '../unitDA/UnitSettings'; -import {WQCDAMockup} from './WQCDA.mockup'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; +import {WQCMockup} from './WQC.mockup'; +import {getAnaViewOptions} from '../../indicatorElement/AnaView/AnaView.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; -describe('WQCDA', () => { - const dataAssemblyOptionsStatic: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinMon', - dataItems: baseDataAssemblyOptionsStatic - }; - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinMon', - dataItems: baseDataAssemblyOptions - }; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } +describe('WQC', () => { + + const dataAssemblyOptions: DataAssemblyOptions = getAnaViewOptions(2, 'Variable') as DataAssemblyOptions; + describe('static WQC', () => { - let wqcObject: any; - let da: any; + + const staticWQCDataAssemblyOptions = Object.assign({}, dataAssemblyOptions); + staticWQCDataAssemblyOptions.dataItems = {...staticWQCDataAssemblyOptions.dataItems, ...{WQC: {value: '255'}}} as any; + let wqcObject: WQC; + let da: DataAssemblyController; + beforeEach(()=>{ - const emptyOPCUAConnection = new OpcUaConnection('', ''); - da = new DataAssemblyController(dataAssemblyOptionsStatic, emptyOPCUAConnection); - wqcObject = new WQC(da); + const emptyOPCUAConnection = new OpcUaConnection(); + da = new DataAssemblyController(staticWQCDataAssemblyOptions, emptyOPCUAConnection); }); it('should create WQC', async () => { - expect(wqcObject.wqc).to.equal(0); - expect((da as BinMon).communication.WQC).to.be.undefined; + wqcObject = new WQC(da); + expect((da as BinMon).communication.WQC).to.be.exist; }); it('getter', async () => { - expect(wqcObject.WQC).to.equal(0); + wqcObject = new WQC(da); + expect(wqcObject.WQC).to.equal(255); }); - //TODO: toJson(); }); + describe('dynamic WQC', () => { - let wqcObject: any; - let da: any; + + let wqcObject: WQC; + let da: DataAssemblyController; + beforeEach(()=>{ - const emptyOPCUAConnection = new OpcUaConnection('', ''); + const emptyOPCUAConnection = new OpcUaConnection(); da = new DataAssemblyController(dataAssemblyOptions, emptyOPCUAConnection); - wqcObject = new WQC(da); }); - it('should create OSLevel', async () => { - expect(wqcObject.wqc).to.be.undefined; - expect((da as BinMon).communication.WQC).to.not.be.undefined; + it('should create WQC', async () => { + wqcObject = new WQC(da); + expect((da as BinMon).communication.WQC).to.exist; }); it('getter', async () => { - expect(wqcObject.WQC).to.be.undefined; + wqcObject = new WQC(da); + expect(wqcObject.WQC).to.equal(0); }); - //TODO: toJson(); }); + describe('dynamic', () => { + let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: WQCDAMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new WQCDAMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + new WQCMockup( mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334', '', ''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -125,12 +110,12 @@ describe('WQCDA', () => { }); it('should subscribe successfully', async () => { - const da1 = new DataAssemblyController(dataAssemblyOptions, connection) as any; - new WQC(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).to.equal(0); + const dataAssemblyController = new DataAssemblyController(dataAssemblyOptions, connection) as any; + const wqcObject = new WQC(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + expect(wqcObject.WQC).to.equal(0); }).timeout(5000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQC.ts b/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.ts similarity index 64% rename from src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQC.ts rename to src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.ts index a9e7cd41..bfeff7bf 100644 --- a/src/modularPlantManager/pea/dataAssembly/_extensions/wqcDA/WQC.ts +++ b/src/modularPlantManager/pea/dataAssembly/baseFunction/wqc/WQC.ts @@ -23,35 +23,21 @@ * SOFTWARE. */ -import {OpcUaDataItem} from '../../../connection'; -import {BaseDataAssemblyRuntime, Constructor} from '../../index'; -import {DataAssemblyController} from '../../DataAssemblyController'; +import {DataItem} from '../../../connection'; -export interface WQCRuntime extends BaseDataAssemblyRuntime { - WQC: OpcUaDataItem; +export type WQCRuntime = { + WQC: DataItem; } export class WQC { private dAController: any; - wqc: number | undefined; constructor(dAController: any) { this.dAController = dAController; - this.initialize(); + this.dAController.communication.WQC = this.dAController.createDataItem('WQC', 'number'); } - initialize(){ - //handle static and dynamic variables - if(typeof this.dAController.options.dataItems.WQC == 'string'){ - this.wqc = Number(this.dAController.options.dataItems.WQC); - } - else{ - this.dAController.communication.WQC = this.dAController.createDataItem('WQC', 'write'); - } - } - - get WQC(): number | undefined { - if(this.wqc != undefined) return this.wqc; - else return this.dAController.communication.WQC.value; + get WQC(): number{ + return this.dAController.communication.WQC.value; } } diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.mockup.spec.ts index eea0f654..4139a719 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.mockup.spec.ts @@ -1,8 +1,33 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {DiagnosticElementMockup} from './DiagnosticElement.mockup'; +import {DiagnosticElementMockup, getDiagnosticElementDataItemOptions, getDiagnosticElementOptions} from './DiagnosticElement.mockup'; import {MockupServer} from '../../../_utils'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -10,24 +35,35 @@ const expect = chai.expect; describe('DiagnosticElementMockup', () => { describe('static', () => { - let mockupServer: any; + let mockupServer: MockupServer; beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create DiagnosticElementMockup', async () => { - const mockup= new DiagnosticElementMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new DiagnosticElementMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; expect(mockup.wqc).to.not.be.undefined; }); - it('getDiagnosticElementMockupReferenceJSON()', () => { - const mockup = new DiagnosticElementMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getDiagnosticElementInstanceMockupJSON(); - expect(Object.keys(json).length).to .equal(1); + it('static DataItemOptions', () => { + const options = getDiagnosticElementDataItemOptions(1, 'Test') as DiagnosticElementMockup; + expect(Object.keys(options).length).to.equal(1); + }); + + it('static DataAssemblyOptions', () => { + const options = getDiagnosticElementOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(3); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new DiagnosticElementMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(3); }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.mockup.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.mockup.ts index 142f9186..a3405183 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.mockup.ts @@ -24,27 +24,42 @@ */ import {Namespace, UAObject} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../_extensions/wqcDA/WQCDA.mockup'; -import {catPEAMockup} from '../../../../logging'; -import {DataAssemblyControllerMockup} from '../DataAssemblyController.mockup'; +import {getWQCDataItemOptions, WQCMockup} from '../baseFunction/wqc/WQC.mockup'; +import {DataAssemblyControllerMockup, getDataAssemblyOptions} from '../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getDiagnosticElementMockupReferenceJSON(namespace: number, objectBrowseName: string) { - return (getWQCDAMockupReferenceJSON(namespace,objectBrowseName)); +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/DiagnosticElement'; + +export function getDiagnosticElementDataItemOptions(namespace: number, objectBrowseName: string): object { + return getWQCDataItemOptions(namespace, objectBrowseName); +} + +export function getDiagnosticElementOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getDiagnosticElementDataItemOptions(namespace, objectBrowseName) + }; + return options; } export class DiagnosticElementMockup extends DataAssemblyControllerMockup { - public readonly wqc: WQCDAMockup; + public readonly wqc: WQCMockup; constructor(namespace: Namespace, rootNode: UAObject, variableName: string){ super(namespace, rootNode, variableName); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); - + this.wqc = new WQCMockup(namespace, this.mockupNode, this.name); } - public getDiagnosticElementInstanceMockupJSON() { - return getDiagnosticElementMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.wqc.getDataItemOptions() + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.puml b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.puml new file mode 100644 index 00000000..82431507 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.puml @@ -0,0 +1,47 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram +!include healthStateView/HealthStateView.puml +!include lockView/LockView4/Lockview4.puml + +class DiagnosticElement{ + + readonly communication!: DiagnosticElementRuntime + + readonly wqc: WQC +} + + +DiagnosticElement *- DiagnosticElementSpec +DiagnosticElementSpec ..> DiagnosticElementMockup : <> +DiagnosticElement *- DiagnosticElementMockup +DiagnosticElement *- DiagnosticElementRuntime +DiagnosticElement *- WQC + +DiagnosticElement <|-- LockView4 +DiagnosticElement <|-- HealthStateView + + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.spec.ts index 1d37f15e..a3fb4b5b 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.spec.ts @@ -29,64 +29,42 @@ import {DiagnosticElement} from './DiagnosticElement'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../tests/binprocessvaluein.json'; -import {DataAssemblyControllerFactory} from '../DataAssemblyControllerFactory'; -import {InputElement} from '../inputElement'; import {MockupServer} from '../../../_utils'; -import {InputElementMockup} from '../inputElement/InputElement.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../tests/namespaceUrl'; -import {DiagnosticElementMockup} from './DiagnosticElement.mockup'; - +import {DiagnosticElementMockup, getDiagnosticElementOptions} from './DiagnosticElement.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('DiagnosticElement', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/', - dataItems: baseDataAssemblyOptions - }; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if ((typeof (dataAssemblyOptions.dataItems as any)[key] != 'string')) { - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } + + let dataAssemblyOptions: DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getDiagnosticElementOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create DiagnosticElement', async () => { - const da1 = new DiagnosticElement(dataAssemblyOptions, emptyOPCUAConnection); + const dataAssemblyController = new DiagnosticElement(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.be.not.undefined; - expect(da1.communication).to.be.not.undefined; - expect(da1.wqc).to.be.not.undefined; + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.communication).to.be.not.undefined; + expect(dataAssemblyController.wqc).to.be.not.undefined; }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } + beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new DiagnosticElementMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - + const diagnosticElementMockup = new DiagnosticElementMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = diagnosticElementMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -97,11 +75,13 @@ describe('DiagnosticElement', () => { }); it('should subscribe successfully', async () => { - const da1 = new DiagnosticElement(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); + + const dataAssemblyController = new DiagnosticElement(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); }).timeout(4000); }); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.ts index 3fc3b2e9..78674504 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/DiagnosticElement.ts @@ -25,12 +25,10 @@ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; import {OpcUaConnection} from '../../connection'; -import {OSLevelRuntime, WQCRuntime} from '../_extensions'; +import {OSLevelRuntime, WQC, WQCRuntime} from '../baseFunction'; import { BaseDataAssemblyRuntime, DataAssemblyController, } from '../DataAssemblyController'; -import {OSLevel} from '../_extensions/osLevelDA/OSLevel'; -import {WQC} from '../_extensions/wqcDA/WQC'; export type DiagnosticElementRuntime = BaseDataAssemblyRuntime & WQCRuntime & OSLevelRuntime; diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/diagnosticElement.puml b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/diagnosticElement.puml deleted file mode 100644 index 5e8811f1..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/diagnosticElement.puml +++ /dev/null @@ -1,22 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram -!include healthStateView/HealthStateView.puml -!include ./lockView/LockView4.puml - -class DiagnosticElement{ - + readonly communication!: DiagnosticElementRuntime - + readonly wqc: WQC -} - - -DiagnosticElement *- DiagnosticElementSpec -DiagnosticElementSpec ..> DiagnosticElementMockup : <> -DiagnosticElement *- DiagnosticElementMockup -DiagnosticElement *- DiagnosticElementRuntime -DiagnosticElement *- WQC - -DiagnosticElement <|-- LockView4 -DiagnosticElement <|-- HealthStateView - - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.mockup.spec.ts index 22d48e02..71747c11 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.mockup.spec.ts @@ -1,32 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; import {MockupServer} from '../../../../_utils'; -import {HealthStateViewMockup} from './HealthStateView.mockup'; +import {getHealthStateViewDataItemOptions, getHealthStateViewOptions, HealthStateViewMockup} from './HealthStateView.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {HealthStateViewRuntime} from './HealthStateView'; chai.use(chaiAsPromised); const expect = chai.expect; describe('HealthStateViewMockup', () => { - describe('', () => { - let mockupServer: any; + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create HealthStateViewMockup', async () => { - const mockup= new HealthStateViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new HealthStateViewMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; + }); + it('static DataItemOptions', () => { + const options = getHealthStateViewDataItemOptions(1, 'Test') as HealthStateViewRuntime; + expect(Object.keys(options).length).to.equal(1); }); - it('getHealthStateViewMockupReferenceJSON()', () => { - const mockup = new HealthStateViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getHealthStateViewInstanceMockupJSON(); - expect(Object.keys(json).length).to .equal(1); + + it('static DataAssemblyOptions', () => { + const options = getHealthStateViewOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(3); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new HealthStateViewMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(3); }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.mockup.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.mockup.ts index c83e7170..2a9ee31f 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.mockup.ts @@ -24,24 +24,32 @@ */ import {Namespace, UAObject} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import {catPEAMockup} from '../../../../../logging'; -import {DiagnosticElementMockup} from '../DiagnosticElement.mockup'; +import {DiagnosticElementMockup, getDiagnosticElementDataItemOptions} from '../DiagnosticElement.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {getDataAssemblyOptions} from '../../DataAssemblyController.mockup'; -export function getHealthStateViewMockupReferenceJSON(namespace: number, objectBrowseName: string) { - return (getWQCDAMockupReferenceJSON(namespace,objectBrowseName)); +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/HealthStateView'; + +export function getHealthStateViewDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({...getDiagnosticElementDataItemOptions(namespace, objectBrowseName)}); +} + +export function getHealthStateViewOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = {...options.dataItems, ...getHealthStateViewDataItemOptions(namespace, objectBrowseName)}; + return options; } export class HealthStateViewMockup extends DiagnosticElementMockup{ constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { super(namespace, rootNode, variableName); - } - public getHealthStateViewInstanceMockupJSON() { - return getHealthStateViewMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.puml b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.puml index d09ed561..112121d1 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.puml +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.puml @@ -1,11 +1,40 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram + +interface HealthStateViewRuntime + class HealthStateView{ + readonly communication!: HealthStateViewRuntime; } -HealthStateView *- HealthStateViewSpec -HealthStateViewSpec ..> HealthStateViewMockup : <> -HealthStateView *- HealthStateViewMockup -HealthStateView *- HealthStateViewRuntime + +HealthStateViewRuntime <-- HealthStateView +HealthStateViewSpec --> HealthStateView : <> +HealthStateViewSpec --> HealthStateViewMockup : <> + @enduml diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.spec.ts index 41379183..f9b3fd8f 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.spec.ts @@ -28,57 +28,43 @@ import {HealthStateView} from './HealthStateView'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {DiagnosticElement} from '../DiagnosticElement'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/binprocessvaluein.json'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {HealthStateViewMockup} from './HealthStateView.mockup'; +import {getHealthStateViewOptions, HealthStateViewMockup} from './HealthStateView.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('HealthStateView', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/HealthStateView', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getHealthStateViewOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; it('should create HealthStateView', async () => { - const da1 = new HealthStateView(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.be.not.undefined; - expect(da1.communication).to.be.not.undefined; - expect(da1.wqc).to.be.not.undefined; + const dataAssemblyController = new HealthStateView(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.communication).to.be.not.undefined; + expect(dataAssemblyController.wqc).to.be.not.undefined; }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } + beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new HealthStateViewMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + const healthStateViewMockup = new HealthStateViewMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = healthStateViewMockup.getDataAssemblyOptions();await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -89,11 +75,13 @@ describe('HealthStateView', () => { }); it('should subscribe successfully', async () => { - const da1 = new HealthStateView(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); + + const dataAssemblyController = new HealthStateView(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve)=> dataAssemblyController.on('changed', resolve)); + + expect(dataAssemblyController.communication.WQC.value).equal(0); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.ts index 23cb7e9e..d9adfdff 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/healthStateView/HealthStateView.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/index.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/index.ts index 0ca66b3b..4c1bde29 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/index.ts @@ -1,4 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './DiagnosticElement'; export * from './healthStateView/HealthStateView'; - export * from './lockView'; diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.mockup.spec.ts deleted file mode 100644 index 26b8aecd..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.mockup.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {LockView16Mockup} from './LockView16.mockup'; -import {MockupServer} from '../../../../_utils'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('LockView16Mockup', () => { - - describe('static', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create LockView16Mockup', async () => { - const mockup= new LockView16Mockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - expect(mockup.wqc).to.not.be.undefined; - - - }); - it('getLockView16MockupReferenceJSON()', () => { - const mockup = new LockView16Mockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getLockView16InstanceMockupJSON(); - expect(Object.keys(json).length).to .equal(84); - }); - }); - describe('dynamic', () => { - it('get...', async () => { - //TODO get the rest - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.spec.ts deleted file mode 100644 index 8c30340d..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.spec.ts +++ /dev/null @@ -1,197 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../connection'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/lockview.json'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {LockView16} from "./LockView16"; -import {LockView16Mockup} from "./LockView16.mockup"; - - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('LockView16', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/LockView16', - dataItems: baseDataAssemblyOptions - }; - - describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - - it('should create LockView16', async () => { - const da1 = new LockView16(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.be.not.undefined; - expect(da1.communication).to.be.not.undefined; - expect(da1.wqc).to.be.not.undefined; - }); - - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - beforeEach(async function () { - this.timeout(8000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockup = new LockView16Mockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(8000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - const da1 = new LockView16(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - expect(da1.communication.Logic.value).equal(false); - expect(da1.communication.Out.value).equal(false); - expect(da1.communication.OutQC.value).equal(0); - - expect(da1.communication.In1En.value).equal(false); - expect(da1.communication.In1.value).equal(false); - expect(da1.communication.In1QC.value).equal(0); - expect(da1.communication.In1Inv.value).equal(false); - expect(da1.communication.In1Txt.value).equal('testText'); - - expect(da1.communication.In2En.value).equal(false); - expect(da1.communication.In2.value).equal(false); - expect(da1.communication.In2QC.value).equal(0); - expect(da1.communication.In2Inv.value).equal(false); - expect(da1.communication.In2Txt.value).equal('testText'); - - expect(da1.communication.In3En.value).equal(false); - expect(da1.communication.In3.value).equal(false); - expect(da1.communication.In3QC.value).equal(0); - expect(da1.communication.In3Inv.value).equal(false); - expect(da1.communication.In3Txt.value).equal('testText'); - - expect(da1.communication.In4En.value).equal(false); - expect(da1.communication.In4.value).equal(false); - expect(da1.communication.In4QC.value).equal(0); - expect(da1.communication.In4Inv.value).equal(false); - expect(da1.communication.In4Txt.value).equal('testText'); - - expect(da1.communication.In5En.value).equal(false); - expect(da1.communication.In5.value).equal(false); - expect(da1.communication.In5QC.value).equal(0); - expect(da1.communication.In5Inv.value).equal(false); - expect(da1.communication.In5Txt.value).equal('testText'); - - expect(da1.communication.In6En.value).equal(false); - expect(da1.communication.In6.value).equal(false); - expect(da1.communication.In6QC.value).equal(0); - expect(da1.communication.In6Inv.value).equal(false); - expect(da1.communication.In6Txt.value).equal('testText'); - - expect(da1.communication.In7En.value).equal(false); - expect(da1.communication.In7.value).equal(false); - expect(da1.communication.In7QC.value).equal(0); - expect(da1.communication.In7Inv.value).equal(false); - expect(da1.communication.In7Txt.value).equal('testText'); - - expect(da1.communication.In8En.value).equal(false); - expect(da1.communication.In8.value).equal(false); - expect(da1.communication.In8QC.value).equal(0); - expect(da1.communication.In8Inv.value).equal(false); - expect(da1.communication.In8Txt.value).equal('testText'); - - expect(da1.communication.In9En.value).equal(false); - expect(da1.communication.In9.value).equal(false); - expect(da1.communication.In9QC.value).equal(0); - expect(da1.communication.In9Inv.value).equal(false); - expect(da1.communication.In9Txt.value).equal('testText'); - - expect(da1.communication.In10En.value).equal(false); - expect(da1.communication.In10.value).equal(false); - expect(da1.communication.In10QC.value).equal(0); - expect(da1.communication.In10Inv.value).equal(false); - expect(da1.communication.In10Txt.value).equal('testText'); - - expect(da1.communication.In11En.value).equal(false); - expect(da1.communication.In11.value).equal(false); - expect(da1.communication.In11QC.value).equal(0); - expect(da1.communication.In11Inv.value).equal(false); - expect(da1.communication.In11Txt.value).equal('testText'); - - expect(da1.communication.In12En.value).equal(false); - expect(da1.communication.In12.value).equal(false); - expect(da1.communication.In12QC.value).equal(0); - expect(da1.communication.In12Inv.value).equal(false); - expect(da1.communication.In12Txt.value).equal('testText'); - - expect(da1.communication.In13En.value).equal(false); - expect(da1.communication.In13.value).equal(false); - expect(da1.communication.In13QC.value).equal(0); - expect(da1.communication.In13Inv.value).equal(false); - expect(da1.communication.In13Txt.value).equal('testText'); - - expect(da1.communication.In14En.value).equal(false); - expect(da1.communication.In14.value).equal(false); - expect(da1.communication.In14QC.value).equal(0); - expect(da1.communication.In14Inv.value).equal(false); - expect(da1.communication.In14Txt.value).equal('testText'); - - expect(da1.communication.In15En.value).equal(false); - expect(da1.communication.In15.value).equal(false); - expect(da1.communication.In15QC.value).equal(0); - expect(da1.communication.In15Inv.value).equal(false); - expect(da1.communication.In15Txt.value).equal('testText'); - - expect(da1.communication.In16En.value).equal(false); - expect(da1.communication.In16.value).equal(false); - expect(da1.communication.In16QC.value).equal(0); - expect(da1.communication.In16Inv.value).equal(false); - expect(da1.communication.In16Txt.value).equal('testText'); - }).timeout(8000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.ts deleted file mode 100644 index f2598fa5..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.ts +++ /dev/null @@ -1,136 +0,0 @@ -/* tslint:disable:max-classes-per-file */ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; -import {LockView8, LockView8Runtime} from './LockView8'; - -export type LockView16Runtime = LockView8Runtime & { - In9En: OpcUaDataItem; - In9: OpcUaDataItem; - In9QC: OpcUaDataItem; - In9Inv: OpcUaDataItem; - In9Txt: OpcUaDataItem; - - In10En: OpcUaDataItem; - In10: OpcUaDataItem; - In10QC: OpcUaDataItem; - In10Inv: OpcUaDataItem; - In10Txt: OpcUaDataItem; - - In11En: OpcUaDataItem; - In11: OpcUaDataItem; - In11QC: OpcUaDataItem; - In11Inv: OpcUaDataItem; - In11Txt: OpcUaDataItem; - - In12En: OpcUaDataItem; - In12: OpcUaDataItem; - In12QC: OpcUaDataItem; - In12Inv: OpcUaDataItem; - In12Txt: OpcUaDataItem; - - In13En: OpcUaDataItem; - In13: OpcUaDataItem; - In13QC: OpcUaDataItem; - In13Inv: OpcUaDataItem; - In13Txt: OpcUaDataItem; - - In14En: OpcUaDataItem; - In14: OpcUaDataItem; - In14QC: OpcUaDataItem; - In14Inv: OpcUaDataItem; - In14Txt: OpcUaDataItem; - - In15En: OpcUaDataItem; - In15: OpcUaDataItem; - In15QC: OpcUaDataItem; - In15Inv: OpcUaDataItem; - In15Txt: OpcUaDataItem; - - In16En: OpcUaDataItem; - In16: OpcUaDataItem; - In16QC: OpcUaDataItem; - In16Inv: OpcUaDataItem; - In16Txt: OpcUaDataItem; -}; - -export class LockView16 extends LockView8 { - public readonly communication!: LockView16Runtime; - - constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { - super(options, connection); - - this.communication.In9En = this.createDataItem('In9En', 'read', 'boolean'); - this.communication.In9 = this.createDataItem('In9', 'read', 'boolean'); - this.communication.In9QC = this.createDataItem('In9QC', 'read', 'number'); - this.communication.In9Inv = this.createDataItem('In9Inv', 'read', 'boolean'); - this.communication.In9Txt = this.createDataItem('In9Txt', 'read', 'string'); - - this.communication.In10En = this.createDataItem('In10En', 'read', 'boolean'); - this.communication.In10 = this.createDataItem('In10', 'read', 'boolean'); - this.communication.In10QC = this.createDataItem('In10QC', 'read', 'number'); - this.communication.In10Inv = this.createDataItem('In10Inv', 'read', 'boolean'); - this.communication.In10Txt = this.createDataItem('In10Txt', 'read', 'string'); - - this.communication.In11En = this.createDataItem('In11En', 'read', 'boolean'); - this.communication.In11 = this.createDataItem('In11', 'read', 'boolean'); - this.communication.In11QC = this.createDataItem('In11QC', 'read', 'number'); - this.communication.In11Inv = this.createDataItem('In11Inv', 'read', 'boolean'); - this.communication.In11Txt = this.createDataItem('In11Txt', 'read', 'string'); - - this.communication.In12En = this.createDataItem('In12En', 'read', 'boolean'); - this.communication.In12 = this.createDataItem('In12', 'read', 'boolean'); - this.communication.In12QC = this.createDataItem('In12QC', 'read', 'number'); - this.communication.In12Inv = this.createDataItem('In12Inv', 'read', 'boolean'); - this.communication.In12Txt = this.createDataItem('In12Txt', 'read', 'string'); - - this.communication.In13En = this.createDataItem('In13En', 'read', 'boolean'); - this.communication.In13 = this.createDataItem('In13', 'read', 'boolean'); - this.communication.In13QC = this.createDataItem('In13QC', 'read', 'number'); - this.communication.In13Inv = this.createDataItem('In13Inv', 'read', 'boolean'); - this.communication.In13Txt = this.createDataItem('In13Txt', 'read', 'string'); - - this.communication.In14En = this.createDataItem('In14En', 'read', 'boolean'); - this.communication.In14 = this.createDataItem('In14', 'read', 'boolean'); - this.communication.In14QC = this.createDataItem('In14QC', 'read', 'number'); - this.communication.In14Inv = this.createDataItem('In14Inv', 'read', 'boolean'); - this.communication.In14Txt = this.createDataItem('In14Txt', 'read', 'string'); - - this.communication.In15En = this.createDataItem('In15En', 'read', 'boolean'); - this.communication.In15 = this.createDataItem('In15', 'read', 'boolean'); - this.communication.In15QC = this.createDataItem('In15QC', 'read', 'number'); - this.communication.In15Inv = this.createDataItem('In15Inv', 'read', 'boolean'); - this.communication.In15Txt = this.createDataItem('In15Txt', 'read', 'string'); - - this.communication.In16En = this.createDataItem('In16En', 'read', 'boolean'); - this.communication.In16 = this.createDataItem('In16', 'read', 'boolean'); - this.communication.In16QC = this.createDataItem('In16QC', 'read', 'number'); - this.communication.In16Inv = this.createDataItem('In16Inv', 'read', 'boolean'); - this.communication.In16Txt = this.createDataItem('In16Txt', 'read', 'string'); - } - -} diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.mockup.spec.ts new file mode 100644 index 00000000..22d549c1 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.mockup.spec.ts @@ -0,0 +1,74 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {getLockView16DataItemOptions, getLockView16Options, LockView16Mockup} from './LockView16.mockup'; +import {MockupServer} from '../../../../../_utils'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {LockView16Runtime} from './LockView16'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('LockView16Mockup', () => { + + describe('static', () => { + let mockupServer: MockupServer; + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create LockView16Mockup', async () => { + const mockup= new LockView16Mockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + expect(mockup.wqc).to.not.be.undefined; + + + }); + + it('static DataItemOptions', () => { + const options = getLockView16DataItemOptions(1, 'Test') as LockView16Runtime; + expect(Object.keys(options).length).to.equal(84); + }); + + it('static DataAssemblyOptions', () => { + const options = getLockView16Options(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(86); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new LockView16Mockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(86); + }); + + }); + +}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.mockup.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.mockup.ts similarity index 69% rename from src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.mockup.ts index b26a1f89..c7e9e842 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.mockup.ts @@ -24,221 +24,235 @@ */ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import {catPEAMockup} from '../../../../../logging'; -import {getLockView8MockupReferenceJSON, LockView8Mockup} from './LockView8.mockup'; +import {getLockView8DataItemOptions, LockView8Mockup} from '../LockView8/LockView8.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getLockView16MockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getWQCDAMockupReferenceJSON(namespace,objectBrowseName), - ...getLockView8MockupReferenceJSON(namespace, objectBrowseName), - In9En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In9En`, - dataType: 'Boolean' - }, - In9: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In9`, - dataType: 'Boolean' - }, - In9QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In9QC`, - dataType: 'Byte' - }, - In9Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In9Inv`, - dataType: 'Boolean' - }, - In9Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In9Txt`, - dataType: 'String' - }, - In10En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In10En`, - dataType: 'Boolean' - }, - In10: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In10`, - dataType: 'Boolean' - }, - In10QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In10QC`, - dataType: 'Byte' - }, - In10Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In10Inv`, - dataType: 'Boolean' - }, - In10Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In10Txt`, - dataType: 'String' - }, - In11En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In11En`, - dataType: 'Boolean' - }, - In11: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In11`, - dataType: 'Boolean' - }, - In11QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In11QC`, - dataType: 'Byte' - }, - In11Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In11Inv`, - dataType: 'Boolean' - }, - In11Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In11Txt`, - dataType: 'String' - }, - In12En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In12En`, - dataType: 'Boolean' - }, - In12: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In12`, - dataType: 'Boolean' - }, - In12QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In12QC`, - dataType: 'Byte' - }, - In12Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In12Inv`, - dataType: 'Boolean' - }, - In12Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In12Txt`, - dataType: 'String' - }, - In13En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In13En`, - dataType: 'Boolean' - }, - In13: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In13`, - dataType: 'Boolean' - }, - In13QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In13QC`, - dataType: 'Byte' - }, - In13Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In13Inv`, - dataType: 'Boolean' - }, - In13Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In13Txt`, - dataType: 'String' - }, - In14En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In14En`, - dataType: 'Boolean' - }, - In14: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In14`, - dataType: 'Boolean' - }, - In14QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In14QC`, - dataType: 'Byte' - }, - In14Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In14Inv`, - dataType: 'Boolean' - }, - In14Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In14Txt`, - dataType: 'String' - }, - In15En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In15En`, - dataType: 'Boolean' - }, - In15: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In15`, - dataType: 'Boolean' - }, - In15QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In15QC`, - dataType: 'Byte' - }, - In15Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In15Inv`, - dataType: 'Boolean' - }, - In15Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In15Txt`, - dataType: 'String' - }, - In16En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In16En`, - dataType: 'Boolean' - }, - In16: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In16`, - dataType: 'Boolean' - }, - In16QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In16QC`, - dataType: 'Byte' - }, - In16Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In16Inv`, - dataType: 'Boolean' - }, - In16Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In16Txt`, - dataType: 'String' - } - } +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/LockView16'; + +function getLockView16SpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + In9En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In9En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In9: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In9`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In9QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In9QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In9Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In9Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In9Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In9Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In10En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In10En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In10: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In10`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In10QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In10QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In10Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In10Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In10Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In10Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In11En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In11En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In11: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In11`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In11QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In11QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In11Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In11Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In11Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In11Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In12En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In12En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In12: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In12`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In12QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In12QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In12Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In12Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In12Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In12Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In13En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In13En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In13: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In13`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In13QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In13QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In13Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In13Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In13Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In13Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In14En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In14En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In14: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In14`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In14QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In14QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In14Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In14Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In14Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In14Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In15En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In15En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In15: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In15`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In15QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In15QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In15Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In15Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In15Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In15Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In16En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In16En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In16: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In16`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In16QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In16QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In16Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In16Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In16Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In16Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + }); +} + +export function getLockView16DataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getLockView8DataItemOptions(namespace, objectBrowseName), + ...getLockView16SpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getLockView16Options(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getLockView16DataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class LockView16Mockup extends LockView8Mockup{ public in9En = false; @@ -743,9 +757,13 @@ export class LockView16Mockup extends LockView8Mockup{ }); } - public getLockView16InstanceMockupJSON() { - return getLockView16MockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getLockView16SpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.spec.ts new file mode 100644 index 00000000..ca1a3269 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.spec.ts @@ -0,0 +1,185 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../connection'; +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MockupServer} from '../../../../../_utils'; +import {LockView16} from './LockView16'; +import {getLockView16Options, LockView16Mockup} from './LockView16.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('LockView16', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getLockView16Options(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create LockView16', async () => { + const dataAssemblyController = new LockView16(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.communication).to.be.not.undefined; + expect(dataAssemblyController.wqc).to.be.not.undefined; + }); + + }); + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(8000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const lockView16Mockup =new LockView16Mockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + dataAssemblyOptions = lockView16Mockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(8000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new LockView16(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.communication.In16Txt.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect(dataAssemblyController.communication.Logic.value).equal(false); + expect(dataAssemblyController.communication.Out.value).equal(false); + expect(dataAssemblyController.communication.OutQC.value).equal(0); + + expect(dataAssemblyController.communication.In1En.value).equal(false); + expect(dataAssemblyController.communication.In1.value).equal(false); + expect(dataAssemblyController.communication.In1QC.value).equal(0); + expect(dataAssemblyController.communication.In1Inv.value).equal(false); + expect(dataAssemblyController.communication.In1Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In2En.value).equal(false); + expect(dataAssemblyController.communication.In2.value).equal(false); + expect(dataAssemblyController.communication.In2QC.value).equal(0); + expect(dataAssemblyController.communication.In2Inv.value).equal(false); + expect(dataAssemblyController.communication.In2Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In3En.value).equal(false); + expect(dataAssemblyController.communication.In3.value).equal(false); + expect(dataAssemblyController.communication.In3QC.value).equal(0); + expect(dataAssemblyController.communication.In3Inv.value).equal(false); + expect(dataAssemblyController.communication.In3Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In4En.value).equal(false); + expect(dataAssemblyController.communication.In4.value).equal(false); + expect(dataAssemblyController.communication.In4QC.value).equal(0); + expect(dataAssemblyController.communication.In4Inv.value).equal(false); + expect(dataAssemblyController.communication.In4Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In5En.value).equal(false); + expect(dataAssemblyController.communication.In5.value).equal(false); + expect(dataAssemblyController.communication.In5QC.value).equal(0); + expect(dataAssemblyController.communication.In5Inv.value).equal(false); + expect(dataAssemblyController.communication.In5Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In6En.value).equal(false); + expect(dataAssemblyController.communication.In6.value).equal(false); + expect(dataAssemblyController.communication.In6QC.value).equal(0); + expect(dataAssemblyController.communication.In6Inv.value).equal(false); + expect(dataAssemblyController.communication.In6Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In7En.value).equal(false); + expect(dataAssemblyController.communication.In7.value).equal(false); + expect(dataAssemblyController.communication.In7QC.value).equal(0); + expect(dataAssemblyController.communication.In7Inv.value).equal(false); + expect(dataAssemblyController.communication.In7Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In8En.value).equal(false); + expect(dataAssemblyController.communication.In8.value).equal(false); + expect(dataAssemblyController.communication.In8QC.value).equal(0); + expect(dataAssemblyController.communication.In8Inv.value).equal(false); + expect(dataAssemblyController.communication.In8Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In9En.value).equal(false); + expect(dataAssemblyController.communication.In9.value).equal(false); + expect(dataAssemblyController.communication.In9QC.value).equal(0); + expect(dataAssemblyController.communication.In9Inv.value).equal(false); + expect(dataAssemblyController.communication.In9Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In10En.value).equal(false); + expect(dataAssemblyController.communication.In10.value).equal(false); + expect(dataAssemblyController.communication.In10QC.value).equal(0); + expect(dataAssemblyController.communication.In10Inv.value).equal(false); + expect(dataAssemblyController.communication.In10Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In11En.value).equal(false); + expect(dataAssemblyController.communication.In11.value).equal(false); + expect(dataAssemblyController.communication.In11QC.value).equal(0); + expect(dataAssemblyController.communication.In11Inv.value).equal(false); + expect(dataAssemblyController.communication.In11Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In12En.value).equal(false); + expect(dataAssemblyController.communication.In12.value).equal(false); + expect(dataAssemblyController.communication.In12QC.value).equal(0); + expect(dataAssemblyController.communication.In12Inv.value).equal(false); + expect(dataAssemblyController.communication.In12Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In13En.value).equal(false); + expect(dataAssemblyController.communication.In13.value).equal(false); + expect(dataAssemblyController.communication.In13QC.value).equal(0); + expect(dataAssemblyController.communication.In13Inv.value).equal(false); + expect(dataAssemblyController.communication.In13Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In14En.value).equal(false); + expect(dataAssemblyController.communication.In14.value).equal(false); + expect(dataAssemblyController.communication.In14QC.value).equal(0); + expect(dataAssemblyController.communication.In14Inv.value).equal(false); + expect(dataAssemblyController.communication.In14Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In15En.value).equal(false); + expect(dataAssemblyController.communication.In15.value).equal(false); + expect(dataAssemblyController.communication.In15QC.value).equal(0); + expect(dataAssemblyController.communication.In15Inv.value).equal(false); + expect(dataAssemblyController.communication.In15Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In16En.value).equal(false); + expect(dataAssemblyController.communication.In16.value).equal(false); + expect(dataAssemblyController.communication.In16QC.value).equal(0); + expect(dataAssemblyController.communication.In16Inv.value).equal(false); + expect(dataAssemblyController.communication.In16Txt.value).equal('testText'); + }).timeout(8000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.ts new file mode 100644 index 00000000..4310cd3a --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/LockView16.ts @@ -0,0 +1,135 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaConnection, DataItem} from '../../../../connection'; +import {LockView8, LockView8Runtime} from '../LockView8'; + +export type LockView16Runtime = LockView8Runtime & { + In9En: DataItem; + In9: DataItem; + In9QC: DataItem; + In9Inv: DataItem; + In9Txt: DataItem; + + In10En: DataItem; + In10: DataItem; + In10QC: DataItem; + In10Inv: DataItem; + In10Txt: DataItem; + + In11En: DataItem; + In11: DataItem; + In11QC: DataItem; + In11Inv: DataItem; + In11Txt: DataItem; + + In12En: DataItem; + In12: DataItem; + In12QC: DataItem; + In12Inv: DataItem; + In12Txt: DataItem; + + In13En: DataItem; + In13: DataItem; + In13QC: DataItem; + In13Inv: DataItem; + In13Txt: DataItem; + + In14En: DataItem; + In14: DataItem; + In14QC: DataItem; + In14Inv: DataItem; + In14Txt: DataItem; + + In15En: DataItem; + In15: DataItem; + In15QC: DataItem; + In15Inv: DataItem; + In15Txt: DataItem; + + In16En: DataItem; + In16: DataItem; + In16QC: DataItem; + In16Inv: DataItem; + In16Txt: DataItem; +}; + +export class LockView16 extends LockView8 { + public readonly communication!: LockView16Runtime; + + constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { + super(options, connection); + + this.communication.In9En = this.createDataItem('In9En', 'boolean'); + this.communication.In9 = this.createDataItem('In9', 'boolean'); + this.communication.In9QC = this.createDataItem('In9QC', 'number'); + this.communication.In9Inv = this.createDataItem('In9Inv', 'boolean'); + this.communication.In9Txt = this.createDataItem('In9Txt', 'string'); + + this.communication.In10En = this.createDataItem('In10En', 'boolean'); + this.communication.In10 = this.createDataItem('In10', 'boolean'); + this.communication.In10QC = this.createDataItem('In10QC', 'number'); + this.communication.In10Inv = this.createDataItem('In10Inv', 'boolean'); + this.communication.In10Txt = this.createDataItem('In10Txt', 'string'); + + this.communication.In11En = this.createDataItem('In11En', 'boolean'); + this.communication.In11 = this.createDataItem('In11', 'boolean'); + this.communication.In11QC = this.createDataItem('In11QC', 'number'); + this.communication.In11Inv = this.createDataItem('In11Inv', 'boolean'); + this.communication.In11Txt = this.createDataItem('In11Txt', 'string'); + + this.communication.In12En = this.createDataItem('In12En', 'boolean'); + this.communication.In12 = this.createDataItem('In12', 'boolean'); + this.communication.In12QC = this.createDataItem('In12QC', 'number'); + this.communication.In12Inv = this.createDataItem('In12Inv', 'boolean'); + this.communication.In12Txt = this.createDataItem('In12Txt', 'string'); + + this.communication.In13En = this.createDataItem('In13En', 'boolean'); + this.communication.In13 = this.createDataItem('In13', 'boolean'); + this.communication.In13QC = this.createDataItem('In13QC', 'number'); + this.communication.In13Inv = this.createDataItem('In13Inv', 'boolean'); + this.communication.In13Txt = this.createDataItem('In13Txt', 'string'); + + this.communication.In14En = this.createDataItem('In14En', 'boolean'); + this.communication.In14 = this.createDataItem('In14', 'boolean'); + this.communication.In14QC = this.createDataItem('In14QC', 'number'); + this.communication.In14Inv = this.createDataItem('In14Inv', 'boolean'); + this.communication.In14Txt = this.createDataItem('In14Txt', 'string'); + + this.communication.In15En = this.createDataItem('In15En', 'boolean'); + this.communication.In15 = this.createDataItem('In15', 'boolean'); + this.communication.In15QC = this.createDataItem('In15QC', 'number'); + this.communication.In15Inv = this.createDataItem('In15Inv', 'boolean'); + this.communication.In15Txt = this.createDataItem('In15Txt', 'string'); + + this.communication.In16En = this.createDataItem('In16En', 'boolean'); + this.communication.In16 = this.createDataItem('In16', 'boolean'); + this.communication.In16QC = this.createDataItem('In16QC', 'number'); + this.communication.In16Inv = this.createDataItem('In16Inv', 'boolean'); + this.communication.In16Txt = this.createDataItem('In16Txt', 'string'); + } + +} diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/Lockview16.puml b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/Lockview16.puml new file mode 100644 index 00000000..d24e8cd6 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/Lockview16.puml @@ -0,0 +1,36 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram +class LockView16{ + + readonly communication!: LockView16Runtime; +} +LockView16 *- LockView16Runtime +LockView16 *- LockView16Spec +LockView16Spec ..> LockView16Mockup : <> +LockView16 *- LockView16Mockup + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/index.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/index.ts new file mode 100644 index 00000000..8e2b2648 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView16/index.ts @@ -0,0 +1,26 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export * from './LockView16'; diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.mockup.spec.ts deleted file mode 100644 index 66d77c2d..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.mockup.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {LockView4Mockup} from './LockView4.mockup'; -import {MockupServer} from '../../../../_utils'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('LockView4Mockup', () => { - - describe('static', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create LockView4Mockup', async () => { - const mockup= new LockView4Mockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - expect(mockup.wqc).to.not.be.undefined; - - - }); - it('getLockView4MockupReferenceJSON()', () => { - const mockup = new LockView4Mockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getLockView4InstanceMockupJSON(); - expect(Object.keys(json).length).to .equal(24); - }); - }); - describe('dynamic', () => { - it('get...', async () => { - //TODO get the rest - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.spec.ts deleted file mode 100644 index 4de80d7b..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.spec.ts +++ /dev/null @@ -1,126 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../connection'; -import {LockView4} from './LockView4'; - -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/lockview.json'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {LockView4Mockup} from './LockView4.mockup'; - - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('LockView4', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/LockView4/', - dataItems: baseDataAssemblyOptions - }; - - describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - - it('should create LockView4', async () => { - const da1 = new LockView4(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.be.not.undefined; - expect(da1.communication).to.be.not.undefined; - expect(da1.wqc).to.be.not.undefined; - }); - - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockup = new LockView4Mockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - const da1 = new LockView4(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - expect(da1.communication.Logic.value).equal(false); - expect(da1.communication.Out.value).equal(false); - expect(da1.communication.OutQC.value).equal(0); - - expect(da1.communication.In1En.value).equal(false); - expect(da1.communication.In1.value).equal(false); - expect(da1.communication.In1QC.value).equal(0); - expect(da1.communication.In1Inv.value).equal(false); - expect(da1.communication.In1Txt.value).equal('testText'); - - expect(da1.communication.In2En.value).equal(false); - expect(da1.communication.In2.value).equal(false); - expect(da1.communication.In2QC.value).equal(0); - expect(da1.communication.In2Inv.value).equal(false); - expect(da1.communication.In2Txt.value).equal('testText'); - - expect(da1.communication.In3En.value).equal(false); - expect(da1.communication.In3.value).equal(false); - expect(da1.communication.In3QC.value).equal(0); - expect(da1.communication.In3Inv.value).equal(false); - expect(da1.communication.In3Txt.value).equal('testText'); - - expect(da1.communication.In4En.value).equal(false); - expect(da1.communication.In4.value).equal(false); - expect(da1.communication.In4QC.value).equal(0); - expect(da1.communication.In4Inv.value).equal(false); - expect(da1.communication.In4Txt.value).equal('testText'); - }).timeout(4000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.ts deleted file mode 100644 index 863d5a20..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* tslint:disable:max-classes-per-file */ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {DiagnosticElement, DiagnosticElementRuntime} from '../DiagnosticElement'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; - -export type LockView4Runtime = DiagnosticElementRuntime & { - Logic: OpcUaDataItem; // False = AND; TRUE = OR; - Out: OpcUaDataItem; - OutQC: OpcUaDataItem; - - In1En: OpcUaDataItem; - In1: OpcUaDataItem; - In1QC: OpcUaDataItem; - In1Inv: OpcUaDataItem; - In1Txt: OpcUaDataItem; - - In2En: OpcUaDataItem; - In2: OpcUaDataItem; - In2QC: OpcUaDataItem; - In2Inv: OpcUaDataItem; - In2Txt: OpcUaDataItem; - - In3En: OpcUaDataItem; - In3: OpcUaDataItem; - In3QC: OpcUaDataItem; - In3Inv: OpcUaDataItem; - In3Txt: OpcUaDataItem; - - In4En: OpcUaDataItem; - In4: OpcUaDataItem; - In4QC: OpcUaDataItem; - In4Inv: OpcUaDataItem; - In4Txt: OpcUaDataItem; -}; - -export class LockView4 extends DiagnosticElement { - public readonly communication!: LockView4Runtime; - - constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { - super(options, connection); - - this.communication.Logic = this.createDataItem('Logic', 'read', 'boolean'); - this.communication.Out = this.createDataItem('Out', 'read', 'boolean'); - this.communication.OutQC = this.createDataItem('OutQC', 'read', 'number'); - - this.communication.In1En = this.createDataItem('In1En', 'read', 'boolean'); - this.communication.In1 = this.createDataItem('In1', 'read', 'boolean'); - this.communication.In1QC = this.createDataItem('In1QC', 'read', 'number'); - this.communication.In1Inv = this.createDataItem('In1Inv', 'read', 'boolean'); - this.communication.In1Txt = this.createDataItem('In1Txt', 'read', 'string'); - - this.communication.In2En = this.createDataItem('In2En', 'read', 'boolean'); - this.communication.In2 = this.createDataItem('In2', 'read', 'boolean'); - this.communication.In2QC = this.createDataItem('In2QC', 'read', 'number'); - this.communication.In2Inv = this.createDataItem('In2Inv', 'read', 'boolean'); - this.communication.In2Txt = this.createDataItem('In2Txt', 'read', 'string'); - - this.communication.In3En = this.createDataItem('In3En', 'read', 'boolean'); - this.communication.In3 = this.createDataItem('In3', 'read', 'boolean'); - this.communication.In3QC = this.createDataItem('In3QC', 'read', 'number'); - this.communication.In3Inv = this.createDataItem('In3Inv', 'read', 'boolean'); - this.communication.In3Txt = this.createDataItem('In3Txt', 'read', 'string'); - - this.communication.In4En = this.createDataItem('In4En', 'read', 'boolean'); - this.communication.In4 = this.createDataItem('In4', 'read', 'boolean'); - this.communication.In4QC = this.createDataItem('In4QC', 'read', 'number'); - this.communication.In4Inv = this.createDataItem('In4Inv', 'read', 'boolean'); - this.communication.In4Txt = this.createDataItem('In4Txt', 'read', 'string'); - - this.defaultReadDataItem = this.communication.Out; - this.defaultReadDataItemType = 'boolean'; - } - -} diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.mockup.spec.ts new file mode 100644 index 00000000..2854faf6 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.mockup.spec.ts @@ -0,0 +1,72 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {getLockView4DataItemOptions, getLockView4Options, LockView4Mockup} from './LockView4.mockup'; +import {MockupServer} from '../../../../../_utils'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {LockView4Runtime} from './LockView4'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('LockView4Mockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create LockView4Mockup', async () => { + const mockup= new LockView4Mockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + expect(mockup.wqc).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getLockView4DataItemOptions(1, 'Test') as LockView4Runtime; + expect(Object.keys(options).length).to.equal(24); + }); + + it('static DataAssemblyOptions', () => { + const options = getLockView4Options(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(26); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new LockView4Mockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(26); + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.mockup.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.mockup.ts similarity index 67% rename from src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.mockup.ts index 45b87724..31304150 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.mockup.ts @@ -24,133 +24,151 @@ */ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import {catPEAMockup} from '../../../../../logging'; -import {DiagnosticElementMockup} from '../DiagnosticElement.mockup'; +import {DiagnosticElementMockup, getDiagnosticElementDataItemOptions} from '../../DiagnosticElement.mockup'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getLockView4MockupReferenceJSON(namespace: number, objectBrowseName: string) { - return ( - { - ...getWQCDAMockupReferenceJSON(namespace,objectBrowseName), - Logic: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Logic`, - dataType: 'Boolean' - }, - Out: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Out`, - dataType: 'Boolean' - }, - OutQC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.OutQC`, - dataType: 'Byte' - }, - In1En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In1En`, - dataType: 'Boolean' - }, - In1: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In1`, - dataType: 'Boolean' - }, - In1QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In1QC`, - dataType: 'Byte' - }, - In1Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In1Inv`, - dataType: 'Boolean' - }, - In1Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In1Txt`, - dataType: 'String' - }, - In2En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In2En`, - dataType: 'Boolean' - }, - In2: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In2`, - dataType: 'Boolean' - }, - In2QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In2QC`, - dataType: 'Byte' - }, - In2Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In2Inv`, - dataType: 'Boolean' - }, - In2Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In2Txt`, - dataType: 'String' - }, - In3En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In3En`, - dataType: 'Boolean' - }, - In3: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In3`, - dataType: 'Boolean' - }, - In3QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In3QC`, - dataType: 'Byte' - }, - In3Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In3Inv`, - dataType: 'Boolean' - }, - In3Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In3Txt`, - dataType: 'String' - }, - In4En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In4En`, - dataType: 'Boolean' - }, - In4: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In4`, - dataType: 'Boolean' - }, - In4QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In4QC`, - dataType: 'Byte' - }, - In4Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In4Inv`, - dataType: 'Boolean' - }, - In4Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In4Txt`, - dataType: 'String' - } - } +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/LockView4'; + +function getLockView4SpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + Logic: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Logic`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + Out: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Out`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + OutQC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.OutQC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In1En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In1En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In1: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In1`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In1QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In1QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In1Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In1Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In1Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In1Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In2En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In2En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In2: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In2`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In2QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In2QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In2Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In2Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In2Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In2Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In3En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In3En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In3: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In3`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In3QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In3QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In3Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In3Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In3Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In3Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In4En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In4En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In4: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In4`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In4QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In4QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In4Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In4Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In4Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In4Txt`, + dataType: 'String' + } as OpcUaNodeOptions + }); +} + +export function getLockView4DataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getDiagnosticElementDataItemOptions(namespace, objectBrowseName), + ...getLockView4SpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getLockView4Options(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getLockView4DataItemOptions(namespace, objectBrowseName)}; + return options; +} + + export class LockView4Mockup extends DiagnosticElementMockup{ public logic = false; // False = AND; TRUE = OR; @@ -444,9 +462,14 @@ export class LockView4Mockup extends DiagnosticElementMockup{ }); } - public getLockView4InstanceMockupJSON() { - return getLockView4MockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getLockView4SpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.spec.ts new file mode 100644 index 00000000..8bc80985 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.spec.ts @@ -0,0 +1,114 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../connection'; +import {LockView4} from './LockView4'; + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MockupServer} from '../../../../../_utils'; +import {getLockView4Options, LockView4Mockup} from './LockView4.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('LockView4', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getLockView4Options(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create LockView4', async () => { + const dataAssemblyController = new LockView4(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.communication).to.be.not.undefined; + expect(dataAssemblyController.wqc).to.be.not.undefined; + }); + + }); + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const lockView4Mockup = new LockView4Mockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = lockView4Mockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new LockView4(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.communication.In4Txt.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect(dataAssemblyController.communication.Logic.value).equal(false); + expect(dataAssemblyController.communication.Out.value).equal(false); + expect(dataAssemblyController.communication.OutQC.value).equal(0); + + expect(dataAssemblyController.communication.In1En.value).equal(false); + expect(dataAssemblyController.communication.In1.value).equal(false); + expect(dataAssemblyController.communication.In1QC.value).equal(0); + expect(dataAssemblyController.communication.In1Inv.value).equal(false); + expect(dataAssemblyController.communication.In1Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In2En.value).equal(false); + expect(dataAssemblyController.communication.In2.value).equal(false); + expect(dataAssemblyController.communication.In2QC.value).equal(0); + expect(dataAssemblyController.communication.In2Inv.value).equal(false); + expect(dataAssemblyController.communication.In2Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In3En.value).equal(false); + expect(dataAssemblyController.communication.In3.value).equal(false); + expect(dataAssemblyController.communication.In3QC.value).equal(0); + expect(dataAssemblyController.communication.In3Inv.value).equal(false); + expect(dataAssemblyController.communication.In3Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In4En.value).equal(false); + expect(dataAssemblyController.communication.In4.value).equal(false); + expect(dataAssemblyController.communication.In4QC.value).equal(0); + expect(dataAssemblyController.communication.In4Inv.value).equal(false); + expect(dataAssemblyController.communication.In4Txt.value).equal('testText'); + }).timeout(4000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.ts new file mode 100644 index 00000000..8ed1f173 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/LockView4.ts @@ -0,0 +1,98 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {DiagnosticElement, DiagnosticElementRuntime} from '../../DiagnosticElement'; +import {OpcUaConnection, DataItem} from '../../../../connection'; + +export type LockView4Runtime = DiagnosticElementRuntime & { + Logic: DataItem; // False = AND; TRUE = OR; + Out: DataItem; + OutQC: DataItem; + + In1En: DataItem; + In1: DataItem; + In1QC: DataItem; + In1Inv: DataItem; + In1Txt: DataItem; + + In2En: DataItem; + In2: DataItem; + In2QC: DataItem; + In2Inv: DataItem; + In2Txt: DataItem; + + In3En: DataItem; + In3: DataItem; + In3QC: DataItem; + In3Inv: DataItem; + In3Txt: DataItem; + + In4En: DataItem; + In4: DataItem; + In4QC: DataItem; + In4Inv: DataItem; + In4Txt: DataItem; +}; + +export class LockView4 extends DiagnosticElement { + public readonly communication!: LockView4Runtime; + + constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { + super(options, connection); + + this.communication.Logic = this.createDataItem('Logic', 'boolean'); + this.communication.Out = this.createDataItem('Out', 'boolean'); + this.communication.OutQC = this.createDataItem('OutQC', 'number'); + + this.communication.In1En = this.createDataItem('In1En', 'boolean'); + this.communication.In1 = this.createDataItem('In1', 'boolean'); + this.communication.In1QC = this.createDataItem('In1QC', 'number'); + this.communication.In1Inv = this.createDataItem('In1Inv', 'boolean'); + this.communication.In1Txt = this.createDataItem('In1Txt', 'string'); + + this.communication.In2En = this.createDataItem('In2En', 'boolean'); + this.communication.In2 = this.createDataItem('In2', 'boolean'); + this.communication.In2QC = this.createDataItem('In2QC', 'number'); + this.communication.In2Inv = this.createDataItem('In2Inv', 'boolean'); + this.communication.In2Txt = this.createDataItem('In2Txt', 'string'); + + this.communication.In3En = this.createDataItem('In3En', 'boolean'); + this.communication.In3 = this.createDataItem('In3', 'boolean'); + this.communication.In3QC = this.createDataItem('In3QC', 'number'); + this.communication.In3Inv = this.createDataItem('In3Inv', 'boolean'); + this.communication.In3Txt = this.createDataItem('In3Txt', 'string'); + + this.communication.In4En = this.createDataItem('In4En', 'boolean'); + this.communication.In4 = this.createDataItem('In4', 'boolean'); + this.communication.In4QC = this.createDataItem('In4QC', 'number'); + this.communication.In4Inv = this.createDataItem('In4Inv', 'boolean'); + this.communication.In4Txt = this.createDataItem('In4Txt', 'string'); + + this.defaultReadDataItem = this.communication.Out; + this.defaultReadDataItemType = 'boolean'; + } + +} diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/Lockview4.puml b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/Lockview4.puml new file mode 100644 index 00000000..f54e5b1f --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/Lockview4.puml @@ -0,0 +1,40 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram +!include ../Lockview8/LockView8.puml + +class LockView4{ + + readonly communication!: LockView4Runtime; +} +LockView4 *- LockView4Runtime + +LockView4 *- LockView4Spec +LockView4Spec ..> LockView4Mockup : <> +LockView4 *- LockView4Mockup + +LockView4 <|-- LockView8 +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/index.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/index.ts new file mode 100644 index 00000000..9720ccf4 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView4/index.ts @@ -0,0 +1,26 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export * from './LockView4'; diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.mockup.spec.ts deleted file mode 100644 index 0a0691bd..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.mockup.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {LockView8Mockup} from './LockView8.mockup'; -import {MockupServer} from '../../../../_utils'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('LockView8Mockup', () => { - - describe('static', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create LockView8Mockup', async () => { - const mockup= new LockView8Mockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - expect(mockup.wqc).to.not.be.undefined; - - - }); - it('getLockView8MockupReferenceJSON()', () => { - const mockup = new LockView8Mockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getLockView8InstanceMockupJSON(); - expect(Object.keys(json).length).to .equal(44); - }); - }); - describe('dynamic', () => { - it('get...', async () => { - //TODO get the rest - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.spec.ts deleted file mode 100644 index 94106237..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.spec.ts +++ /dev/null @@ -1,149 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../connection'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/lockview.json'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {LockView8} from "./LockView8"; -import {LockView8Mockup} from "./LockView8.mockup"; - - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('LockView8', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/LockView8', - dataItems: baseDataAssemblyOptions - }; - - describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - - it('should create LockView8', async () => { - const da1 = new LockView8(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.be.not.undefined; - expect(da1.communication).to.be.not.undefined; - expect(da1.wqc).to.be.not.undefined; - }); - - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - beforeEach(async function () { - this.timeout(8000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockup = new LockView8Mockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(8000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - const da1 = new LockView8(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - expect(da1.communication.Logic.value).equal(false); - expect(da1.communication.Out.value).equal(false); - expect(da1.communication.OutQC.value).equal(0); - - expect(da1.communication.In1En.value).equal(false); - expect(da1.communication.In1.value).equal(false); - expect(da1.communication.In1QC.value).equal(0); - expect(da1.communication.In1Inv.value).equal(false); - expect(da1.communication.In1Txt.value).equal('testText'); - - expect(da1.communication.In2En.value).equal(false); - expect(da1.communication.In2.value).equal(false); - expect(da1.communication.In2QC.value).equal(0); - expect(da1.communication.In2Inv.value).equal(false); - expect(da1.communication.In2Txt.value).equal('testText'); - - expect(da1.communication.In3En.value).equal(false); - expect(da1.communication.In3.value).equal(false); - expect(da1.communication.In3QC.value).equal(0); - expect(da1.communication.In3Inv.value).equal(false); - expect(da1.communication.In3Txt.value).equal('testText'); - - expect(da1.communication.In8En.value).equal(false); - expect(da1.communication.In8.value).equal(false); - expect(da1.communication.In8QC.value).equal(0); - expect(da1.communication.In8Inv.value).equal(false); - expect(da1.communication.In8Txt.value).equal('testText'); - - expect(da1.communication.In5En.value).equal(false); - expect(da1.communication.In5.value).equal(false); - expect(da1.communication.In5QC.value).equal(0); - expect(da1.communication.In5Inv.value).equal(false); - expect(da1.communication.In5Txt.value).equal('testText'); - - expect(da1.communication.In6En.value).equal(false); - expect(da1.communication.In6.value).equal(false); - expect(da1.communication.In6QC.value).equal(0); - expect(da1.communication.In6Inv.value).equal(false); - expect(da1.communication.In6Txt.value).equal('testText'); - - expect(da1.communication.In7En.value).equal(false); - expect(da1.communication.In7.value).equal(false); - expect(da1.communication.In7QC.value).equal(0); - expect(da1.communication.In7Inv.value).equal(false); - expect(da1.communication.In7Txt.value).equal('testText'); - - expect(da1.communication.In8En.value).equal(false); - expect(da1.communication.In8.value).equal(false); - expect(da1.communication.In8QC.value).equal(0); - expect(da1.communication.In8Inv.value).equal(false); - expect(da1.communication.In8Txt.value).equal('testText'); - }).timeout(8000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.ts deleted file mode 100644 index c5aaf8e9..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.ts +++ /dev/null @@ -1,88 +0,0 @@ -/* tslint:disable:max-classes-per-file */ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; -import {LockView4, LockView4Runtime} from './LockView4'; - -export type LockView8Runtime = LockView4Runtime & { - In5En: OpcUaDataItem; - In5: OpcUaDataItem; - In5QC: OpcUaDataItem; - In5Inv: OpcUaDataItem; - In5Txt: OpcUaDataItem; - - In6En: OpcUaDataItem; - In6: OpcUaDataItem; - In6QC: OpcUaDataItem; - In6Inv: OpcUaDataItem; - In6Txt: OpcUaDataItem; - - In7En: OpcUaDataItem; - In7: OpcUaDataItem; - In7QC: OpcUaDataItem; - In7Inv: OpcUaDataItem; - In7Txt: OpcUaDataItem; - - In8En: OpcUaDataItem; - In8: OpcUaDataItem; - In8QC: OpcUaDataItem; - In8Inv: OpcUaDataItem; - In8Txt: OpcUaDataItem; -}; - -export class LockView8 extends LockView4 { - public readonly communication!: LockView8Runtime; - - constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { - super(options, connection); - - this.communication.In5En = this.createDataItem('In5En', 'read', 'boolean'); - this.communication.In5 = this.createDataItem('In5', 'read', 'boolean'); - this.communication.In5QC = this.createDataItem('In5QC', 'read', 'number'); - this.communication.In5Inv = this.createDataItem('In5Inv', 'read', 'boolean'); - this.communication.In5Txt = this.createDataItem('In5Txt', 'read', 'string'); - - this.communication.In6En = this.createDataItem('In6En', 'read', 'boolean'); - this.communication.In6 = this.createDataItem('In6', 'read', 'boolean'); - this.communication.In6QC = this.createDataItem('In6QC', 'read', 'number'); - this.communication.In6Inv = this.createDataItem('In6Inv', 'read', 'boolean'); - this.communication.In6Txt = this.createDataItem('In6Txt', 'read', 'string'); - - this.communication.In7En = this.createDataItem('In7En', 'read', 'boolean'); - this.communication.In7 = this.createDataItem('In7', 'read', 'boolean'); - this.communication.In7QC = this.createDataItem('In7QC', 'read', 'number'); - this.communication.In7Inv = this.createDataItem('In7Inv', 'read', 'boolean'); - this.communication.In7Txt = this.createDataItem('In7Txt', 'read', 'string'); - - this.communication.In8En = this.createDataItem('In8En', 'read', 'boolean'); - this.communication.In8 = this.createDataItem('In8', 'read', 'boolean'); - this.communication.In8QC = this.createDataItem('In8QC', 'read', 'number'); - this.communication.In8Inv = this.createDataItem('In8Inv', 'read', 'boolean'); - this.communication.In8Txt = this.createDataItem('In8Txt', 'read', 'string'); - } - -} diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.mockup.spec.ts new file mode 100644 index 00000000..e34b841f --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.mockup.spec.ts @@ -0,0 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {getLockView8DataItemOptions, getLockView8Options, LockView8Mockup} from './LockView8.mockup'; +import {MockupServer} from '../../../../../_utils'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {LockView8Runtime} from './LockView8'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('LockView8Mockup', () => { + + describe('static', () => { + let mockupServer: MockupServer; + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create LockView8Mockup', async () => { + const mockup= new LockView8Mockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + expect(mockup.wqc).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getLockView8DataItemOptions(1, 'Test') as LockView8Runtime; + expect(Object.keys(options).length).to.equal(44); + }); + + it('static DataAssemblyOptions', () => { + const options = getLockView8Options(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(46); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new LockView8Mockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(46); + }); + }); + +}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.mockup.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.mockup.ts similarity index 59% rename from src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.mockup.ts index da921a22..84f74736 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.mockup.ts @@ -24,236 +24,138 @@ */ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import {catPEAMockup} from '../../../../../logging'; -import {DiagnosticElementMockup} from '../DiagnosticElement.mockup'; -import {LockView4Mockup} from './LockView4.mockup'; +import {getLockView4DataItemOptions, LockView4Mockup} from '../LockView4/LockView4.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; -export function getLockView8MockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getWQCDAMockupReferenceJSON(namespace,objectBrowseName), - Logic: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Logic`, - dataType: 'Boolean' - }, - Out: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Out`, - dataType: 'Boolean' - }, - OutQC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.OutQC`, - dataType: 'Byte' - }, - In1En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In1En`, - dataType: 'Boolean' - }, - In1: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In1`, - dataType: 'Boolean' - }, - In1QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In1QC`, - dataType: 'Byte' - }, - In1Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In1Inv`, - dataType: 'Boolean' - }, - In1Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In1Txt`, - dataType: 'String' - }, - In2En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In2En`, - dataType: 'Boolean' - }, - In2: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In2`, - dataType: 'Boolean' - }, - In2QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In2QC`, - dataType: 'Byte' - }, - In2Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In2Inv`, - dataType: 'Boolean' - }, - In2Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In2Txt`, - dataType: 'String' - }, - In3En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In3En`, - dataType: 'Boolean' - }, - In3: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In3`, - dataType: 'Boolean' - }, - In3QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In3QC`, - dataType: 'Byte' - }, - In3Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In3Inv`, - dataType: 'Boolean' - }, - In3Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In3Txt`, - dataType: 'String' - }, - In4En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In4En`, - dataType: 'Boolean' - }, - In4: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In4`, - dataType: 'Boolean' - }, - In4QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In4QC`, - dataType: 'Byte' - }, - In4Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In4Inv`, - dataType: 'Boolean' - }, - In4Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In4Txt`, - dataType: 'String' - }, - In5En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In5En`, - dataType: 'Boolean' - }, - In5: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In5`, - dataType: 'Boolean' - }, - In5QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In5QC`, - dataType: 'Byte' - }, - In5Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In5Inv`, - dataType: 'Boolean' - }, - In5Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In5Txt`, - dataType: 'String' - }, - In6En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In6En`, - dataType: 'Boolean' - }, - In6: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In6`, - dataType: 'Boolean' - }, - In6QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In6QC`, - dataType: 'Byte' - }, - In6Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In6Inv`, - dataType: 'Boolean' - }, - In6Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In6Txt`, - dataType: 'String' - }, - In7En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In7En`, - dataType: 'Boolean' - }, - In7: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In7`, - dataType: 'Boolean' - }, - In7QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In7QC`, - dataType: 'Byte' - }, - In7Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In7Inv`, - dataType: 'Boolean' - }, - In7Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In7Txt`, - dataType: 'String' - }, - In8En: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In8En`, - dataType: 'Boolean' - }, - In8: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In8`, - dataType: 'Boolean' - }, - In8QC: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In8QC`, - dataType: 'Byte' - }, - In8Inv: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In8Inv`, - dataType: 'Boolean' - }, - In8Txt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.In8Txt`, - dataType: 'String' - } - } + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/LockView8'; + +function getLockView8SpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + In5En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In5En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In5: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In5`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In5QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In5QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In5Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In5Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In5Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In5Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In6En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In6En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In6: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In6`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In6QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In6QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In6Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In6Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In6Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In6Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In7En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In7En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In7: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In7`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In7QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In7QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In7Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In7Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In7Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In7Txt`, + dataType: 'String' + } as OpcUaNodeOptions, + In8En: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In8En`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In8: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In8`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In8QC: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In8QC`, + dataType: 'Byte' + } as OpcUaNodeOptions, + In8Inv: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In8Inv`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + In8Txt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.In8Txt`, + dataType: 'String' + } as OpcUaNodeOptions + }); +} + + +export function getLockView8DataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getLockView4DataItemOptions(namespace, objectBrowseName), + ...getLockView8SpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } + +export function getLockView8Options(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getLockView8DataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class LockView8Mockup extends LockView4Mockup{ public in5En = false; @@ -510,9 +412,13 @@ export class LockView8Mockup extends LockView4Mockup{ }); } - public getLockView8InstanceMockupJSON() { - return getLockView8MockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getLockView8SpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.spec.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.spec.ts new file mode 100644 index 00000000..005c2a76 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.spec.ts @@ -0,0 +1,137 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../connection'; +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MockupServer} from '../../../../../_utils'; +import {LockView8} from './LockView8'; +import {getLockView8Options, LockView8Mockup} from './LockView8.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('LockView8', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getLockView8Options(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create LockView8', async () => { + const dataAssemblyController = new LockView8(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.communication).to.be.not.undefined; + expect(dataAssemblyController.wqc).to.be.not.undefined; + }); + + }); + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(8000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const lockView8Mockup = new LockView8Mockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = lockView8Mockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(8000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new LockView8(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.communication.In8Txt.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect(dataAssemblyController.communication.Logic.value).equal(false); + expect(dataAssemblyController.communication.Out.value).equal(false); + expect(dataAssemblyController.communication.OutQC.value).equal(0); + + expect(dataAssemblyController.communication.In1En.value).equal(false); + expect(dataAssemblyController.communication.In1.value).equal(false); + expect(dataAssemblyController.communication.In1QC.value).equal(0); + expect(dataAssemblyController.communication.In1Inv.value).equal(false); + expect(dataAssemblyController.communication.In1Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In2En.value).equal(false); + expect(dataAssemblyController.communication.In2.value).equal(false); + expect(dataAssemblyController.communication.In2QC.value).equal(0); + expect(dataAssemblyController.communication.In2Inv.value).equal(false); + expect(dataAssemblyController.communication.In2Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In3En.value).equal(false); + expect(dataAssemblyController.communication.In3.value).equal(false); + expect(dataAssemblyController.communication.In3QC.value).equal(0); + expect(dataAssemblyController.communication.In3Inv.value).equal(false); + expect(dataAssemblyController.communication.In3Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In4En.value).equal(false); + expect(dataAssemblyController.communication.In4.value).equal(false); + expect(dataAssemblyController.communication.In4QC.value).equal(0); + expect(dataAssemblyController.communication.In4Inv.value).equal(false); + expect(dataAssemblyController.communication.In4Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In5En.value).equal(false); + expect(dataAssemblyController.communication.In5.value).equal(false); + expect(dataAssemblyController.communication.In5QC.value).equal(0); + expect(dataAssemblyController.communication.In5Inv.value).equal(false); + expect(dataAssemblyController.communication.In5Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In6En.value).equal(false); + expect(dataAssemblyController.communication.In6.value).equal(false); + expect(dataAssemblyController.communication.In6QC.value).equal(0); + expect(dataAssemblyController.communication.In6Inv.value).equal(false); + expect(dataAssemblyController.communication.In6Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In7En.value).equal(false); + expect(dataAssemblyController.communication.In7.value).equal(false); + expect(dataAssemblyController.communication.In7QC.value).equal(0); + expect(dataAssemblyController.communication.In7Inv.value).equal(false); + expect(dataAssemblyController.communication.In7Txt.value).equal('testText'); + + expect(dataAssemblyController.communication.In8En.value).equal(false); + expect(dataAssemblyController.communication.In8.value).equal(false); + expect(dataAssemblyController.communication.In8QC.value).equal(0); + expect(dataAssemblyController.communication.In8Inv.value).equal(false); + expect(dataAssemblyController.communication.In8Txt.value).equal('testText'); + }).timeout(8000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.ts new file mode 100644 index 00000000..223d8b2f --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/LockView8.ts @@ -0,0 +1,87 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaConnection, DataItem} from '../../../../connection'; +import {LockView4, LockView4Runtime} from '../LockView4'; + +export type LockView8Runtime = LockView4Runtime & { + In5En: DataItem; + In5: DataItem; + In5QC: DataItem; + In5Inv: DataItem; + In5Txt: DataItem; + + In6En: DataItem; + In6: DataItem; + In6QC: DataItem; + In6Inv: DataItem; + In6Txt: DataItem; + + In7En: DataItem; + In7: DataItem; + In7QC: DataItem; + In7Inv: DataItem; + In7Txt: DataItem; + + In8En: DataItem; + In8: DataItem; + In8QC: DataItem; + In8Inv: DataItem; + In8Txt: DataItem; +}; + +export class LockView8 extends LockView4 { + public readonly communication!: LockView8Runtime; + + constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { + super(options, connection); + + this.communication.In5En = this.createDataItem('In5En', 'boolean'); + this.communication.In5 = this.createDataItem('In5', 'boolean'); + this.communication.In5QC = this.createDataItem('In5QC', 'number'); + this.communication.In5Inv = this.createDataItem('In5Inv', 'boolean'); + this.communication.In5Txt = this.createDataItem('In5Txt', 'string'); + + this.communication.In6En = this.createDataItem('In6En', 'boolean'); + this.communication.In6 = this.createDataItem('In6', 'boolean'); + this.communication.In6QC = this.createDataItem('In6QC', 'number'); + this.communication.In6Inv = this.createDataItem('In6Inv', 'boolean'); + this.communication.In6Txt = this.createDataItem('In6Txt', 'string'); + + this.communication.In7En = this.createDataItem('In7En', 'boolean'); + this.communication.In7 = this.createDataItem('In7', 'boolean'); + this.communication.In7QC = this.createDataItem('In7QC', 'number'); + this.communication.In7Inv = this.createDataItem('In7Inv', 'boolean'); + this.communication.In7Txt = this.createDataItem('In7Txt', 'string'); + + this.communication.In8En = this.createDataItem('In8En', 'boolean'); + this.communication.In8 = this.createDataItem('In8', 'boolean'); + this.communication.In8QC = this.createDataItem('In8QC', 'number'); + this.communication.In8Inv = this.createDataItem('In8Inv', 'boolean'); + this.communication.In8Txt = this.createDataItem('In8Txt', 'string'); + } + +} diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/Lockview8.puml b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/Lockview8.puml new file mode 100644 index 00000000..70e509c6 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/Lockview8.puml @@ -0,0 +1,39 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram +!include ../LockView16/LockView16.puml + +class LockView8{ + + readonly communication!: LockView8Runtime; +} +LockView8 *- LockView4Runtime +LockView8 *- LockView8Spec +LockView8Spec ..> LockView8Mockup : <> +LockView8 *- LockView8Mockup + +LockView8 <|-- LockView16 +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/index.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/index.ts new file mode 100644 index 00000000..c9d09b35 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/LockView8/index.ts @@ -0,0 +1,26 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export * from './LockView8'; diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/Lockview16.puml b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/Lockview16.puml deleted file mode 100644 index 82831fe1..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/Lockview16.puml +++ /dev/null @@ -1,11 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram -class LockView16{ - + readonly communication!: LockView16Runtime; -} -LockView16 *- LockView16Runtime -LockView16 *- LockView16Spec -LockView16Spec ..> LockView16Mockup : <> -LockView16 *- LockView16Mockup - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/Lockview4.puml b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/Lockview4.puml deleted file mode 100644 index e32bd0e4..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/Lockview4.puml +++ /dev/null @@ -1,15 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram -!include LockView8.puml - -class LockView4{ - + readonly communication!: LockView4Runtime; -} -LockView4 *- LockView4Runtime - -LockView4 *- LockView4Spec -LockView4Spec ..> LockView4Mockup : <> -LockView4 *- LockView4Mockup - -LockView4 <|-- LockView8 -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/Lockview8.puml b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/Lockview8.puml deleted file mode 100644 index 243b1800..00000000 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/Lockview8.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram -!include LockView16.puml - -class LockView8{ - + readonly communication!: LockView8Runtime; -} -LockView8 *- LockView4Runtime -LockView8 *- LockView8Spec -LockView8Spec ..> LockView8Mockup : <> -LockView8 *- LockView8Mockup - -LockView8 <|-- LockView16 -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/index.ts b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/index.ts index aba870b8..e3535e14 100644 --- a/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/diagnosticElement/lockView/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './LockView4'; export * from './LockView8'; export * from './LockView16'; diff --git a/src/modularPlantManager/pea/dataAssembly/index.ts b/src/modularPlantManager/pea/dataAssembly/index.ts index 58dce0c9..aaab4871 100644 --- a/src/modularPlantManager/pea/dataAssembly/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/index.ts @@ -1,6 +1,31 @@ -export * from './_extensions/_helper'; +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export * from './baseFunction/_helper'; export * from './activeElement'; -export * from './_extensions'; +export * from './baseFunction'; export * from './diagnosticElement'; export * from './indicatorElement'; export * from './inputElement'; @@ -8,4 +33,4 @@ export * from './operationElement'; export * from './DataAssemblyController'; export * from './DataAssemblyControllerFactory'; export * from '../serviceSet/service/enum'; -export * from './ServiceControl/ServiceControl'; +export * from './serviceControl/ServiceControl'; diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.mockup.spec.ts deleted file mode 100644 index 2a72514b..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.mockup.spec.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {AnaMonMockup} from './AnaMon.mockup'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('AnaMonMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create AnaMonMockup', async () => { - const mockup= new AnaMonMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - //TODO: test more - - }); - it('getAnaMonMockupReferenceJSON()', () => { - const mockup = new AnaMonMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getAnaMonInstanceMockupJSON(); - expect(json).not.to.be.undefined; - //TODO: test more - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.mockup.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.mockup.ts deleted file mode 100644 index 69e718df..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.mockup.ts +++ /dev/null @@ -1,94 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import { - getScaleSettingDAMockupReferenceJSON, - ScaleSettingDAMockup -} from '../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../_extensions/unitDA/UnitDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../_extensions/osLevelDA/OSLevelDA.mockup'; -import { - getLimitMonitoringDAMockupReferenceJSON, - LimitMonitoringDAMockup -} from '../../_extensions/limitMonitoringDA/LimitMonitoringDA.mockup'; -import {IndicatorElementMockup} from '../IndicatorElement.mockup'; - -export function getAnaMonMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getWQCDAMockupReferenceJSON(namespace, objectBrowseName), - ...getScaleSettingDAMockupReferenceJSON(namespace, objectBrowseName, 'Float'), - ...getUnitDAMockupReferenceJSON(namespace, objectBrowseName), - ...getOSLevelDAMockupReferenceJSON(namespace, objectBrowseName), - ...getLimitMonitoringDAMockupReferenceJSON(namespace, objectBrowseName), - V: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.V`, - dataType: 'Float' - } - } - ); -} - -export class AnaMonMockup extends IndicatorElementMockup{ - - protected v = 0; - public scaleSettings: ScaleSettingDAMockup; - public unit: UnitDAMockup; - public osLevel: OSLevelDAMockup; - public limitMonitoring: LimitMonitoringDAMockup; - - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - - super(namespace, rootNode, variableName); - - this.scaleSettings = new ScaleSettingDAMockup(namespace, this.mockupNode, this.name, DataType.Double); - this.unit = new UnitDAMockup(namespace, this.mockupNode, this.name); - this.osLevel = new OSLevelDAMockup(namespace, this.mockupNode, this.name); - this.limitMonitoring = new LimitMonitoringDAMockup(namespace, this.mockupNode, this.name, DataType.Double); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.V`, - browseName: `${variableName}.V`, - dataType: DataType.Double, - value: { - get: (): Variant => { - return new Variant({dataType: DataType.Double, value: this.v}); - }, - }, - }); - } - - public getAnaMonInstanceMockupJSON() { - return getAnaMonMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); - } -} diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.puml b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.puml deleted file mode 100644 index 940ed1e4..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.puml +++ /dev/null @@ -1,20 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram -!include ../../_extensions/limitMonitoringDA/LimitMonitoring.puml -!include ../../_extensions/osLevelDA/OSLevel.puml - -class AnaMon{ - + communication!: AnaMonRuntime - + limitMonitoring: LimitMonitoring - + osLevel: OSLevel -} -AnaMon *- AnaMonSpec -AnaMonSpec ..> AnaMonMockup : <> -AnaMon *-- "1" AnaMonMockup -AnaMon *-- "1" AnaMonRuntime -AnaMon *-- "1" LimitMonitoring -AnaMon *-- "1" OSLevel - - - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.spec.ts deleted file mode 100644 index 4a849e4d..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.spec.ts +++ /dev/null @@ -1,155 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../connection'; -import {AnaMon} from './AnaMon'; - -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/anamon.json'; -import {DataAssemblyControllerFactory} from '../../DataAssemblyControllerFactory'; -import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {AnaMonMockup} from './AnaMon.mockup'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('AnaMon', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaMon', - dataItems: baseDataAssemblyOptions - }; - describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create AnaMon', async () => { - const da1: AnaMon= new AnaMon(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1.tagName).to.equal('Variable'); - expect(da1.tagDescription).to.equal('Test'); - expect(da1.communication.V).to.not.equal(undefined); - expect(da1.communication.WQC).to.not.equal(undefined); - expect(da1.communication.VSclMax).to.not.equal(undefined); - expect(da1.communication.VSclMin).to.not.equal(undefined); - expect(da1.communication.VUnit).to.not.equal(undefined); - - expect(da1.communication.OSLevel).to.not.equal(undefined); - expect(da1.communication.VAHEn).to.not.equal(undefined); - expect(da1.communication.VAHLim).to.not.equal(undefined); - expect(da1.communication.VAHAct).to.not.equal(undefined); - - expect(da1.communication.VWHEn).to.not.equal(undefined); - expect(da1.communication.VWHLim).to.not.equal(undefined); - expect(da1.communication.VWHAct).to.not.equal(undefined); - - expect(da1.communication.VTHEn).to.not.equal(undefined); - expect(da1.communication.VTHLim).to.not.equal(undefined); - expect(da1.communication.VTHAct).to.not.equal(undefined); - - expect(da1.communication.VTLEn).to.not.equal(undefined); - expect(da1.communication.VTLLim).to.not.equal(undefined); - expect(da1.communication.VTLAct).to.not.equal(undefined); - - expect(da1.communication.VWLEn).to.not.equal(undefined); - expect(da1.communication.VWLLim).to.not.equal(undefined); - expect(da1.communication.VWLAct).to.not.equal(undefined); - - expect(da1.communication.VALEn).to.not.equal(undefined); - expect(da1.communication.VALLim).to.not.equal(undefined); - expect(da1.communication.VALAct).to.not.equal(undefined); - }); - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockup = new AnaMonMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - - const da1 = new AnaMon(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.V.value).equal(0); - expect(da1.communication.WQC.value).equal(0); - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(0); - - expect(da1.communication.OSLevel.value).to.equal(0); - expect(da1.communication.VAHEn.value).to.equal(false); - expect(da1.communication.VAHLim.value).to.equal(0); - expect(da1.communication.VAHAct.value).to.equal(false); - - expect(da1.communication.VWHEn.value).to.equal(false); - expect(da1.communication.VWHLim.value).to.equal(0); - expect(da1.communication.VWHAct.value).to.equal(false); - - expect(da1.communication.VTHEn.value).to.equal(false); - expect(da1.communication.VTHLim.value).to.equal(0); - expect(da1.communication.VTHAct.value).to.equal(false); - - expect(da1.communication.VTLEn.value).to.equal(false); - expect(da1.communication.VTLLim.value).to.equal(0); - expect(da1.communication.VTLAct.value).to.equal(false); - - expect(da1.communication.VWLEn.value).to.equal(false); - expect(da1.communication.VWLLim.value).to.equal(0); - expect(da1.communication.VWLAct.value).to.equal(false); - - expect(da1.communication.VALEn.value).to.equal(false); - expect(da1.communication.VALLim.value).to.equal(0); - expect(da1.communication.VALAct.value).to.equal(false); - - }).timeout(4000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.mockup.spec.ts new file mode 100644 index 00000000..cad1a8df --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.mockup.spec.ts @@ -0,0 +1,72 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../../_utils'; +import {AnaMonMockup, getAnaMonDataItemOptions, getAnaMonOptions} from './AnaMon.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaMonRuntime} from './AnaMon'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('AnaMonMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create AnaMonMockup', async () => { + const mockup= new AnaMonMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getAnaMonDataItemOptions(1, 'Test') as AnaMonRuntime; + expect(Object.keys(options).length).to.equal(24); + }); + + it('static DataAssemblyOptions', () => { + const options = getAnaMonOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(26); + }).timeout(6000); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new AnaMonMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(26); + }).timeout(6000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.mockup.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.mockup.ts new file mode 100644 index 00000000..7b20625f --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.mockup.ts @@ -0,0 +1,79 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {Namespace, UAObject} from 'node-opcua'; +import {getOSLevelDataItemOptions, OSLevelMockup} from '../../../baseFunction/osLevel/OSLevel.mockup'; +import { + getLimitMonitoringDataItemOptions, + LimitMonitoringMockup +} from '../../../baseFunction/limitMonitoring/LimitMonitoring.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaViewMockup, getAnaViewDataItemOptions} from '../AnaView.mockup'; + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView/AnaMon'; + +export function getAnaMonDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getAnaViewDataItemOptions(namespace, objectBrowseName), + ...getOSLevelDataItemOptions(namespace, objectBrowseName), + ...getLimitMonitoringDataItemOptions(namespace, objectBrowseName, 'Ana'), + } as OpcUaNodeOptions + ); +} + +export function getAnaMonOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getAnaMonDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class AnaMonMockup extends AnaViewMockup{ + + public osLevel: OSLevelMockup; + public limitMonitoring: LimitMonitoringMockup<'Ana'>; + + constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); + + this.osLevel = new OSLevelMockup(namespace, this.mockupNode, this.name); + this.limitMonitoring = new LimitMonitoringMockup(namespace, this.mockupNode, this.name, 'Ana'); + } + + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.osLevel.getDataItemOptions(), + ...this.limitMonitoring.getDataItemOptions() + }; + return options; + } +} diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.puml b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.puml new file mode 100644 index 00000000..8bb7d970 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.puml @@ -0,0 +1,46 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram +!include ../../../_extensions/limitMonitoring/LimitMonitoring.puml +!include ../../../_extensions/osLevel/OSLevel.puml + +interface AnaMonRuntime + +class AnaMon{ + + communication!: AnaMonRuntime + + limitMonitoring: LimitMonitoring + + osLevel: OSLevel +} +AnaMon --> AnaMonRuntime + +AnaMonSpec --> AnaMon : <> +AnaMonSpec --> AnaMonMockup : <> +AnaMon -- AnaMonMockup +AnaMon *-- "1" LimitMonitoring +AnaMon *-- "1" OSLevel + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.spec.ts new file mode 100644 index 00000000..7ad84d3a --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.spec.ts @@ -0,0 +1,138 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../connection'; +import {AnaMon} from './AnaMon'; + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MockupServer} from '../../../../../_utils'; +import {AnaMonMockup, getAnaMonOptions} from './AnaMon.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('AnaMon', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getAnaMonOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create AnaMon', async () => { + const dataAssemblyController: AnaMon = new AnaMon(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController.tagName).to.not.equal(undefined); + expect(dataAssemblyController.tagDescription).to.not.equal(undefined); + expect(dataAssemblyController.communication.V).to.not.equal(undefined); + expect(dataAssemblyController.communication.WQC).to.not.equal(undefined); + expect(dataAssemblyController.communication.VSclMax).to.not.equal(undefined); + expect(dataAssemblyController.communication.VSclMin).to.not.equal(undefined); + expect(dataAssemblyController.communication.VUnit).to.not.equal(undefined); + + expect(dataAssemblyController.communication.OSLevel).to.not.equal(undefined); + expect(dataAssemblyController.communication.VAHEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VAHLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VAHAct).to.not.equal(undefined); + + expect(dataAssemblyController.communication.VWHEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VWHLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VWHAct).to.not.equal(undefined); + + expect(dataAssemblyController.communication.VTHEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VTHLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VTHAct).to.not.equal(undefined); + + expect(dataAssemblyController.communication.VTLEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VTLLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VTLAct).to.not.equal(undefined); + + expect(dataAssemblyController.communication.VWLEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VWLLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VWLAct).to.not.equal(undefined); + + expect(dataAssemblyController.communication.VALEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VALLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VALAct).to.not.equal(undefined); + }); + }); + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const anaMonMockup = new AnaMonMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = anaMonMockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new AnaMon(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.V.value).equal(0); + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(0); + expect(dataAssemblyController.communication.OSLevel.value).to.equal(0); + expect(dataAssemblyController.communication.VAHEn.value).to.equal(false); + expect(dataAssemblyController.communication.VAHLim.value).to.equal(0); + expect(dataAssemblyController.communication.VAHAct.value).to.equal(false); + expect(dataAssemblyController.communication.VWHEn.value).to.equal(false); + expect(dataAssemblyController.communication.VWHLim.value).to.equal(0); + expect(dataAssemblyController.communication.VWHAct.value).to.equal(false); + expect(dataAssemblyController.communication.VTHEn.value).to.equal(false); + expect(dataAssemblyController.communication.VTHLim.value).to.equal(0); + expect(dataAssemblyController.communication.VTHAct.value).to.equal(false); + expect(dataAssemblyController.communication.VTLEn.value).to.equal(false); + expect(dataAssemblyController.communication.VTLLim.value).to.equal(0); + expect(dataAssemblyController.communication.VTLAct.value).to.equal(false); + expect(dataAssemblyController.communication.VWLEn.value).to.equal(false); + expect(dataAssemblyController.communication.VWLLim.value).to.equal(0); + expect(dataAssemblyController.communication.VWLAct.value).to.equal(false); + expect(dataAssemblyController.communication.VALEn.value).to.equal(false); + expect(dataAssemblyController.communication.VALLim.value).to.equal(0); + expect(dataAssemblyController.communication.VALAct.value).to.equal(false); + }).timeout(4000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.ts similarity index 83% rename from src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.ts rename to src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.ts index 785b60af..304941c8 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaMon/AnaMon.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -24,11 +23,15 @@ * SOFTWARE. */ -import {AnaView, AnaViewRuntime} from './AnaView'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; +import {AnaView, AnaViewRuntime} from '../AnaView'; +import {OpcUaConnection} from '../../../../connection'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {LimitMonitoring, LimitMonitoringRuntime} from '../../_extensions/limitMonitoringDA/LimitMonitoring'; -import {OSLevel, OSLevelRuntime} from '../../_extensions/osLevelDA/OSLevel'; +import { + LimitMonitoring, + LimitMonitoringRuntime, + OSLevel, + OSLevelRuntime +} from '../../../baseFunction'; export type AnaMonRuntime = AnaViewRuntime & LimitMonitoringRuntime & OSLevelRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.mockup.spec.ts index de1257a0..e46a5e4a 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.mockup.spec.ts @@ -1,36 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; import {MockupServer} from '../../../../_utils'; -import {AnaViewMockup} from './AnaView.mockup'; - +import {AnaViewMockup, getAnaViewDataItemOptions, getAnaViewOptions} from './AnaView.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaViewRuntime} from './AnaView'; chai.use(chaiAsPromised); const expect = chai.expect; describe('AnaViewMockup', () => { - describe('', () => { - let mockupServer: any; + + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); - afterEach(async () => { - }); it('should create AnaViewMockup', async () => { - const mockup= new AnaViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new AnaViewMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + + it('static DataItemOptions', () => { + const options = getAnaViewDataItemOptions(1, 'Test') as AnaViewRuntime; + expect(Object.keys(options).length).to.equal(5); + }); + it('static DataAssemblyOptions', () => { + const options = getAnaViewOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(7); }); - it('getAnaViewMockupReferenceJSON()', () => { - const mockup = new AnaViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getAnaViewInstanceMockupJSON(); - expect(json).not.to.be.undefined; - //TODO: test more + + it('dynamic DataAssemblyOptions', () => { + const mockup = new AnaViewMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(7); }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.mockup.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.mockup.ts index 41174d3d..ccf3daba 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.mockup.ts @@ -23,51 +23,60 @@ * SOFTWARE. */ -import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import { - getScaleSettingDAMockupReferenceJSON, - ScaleSettingDAMockup -} from '../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../_extensions/unitDA/UnitDA.mockup'; +import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; +import {getScaleSettingsDataItemOptions, ScaleSettingMockup } from '../../baseFunction/scaleSettings/ScaleSetting.mockup'; +import {getUnitSettingsDataItemOptions, UnitSettingsMockup} from '../../baseFunction/unitSettings/UnitSettings.mockup'; +// eslint-disable-next-line no-undef +import Timeout = NodeJS.Timeout; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getIndicatorElementDataItemOptions, IndicatorElementMockup} from '../IndicatorElement.mockup'; +import {getDataAssemblyOptions} from '../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getAnaViewMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getWQCDAMockupReferenceJSON(namespace, objectBrowseName), - ...getScaleSettingDAMockupReferenceJSON(namespace, objectBrowseName, 'Float'), - ...getUnitDAMockupReferenceJSON(namespace, objectBrowseName), - V: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.V`, - dataType: 'Float' - } - } - ); +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView'; + +function getAnaViewSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + V: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.V`, + dataType: 'Float' + } as OpcUaNodeOptions + }); +} + + +export function getAnaViewDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getIndicatorElementDataItemOptions(namespace, objectBrowseName), + ...getScaleSettingsDataItemOptions(namespace, objectBrowseName, 'Ana'), + ...getUnitSettingsDataItemOptions(namespace, objectBrowseName), + ...getAnaViewSpecificDataItemOptions(namespace, objectBrowseName)}); +} + +export function getAnaViewOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getAnaViewDataItemOptions(namespace, objectBrowseName)}; + return options; } -export class AnaViewMockup { +export class AnaViewMockup extends IndicatorElementMockup{ - public readonly name: string; - protected v = 0; - public wqc: WQCDAMockup; - public scaleSettings: ScaleSettingDAMockup; - public unit: UnitDAMockup; - protected mockupNode: UAObject; + public v = 0; + public scaleSettings: ScaleSettingMockup<'Ana'>; + public unit: UnitSettingsMockup; + protected interval: Timeout | undefined; - constructor(namespace: Namespace, rootNode: UAObject, variableName: string, removeVariable?: boolean) { + constructor(namespace: Namespace, rootNode: UAObject, variableName: string, missingV?: boolean) { + super(namespace, rootNode, variableName); - this.name = variableName; - this.mockupNode = namespace.addObject({ - organizedBy: rootNode, - browseName: variableName - }); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); - this.scaleSettings = new ScaleSettingDAMockup(namespace, this.mockupNode, this.name, DataType.Double); - this.unit = new UnitDAMockup(namespace, this.mockupNode, this.name); - if(removeVariable == undefined || removeVariable){ + this.scaleSettings = new ScaleSettingMockup(namespace, this.mockupNode, this.name, 'Ana'); + this.unit = new UnitSettingsMockup(namespace, this.mockupNode, this.name); + + if((missingV == undefined || !missingV)){ namespace.addVariable({ componentOf: this.mockupNode, nodeId: `ns=${namespace.index};s=${variableName}.V`, @@ -82,9 +91,33 @@ export class AnaViewMockup { } } - public getAnaViewInstanceMockupJSON() { - return getAnaViewMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public startRandomOscillation(): void { + let time = 0; + const f1 = Math.random(); + const f2 = Math.random(); + const amplitude = this.scaleSettings.vSclMax - this.scaleSettings.vSclMin; + const average = (this.scaleSettings.vSclMax + this.scaleSettings.vSclMin) / 2; + this.interval = global.setInterval(() => { + time = time + 0.5; + this.v = average + 0.5 * amplitude * Math.sin(0.01 * (1 + f1) * time + Math.PI * f2); + }, 500); + } + + public stopRandomOscillation(): void { + if (this.interval) { + global.clearInterval(this.interval); + } + } + + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.scaleSettings.getDataItemOptions(), + ...this.unit.getDataItemOptions(), + ...getAnaViewSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.puml b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.puml index 0ae8a772..06fdb287 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.puml +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.puml @@ -1,8 +1,33 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include AnaMon.puml -!include ../../_extensions/scaleSettingsDA/ScaleSettings.puml -!include ../../_extensions/unitDA/UnitSettings.puml +!include AnaMon/AnaMon.puml +!include ../../_extensions/scaleSettings/ScaleSettings.puml +!include ../../_extensions/unit/UnitSettings.puml class AnaView{ + readonly communication!: AnaViewRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.spec.ts index b50a3c2b..a21d7f58 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.spec.ts @@ -28,34 +28,31 @@ import {OpcUaConnection} from '../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/anaview.json'; import {MockupServer} from '../../../../_utils'; -import {OperationElementMockup} from '../../operationElement/OperationElement.mockup'; -import {Namespace, UAObject} from 'node-opcua'; import {AnaView} from './AnaView'; -import {AnaViewMockup} from './AnaView.mockup'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; +import {AnaViewMockup, getAnaViewOptions} from './AnaView.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('AnaView', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getAnaViewOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create AnaView', async () => { - const da1: AnaView = new AnaView(dataAssemblyOptions, emptyOPCUAConnection); -+ expect(da1.communication.V).to.not.equal(undefined); - expect(da1.communication.WQC).to.not.equal(undefined); - expect(da1.communication.VSclMax).to.not.equal(undefined); - expect(da1.communication.VSclMin).to.not.equal(undefined); - expect(da1.communication.VUnit).to.not.equal(undefined); - expect(da1.tagName).to.equal('Variable'); - expect(da1.tagDescription).to.equal('Test'); + const dataAssemblyController: AnaView = new AnaView(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController.communication.V).to.not.equal(undefined); + expect(dataAssemblyController.communication.WQC).to.not.equal(undefined); + expect(dataAssemblyController.communication.VSclMax).to.not.equal(undefined); + expect(dataAssemblyController.communication.VSclMin).to.not.equal(undefined); + expect(dataAssemblyController.communication.VUnit).to.not.equal(undefined); + expect(dataAssemblyController.communication.TagName).to.not.equal(undefined); + expect(dataAssemblyController.communication.TagDescription).to.not.equal(undefined); }); }); @@ -64,15 +61,14 @@ describe('AnaView', () => { let connection: OpcUaConnection; beforeEach(async function () { - this.timeout(4000); + this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new AnaViewMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const anaViewMockup = new AnaViewMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = anaViewMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -83,22 +79,17 @@ describe('AnaView', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1: AnaView = new AnaView(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.V.value).equal(0); - expect(da1.communication.WQC.value).equal(0); - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(0); + + const dataAssemblyController: AnaView = new AnaView(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.V.value).equal(0); + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(0); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.ts index 3f9eb4aa..db22d68e 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -24,14 +23,13 @@ * SOFTWARE. */ -import {DataAssemblyOptions, ParameterInterface} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; -import {ScaleSettingsRuntime, UnitDataAssemblyRuntime} from '../../_extensions'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {DataItem, OpcUaConnection} from '../../../connection'; +import {ScaleSettings, ScaleSettingsRuntime, UnitSettingsRuntime, UnitSettings} from '../../baseFunction'; import {IndicatorElement, IndicatorElementRuntime} from '../IndicatorElement'; -import {ScaleSettings} from '../../_extensions/scaleSettingsDA/ScaleSettings'; -import {UnitSettings} from '../../_extensions/unitDA/UnitSettings'; -export type AnaViewRuntime = IndicatorElementRuntime & UnitDataAssemblyRuntime & ScaleSettingsRuntime & { - V: OpcUaDataItem; + +export type AnaViewRuntime = IndicatorElementRuntime & UnitSettingsRuntime & ScaleSettingsRuntime & { + V: DataItem; }; export class AnaView extends IndicatorElement { @@ -41,12 +39,12 @@ export class AnaView extends IndicatorElement { constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.V = this.createDataItem('V', 'read'); this.unitSettings = new UnitSettings(this); - this.scaleSettings = new ScaleSettings(this); + this.communication.V = this.createDataItem('V', 'number'); + this.defaultReadDataItem = this.communication.V; this.defaultReadDataItemType = 'number'; } diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.mockup.spec.ts deleted file mode 100644 index 26f63762..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.mockup.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {BinMonMockup} from './BinMon.mockup'; -import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('BinMonMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async function(){ - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - - it('should create BinMonMockup', () => { - const mockup= new BinMonMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - expect(mockup.wqc).to.not.be.undefined; - //TODO: test more? - }); - - it('getBinMonMockupReferenceJSON()', () => { - const mockup = new BinMonMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getBinMonInstanceMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(9); - //TODO: test more? - }); - }); - describe('dynamic (with MockupServer)', () => { - let mockupServer: MockupServer; - let mockup: BinMonMockup; - let connection: OpcUaConnection; - beforeEach(async function () { - this.timeout(5000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - mockup = new BinMonMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); - await connection.connect(); - }); - afterEach(async () => { - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('set VFlutTi', async () => { - await connection.writeOpcUaNode('Variable.VFlutTi', - namespaceUrl, - 1.1, 'Double'); - await connection.readOpcUaNode('Variable.VFlutTi', - namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1.1)); - }).timeout(5000); - - it('set VFlutCnt', async () => { - await connection.writeOpcUaNode('Variable.VFlutCnt', - namespaceUrl, - 1.1, 'Int32'); - await connection.readOpcUaNode('Variable.VFlutCnt', - namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); - }).timeout(5000); - - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.puml b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.puml deleted file mode 100644 index 9094824a..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.puml +++ /dev/null @@ -1,20 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -!include ../../_extensions/osLevelDA/OSLevel.puml - -class BinMon{ - + readonly communication!: BinMonRuntime; - + readonly osLevel: OSLevel; -} - - -BinMon *- BinMonSpec -BinMonSpec ..> BinMonMockup : <> -BinMon *- BinMonMockup -BinMon *- "1" BinMonRuntime -BinMon *- "1" OSLevel - - - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.spec.ts deleted file mode 100644 index d50983a2..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.spec.ts +++ /dev/null @@ -1,116 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../connection'; -import {BinMon} from './BinMon'; - -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/binmon.json'; -import {DataAssemblyControllerFactory} from '../../DataAssemblyControllerFactory'; -import {MockupServer} from '../../../../_utils'; -import {BinViewMockup} from './BinView.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {BinView} from './BinView'; -import {BinMonMockup} from './BinMon.mockup'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('BinMon', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinMon', - dataItems: baseDataAssemblyOptions - }; - - describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create BinMon', async () => { - const da1: BinMon = new BinMon(dataAssemblyOptions, emptyOPCUAConnection); - - expect(da1.tagName).to.equal('Variable'); - expect(da1.tagDescription).to.equal('Test'); - - expect(da1.communication.WQC).to.not.equal(undefined); - expect(da1.communication.V).to.not.equal(undefined); - expect(da1.communication.VState0).to.not.equal(undefined); - expect(da1.communication.VState1).to.not.equal(undefined); - expect(da1.communication.OSLevel).to.not.equal(undefined); - expect(da1.communication.VFlutEn).to.not.equal(undefined); - expect(da1.communication.VFlutTi).to.not.equal(undefined); - expect(da1.communication.VFlutCnt).to.not.equal(undefined); - expect(da1.communication.VFlutAct).to.not.equal(undefined); - }); - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockup = new BinMonMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1: BinMon = new BinMon(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - expect(da1.communication.V.value).equal(false); - expect(da1.communication.VState0.value).equal('state0_active'); - expect(da1.communication.VState1.value).equal('state1_active'); - - expect(da1.communication.VFlutEn.value).equal(false); - expect(da1.communication.VFlutAct.value).equal(false); - expect(da1.communication.VFlutTi.value).equal(0); - expect(da1.communication.VFlutCnt.value).equal(0); - }).timeout(4000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.mockup.spec.ts new file mode 100644 index 00000000..84288a75 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.mockup.spec.ts @@ -0,0 +1,115 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../../_utils'; +import {BinMonMockup, getBinMonDataItemOptions, getBinMonOptions} from './BinMon.mockup'; +import {OpcUaConnection} from '../../../../connection'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {BinMonRuntime} from './BinMon'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('BinMonMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async function(){ + this.timeout(5000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create BinMonMockup', () => { + const mockup= new BinMonMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + expect(mockup.wqc).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getBinMonDataItemOptions(1, 'Test') as BinMonRuntime; + expect(Object.keys(options).length).to.equal(9); + }); + + it('static DataAssemblyOptions', () => { + const options = getBinMonOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(11); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new BinMonMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(11); + }); + }); + + describe('dynamic (with MockupServer)', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(5000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + new BinMonMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('set VFlutTi', async () => { + await connection.writeNode('Variable.VFlutTi', + mockupServer.nameSpaceUri, + 1.1, 'Double'); + await connection.readNode('Variable.VFlutTi', + mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1.1)); + }).timeout(5000); + + it('set VFlutCnt', async () => { + await connection.writeNode('Variable.VFlutCnt', + mockupServer.nameSpaceUri, + 1.1, 'Int32'); + await connection.readNode('Variable.VFlutCnt', + mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }).timeout(5000); + + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.mockup.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.mockup.ts similarity index 55% rename from src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.mockup.ts rename to src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.mockup.ts index 234c230a..da50dd3f 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.mockup.ts @@ -24,51 +24,69 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {BinViewMockup, getBinViewMockupReferenceJSON} from './BinView.mockup'; +import {getOSLevelDataItemOptions, OSLevelMockup} from '../../../baseFunction/osLevel/OSLevel.mockup'; +import {BinViewMockup, getBinViewDataItemOptions} from '../BinView.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getBinMonMockupReferenceJSON(namespace: number, objectBrowseName: string) { - return ( - { - ...getOSLevelDAMockupReferenceJSON(namespace, objectBrowseName), - ...getBinViewMockupReferenceJSON(namespace,objectBrowseName), - VFlutEn: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VFlutEn`, - dataType: 'Boolean' - }, - VFlutTi: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VFlutTi`, - dataType: 'Float' - }, - VFlutCnt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VFlutCnt`, - dataType: 'Int16' - }, - VFlutAct: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VFlutAct`, - dataType: 'Boolean' - } - } +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinView/BinMon'; + +function getBinMonSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + VFlutEn: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VFlutEn`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VFlutTi: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VFlutTi`, + dataType: 'Float' + } as OpcUaNodeOptions, + VFlutCnt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VFlutCnt`, + dataType: 'Int16' + } as OpcUaNodeOptions, + VFlutAct: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VFlutAct`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} + +export function getBinMonDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getBinViewDataItemOptions(namespace, objectBrowseName), + ...getOSLevelDataItemOptions(namespace, objectBrowseName), + ...getBinMonSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getBinMonOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinMonDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class BinMonMockup extends BinViewMockup{ public vFlutEn = false; public vFlutTi = 0; public vFlutCnt = 0; public vFlutAct = false; - public osLevel: OSLevelDAMockup; + public osLevel: OSLevelMockup; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { super(namespace, rootNode, variableName); - this.osLevel = new OSLevelDAMockup(namespace, this.mockupNode, this.name); + this.osLevel = new OSLevelMockup(namespace, this.mockupNode, this.name); namespace.addVariable({ componentOf: this.mockupNode, @@ -105,7 +123,7 @@ export class BinMonMockup extends BinViewMockup{ dataType: DataType.Int32, value: { get: (): Variant => { - return new Variant({dataType: DataType.Double, value: this.vFlutCnt}); + return new Variant({dataType: DataType.Int32, value: this.vFlutCnt}); }, set: (variant: Variant): StatusCodes => { this.vFlutCnt = parseInt(variant.value,10); @@ -127,9 +145,15 @@ export class BinMonMockup extends BinViewMockup{ }); } - public getBinMonInstanceMockupJSON() { - return getBinMonMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.osLevel.getDataItemOptions(), + ...getBinMonSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.puml b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.puml new file mode 100644 index 00000000..86ce334c --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.puml @@ -0,0 +1,45 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +!include ../../_extensions/osLevel/OSLevel.puml + +class BinMon{ + + readonly communication!: BinMonRuntime; + + readonly osLevel: OSLevel; +} + + +BinMon *- BinMonSpec +BinMonSpec ..> BinMonMockup : <> +BinMon *- BinMonMockup +BinMon *- "1" BinMonRuntime +BinMon *- "1" OSLevel + + + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.spec.ts new file mode 100644 index 00000000..0c613e55 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.spec.ts @@ -0,0 +1,104 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../connection'; +import {BinMon} from './BinMon'; + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MockupServer} from '../../../../../_utils'; +import {BinMonMockup, getBinMonOptions} from './BinMon.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('BinMon', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getBinMonOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create BinMon', async () => { + const dataAssemblyController: BinMon = new BinMon(dataAssemblyOptions, emptyOPCUAConnection); + + expect(dataAssemblyController.communication.TagName).to.not.equal(undefined); + expect(dataAssemblyController.communication.TagDescription).to.not.equal(undefined); + + expect(dataAssemblyController.communication.WQC).to.not.equal(undefined); + expect(dataAssemblyController.communication.V).to.not.equal(undefined); + expect(dataAssemblyController.communication.VState0).to.not.equal(undefined); + expect(dataAssemblyController.communication.VState1).to.not.equal(undefined); + expect(dataAssemblyController.communication.OSLevel).to.not.equal(undefined); + expect(dataAssemblyController.communication.VFlutEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VFlutTi).to.not.equal(undefined); + expect(dataAssemblyController.communication.VFlutCnt).to.not.equal(undefined); + expect(dataAssemblyController.communication.VFlutAct).to.not.equal(undefined); + }); + }); + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const binMonMockup = new BinMonMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = binMonMockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController: BinMon = new BinMon(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect(dataAssemblyController.communication.V.value).equal(false); + expect(dataAssemblyController.communication.VState0.value).equal('state0_active'); + expect(dataAssemblyController.communication.VState1.value).equal('state1_active'); + + expect(dataAssemblyController.communication.VFlutEn.value).equal(false); + expect(dataAssemblyController.communication.VFlutAct.value).equal(false); + expect(dataAssemblyController.communication.VFlutTi.value).equal(0); + expect(dataAssemblyController.communication.VFlutCnt.value).equal(0); + }).timeout(4000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.ts similarity index 75% rename from src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.ts rename to src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.ts index ea680a47..bdee6965 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinMon/BinMon.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,15 +24,15 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; -import {BinView, BinViewRuntime} from './BinView'; -import {OSLevel, OSLevelRuntime} from '../../_extensions/osLevelDA/OSLevel'; +import {OpcUaConnection, DataItem} from '../../../../connection'; +import {BinView, BinViewRuntime} from '../BinView'; +import {OSLevel, OSLevelRuntime} from '../../../baseFunction'; export type BinMonRuntime = BinViewRuntime & OSLevelRuntime & { - VFlutTi: OpcUaDataItem; - VFlutEn: OpcUaDataItem; - VFlutCnt: OpcUaDataItem; - VFlutAct: OpcUaDataItem; + VFlutTi: DataItem; + VFlutEn: DataItem; + VFlutCnt: DataItem; + VFlutAct: DataItem; }; export class BinMon extends BinView { @@ -47,9 +46,9 @@ export class BinMon extends BinView { this.osLevel = new OSLevel(this); - this.communication.VFlutTi = this.createDataItem('VFlutTi', 'read', 'number'); - this.communication.VFlutEn = this.createDataItem('VFlutEn', 'write', 'boolean'); - this.communication.VFlutCnt = this.createDataItem('VFlutCnt', 'read', 'number'); - this.communication.VFlutAct = this.createDataItem('VFlutAct', 'read', 'boolean'); + this.communication.VFlutTi = this.createDataItem('VFlutTi', 'number'); + this.communication.VFlutEn = this.createDataItem('VFlutEn', 'boolean', 'write'); + this.communication.VFlutCnt = this.createDataItem('VFlutCnt', 'number'); + this.communication.VFlutAct = this.createDataItem('VFlutAct', 'boolean'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.mockup.spec.ts index f6109244..7d6025af 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.mockup.spec.ts @@ -1,52 +1,88 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; import {MockupServer} from '../../../../_utils'; -import {BinViewMockup} from './BinView.mockup'; +import {BinViewMockup, getBinViewDataItemOptions, getBinViewOptions} from './BinView.mockup'; import {OpcUaConnection} from '../../../connection'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; - +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {BinViewRuntime} from './BinView'; chai.use(chaiAsPromised); const expect = chai.expect; describe('BinViewMockup', () => { - describe('', () => { - let mockupServer: any; + + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create BinViewMockup', async () => { - const mockup= new BinViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new BinViewMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + it('static DataItemOptions', () => { + const options = getBinViewDataItemOptions(1, 'Test') as BinViewRuntime; + expect(Object.keys(options).length).to.equal(4); }); - it('getBinViewMockupReferenceJSON()', () => { - const mockup = new BinViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getBinViewInstanceMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(4); - //TODO: test more + + it('static DataAssemblyOptions', () => { + const options = getBinViewOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(6); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new BinViewMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(6); }); }); + describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: BinViewMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new BinViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new BinViewMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); afterEach(async () => { @@ -55,15 +91,15 @@ describe('BinViewMockup', () => { }); it('set and get VState0', async () => { - await connection.writeOpcUaNode('Variable.VState0', namespaceUrl, 'state0_inactive', 'String'); - await connection.readOpcUaNode('Variable.VState0', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal('state0_inactive')); + await connection.writeNode('Variable.VState0', mockupServer.nameSpaceUri, 'state0_inactive', 'String'); + await connection.readNode('Variable.VState0', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal('state0_inactive')); }).timeout(3000); it('set and get VState1', async () => { - await connection.writeOpcUaNode('Variable.VState1', namespaceUrl, 'state1_inactive', 'String'); - await connection.readOpcUaNode('Variable.VState1', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal('state1_inactive')); + await connection.writeNode('Variable.VState1', mockupServer.nameSpaceUri, 'state1_inactive', 'String'); + await connection.readNode('Variable.VState1', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal('state1_inactive')); }).timeout(3000); //TODO get the rest diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.mockup.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.mockup.ts index 63756bc0..193b9e30 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.mockup.ts @@ -24,35 +24,50 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import {IndicatorElement} from '../IndicatorElement'; -import {getIndicatorElementMockupReferenceJSON, IndicatorElementMockup} from '../IndicatorElement.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {getIndicatorElementDataItemOptions, IndicatorElementMockup} from '../IndicatorElement.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../DataAssemblyController.mockup'; -export function getBinViewMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getIndicatorElementMockupReferenceJSON(namespace, objectBrowseName), - V: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.V`, - dataType: 'Boolean' - }, - VState0: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VState0`, - dataType: 'String' - }, - VState1: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VState1`, - dataType: 'String' - } - } +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinView'; + +function getBinViewSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + V: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.V`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VState0: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VState0`, + dataType: 'String' + } as OpcUaNodeOptions, + VState1: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VState1`, + dataType: 'String' + } as OpcUaNodeOptions + }); +} + +export function getBinViewDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getIndicatorElementDataItemOptions(namespace, objectBrowseName), + ...getBinViewSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getBinViewOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinViewDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class BinViewMockup extends IndicatorElementMockup{ protected v = false; @@ -106,9 +121,13 @@ export class BinViewMockup extends IndicatorElementMockup{ }); } - public getBinViewInstanceMockupJSON() { - return getBinViewMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinViewSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.puml b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.puml index 6c7f5f84..4cef8fce 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.puml +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.puml @@ -1,6 +1,31 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include BinMon.puml +!include BinMon/BinMon.puml class BinView{ + readonly communication!: BinViewRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.spec.ts index b340b542..bf1b8453 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.spec.ts @@ -28,34 +28,27 @@ import {BinView} from './BinView'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/binview.json'; -import {DataAssemblyControllerFactory} from '../../DataAssemblyControllerFactory'; import {MockupServer} from '../../../../_utils'; -import {AnaViewMockup} from '../AnaView/AnaView.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {AnaView} from '../AnaView/AnaView'; -import {BinViewMockup} from './BinView.mockup'; +import {BinViewMockup, getBinViewOptions} from './BinView.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('BinView', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinView', - dataItems: baseDataAssemblyOptions - }; + + const dataAssemblyOptions: DataAssemblyOptions = getBinViewOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + const emptyOPCUAConnection = new OpcUaConnection(); it('should create BinView', async () => { - const da1: BinView = new BinView(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1.tagName).to.equal('Variable'); - expect(da1.tagDescription).to.equal('Test'); - expect(da1.communication.WQC).to.not.equal(undefined); - expect(da1.communication.V).to.not.equal(undefined); - expect(da1.communication.VState0).to.not.equal(undefined); - expect(da1.communication.VState1).to.not.equal(undefined); + const dataAssemblyController: BinView = new BinView(dataAssemblyOptions, emptyOPCUAConnection); + + expect(dataAssemblyController.communication.TagName).to.not.equal(undefined); + expect(dataAssemblyController.communication.TagDescription).to.not.equal(undefined); + expect(dataAssemblyController.communication.WQC).to.not.equal(undefined); + expect(dataAssemblyController.communication.V).to.not.equal(undefined); + expect(dataAssemblyController.communication.VState0).to.not.equal(undefined); + expect(dataAssemblyController.communication.VState1).to.not.equal(undefined); }); }); @@ -67,12 +60,10 @@ describe('BinView', () => { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new BinViewMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + new BinViewMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -83,21 +74,16 @@ describe('BinView', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1: BinView = new BinView(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - expect(da1.communication.V.value).equal(false); - expect(da1.communication.VState0.value).equal('state0_active'); - expect(da1.communication.VState1.value).equal('state1_active'); + + const dataAssemblyController: BinView = new BinView(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect(dataAssemblyController.communication.V.value).equal(false); + expect(dataAssemblyController.communication.VState0.value).equal('state0_active'); + expect(dataAssemblyController.communication.VState1.value).equal('state1_active'); }).timeout(4000); }); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.ts index bd623b9b..4e36dcae 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/BinView/BinView.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,13 +24,13 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; +import {OpcUaConnection, DataItem} from '../../../connection'; import {IndicatorElement, IndicatorElementRuntime} from '../IndicatorElement'; export type BinViewRuntime = IndicatorElementRuntime & { - V: OpcUaDataItem; - VState0: OpcUaDataItem; - VState1: OpcUaDataItem; + V: DataItem; + VState0: DataItem; + VState1: DataItem; }; export class BinView extends IndicatorElement { @@ -39,9 +38,9 @@ export class BinView extends IndicatorElement { constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.V = this.createDataItem('V', 'read', 'boolean'); - this.communication.VState0 = this.createDataItem('VState0', 'read', 'string'); - this.communication.VState1 = this.createDataItem('VState1', 'read', 'string'); + this.communication.V = this.createDataItem('V', 'boolean'); + this.communication.VState0 = this.createDataItem('VState0', 'string'); + this.communication.VState1 = this.createDataItem('VState1', 'string'); this.defaultReadDataItem = this.communication.V; this.defaultReadDataItemType = 'boolean'; diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.mockup.spec.ts deleted file mode 100644 index 3cb77642..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.mockup.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../_utils'; -import {DIntMonMockup} from './DIntMon.mockup'; - - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('DIntMonMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - afterEach(async () => { - - }); - it('should create DIntMonMockup', async () => { - const mockup= new DIntMonMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - //TODO: test more - - }); - it('getDIntMonMockupReferenceJSON()', () => { - const mockup = new DIntMonMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getDIntMonInstanceMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(24); - //TODO: test more - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.mockup.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.mockup.ts deleted file mode 100644 index 5ef1908c..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.mockup.ts +++ /dev/null @@ -1,101 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import { - getScaleSettingDAMockupReferenceJSON, - ScaleSettingDAMockup -} from '../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../_extensions/unitDA/UnitDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../_extensions/osLevelDA/OSLevelDA.mockup'; -import { - getLimitMonitoringDAMockupReferenceJSON, - LimitMonitoringDAMockup -} from '../../_extensions/limitMonitoringDA/LimitMonitoringDA.mockup'; - -export function getDIntMonMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getWQCDAMockupReferenceJSON(namespace, objectBrowseName), - ...getScaleSettingDAMockupReferenceJSON(namespace, objectBrowseName, 'Int32'), - ...getUnitDAMockupReferenceJSON(namespace, objectBrowseName), - ...getOSLevelDAMockupReferenceJSON(namespace, objectBrowseName), - ...getLimitMonitoringDAMockupReferenceJSON(namespace, objectBrowseName), - V: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.V`, - dataType: 'Int32' - } - } - ); -} - -export class DIntMonMockup { - - public readonly name: string; - protected v = 0; - public wqc: WQCDAMockup; - public scaleSettings: ScaleSettingDAMockup; - public unit: UnitDAMockup; - public osLevel: OSLevelDAMockup; - public limitMonitoring: LimitMonitoringDAMockup; - protected mockupNode: UAObject; - - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - - this.name = variableName; - - this.mockupNode = namespace.addObject({ - organizedBy: rootNode, - browseName: variableName - }); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); - this.scaleSettings = new ScaleSettingDAMockup(namespace, this.mockupNode, this.name, DataType.Int32); - this.unit = new UnitDAMockup(namespace, this.mockupNode, this.name); - this.osLevel = new OSLevelDAMockup(namespace, this.mockupNode, this.name); - this.limitMonitoring = new LimitMonitoringDAMockup(namespace, this.mockupNode, this.name, DataType.Int32); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.V`, - browseName: `${variableName}.V`, - dataType: DataType.Int32, - value: { - get: (): Variant => { - return new Variant({dataType: DataType.Int32, value: this.v}); - }, - }, - }); - } - - public getDIntMonInstanceMockupJSON() { - return getDIntMonMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); - } -} diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.puml b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.puml deleted file mode 100644 index 0d7b0183..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class DIntMon{ - + communication!: AnaMonRuntime - + readonly osLevel: OSLevel -} -DIntMon *- DIntMonSpec -DIntMonSpec ..> DIntMonMockup : <> -DIntMon *- DIntMonMockup - -DIntMon *-- "1" AnaMonRuntime -DIntMon *-- "1" OSLevel -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.spec.ts deleted file mode 100644 index 5fc9250a..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.spec.ts +++ /dev/null @@ -1,159 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../connection'; -import {DIntMon} from './DIntMon'; - -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/anamon.json'; -import {DataAssemblyControllerFactory} from '../../DataAssemblyControllerFactory'; -import {MockupServer} from '../../../../_utils'; -import {AnaMonMockup} from '../AnaView/AnaMon.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {AnaMon} from '../AnaView/AnaMon'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('DIntMon', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/DIntMon', - dataItems: baseDataAssemblyOptions - }; - describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create DIntMon', async () => { - const da1: DIntMon= new DIntMon(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1 instanceof DIntMon).to.equal(true); - - expect(da1.tagName).to.equal('Variable'); - expect(da1.tagDescription).to.equal('Test'); - - expect(da1.communication.V).to.not.equal(undefined); - expect(da1.communication.WQC).to.not.equal(undefined); - expect(da1.communication.VSclMax).to.not.equal(undefined); - expect(da1.communication.VSclMin).to.not.equal(undefined); - expect(da1.communication.VUnit).to.not.equal(undefined); - - expect(da1.communication.OSLevel).to.not.equal(undefined); - expect(da1.communication.VAHEn).to.not.equal(undefined); - expect(da1.communication.VAHLim).to.not.equal(undefined); - expect(da1.communication.VAHAct).to.not.equal(undefined); - - expect(da1.communication.VWHEn).to.not.equal(undefined); - expect(da1.communication.VWHLim).to.not.equal(undefined); - expect(da1.communication.VWHAct).to.not.equal(undefined); - - expect(da1.communication.VTHEn).to.not.equal(undefined); - expect(da1.communication.VTHLim).to.not.equal(undefined); - expect(da1.communication.VTHAct).to.not.equal(undefined); - - expect(da1.communication.VTLEn).to.not.equal(undefined); - expect(da1.communication.VTLLim).to.not.equal(undefined); - expect(da1.communication.VTLAct).to.not.equal(undefined); - - expect(da1.communication.VWLEn).to.not.equal(undefined); - expect(da1.communication.VWLLim).to.not.equal(undefined); - expect(da1.communication.VWLAct).to.not.equal(undefined); - - expect(da1.communication.VALEn).to.not.equal(undefined); - expect(da1.communication.VALLim).to.not.equal(undefined); - expect(da1.communication.VALAct).to.not.equal(undefined); - }); - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockup = new AnaMonMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - - const da1 = new DIntMon(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.V.value).equal(0); - expect(da1.communication.WQC.value).equal(0); - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(0); - - expect(da1.communication.OSLevel.value).to.equal(0); - expect(da1.communication.VAHEn.value).to.equal(false); - expect(da1.communication.VAHLim.value).to.equal(0); - expect(da1.communication.VAHAct.value).to.equal(false); - - expect(da1.communication.VWHEn.value).to.equal(false); - expect(da1.communication.VWHLim.value).to.equal(0); - expect(da1.communication.VWHAct.value).to.equal(false); - - expect(da1.communication.VTHEn.value).to.equal(false); - expect(da1.communication.VTHLim.value).to.equal(0); - expect(da1.communication.VTHAct.value).to.equal(false); - - expect(da1.communication.VTLEn.value).to.equal(false); - expect(da1.communication.VTLLim.value).to.equal(0); - expect(da1.communication.VTLAct.value).to.equal(false); - - expect(da1.communication.VWLEn.value).to.equal(false); - expect(da1.communication.VWLLim.value).to.equal(0); - expect(da1.communication.VWLAct.value).to.equal(false); - - expect(da1.communication.VALEn.value).to.equal(false); - expect(da1.communication.VALLim.value).to.equal(0); - expect(da1.communication.VALAct.value).to.equal(false); - - }).timeout(4000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.ts deleted file mode 100644 index 632b4f88..00000000 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* tslint:disable:max-classes-per-file */ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {DIntView} from './DIntView'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection} from '../../../connection'; -import {AnaMonRuntime} from '../AnaView/AnaMon'; -import {OSLevel} from '../../_extensions/osLevelDA/OSLevel'; - -export class DIntMon extends DIntView { - public communication!: AnaMonRuntime; - public readonly osLevel: OSLevel; - - constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { - super(options, connection); - - this.osLevel = new OSLevel(this); - - - this.communication.VAHEn = this.createDataItem('VAHEn', 'read'); - this.communication.VAHLim = this.createDataItem('VAHLim', 'write'); - this.communication.VAHAct = this.createDataItem('VAHAct', 'read'); - this.communication.VWHEn = this.createDataItem('VWHEn', 'read'); - this.communication.VWHLim = this.createDataItem('VWHLim', 'write'); - this.communication.VWHAct = this.createDataItem('VWHAct', 'read'); - this.communication.VTHEn = this.createDataItem('VTHEn', 'read'); - this.communication.VTHLim = this.createDataItem('VTHLim', 'write'); - this.communication.VTHAct = this.createDataItem('VTHAct', 'read'); - this.communication.VALEn = this.createDataItem('VALEn', 'read'); - this.communication.VALLim = this.createDataItem('VALLim', 'write'); - this.communication.VALAct = this.createDataItem('VALAct', 'read'); - this.communication.VWLEn = this.createDataItem('VWLEn', 'read'); - this.communication.VWLLim = this.createDataItem('VWLLim', 'write'); - this.communication.VWLAct = this.createDataItem('VWLAct', 'read'); - this.communication.VTLEn = this.createDataItem('VTLEn', 'read'); - this.communication.VTLLim = this.createDataItem('VTLLim', 'write'); - this.communication.VTLAct = this.createDataItem('VTLAct', 'read'); - } - - -} diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.mockup.spec.ts new file mode 100644 index 00000000..8f4f8477 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.mockup.spec.ts @@ -0,0 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../../_utils'; +import {DIntMonMockup, getDIntMonDataItemOptions, getDIntMonOptions} from './DIntMon.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaMonRuntime} from '../../AnaView/AnaMon/AnaMon'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('DIntMonMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create DIntMonMockup', async () => { + const mockup= new DIntMonMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getDIntMonDataItemOptions(1, 'Test') as AnaMonRuntime; + expect(Object.keys(options).length).to.equal(24); + }); + + it('static DataAssemblyOptions', () => { + const options = getDIntMonOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(26); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new DIntMonMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(26); + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.mockup.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.mockup.ts new file mode 100644 index 00000000..5c2017ab --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.mockup.ts @@ -0,0 +1,79 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {Namespace, UAObject} from 'node-opcua'; +import {getOSLevelDataItemOptions, OSLevelMockup} from '../../../baseFunction/osLevel/OSLevel.mockup'; +import { + getLimitMonitoringDataItemOptions, + LimitMonitoringMockup +} from '../../../baseFunction/limitMonitoring/LimitMonitoring.mockup'; +import {DIntViewMockup, getDIntViewDataItemOptions} from '../DIntView.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/DIntView/DIntMon'; + +export function getDIntMonDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getDIntViewDataItemOptions(namespace, objectBrowseName), + ...getOSLevelDataItemOptions(namespace, objectBrowseName), + ...getLimitMonitoringDataItemOptions(namespace, objectBrowseName, 'DInt'), + } as OpcUaNodeOptions + ); +} + +export function getDIntMonOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getDIntMonDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class DIntMonMockup extends DIntViewMockup{ + + public osLevel: OSLevelMockup; + public limitMonitoring: LimitMonitoringMockup<'DInt'>; + + constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); + + this.osLevel = new OSLevelMockup(namespace, this.mockupNode, this.name); + this.limitMonitoring = new LimitMonitoringMockup(namespace, this.mockupNode, this.name, 'DInt'); + } + + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.osLevel.getDataItemOptions(), + ...this.limitMonitoring.getDataItemOptions() + }; + return options; + } +} diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.puml b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.puml new file mode 100644 index 00000000..12034bf8 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.puml @@ -0,0 +1,39 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +class DIntMon{ + + communication!: AnaMonRuntime + + readonly osLevel: OSLevel +} +DIntMon *- DIntMonSpec +DIntMonSpec ..> DIntMonMockup : <> +DIntMon *- DIntMonMockup + +DIntMon *-- "1" AnaMonRuntime +DIntMon *-- "1" OSLevel +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.spec.ts new file mode 100644 index 00000000..4e3e7ec3 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.spec.ts @@ -0,0 +1,147 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../connection'; +import {DIntMon} from './DIntMon'; + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {MockupServer} from '../../../../../_utils'; +import {DIntMonMockup, getDIntMonOptions} from './DIntMon.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('DIntMon', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getDIntMonOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create DIntMon', async () => { + const dataAssemblyController: DIntMon = new DIntMon(dataAssemblyOptions, emptyOPCUAConnection); + + expect(dataAssemblyController.tagName).to.not.equal(undefined); + expect(dataAssemblyController.tagDescription).to.not.equal(undefined); + + expect(dataAssemblyController.communication.V).to.not.equal(undefined); + expect(dataAssemblyController.communication.WQC).to.not.equal(undefined); + expect(dataAssemblyController.communication.VSclMax).to.not.equal(undefined); + expect(dataAssemblyController.communication.VSclMin).to.not.equal(undefined); + expect(dataAssemblyController.communication.VUnit).to.not.equal(undefined); + + expect(dataAssemblyController.communication.OSLevel).to.not.equal(undefined); + expect(dataAssemblyController.communication.VAHEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VAHLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VAHAct).to.not.equal(undefined); + + expect(dataAssemblyController.communication.VWHEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VWHLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VWHAct).to.not.equal(undefined); + + expect(dataAssemblyController.communication.VTHEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VTHLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VTHAct).to.not.equal(undefined); + + expect(dataAssemblyController.communication.VTLEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VTLLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VTLAct).to.not.equal(undefined); + + expect(dataAssemblyController.communication.VWLEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VWLLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VWLAct).to.not.equal(undefined); + + expect(dataAssemblyController.communication.VALEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.VALLim).to.not.equal(undefined); + expect(dataAssemblyController.communication.VALAct).to.not.equal(undefined); + }); + }); + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const dIntMonMockup = new DIntMonMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = dIntMonMockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new DIntMon(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.V.value).equal(0); + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(0); + + expect(dataAssemblyController.communication.OSLevel.value).to.equal(0); + expect(dataAssemblyController.communication.VAHEn.value).to.equal(false); + expect(dataAssemblyController.communication.VAHLim.value).to.equal(0); + expect(dataAssemblyController.communication.VAHAct.value).to.equal(false); + + expect(dataAssemblyController.communication.VWHEn.value).to.equal(false); + expect(dataAssemblyController.communication.VWHLim.value).to.equal(0); + expect(dataAssemblyController.communication.VWHAct.value).to.equal(false); + + expect(dataAssemblyController.communication.VTHEn.value).to.equal(false); + expect(dataAssemblyController.communication.VTHLim.value).to.equal(0); + expect(dataAssemblyController.communication.VTHAct.value).to.equal(false); + + expect(dataAssemblyController.communication.VTLEn.value).to.equal(false); + expect(dataAssemblyController.communication.VTLLim.value).to.equal(0); + expect(dataAssemblyController.communication.VTLAct.value).to.equal(false); + + expect(dataAssemblyController.communication.VWLEn.value).to.equal(false); + expect(dataAssemblyController.communication.VWLLim.value).to.equal(0); + expect(dataAssemblyController.communication.VWLAct.value).to.equal(false); + + expect(dataAssemblyController.communication.VALEn.value).to.equal(false); + expect(dataAssemblyController.communication.VALLim.value).to.equal(0); + expect(dataAssemblyController.communication.VALAct.value).to.equal(false); + + }).timeout(4000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.ts new file mode 100644 index 00000000..b6f9c40d --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntMon/DIntMon.ts @@ -0,0 +1,45 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {DIntView} from '../DIntView'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaConnection} from '../../../../connection'; +import {AnaMonRuntime} from '../../AnaView/AnaMon/AnaMon'; +import {LimitMonitoring, OSLevel} from '../../../baseFunction'; + +export class DIntMon extends DIntView { + + public communication!: AnaMonRuntime; + public limitMonitoring: LimitMonitoring; + public readonly osLevel: OSLevel; + + constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { + super(options, connection); + + this.osLevel = new OSLevel(this); + + this.limitMonitoring = new LimitMonitoring(this); + } +} diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.mockup.spec.ts index 9cd89de1..8603bc8a 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.mockup.spec.ts @@ -1,37 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; import {MockupServer} from '../../../../_utils'; -import {DIntViewMockup} from './DIntView.mockup'; - +import {DIntViewMockup, getDIntViewDataItemOptions, getDIntViewOptions} from './DIntView.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaViewRuntime} from '../AnaView/AnaView'; chai.use(chaiAsPromised); const expect = chai.expect; describe('DIntViewMockup', () => { - describe('', () => { - let mockupServer: any; + + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); - afterEach(async () => { - }); it('should create DIntViewMockup', async () => { - const mockup= new DIntViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new DIntViewMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + + it('static DataItemOptions', () => { + const options = getDIntViewDataItemOptions(1, 'Test') as AnaViewRuntime; + expect(Object.keys(options).length).to.equal(5); + }); + it('static DataAssemblyOptions', () => { + const options = getDIntViewOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(7); }); - it('getDIntViewMockupReferenceJSON()', () => { - const mockup = new DIntViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getDIntViewInstanceMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(5); - //TODO: test more + + it('dynamic DataAssemblyOptions', () => { + const mockup = new DIntViewMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(7); }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.mockup.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.mockup.ts index e885ef32..3e9f03e5 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.mockup.ts @@ -24,50 +24,58 @@ */ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; import { - getScaleSettingDAMockupReferenceJSON, - ScaleSettingDAMockup -} from '../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../_extensions/unitDA/UnitDA.mockup'; + getScaleSettingsDataItemOptions, + ScaleSettingMockup +} from '../../baseFunction/scaleSettings/ScaleSetting.mockup'; +import {getUnitSettingsDataItemOptions, UnitSettingsMockup} from '../../baseFunction/unitSettings/UnitSettings.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../DataAssemblyController.mockup'; +import {getIndicatorElementDataItemOptions, IndicatorElementMockup} from '../IndicatorElement.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getDIntViewMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getWQCDAMockupReferenceJSON(namespace, objectBrowseName), - ...getScaleSettingDAMockupReferenceJSON(namespace, objectBrowseName, 'Int32'), - ...getUnitDAMockupReferenceJSON(namespace, objectBrowseName), - V: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.V`, - dataType: 'Int32' - } - } +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/DIntView'; + +function getDIntViewSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + V: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.V`, + dataType: 'Int32' + } as OpcUaNodeOptions + }); +} + +export function getDIntViewDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getIndicatorElementDataItemOptions(namespace, objectBrowseName), + ...getScaleSettingsDataItemOptions(namespace, objectBrowseName, 'DInt'), + ...getUnitSettingsDataItemOptions(namespace, objectBrowseName), + ...getDIntViewSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } -export class DIntViewMockup { +export function getDIntViewOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getDIntViewDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class DIntViewMockup extends IndicatorElementMockup{ - public readonly name: string; protected v = 0; - public wqc: WQCDAMockup; - public scaleSettings: ScaleSettingDAMockup; - public unit: UnitDAMockup; - protected mockupNode: UAObject; + public scaleSettings: ScaleSettingMockup<'DInt'>; + public unit: UnitSettingsMockup; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); - this.name = variableName; - - this.mockupNode = namespace.addObject({ - organizedBy: rootNode, - browseName: variableName - }); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); - this.scaleSettings = new ScaleSettingDAMockup(namespace, this.mockupNode, this.name, DataType.Int32); - this.unit = new UnitDAMockup(namespace, this.mockupNode, this.name); + this.scaleSettings = new ScaleSettingMockup(namespace, this.mockupNode, this.name, 'DInt'); + this.unit = new UnitSettingsMockup(namespace, this.mockupNode, this.name); namespace.addVariable({ componentOf: this.mockupNode, @@ -82,9 +90,15 @@ export class DIntViewMockup { }); } - public getDIntViewInstanceMockupJSON() { - return getDIntViewMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.scaleSettings.getDataItemOptions(), + ...this.unit.getDataItemOptions(), + ...getDIntViewSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.puml b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.puml index f0d08f03..19b2f441 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.puml +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.puml @@ -1,8 +1,32 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include DIntMon.puml +!include DIntMon/DIntMon.puml class DIntView{ - + readonly communication!: AnaViewRuntime - readonly scaleSettings: ScaleSettings - readonly unitSettings: UnitSettings } diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.spec.ts index 6e5efa46..bf1623af 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.spec.ts @@ -29,41 +29,30 @@ import {DIntView} from './DIntView'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/dintview.json'; -import {DataAssemblyControllerFactory} from '../../DataAssemblyControllerFactory'; import {MockupServer} from '../../../../_utils'; -import {BinViewMockup} from '../BinView/BinView.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {BinView} from '../BinView/BinView'; -import {DIntViewMockup} from './DIntView.mockup'; +import {DIntViewMockup, getDIntViewOptions} from './DIntView.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('DIntView', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/DIntView', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getDIntViewOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create DIntView', async () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/DIntView', - dataItems: baseDataAssemblyOptions - }; - const da1: DIntView = new DIntView(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1 instanceof DIntView).to.equal(true); - expect(da1.tagName).to.equal('Variable'); - expect(da1.tagDescription).to.equal('Test'); - expect(da1.communication.V).to.not.equal(undefined); - expect(da1.communication.WQC).to.not.equal(undefined); - expect(da1.communication.VSclMax).to.not.equal(undefined); - expect(da1.communication.VSclMin).to.not.equal(undefined); - expect(da1.communication.VUnit).to.not.equal(undefined); + const dataAssemblyController: DIntView = new DIntView(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController.communication.TagName).to.not.equal(undefined); + expect(dataAssemblyController.communication.TagDescription).to.not.equal(undefined); + expect(dataAssemblyController.communication.V).to.not.equal(undefined); + expect(dataAssemblyController.communication.WQC).to.not.equal(undefined); + expect(dataAssemblyController.communication.VSclMax).to.not.equal(undefined); + expect(dataAssemblyController.communication.VSclMin).to.not.equal(undefined); + expect(dataAssemblyController.communication.VUnit).to.not.equal(undefined); }); }); @@ -75,12 +64,11 @@ describe('DIntView', () => { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new DIntViewMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const dIntViewMockup = new DIntViewMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + dataAssemblyOptions = dIntViewMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -91,23 +79,17 @@ describe('DIntView', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1: DIntView = new DIntView(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - expect(da1.communication.V.value).equal(0); - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VSclMax.value).equal(0); - expect(da1.communication.VSclMin.value).equal(0); + const dataAssemblyController: DIntView = new DIntView(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect(dataAssemblyController.communication.V.value).equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(0); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.ts index f82911eb..4056950b 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/DIntView/DIntView.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -24,12 +23,11 @@ * SOFTWARE. */ -import {DataAssemblyOptions, ParameterInterface} from '@p2olab/polaris-interface'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; import {OpcUaConnection} from '../../../connection'; import {AnaViewRuntime} from '../AnaView/AnaView'; import {IndicatorElement} from '../IndicatorElement'; -import {UnitSettings} from '../../_extensions/unitDA/UnitSettings'; -import {ScaleSettings} from '../../_extensions/scaleSettingsDA/ScaleSettings'; +import {ScaleSettings, UnitSettings} from '../../baseFunction'; export class DIntView extends IndicatorElement { @@ -39,12 +37,12 @@ export class DIntView extends IndicatorElement { constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.V = this.createDataItem('V', 'read'); this.unitSettings = new UnitSettings(this); - this.scaleSettings = new ScaleSettings(this); + this.communication.V = this.createDataItem('V', 'number'); + this.defaultReadDataItem = this.communication.V; this.defaultReadDataItemType = 'number'; } diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.mockup.spec.ts index d6979cb3..e74ae562 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.mockup.spec.ts @@ -1,35 +1,72 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {IndicatorElementMockup} from './IndicatorElement.mockup'; +import {getIndicatorElementDataItemOptions, getIndicatorElementOptions, IndicatorElementMockup} from './IndicatorElement.mockup'; import {MockupServer} from '../../../_utils'; - +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {IndicatorElementRuntime} from './IndicatorElement'; chai.use(chaiAsPromised); const expect = chai.expect; describe('IndicatorElementMockup', () => { - describe('', () => { - let mockupServer: any; + + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create IndicatorElementMockup', async () => { - const mockup= new IndicatorElementMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new IndicatorElementMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; expect(mockup.wqc).to.not.be.undefined; }); - it('getIndicatorElementMockupReferenceJSON()', () => { - const mockup = new IndicatorElementMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getIndicatorElementInstanceMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(1); - //TODO: test more + it('static DataItemOptions', () => { + const options = getIndicatorElementDataItemOptions(1, 'Test') as IndicatorElementRuntime; + expect(Object.keys(options).length).to.equal(1); + }); + + it('static DataAssemblyOptions', () => { + const options = getIndicatorElementOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(3); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new IndicatorElementMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(3); }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.mockup.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.mockup.ts index 6420b022..22cce9b5 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.mockup.ts @@ -24,32 +24,42 @@ */ import {Namespace, UAObject} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../_extensions/wqcDA/WQCDA.mockup'; -import {catPEAMockup} from '../../../../logging'; -import {DataAssemblyControllerMockup} from '../DataAssemblyController.mockup'; - -export function getIndicatorElementMockupReferenceJSON(namespace: number, objectBrowseName: string) { - return ( - { - ...getWQCDAMockupReferenceJSON(namespace, objectBrowseName) - } - ); +import {getWQCDataItemOptions, WQCMockup} from '../baseFunction/wqc/WQC.mockup'; +import {DataAssemblyControllerMockup, getDataAssemblyOptions} from '../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement'; + +export function getIndicatorElementDataItemOptions(namespace: number, objectBrowseName: string): object { + return getWQCDataItemOptions(namespace, objectBrowseName); +} + +export function getIndicatorElementOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getIndicatorElementDataItemOptions(namespace, objectBrowseName)}; + return options; } export class IndicatorElementMockup extends DataAssemblyControllerMockup{ - public wqc: WQCDAMockup; + public wqc: WQCMockup; constructor(namespace: Namespace, rootNode: UAObject, variableName: string){ super(namespace, rootNode, variableName); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); + this.wqc = new WQCMockup(namespace, this.mockupNode, this.name); } - - public getIndicatorElementInstanceMockupJSON() { - return getIndicatorElementMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.wqc.getDataItemOptions() + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.puml b/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.puml index dd9d5023..f5b0d234 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.puml +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include AnaView/AnaView.puml diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.spec.ts index 83a94b24..4f830dc4 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.spec.ts @@ -27,72 +27,42 @@ import {OpcUaConnection} from '../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../tests/anaview.json'; -import * as baseDataAssemblyOptionsStatic from '../../../../../tests/binmon_static.json'; - import {IndicatorElement} from './IndicatorElement'; import {MockupServer} from '../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../tests/namespaceUrl'; -import {IndicatorElementMockup} from './IndicatorElement.mockup'; -import {AnaViewMockup} from './AnaView/AnaView.mockup'; -import {AnaView} from './AnaView/AnaView'; +import {getIndicatorElementOptions, IndicatorElementMockup} from './IndicatorElement.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('IndicatorElement', () => { + let dataAssemblyOptions: DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create IndicatorElement, static WQC', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinMon', - dataItems: baseDataAssemblyOptionsStatic - }; - const da1 = new IndicatorElement(dataAssemblyOptions, emptyOPCUAConnection) ; - expect(da1.communication.WQC).to.equal(undefined); - expect(da1.wqc.WQC).to.equal(0); - }); - it('should create IndicatorElement, dynamic WQC', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinMon', - dataItems: baseDataAssemblyOptions - }; - const da1 = new IndicatorElement(dataAssemblyOptions, emptyOPCUAConnection) ; - expect(da1.communication.WQC).to.not.be.undefined; - expect(da1.wqc.WQC).to.be.undefined; + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getIndicatorElementOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create IndicatorElement', () => { + const dataAssemblyController = new IndicatorElement(dataAssemblyOptions, emptyOPCUAConnection) ; + expect(dataAssemblyController.communication.WQC).to.not.be.undefined; + expect(dataAssemblyController.wqc.WQC).to.equal(0); }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinMon', - dataItems: baseDataAssemblyOptions - }; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } + beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new IndicatorElementMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - + const indicatorElementMockup = new IndicatorElementMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = indicatorElementMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -103,11 +73,13 @@ describe('IndicatorElement', () => { }); it('should subscribe successfully', async () => { - const da1 = new IndicatorElement(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); + + const dataAssemblyController = new IndicatorElement(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.ts index 20a0b843..a480b22d 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/IndicatorElement.ts @@ -24,12 +24,12 @@ */ import {DataAssemblyOptions, ParameterInterface} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../connection'; -import {WQCRuntime} from '../_extensions'; +import {OpcUaConnection} from '../../connection'; +import {WQCRuntime} from '../baseFunction'; import { BaseDataAssemblyRuntime, DataAssemblyController } from '../DataAssemblyController'; -import {WQC} from '../_extensions/wqcDA/WQC'; +import {WQC} from '../baseFunction'; export type IndicatorElementRuntime = BaseDataAssemblyRuntime & WQCRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.mockup.spec.ts index aeb64941..de80dbda 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.mockup.spec.ts @@ -1,37 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; import {MockupServer} from '../../../../_utils'; -import {StringViewMockup} from './StringView.mockup'; - +import {getStringViewDataItemOptions, getStringViewOptions, StringViewMockup} from './StringView.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {StringViewRuntime} from './StringView'; chai.use(chaiAsPromised); const expect = chai.expect; describe('StringViewMockup', () => { - describe('', () => { - let mockupServer: any; + + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); - afterEach(async () => { - }); it('should create StringViewMockup', async () => { - const mockup= new StringViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new StringViewMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + + it('static DataItemOptions', () => { + const options = getStringViewDataItemOptions(1, 'Test') as StringViewRuntime; + expect(Object.keys(options).length).to.equal(2); + }); + it('static DataAssemblyOptions', () => { + const options = getStringViewOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(4); }); - it('getStringViewMockupReferenceJSON()', () => { - const mockup = new StringViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getStringViewInstanceMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(2); - //TODO: test more + + it('dynamic DataAssemblyOptions', () => { + const mockup = new StringViewMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(4); }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.mockup.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.mockup.ts index 40866967..f258260f 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.mockup.ts @@ -24,43 +24,50 @@ */ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; +import {getIndicatorElementDataItemOptions, IndicatorElementMockup} from '../IndicatorElement.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../DataAssemblyController.mockup'; -export function getStringViewMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getWQCDAMockupReferenceJSON(namespace, objectBrowseName), - Text: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Text`, - dataType: 'String' - } - } - ); +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/StringView'; + +function getStringViewSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + Text: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Text`, + dataType: 'String' + } as OpcUaNodeOptions + }); } -export class StringViewMockup { +export function getStringViewDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getIndicatorElementDataItemOptions(namespace, objectBrowseName), + ...getStringViewSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions + ); +} - public readonly name: string; - protected text = 'dummyText'; - public wqc: WQCDAMockup; - protected mockupNode: UAObject; +export function getStringViewOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getStringViewDataItemOptions(namespace, objectBrowseName)}; + return options; +} - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { +export class StringViewMockup extends IndicatorElementMockup { - this.name = variableName; + public text = 'dummyText'; - this.mockupNode = namespace.addObject({ - organizedBy: rootNode, - browseName: variableName - }); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); + constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); namespace.addVariable({ componentOf: this.mockupNode, - nodeId: `ns=1;s=${variableName}.Text`, + nodeId: `ns=${namespace.index};s=${variableName}.Text`, browseName: `${variableName}.Text`, dataType: DataType.String, value: { @@ -71,9 +78,13 @@ export class StringViewMockup { }); } - public getStringViewInstanceMockupJSON() { - return getStringViewMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getStringViewSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.puml b/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.puml index f0b8dbdc..85bdc806 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.puml +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.puml @@ -1,14 +1,39 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram class StringView{ - + readonly communication!: StrRuntime + + readonly communication!: StringViewRuntime + Text(): string | undefined } StringView *- StringViewSpec StringViewSpec ..> StringViewMockup : <> StringView *- StringViewMockup -StringView *- "1" StrRuntime +StringView *- "1" StringViewRuntime @enduml diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.spec.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.spec.ts index b6d4a21c..f7c676fd 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.spec.ts @@ -28,34 +28,28 @@ import {StringView} from './StringView'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/stringview.json'; -import {DataAssemblyControllerFactory} from '../../DataAssemblyControllerFactory'; import {MockupServer} from '../../../../_utils'; -import {DIntViewMockup} from '../DIntView/DIntView.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {DIntView} from '../DIntView/DIntView'; -import {StringViewMockup} from './StringView.mockup'; +import {getStringViewOptions, StringViewMockup} from './StringView.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('StringView', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/IndicatorElement/StringView', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getStringViewOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create StringView', async () => { - const da1: StringView = new StringView(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1.tagName).to.equal('Variable'); - expect(da1.tagDescription).to.equal('Test'); - expect(da1.communication.WQC).to.not.equal(undefined); - expect(da1.communication.Text).to.not.equal(undefined); + const dataAssemblyController: StringView = new StringView(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController.communication.TagName).to.not.equal(undefined); + expect(dataAssemblyController.communication.TagDescription).to.not.equal(undefined); + expect(dataAssemblyController.communication.WQC).to.not.equal(undefined); + expect(dataAssemblyController.communication.Text).to.not.equal(undefined); }); }); describe('dynamic', () => { @@ -63,22 +57,14 @@ describe('StringView', () => { let connection: OpcUaConnection; beforeEach(async function () { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new StringViewMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const stringViewMockup = new StringViewMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = stringViewMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -89,19 +75,21 @@ describe('StringView', () => { }); it('should subscribe successfully', async () => { - const da1: StringView = new StringView(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - expect(da1.communication.Text.value).equal('dummyText'); + const dataAssemblyController: StringView = new StringView(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect(dataAssemblyController.communication.Text.value).equal('dummyText'); }).timeout(4000); + it('get Text', async () => { - const da1: StringView = new StringView(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.Text).to.equal('dummyText'); + const dataAssemblyController: StringView = new StringView(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + expect(dataAssemblyController.Text).to.equal('dummyText'); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.ts index c6356e98..9e80bd8e 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/StringView/StringView.ts @@ -24,20 +24,20 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; +import {OpcUaConnection, DataItem} from '../../../connection'; import {IndicatorElement, IndicatorElementRuntime} from '../IndicatorElement'; -export type StrRuntime = IndicatorElementRuntime & { - Text: OpcUaDataItem; +export type StringViewRuntime = IndicatorElementRuntime & { + Text: DataItem; }; export class StringView extends IndicatorElement { - public readonly communication!: StrRuntime; + public readonly communication!: StringViewRuntime; constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.Text = this.createDataItem('Text', 'read', 'string'); + this.communication.Text = this.createDataItem('Text', 'string'); this.defaultReadDataItem = this.communication.Text; this.defaultReadDataItemType = 'string'; diff --git a/src/modularPlantManager/pea/dataAssembly/indicatorElement/index.ts b/src/modularPlantManager/pea/dataAssembly/indicatorElement/index.ts index 54d5ed23..9fbb3e56 100644 --- a/src/modularPlantManager/pea/dataAssembly/indicatorElement/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/indicatorElement/index.ts @@ -1,9 +1,33 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './IndicatorElement'; - -export * from './AnaView/AnaMon'; +export * from './AnaView/AnaMon/AnaMon'; export * from './AnaView/AnaView'; -export * from './BinView/BinMon'; +export * from './BinView/BinMon/BinMon'; export * from './BinView/BinView'; -export * from './DIntView/DIntMon'; +export * from './DIntView/DIntMon/DIntMon'; export * from './DIntView/DIntView'; export * from './StringView/StringView'; diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.mockup.spec.ts index c9d1b2d1..cc53fbe0 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.mockup.spec.ts @@ -1,33 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {InputElementMockup} from './InputElement.mockup'; +import {getInputElementDataItemOptions, getInputElementOptions, InputElementMockup} from './InputElement.mockup'; import {MockupServer} from '../../../_utils'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {InputElementRuntime} from './InputElement'; chai.use(chaiAsPromised); const expect = chai.expect; describe('InputElementMockup', () => { - describe('', () => { - let mockupServer: any; + + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create InputElementMockup', async () => { - const mockup= new InputElementMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new InputElementMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; expect(mockup.wqc).to.not.be.undefined; }); - it('getInputElementMockupReferenceJSON()', () => { - const mockup = new InputElementMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getInputElementInstanceMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(1); - //TODO: test more + + it('static DataItemOptions', () => { + const options = getInputElementDataItemOptions(1, 'Test') as InputElementRuntime; + expect(Object.keys(options).length).to.equal(1); + }); + + it('static DataAssemblyOptions', () => { + const options = getInputElementOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(3); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new InputElementMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(3); }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.mockup.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.mockup.ts index 1f02489c..33b05348 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.mockup.ts @@ -24,32 +24,42 @@ */ import {Namespace, UAObject} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../_extensions/wqcDA/WQCDA.mockup'; -import {DataAssemblyControllerMockup} from '../DataAssemblyController.mockup'; - -export function getInputElementMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getWQCDAMockupReferenceJSON(namespace, objectBrowseName) - } - ); +import {getWQCDataItemOptions, WQCMockup} from '../baseFunction/wqc/WQC.mockup'; +import {DataAssemblyControllerMockup, getDataAssemblyOptions} from '../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/InputElement'; + +export function getInputElementDataItemOptions(namespace: number, objectBrowseName: string): object { + return getWQCDataItemOptions(namespace, objectBrowseName); +} + +export function getInputElementOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getInputElementDataItemOptions(namespace, objectBrowseName)}; + return options; } export class InputElementMockup extends DataAssemblyControllerMockup{ - public readonly wqc: WQCDAMockup; + public readonly wqc: WQCMockup; constructor(namespace: Namespace, rootNode: UAObject, variableName: string){ super(namespace, rootNode, variableName); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); + this.wqc = new WQCMockup(namespace, this.mockupNode, this.name); } - public getInputElementInstanceMockupJSON() { - return getInputElementMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.wqc.getDataItemOptions() + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.puml b/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.puml index 1100f163..a6060829 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.puml +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include processValueIn/AnaProcessValueIn/AnaProcessValueIn.puml diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.spec.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.spec.ts index 501293f6..6ebae0eb 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.spec.ts @@ -27,64 +27,47 @@ import {OpcUaConnection} from '../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../tests/binprocessvaluein.json'; import {MockupServer} from '../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../tests/namespaceUrl'; -import {InputElementMockup} from './InputElement.mockup'; -import {InputElement} from './InputElement'; +import {getInputElementOptions, InputElementMockup} from './InputElement.mockup'; +import {InputElement} from './'; import {DataAssemblyControllerFactory} from '../DataAssemblyControllerFactory'; -import {OSLevel, WQC} from '../_extensions'; -import {ActiveElementMockup} from '../activeElement/ActiveElement.mockup'; +import {WQC} from '../baseFunction'; chai.use(chaiAsPromised); const expect = chai.expect; describe('InputElement', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getInputElementOptions(2, 'Variable') as DataAssemblyOptions; + it('should create InputElement', async () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/InputElement/BinProcessValueIn', - dataItems: baseDataAssemblyOptions - }; - //TODO: problem with circular dependencies, new InputElement() does not work - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as InputElement; - //const da1 = new InputElement(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.be.not.undefined; - expect(da1.communication).to.be.not.undefined; - expect(da1.wqc).to.be.not.undefined; + const dataAssemblyController = new InputElement(dataAssemblyOptions, emptyOPCUAConnection); + + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.communication).to.be.not.undefined; + expect(dataAssemblyController.wqc).to.be.not.undefined; }); }); describe('dynamic', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/InputElement/', - dataItems: baseDataAssemblyOptions - }; let mockupServer: MockupServer; let connection: OpcUaConnection; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } + beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new InputElementMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - + const inputElementMockup = new InputElementMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = inputElementMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -95,15 +78,14 @@ describe('InputElement', () => { }); it('should subscribe successfully', async () => { - //TODO: problem with circular dependencies, new InputElement() does not work - //const da1 = new InputElement(dataAssemblyOptions, connection); - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as InputElement; - new WQC(da1); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); + + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as InputElement; + new WQC(dataAssemblyController); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); }).timeout(4000); - //TODO toJSON }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.ts index c23eb193..9ffa3bf8 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/InputElement.ts @@ -25,23 +25,20 @@ import { DataAssemblyOptions, - InputElementOptions, - ParameterInterface, - ParameterOptions + ParameterInterface, ParameterOptions, } from '@p2olab/polaris-interface'; -import {DataItem, OpcUaConnection} from '../../connection'; -import {PEAController} from '../../PEAController'; -import {WQCRuntime} from '../_extensions'; +import {DataItem, DynamicDataItem, OpcUaConnection} from '../../connection'; +import {WQC, WQCRuntime} from '../baseFunction'; import {BaseDataAssemblyRuntime, DataAssemblyController} from '../DataAssemblyController'; import {catDataAssembly} from '../../../../logging'; -import {WQC} from '../_extensions/wqcDA/WQC'; -import {Parameter} from '../../../recipe'; +import {PEAController} from '../../PEAController'; +import {ParameterRequest} from '../ParameterRequest'; export type InputElementRuntime = WQCRuntime & BaseDataAssemblyRuntime ; export class InputElement extends DataAssemblyController { public readonly communication!: InputElementRuntime; - public parameterRequest: Parameter | undefined; + public parameterRequest: ParameterRequest | undefined; public requestedValue = ''; wqc: WQC; @@ -58,10 +55,10 @@ export class InputElement extends DataAssemblyController { */ public async setParameter(paramValue: string | number | boolean, variable?: string): Promise { const dataItem: DataItem | undefined = (variable) ? - //this.communication[variable as keyof InputElementOptions] : this.defaultWriteDataItem; + //this.communication[variable as keyof InputElementRuntime] : this.defaultWriteDataItem; (this.communication as any)[variable] : this.defaultWriteDataItem; catDataAssembly.debug(`Set Parameter: ${this.name} (${variable}) -> ${JSON.stringify(paramValue)}`); - await dataItem?.write(paramValue); + await (dataItem as DynamicDataItem)?.write(paramValue); } public async setValue(p: ParameterOptions, peas: PEAController[]): Promise { @@ -77,13 +74,13 @@ export class InputElement extends DataAssemblyController { } } - this.parameterRequest = new Parameter(p, peas); + this.parameterRequest = new ParameterRequest(p, peas); const value = this.parameterRequest.getValue(); catDataAssembly.trace(`calculated value: ${value}`); await this.setParameter(+value); - if (this.parameterRequest.options.continuous) { + if (this.parameterRequest.continuous) { catDataAssembly.trace('Continuous parameter change'); this.parameterRequest.listenToScopeArray() .on('changed', (data) => this.setParameter(data)); diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/index.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/index.ts index 2b7fa283..631a0097 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/index.ts @@ -1,2 +1,27 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './InputElement'; export * from './processValueIn'; diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.mockup.spec.ts index 90ad0494..47f965f2 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.mockup.spec.ts @@ -1,51 +1,87 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {AnaProcessValueInMockup} from './AnaProcessValueIn.mockup'; +import {AnaProcessValueInMockup, getAnaProcessValueInDataItemOptions, getAnaProcessValueInOptions} from './AnaProcessValueIn.mockup'; import {MockupServer} from '../../../../../_utils'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; -import {getVlvMockupReferenceJSON} from '../../../activeElement/vlv/Vlv.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaProcessValueInRuntime} from './AnaProcessValueIn'; chai.use(chaiAsPromised); const expect = chai.expect; describe('AnaProcessValueInMockup', () => { + describe('static', () => { - let mockupServer: any; + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); + it('should create AnaProcessValueInMockup', async () => { - const mockup= new AnaProcessValueInMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new AnaProcessValueInMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + it('static DataItemOptions', () => { + const options = getAnaProcessValueInDataItemOptions(1, 'Test') as AnaProcessValueInRuntime; + expect(Object.keys(options).length).to.equal(5); }); - it('getAnaProcessValueInMockupReferenceJSON()', () => { - const mockup = new AnaProcessValueInMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getAnaProcessValueInInstanceMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(5); - //TODO: test more + + it('static DataAssemblyOptions', () => { + const options = getAnaProcessValueInOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(7); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new AnaProcessValueInMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(7); }); }); + describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: AnaProcessValueInMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new AnaProcessValueInMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new AnaProcessValueInMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -55,21 +91,20 @@ describe('AnaProcessValueInMockup', () => { }); it('set and get VExt, >VSclMax', async () => { - await connection.writeOpcUaNode('Variable.VExt', namespaceUrl, 1.1, 'Double'); - await connection.readOpcUaNode('Variable.VExt', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(0)); + await connection.writeNode('Variable.VExt', mockupServer.nameSpaceUri, 1.1, 'Double'); + await connection.readNode('Variable.VExt', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(0)); }).timeout(3000); it('set and get VExt, { - await connection.writeOpcUaNode('Variable.VExt', namespaceUrl, -1.1, 'Double'); - await connection.readOpcUaNode('Variable.VExt', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(0)); + await connection.writeNode('Variable.VExt', mockupServer.nameSpaceUri, -1.1, 'Double'); + await connection.readNode('Variable.VExt', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(0)); }).timeout(3000); it('set and get VExt', async () => { - await connection.writeOpcUaNode('Variable.VExt', namespaceUrl, 0, 'Double'); - await connection.readOpcUaNode('Variable.VExt', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(0)); + await connection.writeNode('Variable.VExt', mockupServer.nameSpaceUri, 0, 'Double'); + await connection.readNode('Variable.VExt', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(0)); }).timeout(3000); - //TODO get the rest }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.mockup.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.mockup.ts index df96385b..6e94b336 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.mockup.ts @@ -24,38 +24,54 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getScaleSettingDAMockupReferenceJSON, ScaleSettingDAMockup} from '../../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../../_extensions/unitDA/UnitDA.mockup'; -import {getInputElementMockupReferenceJSON, InputElementMockup} from '../../InputElement.mockup'; +import {getScaleSettingsDataItemOptions, ScaleSettingMockup} from '../../../baseFunction/scaleSettings/ScaleSetting.mockup'; +import {getUnitSettingsDataItemOptions, UnitSettingsMockup} from '../../../baseFunction/unitSettings/UnitSettings.mockup'; +import {getInputElementDataItemOptions, InputElementMockup} from '../../InputElement.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; -export function getAnaProcessValueInMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getInputElementMockupReferenceJSON(namespace, objectBrowseName), - ...getScaleSettingDAMockupReferenceJSON(namespace, objectBrowseName, 'Float'), - ...getUnitDAMockupReferenceJSON(namespace, objectBrowseName), - VExt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VExt`, - dataType: 'Float' - } - } +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/InputElement/AnaProcessValueIn'; + +function getAnaProcessValueInSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + VExt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VExt`, + dataType: 'Float' + } as OpcUaNodeOptions + }); +} + +export function getAnaProcessValueInDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getInputElementDataItemOptions(namespace, objectBrowseName), + ...getScaleSettingsDataItemOptions(namespace, objectBrowseName, 'Ana'), + ...getUnitSettingsDataItemOptions(namespace, objectBrowseName), + ...getAnaProcessValueInSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getAnaProcessValueInOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getAnaProcessValueInDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class AnaProcessValueInMockup extends InputElementMockup{ - public scaleSettings: ScaleSettingDAMockup; - public unit: UnitDAMockup; + public scaleSettings: ScaleSettingMockup<'Ana'>; + public unit: UnitSettingsMockup; public vExt = 0; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { super(namespace, rootNode, variableName); - this.scaleSettings = new ScaleSettingDAMockup(namespace, this.mockupNode, this.name, DataType.Double); - this.unit = new UnitDAMockup(namespace, this.mockupNode, this.name); + this.scaleSettings = new ScaleSettingMockup(namespace, this.mockupNode, this.name, 'Ana'); + this.unit = new UnitSettingsMockup(namespace, this.mockupNode, this.name); namespace.addVariable({ componentOf: this.mockupNode, @@ -81,9 +97,15 @@ export class AnaProcessValueInMockup extends InputElementMockup{ } - public getAnaProcessValueInInstanceMockupJSON() { - return getAnaProcessValueInMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.scaleSettings.getDataItemOptions(), + ...this.unit.getDataItemOptions(), + ...getAnaProcessValueInSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.puml b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.puml index 0f83724f..756d2a67 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.puml +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.puml @@ -1,7 +1,32 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include ../../../_extensions/scaleSettingsDA/ScaleSettings.puml -!include ../../../_extensions/unitDA/UnitSettings.puml +!include ../../../_extensions/scaleSettings/ScaleSettings.puml +!include ../../../_extensions/unit/UnitSettings.puml class AnaProcessValueIn{ + readonly communication!: AnaProcessValueInRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.spec.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.spec.ts index edab506c..939765ce 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.spec.ts @@ -29,52 +29,47 @@ import {AnaProcessValueIn} from './AnaProcessValueIn'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/anaprocessvaluein.json'; import {MockupServer} from '../../../../../_utils'; -import {AnaManMockup} from '../../../operationElement/man/anaMan/AnaMan.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; -import {AnaProcessValueInMockup} from './AnaProcessValueIn.mockup'; +import {AnaProcessValueInMockup, getAnaProcessValueInOptions} from './AnaProcessValueIn.mockup'; import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; chai.use(chaiAsPromised); const expect = chai.expect; describe('AnaProcessValueIn', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/InputElement/AnaProcessValueIn', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getAnaProcessValueInOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create AnaProcessValueIn', async () => { - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as AnaProcessValueIn; - expect(da1).to.be.not.undefined; - expect(da1.communication.VExt).to.be.not.undefined; - expect(da1.communication.VSclMax).to.be.not.undefined; - expect(da1.communication.VSclMin).to.be.not.undefined; - expect(da1.communication.VUnit).to.be.not.undefined; + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as AnaProcessValueIn; + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.communication.VExt).to.be.not.undefined; + expect(dataAssemblyController.communication.VSclMax).to.be.not.undefined; + expect(dataAssemblyController.communication.VSclMin).to.be.not.undefined; + expect(dataAssemblyController.communication.VUnit).to.be.not.undefined; }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: AnaProcessValueInMockup; + let anaProcessValueInMockup: AnaProcessValueInMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new AnaProcessValueInMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - mockup.scaleSettings.vSclMax= 1; + anaProcessValueInMockup = new AnaProcessValueInMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + anaProcessValueInMockup.scaleSettings.vSclMax= 1; + dataAssemblyOptions = anaProcessValueInMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -85,52 +80,31 @@ describe('AnaProcessValueIn', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as AnaProcessValueIn; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.VExt.value).equal(0); - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(1); + + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as AnaProcessValueIn; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.VExt.value).equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(1); }).timeout(4000); it('setparameter', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as AnaProcessValueIn; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - await da1.setParameter(1,'VExt'); - expect(mockup.vExt).equal(1); - //TODO: problem= we have to wait for the variable to change (EventEmitter), maybe this is not optimal - await new Promise(f => setTimeout(f, 1000)); - expect(da1.communication.VExt.value).equal(1); - }).timeout(4000); + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as AnaProcessValueIn; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); - it('setValue', async () => { - // TODO - }).timeout(4000); + await dataAssemblyController.setParameter(1,'VExt'); + expect(anaProcessValueInMockup.vExt).equal(1); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + expect(dataAssemblyController.communication.VExt.value).equal(1); - it('tojson', async () => { - // TODO }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.ts index 7c87eb38..61124b1c 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,16 +24,12 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; -import {ScaleSettingsRuntime, UnitDataAssemblyRuntime} from '../../../_extensions'; -import { - InputElement, InputElementRuntime, -} from '../../InputElement'; -import {ScaleSettings} from '../../../_extensions/scaleSettingsDA/ScaleSettings'; -import {UnitSettings} from '../../../_extensions/unitDA/UnitSettings'; +import {OpcUaConnection, DataItem} from '../../../../connection'; +import {ScaleSettings, ScaleSettingsRuntime, UnitSettingsRuntime, UnitSettings} from '../../../baseFunction'; +import {InputElement, InputElementRuntime} from '../../'; -export type AnaProcessValueInRuntime = InputElementRuntime & UnitDataAssemblyRuntime & ScaleSettingsRuntime & { - VExt: OpcUaDataItem; +export type AnaProcessValueInRuntime = InputElementRuntime & UnitSettingsRuntime & ScaleSettingsRuntime & { + VExt: DataItem; }; export class AnaProcessValueIn extends InputElement { @@ -44,7 +39,9 @@ export class AnaProcessValueIn extends InputElement { constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.VExt = this.createDataItem('VExt', 'read', 'number'); + this.communication.VExt = this.createDataItem('VExt', 'number', 'write'); + + // TODO: These should be writable therefore new Object required this.unitSettings = new UnitSettings(this); this.scaleSettings = new ScaleSettings(this); diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.mockup.spec.ts index 459a51fd..63be5e77 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.mockup.spec.ts @@ -1,54 +1,88 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {BinProcessValueInMockup} from './BinProcessValueIn.mockup'; +import {BinProcessValueInMockup, getBinProcessValueInDataItemOptions, getBinProcessValueInOptions} from './BinProcessValueIn.mockup'; import {MockupServer} from '../../../../../_utils'; -import {AnaProcessValueInMockup} from '../AnaProcessValueIn/AnaProcessValueIn.mockup'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {BinProcessValueInRuntime} from './BinProcessValueIn'; chai.use(chaiAsPromised); const expect = chai.expect; describe('BinProcessValueInMockup', () => { + describe('static', () => { - let mockupServer: any; + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); - afterEach(async () => { - }); it('should create BinProcessValueInMockup', () => { - const mockup= new BinProcessValueInMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new BinProcessValueInMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + it('static DataItemOptions', () => { + const options = getBinProcessValueInDataItemOptions(1, 'Test') as BinProcessValueInRuntime; + expect(Object.keys(options).length).to.equal(4); }); - it('getBinProcessValueInMockupReferenceJSON()', () => { - const mockup = new BinProcessValueInMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getBinProcessValueInInstanceMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(4); - //TODO: test more + + it('static DataAssemblyOptions', () => { + const options = getBinProcessValueInOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(6); }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new BinProcessValueInMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(6); + }); + }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: BinProcessValueInMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new BinProcessValueInMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new BinProcessValueInMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -58,23 +92,21 @@ describe('BinProcessValueInMockup', () => { }); it('set and get VExt', async () => { - await connection.writeOpcUaNode('Variable.VExt', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.VExt', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(true)); + await connection.writeNode('Variable.VExt', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.VExt', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(true)); }).timeout(3000); it('set and get VState0', async () => { - await connection.writeOpcUaNode('Variable.VState0', namespaceUrl, 'state0_inactive', 'String'); - await connection.readOpcUaNode('Variable.VState0', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal('state0_inactive')); + await connection.writeNode('Variable.VState0', mockupServer.nameSpaceUri, 'state0_inactive', 'String'); + await connection.readNode('Variable.VState0', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal('state0_inactive')); }).timeout(3000); it('set and get VState1', async () => { - await connection.writeOpcUaNode('Variable.VState1', namespaceUrl, 'state1_inactive', 'String'); - await connection.readOpcUaNode('Variable.VState1', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal('state1_inactive')); + await connection.writeNode('Variable.VState1', mockupServer.nameSpaceUri, 'state1_inactive', 'String'); + await connection.readNode('Variable.VState1', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal('state1_inactive')); }).timeout(3000); - - //TODO get the rest }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.mockup.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.mockup.ts index b3d5b7ea..9da6170e 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.mockup.ts @@ -24,34 +24,51 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getInputElementMockupReferenceJSON, InputElementMockup} from '../../InputElement.mockup'; +import {getInputElementDataItemOptions, InputElementMockup} from '../../InputElement.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getBinProcessValueInMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getInputElementMockupReferenceJSON(namespace, objectBrowseName), - VExt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VExt`, - dataType: 'Boolean' - }, - VState0: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VState0`, - dataType: 'String' - }, - VState1: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VState1`, - dataType: 'String' - } - } +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/InputElement/BinProcessValueIn'; + +function getBinProcessValueInSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + VExt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VExt`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VState0: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VState0`, + dataType: 'String' + } as OpcUaNodeOptions, + VState1: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VState1`, + dataType: 'String' + } as OpcUaNodeOptions + }); +} + +export function getBinProcessValueInDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getInputElementDataItemOptions(namespace, objectBrowseName), + ...getBinProcessValueInSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getBinProcessValueInOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getInputElementDataItemOptions(namespace, objectBrowseName), + ...getBinProcessValueInDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class BinProcessValueInMockup extends InputElementMockup{ public vExt = false; @@ -108,9 +125,13 @@ export class BinProcessValueInMockup extends InputElementMockup{ }); } - public getBinProcessValueInInstanceMockupJSON() { - return getBinProcessValueInMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinProcessValueInSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.puml b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.puml index f4387f91..75eb3ec6 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.puml +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.spec.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.spec.ts index 538a856e..5b0680ed 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.spec.ts @@ -26,13 +26,10 @@ import {OpcUaConnection} from '../../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {PEAMockup} from '../../../../PEA.mockup'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/binprocessvaluein.json'; import {MockupServer} from '../../../../../_utils'; -import {BinProcessValueInMockup} from '../BinProcessValueIn/BinProcessValueIn.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {BinProcessValueInMockup, getBinProcessValueInOptions} from './BinProcessValueIn.mockup'; + import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; import {BinProcessValueIn} from './BinProcessValueIn'; @@ -40,47 +37,39 @@ chai.use(chaiAsPromised); const expect = chai.expect; describe('BinProcessValueIn', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/InputElement/BinProcessValueIn', - dataItems: baseDataAssemblyOptions - }; - - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getBinProcessValueInOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create BinProcessValueIn', () => { - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as BinProcessValueIn; + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as BinProcessValueIn; - expect(da1).to.be.not.undefined; - expect(da1.communication.VExt).to.be.not.undefined; - expect(da1.communication.VState0).to.be.not.undefined; - expect(da1.communication.VState1).to.be.not.undefined; + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.communication.VExt).to.be.not.undefined; + expect(dataAssemblyController.communication.VState0).to.be.not.undefined; + expect(dataAssemblyController.communication.VState1).to.be.not.undefined; }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: BinProcessValueInMockup; + let binProcessValueInMockup: BinProcessValueInMockup; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new BinProcessValueInMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + binProcessValueInMockup = new BinProcessValueInMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + dataAssemblyOptions = binProcessValueInMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } }); afterEach(async function () { @@ -90,40 +79,33 @@ describe('BinProcessValueIn', () => { }); it('should subscribe successfully', async () => { - const da1 = new BinProcessValueIn(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.VExt.value).equal(false); - expect(da1.communication.VState0.value).equal('state0_active'); - expect(da1.communication.VState1.value).equal('state1_active'); - }).timeout(4000); + const dataAssemblyController = new BinProcessValueIn(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); - it('setparameter', async () => { - const da1 = new BinProcessValueIn(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - await da1.setParameter(true,'VExt'); - await da1.setParameter('test','VState0'); - await da1.setParameter('test','VState1'); - - expect(mockup.vExt).equal(true); - //TODO: problem: we have to wait for the variable to change (EventEmitter), maybe this is not optimal - await new Promise(f => setTimeout(f, 1000)); - expect(da1.communication.VExt.value).equal(true); - expect(da1.communication.VState0.value).equal('test'); - expect(da1.communication.VState1.value).equal('test'); + expect(dataAssemblyController.communication.VExt.value).equal(false); + expect(dataAssemblyController.communication.VState0.value).equal('state0_active'); + expect(dataAssemblyController.communication.VState1.value).equal('state1_active'); }).timeout(4000); - it('setValue', async () => { - // TODO - }).timeout(4000); + it('set Parameter', async () => { + const dataAssemblyController = new BinProcessValueIn(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + await dataAssemblyController.setParameter(true,'VExt'); + await dataAssemblyController.setParameter('test','VState0'); + await dataAssemblyController.setParameter('test','VState1'); + + expect(binProcessValueInMockup.vExt).equal(true); + + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + expect(dataAssemblyController.communication.VExt.value).equal(true); + expect(dataAssemblyController.communication.VState0.value).equal('test'); + expect(dataAssemblyController.communication.VState1.value).equal('test'); + }).timeout(8000); - it('tojson', async () => { - // TODO - }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.ts index 8063c1d7..83d0b1a0 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/BinProcessValueIn/BinProcessValueIn.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,14 +24,13 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; +import {OpcUaConnection, DataItem} from '../../../../connection'; import {InputElement, InputElementRuntime} from '../../InputElement'; - export type BinProcessValueInRuntime = InputElementRuntime & { - VExt: OpcUaDataItem; - VState0: OpcUaDataItem; - VState1: OpcUaDataItem; + VExt: DataItem; + VState0: DataItem; + VState1: DataItem; }; export class BinProcessValueIn extends InputElement { @@ -40,9 +38,9 @@ export class BinProcessValueIn extends InputElement { constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.VExt = this.createDataItem('VExt', 'read'); - this.communication.VState0 = this.createDataItem('VState0','read'); //TODO: Check read, write? - this.communication.VState1 = this.createDataItem('VState1','read'); //TODO: Check read, write? + this.communication.VExt = this.createDataItem('VExt', 'boolean', 'write'); + this.communication.VState0 = this.createDataItem('VState0', 'boolean', 'write'); + this.communication.VState1 = this.createDataItem('VState1', 'boolean', 'write'); this.defaultReadDataItem = this.communication.VExt; this.defaultReadDataItemType = 'boolean'; diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.mockup.spec.ts index f1b5d1a7..56f966ed 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.mockup.spec.ts @@ -1,54 +1,89 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {DIntProcessValueInMockup} from './DIntProcessValueIn.mockup'; +import {DIntProcessValueInMockup, getDIntProcessValueInDataItemOptions, getDIntProcessValueInOptions} from './DIntProcessValueIn.mockup'; import {MockupServer} from '../../../../../_utils'; -import {AnaProcessValueInMockup} from '../AnaProcessValueIn/AnaProcessValueIn.mockup'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaProcessValueInRuntime} from '../AnaProcessValueIn/AnaProcessValueIn'; chai.use(chaiAsPromised); const expect = chai.expect; describe('DIntProcessValueInMockup', () => { + describe('static', () => { - let mockupServer: any; + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); - afterEach(async () => { - }); it('should create DIntProcessValueInMockup', () => { - const mockup= new DIntProcessValueInMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new DIntProcessValueInMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + it('static DataItemOptions', () => { + const options = getDIntProcessValueInDataItemOptions(1, 'Test') as AnaProcessValueInRuntime; + expect(Object.keys(options).length).to.equal(5); }); - it('getDIntProcessValueInMockupReferenceJSON()', () => { - const mockup = new DIntProcessValueInMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getDIntProcessValueInInstanceMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(5); - //TODO: test more + + it('static DataAssemblyOptions', () => { + const options = getDIntProcessValueInOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(7); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new DIntProcessValueInMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(7); }); }); + describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: DIntProcessValueInMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new DIntProcessValueInMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new DIntProcessValueInMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -58,23 +93,21 @@ describe('DIntProcessValueInMockup', () => { }); it('set and get VExt, >VSclMax', async () => { - await connection.writeOpcUaNode('Variable.VExt', namespaceUrl, 1, 'Int32'); - await connection.readOpcUaNode('Variable.VExt', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(0)); + await connection.writeNode('Variable.VExt', mockupServer.nameSpaceUri, 1, 'Int32'); + await connection.readNode('Variable.VExt', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(0)); }).timeout(3000); it('set and get VExt, { - await connection.writeOpcUaNode('Variable.VExt', namespaceUrl, -1, 'Int32'); - await connection.readOpcUaNode('Variable.VExt', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(0)); + await connection.writeNode('Variable.VExt', mockupServer.nameSpaceUri, -1, 'Int32'); + await connection.readNode('Variable.VExt', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(0)); }).timeout(3000); it('set and get VExt', async () => { - await connection.writeOpcUaNode('Variable.VExt', namespaceUrl, 0, 'Int32'); - await connection.readOpcUaNode('Variable.VExt', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(0)); + await connection.writeNode('Variable.VExt', mockupServer.nameSpaceUri, 0, 'Int32'); + await connection.readNode('Variable.VExt', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(0)); }).timeout(3000); - - //TODO get the rest }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.mockup.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.mockup.ts index 58e2fd37..c9e7ecf8 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.mockup.ts @@ -24,38 +24,54 @@ */ import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getScaleSettingDAMockupReferenceJSON, ScaleSettingDAMockup} from '../../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../../_extensions/unitDA/UnitDA.mockup'; -import {getInputElementMockupReferenceJSON, InputElementMockup} from '../../InputElement.mockup'; +import {getScaleSettingsDataItemOptions, ScaleSettingMockup} from '../../../baseFunction/scaleSettings/ScaleSetting.mockup'; +import {getUnitSettingsDataItemOptions, UnitSettingsMockup} from '../../../baseFunction/unitSettings/UnitSettings.mockup'; +import {getInputElementDataItemOptions, InputElementMockup} from '../../InputElement.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; -export function getDIntProcessValueInMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getInputElementMockupReferenceJSON(namespace, objectBrowseName), - ...getScaleSettingDAMockupReferenceJSON(namespace, objectBrowseName, 'Int32'), - ...getUnitDAMockupReferenceJSON(namespace, objectBrowseName), - VExt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VExt`, - dataType: 'Int32' - } - } +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/InputElement/DIntProcessValueIn'; + +function getDIntProcessValueInSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + VExt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VExt`, + dataType: 'Int32' + } as OpcUaNodeOptions + }); +} + +export function getDIntProcessValueInDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getInputElementDataItemOptions(namespace, objectBrowseName), + ...getScaleSettingsDataItemOptions(namespace, objectBrowseName, 'DInt'), + ...getUnitSettingsDataItemOptions(namespace, objectBrowseName), + ...getDIntProcessValueInSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getDIntProcessValueInOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getDIntProcessValueInDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class DIntProcessValueInMockup extends InputElementMockup{ - public scaleSettings: ScaleSettingDAMockup; - public unit: UnitDAMockup; + public scaleSettings: ScaleSettingMockup<'DInt'>; + public unit: UnitSettingsMockup; public vExt = 0; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { super(namespace, rootNode, variableName); - this.scaleSettings = new ScaleSettingDAMockup(namespace, this.mockupNode, this.name, DataType.Int32); - this.unit = new UnitDAMockup(namespace, this.mockupNode, this.name); + this.scaleSettings = new ScaleSettingMockup(namespace, this.mockupNode, this.name, 'DInt'); + this.unit = new UnitSettingsMockup(namespace, this.mockupNode, this.name); namespace.addVariable({ componentOf: this.mockupNode, @@ -66,7 +82,7 @@ export class DIntProcessValueInMockup extends InputElementMockup{ get: (): Variant => { return new Variant({dataType: DataType.Int32, value: this.vExt}); }, - set: (variant: Variant) => { + set: (variant: Variant): StatusCodes => { let newValue = parseInt(variant.value,10); if (newValue < this.scaleSettings.vSclMin) { newValue = this.scaleSettings.vSclMin; @@ -81,9 +97,15 @@ export class DIntProcessValueInMockup extends InputElementMockup{ } - public getDIntProcessValueInInstanceMockupJSON() { - return getDIntProcessValueInMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.scaleSettings.getDataItemOptions(), + ...this.unit.getDataItemOptions(), + ...getDIntProcessValueInSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.puml b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.puml index 807e26b8..e25214a5 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.puml +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.puml @@ -1,7 +1,32 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include ../../../_extensions/scaleSettingsDA/ScaleSettings.puml -!include ../../../_extensions/unitDA/UnitSettings.puml +!include ../../../_extensions/scaleSettings/ScaleSettings.puml +!include ../../../_extensions/unit/UnitSettings.puml class DIntProcessValueIn{ + readonly communication!: DIntProcessValueInRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.spec.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.spec.ts index 91b05897..59557a56 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.spec.ts @@ -27,12 +27,9 @@ import {OpcUaConnection} from '../../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -// overlap with anaprocessvaluein -import * as baseDataAssemblyOptions from '../../../../../../../tests/anaprocessvaluein.json'; import {MockupServer} from '../../../../../_utils'; -import {DIntProcessValueInMockup} from '../DIntProcessValueIn/DIntProcessValueIn.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DIntProcessValueInMockup, getDIntProcessValueInOptions} from './DIntProcessValueIn.mockup'; + import {DIntProcessValueIn} from './DIntProcessValueIn'; import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; @@ -40,52 +37,45 @@ chai.use(chaiAsPromised); const expect = chai.expect; describe('DIntProcessValueIn', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/InputElement/DIntProcessValueIn', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getDIntProcessValueInOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create DIntProcessValueIn', async () => { - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as DIntProcessValueIn; - expect(da1).to.be.not.undefined; - expect(da1.communication.VExt).to.be.not.undefined; - expect(da1.communication.VSclMax).to.be.not.undefined; - expect(da1.communication.VSclMin).to.be.not.undefined; - expect(da1.communication.VUnit).to.be.not.undefined; + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as DIntProcessValueIn; + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.communication.VExt).to.be.not.undefined; + expect(dataAssemblyController.communication.VSclMax).to.be.not.undefined; + expect(dataAssemblyController.communication.VSclMin).to.be.not.undefined; + expect(dataAssemblyController.communication.VUnit).to.be.not.undefined; }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - let mockup: DIntProcessValueInMockup; - let da1: DIntProcessValueIn; + let dIntProcessValueInMockup: DIntProcessValueInMockup; + let dataAssemblyController: DIntProcessValueIn; beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new DIntProcessValueInMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - mockup.scaleSettings.vSclMax= 1; + dIntProcessValueInMockup = new DIntProcessValueInMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + dIntProcessValueInMockup.scaleSettings.vSclMax= 1; + dataAssemblyOptions = dIntProcessValueInMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as DIntProcessValueIn; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; + + dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as DIntProcessValueIn; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); }); afterEach(async function () { @@ -95,27 +85,17 @@ describe('DIntProcessValueIn', () => { }); it('should subscribe successfully', async () => { - expect(da1.communication.VExt.value).equal(0); - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(1); + expect(dataAssemblyController.communication.VExt.value).equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(1); }).timeout(4000); it('setparameter', async () => { - await da1.setParameter(1,'VExt'); - - expect(mockup.vExt).equal(1); - //TODO: problem= we have to wait for the variable to change (EventEmitter), maybe this is not optimal - await new Promise(f => setTimeout(f, 1000)); - + await dataAssemblyController.setParameter(1,'VExt'); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + expect(dIntProcessValueInMockup.vExt).equal(1); }).timeout(4000); - it('setValue', async () => { - // TODO - }).timeout(4000); - - it('tojson', async () => { - // TODO - }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.ts index b9c2a56a..d904010a 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/DIntProcessValueIn/DIntProcessValueIn.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,16 +24,14 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; -import {ScaleSettingsRuntime, UnitDataAssemblyRuntime} from '../../../_extensions'; +import {OpcUaConnection, DataItem} from '../../../../connection'; +import {ScaleSettings, ScaleSettingsRuntime, UnitSettingsRuntime, UnitSettings} from '../../../baseFunction'; import { InputElement, InputElementRuntime, } from '../../InputElement'; -import {UnitSettings} from '../../../_extensions/unitDA/UnitSettings'; -import {ScaleSettings} from '../../../_extensions/scaleSettingsDA/ScaleSettings'; -export type DIntProcessValueInRuntime = InputElementRuntime & UnitDataAssemblyRuntime & ScaleSettingsRuntime & { - VExt: OpcUaDataItem; +export type DIntProcessValueInRuntime = InputElementRuntime & UnitSettingsRuntime & ScaleSettingsRuntime & { + VExt: DataItem; }; export class DIntProcessValueIn extends InputElement { @@ -44,14 +41,16 @@ export class DIntProcessValueIn extends InputElement { constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.VExt = this.createDataItem('VExt', 'read'); this.unitSettings = new UnitSettings(this); this.scaleSettings = new ScaleSettings(this); + this.communication.VExt = this.createDataItem('VExt', 'number', 'write'); + this.defaultReadDataItem = this.communication.VExt; this.defaultReadDataItemType = 'number'; - this.defaultWriteDataItemType = 'number'; + this.defaultWriteDataItem = this.communication.VExt; + this.defaultWriteDataItemType = 'number'; } } diff --git a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/index.ts b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/index.ts index d4b96f9c..73a07cae 100644 --- a/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/inputElement/processValueIn/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './AnaProcessValueIn/AnaProcessValueIn'; export * from './BinProcessValueIn/BinProcessValueIn'; export * from './DIntProcessValueIn/DIntProcessValueIn'; diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.puml index 947695b2..8f658c42 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.puml +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.spec.ts index 6a6000f8..3ddc3788 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.spec.ts @@ -1,16 +1,44 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {OperationElementMockup} from './OperationElement.mockup'; +import {getOperationElementDataItemOptions, getOperationElementOptions, OperationElementMockup} from './OperationElement.mockup'; import {MockupServer} from '../../../_utils'; - +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OperationElementRuntime} from './OperationElement'; chai.use(chaiAsPromised); const expect = chai.expect; describe('OperationElementMockup', () => { - describe('', () => { - let mockupServer: any; + + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async function (){ this.timeout(5000); mockupServer = new MockupServer(); @@ -18,19 +46,27 @@ describe('OperationElementMockup', () => { }); it('should create OperationElementMockup', async () => { - const mockup= new OperationElementMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new OperationElementMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + it('static DataItemOptions', () => { + const options = getOperationElementDataItemOptions(1, 'Test') as OperationElementRuntime; + expect(Object.keys(options).length).to.equal(1); }); - it('getOperationElementMockupReferenceJSON()', () => { - const mockup = new OperationElementMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getOperationElementInstanceMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(1); - //TODO: test more + + it('static DataAssemblyOptions', () => { + const options = getOperationElementOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(3); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new OperationElementMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(3); }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.ts index 96ab1220..d01bf165 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.mockup.ts @@ -24,31 +24,41 @@ */ import {Namespace, UAObject} from 'node-opcua'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../_extensions/osLevelDA/OSLevelDA.mockup'; -import {DataAssemblyControllerMockup} from '../DataAssemblyController.mockup'; - -export function getOperationElementMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - return ( - { - ...getOSLevelDAMockupReferenceJSON(namespace,objectBrowseName), - } - ); +import {getOSLevelDataItemOptions, OSLevelMockup} from '../baseFunction/osLevel/OSLevel.mockup'; +import {DataAssemblyControllerMockup, getDataAssemblyOptions} from '../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement'; + +export function getOperationElementDataItemOptions(namespace: number, objectBrowseName: string): object { + return getOSLevelDataItemOptions(namespace, objectBrowseName); +} + +export function getOperationElementOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getOperationElementDataItemOptions(namespace, objectBrowseName)}; + return options; } export class OperationElementMockup extends DataAssemblyControllerMockup { - protected osLevel: OSLevelDAMockup; + protected osLevel: OSLevelMockup; + constructor(namespace: Namespace, rootNode: UAObject, variableName: string){ super(namespace, rootNode, variableName); - this.osLevel = new OSLevelDAMockup(namespace, this.mockupNode, this.name); + this.osLevel = new OSLevelMockup(namespace, this.mockupNode, this.name); } - - public getOperationElementInstanceMockupJSON() { - return getOperationElementMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.osLevel.getDataItemOptions() + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.puml index 57b47c04..f3a754eb 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.puml +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include ./servParam/ServParam.puml diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.spec.ts index 044528ad..f6a8b3da 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.spec.ts @@ -28,57 +28,45 @@ import {OpcUaConnection} from '../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../tests/binmanint.json'; -import {DataAssemblyControllerFactory} from '../DataAssemblyControllerFactory'; import {MockupServer} from '../../../_utils'; -import {OperationElementMockup} from './OperationElement.mockup'; -import {Namespace, UAObject} from 'node-opcua'; +import {getOperationElementOptions, OperationElementMockup} from './OperationElement.mockup'; import {OperationElement} from './OperationElement'; -import {namespaceUrl} from "../../../../../tests/namespaceUrl"; chai.use(chaiAsPromised); const expect = chai.expect; describe('OperationElement', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getOperationElementOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create OperationElement', () => { - //TODO: fix this, error because of circular dependencies - const da1: OperationElement = new OperationElement(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1).to.be.not.undefined; - expect(da1.osLevel).to.be.not.undefined; - expect(da1.communication).to.be.not.undefined; + + const dataAssemblyController: OperationElement = new OperationElement(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController).to.be.not.undefined; + expect(dataAssemblyController.osLevel).to.be.not.undefined; + expect(dataAssemblyController.communication).to.be.not.undefined; }); }); describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } + beforeEach(async function () { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new OperationElementMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - + const operationElementMockup =new OperationElementMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = operationElementMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -89,14 +77,13 @@ describe('OperationElement', () => { }); it('should subscribe successfully', async () => { - //TODO: fix this, error because of circular dependencies - const da1 = new OperationElement(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.OSLevel.value).equal(0); + + const dataAssemblyController = new OperationElement(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + expect(dataAssemblyController.communication.OSLevel.value).equal(0); }).timeout(4000); - //TODO test rest of the funcitons }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.ts index 7fc4165f..86b5b314 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/OperationElement.ts @@ -24,26 +24,28 @@ */ import {DataAssemblyOptions, ParameterInterface, ParameterOptions} from '@p2olab/polaris-interface'; -import {Parameter} from '../../../recipe'; -import {DataItem, OpcUaConnection, OpcUaDataItem} from '../../connection'; -import {OSLevelRuntime} from '../_extensions'; +import {DataItem, DynamicDataItem, OpcUaConnection} from '../../connection'; +import {OSLevelRuntime} from '../baseFunction'; import {BaseDataAssemblyRuntime, DataAssemblyController} from '../DataAssemblyController'; import {PEAController} from '../../PEAController'; import {catDataAssembly} from '../../../../logging'; -import {OSLevel} from '../_extensions/osLevelDA/OSLevel'; +import {OSLevel} from '../baseFunction'; +import {ParameterRequest} from '../ParameterRequest'; export type OperationElementRuntime = BaseDataAssemblyRuntime & OSLevelRuntime export class OperationElement extends DataAssemblyController { + public communication!: OperationElementRuntime; - public parameterRequest: Parameter | undefined; + // TODO: This creates a circular dependency as parameter also imports OperationElement + public parameterRequest: ParameterRequest | undefined; public requestedValue = ''; public readonly osLevel: OSLevel; constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); + this.osLevel = new OSLevel(this); - } @@ -56,9 +58,10 @@ export class OperationElement extends DataAssemblyController { const dataItem: DataItem | undefined = (variable) ? this.communication[variable as keyof OperationElementRuntime] : this.defaultWriteDataItem; catDataAssembly.debug(`Set Parameter: ${this.name} (${variable}) -> ${JSON.stringify(paramValue)}`); - await dataItem?.write(paramValue); + await (dataItem as DynamicDataItem)?.write(paramValue); } + public async setValue(p: ParameterOptions, peas: PEAController[]): Promise { catDataAssembly.debug(`set value: ${JSON.stringify(p)}`); if (p.value) { @@ -72,16 +75,16 @@ export class OperationElement extends DataAssemblyController { } } - this.parameterRequest = new Parameter(p, peas); + this.parameterRequest = new ParameterRequest(p, peas); const value = this.parameterRequest.getValue(); catDataAssembly.trace(`calculated value: ${value}`); await this.setParameter(value as number); - if (this.parameterRequest.options.continuous) { + if (this.parameterRequest.continuous) { catDataAssembly.trace('Continuous parameter change'); this.parameterRequest.listenToScopeArray() - .on('changed', (data) => this.setParameter(data)); + .on('changed', (data: any) => this.setParameter(data)); } } } diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/index.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/index.ts index 1693b97d..b006c303 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/index.ts @@ -1,4 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './man'; export * from './servParam'; - export * from './OperationElement'; diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.mockup.spec.ts index dffdd1be..963cd5ce 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.mockup.spec.ts @@ -1,51 +1,78 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {AnaManMockup} from './AnaMan.mockup'; +import {AnaManMockup, getAnaManDataItemOptions, getAnaManOptions} from './AnaMan.mockup'; import {MockupServer} from '../../../../../_utils'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaManRuntime} from './AnaMan'; chai.use(chaiAsPromised); const expect = chai.expect; -// this fake class is needed to test the protected variable -class FakeClass extends AnaManMockup{ - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - super(namespace, rootNode, variableName); - } - public getVOut(){ - return this.vOut; - } -} - describe('AnaManMockup', () => { + describe('static', () => { - let mockupServer: any; - beforeEach(async() => { + + let mockupServer: MockupServer; + + beforeEach(async function () { + this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); }); it('should create AnaManMockup', () => { - const mockup= new AnaManMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new AnaManMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more }); - it('getAnaManMockupReferenceJSON()', () => { - const mockup = new AnaManMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getAnaManMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(10); - //TODO: test more + it('static DataItemOptions', () => { + const options = getAnaManDataItemOptions(1, 'Test') as AnaManRuntime; + expect(Object.keys(options).length).to.equal(10); }); - it('startCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + it('static DataAssemblyOptions', () => { + const options = getAnaManOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(12); + }).timeout(6000); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new AnaManMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(12); + }).timeout(6000); + + // TODO + /* it('startCurrentTimeUpdate()', async() => { + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); expect(mockup.getVOut()).to.equal(0); await new Promise(f => setTimeout(f, 1000)); @@ -53,8 +80,8 @@ describe('AnaManMockup', () => { }); it('stopCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); mockup.stopCurrentTimeUpdate(); expect(mockup.getVOut()).to.equal(0); @@ -64,24 +91,24 @@ describe('AnaManMockup', () => { }); it('stopCurrentTimeUpdate(), interval undefined', () => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; expect((() => mockup.stopCurrentTimeUpdate())).to.throw(); - }); + });*/ }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: AnaManMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new AnaManMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new AnaManMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -91,11 +118,9 @@ describe('AnaManMockup', () => { }); it('set and get VMan', async () => { - await connection.writeOpcUaNode('Variable.VMan', namespaceUrl, 1.1, 'Double'); - await connection.readOpcUaNode('Variable.VMan', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1.1)); + await connection.writeNode('Variable.VMan', mockupServer.nameSpaceUri, 1.1, 'Double'); + await connection.readNode('Variable.VMan', mockupServer.nameSpaceUri) + .then((dataValue) => expect(dataValue?.value.value).to.equal(1.1)); }).timeout(3000); - - //TODO get the rest }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.mockup.ts index 73ef9ba8..5532e0a0 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.mockup.ts @@ -27,79 +27,87 @@ import Timeout = NodeJS.Timeout; import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../../_extensions/unitDA/UnitDA.mockup'; +import {getUnitSettingsDataItemOptions, UnitSettingsMockup} from '../../../baseFunction/unitSettings/UnitSettings.mockup'; import { - getScaleSettingDAMockupReferenceJSON, - ScaleSettingDAMockup -} from '../../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; + getScaleSettingsDataItemOptions, + ScaleSettingMockup +} from '../../../baseFunction/scaleSettings/ScaleSetting.mockup'; import { - getValueLimitationDAMockupReferenceJSON, - ValueLimitationDAMockup -} from '../../../_extensions/valueLimitationDA/ValueLimitationDA.mockup'; + getValueLimitationDataItemOptions, + ValueLimitationMockup +} from '../../../baseFunction/valueLimitation/ValueLimitation.mockup'; +import {getOperationElementDataItemOptions, OperationElementMockup} from '../../OperationElement.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getAnaManMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaMan'; +function getAnaManSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getOSLevelDAMockupReferenceJSON(namespace,objectBrowseName), - ...getScaleSettingDAMockupReferenceJSON(namespace,objectBrowseName,'Float'), - ...getValueLimitationDAMockupReferenceJSON(namespace,objectBrowseName, 'Float'), - ...getUnitDAMockupReferenceJSON(namespace,objectBrowseName), - VOut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VOut`, - dataType: 'Float' - }, - VMan: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VMan`, - dataType: 'Float' - }, - VRbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VRbk`, - dataType: 'Float' - }, + VOut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VOut`, + dataType: 'Float' + } as OpcUaNodeOptions, + VMan: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VMan`, + dataType: 'Float' + } as OpcUaNodeOptions, + VRbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VRbk`, + dataType: 'Float' + } as OpcUaNodeOptions, - VFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VFbk`, - dataType: 'Float' - } - } + VFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VFbk`, + dataType: 'Float' + } as OpcUaNodeOptions + }); +} + +export function getAnaManDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getOperationElementDataItemOptions(namespace, objectBrowseName), + ...getScaleSettingsDataItemOptions(namespace, objectBrowseName, 'Ana'), + ...getValueLimitationDataItemOptions(namespace, objectBrowseName, 'Ana'), + ...getUnitSettingsDataItemOptions(namespace, objectBrowseName), + ...getAnaManSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } -export class AnaManMockup { +export function getAnaManOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getAnaManDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class AnaManMockup extends OperationElementMockup { - public readonly name: string; protected vRbk = 0; protected vMan = 0; - protected vOut = 0 + protected vOut = 0; protected vFbk = 0; - - public readonly osLevel: OSLevelDAMockup; - public readonly scaleSettings: ScaleSettingDAMockup; - public readonly valueLimitation: ValueLimitationDAMockup; - public readonly unit: UnitDAMockup; + + public readonly scaleSettings: ScaleSettingMockup<'Ana'>; + public readonly valueLimitation: ValueLimitationMockup<'Ana'>; + public readonly unit: UnitSettingsMockup; protected interval: Timeout | undefined; - protected mockupNode: UAObject; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); - this.name = variableName; + this.scaleSettings = new ScaleSettingMockup(namespace, this.mockupNode, this.name, 'Ana'); + this.valueLimitation = new ValueLimitationMockup(namespace, this.mockupNode, this.name,'Ana'); + this.unit = new UnitSettingsMockup(namespace, this.mockupNode, this.name); - this.mockupNode = namespace.addObject({ - organizedBy: rootNode, - browseName: variableName - }); - - this.osLevel = new OSLevelDAMockup(namespace, this.mockupNode, this.name); - this.scaleSettings = new ScaleSettingDAMockup(namespace, this.mockupNode, this.name, DataType.Double); - this.valueLimitation = new ValueLimitationDAMockup(namespace, this.mockupNode, this.name,DataType.Double); - this.unit = new UnitDAMockup(namespace, this.mockupNode, this.name); namespace.addVariable({ componentOf: this.mockupNode, nodeId: `ns=${namespace.index};s=${variableName}.VMan`, @@ -150,10 +158,17 @@ export class AnaManMockup { }); } - public getAnaManMockupJSON() { - return getAnaManMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.scaleSettings.getDataItemOptions(), + ...this.valueLimitation.getDataItemOptions(), + ...this.unit.getDataItemOptions(), + ...getAnaManSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } public startCurrentTimeUpdate(): void { diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.puml index 612db548..d53792be 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.puml +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.puml @@ -1,10 +1,35 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include AnaManInt.puml +!include anaManInt/AnaManInt.puml -!include ../../../_extensions/scaleSettingsDA/ScaleSettings.puml -!include ../../../_extensions/unitDA/UnitSettings.puml -!include ../../../_extensions/valueLimitationDA/ValueLimitation.puml +!include ../../../_extensions/scaleSettings/ScaleSettings.puml +!include ../../../_extensions/unit/UnitSettings.puml +!include ../../../_extensions/valueLimitation/ValueLimitation.puml class AnaMan{ + readonly communication!: AnaManRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.spec.ts index 28da495d..89f3d568 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.spec.ts @@ -27,44 +27,42 @@ import {OpcUaConnection} from '../../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -//we can use dintmanint.json, because overlap with AnaManInt -import * as baseDataAssemblyOptions from '../../../../../../../tests/dintmanint.json'; import {MockupServer} from '../../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; + import {AnaMan} from './AnaMan'; -import {AnaManMockup} from './AnaMan.mockup'; import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; +import {AnaManMockup, getAnaManOptions} from './AnaMan.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('AnaMan', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaMan', - dataItems: baseDataAssemblyOptions - }; - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create AnaMan', () => { - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as AnaMan; - expect(da1.communication.VOut).to.not.equal(undefined); - expect(da1.scaleSettings).to.not.be.undefined; - expect(da1.unitSettings).to.not.be.undefined; - expect(da1.valueLimitation).to.not.be.undefined; - expect(da1.communication.VMan).to.not.equal(undefined); - expect(da1.communication.VRbk).to.not.equal(undefined); - expect(da1.communication.VFbk).to.not.equal(undefined); + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { - expect(da1.defaultReadDataItem).equal(da1.communication.VOut); - expect(da1.defaultReadDataItemType).to.equal('number'); - expect(da1.defaultWriteDataItem).equal(da1.communication.VMan); - expect(da1.defaultWriteDataItemType).to.equal('number'); + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getAnaManOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create AnaMan', () => { + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as AnaMan; + expect(dataAssemblyController.communication.VOut).to.not.equal(undefined); + expect(dataAssemblyController.scaleSettings).to.not.be.undefined; + expect(dataAssemblyController.unitSettings).to.not.be.undefined; + expect(dataAssemblyController.valueLimitation).to.not.be.undefined; + expect(dataAssemblyController.communication.VMan).to.not.equal(undefined); + expect(dataAssemblyController.communication.VRbk).to.not.equal(undefined); + expect(dataAssemblyController.communication.VFbk).to.not.equal(undefined); + expect(dataAssemblyController.defaultReadDataItem).equal(dataAssemblyController.communication.VOut); + expect(dataAssemblyController.defaultReadDataItemType).to.equal('number'); + expect(dataAssemblyController.defaultWriteDataItem).equal(dataAssemblyController.communication.VMan); + expect(dataAssemblyController.defaultWriteDataItemType).to.equal('number'); }); }); + describe('dynamic', () => { + let mockupServer: MockupServer; let connection: OpcUaConnection; @@ -72,12 +70,11 @@ describe('AnaMan', () => { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new AnaManMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const anaManMockup = new AnaManMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = anaManMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -88,31 +85,22 @@ describe('AnaMan', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as AnaMan; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.OSLevel.value).to.equal(0); - - expect(da1.communication.VOut.value).to.equal(0); - expect(da1.communication.VMan.value).to.equal(0); - expect(da1.communication.VRbk.value).to.equal(0); - expect(da1.communication.VFbk.value).to.equal(0); - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(0); + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as AnaMan; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); - expect(da1.communication.VMin.value).equal(0); - expect(da1.communication.VMax.value).equal(0); + expect(dataAssemblyController.communication.OSLevel.value).to.equal(0); + expect(dataAssemblyController.communication.VOut.value).to.equal(0); + expect(dataAssemblyController.communication.VMan.value).to.equal(0); + expect(dataAssemblyController.communication.VRbk.value).to.equal(0); + expect(dataAssemblyController.communication.VFbk.value).to.equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(0); + expect(dataAssemblyController.communication.VMin.value).equal(0); + expect(dataAssemblyController.communication.VMax.value).equal(0); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.ts index 18ae2e35..89157bce 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaMan.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,27 +24,26 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; +import {OpcUaConnection, DataItem} from '../../../../connection'; import { - ScaleSettingsRuntime, - UnitDataAssemblyRuntime, ValueLimitation, - ValueLimitationRuntime -} from '../../../_extensions'; -import {ScaleSettings} from '../../../_extensions/scaleSettingsDA/ScaleSettings'; -import {UnitSettings} from '../../../_extensions/unitDA/UnitSettings'; + ScaleSettings, ScaleSettingsRuntime, + UnitSettingsRuntime, UnitSettings, + ValueLimitation, ValueLimitationRuntime +} from '../../../baseFunction'; import {OperationElement, OperationElementRuntime} from '../../OperationElement'; export type AnaManRuntime = - OperationElementRuntime & UnitDataAssemblyRuntime + OperationElementRuntime & UnitSettingsRuntime & ValueLimitationRuntime & ScaleSettingsRuntime & { - VOut: OpcUaDataItem; - VRbk: OpcUaDataItem; - VFbk: OpcUaDataItem; - VMan: OpcUaDataItem; + VOut: DataItem; + VRbk: DataItem; + VFbk: DataItem; + VMan: DataItem; }; export class AnaMan extends OperationElement { + public readonly communication!: AnaManRuntime; public readonly scaleSettings: ScaleSettings; public readonly unitSettings: UnitSettings; @@ -54,10 +52,11 @@ export class AnaMan extends OperationElement { constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.VOut = this.createDataItem('VOut', 'read'); - this.communication.VRbk = this.createDataItem('VRbk', 'read'); - this.communication.VFbk = this.createDataItem('VFbk','read'); - this.communication.VMan = this.createDataItem('VMan', 'write'); + + this.communication.VOut = this.createDataItem('VOut', 'number'); + this.communication.VRbk = this.createDataItem('VRbk', 'number'); + this.communication.VFbk = this.createDataItem('VFbk','number'); + this.communication.VMan = this.createDataItem('VMan', 'number','write'); this.unitSettings = new UnitSettings(this); this.scaleSettings = new ScaleSettings(this); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.mockup.spec.ts deleted file mode 100644 index 7909a288..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.mockup.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../../_utils'; -import {AnaManIntMockup} from './AnaManInt.mockup'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('AnaManIntMockup', () => { - describe('', () => { - let mockupServer: MockupServer; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - afterEach(async () => { - - }); - it('should create AnaManIntMockup', async () => { - const mockup= new AnaManIntMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - //TODO: test more - - }); - it('getAnaManIntMockupReferenceJSON()', () => { - const mockup = new AnaManIntMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getAnaManIntMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(19); - //TODO: test more - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.mockup.ts deleted file mode 100644 index 0c14d4e6..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.mockup.ts +++ /dev/null @@ -1,84 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -// eslint-disable-next-line no-undef -import Timeout = NodeJS.Timeout; -import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import { - getSourceModeDAMockupReferenceJSON, - SourceModeDAMockup -} from '../../../_extensions/sourceModeDA/SourceModeDA.mockup'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {AnaManMockup, getAnaManMockupReferenceJSON} from './AnaMan.mockup'; - -export function getAnaManIntMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - - return ({ - ...getAnaManMockupReferenceJSON(namespace,objectBrowseName), - ...getWQCDAMockupReferenceJSON(namespace,objectBrowseName), - ...getSourceModeDAMockupReferenceJSON(namespace,objectBrowseName), - VInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VInt`, - dataType: 'Float' - } - } - ); -} - -export class AnaManIntMockup extends AnaManMockup{ - - protected vInt = 0; - public readonly wqc: WQCDAMockup; - public readonly sourceMode: SourceModeDAMockup; - - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - super(namespace, rootNode, variableName); - - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); - this.sourceMode = new SourceModeDAMockup(namespace, this.mockupNode, this.name); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.VInt`, - browseName: `${variableName}.VInt`, - dataType: DataType.Double, - value: { - get: (): Variant => { - return new Variant({dataType: DataType.Double, value: this.vInt}); - }, - }, - }); - } - - public getAnaManIntMockupJSON() { - return getAnaManIntMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); - } - -} diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.puml deleted file mode 100644 index 30821960..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.puml +++ /dev/null @@ -1,21 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -!include ../../../_extensions/sourceModeDA/SourceModeController.puml -!include ../../../_extensions/wqcDA/WQC.puml -class AnaManInt{ - + readonly communication!: AnaManIntRuntime - + readonly sourceMode: SourceModeController - + readonly wqc: WQC -} - -AnaManInt *- AnaManIntSpec -AnaManIntSpec ..> AnaManIntMockup : <> -AnaManInt *- AnaManIntMockup - -AnaManInt *- AnaManIntRuntime -AnaManInt *- WQC -AnaManInt *- SourceModeController - - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.spec.ts deleted file mode 100644 index ef53e8ad..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.spec.ts +++ /dev/null @@ -1,124 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../../connection'; -import {AnaManInt} from './AnaManInt'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/dintmanint.json'; -import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; -import {MockupServer} from '../../../../../_utils'; -import {AnaManMockup} from './AnaMan.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; -import {AnaMan} from './AnaMan'; -import {AnaManIntMockup} from './AnaManInt.mockup'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('AnaManInt', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaManInt', - dataItems: baseDataAssemblyOptions - }; - - describe( 'static',() => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create AnaManInt', () => { - - const da1: AnaManInt = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as AnaManInt; - expect(da1.sourceMode).to.be.not.undefined; - expect(da1.communication.VInt).to.not.equal(undefined); - expect(da1.wqc).to.not.equal(undefined); - //rest is tested in AnaMan - }); - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockup = new AnaManIntMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as AnaManInt; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.OSLevel.value).to.equal(0); - - expect(da1.communication.VOut.value).to.equal(0); - expect(da1.communication.VMan.value).to.equal(0); - expect(da1.communication.VRbk.value).to.equal(0); - expect(da1.communication.VFbk.value).to.equal(0); - - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(0); - - expect(da1.communication.VMin.value).equal(0); - expect(da1.communication.VMax.value).equal(0); - - expect(da1.communication.WQC.value).to.equal(0); - expect(da1.communication.VInt.value).to.equal(0); - expect(da1.communication.VMan.value).to.equal(0); - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcManAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcManOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcManAct.value).equal(false); - }).timeout(4000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.mockup.spec.ts new file mode 100644 index 00000000..42f34d0f --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.mockup.spec.ts @@ -0,0 +1,70 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../../../_utils'; +import {AnaManIntMockup, getAnaManIntDataItemOptions, getAnaManIntOptions} from './AnaManInt.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaManIntRuntime} from './AnaManInt'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('AnaManIntMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create AnaManIntMockup', async () => { + const mockup= new AnaManIntMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getAnaManIntDataItemOptions(1, 'Test') as AnaManIntRuntime; + expect(Object.keys(options).length).to.equal(19); + }); + + it('static DataAssemblyOptions', () => { + const options = getAnaManIntOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(21); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new AnaManIntMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(21); + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.mockup.ts new file mode 100644 index 00000000..257c06f5 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.mockup.ts @@ -0,0 +1,105 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; +import { + getSourceModeDataItemOptions, + SourceModeMockup +} from '../../../../baseFunction/sourceMode/SourceMode.mockup'; +import {getWQCDataItemOptions, WQCMockup} from '../../../../baseFunction/wqc/WQC.mockup'; +import {AnaManMockup, getAnaManDataItemOptions} from '../AnaMan.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaMan/AnaManInt'; + +function getAnaManIntSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + VInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VInt`, + dataType: 'Float' + } as OpcUaNodeOptions + }); +} + +export function getAnaManIntDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getAnaManDataItemOptions(namespace, objectBrowseName), + ...getWQCDataItemOptions(namespace, objectBrowseName), + ...getSourceModeDataItemOptions(namespace, objectBrowseName), + ...getAnaManIntSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions + ); +} + +export function getAnaManIntOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getAnaManIntDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class AnaManIntMockup extends AnaManMockup{ + + protected vInt = 0; + public readonly wqc: WQCMockup; + public readonly sourceMode: SourceModeMockup; + + constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); + + this.wqc = new WQCMockup(namespace, this.mockupNode, this.name); + this.sourceMode = new SourceModeMockup(namespace, this.mockupNode, this.name); + + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.VInt`, + browseName: `${variableName}.VInt`, + dataType: DataType.Double, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Double, value: this.vInt}); + }, + }, + }); + } + + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.wqc.getDataItemOptions(), + ...this.sourceMode.getDataItemOptions(), + ...getAnaManIntSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; + } +} diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.puml new file mode 100644 index 00000000..7016e313 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.puml @@ -0,0 +1,46 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +!include ../../../_extensions/sourceMode/SourceModeController.puml +!include ../../../_extensions/wqc/WQC.puml +class AnaManInt{ + + readonly communication!: AnaManIntRuntime + + readonly sourceMode: SourceModeController + + readonly wqc: WQC +} + +AnaManInt *- AnaManIntSpec +AnaManIntSpec ..> AnaManIntMockup : <> +AnaManInt *- AnaManIntMockup + +AnaManInt *- AnaManIntRuntime +AnaManInt *- WQC +AnaManInt *- SourceModeController + + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.spec.ts new file mode 100644 index 00000000..fbbdea47 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.spec.ts @@ -0,0 +1,106 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../../connection'; +import {AnaManInt} from './AnaManInt'; +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {DataAssemblyControllerFactory} from '../../../../DataAssemblyControllerFactory'; +import {MockupServer} from '../../../../../../_utils'; +import {AnaManIntMockup, getAnaManIntOptions} from './AnaManInt.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('AnaManInt', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe( 'static',() => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getAnaManIntOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create AnaManInt', () => { + + const dataAssemblyController: AnaManInt = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as AnaManInt; + expect(dataAssemblyController.sourceMode).to.be.not.undefined; + expect(dataAssemblyController.communication.VInt).to.not.equal(undefined); + expect(dataAssemblyController.wqc).to.not.equal(undefined); + }); + }); + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const anaManIntMockup = new AnaManIntMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = anaManIntMockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as AnaManInt; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.OSLevel.value).to.equal(0); + expect(dataAssemblyController.communication.VOut.value).to.equal(0); + expect(dataAssemblyController.communication.VMan.value).to.equal(0); + expect(dataAssemblyController.communication.VRbk.value).to.equal(0); + expect(dataAssemblyController.communication.VFbk.value).to.equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(0); + expect(dataAssemblyController.communication.VMin.value).equal(0); + expect(dataAssemblyController.communication.VMax.value).equal(0); + expect(dataAssemblyController.communication.WQC.value).to.equal(0); + expect(dataAssemblyController.communication.VInt.value).to.equal(0); + expect(dataAssemblyController.communication.VMan.value).to.equal(0); + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcManAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcManOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcManAct.value).equal(false); + }).timeout(4000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.ts similarity index 78% rename from src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.ts rename to src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.ts index 2d82e38a..84256fc8 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/AnaManInt.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/anaMan/anaManInt/AnaManInt.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,14 +24,14 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; -import {SourceModeRuntime, WQCRuntime} from '../../../_extensions'; -import {SourceModeController} from '../../../_extensions/sourceModeDA/SourceModeController'; -import {WQC} from '../../../_extensions/wqcDA/WQC'; -import {AnaMan, AnaManRuntime} from './AnaMan'; +import {OpcUaConnection, DataItem} from '../../../../../connection'; +import {SourceModeController, SourceModeRuntime, + WQC, WQCRuntime +} from '../../../../baseFunction'; +import {AnaMan, AnaManRuntime} from '../AnaMan'; export type AnaManIntRuntime = AnaManRuntime & SourceModeRuntime & WQCRuntime & { - VInt: OpcUaDataItem; + VInt: DataItem; }; export class AnaManInt extends AnaMan { @@ -48,6 +47,6 @@ export class AnaManInt extends AnaMan { this.sourceMode = new SourceModeController(this); - this.communication.VInt = this.createDataItem('VInt', 'read'); + this.communication.VInt = this.createDataItem('VInt', 'number'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.mockup.spec.ts index 053f0ff1..6b8af38c 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.mockup.spec.ts @@ -1,56 +1,87 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; import {MockupServer} from '../../../../../_utils'; -import {BinManMockup} from './BinMan.mockup'; +import {BinManMockup, getBinManDataItemOptions, getBinManOptions} from './BinMan.mockup'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {BinManRuntime} from './BinMan'; chai.use(chaiAsPromised); const expect = chai.expect; -// this fake class is needed to test the protected variable -class FakeClass extends BinManMockup{ - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - super(namespace, rootNode, variableName); - } - public getVOut(){ - return this.vOut; - } -} describe('BinManMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async function () { + this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); }); + it('should create BinManMockup', async () => { - const mockup= new BinManMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new BinManMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more - }); - it('getBinManMockupReferenceJSON(namespace, objectBrowseName)', () => { - const mockup = new BinManMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getBinManMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(7); - //TODO: test more + + it('static DataItemOptions', () => { + const options = getBinManDataItemOptions(1, 'Test') as BinManRuntime; + expect(Object.keys(options).length).to.equal(7); }); - it('startCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + + it('static DataAssemblyOptions', () => { + const options = getBinManOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(9); + }).timeout(6000); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new BinManMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(9); + }).timeout(6000); + + // TODO +/* it('startCurrentTimeUpdate()', async() => { + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); expect(mockup.getVOut()).to.equal(false); await new Promise(f => setTimeout(f, 1000)); expect(mockup.getVOut()).to.equal(true); }); + it('stopCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); mockup.stopCurrentTimeUpdate(); expect(mockup.getVOut()).to.equal(false); @@ -58,25 +89,26 @@ describe('BinManMockup', () => { //vOut should not change, because Update is stopped! expect(mockup.getVOut()).to.equal(false); }); + it('stopCurrentTimeUpdate(), interval undefined', () => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; expect((() => mockup.stopCurrentTimeUpdate())).to.throw(); - }); + });*/ }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: BinManMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new BinManMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new BinManMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -86,11 +118,9 @@ describe('BinManMockup', () => { }); it('set and get VMan', async () => { - await connection.writeOpcUaNode('Variable.VMan', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.VMan', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(true)); + await connection.writeNode('Variable.VMan', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.VMan', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(true)); }).timeout(3000); - - //TODO get the rest }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.mockup.ts index 2e3cad8d..d5158469 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.mockup.ts @@ -26,90 +26,82 @@ // eslint-disable-next-line no-undef import Timeout = NodeJS.Timeout; import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getOperationElementDataItemOptions, OperationElementMockup} from '../../OperationElement.mockup'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../../_extensions/unitDA/UnitDA.mockup'; -import { - getScaleSettingDAMockupReferenceJSON, - ScaleSettingDAMockup -} from '../../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; -import { - getValueLimitationDAMockupReferenceJSON, - ValueLimitationDAMockup -} from '../../../_extensions/valueLimitationDA/ValueLimitationDA.mockup'; -import { - getSourceModeDAMockupReferenceJSON, - SourceModeDAMockup -} from '../../../_extensions/sourceModeDA/SourceModeDA.mockup'; +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement/BinMan'; -export function getBinManMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getBinManSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + VOut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VOut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VState0: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VState0`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VState1: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VState1`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VMan: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VMan`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VRbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VRbk`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VFbk`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} +export function getBinManDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getOSLevelDAMockupReferenceJSON(namespace,objectBrowseName), - VOut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VOut`, - dataType: 'Boolean' - }, - VState0: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VState0`, - dataType: 'Boolean' - }, - VState1: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VState1`, - dataType: 'Boolean' - }, - VMan: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VMan`, - dataType: 'Boolean' - }, - VRbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VRbk`, - dataType: 'Boolean' - }, - VFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VFbk`, - dataType: 'Boolean' - } - } + ...getOperationElementDataItemOptions(namespace, objectBrowseName), + ...getBinManSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } -export class BinManMockup { +export function getBinManOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinManDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class BinManMockup extends OperationElementMockup { - public readonly name: string; protected vState0= 'off'; protected vState1= 'on'; protected vRbk = false; protected vMan = false; protected vOut = false; protected vFbk = false; - - public readonly osLevel: OSLevelDAMockup; + protected interval: Timeout | undefined; - protected mockupNode: UAObject; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - - this.name = variableName; - - this.mockupNode = namespace.addObject({ - organizedBy: rootNode, - browseName: variableName - }); - - this.osLevel = new OSLevelDAMockup(namespace, this.mockupNode, this.name); + super(namespace, rootNode, variableName); namespace.addVariable({ componentOf: this.mockupNode, - nodeId: `ns=1;s=${variableName}.VState0`, + nodeId: `ns=${namespace.index};s=${variableName}.VState0`, browseName: `${variableName}.VState0`, dataType: DataType.String, value: { @@ -121,7 +113,7 @@ export class BinManMockup { namespace.addVariable({ componentOf: this.mockupNode, - nodeId: `ns=1;s=${variableName}.VState1`, + nodeId: `ns=${namespace.index};s=${variableName}.VState1`, browseName: `${variableName}.VState1`, dataType: DataType.String, value: { @@ -181,10 +173,14 @@ export class BinManMockup { }); } - public getBinManMockupJSON() { - return getBinManMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinManSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } public startCurrentTimeUpdate(): void { diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.puml index 07185dd9..c97966b7 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.puml +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.puml @@ -1,6 +1,31 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include BinManInt.puml +!include binManInt/BinManInt.puml class BinMan{ + readonly communication!: BinManRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.spec.ts index e7a3fac6..4e1bb8a0 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.spec.ts @@ -28,38 +28,36 @@ import {BinMan} from './BinMan'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/binmanint.json'; import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; import {MockupServer} from '../../../../../_utils'; -import {BinManMockup} from '../BinMan/BinMan.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {BinManMockup, getBinManOptions} from './BinMan.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('BinMan', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/BinMan', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getBinManOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create BinMan', () => { - //TODO new BinMan() - const da1: BinMan = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as BinMan; - expect(da1.communication.VOut).to.not.equal(undefined); - expect(da1.communication.VState0).to.not.equal(undefined); - expect(da1.communication.VState1).to.not.equal(undefined); - expect(da1.communication.VMan).to.not.equal(undefined); - expect(da1.communication.VRbk).to.not.equal(undefined); - expect(da1.communication.VFbk).to.not.equal(undefined); - expect(da1.defaultReadDataItem).equal(da1.communication.VOut); - expect(da1.defaultReadDataItemType).to.equal('boolean'); - expect(da1.defaultWriteDataItem).equal(da1.communication.VMan); - expect(da1.defaultWriteDataItemType).to.equal('boolean'); + + const dataAssemblyController = new BinMan(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController.communication.VOut).to.not.equal(undefined); + expect(dataAssemblyController.communication.VState0).to.not.equal(undefined); + expect(dataAssemblyController.communication.VState1).to.not.equal(undefined); + expect(dataAssemblyController.communication.VMan).to.not.equal(undefined); + expect(dataAssemblyController.communication.VRbk).to.not.equal(undefined); + expect(dataAssemblyController.communication.VFbk).to.not.equal(undefined); + + expect(dataAssemblyController.defaultReadDataItem).equal(dataAssemblyController.communication.VOut); + expect(dataAssemblyController.defaultReadDataItemType).to.equal('boolean'); + expect(dataAssemblyController.defaultWriteDataItem).equal(dataAssemblyController.communication.VMan); + expect(dataAssemblyController.defaultWriteDataItemType).to.equal('boolean'); }); }); describe('dynamic', () => { @@ -70,12 +68,11 @@ describe('BinMan', () => { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new BinManMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const binManMockup = new BinManMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = binManMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -86,28 +83,19 @@ describe('BinMan', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - //TODO new BinMan() - - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as BinMan; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.OSLevel.value).to.equal(0); + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as BinMan; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); - expect(da1.communication.VOut.value).to.equal(false); - expect(da1.communication.VMan.value).to.equal(false); - expect(da1.communication.VRbk.value).to.equal(false); - expect(da1.communication.VFbk.value).to.equal(false); - expect(da1.communication.VState0.value).to.equal('off'); - expect(da1.communication.VState1.value).to.equal('on'); + expect(dataAssemblyController.communication.OSLevel.value).to.equal(0); + expect(dataAssemblyController.communication.VOut.value).to.equal(false); + expect(dataAssemblyController.communication.VMan.value).to.equal(false); + expect(dataAssemblyController.communication.VRbk.value).to.equal(false); + expect(dataAssemblyController.communication.VFbk.value).to.equal(false); + expect(dataAssemblyController.communication.VState0.value).to.equal('off'); + expect(dataAssemblyController.communication.VState1.value).to.equal('on'); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.ts index cac1a9c7..709db3cc 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinMan.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,31 +24,32 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; +import {OpcUaConnection, DataItem} from '../../../../connection'; import {OperationElement, OperationElementRuntime} from '../../OperationElement'; export type BinManRuntime = OperationElementRuntime & { - VMan: OpcUaDataItem; - VRbk: OpcUaDataItem; - VFbk: OpcUaDataItem; - VOut: OpcUaDataItem; - VState0: OpcUaDataItem; - VState1: OpcUaDataItem; + VMan: DataItem; + VRbk: DataItem; + VFbk: DataItem; + VOut: DataItem; + VState0: DataItem; + VState1: DataItem; }; export class BinMan extends OperationElement { - public readonly communication!: BinManRuntime; + public communication!: BinManRuntime; constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.VMan = this.createDataItem('VMan', 'write', 'boolean'); - this.communication.VRbk = this.createDataItem('VRbk', 'read', 'boolean'); - this.communication.VFbk = this.createDataItem('VFbk', 'read', 'boolean'); - this.communication.VOut = this.createDataItem('VOut', 'read', 'boolean'); - this.communication.VState0 = this.createDataItem('VState0', 'read', 'string'); - this.communication.VState1 = this.createDataItem('VState1', 'read', 'string'); + this.communication.VMan = this.createDataItem('VMan', 'boolean', 'write'); + this.communication.VRbk = this.createDataItem('VRbk', 'boolean'); + this.communication.VFbk = this.createDataItem('VFbk', 'boolean'); + + this.communication.VOut = this.createDataItem('VOut', 'boolean'); + this.communication.VState0 = this.createDataItem('VState0', 'string'); + this.communication.VState1 = this.createDataItem('VState1', 'string'); this.defaultReadDataItem = this.communication.VOut; this.defaultReadDataItemType = 'boolean'; diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.mockup.spec.ts deleted file mode 100644 index cbc03d82..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.mockup.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../../_utils'; -import {BinManIntMockup} from './BinManInt.mockup'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('BinManIntMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - afterEach(async () => { - - }); - - it('should create BinManIntMockup', async () => { - const mockup= new BinManIntMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - //TODO: test more - }); - - it('getBinManIntMockupReferenceJSON()', () => { - const mockup = new BinManIntMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getBinManIntMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(16); - //TODO: test more - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.mockup.ts deleted file mode 100644 index 1a42f472..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.mockup.ts +++ /dev/null @@ -1,93 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -// eslint-disable-next-line no-undef -import Timeout = NodeJS.Timeout; -import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; - -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../../_extensions/unitDA/UnitDA.mockup'; -import { - getScaleSettingDAMockupReferenceJSON, - ScaleSettingDAMockup -} from '../../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; -import { - getValueLimitationDAMockupReferenceJSON, - ValueLimitationDAMockup -} from '../../../_extensions/valueLimitationDA/ValueLimitationDA.mockup'; -import { - getSourceModeDAMockupReferenceJSON, - SourceModeDAMockup -} from '../../../_extensions/sourceModeDA/SourceModeDA.mockup'; -import {BinManMockup, getBinManMockupReferenceJSON} from './BinMan.mockup'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; - -export function getBinManIntMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - - return ({ - ...getBinManMockupReferenceJSON(namespace, objectBrowseName), - ...getWQCDAMockupReferenceJSON(namespace, objectBrowseName), - ...getSourceModeDAMockupReferenceJSON(namespace,objectBrowseName), - VInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VInt`, - dataType: 'Boolean' - } - } - ); -} - -export class BinManIntMockup extends BinManMockup { - protected vInt = false; - public readonly wqc: WQCDAMockup; - public readonly sourceMode: SourceModeDAMockup; - - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - super(namespace, rootNode, variableName); - - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); - this.sourceMode = new SourceModeDAMockup(namespace, this.mockupNode, this.name); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.VInt`, - browseName: `${variableName}.VInt`, - dataType: DataType.Boolean, - value: { - get: (): Variant => { - return new Variant({dataType: DataType.Boolean, value: this.vInt}); - }, - }, - }); - } - - public getBinManIntMockupJSON() { - return getBinManIntMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); - } -} diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.puml deleted file mode 100644 index 9acae00f..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.puml +++ /dev/null @@ -1,20 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -!include ../../../_extensions/sourceModeDA/SourceModeController.puml -!include ../../../_extensions/wqcDA/WQC.puml -class BinManInt{ - + readonly communication!: BinManIntRuntime - + readonly sourceMode: SourceModeController - + readonly wqc: WQC -} - -BinManInt *- BinManIntSpec -BinManIntSpec ..> BinManIntMockup : <> -BinManInt *- BinManIntMockup - -BinManInt *- BinManIntRuntime -BinManInt *- WQC -BinManInt *- SourceModeController - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.spec.ts deleted file mode 100644 index 50166ab3..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.spec.ts +++ /dev/null @@ -1,116 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../../connection'; -import {BinManInt} from './BinManInt'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/binmanint.json'; -import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; -import {MockupServer} from '../../../../../_utils'; -import {BinManIntMockup} from '../BinMan/BinManInt.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('BinManInt', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/BinManInt', - dataItems: baseDataAssemblyOptions - }; - - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create BinManInt', () => { - const da1: BinManInt = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as BinManInt; - expect(da1.sourceMode).to.be.not.undefined; - expect(da1.communication.VInt).to.not.equal(undefined); - expect(da1.wqc).to.not.equal(undefined); - //rest is tested in BinMan - }); - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockup = new BinManIntMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as BinManInt; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.OSLevel.value).to.equal(0); - - expect(da1.communication.VOut.value).to.equal(false); - expect(da1.communication.VMan.value).to.equal(false); - expect(da1.communication.VRbk.value).to.equal(false); - expect(da1.communication.VFbk.value).to.equal(false); - expect(da1.communication.VState0.value).to.equal('off'); - expect(da1.communication.VState1.value).to.equal('on'); - - expect(da1.communication.WQC.value).to.equal(0); - expect(da1.communication.VInt.value).to.equal(false); - expect(da1.communication.VMan.value).to.equal(false); - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcManAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcManOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcManAct.value).equal(false); - }).timeout(4000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.mockup.spec.ts new file mode 100644 index 00000000..35d3caaf --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.mockup.spec.ts @@ -0,0 +1,69 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../../../_utils'; +import {BinManIntMockup, getBinManIntDataItemOptions, getBinManIntOptions} from './BinManInt.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {BinManIntRuntime} from './BinManInt'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('BinManIntMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create BinManIntMockup', async () => { + const mockup= new BinManIntMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getBinManIntDataItemOptions(1, 'Test') as BinManIntRuntime; + expect(Object.keys(options).length).to.equal(16); + }); + + it('static DataAssemblyOptions', () => { + const options = getBinManIntOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(18); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new BinManIntMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(18); + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.mockup.ts new file mode 100644 index 00000000..04a5f2a9 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.mockup.ts @@ -0,0 +1,106 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; + +import { + getSourceModeDataItemOptions, + SourceModeMockup +} from '../../../../baseFunction/sourceMode/SourceMode.mockup'; +import {BinManMockup, getBinManDataItemOptions} from '../BinMan.mockup'; +import {getWQCDataItemOptions, WQCMockup} from '../../../../baseFunction/wqc/WQC.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement/BinMan/BinManInt'; + +function getBinManIntSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + VInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VInt`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} + +export function getBinManIntDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getBinManDataItemOptions(namespace, objectBrowseName), + ...getWQCDataItemOptions(namespace, objectBrowseName), + ...getSourceModeDataItemOptions(namespace, objectBrowseName), + ...getBinManIntSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions + ); +} + +export function getBinManIntOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinManIntDataItemOptions(namespace, objectBrowseName)}; + return options; +} + + +export class BinManIntMockup extends BinManMockup { + protected vInt = false; + public readonly wqc: WQCMockup; + public readonly sourceMode: SourceModeMockup; + + constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); + + this.wqc = new WQCMockup(namespace, this.mockupNode, this.name); + this.sourceMode = new SourceModeMockup(namespace, this.mockupNode, this.name); + + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.VInt`, + browseName: `${variableName}.VInt`, + dataType: DataType.Boolean, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Boolean, value: this.vInt}); + }, + }, + }); + } + + + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.wqc.getDataItemOptions(), + ...this.sourceMode.getDataItemOptions(), + ...getBinManIntSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; + } +} diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.puml new file mode 100644 index 00000000..2c106364 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.puml @@ -0,0 +1,45 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +!include ../../../_extensions/sourceMode/SourceModeController.puml +!include ../../../_extensions/wqc/WQC.puml +class BinManInt{ + + readonly communication!: BinManIntRuntime + + readonly sourceMode: SourceModeController + + readonly wqc: WQC +} + +BinManInt *- BinManIntSpec +BinManIntSpec ..> BinManIntMockup : <> +BinManInt *- BinManIntMockup + +BinManInt *- BinManIntRuntime +BinManInt *- WQC +BinManInt *- SourceModeController + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.spec.ts new file mode 100644 index 00000000..b8572c51 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.spec.ts @@ -0,0 +1,103 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../../connection'; +import {BinManInt} from './BinManInt'; +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {DataAssemblyControllerFactory} from '../../../../DataAssemblyControllerFactory'; +import {MockupServer} from '../../../../../../_utils'; +import {BinManIntMockup, getBinManIntOptions} from './BinManInt.mockup'; + + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('BinManInt', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getBinManIntOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create BinManInt', () => { + const dataAssemblyController: BinManInt = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as BinManInt; + expect(dataAssemblyController.sourceMode).to.be.not.undefined; + expect(dataAssemblyController.communication.VInt).to.not.equal(undefined); + expect(dataAssemblyController.wqc).to.not.equal(undefined); + }); + }); + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const binManIntMockup = new BinManIntMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = binManIntMockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as BinManInt; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.OSLevel.value).to.equal(0); + expect(dataAssemblyController.communication.VOut.value).to.equal(false); + expect(dataAssemblyController.communication.VMan.value).to.equal(false); + expect(dataAssemblyController.communication.VRbk.value).to.equal(false); + expect(dataAssemblyController.communication.VFbk.value).to.equal(false); + expect(dataAssemblyController.communication.VState0.value).to.equal('off'); + expect(dataAssemblyController.communication.VState1.value).to.equal('on'); + expect(dataAssemblyController.communication.WQC.value).to.equal(0); + expect(dataAssemblyController.communication.VInt.value).to.equal(false); + expect(dataAssemblyController.communication.VMan.value).to.equal(false); + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcManAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcManOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcManAct.value).equal(false); + }).timeout(4000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.ts similarity index 76% rename from src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.ts rename to src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.ts index 19d01b9a..15dbaf22 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/BinManInt.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/binMan/binManInt/BinManInt.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,19 +24,17 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; -import {SourceModeRuntime, WQCRuntime} from '../../../_extensions'; -import {BinMan, BinManRuntime} from './BinMan'; -import {SourceModeController} from '../../../_extensions/sourceModeDA/SourceModeController'; -import {WQC} from '../../../_extensions/wqcDA/WQC'; +import {OpcUaConnection, DataItem} from '../../../../../connection'; +import {SourceModeController, SourceModeRuntime, WQC, WQCRuntime} from '../../../../baseFunction'; +import {BinMan, BinManRuntime} from '../BinMan'; export type BinManIntRuntime = BinManRuntime & SourceModeRuntime & WQCRuntime & { - VInt: OpcUaDataItem; + VInt: DataItem; }; export class BinManInt extends BinMan { - public readonly communication!: BinManIntRuntime; + public communication!: BinManIntRuntime; public readonly sourceMode: SourceModeController; public readonly wqc: WQC; @@ -46,7 +43,7 @@ export class BinManInt extends BinMan { this.wqc = new WQC(this); - this.communication.VInt = this.createDataItem('VInt', 'read'); + this.communication.VInt = this.createDataItem('VInt', 'boolean'); this.sourceMode = new SourceModeController(this); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.mockup.spec.ts index 441c9ac7..f438b9c2 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.mockup.spec.ts @@ -1,52 +1,77 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; import {MockupServer} from '../../../../../_utils'; -import {DIntManMockup} from './DIntMan.mockup'; +import {DIntManMockup, getDIntManDataItemOptions, getDIntManOptions} from './DIntMan.mockup'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {DIntManRuntime} from './DIntMan'; chai.use(chaiAsPromised); const expect = chai.expect; -// this fake class is needed to test the protected variable -class FakeClass extends DIntManMockup{ - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - super(namespace, rootNode, variableName); - } - public getVOut(){ - return this.vOut; - } -} - describe('DIntManMockup', () => { - describe('', () => { - let mockupServer: any; + + describe('static', () => { + + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); - afterEach(async () => { - }); it('should create DIntManMockup', async () => { - const mockup= new DIntManMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new DIntManMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + it('static DataItemOptions', () => { + const options = getDIntManDataItemOptions(1, 'Test') as DIntManRuntime; + expect(Object.keys(options).length).to.equal(10); }); - it('getDIntManMockupReferenceJSON(namespace, objectBrowseName)', () => { - const mockup = new DIntManMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getDIntManMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(10); - //TODO: test more + + it('static DataAssemblyOptions', () => { + const options = getDIntManOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(12); }); - it('startCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + + it('dynamic DataAssemblyOptions', () => { + const mockup = new DIntManMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(12); + }); + + // TODO + /*it('startCurrentTimeUpdate()', async() => { + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); expect(mockup.getVOut()).to.equal(0); await new Promise(f => setTimeout(f, 1000)); @@ -54,8 +79,8 @@ describe('DIntManMockup', () => { }); it('stopCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); mockup.stopCurrentTimeUpdate(); expect(mockup.getVOut()).to.equal(0); @@ -65,24 +90,24 @@ describe('DIntManMockup', () => { }); it('stopCurrentTimeUpdate(), interval undefined', () => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; expect((() => mockup.stopCurrentTimeUpdate())).to.throw(); - }); + });*/ }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: DIntManMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new DIntManMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new DIntManMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -92,11 +117,9 @@ describe('DIntManMockup', () => { }); it('set and get VMan', async () => { - await connection.writeOpcUaNode('Variable.VMan', namespaceUrl, 1, 'Int32'); - await connection.readOpcUaNode('Variable.VMan', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); + await connection.writeNode('Variable.VMan', mockupServer.nameSpaceUri, 1, 'Int32'); + await connection.readNode('Variable.VMan', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); }).timeout(3000); - - //TODO get the rest }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.mockup.ts index f17af08d..858b7c9f 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.mockup.ts @@ -27,78 +27,87 @@ import Timeout = NodeJS.Timeout; import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../../_extensions/unitDA/UnitDA.mockup'; +import { getUnitSettingsDataItemOptions, UnitSettingsMockup} from '../../../baseFunction/unitSettings/UnitSettings.mockup'; import { - getScaleSettingDAMockupReferenceJSON, - ScaleSettingDAMockup -} from '../../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; + getScaleSettingsDataItemOptions, + ScaleSettingMockup +} from '../../../baseFunction/scaleSettings/ScaleSetting.mockup'; import { - getValueLimitationDAMockupReferenceJSON, - ValueLimitationDAMockup -} from '../../../_extensions/valueLimitationDA/ValueLimitationDA.mockup'; + getValueLimitationDataItemOptions, + ValueLimitationMockup +} from '../../../baseFunction/valueLimitation/ValueLimitation.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getOperationElementDataItemOptions, OperationElementMockup} from '../../OperationElement.mockup'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getDIntManMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement/DIntMan'; +function getDIntManSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getOSLevelDAMockupReferenceJSON(namespace,objectBrowseName), - ...getScaleSettingDAMockupReferenceJSON(namespace,objectBrowseName,'Int32'), - ...getValueLimitationDAMockupReferenceJSON(namespace,objectBrowseName, 'Int32'), - ...getUnitDAMockupReferenceJSON(namespace,objectBrowseName), - VOut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VOut`, - dataType: 'Int32' - }, - VMan: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VMan`, - dataType: 'Int32' - }, - VRbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VRbk`, - dataType: 'Int32' - }, + VOut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VOut`, + dataType: 'Int32' + } as OpcUaNodeOptions, + VMan: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VMan`, + dataType: 'Int32' + } as OpcUaNodeOptions, + VRbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VRbk`, + dataType: 'Int32' + } as OpcUaNodeOptions, - VFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VFbk`, - dataType: 'Int32' - } - } + VFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VFbk`, + dataType: 'Int32' + } as OpcUaNodeOptions + }); +} + +export function getDIntManDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getOperationElementDataItemOptions(namespace, objectBrowseName), + ...getScaleSettingsDataItemOptions(namespace, objectBrowseName, 'DInt'), + ...getValueLimitationDataItemOptions(namespace, objectBrowseName, 'DInt'), + ...getUnitSettingsDataItemOptions(namespace, objectBrowseName), + ...getDIntManSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } -export class DIntManMockup { - public readonly name: string; +export function getDIntManOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getDIntManDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class DIntManMockup extends OperationElementMockup { + protected vRbk = 0; protected vMan = 0; protected vOut = 0; protected vFbk = 0; - - public readonly osLevel: OSLevelDAMockup; - public readonly scaleSettings: ScaleSettingDAMockup; - public readonly valueLimitation: ValueLimitationDAMockup; - public readonly unit: UnitDAMockup; + + public readonly scaleSettings: ScaleSettingMockup<'DInt'>; + public readonly valueLimitation: ValueLimitationMockup<'DInt'>; + public readonly unit: UnitSettingsMockup; + protected interval: Timeout | undefined; - protected mockupNode: UAObject; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); - this.name = variableName; - - this.mockupNode = namespace.addObject({ - organizedBy: rootNode, - browseName: variableName - }); - - this.osLevel = new OSLevelDAMockup(namespace, this.mockupNode, this.name); - this.scaleSettings = new ScaleSettingDAMockup(namespace, this.mockupNode, this.name, DataType.Int32); - this.valueLimitation = new ValueLimitationDAMockup(namespace, this.mockupNode, this.name,DataType.Int32); - this.unit = new UnitDAMockup(namespace, this.mockupNode, this.name); + this.scaleSettings = new ScaleSettingMockup(namespace, this.mockupNode, this.name, 'DInt'); + this.valueLimitation = new ValueLimitationMockup(namespace, this.mockupNode, this.name, 'DInt'); + this.unit = new UnitSettingsMockup(namespace, this.mockupNode, this.name); namespace.addVariable({ componentOf: this.mockupNode, @@ -150,10 +159,17 @@ export class DIntManMockup { }); } - public getDIntManMockupJSON() { - return getDIntManMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.scaleSettings.getDataItemOptions(), + ...this.valueLimitation.getDataItemOptions(), + ...this.unit.getDataItemOptions(), + ...getDIntManSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } public startCurrentTimeUpdate(): void { diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.puml index 091159dc..64125d8f 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.puml +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.puml @@ -1,9 +1,34 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include DIntManInt.puml -!include ../../../_extensions/scaleSettingsDA/ScaleSettings.puml -!include ../../../_extensions/unitDA/UnitSettings.puml -!include ../../../_extensions/valueLimitationDA/ValueLimitation.puml +!include DIntManInt/DIntManInt.puml +!include ../../../_extensions/scaleSettings/ScaleSettings.puml +!include ../../../_extensions/unit/UnitSettings.puml +!include ../../../_extensions/valueLimitation/ValueLimitation.puml class DIntMan{ + readonly communication!: DIntManRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.spec.ts index 6c589685..7c9139d5 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.spec.ts @@ -28,41 +28,39 @@ import {DIntMan} from './DIntMan'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/dintmanint.json'; import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; import {MockupServer} from '../../../../../_utils'; -import {DIntManMockup} from '../DIntMan/DIntMan.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DIntManMockup, getDIntManOptions} from './DIntMan.mockup'; + chai.use(chaiAsPromised); const expect = chai.expect; describe('DIntMan', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/DIntMan', - dataItems: baseDataAssemblyOptions - }; - - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getDIntManOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create DIntMan', () => { - const da1: DIntMan = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as DIntMan; - expect(da1.communication.VOut).to.not.equal(undefined); - expect(da1.scaleSettings).to.not.be.undefined; - expect(da1.unitSettings).to.not.be.undefined; - expect(da1.valueLimitation).to.not.be.undefined; + const dataAssemblyController: DIntMan = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as DIntMan; + expect(dataAssemblyController.communication.VOut).to.not.equal(undefined); + expect(dataAssemblyController.scaleSettings).to.not.be.undefined; + expect(dataAssemblyController.unitSettings).to.not.be.undefined; + expect(dataAssemblyController.valueLimitation).to.not.be.undefined; - expect(da1.communication.VMan).to.not.equal(undefined); - expect(da1.communication.VRbk).to.not.equal(undefined); - expect(da1.communication.VFbk).to.not.equal(undefined); + expect(dataAssemblyController.communication.VMan).to.not.equal(undefined); + expect(dataAssemblyController.communication.VRbk).to.not.equal(undefined); + expect(dataAssemblyController.communication.VFbk).to.not.equal(undefined); - expect(da1.defaultReadDataItem).equal(da1.communication.VOut); - expect(da1.defaultReadDataItemType).to.equal('number'); - expect(da1.defaultWriteDataItem).equal(da1.communication.VMan); - expect(da1.defaultWriteDataItemType).to.equal('number'); + expect(dataAssemblyController.defaultReadDataItem).equal(dataAssemblyController.communication.VOut); + expect(dataAssemblyController.defaultReadDataItemType).to.equal('number'); + expect(dataAssemblyController.defaultWriteDataItem).equal(dataAssemblyController.communication.VMan); + expect(dataAssemblyController.defaultWriteDataItemType).to.equal('number'); }); }); describe('dynamic', () => { @@ -73,12 +71,10 @@ describe('DIntMan', () => { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new DIntManMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + const dIntManMockup = new DIntManMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = dIntManMockup.getDataAssemblyOptions();await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -89,31 +85,22 @@ describe('DIntMan', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as DIntMan; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.OSLevel.value).to.equal(0); - - expect(da1.communication.VOut.value).to.equal(0); - expect(da1.communication.VMan.value).to.equal(0); - expect(da1.communication.VRbk.value).to.equal(0); - expect(da1.communication.VFbk.value).to.equal(0); - - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(0); - - expect(da1.communication.VMin.value).equal(0); - expect(da1.communication.VMax.value).equal(0); + + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as DIntMan; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.OSLevel.value).to.equal(0); + expect(dataAssemblyController.communication.VOut.value).to.equal(0); + expect(dataAssemblyController.communication.VMan.value).to.equal(0); + expect(dataAssemblyController.communication.VRbk.value).to.equal(0); + expect(dataAssemblyController.communication.VFbk.value).to.equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(0); + expect(dataAssemblyController.communication.VMin.value).equal(0); + expect(dataAssemblyController.communication.VMax.value).equal(0); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.ts index 23621bff..2dc784d1 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntMan.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,24 +24,22 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; +import {OpcUaConnection, DataItem} from '../../../../connection'; import { - ScaleSettingsRuntime, - UnitDataAssemblyRuntime, UnitSettings, - ValueLimitationRuntime -} from '../../../_extensions'; + ScaleSettings, ScaleSettingsRuntime, + UnitSettingsRuntime, UnitSettings, + ValueLimitation, ValueLimitationRuntime +} from '../../../baseFunction'; import {OperationElement, OperationElementRuntime} from '../../OperationElement'; -import {ValueLimitation} from '../../../_extensions/valueLimitationDA/ValueLimitation'; -import {ScaleSettings} from '../../../_extensions/scaleSettingsDA/ScaleSettings'; export type DIntManRuntime = - OperationElementRuntime & UnitDataAssemblyRuntime + OperationElementRuntime & UnitSettingsRuntime & ValueLimitationRuntime & ScaleSettingsRuntime & { - VOut: OpcUaDataItem; - VRbk: OpcUaDataItem; - VFbk: OpcUaDataItem; - VMan: OpcUaDataItem; + VOut: DataItem; + VRbk: DataItem; + VFbk: DataItem; + VMan: DataItem; }; export class DIntMan extends OperationElement { @@ -53,10 +50,10 @@ export class DIntMan extends OperationElement { constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.VOut = this.createDataItem('VOut', 'read'); - this.communication.VRbk = this.createDataItem('VRbk', 'read'); - this.communication.VFbk = this.createDataItem('VFbk', 'read'); - this.communication.VMan = this.createDataItem('VMan', 'write'); + this.communication.VOut = this.createDataItem('VOut', 'number'); + this.communication.VRbk = this.createDataItem('VRbk','number'); + this.communication.VFbk = this.createDataItem('VFbk','number'); + this.communication.VMan = this.createDataItem('VMan','number', 'write'); this.valueLimitation = new ValueLimitation(this); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.mockup.spec.ts deleted file mode 100644 index e1c8f671..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.mockup.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {MockupServer} from '../../../../../_utils'; -import {DIntManIntMockup} from './DIntManInt.mockup'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('DIntManIntMockup', () => { - describe('', () => { - let mockupServer: any; - beforeEach(async()=>{ - mockupServer = new MockupServer(); - await mockupServer.initialize(); - }); - afterEach(async () => { - - }); - it('should create DIntManIntMockup', async () => { - const mockup= new DIntManIntMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - expect(mockup).to.not.be.undefined; - //TODO: test more - - }); - it('getDIntManIntMockupReferenceJSON()', () => { - const mockup = new DIntManIntMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getDIntManIntMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to.equal(19); - //TODO: test more - }); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.mockup.ts deleted file mode 100644 index 97abb291..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.mockup.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -// eslint-disable-next-line no-undef -import Timeout = NodeJS.Timeout; -import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; - -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../../_extensions/unitDA/UnitDA.mockup'; -import { - getScaleSettingDAMockupReferenceJSON, - ScaleSettingDAMockup -} from '../../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; -import { - getValueLimitationDAMockupReferenceJSON, - ValueLimitationDAMockup -} from '../../../_extensions/valueLimitationDA/ValueLimitationDA.mockup'; -import { - getSourceModeDAMockupReferenceJSON, - SourceModeDAMockup -} from '../../../_extensions/sourceModeDA/SourceModeDA.mockup'; -import {DIntManMockup, getDIntManMockupReferenceJSON} from './DIntMan.mockup'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; - -export function getDIntManIntMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { - - return ({ - ...getDIntManMockupReferenceJSON(namespace, objectBrowseName), - ...getWQCDAMockupReferenceJSON(namespace, objectBrowseName), - ...getSourceModeDAMockupReferenceJSON(namespace,objectBrowseName), - VInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VInt`, - dataType: 'Boolean' - } - } - ); -} - -export class DIntManIntMockup extends DIntManMockup { - - protected vInt = 0; - public readonly wqc: WQCDAMockup; - public readonly sourceMode: SourceModeDAMockup; - - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - super(namespace, rootNode, variableName); - - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); - this.sourceMode = new SourceModeDAMockup(namespace, this.mockupNode, this.name); - - namespace.addVariable({ - componentOf: this.mockupNode, - nodeId: `ns=${namespace.index};s=${variableName}.VInt`, - browseName: `${variableName}.VInt`, - dataType: DataType.Int32, - value: { - get: (): Variant => { - return new Variant({dataType: DataType.Int32, value: this.vInt}); - }, - }, - }); - } - - public getDIntManIntMockupJSON() { - return getDIntManIntMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); - } - -} diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.puml deleted file mode 100644 index b9b96e8a..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.puml +++ /dev/null @@ -1,20 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -!include ../../../_extensions/sourceModeDA/SourceModeController.puml -!include ../../../_extensions/wqcDA/WQC.puml -class DIntManInt{ - + readonly communication!: DIntManIntRuntime - + readonly sourceMode: SourceModeController - + readonly wqc: WQC -} - -DIntManInt *- DIntManIntSpec -DIntManIntSpec ..> DIntManIntMockup : <> -DIntManInt *- DIntManIntMockup - -DIntManInt *- DIntManIntRuntime -DIntManInt *- WQC -DIntManInt *- SourceModeController - -@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.spec.ts deleted file mode 100644 index fc5644e8..00000000 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.spec.ts +++ /dev/null @@ -1,121 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021 P2O-Lab , - * Chair for Process Control Systems, Technische Universität Dresden - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import {OpcUaConnection} from '../../../../connection'; -import {DIntManInt} from './DIntManInt'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/dintmanint.json'; -import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; -import {MockupServer} from '../../../../../_utils'; -import {DIntManIntMockup} from '../DIntMan/DIntManInt.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('DIntManInt', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/DIntManInt', - dataItems: baseDataAssemblyOptions - }; - - describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); - it('should create DIntManInt', () => { - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as DIntManInt; - expect(da1.sourceMode).to.be.not.undefined; - expect(da1.communication.VInt).to.not.equal(undefined); - expect(da1.wqc).to.not.equal(undefined); - //rest is tested in DIntMan - }); - }); - describe('dynamic', () => { - let mockupServer: MockupServer; - let connection: OpcUaConnection; - - beforeEach(async function () { - this.timeout(4000); - mockupServer = new MockupServer(); - await mockupServer.initialize(); - const mockup = new DIntManIntMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); - await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); - await connection.connect(); - }); - - afterEach(async function () { - this.timeout(4000); - await connection.disconnect(); - await mockupServer.shutdown(); - }); - - it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as DIntManInt; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - - expect(da1.communication.OSLevel.value).to.equal(0); - - expect(da1.communication.VOut.value).to.equal(0); - expect(da1.communication.VMan.value).to.equal(0); - expect(da1.communication.VRbk.value).to.equal(0); - expect(da1.communication.VFbk.value).to.equal(0); - - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(0); - - expect(da1.communication.VMin.value).equal(0); - expect(da1.communication.VMax.value).equal(0); - - expect(da1.communication.WQC.value).to.equal(0); - expect(da1.communication.VInt.value).to.equal(0); - expect(da1.communication.VMan.value).to.equal(0); - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcManAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcManOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcManAct.value).equal(false); - }).timeout(4000); - }); -}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.mockup.spec.ts new file mode 100644 index 00000000..a71480f3 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.mockup.spec.ts @@ -0,0 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../../../../_utils'; +import {DIntManIntMockup, getDIntManIntDataItemOptions, getDIntManIntOptions} from './DIntManInt.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {DIntManIntRuntime} from './DIntManInt'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('DIntManIntMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create DIntManIntMockup', async () => { + const mockup= new DIntManIntMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + }); + + it('static DataItemOptions', () => { + const options = getDIntManIntDataItemOptions(1, 'Test') as DIntManIntRuntime; + expect(Object.keys(options).length).to.equal(19); + }); + + it('static DataAssemblyOptions', () => { + const options = getDIntManIntOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(21); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new DIntManIntMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(21); + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.mockup.ts new file mode 100644 index 00000000..09047d8e --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.mockup.ts @@ -0,0 +1,106 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; +import { + getSourceModeDataItemOptions, + SourceModeMockup +} from '../../../../baseFunction/sourceMode/SourceMode.mockup'; +import {DIntManMockup, getDIntManDataItemOptions} from '../DIntMan.mockup'; +import {getWQCDataItemOptions, WQCMockup} from '../../../../baseFunction/wqc/WQC.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; + + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement/DIntMan/DIntManInt'; + +function getDIntManIntSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + VInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VInt`, + dataType: 'Int32' + } as OpcUaNodeOptions + }); +} + +export function getDIntManIntDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getDIntManDataItemOptions(namespace, objectBrowseName), + ...getWQCDataItemOptions(namespace, objectBrowseName), + ...getSourceModeDataItemOptions(namespace, objectBrowseName), + ...getDIntManIntSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions + ); +} + +export function getDIntManIntOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getDIntManIntDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class DIntManIntMockup extends DIntManMockup { + + protected vInt = 0; + public readonly wqc: WQCMockup; + public readonly sourceMode: SourceModeMockup; + + constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); + + this.wqc = new WQCMockup(namespace, this.mockupNode, this.name); + this.sourceMode = new SourceModeMockup(namespace, this.mockupNode, this.name); + + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.VInt`, + browseName: `${variableName}.VInt`, + dataType: DataType.Int32, + value: { + get: (): Variant => { + return new Variant({dataType: DataType.Int32, value: this.vInt}); + }, + }, + }); + } + + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.wqc.getDataItemOptions(), + ...this.sourceMode.getDataItemOptions(), + ...getDIntManIntSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; + } + +} diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.puml new file mode 100644 index 00000000..81373b2d --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.puml @@ -0,0 +1,45 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram + +!include ../../../_extensions/sourceMode/SourceModeController.puml +!include ../../../_extensions/wqc/WQC.puml +class DIntManInt{ + + readonly communication!: DIntManIntRuntime + + readonly sourceMode: SourceModeController + + readonly wqc: WQC +} + +DIntManInt *- DIntManIntSpec +DIntManIntSpec ..> DIntManIntMockup : <> +DIntManInt *- DIntManIntMockup + +DIntManInt *- DIntManIntRuntime +DIntManInt *- WQC +DIntManInt *- SourceModeController + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.spec.ts new file mode 100644 index 00000000..a915fba5 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.spec.ts @@ -0,0 +1,108 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {OpcUaConnection} from '../../../../../connection'; +import {DIntManInt} from './DIntManInt'; +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {DataAssemblyControllerFactory} from '../../../../DataAssemblyControllerFactory'; +import {MockupServer} from '../../../../../../_utils'; +import {DIntManIntMockup, getDIntManIntOptions} from './DIntManInt.mockup'; + + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('DIntManInt', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getDIntManIntOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create DIntManInt', () => { + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as DIntManInt; + expect(dataAssemblyController.sourceMode).to.be.not.undefined; + expect(dataAssemblyController.communication.VInt).to.not.equal(undefined); + expect(dataAssemblyController.wqc).to.not.equal(undefined); + }); + }); + + describe('dynamic', () => { + + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const dIntManIntMockup = new DIntManIntMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = dIntManIntMockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as DIntManInt; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.OSLevel.value).to.equal(0); + expect(dataAssemblyController.communication.VOut.value).to.equal(0); + expect(dataAssemblyController.communication.VMan.value).to.equal(0); + expect(dataAssemblyController.communication.VRbk.value).to.equal(0); + expect(dataAssemblyController.communication.VFbk.value).to.equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(0); + expect(dataAssemblyController.communication.VMin.value).equal(0); + expect(dataAssemblyController.communication.VMax.value).equal(0); + expect(dataAssemblyController.communication.WQC.value).to.equal(0); + expect(dataAssemblyController.communication.VInt.value).to.equal(0); + expect(dataAssemblyController.communication.VMan.value).to.equal(0); + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcManAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcManOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcManAct.value).equal(false); + }).timeout(4000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.ts similarity index 78% rename from src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.ts rename to src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.ts index 03e2248e..a6a0c5c7 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/dintMan/DIntManInt/DIntManInt.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * @@ -25,14 +24,15 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {SourceModeRuntime, WQCRuntime} from '../../../_extensions'; -import {DIntMan, DIntManRuntime} from './DIntMan'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; -import {SourceModeController} from '../../../_extensions/sourceModeDA/SourceModeController'; -import {WQC} from '../../../_extensions/wqcDA/WQC'; +import { + SourceModeController, SourceModeRuntime, + WQC, WQCRuntime +} from '../../../../baseFunction'; +import {DIntMan, DIntManRuntime} from '../DIntMan'; +import {OpcUaConnection, DataItem} from '../../../../../connection'; export type DIntManIntRuntime = DIntManRuntime & SourceModeRuntime & WQCRuntime & { - VInt: OpcUaDataItem; + VInt: DataItem; }; export class DIntManInt extends DIntMan { @@ -45,9 +45,8 @@ export class DIntManInt extends DIntMan { super(options, connection); this.sourceMode = new SourceModeController(this); - this.wqc = new WQC(this); - this.communication.VInt = this.createDataItem('VInt', 'read'); + this.communication.VInt = this.createDataItem('VInt', 'number'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/man/index.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/man/index.ts index a4d165e8..7e136c59 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/man/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/man/index.ts @@ -1,6 +1,32 @@ -export * from './anaMan/AnaMan'; -export * from './anaMan/AnaManInt'; +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +export * from './anaMan/anaManInt/AnaManInt'; export * from './binMan/BinMan'; -export * from './binMan/BinManInt'; +export * from './binMan/binManInt/BinManInt'; export * from './dintMan/DIntMan'; -export * from './dintMan/DIntManInt'; +export * from './dintMan/DIntManInt/DIntManInt'; +export * from './anaMan/AnaMan'; diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.mockup.spec.ts index d6322384..0af6b8a3 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.mockup.spec.ts @@ -1,36 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; import {MockupServer} from '../../../../_utils'; -import {ServParamMockup} from './ServParam.mockup'; +import {getServParamDataItemOptions, getServParamOptions, ServParamMockup} from './ServParam.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {ServParamRuntime} from './ServParam'; chai.use(chaiAsPromised); const expect = chai.expect; describe('ServParamMockup', () => { - describe('', () => { + + describe('static', () => { + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); - afterEach(async () => { - }); it('should create ServParamMockup', () => { - const mockup= new ServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new ServParamMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + it('static DataItemOptions', () => { + const options = getServParamDataItemOptions(1, 'Test') as ServParamRuntime; + expect(Object.keys(options).length).to.equal(20); }); - it('getServParamMockupReferenceJSON(namespace, objectBrowseName)', () => { - const mockup = new ServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getServParamMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to .equal(20); - //TODO: test more + + it('static DataAssemblyOptions', () => { + const options = getServParamOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(22); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new ServParamMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(22); }); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.mockup.ts index 7ef67941..cde21f6b 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.mockup.ts @@ -26,44 +26,61 @@ import {DataType, Namespace, UAObject, Variant} from 'node-opcua'; import { - getServiceSourceModeDAMockupReferenceJSON, ServiceSourceModeDAMockup -} from '../../_extensions/serviceSourceModeDA/ServiceSourceModeDA.mockup'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../_extensions/wqcDA/WQCDA.mockup'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../_extensions/opModeDA/OpModeDA.mockup'; -import {getOperationElementMockupReferenceJSON, OperationElementMockup} from '../OperationElement.mockup'; + getServiceSourceModeDataItemOptions, + ServiceSourceModeMockup +} from '../../baseFunction/serviceSourceMode/ServiceSourceMode.mockup'; +import {getWQCDataItemOptions, WQCMockup} from '../../baseFunction/wqc/WQC.mockup'; +import {getOpModeDataItemOptions, OpModeMockup} from '../../baseFunction/opMode/OpMode.mockup'; +import {getOperationElementDataItemOptions, OperationElementMockup} from '../OperationElement.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../DataAssemblyController.mockup'; +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement'; -export function getServParamMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getServParamSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + Sync: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Sync`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} +export function getServParamDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getOperationElementMockupReferenceJSON(namespace, objectBrowseName), - ...getOpModeDAMockupReferenceJSON(namespace,objectBrowseName), - ...getServiceSourceModeDAMockupReferenceJSON(namespace,objectBrowseName), - ...getWQCDAMockupReferenceJSON(namespace,objectBrowseName), - Sync: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Sync`, - dataType: 'Boolean' - } + ...getOperationElementDataItemOptions(namespace, objectBrowseName), + ...getWQCDataItemOptions(namespace, objectBrowseName), + ...getOpModeDataItemOptions(namespace, objectBrowseName), + ...getServiceSourceModeDataItemOptions(namespace, objectBrowseName), + ...getServParamSpecificDataItemOptions(namespace, objectBrowseName), } ); } +export function getServParamOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getServParamDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class ServParamMockup extends OperationElementMockup{ public readonly varSync: boolean = false; - protected opMode: OpModeDAMockup; - protected serviceSourceMode: ServiceSourceModeDAMockup; - protected wqc: WQCDAMockup; + protected opMode: OpModeMockup; + protected serviceSourceMode: ServiceSourceModeMockup; + protected wqc: WQCMockup; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { super(namespace, rootNode, variableName); - this.opMode = new OpModeDAMockup(namespace, this.mockupNode, this.name); - this.serviceSourceMode = new ServiceSourceModeDAMockup(namespace, this.mockupNode, this.name); - this.wqc = new WQCDAMockup(namespace, this.mockupNode, this.name); + this.wqc = new WQCMockup(namespace, this.mockupNode, this.name); + this.opMode = new OpModeMockup(namespace, this.mockupNode, this.name); + this.serviceSourceMode = new ServiceSourceModeMockup(namespace, this.mockupNode, this.name); namespace.addVariable({ componentOf: this.mockupNode, @@ -78,9 +95,16 @@ export class ServParamMockup extends OperationElementMockup{ }); } - public getServParamMockupJSON() { - return getServParamMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.wqc.getDataItemOptions(), + ...this.opMode.getDataItemOptions(), + ...this.serviceSourceMode.getDataItemOptions(), + ...getServParamSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } } diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.puml index 539eace9..8561a472 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.puml +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include anaServParam/AnaServParam.puml @@ -5,14 +30,14 @@ !include dIntServParam/DIntServParam.puml !include stringServParam/StringServParam.puml -!include ../../_extensions/serviceSourceModeDA/ServiceSourceModeController.puml -!include ../../_extensions/opModeDA/opModeController.puml -!include ../../_extensions/wqcDA/WQC.puml +!include ../../_extensions/serviceSourceMode/ServiceSourceModeController.puml +!include ../../_extensions/opMode/opModeController.puml +!include ../../_extensions/wqc/WQC.puml class ServParam{ + readonly communication!: ServParamRuntime + readonly serviceSourceMode: ServiceSourceModeController - + readonly serviceOpMode: OpModeController + + readonly serviceOpMode: OpMode + readonly wqc: WQC } @@ -22,7 +47,7 @@ ServParam *- ServParamMockup ServParam *- ServParamRuntime ServParam *- ServiceSourceModeController -ServParam *- OpModeController +ServParam *- OpMode ServParam *- WQC diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.spec.ts index cafbfe3e..8dc499c4 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.spec.ts @@ -28,33 +28,29 @@ import {OpcUaConnection} from '../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../tests/anaserveparam.json'; -import {DataAssemblyControllerFactory} from '../../DataAssemblyControllerFactory'; import {MockupServer} from '../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../tests/namespaceUrl'; -import {ServParam} from './ServParam'; -import {ServParamMockup} from './ServParam.mockup'; +import {ServParam} from './'; +import {getServParamOptions, ServParamMockup} from './ServParam.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('ServParam', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/StringServParam', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getServParamOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create ServParam', () => { - //TODO should be new ServParam, but circular dependency problem - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as ServParam; - expect(da1.serviceSourceMode).to.not.be.undefined; - expect(da1.serviceOpMode).to.not.be.undefined; - expect(da1.wqc).to.not.be.undefined; - expect(da1.communication.Sync).to.not.be.undefined; + const dataAssemblyController = new ServParam(dataAssemblyOptions, emptyOPCUAConnection) as ServParam; + expect(dataAssemblyController.serviceSourceMode).to.not.be.undefined; + expect(dataAssemblyController.serviceOpMode).to.not.be.undefined; + expect(dataAssemblyController.wqc).to.not.be.undefined; + expect(dataAssemblyController.communication.Sync).to.not.be.undefined; }); }); describe('dynamic', () => { @@ -65,12 +61,11 @@ describe('ServParam', () => { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new ServParamMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const servParamMockup = new ServParamMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = servParamMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -81,39 +76,31 @@ describe('ServParam', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1: ServParam = new ServParam(dataAssemblyOptions, connection); - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - - expect((da1).communication.StateChannel.value).equal(false); - expect((da1).communication.StateOffAut.value).equal(false); - expect((da1).communication.StateOpAut.value).equal(false); - expect((da1).communication.StateAutAut.value).equal(false); - expect((da1).communication.StateOffOp.value).equal(false); - expect((da1).communication.StateOpOp.value).equal(false); - expect((da1).communication.StateAutOp.value).equal(false); - expect((da1).communication.StateOpAct.value).equal(false); - expect((da1).communication.StateAutAct.value).equal(false); - expect((da1).communication.StateOffAct.value).equal(true); - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcExtAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcExtOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcExtAct.value).equal(false); - expect(da1.communication.Sync.value).equal(false); + const dataAssemblyController: ServParam = new ServParam(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect((dataAssemblyController).communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcExtAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcExtOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcExtAct.value).equal(false); + expect(dataAssemblyController.communication.Sync.value).equal(false); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.ts index 96122a17..c69a210c 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/ServParam.ts @@ -24,28 +24,28 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../connection'; -import {OpModeRuntime, WQCRuntime -} from '../../_extensions'; +import {OpcUaConnection, DataItem} from '../../../connection'; +import { + OpMode, OpModeRuntime, +} from '../../baseFunction'; import { OperationElement, OperationElementRuntime, } from '../OperationElement'; import { ServiceSourceModeController, ServiceSourceModeRuntime -} from '../../_extensions/serviceSourceModeDA/ServiceSourceModeController'; -import {OpModeController} from '../../_extensions/opModeDA/OpModeController'; -import {WQC} from '../../_extensions/wqcDA/WQC'; +} from '../../baseFunction/serviceSourceMode/ServiceSourceModeController'; -export type ServParamRuntime = OperationElementRuntime & OpModeRuntime & ServiceSourceModeRuntime & WQCRuntime & { - Sync: OpcUaDataItem; +export type ServParamRuntime = OperationElementRuntime & OpModeRuntime & ServiceSourceModeRuntime & { + Sync: DataItem; }; export class ServParam extends OperationElement { - //TODO: check accessablity? (private, readonly, public?) + public readonly communication!: ServParamRuntime; public readonly serviceSourceMode: ServiceSourceModeController; - public readonly serviceOpMode: OpModeController; + public readonly serviceOpMode: OpMode; + //public readonly wqc: WQC; constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { @@ -53,8 +53,8 @@ export class ServParam extends OperationElement { //this.wqc = new WQC(this); this.serviceSourceMode = new ServiceSourceModeController(this); - this.serviceOpMode = new OpModeController(this); + this.serviceOpMode = new OpMode(this); - this.communication.Sync = this.createDataItem('Sync', 'read', 'boolean'); + this.communication.Sync = this.createDataItem('Sync', 'boolean'); } } diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.mockup.spec.ts index 5bc98657..ac7c74d7 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.mockup.spec.ts @@ -1,29 +1,45 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {AnaServParamMockup, getAnaServParamMockupReferenceJSON} from './AnaServParam.mockup'; +import {AnaServParamMockup, getAnaServParamDataItemOptions, getAnaServParamOptions} from './AnaServParam.mockup'; import {MockupServer} from '../../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; - +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {AnaServParamRuntime} from './AnaServParam'; chai.use(chaiAsPromised); const expect = chai.expect; -// this test class is needed to test the protected variable -class AnaServParamMockupTestClass extends AnaServParamMockup{ - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - super(namespace, rootNode, variableName); - } - public getVOut(){ - return this.vOut; - } - -} describe('AnaServParamMockup', () => { describe('static', () => { + let mockupServer: MockupServer; + beforeEach(async function(){ this.timeout(10000); mockupServer = new MockupServer(); @@ -31,29 +47,39 @@ describe('AnaServParamMockup', () => { }); it('should create AnaServParamMockup', () => { - const mockup = new AnaServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup = new AnaServParamMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO test more? + }); + + it('static DataItemOptions', () => { + const options = getAnaServParamDataItemOptions(1, 'Test') as AnaServParamRuntime; + expect(Object.keys(options).length).to.equal(31); + }); + it('static DataAssemblyOptions', () => { + const options = getAnaServParamOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(33); }); - it('getAnaServParamMockupReferenceJSON()', () => { - const mockup = new AnaServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - - const json = mockup.getAnaServParamMockupJSON(); - expect(Object.keys(json).length).to .equal(31); - expect(json.VExt).to.not.be.undefined; - expect(json.VOp).to.not.be.undefined; - expect(json.VInt).to.not.be.undefined; - expect(json.VReq).to.not.be.undefined; - expect(json.VOut).to.not.be.undefined; - expect(json.VFbk).to.not.be.undefined; + + it('dynamic DataAssemblyOptions', () => { + const mockup = new AnaServParamMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions() as any; + + expect(Object.keys(options.dataItems).length).to.equal(33); + expect(options.dataItems.VExt).to.not.be.undefined; + expect(options.dataItems.VOp).to.not.be.undefined; + expect(options.dataItems.VInt).to.not.be.undefined; + expect(options.dataItems.VReq).to.not.be.undefined; + expect(options.dataItems.VOut).to.not.be.undefined; + expect(options.dataItems.VFbk).to.not.be.undefined; }); - //TODO test more - it('startCurrentTimeUpdate()', async() => { - const mockup: AnaServParamMockupTestClass = new AnaServParamMockupTestClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as AnaServParamMockupTestClass; + + // TODO + /* it('startCurrentTimeUpdate()', async() => { + const mockup: AnaServParamMockupTestClass = new AnaServParamMockupTestClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as AnaServParamMockupTestClass; mockup.startCurrentTimeUpdate(); expect(mockup.getVOut()).to.equal(0); await new Promise(f => setTimeout(f, 1000)); @@ -61,8 +87,8 @@ describe('AnaServParamMockup', () => { }); it('stopCurrentTimeUpdate()', async() => { - const mockup: AnaServParamMockupTestClass = new AnaServParamMockupTestClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as AnaServParamMockupTestClass; + const mockup: AnaServParamMockupTestClass = new AnaServParamMockupTestClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as AnaServParamMockupTestClass; mockup.startCurrentTimeUpdate(); mockup.stopCurrentTimeUpdate(); expect(mockup.getVOut()).to.equal(0); @@ -72,24 +98,24 @@ describe('AnaServParamMockup', () => { }); it('stopCurrentTimeUpdate(), interval undefined', () => { - const mockup: AnaServParamMockupTestClass = new AnaServParamMockupTestClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as AnaServParamMockupTestClass; + const mockup: AnaServParamMockupTestClass = new AnaServParamMockupTestClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as AnaServParamMockupTestClass; expect((() => mockup.stopCurrentTimeUpdate())).to.throw(); - }); + });*/ }); describe('dynamic (with MockupServer)', () => { let mockupServer: MockupServer; - let mockup: AnaServParamMockupTestClass; let connection: OpcUaConnection; + beforeEach(async function(){ this.timeout(10000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new AnaServParamMockupTestClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new AnaServParamMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); afterEach(async () => { @@ -98,19 +124,16 @@ describe('AnaServParamMockup', () => { }); it('set VExt',async()=>{ - await connection.writeOpcUaNode('Variable.VExt', namespaceUrl, 1,'Double'); - await connection.readOpcUaNode('Variable.VExt', - namespaceUrl) - .then(datavalue=>expect(datavalue?.value.value).to.equal(1)); + await connection.writeNode('Variable.VExt', mockupServer.nameSpaceUri, 1,'Double'); + await connection.readNode('Variable.VExt', mockupServer.nameSpaceUri) + .then((dataValue)=>expect((dataValue)?.value.value).to.equal(1)); }).timeout(10000); it('set VOp',async()=>{ - await connection.writeOpcUaNode('Variable.VOp', - namespaceUrl, - 1,'Double'); - await connection.readOpcUaNode('Variable.VOp', - namespaceUrl) - .then(datavalue=>expect(datavalue?.value.value).to.equal(1)); + await connection.writeNode('Variable.VOp', mockupServer.nameSpaceUri, 1, 'Double'); + await connection.readNode('Variable.VOp', + mockupServer.nameSpaceUri) + .then((dataValue)=>expect((dataValue)?.value.value).to.equal(1)); }).timeout(10000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.mockup.ts index 9cea4025..5b193853 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.mockup.ts @@ -26,89 +26,102 @@ // eslint-disable-next-line no-undef import Timeout = NodeJS.Timeout; import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../../_extensions/opModeDA/OpModeDA.mockup'; +import {getUnitSettingsDataItemOptions, UnitSettingsMockup} from '../../../baseFunction/unitSettings/UnitSettings.mockup'; import { - getServiceSourceModeDAMockupReferenceJSON, - ServiceSourceModeDAMockup -} from '../../../_extensions/serviceSourceModeDA/ServiceSourceModeDA.mockup'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../../_extensions/unitDA/UnitDA.mockup'; + getScaleSettingsDataItemOptions, + ScaleSettingMockup +} from '../../../baseFunction/scaleSettings/ScaleSetting.mockup'; import { - getScaleSettingDAMockupReferenceJSON, - ScaleSettingDAMockup -} from '../../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; -import { - getValueLimitationDAMockupReferenceJSON, - ValueLimitationDAMockup -} from '../../../_extensions/valueLimitationDA/ValueLimitationDA.mockup'; -import {ServParam} from '../ServParam'; -import {getServParamMockupReferenceJSON, ServParamMockup} from '../ServParam.mockup'; -import {AnaManMockup} from '../../man/anaMan/AnaMan.mockup'; + getValueLimitationDataItemOptions, + ValueLimitationMockup +} from '../../../baseFunction/valueLimitation/ValueLimitation.mockup'; +import {getServParamDataItemOptions, ServParamMockup} from '../ServParam.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getAnaServParamMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaServParam'; +function getAnaServParamSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getServParamMockupReferenceJSON(namespace, objectBrowseName), - ...getUnitDAMockupReferenceJSON(namespace,objectBrowseName), - ...getScaleSettingDAMockupReferenceJSON(namespace,objectBrowseName,'Float'), - ...getValueLimitationDAMockupReferenceJSON(namespace,objectBrowseName, 'Float'), - VExt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VExt`, - dataType: 'Float' - }, - VOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VOp`, - dataType: 'Float' - }, - VInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VInt`, - dataType: 'Float' - }, - VReq: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VReq`, - dataType: 'Float' - }, - VOut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VOut`, - dataType: 'Float' - }, - VFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VFbk`, - dataType: 'Float' - } - } + VExt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VExt`, + dataType: 'Float' + } as OpcUaNodeOptions, + VOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VOp`, + dataType: 'Float' + } as OpcUaNodeOptions, + VInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VInt`, + dataType: 'Float' + } as OpcUaNodeOptions, + VReq: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VReq`, + dataType: 'Float' + } as OpcUaNodeOptions, + VOut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VOut`, + dataType: 'Float' + } as OpcUaNodeOptions, + VFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VFbk`, + dataType: 'Float' + } as OpcUaNodeOptions, + Sync: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Sync`, + dataType: 'Boolean' + } as OpcUaNodeOptions + }); +} + +export function getAnaServParamDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getServParamDataItemOptions(namespace, objectBrowseName), + ...getUnitSettingsDataItemOptions(namespace, objectBrowseName), + ...getScaleSettingsDataItemOptions(namespace, objectBrowseName, 'Ana'), + ...getValueLimitationDataItemOptions(namespace, objectBrowseName, 'Ana'), + ...getAnaServParamSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getAnaServParamOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getAnaServParamDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class AnaServParamMockup extends ServParamMockup{ protected vExt = 0; protected vOp = 0; protected vInt = 0; protected vReq = 0; - protected vOut = 0 + protected vOut = 0; protected vFbk = 0; - public readonly unit: UnitDAMockup; - public readonly scaleSettings: ScaleSettingDAMockup; - public readonly valueLimitation: ValueLimitationDAMockup; + public readonly unit: UnitSettingsMockup; + public readonly scaleSettings: ScaleSettingMockup<'Ana'>; + public readonly valueLimitation: ValueLimitationMockup<'Ana'>; protected interval: Timeout | undefined; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { super(namespace, rootNode, variableName); - this.unit = new UnitDAMockup(namespace, this.mockupNode, this.name); - this.scaleSettings = new ScaleSettingDAMockup(namespace, this.mockupNode, this.name, DataType.Double); - this.valueLimitation = new ValueLimitationDAMockup(namespace, this.mockupNode, this.name,DataType.Double); + this.unit = new UnitSettingsMockup(namespace, this.mockupNode, this.name); + this.scaleSettings = new ScaleSettingMockup(namespace, this.mockupNode, this.name, 'Ana'); + this.valueLimitation = new ValueLimitationMockup(namespace, this.mockupNode, this.name,'Ana'); namespace.addVariable({ componentOf: this.mockupNode, @@ -186,13 +199,19 @@ export class AnaServParamMockup extends ServParamMockup{ }); } - public getAnaServParamMockupJSON() { - return getAnaServParamMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.unit.getDataItemOptions(), + ...this.scaleSettings.getDataItemOptions(), + ...this.valueLimitation.getDataItemOptions(), + ...getAnaServParamSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } - //TODO: for both functions below, we have many duplications-> maybe refactor public startCurrentTimeUpdate(): void { this.interval = global.setInterval(() => { this.vOut = Math.random(); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.puml index febd73a3..5bd51b99 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.puml +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.puml @@ -1,9 +1,34 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include ../../../_extensions/scaleSettingsDA/ScaleSettings.puml -!include ../../../_extensions/unitDA/UnitSettings.puml -!include ../../../_extensions/valueLimitationDA/ValueLimitation.puml +!include ../../../_extensions/scaleSettings/ScaleSettings.puml +!include ../../../_extensions/unit/UnitSettings.puml +!include ../../../_extensions/valueLimitation/ValueLimitation.puml class AnaServParam{ + readonly communication!: AnaServParamRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.spec.ts index 52d87fa0..2165218a 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.spec.ts @@ -28,39 +28,39 @@ import {AnaServParam} from './AnaServParam'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/anaserveparam.json'; import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; import {MockupServer} from '../../../../../_utils'; -import {AnaServParamMockup} from '../AnaServParam/AnaServParam.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {AnaServParamMockup, getAnaServParamOptions} from './AnaServParam.mockup'; + chai.use(chaiAsPromised); const expect = chai.expect; describe('AnaServParam', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaServParam', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; + describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getAnaServParamOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create AnaServParam', () => { - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as AnaServParam; - expect(da1.scaleSettings).to.not.be.undefined; - expect(da1.unitSettings).to.not.be.undefined; - expect(da1.valueLimitation).to.not.be.undefined; - - expect(da1.communication.VExt).to.not.be.undefined; - expect(da1.communication.VOp).to.not.be.undefined; - expect(da1.communication.VInt).to.not.be.undefined; - expect(da1.communication.VReq).to.not.be.undefined; - expect(da1.communication.VOut).to.not.be.undefined; - expect(da1.communication.VFbk).to.not.be.undefined; + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as AnaServParam; + expect(dataAssemblyController.scaleSettings).to.not.be.undefined; + expect(dataAssemblyController.unitSettings).to.not.be.undefined; + expect(dataAssemblyController.valueLimitation).to.not.be.undefined; + + expect(dataAssemblyController.communication.VExt).to.not.be.undefined; + expect(dataAssemblyController.communication.VOp).to.not.be.undefined; + expect(dataAssemblyController.communication.VInt).to.not.be.undefined; + expect(dataAssemblyController.communication.VReq).to.not.be.undefined; + expect(dataAssemblyController.communication.VOut).to.not.be.undefined; + expect(dataAssemblyController.communication.VFbk).to.not.be.undefined; }); }); + describe('dynamic', () => { let mockupServer: MockupServer; let connection: OpcUaConnection; @@ -69,12 +69,11 @@ describe('AnaServParam', () => { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new AnaServParamMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const anaServParamMockup = new AnaServParamMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = anaServParamMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -85,52 +84,42 @@ describe('AnaServParam', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as AnaServParam; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - - expect((da1).communication.StateChannel.value).equal(false); - expect((da1).communication.StateOffAut.value).equal(false); - expect((da1).communication.StateOpAut.value).equal(false); - expect((da1).communication.StateAutAut.value).equal(false); - expect((da1).communication.StateOffOp.value).equal(false); - expect((da1).communication.StateOpOp.value).equal(false); - expect((da1).communication.StateAutOp.value).equal(false); - expect((da1).communication.StateOpAct.value).equal(false); - expect((da1).communication.StateAutAct.value).equal(false); - expect((da1).communication.StateOffAct.value).equal(true); - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcExtAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcExtOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcExtAct.value).equal(false); - - expect(da1.communication.Sync.value).equal(false); - - expect(da1.communication.VExt.value).equal(0); - expect(da1.communication.VOp.value).equal(0); - expect(da1.communication.VInt.value).equal(0); - expect(da1.communication.VReq.value).equal(0); - expect(da1.communication.VOut.value).equal(0); - expect(da1.communication.VFbk.value).equal(0); - - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(0); - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VMin.value).equal(0); - expect(da1.communication.VMax.value).equal(0); + + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as AnaServParam; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect((dataAssemblyController).communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcExtAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcExtOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcExtAct.value).equal(false); + expect(dataAssemblyController.communication.Sync.value).equal(false); + expect(dataAssemblyController.communication.VExt.value).equal(0); + expect(dataAssemblyController.communication.VOp.value).equal(0); + expect(dataAssemblyController.communication.VInt.value).equal(0); + expect(dataAssemblyController.communication.VReq.value).equal(0); + expect(dataAssemblyController.communication.VOut.value).equal(0); + expect(dataAssemblyController.communication.VFbk.value).equal(0); + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VMin.value).equal(0); + expect(dataAssemblyController.communication.VMax.value).equal(0); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.ts index f033dccd..ee829469 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.ts @@ -24,19 +24,24 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; +import {OpcUaConnection, DataItem} from '../../../../connection'; import {ServParam, ServParamRuntime} from '../ServParam'; -import {ScaleSettings, ScaleSettingsRuntime} from '../../../_extensions/scaleSettingsDA/ScaleSettings'; -import {UnitDataAssemblyRuntime, UnitSettings} from '../../../_extensions/unitDA/UnitSettings'; -import {ValueLimitation, ValueLimitationRuntime} from '../../../_extensions/valueLimitationDA/ValueLimitation'; +import { + ScaleSettings, + ScaleSettingsRuntime, + UnitSettingsRuntime, + UnitSettings, + ValueLimitation, + ValueLimitationRuntime +} from '../../../baseFunction'; -export type AnaServParamRuntime = ServParamRuntime & ScaleSettingsRuntime & UnitDataAssemblyRuntime & ValueLimitationRuntime & { - VExt: OpcUaDataItem; - VOp: OpcUaDataItem; - VInt: OpcUaDataItem; - VReq: OpcUaDataItem; - VOut: OpcUaDataItem; - VFbk: OpcUaDataItem; +export type AnaServParamRuntime = ServParamRuntime & ScaleSettingsRuntime & UnitSettingsRuntime & ValueLimitationRuntime & { + VExt: DataItem; + VOp: DataItem; + VInt: DataItem; + VReq: DataItem; + VOut: DataItem; + VFbk: DataItem; }; export class AnaServParam extends ServParam { @@ -52,18 +57,18 @@ export class AnaServParam extends ServParam { this.unitSettings = new UnitSettings(this); this.valueLimitation = new ValueLimitation(this); - this.communication.VExt = this.createDataItem('VExt', 'write', 'number'); - this.communication.VOp = this.createDataItem('VOp', 'write', 'number'); - this.communication.VInt = this.createDataItem('VInt', 'read', 'number'); - this.communication.VReq = this.createDataItem('VReq', 'read', 'number'); - this.communication.VOut = this.createDataItem('VOut', 'read', 'number'); - this.communication.VFbk = this.createDataItem('VFbk', 'read', 'number'); + this.communication.VExt = this.createDataItem('VExt', 'number', 'write'); + this.communication.VOp = this.createDataItem('VOp', 'number', 'write'); + this.communication.VInt = this.createDataItem('VInt', 'number'); + this.communication.VReq = this.createDataItem('VReq', 'number'); + this.communication.VOut = this.createDataItem('VOut', 'number'); + this.communication.VFbk = this.createDataItem('VFbk', 'number'); - this.communication.VSclMin = this.createDataItem('VSclMin', 'read', 'number'); - this.communication.VSclMax = this.createDataItem('VSclMax', 'read', 'number'); - this.communication.VUnit = this.createDataItem('VUnit', 'read', 'number'); - this.communication.VMin = this.createDataItem('VMin', 'read', 'number'); - this.communication.VMax = this.createDataItem('VMax', 'read', 'number'); + this.communication.VSclMin = this.createDataItem('VSclMin', 'number'); + this.communication.VSclMax = this.createDataItem('VSclMax', 'number'); + this.communication.VUnit = this.createDataItem('VUnit', 'number'); + this.communication.VMin = this.createDataItem('VMin', 'number'); + this.communication.VMax = this.createDataItem('VMax', 'number'); this.defaultReadDataItem = this.communication.VOut; this.defaultReadDataItemType = 'number'; diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.mockup.spec.ts index 7eeccb61..080726e0 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.mockup.spec.ts @@ -1,57 +1,85 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {BinServParamMockup, getBinServParamMockupReferenceJSON} from './BinServParam.mockup'; +import {BinServParamMockup, getBinServParamDataItemOptions, getBinServParamOptions} from './BinServParam.mockup'; import {MockupServer} from '../../../../../_utils'; -import {Namespace, UAObject} from 'node-opcua'; -import {AnaServParamMockup} from '../anaServParam/AnaServParam.mockup'; -import {BinViewMockup} from '../../../indicatorElement/BinView/BinView.mockup'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {BinServParamRuntime} from './BinServParam'; chai.use(chaiAsPromised); const expect = chai.expect; -// this fake class is needed to test the protected variable -class FakeClass extends BinServParamMockup{ - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - super(namespace, rootNode, variableName); - } - public getVOut(){ - return this.vOut; - } -} describe('BinServParamMockup', () => { describe('static', () => { + let mockupServer: MockupServer; - beforeEach(async()=>{ + + beforeEach(async function () { + this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); }); + it('should create BinServParamMockup', () => { - const mockup = new BinServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup = new BinServParamMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - }); - it('getBinServParamMockupReferenceJSON()', () => { - const mockup = new BinServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getBinServParamMockupJSON(); - //TODO: check expected length - expect(Object.keys(json).length).to .equal(28); - expect(json.VExt).to.not.be.undefined; - expect(json.VOp).to.not.be.undefined; - expect(json.VInt).to.not.be.undefined; - expect(json.VReq).to.not.be.undefined; - expect(json.VOut).to.not.be.undefined; - expect(json.VFbk).to.not.be.undefined; + + it('static DataItemOptions', () => { + const options = getBinServParamDataItemOptions(1, 'Test') as BinServParamRuntime; + expect(Object.keys(options).length).to.equal(28); }); - //TODO test more - it('startCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + it('static DataAssemblyOptions', () => { + const options = getBinServParamOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(30); + }).timeout(6000); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new BinServParamMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions() as any; + + expect(Object.keys(options.dataItems).length).to .equal(30); + expect(options.dataItems.VExt).to.not.be.undefined; + expect(options.dataItems.VOp).to.not.be.undefined; + expect(options.dataItems.VInt).to.not.be.undefined; + expect(options.dataItems.VReq).to.not.be.undefined; + expect(options.dataItems.VOut).to.not.be.undefined; + expect(options.dataItems.VFbk).to.not.be.undefined; + }).timeout(6000); + + // TODO +/* it('startCurrentTimeUpdate()', async() => { + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); expect(mockup.getVOut()).to.be.false; await new Promise(f => setTimeout(f, 1000)); @@ -59,8 +87,8 @@ describe('BinServParamMockup', () => { }); it('stopCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); mockup.stopCurrentTimeUpdate(); expect(mockup.getVOut()).to.be.false; @@ -70,24 +98,24 @@ describe('BinServParamMockup', () => { }); it('stopCurrentTimeUpdate(), interval undefined', () => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; expect((() => mockup.stopCurrentTimeUpdate())).to.throw(); - }); + });*/ }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: BinServParamMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new BinServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new BinServParamMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -97,17 +125,15 @@ describe('BinServParamMockup', () => { }); it('set and get VExt', async () => { - await connection.writeOpcUaNode('Variable.VExt', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.VExt', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(true)); + await connection.writeNode('Variable.VExt', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.VExt', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(true)); }).timeout(3000); it('set and get VOp', async () => { - await connection.writeOpcUaNode('Variable.VOp', namespaceUrl, true, 'Boolean'); - await connection.readOpcUaNode('Variable.VOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(true)); + await connection.writeNode('Variable.VOp', mockupServer.nameSpaceUri, true, 'Boolean'); + await connection.readNode('Variable.VOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(true)); }).timeout(3000); - - //TODO get the rest }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.mockup.ts index 84e3269f..e7225b01 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.mockup.ts @@ -26,67 +26,75 @@ // eslint-disable-next-line no-undef import Timeout = NodeJS.Timeout; import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../../_extensions/opModeDA/OpModeDA.mockup'; -import { - getServiceSourceModeDAMockupReferenceJSON, - ServiceSourceModeDAMockup -} from '../../../_extensions/serviceSourceModeDA/ServiceSourceModeDA.mockup'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; +import {getServParamDataItemOptions, ServParamMockup} from '../ServParam.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getServParamMockupReferenceJSON, ServParamMockup} from '../ServParam.mockup'; -import {BinServParam} from './BinServParam'; +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement/BinServParam'; -export function getBinServParamMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +function getBinServParamSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + VExt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VExt`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VOp`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VInt`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VReq: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VReq`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VOut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VOut`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VFbk`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VState0: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VState0`, + dataType: 'String' + } as OpcUaNodeOptions, + VState1: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VState1`, + dataType: 'String' + } as OpcUaNodeOptions + }); +} +export function getBinServParamDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getServParamMockupReferenceJSON(namespace,objectBrowseName), - VExt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VExt`, - dataType: 'Boolean' - }, - VOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VOp`, - dataType: 'Boolean' - }, - VInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VInt`, - dataType: 'Boolean' - }, - VReq: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VReq`, - dataType: 'Boolean' - }, - VOut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VOut`, - dataType: 'Boolean' - }, - VFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VFbk`, - dataType: 'Boolean' - }, - VState0: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VState0`, - dataType: 'String' - }, - VState1: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VState1`, - dataType: 'String' - } + ...getServParamDataItemOptions(namespace, objectBrowseName), + ...getBinServParamSpecificDataItemOptions(namespace, objectBrowseName), } ); } +export function getBinServParamOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinServParamDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class BinServParamMockup extends ServParamMockup{ protected vExt = false; @@ -201,10 +209,14 @@ export class BinServParamMockup extends ServParamMockup{ } - public getBinServParamMockupJSON() { - return getBinServParamMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getBinServParamSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } public startCurrentTimeUpdate(): void { diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.puml index 9c10eeb6..e2ae1307 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.puml +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram class BinServParam{ diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.spec.ts index 3c647814..95311ad3 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.spec.ts @@ -28,36 +28,34 @@ import {OpcUaConnection} from '../../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/binserveparam.json'; import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; import {MockupServer} from '../../../../../_utils'; -import {BinServParamMockup} from './BinServParam.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {BinServParamMockup, getBinServParamOptions} from './BinServParam.mockup'; + import {BinServParam} from './BinServParam'; chai.use(chaiAsPromised); const expect = chai.expect; describe('BinServParam', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/BinServParam', - dataItems: baseDataAssemblyOptions - }; - - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getBinServParamOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create BinServParam', async () => { - const da1 = new BinServParam(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1.communication.VExt).to.not.be.undefined; - expect(da1.communication.VOp).to.not.be.undefined; - expect(da1.communication.VInt).to.not.be.undefined; - expect(da1.communication.VReq).to.not.be.undefined; - expect(da1.communication.VOut).to.not.be.undefined; - expect(da1.communication.VFbk).to.not.be.undefined; - expect(da1.communication.VState0).to.not.be.undefined; - expect(da1.communication.VState1).to.not.be.undefined; + const dataAssemblyController = new BinServParam(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController.communication.VExt).to.not.be.undefined; + expect(dataAssemblyController.communication.VOp).to.not.be.undefined; + expect(dataAssemblyController.communication.VInt).to.not.be.undefined; + expect(dataAssemblyController.communication.VReq).to.not.be.undefined; + expect(dataAssemblyController.communication.VOut).to.not.be.undefined; + expect(dataAssemblyController.communication.VFbk).to.not.be.undefined; + expect(dataAssemblyController.communication.VState0).to.not.be.undefined; + expect(dataAssemblyController.communication.VState1).to.not.be.undefined; }); }); describe('dynamic', () => { @@ -68,12 +66,11 @@ describe('BinServParam', () => { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new BinServParamMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const binServParamMockup = new BinServParamMockup( mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = binServParamMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -84,51 +81,43 @@ describe('BinServParam', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - //TODO new BinServParam() - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as BinServParam; - - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - - expect((da1).communication.StateChannel.value).equal(false); - expect((da1).communication.StateOffAut.value).equal(false); - expect((da1).communication.StateOpAut.value).equal(false); - expect((da1).communication.StateAutAut.value).equal(false); - expect((da1).communication.StateOffOp.value).equal(false); - expect((da1).communication.StateOpOp.value).equal(false); - expect((da1).communication.StateAutOp.value).equal(false); - expect((da1).communication.StateOpAct.value).equal(false); - expect((da1).communication.StateAutAct.value).equal(false); - expect((da1).communication.StateOffAct.value).equal(true); - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcExtAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcExtOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcExtAct.value).equal(false); - - expect(da1.communication.Sync.value).equal(false); - - expect(da1.communication.VExt.value).equal(false); - expect(da1.communication.VOp.value).equal(false); - expect(da1.communication.VInt.value).equal(false); - expect(da1.communication.VReq.value).equal(false); - expect(da1.communication.VOut.value).equal(false); - expect(da1.communication.VFbk.value).equal(false); - - expect(da1.communication.VState0.value).equal('off'); - expect(da1.communication.VState1.value).equal('on'); + + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as BinServParam; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect((dataAssemblyController).communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcExtAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcExtOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcExtAct.value).equal(false); + + expect(dataAssemblyController.communication.Sync.value).equal(false); + + expect(dataAssemblyController.communication.VExt.value).equal(false); + expect(dataAssemblyController.communication.VOp.value).equal(false); + expect(dataAssemblyController.communication.VInt.value).equal(false); + expect(dataAssemblyController.communication.VReq.value).equal(false); + expect(dataAssemblyController.communication.VOut.value).equal(false); + expect(dataAssemblyController.communication.VFbk.value).equal(false); + + expect(dataAssemblyController.communication.VState0.value).equal(''); + expect(dataAssemblyController.communication.VState1.value).equal(''); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.ts index 8c419a80..c1873287 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/binServParam/BinServParam.ts @@ -24,19 +24,19 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; +import {OpcUaConnection, DataItem} from '../../../../connection'; import {ServParam, ServParamRuntime} from '../ServParam'; export type BinServParamRuntime = ServParamRuntime & { - VExt: OpcUaDataItem; - VOp: OpcUaDataItem; - VInt: OpcUaDataItem; - VReq: OpcUaDataItem; - VOut: OpcUaDataItem; - VFbk: OpcUaDataItem; + VExt: DataItem; + VOp: DataItem; + VInt: DataItem; + VReq: DataItem; + VOut: DataItem; + VFbk: DataItem; - VState0: OpcUaDataItem; - VState1: OpcUaDataItem; + VState0: DataItem; + VState1: DataItem; }; export class BinServParam extends ServParam { @@ -45,20 +45,20 @@ export class BinServParam extends ServParam { constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.VExt = this.createDataItem('VExt', 'write', 'boolean'); - this.communication.VOp = this.createDataItem('VOp', 'write', 'boolean'); - this.communication.VInt = this.createDataItem('VInt', 'read', 'boolean'); - this.communication.VReq = this.createDataItem('VReq', 'read', 'boolean'); - this.communication.VOut = this.createDataItem('VOut', 'read', 'boolean'); - this.communication.VFbk = this.createDataItem('VFbk', 'read', 'boolean'); + this.communication.VExt = this.createDataItem('VExt', 'boolean', 'write'); + this.communication.VOp = this.createDataItem('VOp', 'boolean', 'write'); + this.communication.VInt = this.createDataItem('VInt', 'boolean'); + this.communication.VReq = this.createDataItem('VReq', 'boolean'); + this.communication.VOut = this.createDataItem('VOut', 'boolean'); + this.communication.VFbk = this.createDataItem('VFbk', 'boolean'); - this.communication.VState0 = this.createDataItem('VState0', 'read', 'string'); - this.communication.VState1 = this.createDataItem('VState1', 'read', 'string'); + this.communication.VState0 = this.createDataItem('VState0', 'string'); + this.communication.VState1 = this.createDataItem('VState1', 'string'); this.defaultReadDataItem = this.communication.VOut; this.defaultReadDataItemType = 'boolean'; this.defaultWriteDataItemType = 'boolean'; - this.defaultWriteDataItem = this.communication.VExt; //TODO correct? + this.defaultWriteDataItem = this.communication.VExt; } } diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.mockup.spec.ts index 89feabb8..e612b0b3 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.mockup.spec.ts @@ -1,52 +1,78 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {DIntServParamMockup} from './DIntServParam.mockup'; +import {DIntServParamMockup, getDIntServParamDataItemOptions, getDIntServParamOptions} from './DIntServParam.mockup'; import {MockupServer} from '../../../../../_utils'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {DIntServParamRuntime} from './DIntServParam'; chai.use(chaiAsPromised); const expect = chai.expect; -// this fake class is needed to test the protected variable -class FakeClass extends DIntServParamMockup{ - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - super(namespace, rootNode, variableName); - } - public getVOut(){ - return this.vOut; - } -} describe('DIntServParamMockup', () => { - describe('', () => { + + describe('static', () => { + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); - afterEach(async () => { - }); it('should create DIntServParamMockup', () => { - const mockup= new DIntServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new DIntServParamMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + + it('static DataItemOptions', () => { + const options = getDIntServParamDataItemOptions(1, 'Test') as DIntServParamRuntime; + expect(Object.keys(options).length).to.equal(31); + }); + it('static DataAssemblyOptions', () => { + const options = getDIntServParamOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(33); }); - it('getDIntServParamMockupReferenceJSON()', () => { - const mockup = new DIntServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getDIntServParamMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to .equal(31); - //TODO: test more + + it('dynamic DataAssemblyOptions', () => { + const mockup = new DIntServParamMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(33); }); - //TODO test more - it('startCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + + // TODO + /*it('startCurrentTimeUpdate()', async() => { + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); expect(mockup.getVOut()).to.equal(0); await new Promise(f => setTimeout(f, 1000)); @@ -54,8 +80,8 @@ describe('DIntServParamMockup', () => { }); it('stopCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); mockup.stopCurrentTimeUpdate(); expect(mockup.getVOut()).to.equal(0); @@ -65,25 +91,25 @@ describe('DIntServParamMockup', () => { }); it('stopCurrentTimeUpdate(), interval undefined', () => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; expect((() => mockup.stopCurrentTimeUpdate())).to.throw(); - }); + });*/ }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: DIntServParamMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new DIntServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new DIntServParamMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -93,31 +119,31 @@ describe('DIntServParamMockup', () => { }); it('set and get VExt', async () => { - await connection.writeOpcUaNode('Variable.VExt', namespaceUrl, 1, 'Int32'); - await connection.readOpcUaNode('Variable.VExt', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); + await connection.writeNode('Variable.VExt', mockupServer.nameSpaceUri, 1, 'Int32'); + await connection.readNode('Variable.VExt', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); }).timeout(3000); it('set and get VOp', async () => { - await connection.writeOpcUaNode('Variable.VOp', namespaceUrl, 1, 'Int32'); - await connection.readOpcUaNode('Variable.VOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal(1)); + await connection.writeNode('Variable.VOp', mockupServer.nameSpaceUri, 1, 'Int32'); + await connection.readNode('Variable.VOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); }).timeout(3000); - - //TODO get the rest }); + describe('dynamic (with MockupServer)', () => { + let mockupServer: MockupServer; - let mockup: DIntServParamMockup; let connection: OpcUaConnection; + beforeEach(async function(){ this.timeout(10000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new DIntServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new DIntServParamMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); afterEach(async () => { @@ -126,21 +152,21 @@ describe('DIntServParamMockup', () => { }); it('set VExt',async()=>{ - await connection.writeOpcUaNode('Variable.VExt', - namespaceUrl, + await connection.writeNode('Variable.VExt', + mockupServer.nameSpaceUri, 1,'Int32'); - await connection.readOpcUaNode('Variable.VExt', - namespaceUrl) - .then(datavalue=>expect(datavalue?.value.value).to.equal(1)); + await connection.readNode('Variable.VExt', + mockupServer.nameSpaceUri) + .then((dataValue)=>expect((dataValue)?.value.value).to.equal(1)); }).timeout(10000); it('set VOp',async()=>{ - await connection.writeOpcUaNode('Variable.VOp', - namespaceUrl, + await connection.writeNode('Variable.VOp', + mockupServer.nameSpaceUri, 1,'Int32'); - await connection.readOpcUaNode('Variable.VOp', - namespaceUrl) - .then(datavalue=>expect(datavalue?.value.value).to.equal(1)); + await connection.readNode('Variable.VOp', + mockupServer.nameSpaceUri) + .then((dataValue)=>expect((dataValue)?.value.value).to.equal(1)); }).timeout(10000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.mockup.ts index 27ce31b2..c76a6d6e 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.mockup.ts @@ -26,94 +26,103 @@ // eslint-disable-next-line no-undef import Timeout = NodeJS.Timeout; import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getOpModeDAMockupReferenceJSON, OpModeDAMockup} from '../../../_extensions/opModeDA/OpModeDA.mockup'; +import {getUnitSettingsDataItemOptions, UnitSettingsMockup} from '../../../baseFunction/unitSettings/UnitSettings.mockup'; import { - getServiceSourceModeDAMockupReferenceJSON, - ServiceSourceModeDAMockup -} from '../../../_extensions/serviceSourceModeDA/ServiceSourceModeDA.mockup'; -import {getWQCDAMockupReferenceJSON, WQCDAMockup} from '../../../_extensions/wqcDA/WQCDA.mockup'; - -import {getOSLevelDAMockupReferenceJSON, OSLevelDAMockup} from '../../../_extensions/osLevelDA/OSLevelDA.mockup'; -import {getUnitDAMockupReferenceJSON, UnitDAMockup} from '../../../_extensions/unitDA/UnitDA.mockup'; -import { - getScaleSettingDAMockupReferenceJSON, - ScaleSettingDAMockup -} from '../../../_extensions/scaleSettingsDA/ScaleSettingDA.mockup'; + getScaleSettingsDataItemOptions, + ScaleSettingMockup +} from '../../../baseFunction/scaleSettings/ScaleSetting.mockup'; import { - getValueLimitationDAMockupReferenceJSON, - ValueLimitationDAMockup -} from '../../../_extensions/valueLimitationDA/ValueLimitationDA.mockup'; -import {getServParamMockupReferenceJSON, ServParamMockup} from '../ServParam.mockup'; -import {ServParam} from '../ServParam'; + getValueLimitationDataItemOptions, + ValueLimitationMockup +} from '../../../baseFunction/valueLimitation/ValueLimitation.mockup'; +import {getServParamDataItemOptions, ServParamMockup} from '../ServParam.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getDIntServParamMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement/DIntServParam'; +function getDIntServParamSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getServParamMockupReferenceJSON(namespace,objectBrowseName), - ...getUnitDAMockupReferenceJSON(namespace,objectBrowseName), - ...getScaleSettingDAMockupReferenceJSON(namespace,objectBrowseName,'Int32'), - ...getValueLimitationDAMockupReferenceJSON(namespace,objectBrowseName, 'Int32'), - Sync: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.Sync`, - dataType: 'Boolean' - }, - VExt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VExt`, - dataType: 'Int32' - }, - VOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VOp`, - dataType: 'Int32' - }, - VInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VInt`, - dataType: 'Int32' - }, - VReq: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VReq`, - dataType: 'Int32' - }, - VOut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VOut`, - dataType: 'Int32' - }, - VFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VFbk`, - dataType: 'Int32' - } - } + Sync: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.Sync`, + dataType: 'Boolean' + } as OpcUaNodeOptions, + VExt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VExt`, + dataType: 'Int32' + } as OpcUaNodeOptions, + VOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VOp`, + dataType: 'Int32' + } as OpcUaNodeOptions, + VInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VInt`, + dataType: 'Int32' + } as OpcUaNodeOptions, + VReq: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VReq`, + dataType: 'Int32' + } as OpcUaNodeOptions, + VOut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VOut`, + dataType: 'Int32' + } as OpcUaNodeOptions, + VFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VFbk`, + dataType: 'Int32' + } as OpcUaNodeOptions + }); +} + +export function getDIntServParamDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getServParamDataItemOptions(namespace, objectBrowseName), + ...getUnitSettingsDataItemOptions(namespace, objectBrowseName), + ...getScaleSettingsDataItemOptions(namespace, objectBrowseName, 'DInt'), + ...getValueLimitationDataItemOptions(namespace, objectBrowseName, 'DInt'), + ...getDIntServParamSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getDIntServParamOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getDIntServParamDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class DIntServParamMockup extends ServParamMockup { protected vExt = 0; protected vOp = 0; protected vInt = 0; protected vReq = 0; - protected vOut = 0 + protected vOut = 0; protected vFbk = 0; - public readonly unit: UnitDAMockup; - public readonly scaleSettings: ScaleSettingDAMockup; - public readonly valueLimitation: ValueLimitationDAMockup; + public readonly unit: UnitSettingsMockup; + public readonly scaleSettings: ScaleSettingMockup<'DInt'>; + public readonly valueLimitation: ValueLimitationMockup<'DInt'>; + protected interval: Timeout | undefined; constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { super(namespace, rootNode, variableName); - this.unit = new UnitDAMockup(namespace, this.mockupNode, this.name); - this.scaleSettings = new ScaleSettingDAMockup(namespace, this.mockupNode, this.name, DataType.Int32); - this.valueLimitation = new ValueLimitationDAMockup(namespace, this.mockupNode, this.name,DataType.Int32); + this.unit = new UnitSettingsMockup(namespace, this.mockupNode, this.name); + this.scaleSettings = new ScaleSettingMockup(namespace, this.mockupNode, this.name, 'DInt'); + this.valueLimitation = new ValueLimitationMockup(namespace, this.mockupNode, this.name, 'DInt'); namespace.addVariable({ componentOf: this.mockupNode, @@ -191,10 +200,17 @@ export class DIntServParamMockup extends ServParamMockup { }); } - public getDIntServParamMockupJSON() { - return getDIntServParamMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.unit.getDataItemOptions(), + ...this.scaleSettings.getDataItemOptions(), + ...this.valueLimitation.getDataItemOptions(), + ...getDIntServParamSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } public startCurrentTimeUpdate(): void { diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.puml index 2382503f..f9091e0b 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.puml +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.puml @@ -1,8 +1,33 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram -!include ../../../_extensions/scaleSettingsDA/ScaleSettings.puml -!include ../../../_extensions/unitDA/UnitSettings.puml -!include ../../../_extensions/valueLimitationDA/ValueLimitation.puml +!include ../../../_extensions/scaleSettings/ScaleSettings.puml +!include ../../../_extensions/unit/UnitSettings.puml +!include ../../../_extensions/valueLimitation/ValueLimitation.puml class DIntServParam{ + readonly communication!: DIntServParamRuntime diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.spec.ts index b8f66304..4449e6b9 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.spec.ts @@ -27,38 +27,37 @@ import {OpcUaConnection} from '../../../../connection'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import * as baseDataAssemblyOptions from '../../../../../../../tests/anaserveparam.json'; import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; import {MockupServer} from '../../../../../_utils'; -import {DIntServParamMockup} from './DIntServParam.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DIntServParamMockup, getDIntServParamOptions} from './DIntServParam.mockup'; + import {DIntServParam} from './DIntServParam'; chai.use(chaiAsPromised); const expect = chai.expect; describe('DIntServParam', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/DIntServParam', - dataItems: baseDataAssemblyOptions - }; - describe('', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getDIntServParamOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create DIntServParam', () => { - const da1 = new DIntServParam(dataAssemblyOptions, emptyOPCUAConnection); - expect(da1.scaleSettings).to.not.be.undefined; - expect(da1.unitSettings).to.not.be.undefined; - expect(da1.valueLimitation).to.not.be.undefined; - - expect(da1.communication.VExt).to.not.be.undefined; - expect(da1.communication.VOp).to.not.be.undefined; - expect(da1.communication.VInt).to.not.be.undefined; - expect(da1.communication.VReq).to.not.be.undefined; - expect(da1.communication.VOut).to.not.be.undefined; - expect(da1.communication.VFbk).to.not.be.undefined; + const dataAssemblyController = new DIntServParam(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController.scaleSettings).to.not.be.undefined; + expect(dataAssemblyController.unitSettings).to.not.be.undefined; + expect(dataAssemblyController.valueLimitation).to.not.be.undefined; + + expect(dataAssemblyController.communication.VExt).to.not.be.undefined; + expect(dataAssemblyController.communication.VOp).to.not.be.undefined; + expect(dataAssemblyController.communication.VInt).to.not.be.undefined; + expect(dataAssemblyController.communication.VReq).to.not.be.undefined; + expect(dataAssemblyController.communication.VOut).to.not.be.undefined; + expect(dataAssemblyController.communication.VFbk).to.not.be.undefined; }); }); describe('dynamic', () => { @@ -69,12 +68,11 @@ describe('DIntServParam', () => { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new DIntServParamMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const dIntServParamMockup = new DIntServParamMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = dIntServParamMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -85,53 +83,47 @@ describe('DIntServParam', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - //TODO new DIntServParam - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as DIntServParam; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - - expect((da1).communication.StateChannel.value).equal(false); - expect((da1).communication.StateOffAut.value).equal(false); - expect((da1).communication.StateOpAut.value).equal(false); - expect((da1).communication.StateAutAut.value).equal(false); - expect((da1).communication.StateOffOp.value).equal(false); - expect((da1).communication.StateOpOp.value).equal(false); - expect((da1).communication.StateAutOp.value).equal(false); - expect((da1).communication.StateOpAct.value).equal(false); - expect((da1).communication.StateAutAct.value).equal(false); - expect((da1).communication.StateOffAct.value).equal(true); - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcExtAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcExtOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcExtAct.value).equal(false); - - expect(da1.communication.Sync.value).equal(false); - - expect(da1.communication.VExt.value).equal(0); - expect(da1.communication.VOp.value).equal(0); - expect(da1.communication.VInt.value).equal(0); - expect(da1.communication.VReq.value).equal(0); - expect(da1.communication.VOut.value).equal(0); - expect(da1.communication.VFbk.value).equal(0); - - expect(da1.communication.VSclMin.value).equal(0); - expect(da1.communication.VSclMax.value).equal(0); - expect(da1.communication.VUnit.value).equal(0); - expect(da1.communication.VMin.value).equal(0); - expect(da1.communication.VMax.value).equal(0); + + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as DIntServParam; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + + expect((dataAssemblyController).communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcExtAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcExtOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcExtAct.value).equal(false); + + expect(dataAssemblyController.communication.Sync.value).equal(false); + + expect(dataAssemblyController.communication.VExt.value).equal(0); + expect(dataAssemblyController.communication.VOp.value).equal(0); + expect(dataAssemblyController.communication.VInt.value).equal(0); + expect(dataAssemblyController.communication.VReq.value).equal(0); + expect(dataAssemblyController.communication.VOut.value).equal(0); + expect(dataAssemblyController.communication.VFbk.value).equal(0); + + expect(dataAssemblyController.communication.VSclMin.value).equal(0); + expect(dataAssemblyController.communication.VSclMax.value).equal(0); + expect(dataAssemblyController.communication.VUnit.value).equal(0); + expect(dataAssemblyController.communication.VMin.value).equal(0); + expect(dataAssemblyController.communication.VMax.value).equal(0); }).timeout(4000); }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.ts index 40eaca92..91b27707 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/dIntServParam/DIntServParam.ts @@ -24,19 +24,24 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; +import {OpcUaConnection, DataItem} from '../../../../connection'; import {ServParam, ServParamRuntime} from '../ServParam'; -import {ScaleSettings, ScaleSettingsRuntime} from '../../../_extensions/scaleSettingsDA/ScaleSettings'; -import {UnitDataAssemblyRuntime, UnitSettings} from '../../../_extensions/unitDA/UnitSettings'; -import {ValueLimitation, ValueLimitationRuntime} from '../../../_extensions/valueLimitationDA/ValueLimitation'; +import { + ScaleSettings, + ScaleSettingsRuntime, + UnitSettingsRuntime, + UnitSettings, + ValueLimitation, + ValueLimitationRuntime +} from '../../../baseFunction'; -export type DIntServParamRuntime = ServParamRuntime & ScaleSettingsRuntime & UnitDataAssemblyRuntime & ValueLimitationRuntime &{ - VExt: OpcUaDataItem; - VOp: OpcUaDataItem; - VInt: OpcUaDataItem; - VReq: OpcUaDataItem; - VOut: OpcUaDataItem; - VFbk: OpcUaDataItem; +export type DIntServParamRuntime = ServParamRuntime & ScaleSettingsRuntime & UnitSettingsRuntime & ValueLimitationRuntime &{ + VExt: DataItem; + VOp: DataItem; + VInt: DataItem; + VReq: DataItem; + VOut: DataItem; + VFbk: DataItem; }; export class DIntServParam extends ServParam { @@ -51,23 +56,24 @@ export class DIntServParam extends ServParam { this.scaleSettings = new ScaleSettings(this); this.unitSettings = new UnitSettings(this); this.valueLimitation = new ValueLimitation(this); - this.communication.VExt = this.createDataItem('VExt', 'write', 'number'); - this.communication.VOp = this.createDataItem('VOp', 'write', 'number'); - this.communication.VInt = this.createDataItem('VInt', 'read', 'number'); - this.communication.VReq = this.createDataItem('VReq', 'read', 'number'); - this.communication.VOut = this.createDataItem('VOut', 'read', 'number'); - this.communication.VFbk = this.createDataItem('VFbk', 'read', 'number'); - this.communication.VSclMin = this.createDataItem('VSclMin', 'read', 'number'); - this.communication.VSclMax = this.createDataItem('VSclMax', 'read', 'number'); - this.communication.VUnit = this.createDataItem('VUnit', 'read', 'number'); - this.communication.VMin = this.createDataItem('VMin', 'read', 'number'); - this.communication.VMax = this.createDataItem('VMax', 'read', 'number'); + this.communication.VExt = this.createDataItem('VExt', 'number', 'write'); + this.communication.VOp = this.createDataItem('VOp', 'number', 'write'); + this.communication.VInt = this.createDataItem('VInt', 'number'); + this.communication.VReq = this.createDataItem('VReq','number'); + this.communication.VOut = this.createDataItem('VOut', 'number'); + this.communication.VFbk = this.createDataItem('VFbk', 'number'); + + this.communication.VSclMin = this.createDataItem('VSclMin', 'number'); + this.communication.VSclMax = this.createDataItem('VSclMax', 'number'); + this.communication.VUnit = this.createDataItem('VUnit', 'number'); + this.communication.VMin = this.createDataItem('VMin', 'number'); + this.communication.VMax = this.createDataItem('VMax', 'number'); this.defaultReadDataItem = this.communication.VOut; this.defaultReadDataItemType = 'number'; + this.defaultWriteDataItem = this.communication.VExt; this.defaultWriteDataItemType = 'number'; - this.defaultWriteDataItem = this.communication.VExt; //TODO correct? } } diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/index.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/index.ts index 94b3d2ef..37b4a25b 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/index.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './anaServParam/AnaServParam'; export * from './binServParam/BinServParam'; export * from './dIntServParam/DIntServParam'; diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.mockup.spec.ts index 06ed035a..55386682 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.mockup.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.mockup.spec.ts @@ -1,53 +1,79 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Namespace, UAObject} from 'node-opcua'; -import {StringServParamMockup} from './StringServParam.mockup'; +import {getStringServParamDataItemOptions, getStringServParamOptions, StringServParamMockup} from './StringServParam.mockup'; import {MockupServer} from '../../../../../_utils'; import {OpcUaConnection} from '../../../../connection'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {StringServParamRuntime} from './StringServParam'; + chai.use(chaiAsPromised); const expect = chai.expect; -// this fake class is needed to test the protected variable -class FakeClass extends StringServParamMockup{ - constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { - super(namespace, rootNode, variableName); - } - public getVOut(){ - return this.vOut; - } -} - describe('StringServParamMockup', () => { - describe('', () => { + + describe('static', () => { + let mockupServer: MockupServer; + beforeEach(async()=>{ mockupServer = new MockupServer(); await mockupServer.initialize(); }); - afterEach(async () => { - }); it('should create StringServParamMockup', () => { - const mockup= new StringServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + const mockup= new StringServParamMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); expect(mockup).to.not.be.undefined; - //TODO: test more + }); + it('static DataItemOptions', () => { + const options = getStringServParamDataItemOptions(1, 'Test') as StringServParamRuntime; + expect(Object.keys(options).length).to.equal(26); }); - it('getStringServParamMockupReferenceJSON()', () => { - const mockup = new StringServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const json = mockup.getStringServParamMockupJSON(); - expect(json).not.to.be.undefined; - expect(Object.keys(json).length).to .equal(26); - //TODO: test more + + it('static DataAssemblyOptions', () => { + const options = getStringServParamOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(28); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new StringServParamMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(28); }); - it('startCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + // TODO + /*it('startCurrentTimeUpdate()', async() => { + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); expect(mockup.getVOut()).to.be.empty; await new Promise(f => setTimeout(f, 1000)); @@ -55,8 +81,8 @@ describe('StringServParamMockup', () => { }); it('stopCurrentTimeUpdate()', async() => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; mockup.startCurrentTimeUpdate(); mockup.stopCurrentTimeUpdate(); expect(mockup.getVOut()).to.be.empty; @@ -66,25 +92,25 @@ describe('StringServParamMockup', () => { }); it('stopCurrentTimeUpdate(), interval undefined', () => { - const mockup: FakeClass = new FakeClass(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable') as FakeClass; + const mockup: FakeClass = new FakeClass(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable') as FakeClass; expect((() => mockup.stopCurrentTimeUpdate())).to.throw(); - }); + });*/ }); describe('dynamic', () => { - // we need to check if the nodes was addes succesfully and are writeable and readable + let mockupServer: MockupServer; - let mockup: StringServParamMockup; let connection: OpcUaConnection; + beforeEach(async function () { this.timeout(5000); mockupServer = new MockupServer(); await mockupServer.initialize(); - mockup = new StringServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); + new StringServParamMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334'); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -94,17 +120,15 @@ describe('StringServParamMockup', () => { }); it('set and get VExt', async () => { - await connection.writeOpcUaNode('Variable.VExt', namespaceUrl, 'test', 'String'); - await connection.readOpcUaNode('Variable.VExt', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal('test')); + await connection.writeNode('Variable.VExt', mockupServer.nameSpaceUri, 'test', 'String'); + await connection.readNode('Variable.VExt', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal('test')); }).timeout(3000); it('set and get VOp', async () => { - await connection.writeOpcUaNode('Variable.VOp', namespaceUrl, 'test', 'String'); - await connection.readOpcUaNode('Variable.VOp', namespaceUrl) - .then(datavalue => expect(datavalue?.value.value).to.equal('test')); + await connection.writeNode('Variable.VOp', mockupServer.nameSpaceUri, 'test', 'String'); + await connection.readNode('Variable.VOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal('test')); }).timeout(3000); - - //TODO get the rest }); }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.mockup.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.mockup.ts index a8c8bfbb..1896b097 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.mockup.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.mockup.ts @@ -26,48 +26,65 @@ // eslint-disable-next-line no-undef import Timeout = NodeJS.Timeout; import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {getServParamMockupReferenceJSON, ServParamMockup} from '../ServParam.mockup'; +import {getServParamDataItemOptions, ServParamMockup} from '../ServParam.mockup'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; +import {getDataAssemblyOptions} from '../../../DataAssemblyController.mockup'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -export function getStringServParamMockupReferenceJSON( - namespace: number, - objectBrowseName: string) { +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/OperationElement/StringServParam'; +function getStringServParamSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { return ({ - ...getServParamMockupReferenceJSON(namespace, objectBrowseName), - VExt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VExt`, - dataType: 'String' - }, - VOp: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VOp`, - dataType: 'String' - }, - VInt: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VInt`, - dataType: 'String' - }, - VReq: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VReq`, - dataType: 'String' - }, - VOut: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VOut`, - dataType: 'String' - }, - VFbk: { - namespaceIndex: `${namespace}`, - nodeId: `${objectBrowseName}.VFbk`, - dataType: 'String' - } - } + VExt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VExt`, + dataType: 'String' + } as OpcUaNodeOptions, + VOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VOp`, + dataType: 'String' + } as OpcUaNodeOptions, + VInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VInt`, + dataType: 'String' + } as OpcUaNodeOptions, + VReq: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VReq`, + dataType: 'String' + } as OpcUaNodeOptions, + VOut: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VOut`, + dataType: 'String' + } as OpcUaNodeOptions, + VFbk: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.VFbk`, + dataType: 'String' + } as OpcUaNodeOptions + }); +} + +export function getStringServParamDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getServParamDataItemOptions(namespace, objectBrowseName), + ...getStringServParamSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions ); } +export function getStringServParamOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getStringServParamDataItemOptions(namespace, objectBrowseName)}; + return options; +} + export class StringServParamMockup extends ServParamMockup{ protected vExt = ''; @@ -159,10 +176,14 @@ export class StringServParamMockup extends ServParamMockup{ } - public getStringServParamMockupJSON() { - return getStringServParamMockupReferenceJSON( - this.mockupNode.namespaceIndex, - this.mockupNode.browseName.name as string); + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getStringServParamSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; } public startCurrentTimeUpdate(): void { diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.puml b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.puml index be7a24ca..c35622ef 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.puml +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram class StringServParam{ diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.spec.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.spec.ts index e218578f..8995c7b2 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.spec.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.spec.ts @@ -29,40 +29,34 @@ import {StringServParam} from './StringServParam'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {MockupServer} from '../../../../../_utils'; -import {ServParamMockup} from '../ServParam.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl} from '../../../../../../../tests/namespaceUrl'; -import {ServParam} from '../ServParam'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -//stringservparam overlaps with anaservparam.json -import * as baseDataAssemblyOptions from '../../../../../../../tests/anaserveparam.json'; import {DataAssemblyControllerFactory} from '../../../DataAssemblyControllerFactory'; -import {StringServParamMockup} from './StringServParam.mockup'; +import {getStringServParamOptions, StringServParamMockup} from './StringServParam.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('StringServParam', () => { - const dataAssemblyOptions: DataAssemblyOptions = { - name: 'Variable', - metaModelRef: 'MTPDataObjectSUCLib/DataAssembly/OperationElement/StringServParam', - dataItems: baseDataAssemblyOptions - }; + + let dataAssemblyOptions: DataAssemblyOptions; describe('static', () => { - const emptyOPCUAConnection = new OpcUaConnection('', ''); + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getStringServParamOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + it('should create StringServParam', () => { - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as StringServParam; - expect(da1.serviceSourceMode).to.not.be.undefined; - expect(da1.serviceOpMode).to.not.be.undefined; - expect(da1.wqc).to.not.be.undefined; - expect(da1.communication.Sync).to.not.be.undefined; - expect(da1.communication.VExt).to.not.be.undefined; - expect(da1.communication.VOp).to.not.be.undefined; - expect(da1.communication.VInt).to.not.be.undefined; - expect(da1.communication.VReq).to.not.be.undefined; - expect(da1.communication.VOut).to.not.be.undefined; - expect(da1.communication.VFbk).to.not.be.undefined; + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, emptyOPCUAConnection) as StringServParam; + expect(dataAssemblyController.serviceSourceMode).to.not.be.undefined; + expect(dataAssemblyController.serviceOpMode).to.not.be.undefined; + expect(dataAssemblyController.wqc).to.not.be.undefined; + expect(dataAssemblyController.communication.Sync).to.not.be.undefined; + expect(dataAssemblyController.communication.VExt).to.not.be.undefined; + expect(dataAssemblyController.communication.VOp).to.not.be.undefined; + expect(dataAssemblyController.communication.VInt).to.not.be.undefined; + expect(dataAssemblyController.communication.VReq).to.not.be.undefined; + expect(dataAssemblyController.communication.VOut).to.not.be.undefined; + expect(dataAssemblyController.communication.VFbk).to.not.be.undefined; }); }); describe('dynamic', () => { @@ -73,12 +67,11 @@ describe('StringServParam', () => { this.timeout(4000); mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new StringServParamMockup( - mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, - 'Variable'); + const stringServParamMockup = new StringServParamMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = stringServParamMockup.getDataAssemblyOptions(); await mockupServer.start(); - connection = new OpcUaConnection('PEATestServer', 'opc.tcp://localhost:4334','',''); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); await connection.connect(); }); @@ -89,47 +82,41 @@ describe('StringServParam', () => { }); it('should subscribe successfully', async () => { - // set namespaceUrl - for (const key in dataAssemblyOptions.dataItems as any) { - //skip static values - if((typeof(dataAssemblyOptions.dataItems as any)[key] != 'string')){ - (dataAssemblyOptions.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - const da1 = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as StringServParam; - const pv = da1.subscribe(); - await connection.startListening(); - await pv; - expect(da1.communication.WQC.value).equal(0); - - expect((da1).communication.StateChannel.value).equal(false); - expect((da1).communication.StateOffAut.value).equal(false); - expect((da1).communication.StateOpAut.value).equal(false); - expect((da1).communication.StateAutAut.value).equal(false); - expect((da1).communication.StateOffOp.value).equal(false); - expect((da1).communication.StateOpOp.value).equal(false); - expect((da1).communication.StateAutOp.value).equal(false); - expect((da1).communication.StateOpAct.value).equal(false); - expect((da1).communication.StateAutAct.value).equal(false); - expect((da1).communication.StateOffAct.value).equal(true); - - expect(da1.communication.SrcChannel.value).equal(false); - expect(da1.communication.SrcExtAut.value).equal(false); - expect(da1.communication.SrcIntAut.value).equal(false); - expect(da1.communication.SrcIntOp.value).equal(false); - expect(da1.communication.SrcExtOp.value).equal(false); - expect(da1.communication.SrcIntAct.value).equal(true); - expect(da1.communication.SrcExtAct.value).equal(false); - - expect(da1.communication.Sync.value).equal(false); - - expect(da1.communication.VExt.value).equal(''); - expect(da1.communication.VOp.value).equal(''); - expect(da1.communication.VInt.value).equal(''); - expect(da1.communication.VReq.value).equal(''); - expect(da1.communication.VOut.value).equal(''); - expect(da1.communication.VFbk.value).equal(''); + + const dataAssemblyController = DataAssemblyControllerFactory.create(dataAssemblyOptions, connection) as StringServParam; + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + + expect((dataAssemblyController).communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcExtAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcExtOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcExtAct.value).equal(false); + + expect(dataAssemblyController.communication.Sync.value).equal(false); + + expect(dataAssemblyController.communication.VExt.value).equal(''); + expect(dataAssemblyController.communication.VOp.value).equal(''); + expect(dataAssemblyController.communication.VInt.value).equal(''); + expect(dataAssemblyController.communication.VReq.value).equal(''); + expect(dataAssemblyController.communication.VOut.value).equal(''); + expect(dataAssemblyController.communication.VFbk.value).equal(''); }).timeout(4000); }); - }); diff --git a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.ts b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.ts index 5470b054..95d77944 100644 --- a/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.ts +++ b/src/modularPlantManager/pea/dataAssembly/operationElement/servParam/stringServParam/StringServParam.ts @@ -24,16 +24,16 @@ */ import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {OpcUaConnection, OpcUaDataItem} from '../../../../connection'; +import {OpcUaConnection, DataItem} from '../../../../connection'; import {ServParam, ServParamRuntime} from '../ServParam'; export type StringServParamRuntime = ServParamRuntime & { - VExt: OpcUaDataItem; - VOp: OpcUaDataItem; - VInt: OpcUaDataItem; - VReq: OpcUaDataItem; - VOut: OpcUaDataItem; - VFbk: OpcUaDataItem; + VExt: DataItem; + VOp: DataItem; + VInt: DataItem; + VReq: DataItem; + VOut: DataItem; + VFbk: DataItem; }; export class StringServParam extends ServParam { @@ -42,17 +42,18 @@ export class StringServParam extends ServParam { constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); - this.communication.VExt = this.createDataItem('VExt', 'write', 'string'); - this.communication.VOp = this.createDataItem('VOp', 'write', 'string'); - this.communication.VInt = this.createDataItem('VInt', 'read', 'string'); - this.communication.VReq = this.createDataItem('VReq', 'read', 'string'); - this.communication.VOut = this.createDataItem('VOut', 'read', 'string'); - this.communication.VFbk = this.createDataItem('VFbk', 'read', 'string'); + this.communication.VExt = this.createDataItem('VExt', 'string', 'write'); + this.communication.VOp = this.createDataItem('VOp', 'string', 'write'); + this.communication.VInt = this.createDataItem('VInt', 'string'); + this.communication.VReq = this.createDataItem('VReq', 'string'); + this.communication.VOut = this.createDataItem('VOut', 'string'); + this.communication.VFbk = this.createDataItem('VFbk', 'string'); this.defaultReadDataItem = this.communication.VOut; this.defaultReadDataItemType = 'string'; + + this.defaultWriteDataItem = this.communication.VExt; this.defaultWriteDataItemType = 'string'; - this.defaultWriteDataItem = this.communication.VExt; //TODO correct? } } diff --git a/src/modularPlantManager/pea/dataAssembly/serviceControl/SequenceServiceOperatorInteraction.puml b/src/modularPlantManager/pea/dataAssembly/serviceControl/SequenceServiceOperatorInteraction.puml new file mode 100644 index 00000000..f06c2564 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/serviceControl/SequenceServiceOperatorInteraction.puml @@ -0,0 +1,75 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml + +skinparam monochrome false + +participant Service +participant POL +actor Operator + +group initial condition + +rnote over POL + MTP imported + >possible questions + >valid answers +endrnote + +rnote over Service + InteractQuestionID = 0 + InteractAnswerID = 0 +endrnote + +end + +loop + Service <-- POL : await InteractQuestionID change' + rnote over Service + InteractQuestionID > 0 + endrnote + Service --> POL : receive InteractQuestionID' +end +rnote over POL + Get Question String + Get pot. answers +endrnote + +POL --> Operator : Question & potential Answers +rnote over Operator + Pick Answer +endrnote +POL <-- Operator : AnswerID + +Service <-- POL : write InteractAnswerID + +rnote over Service #F00 + Reset + InteractQuestionID = 0 + InteractAnswerID = 0 +endrnote + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.mockup.spec.ts b/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.mockup.spec.ts new file mode 100644 index 00000000..34cfe93d --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.mockup.spec.ts @@ -0,0 +1,185 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../_utils'; +import {getServiceControlDataItemOptions, getServiceControlOptions, ServiceControlMockup} from './ServiceControl.mockup'; +import {OpcUaConnection} from '../../connection'; +import {DataAssemblyOptions, OperationMode, ServiceSourceMode} from '@p2olab/polaris-interface'; +import {ServiceControlRuntime} from './ServiceControl'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('ServiceControlMockup', () => { + + describe('static', () => { + + let mockupServer: MockupServer; + + beforeEach(async()=>{ + mockupServer = new MockupServer(); + await mockupServer.initialize(); + }); + + it('should create ServiceControlMockup', async () => { + const mockup= new ServiceControlMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + expect(mockup).to.not.be.undefined; + + }); + + it('static DataItemOptions', () => { + const options = getServiceControlDataItemOptions(1, 'Test') as ServiceControlRuntime; + expect(Object.keys(options).length).to.equal(32); + }); + + it('static DataAssemblyOptions', () => { + const options = getServiceControlOptions(1, 'Test') as DataAssemblyOptions; + expect(Object.keys(options.dataItems).length).to.equal(34); + }); + + it('dynamic DataAssemblyOptions', () => { + const mockup = new ServiceControlMockup(mockupServer.nameSpace, + mockupServer.rootObject, 'Variable'); + const options = mockup.getDataAssemblyOptions(); + + expect(Object.keys(options.dataItems).length).to.equal(34); + }); + }); + + describe('dynamic', () => { + + let mockupServer: MockupServer; + let mockup: ServiceControlMockup; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(5000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + mockup = new ServiceControlMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + await mockupServer.start(); + + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async () => { + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + describe('CommandOp', () => { + it('set and get CommandOp, should work', async () => { + // set up mockup + mockup.operationMode.opMode = OperationMode.Operator; + mockup.commandEn = 1; + + await connection.writeNode('Variable.CommandOp', mockupServer.nameSpaceUri, 1, 'UInt32'); + await connection.readNode('Variable.CommandOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }); + + it('set CommandOp, value not valid, should fail', async () => { + return expect(connection.writeNode('Variable.CommandOp', mockupServer.nameSpaceUri, 100, 'UInt32')) + .rejectedWith('One or more arguments are invalid.'); + }); + + it('set CommandOp, not Operator, should fail', async () => { + return expect(connection.writeNode('Variable.CommandOp', mockupServer.nameSpaceUri, 1, 'UInt32')) + .rejectedWith('One or more arguments are invalid.'); + }); + + it('set CommandOp, commandEn=0, should fail', async () => { + mockup.operationMode.opMode = OperationMode.Operator; // set up mockup + return expect(connection.writeNode('Variable.CommandOp', mockupServer.nameSpaceUri, 1, 'UInt32')) + .rejectedWith('One or more arguments are invalid.'); + }); + }); + + describe('CommandExt', () => { + + it('set CommandExt, should change state', async () => { + // set up mockup + mockup.operationMode.opMode = OperationMode.Automatic; + mockup.serviceSourceMode.srcMode = ServiceSourceMode.Extern; + await connection.writeNode('Variable.CommandExt', mockupServer.nameSpaceUri, 4, 'UInt32'); + await connection.readNode('Variable.StateCur', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(64)); + + }); + + it('set CommandExt, value not valid, should fail', async () => { + return expect(connection.writeNode('Variable.CommandExt', mockupServer.nameSpaceUri, 100, 'UInt32')) + .rejectedWith('One or more arguments are invalid.'); + }); + it('set CommandExt, not Automatic, should fail', async () => { + return expect(connection.writeNode('Variable.CommandExt', mockupServer.nameSpaceUri, 1, 'UInt32')) + .rejectedWith('One or more arguments are invalid.'); + }); + it('set CommandExt, commandEn=0, should fail', async () => { + mockup.operationMode.opMode = OperationMode.Automatic; + return expect(connection.writeNode('Variable.CommandExt', mockupServer.nameSpaceUri, 1, 'UInt32')) + .rejectedWith('One or more arguments are invalid.'); + }); + }); + + describe('ProcedureOp', () => { + + it('set and get ProcedureOp, should work', async () => { + // set up mockup + mockup.operationMode.opMode = OperationMode.Operator; + await connection.writeNode('Variable.ProcedureOp', mockupServer.nameSpaceUri, 1, 'UInt32'); + await connection.readNode('Variable.ProcedureOp', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }); + + it('set and get ProcedureOp, should fail', async () => { + return expect(connection.writeNode('Variable.ProcedureOp', mockupServer.nameSpaceUri, 1, 'UInt32')) + .rejectedWith('One or more arguments are invalid.'); + }); + }); + + describe('ProcedureExt', () => { + + it('set and get ProcedureExt, should work', async () => { + expect(connection.writeNode('Variable.ProcedureExt', mockupServer.nameSpaceUri, 1, 'UInt32')); + await connection.readNode('Variable.ProcedureExt', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }); + + it('set ProcedureExt and get ProcedureReq, should work', async () => { + mockup.operationMode.opMode = OperationMode.Automatic; + mockup.serviceSourceMode.srcMode = ServiceSourceMode.Extern; + await connection.writeNode('Variable.ProcedureExt', mockupServer.nameSpaceUri, 1, 'UInt32'); + await connection.readNode('Variable.ProcedureReq', mockupServer.nameSpaceUri) + .then((dataValue) => expect((dataValue)?.value.value).to.equal(1)); + }); + }); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.mockup.ts b/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.mockup.ts new file mode 100644 index 00000000..b6586e20 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.mockup.ts @@ -0,0 +1,421 @@ +/* + * MIT License + * + * Copyright (c) 2020 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; +import {getOpModeDataItemOptions, OpModeMockup} from '../baseFunction/opMode/OpMode.mockup'; +import {getServiceSourceModeDataItemOptions, ServiceSourceModeMockup} from '../baseFunction/serviceSourceMode/ServiceSourceMode.mockup'; +import {ServiceMtpCommand, ServiceState, ServiceStateString} from '../../serviceSet/service/enum'; +import {getWQCDataItemOptions, WQCMockup} from '../baseFunction/wqc/WQC.mockup'; +import {getOSLevelDataItemOptions, OSLevelMockup} from '../baseFunction/osLevel/OSLevel.mockup'; +import {DataAssemblyControllerMockup, getDataAssemblyOptions} from '../DataAssemblyController.mockup'; +import {MtpStateMachine, UserDefinedActions, UserDefinedGuard} from '../../stateMachine/MtpStateMachine'; +import {DataAssemblyOptions} from '@p2olab/polaris-interface'; +import {OpcUaNodeOptions} from '@p2olab/polaris-interface/dist/core/options'; + +const metaModelReference = 'MTPDataObjectSUCLib/DataAssembly/ServiceControl'; + +function getServiceControlSpecificDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + CommandOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.CommandOp`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + CommandInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.CommandInt`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + CommandExt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.CommandExt`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + CommandEn: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.CommandEn`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + StateCur: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.StateCur`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + ProcedureOp: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.ProcedureOp`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + ProcedureExt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.ProcedureExt`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + ProcedureInt: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.ProcedureInt`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + ProcedureCur: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.ProcedureCur`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + ProcedureReq: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.ProcedureReq`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + InteractQuestionID: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.InteractQuestionID`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + InteractAnswerID: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.InteractAnswerID`, + dataType: 'UInt32' + } as OpcUaNodeOptions, + PosTextID: { + namespaceIndex: `${namespace}`, + nodeId: `${objectBrowseName}.PosTextID`, + dataType: 'UInt32' + } as OpcUaNodeOptions + }); +} + +export function getServiceControlDataItemOptions(namespace: number, objectBrowseName: string): object { + return ({ + ...getOpModeDataItemOptions(namespace, objectBrowseName), + ...getServiceSourceModeDataItemOptions(namespace, objectBrowseName), + ...getWQCDataItemOptions(namespace, objectBrowseName), + ...getOSLevelDataItemOptions(namespace, objectBrowseName), + ...getServiceControlSpecificDataItemOptions(namespace, objectBrowseName), + } as OpcUaNodeOptions + ); +} + +export function getServiceControlOptions(namespace: number, objectBrowseName: string, name?: string, tagName?: string, tagDescription?: string): object { + const options = getDataAssemblyOptions(name, tagName, tagDescription); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...getServiceControlDataItemOptions(namespace, objectBrowseName)}; + return options; +} + +export class ServiceControlMockup extends DataAssemblyControllerMockup { + + public serviceSourceMode: ServiceSourceModeMockup; + public operationMode: OpModeMockup; + public wqc: WQCMockup; + public osLevel: OSLevelMockup; + + public commandEn = 0; + protected commandOp = 0; + protected commandInt = 0; + protected commandExt = 0; + protected procedureExt = 0; + protected posTextID = 0; + protected interactAnswerID = 0; + protected interactQuestionID = 0; + + protected stateMachine: MtpStateMachine; + + constructor(namespace: Namespace, rootNode: UAObject, variableName: string) { + super(namespace, rootNode, variableName); + + this.operationMode = new OpModeMockup(namespace, this.mockupNode, variableName); + this.serviceSourceMode = new ServiceSourceModeMockup(namespace, this.mockupNode, variableName); + this.wqc = new WQCMockup(namespace, this.mockupNode, variableName); + this.osLevel = new OSLevelMockup(namespace, this.mockupNode, this.name); + this.stateMachine = new MtpStateMachine(variableName, {} as UserDefinedGuard, {} as UserDefinedActions); + this.stateMachine.start(); + + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.CommandOp`, + browseName: `${variableName}.CommandOp`, + dataType: 'UInt32', + value: { + get: (): Variant => { + return new Variant({dataType: DataType.UInt32, value: this.commandOp}); + }, + set: (variant: Variant): StatusCodes => { + const reqCommandOp = parseInt(variant.value, 10); + if (!Object.values(ServiceMtpCommand).includes(reqCommandOp)) { + return StatusCodes.BadInvalidArgument; + } + if (this.operationMode.stateOpAct) { + if (this.commandEn === reqCommandOp) { + this.commandOp = reqCommandOp; + return StatusCodes.Good; + } + } + this.commandOp = ServiceMtpCommand.UNDEFINED; + return StatusCodes.BadInvalidArgument; + }, + }, + }); + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.CommandInt`, + browseName: `${variableName}.CommandInt`, + dataType: 'UInt32', + value: { + get: (): Variant => { + return new Variant({dataType: DataType.UInt32, value: this.commandInt}); + }, + }, + }); + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.CommandExt`, + browseName: `${variableName}.CommandExt`, + dataType: 'UInt32', + value: { + get: (): Variant => { + return new Variant({dataType: DataType.UInt32, value: this.commandExt}); + }, + set: (variant: Variant): StatusCodes => { + const reqCommandExt = parseInt(variant.value, 10); + if (!Object.values(ServiceMtpCommand).includes(reqCommandExt)) { + return StatusCodes.BadInvalidArgument; + } + if (this.operationMode.stateAutAct && this.serviceSourceMode.srcExtAct) { + /* if(this.commandEn===reqCommandExt){ + this.commandExt = reqCommandExt; + return StatusCodes.Good; + }*/ + this.logger.info(`Set service CommandExt (${this.name}): ${ServiceMtpCommand[reqCommandExt]} (${reqCommandExt})`); + const result = this.stateMachine.triggerEvent(reqCommandExt); + if (result) { + return StatusCodes.Good; + } + } + this.commandExt = ServiceMtpCommand.UNDEFINED; + return StatusCodes.BadInvalidArgument; + }, + }, + }); + + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.ProcedureOp`, + browseName: `${variableName}.ProcedureOp`, + dataType: 'UInt32', + value: { + get: (): Variant => { + return new Variant({dataType: DataType.UInt32, value: this._procedureOp}); + }, + set: (variant: Variant): StatusCodes => { + const reqProcedureOp = parseInt(variant.value, 10); + if (this.operationMode.stateOpAct) { + // TODO: check if procedure is valid + this._procedureOp = reqProcedureOp; + return StatusCodes.Good; + } + return StatusCodes.BadInvalidArgument; + }, + }, + }); + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.ProcedureInt`, + browseName: `${variableName}.ProcedureInt`, + dataType: 'UInt32', + value: { + get: (): Variant => { + return new Variant({dataType: DataType.UInt32, value: this._procedureInt}); + }, + }, + }); + + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.ProcedureExt`, + browseName: `${variableName}.ProcedureExt`, + dataType: 'UInt32', + value: { + get: (): Variant => { + return new Variant({dataType: DataType.UInt32, value: this.procedureExt}); + }, + set: (variant: Variant): StatusCodes => { + const reqProcedureExt = parseInt(variant.value, 10); + this.procedureExt = reqProcedureExt; + if (this.operationMode.stateAutAct && this.serviceSourceMode.srcExtAct) { + // TODO: check if procedure is valid + this.stateMachine.setProcedureReq(reqProcedureExt); + this.logger.info( + `Set ProcedureReq by ProcedureExt (${this.name}): ProcedureReq: ${this.stateMachine.getProcedureReq()}`); + } + return StatusCodes.Good; + }, + }, + }); + + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.StateCur`, + browseName: `${variableName}.StateCur`, + dataType: 'UInt32', + value: { + get: (): Variant => { + const stateCur: ServiceState = ServiceState[this.state]; + return new Variant({dataType: DataType.UInt32, value: stateCur}); + }, + }, + }); + + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.CommandEn`, + browseName: `${variableName}.CommandEn`, + dataType: 'UInt32', + value: { + get: (): Variant => { + let enabled = 0; + for (const [key, value] of this.stateMachine.getCommandEnabled()) { + if (value) { + enabled += ServiceMtpCommand[key]; + } + } + return new Variant({dataType: DataType.UInt32, value: enabled}); + }, + }, + }); + + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.ProcedureCur`, + browseName: `${variableName}.ProcedureCur`, + dataType: 'UInt32', + value: { + get: (): Variant => { + return new Variant({dataType: DataType.UInt32, value: this.procedureCur}); + }, + }, + }); + + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.ProcedureReq`, + browseName: `${variableName}.ProcedureReq`, + dataType: 'UInt32', + value: { + get: (): Variant => { + return new Variant({dataType: DataType.UInt32, value: this.procedureReq}); + }, + }, + }); + + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.PosTextID`, + browseName: `${variableName}.PosTextID`, + dataType: 'UInt32', + value: { + get: (): Variant => { + return new Variant({dataType: DataType.UInt32, value: this.posTextID}); + }, + }, + }); + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.InteractQuestionID`, + browseName: `${variableName}.InteractQuestionID`, + dataType: 'UInt32', + value: { + get: (): Variant => { + return new Variant({dataType: DataType.UInt32, value: this.interactQuestionID}); + }, + }, + }); + namespace.addVariable({ + componentOf: this.mockupNode, + nodeId: `ns=${namespace.index};s=${variableName}.InteractAnswerID`, + browseName: `${variableName}.InteractAnswerID`, + dataType: 'UInt32', + value: { + get: (): Variant => { + return new Variant({dataType: DataType.UInt32, value: this.interactAnswerID}); + }, + }, + }); + } + + private _procedureOp = 0; + + public set procedureOp(procedureOp: number) { + const procedure = Math.trunc(procedureOp); + if (this.operationMode.stateOpAct && this.osLevel.osLevel === 0) { + // TODO: check if procedure is valid + this.stateMachine.setProcedureReq(procedure); + this.logger.info( + `Set ProcedureReq by ProcedureOp (${this.name}): ProcedureReq: ${this.stateMachine.getProcedureReq()}`); + } + } + + private _procedureInt = 0; + + public set procedureInt(procedureInt: number) { + const procedure = Math.trunc(procedureInt); + if (this.operationMode.stateAutAct && this.serviceSourceMode.srcIntAct) { + this.stateMachine.setProcedureReq(procedure); + this.logger.info( + `Set ProcedureReq by ProcedureInt (${this.name}): ProcedureReq: ${this.stateMachine.getProcedureReq()}`); + } + } + + public get state(): ServiceStateString { + return this.stateMachine.getState(); + } + + public sendCommand(cmd: ServiceMtpCommand): void { + this.stateMachine.triggerEvent(cmd); + } + + public get procedureCur(): number { + return this.stateMachine.getProcedureCur(); + } + + public get procedureReq(): number { + return this.stateMachine.getProcedureReq(); + } + + public getDataAssemblyOptions(): DataAssemblyOptions { + const options = super.getDataAssemblyOptions(); + options.metaModelRef = metaModelReference; + options.dataItems = { + ...options.dataItems, + ...this.operationMode.getDataItemOptions(), + ...this.serviceSourceMode.getDataItemOptions(), + ...this.wqc.getDataItemOptions(), + ...this.osLevel.getDataItemOptions(), + ...getServiceControlSpecificDataItemOptions(this.mockupNode.namespaceIndex, this.mockupNode.browseName.name as string), + }; + return options; + } +} diff --git a/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.puml b/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.puml new file mode 100644 index 00000000..3fb28e0a --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.puml @@ -0,0 +1,43 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram +!include ../_extensions/wqc/WQC.puml +!include ../_extensions/opMode/OpMode.puml +!include ../_extensions/serviceSourceMode/ServiceSourceModeController.puml +class ServiceControl{ + + readonly communication!: ServiceControlRuntime + + readonly wqc: WQC + + readonly opMode: OpMode + + readonly serviceSourceMode: ServiceSourceModeController +} + +ServiceControl *- ServiceControlRuntime +ServiceControl *- WQC +ServiceControl *- OpMode +ServiceControl *- ServiceSourceModeController + +@enduml diff --git a/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.spec.ts b/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.spec.ts new file mode 100644 index 00000000..3729e5a6 --- /dev/null +++ b/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.spec.ts @@ -0,0 +1,125 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { + DataAssemblyOptions, +} from '@p2olab/polaris-interface'; +import {OpcUaConnection} from '../../connection'; +import { + ServiceControl +} from './ServiceControl'; + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import {MockupServer} from '../../../_utils'; +import {getServiceControlOptions, ServiceControlMockup} from './ServiceControl.mockup'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('ServiceControl', () => { + + let dataAssemblyOptions: DataAssemblyOptions; + + describe('static', () => { + + const emptyOPCUAConnection = new OpcUaConnection(); + dataAssemblyOptions = getServiceControlOptions(2, 'Variable', 'Variable') as DataAssemblyOptions; + + it('should create ServiceControl', async () => { + const dataAssemblyController = new ServiceControl(dataAssemblyOptions, emptyOPCUAConnection); + expect(dataAssemblyController.opMode).to.not.equal(undefined); + expect(dataAssemblyController.serviceSourceMode).to.not.equal(undefined); + + expect(dataAssemblyController.communication.WQC).to.not.equal(undefined); + expect(dataAssemblyController.communication.CommandOp).to.not.equal(undefined); + expect(dataAssemblyController.communication.CommandExt).to.not.equal(undefined); + expect(dataAssemblyController.communication.CommandInt).to.not.equal(undefined); + expect(dataAssemblyController.communication.CommandEn).to.not.equal(undefined); + expect(dataAssemblyController.communication.StateCur).to.not.equal(undefined); + expect(dataAssemblyController.communication.ProcedureOp).to.not.equal(undefined); + expect(dataAssemblyController.communication.ProcedureExt).to.not.equal(undefined); + expect(dataAssemblyController.communication.ProcedureInt).to.not.equal(undefined); + expect(dataAssemblyController.communication.ProcedureCur).to.not.equal(undefined); + expect(dataAssemblyController.communication.ProcedureReq).to.not.equal(undefined); + expect(dataAssemblyController.communication.InteractQuestionID).to.not.equal(undefined); + expect(dataAssemblyController.communication.InteractAnswerID).to.not.equal(undefined); + expect(dataAssemblyController.communication.PosTextID).to.not.equal(undefined); + }); + }); + + + describe('dynamic', () => { + let mockupServer: MockupServer; + let connection: OpcUaConnection; + + beforeEach(async function () { + this.timeout(4000); + mockupServer = new MockupServer(); + await mockupServer.initialize(); + const serviceControlMockup =new ServiceControlMockup(mockupServer.nameSpace, mockupServer.rootObject,'Variable'); + dataAssemblyOptions = serviceControlMockup.getDataAssemblyOptions(); + await mockupServer.start(); + connection = new OpcUaConnection(); + connection.initialize({endpoint: mockupServer.endpoint}); + await connection.connect(); + }); + + afterEach(async function () { + this.timeout(4000); + await connection.disconnect(); + await mockupServer.shutdown(); + }); + + it('should subscribe successfully', async () => { + + const dataAssemblyController = new ServiceControl(dataAssemblyOptions, connection); + await dataAssemblyController.subscribe(); + await connection.startMonitoring(); + await new Promise((resolve => dataAssemblyController.on('changed', resolve))); + + expect(dataAssemblyController.communication.WQC.value).equal(0); + expect((dataAssemblyController).communication.StateChannel.value).equal(false); + expect((dataAssemblyController).communication.StateOffAut.value).equal(false); + expect((dataAssemblyController).communication.StateOpAut.value).equal(false); + expect((dataAssemblyController).communication.StateAutAut.value).equal(false); + expect((dataAssemblyController).communication.StateOffOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpOp.value).equal(false); + expect((dataAssemblyController).communication.StateAutOp.value).equal(false); + expect((dataAssemblyController).communication.StateOpAct.value).equal(false); + expect((dataAssemblyController).communication.StateAutAct.value).equal(false); + expect((dataAssemblyController).communication.StateOffAct.value).equal(true); + + expect(dataAssemblyController.communication.SrcChannel.value).equal(false); + expect(dataAssemblyController.communication.SrcExtAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAut.value).equal(false); + expect(dataAssemblyController.communication.SrcIntOp.value).equal(false); + expect(dataAssemblyController.communication.SrcExtOp.value).equal(false); + expect(dataAssemblyController.communication.SrcIntAct.value).equal(true); + expect(dataAssemblyController.communication.SrcExtAct.value).equal(false); + + }).timeout(4000); + }); +}); diff --git a/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.ts b/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.ts similarity index 72% rename from src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.ts rename to src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.ts index bd92eb41..81b06bc4 100644 --- a/src/modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.ts +++ b/src/modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.ts @@ -23,69 +23,67 @@ * SOFTWARE. */ -import {OpcUaConnection, OpcUaDataItem} from '../../connection'; +import {OpcUaConnection, DataItem} from '../../connection'; import { BaseDataAssemblyRuntime, DataAssemblyController, OpModeRuntime, WQCRuntime } from '../index'; import {DataAssemblyOptions} from '@p2olab/polaris-interface'; -import {WQC} from '../_extensions/wqcDA/WQC'; -import {OpModeController} from '../_extensions/opModeDA/OpModeController'; +import {OpMode, WQC} from '../baseFunction'; import { ServiceSourceModeController, ServiceSourceModeRuntime -} from '../_extensions/serviceSourceModeDA/ServiceSourceModeController'; +} from '../baseFunction/serviceSourceMode/ServiceSourceModeController'; export type ServiceControlRuntime = BaseDataAssemblyRuntime & OpModeRuntime & ServiceSourceModeRuntime & WQCRuntime & { - CommandOp: OpcUaDataItem; - CommandInt: OpcUaDataItem; - CommandExt: OpcUaDataItem; - CommandEn: OpcUaDataItem; - StateCur: OpcUaDataItem; + CommandOp: DataItem; + CommandInt: DataItem; + CommandExt: DataItem; + CommandEn: DataItem; + StateCur: DataItem; - ProcedureOp: OpcUaDataItem; - ProcedureExt: OpcUaDataItem; - ProcedureInt: OpcUaDataItem; - ProcedureCur: OpcUaDataItem; - ProcedureReq: OpcUaDataItem; + ProcedureOp: DataItem; + ProcedureExt: DataItem; + ProcedureInt: DataItem; + ProcedureCur: DataItem; + ProcedureReq: DataItem; - InteractQuestionID: OpcUaDataItem; - InteractAnswerID: OpcUaDataItem; - PosTextID: OpcUaDataItem; + InteractQuestionID: DataItem; + InteractAnswerID: DataItem; + PosTextID: DataItem; }; export class ServiceControl extends DataAssemblyController { public readonly communication!: ServiceControlRuntime; public readonly wqc: WQC; - public readonly opMode: OpModeController; + public readonly opMode: OpMode; public readonly serviceSourceMode: ServiceSourceModeController; constructor(options: DataAssemblyOptions, connection: OpcUaConnection) { super(options, connection); this.wqc = new WQC(this); - - this.opMode = new OpModeController(this); - + this.opMode = new OpMode(this); this.serviceSourceMode = new ServiceSourceModeController(this); - this.communication.CommandOp = this.createDataItem('CommandOp', 'write'); - this.communication.CommandInt = this.createDataItem('CommandInt', 'write'); - this.communication.CommandExt = this.createDataItem('CommandExt', 'write'); - this.communication.CommandEn = this.createDataItem('CommandEn', 'read'); - this.communication.StateCur = this.createDataItem('StateCur', 'read'); + this.communication.CommandOp = this.createDataItem('CommandOp', 'number', 'write'); + this.communication.CommandInt = this.createDataItem('CommandInt', 'number', 'write'); + this.communication.CommandExt = this.createDataItem('CommandExt', 'number', 'write'); + this.communication.CommandEn = this.createDataItem('CommandEn','number'); + this.communication.StateCur = this.createDataItem('StateCur','number'); - this.communication.ProcedureOp = this.createDataItem('ProcedureOp', 'write'); - this.communication.ProcedureExt = this.createDataItem('ProcedureExt', 'write'); - this.communication.ProcedureInt = this.createDataItem('ProcedureInt', 'read'); - this.communication.ProcedureCur = this.createDataItem('ProcedureCur', 'read'); - this.communication.ProcedureReq = this.createDataItem('ProcedureReq', 'read'); + this.communication.ProcedureOp = this.createDataItem('ProcedureOp', 'number', 'write'); + this.communication.ProcedureExt = this.createDataItem('ProcedureExt', 'number', 'write'); + this.communication.ProcedureInt = this.createDataItem('ProcedureInt','number'); + this.communication.ProcedureCur = this.createDataItem('ProcedureCur','number'); + this.communication.ProcedureReq = this.createDataItem('ProcedureReq','number'); - this.communication.InteractQuestionID = this.createDataItem('InteractQuestionID', 'read'); - this.communication.InteractAnswerID = this.createDataItem('InteractAnswerID', 'write'); - this.communication.PosTextID = this.createDataItem('PosTextID', 'read'); + this.communication.InteractQuestionID = this.createDataItem('InteractQuestionID','number'); + this.communication.InteractAnswerID = this.createDataItem('InteractAnswerID', 'number', 'write'); + this.communication.PosTextID = this.createDataItem('PosTextID','number'); this.defaultReadDataItem = this.communication.StateCur; this.defaultReadDataItemType = 'number'; + this.defaultWriteDataItem = this.communication.CommandExt; this.defaultWriteDataItemType = 'number'; } diff --git a/src/modularPlantManager/pea/hmiSet/HMISet.puml b/src/modularPlantManager/pea/hmiSet/HMISet.puml index 1ffe5e33..99c622cc 100644 --- a/src/modularPlantManager/pea/hmiSet/HMISet.puml +++ b/src/modularPlantManager/pea/hmiSet/HMISet.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include picture/Picture.puml diff --git a/src/modularPlantManager/pea/hmiSet/picture/ConnectorInterface.puml b/src/modularPlantManager/pea/hmiSet/picture/ConnectorInterface.puml index f4e4e390..e848d6ae 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/ConnectorInterface.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/ConnectorInterface.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include InformationFlowConnector.puml diff --git a/src/modularPlantManager/pea/hmiSet/picture/InformationFlowConnector.puml b/src/modularPlantManager/pea/hmiSet/picture/InformationFlowConnector.puml index 6f874031..266ca6d7 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/InformationFlowConnector.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/InformationFlowConnector.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include LogicalPort.puml diff --git a/src/modularPlantManager/pea/hmiSet/picture/Junction.puml b/src/modularPlantManager/pea/hmiSet/picture/Junction.puml index 1be00a50..1d4c820d 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/Junction.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/Junction.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/hmiSet/picture/MassFlowConnector.puml b/src/modularPlantManager/pea/hmiSet/picture/MassFlowConnector.puml index f4899e6b..2b84496e 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/MassFlowConnector.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/MassFlowConnector.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include Nozzle.puml diff --git a/src/modularPlantManager/pea/hmiSet/picture/Picture.puml b/src/modularPlantManager/pea/hmiSet/picture/Picture.puml index b4e8291a..30b369bc 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/Picture.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/Picture.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include SemanticGroup.puml diff --git a/src/modularPlantManager/pea/hmiSet/picture/SemanticGroup.puml b/src/modularPlantManager/pea/hmiSet/picture/SemanticGroup.puml index b7fabf7c..d7d1f563 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/SemanticGroup.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/SemanticGroup.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include TopologyObject.puml diff --git a/src/modularPlantManager/pea/hmiSet/picture/TopologyObject.puml b/src/modularPlantManager/pea/hmiSet/picture/TopologyObject.puml index 279b6c49..6a995ecf 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/TopologyObject.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/TopologyObject.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include portObject/PortObject.puml diff --git a/src/modularPlantManager/pea/hmiSet/picture/VisualObject.puml b/src/modularPlantManager/pea/hmiSet/picture/VisualObject.puml index 26dee589..6fa6c37c 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/VisualObject.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/VisualObject.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include portObject/PortObject.puml diff --git a/src/modularPlantManager/pea/hmiSet/picture/connection/Connection.puml b/src/modularPlantManager/pea/hmiSet/picture/connection/Connection.puml index 4dccc31c..518dcce2 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/connection/Connection.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/connection/Connection.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include FunctionLine.puml diff --git a/src/modularPlantManager/pea/hmiSet/picture/connection/FunctionLine.puml b/src/modularPlantManager/pea/hmiSet/picture/connection/FunctionLine.puml index b2c48175..ad445454 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/connection/FunctionLine.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/connection/FunctionLine.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/hmiSet/picture/connection/MeasurementLine.puml b/src/modularPlantManager/pea/hmiSet/picture/connection/MeasurementLine.puml index a5124ca9..4e3e046c 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/connection/MeasurementLine.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/connection/MeasurementLine.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/hmiSet/picture/connection/Pipe.puml b/src/modularPlantManager/pea/hmiSet/picture/connection/Pipe.puml index 12beca4c..f4ca26df 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/connection/Pipe.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/connection/Pipe.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/hmiSet/picture/portObject/LogicalPort.puml b/src/modularPlantManager/pea/hmiSet/picture/portObject/LogicalPort.puml index f6a34394..4087a41f 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/portObject/LogicalPort.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/portObject/LogicalPort.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/hmiSet/picture/portObject/MeasurementPoint.puml b/src/modularPlantManager/pea/hmiSet/picture/portObject/MeasurementPoint.puml index a679769b..350bd318 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/portObject/MeasurementPoint.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/portObject/MeasurementPoint.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/hmiSet/picture/portObject/Nozzle.puml b/src/modularPlantManager/pea/hmiSet/picture/portObject/Nozzle.puml index 2a91ed6b..4502eda6 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/portObject/Nozzle.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/portObject/Nozzle.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/hmiSet/picture/portObject/PortObject.puml b/src/modularPlantManager/pea/hmiSet/picture/portObject/PortObject.puml index 0909a3bc..2d5e615a 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/portObject/PortObject.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/portObject/PortObject.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include LogicalPort.puml diff --git a/src/modularPlantManager/pea/hmiSet/picture/termination/Sink.puml b/src/modularPlantManager/pea/hmiSet/picture/termination/Sink.puml index 86a26d0c..c9f5acbf 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/termination/Sink.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/termination/Sink.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/hmiSet/picture/termination/Source.puml b/src/modularPlantManager/pea/hmiSet/picture/termination/Source.puml index 641dc688..d3fa2eff 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/termination/Source.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/termination/Source.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/hmiSet/picture/termination/Termination.puml b/src/modularPlantManager/pea/hmiSet/picture/termination/Termination.puml index eb30ef81..b42f1f26 100644 --- a/src/modularPlantManager/pea/hmiSet/picture/termination/Termination.puml +++ b/src/modularPlantManager/pea/hmiSet/picture/termination/Termination.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include Source.puml diff --git a/src/modularPlantManager/pea/index.ts b/src/modularPlantManager/pea/index.ts index f7ad26c7..0b4972c7 100644 --- a/src/modularPlantManager/pea/index.ts +++ b/src/modularPlantManager/pea/index.ts @@ -1,2 +1,27 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './PEAController'; export * from './serviceSet'; diff --git a/src/modularPlantManager/pea/serviceSet/SequenceConfigurationParamInvalid.puml b/src/modularPlantManager/pea/serviceSet/SequenceConfigurationParamInvalid.puml index bb715847..770ad328 100644 --- a/src/modularPlantManager/pea/serviceSet/SequenceConfigurationParamInvalid.puml +++ b/src/modularPlantManager/pea/serviceSet/SequenceConfigurationParamInvalid.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml skinparam monochrome false diff --git a/src/modularPlantManager/pea/serviceSet/SequenceConfigurationParamValid.puml b/src/modularPlantManager/pea/serviceSet/SequenceConfigurationParamValid.puml index 64d1b1bf..af5dc4dd 100644 --- a/src/modularPlantManager/pea/serviceSet/SequenceConfigurationParamValid.puml +++ b/src/modularPlantManager/pea/serviceSet/SequenceConfigurationParamValid.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml skinparam monochrome false diff --git a/src/modularPlantManager/pea/serviceSet/SequenceProcedureParamValid.puml b/src/modularPlantManager/pea/serviceSet/SequenceProcedureParamValid.puml index f00c947f..37f227e9 100644 --- a/src/modularPlantManager/pea/serviceSet/SequenceProcedureParamValid.puml +++ b/src/modularPlantManager/pea/serviceSet/SequenceProcedureParamValid.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml skinparam monochrome false diff --git a/src/modularPlantManager/pea/serviceSet/ServiceSet.puml b/src/modularPlantManager/pea/serviceSet/ServiceSet.puml index ff1d4581..11bf85ec 100644 --- a/src/modularPlantManager/pea/serviceSet/ServiceSet.puml +++ b/src/modularPlantManager/pea/serviceSet/ServiceSet.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include service/Service.puml diff --git a/src/modularPlantManager/pea/serviceSet/ServiceSet.spec.ts b/src/modularPlantManager/pea/serviceSet/ServiceSet.spec.ts index 8a49da2e..949e9843 100644 --- a/src/modularPlantManager/pea/serviceSet/ServiceSet.spec.ts +++ b/src/modularPlantManager/pea/serviceSet/ServiceSet.spec.ts @@ -24,7 +24,7 @@ */ import { - OperationMode, + OperationMode, PEAOptions, ServiceCommand, ServiceControlOptions, ServiceOptions, ServiceSourceMode @@ -35,6 +35,7 @@ import {PEAController, Service} from '../index'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import * as fs from 'fs'; +import * as peaOptions from '../../peaOptions.spec.json'; import {ServiceState} from './service/enum'; import {PEAMockup} from '../PEA.mockup'; @@ -43,7 +44,8 @@ const expect = chai.expect; describe('ServiceSet', () => { const parseJson = require('json-parse-better-errors'); - const opcUAConnection = new OpcUaConnection('', ''); + const opcUAConnection = new OpcUaConnection(); + const peaOptionsReference = peaOptions as any as PEAOptions; context('constructor', () => { it('should fail with missing options', () => { @@ -61,26 +63,21 @@ describe('ServiceSet', () => { expect(() => new Service( {name: 'test', parameters: [], communication: {} as ServiceControlOptions, procedures: []}, opcUAConnection, '') - ).to.throw('No connection defined for creating data assembly'); + ).to.throw('Creating DataAssemblyController Error: No Communication dataAssemblies found in DataAssemblyOptions'); }); }); it('should reject command if not connected', async () => { - const peaJson = - parseJson(fs.readFileSync('src/modularPlantManager/pea/_assets/JSON/pea_testserver_1.0.0_2.json', 'utf8'), null, 60) - .peas[0]; - const pea = new PEAController(peaJson); + + const pea = new PEAController(peaOptionsReference); const service = pea.services[0]; await expect(service.executeCommand(ServiceCommand.start)).to.be.rejectedWith('PEAController is not connected'); }); - it('should create service from PEATestServer json', () => { - const json = - parseJson(fs.readFileSync('src/modularPlantManager/pea/_assets/JSON/pea_testserver_1.0.0_2.json', 'utf8'), null, 60) - .peas[0].services[0]; - const service = new Service(json, opcUAConnection, 'root'); - expect(service.name).to.equal('Service1'); + it('should create service from reference options', () => { + const service = new Service(peaOptionsReference.services[0], opcUAConnection, 'root'); + expect(service.name).to.equal('Trigonometry'); }); context('with PEATestServer', () => { @@ -88,24 +85,21 @@ describe('ServiceSet', () => { let service: Service; before(() => { - const peaJson = - parseJson(fs.readFileSync('assets/peas/pea_testserver_1.0.0.json', 'utf8'), null, 60) - .peas[0]; - pea = new PEAController(peaJson); + pea = new PEAController(peaOptionsReference); service = pea.services[0]; }); it('should get default procedure', () => { const procedure = service.getDefaultProcedure(); - expect(procedure?.name).to.equal('Procedure 1'); + expect(procedure?.name).to.equal('Trigonometry_default'); }); it('should find procedure', () => { - const procedure = service.getProcedureByNameOrDefault('Procedure 1'); - expect(procedure?.name).to.equal('Procedure 1'); + const procedure = service.getProcedureByNameOrDefault('Trigonometry_default'); + expect(procedure?.name).to.equal('Trigonometry_default'); }); - it('should find procedure 2', () => { + it('should not find unknown procedure', () => { const procedure = service.getProcedureByNameOrDefault('ProcedureNotThere'); expect(procedure).to.equal(undefined); }); @@ -124,21 +118,16 @@ describe('ServiceSet', () => { beforeEach(async function () { this.timeout(5000); peaServer = new PEAMockup(); - //await peaServer.start(); - peaServer.startSimulation(); - //testService = peaServer.services[0]; - - const peaJson = - parseJson(fs.readFileSync('assets/peas/pea_testserver_1.0.0.json', 'utf8'), null, 60) - .peas[0]; - pea = new PEAController(peaJson); + peaServer.services.push(); + await peaServer.startSimulation(); + pea = new PEAController(peaOptionsReference); service = pea.services[0]; await pea.connectAndSubscribe(); }); afterEach(async () => { await pea.disconnectAndUnsubscribe(); - peaServer.stopSimulation(); + await peaServer.stopSimulation(); }); it('should get default procedure for default procedure', () => { diff --git a/src/modularPlantManager/pea/serviceSet/index.ts b/src/modularPlantManager/pea/serviceSet/index.ts index e050209a..4aca67a5 100644 --- a/src/modularPlantManager/pea/serviceSet/index.ts +++ b/src/modularPlantManager/pea/serviceSet/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './service/BaseService'; export * from './service/Service'; export * from './service/procedure/Procedure'; diff --git a/src/modularPlantManager/pea/serviceSet/service/BaseService.puml b/src/modularPlantManager/pea/serviceSet/service/BaseService.puml index d5b50b0c..312b5345 100644 --- a/src/modularPlantManager/pea/serviceSet/service/BaseService.puml +++ b/src/modularPlantManager/pea/serviceSet/service/BaseService.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include Service.puml diff --git a/src/modularPlantManager/pea/serviceSet/service/BaseService.ts b/src/modularPlantManager/pea/serviceSet/service/BaseService.ts index 9933fe66..08af09ff 100644 --- a/src/modularPlantManager/pea/serviceSet/service/BaseService.ts +++ b/src/modularPlantManager/pea/serviceSet/service/BaseService.ts @@ -193,23 +193,23 @@ export abstract class BaseService { return await timeout(this.waitForStateChange(expectedState), ms); } - public abstract async start(): Promise; + public abstract start(): Promise; - public abstract async stop(): Promise; + public abstract stop(): Promise; - public abstract async reset(): Promise; + public abstract reset(): Promise; - public abstract async complete(): Promise; + public abstract complete(): Promise; - public abstract async abort(): Promise; + public abstract abort(): Promise; - public abstract async hold(): Promise; + public abstract hold(): Promise; - public abstract async unhold(): Promise; + public abstract unhold(): Promise; - public abstract async pause(): Promise; + public abstract pause(): Promise; - public abstract async resume(): Promise; + public abstract resume(): Promise; - public abstract async restart(): Promise; + public abstract restart(): Promise; } diff --git a/src/modularPlantManager/pea/serviceSet/service/Service.mockup.ts b/src/modularPlantManager/pea/serviceSet/service/Service.mockup.ts index 83667034..d40967d1 100644 --- a/src/modularPlantManager/pea/serviceSet/service/Service.mockup.ts +++ b/src/modularPlantManager/pea/serviceSet/service/Service.mockup.ts @@ -28,12 +28,12 @@ import {ServiceControlEnable, ServiceMtpCommand, ServiceState} from './enum'; // eslint-disable-next-line no-undef import Timeout = NodeJS.Timeout; import {DataType, Namespace, StatusCodes, UAObject, Variant} from 'node-opcua'; -import {OpModeDAMockup} from '../../dataAssembly/_extensions/opModeDA/OpModeDA.mockup'; +import {OpModeMockup} from '../../dataAssembly/baseFunction/opMode/OpMode.mockup'; import {PEATestNumericVariable} from '../../../_utils'; export function getServiceMockupReferenceJSON( namespace: number, - objectBrowseName: string) { + objectBrowseName: string): object { return ({ StateChannel: { @@ -97,7 +97,7 @@ export class ServiceMockup { public varProcedure = 1; public varCommand = 0; public varCommandEnable = 0; - public opMode: OpModeDAMockup; + public opMode: OpModeMockup; public readonly serviceName: string; public readonly offset: PEATestNumericVariable; @@ -179,7 +179,7 @@ export class ServiceMockup { } }); - this.opMode = new OpModeDAMockup(ns, serviceNode, this.serviceName); + this.opMode = new OpModeMockup(ns, serviceNode, this.serviceName); ns.addVariable({ componentOf: serviceNode, diff --git a/src/modularPlantManager/pea/serviceSet/service/Service.puml b/src/modularPlantManager/pea/serviceSet/service/Service.puml index ff3bc153..b6b601f3 100644 --- a/src/modularPlantManager/pea/serviceSet/service/Service.puml +++ b/src/modularPlantManager/pea/serviceSet/service/Service.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include procedure/Procedure.puml diff --git a/src/modularPlantManager/pea/serviceSet/service/Service.spec.json b/src/modularPlantManager/pea/serviceSet/service/Service.spec.json index c10970d0..680c892d 100644 --- a/src/modularPlantManager/pea/serviceSet/service/Service.spec.json +++ b/src/modularPlantManager/pea/serviceSet/service/Service.spec.json @@ -1,511 +1,511 @@ { - services: [ + "services": [ { - name: Fill, - communication: { - TagName: { - value: 'Fill' - }, - TagDescription: { - value: 'Sample service with different parameters' - }, - OSLevel: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.OSLevel, - dataType: 'Byte' - }, - WQC: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.WQC, - dataType: 'Byte' - }, - OpMode: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.OpMode.binary, - dataType: 'UInt32' - }, - CommandMan: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.ControlOp, - dataType: 'UInt32' - }, - StrategyMan: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.StrategyOp, - dataType: 'UInt32' - }, - ControlInt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.ControlInt, - dataType: 'UInt32' - }, - StrategyInt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.StrategyInt, - dataType: 'UInt32' - }, - CommandExt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.ControlExt, - dataType: 'UInt32' - }, - StrategyExt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.StrategyExt, - dataType: 'UInt32' - }, - State: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.State.binary, - dataType: 'UInt32' - }, - CommandEnable: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.ControlEnable.binary, - dataType: 'UInt32' - }, - CurrentProcedure: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Fill.CurrentProcedure, - dataType: 'UInt32' + "name": "Fill", + "communication": { + "TagName": { + "value": "Fill" + }, + "TagDescription": { + "value": "Sample service with different parameters" + }, + "OSLevel": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.OSLevel", + "dataType": "Byte" + }, + "WQC": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.WQC", + "dataType": "Byte" + }, + "OpMode": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.OpMode.binary", + "dataType": "UInt32" + }, + "CommandMan": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.ControlOp", + "dataType": "UInt32" + }, + "StrategyMan": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.StrategyOp", + "dataType": "UInt32" + }, + "ControlInt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.ControlInt", + "dataType": "UInt32" + }, + "StrategyInt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.StrategyInt", + "dataType": "UInt32" + }, + "CommandExt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.ControlExt", + "dataType": "UInt32" + }, + "StrategyExt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.StrategyExt", + "dataType": "UInt32" + }, + "State": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.State.binary", + "dataType": "UInt32" + }, + "CommandEnable": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.ControlEnable.binary", + "dataType": "UInt32" + }, + "CurrentProcedure": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Fill.CurrentProcedure", + "dataType": "UInt32" } }, - procedures: [ + "procedures": [ { - id: 1, - name: FillConti, - default: true, - sc: false, - parameters: [] + "id": 1, + "name": "FillConti", + "default": true, + "sc": false, + "parameters": [] }, { - id: 2, - name: Fill_batch, - default: false, - sc: true, - parameters: [ + "id": 2, + "name": "Fill_batch", + "default": false, + "sc": true, + "parameters": [ { - name: SetVolume, - metaModelRef: AnaMan, - communication: '' //TODO Add Mockup here + "name": "SetVolume", + "metaModelRef": "AnaMan", + "communication": "" } ] } ], - parameters: [] + "parameters": [] }, { - name: DoseAmount, - communication: { - TagName: { - value: DoseAmount - }, - TagDescription: { - value: Sample service with different parameters - }, - OSLevel: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.OSLevel, - dataType: 'Byte' - }, - WQC: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.WQC, - dataType: 'Byte' - }, - OpMode: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.OpMode.binary, - dataType: 'UInt32' - }, - CommandMan: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.ControlOp, - dataType: 'UInt32' - }, - StrategyMan: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.StrategyOp, - dataType: 'UInt32' - }, - ControlInt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.ControlInt, - dataType: 'UInt32' - }, - StrategyInt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.StrategyInt, - dataType: 'UInt32' - }, - CommandExt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.ControlExt, - dataType: 'UInt32' - }, - StrategyExt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.StrategyExt, - dataType: 'UInt32' - }, - State: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.State.binary, - dataType: 'UInt32' - }, - CommandEnable: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.ControlEnable.binary, - dataType: 'UInt32' - }, - CurrentProcedure: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.CurrentProcedure, - dataType: 'UInt32' + "name": "DoseAmount", + "communication": { + "TagName": { + "value": "DoseAmount" + }, + "TagDescription": { + "value": "Sample service with different parameters" + }, + "OSLevel": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.OSLevel", + "dataType": "Byte" + }, + "WQC": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.WQC", + "dataType": "Byte" + }, + "OpMode": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.OpMode.binary", + "dataType": "UInt32" + }, + "CommandMan": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.ControlOp", + "dataType": "UInt32" + }, + "StrategyMan": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.StrategyOp", + "dataType": "UInt32" + }, + "ControlInt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.ControlInt", + "dataType": "UInt32" + }, + "StrategyInt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.StrategyInt", + "dataType": "UInt32" + }, + "CommandExt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.ControlExt", + "dataType": "UInt32" + }, + "StrategyExt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.StrategyExt", + "dataType": "UInt32" + }, + "State": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.State.binary", + "dataType": "UInt32" + }, + "CommandEnable": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.ControlEnable.binary", + "dataType": "UInt32" + }, + "CurrentProcedure": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.CurrentProcedure", + "dataType": "UInt32" } }, - procedures: [ + "procedures": [ { - id: 1, - name: Dose_batch, - default: true, - sc: true, - parameters: [ + "id": 1, + "name": "Dose_batch", + "default": true, + "sc": true, + "parameters": [ { - name: SetVolume, - metaModelRef: ExtAnaOp, - communication: { - WQC: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.WQC, - dataType: 'Byte' + "name": "SetVolume", + "metaModelRef": "ExtAnaOp", + "communication": { + "WQC": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.WQC", + "dataType": "Byte" }, - OSLevel: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.OSLevel, - dataType: 'Byte' + "OSLevel": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.OSLevel", + "dataType": "Byte" }, - VOut: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VOut, - dataType: 'Float' + "VOut": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VOut", + "dataType": "Float" }, - VSclMin: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VSclMin, - dataType: 'Float' + "VSclMin": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VSclMin", + "dataType": "Float" }, - VSclMax: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VSclMax, - dataType: 'Float' + "VSclMax": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VSclMax", + "dataType": "Float" }, - VUnit: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VUnit, - dataType: Int16 + "VUnit": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VUnit", + "dataType": "Int16" }, - VMin: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VMin, - dataType: 'Float' + "VMin": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VMin", + "dataType": "Float" }, - VMax: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VMax, - dataType: 'Float' + "VMax": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VMax", + "dataType": "Float" }, - VExt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VExt, - dataType: 'Float' + "VExt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VExt", + "dataType": "Float" }, - VRbk: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VRbk, - dataType: 'Float' + "VRbk": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetVolume.VRbk", + "dataType": "Float" } } }, { - name: SetDuration, - metaModelRef: ExtAnaOp, - communication: { - WQC: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.WQC, - dataType: 'Byte' + "name": "SetDuration", + "metaModelRef": "ExtAnaOp", + "communication": { + "WQC": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.WQC", + "dataType": "Byte" }, - OSLevel: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.OSLevel, - dataType: 'Byte' + "OSLevel": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.OSLevel", + "dataType": "Byte" }, - VOut: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VOut, - dataType: 'Float' + "VOut": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VOut", + "dataType": "Float" }, - VSclMin: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VSclMin, - dataType: 'Float' + "VSclMin": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VSclMin", + "dataType": "Float" }, - VSclMax: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VSclMax, - dataType: 'Float' + "VSclMax": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VSclMax", + "dataType": "Float" }, - VUnit: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VUnit, - dataType: Int16 + "VUnit": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VUnit", + "dataType": "Int16" }, - VMin: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VMin, - dataType: 'Float' + "VMin": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VMin", + "dataType": "Float" }, - VMax: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VMax, - dataType: 'Float' + "VMax": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VMax", + "dataType": "Float" }, - VExt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VExt, - dataType: 'Float' + "VExt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VExt", + "dataType": "Float" }, - VRbk: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VRbk, - dataType: 'Float' + "VRbk": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseAmount.SetDuration.VRbk", + "dataType": "Float" } } } ] } ], - parameters: [] + "parameters": [] }, { - name: DoseConti, - communication: { - TagName: { - value: DoseConti - }, - TagDescription: { - value: Sample service with different parameters - }, - OSLevel: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.OSLevel, - dataType: 'Byte' - }, - WQC: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.WQC, - dataType: 'Byte' - }, - OpMode: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.OpMode.binary, - dataType: 'UInt32' - }, - CommandMan: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.ControlOp, - dataType: 'UInt32' - }, - StrategyMan: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.StrategyOp, - dataType: 'UInt32' - }, - ControlInt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.ControlInt, - dataType: 'UInt32' - }, - StrategyInt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.StrategyInt, - dataType: 'UInt32' - }, - CommandExt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.ControlExt, - dataType: 'UInt32' - }, - StrategyExt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.StrategyExt, - dataType: 'UInt32' - }, - State: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.State.binary, - dataType: 'UInt32' - }, - CommandEnable: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.ControlEnable.binary, - dataType: 'UInt32' - }, - CurrentProcedure: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.CurrentProcedure, - dataType: 'UInt32' + "name": "DoseConti", + "communication": { + "TagName": { + "value": "DoseConti" + }, + "TagDescription": { + "value": "Sample service with different parameters" + }, + "OSLevel": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.OSLevel", + "dataType": "Byte" + }, + "WQC": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.WQC", + "dataType": "Byte" + }, + "OpMode": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.OpMode.binary", + "dataType": "UInt32" + }, + "CommandMan": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.ControlOp", + "dataType": "UInt32" + }, + "StrategyMan": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.StrategyOp", + "dataType": "UInt32" + }, + "ControlInt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.ControlInt", + "dataType": "UInt32" + }, + "StrategyInt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.StrategyInt", + "dataType": "UInt32" + }, + "CommandExt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.ControlExt", + "dataType": "UInt32" + }, + "StrategyExt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.StrategyExt", + "dataType": "UInt32" + }, + "State": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.State.binary", + "dataType": "UInt32" + }, + "CommandEnable": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.ControlEnable.binary", + "dataType": "UInt32" + }, + "CurrentProcedure": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.CurrentProcedure", + "dataType": "UInt32" } }, - procedures: [ + "procedures": [ { - id: 1, - name: DoseConti, - default: true, - sc: false, - parameters: [ + "id": 1, + "name": "DoseConti", + "default": true, + "sc": false, + "parameters": [ { - name: SetVolumeFlow, - metaModelRef: ExtAnaOp, - communication: { - WQC: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.WQC, - dataType: 'Byte' + "name": "SetVolumeFlow", + "metaModelRef": "ExtAnaOp", + "communication": { + "WQC": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.WQC", + "dataType": "Byte" }, - OSLevel: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.OSLevel, - dataType: 'Byte' + "OSLevel": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.OSLevel", + "dataType": "Byte" }, - VOut: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VOut, - dataType: 'Float' + "VOut": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VOut", + "dataType": "Float" }, - VSclMin: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMin, - dataType: 'Float' + "VSclMin": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMin", + "dataType": "Float" }, - VSclMax: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMax, - dataType: 'Float' + "VSclMax": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VSclMax", + "dataType": "Float" }, - VUnit: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VUnit, - dataType: Int16 + "VUnit": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VUnit", + "dataType": "Int16" }, - VMin: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VMin, - dataType: 'Float' + "VMin": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VMin", + "dataType": "Float" }, - VMax: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VMax, - dataType: 'Float' + "VMax": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VMax", + "dataType": "Float" }, - VExt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VExt, - dataType: 'Float' + "VExt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VExt", + "dataType": "Float" }, - VRbk: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VRbk, - dataType: 'Float' + "VRbk": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.DoseConti.SetVolumeFlow.VRbk", + "dataType": "Float" } } } ] } ], - parameters: [] + "parameters": [] }, { - name: Empty, - communication: { - TagName: { - value: Empty - }, - TagDescription: { - value: Sample service with different parameters - }, - OSLevel: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.OSLevel, - dataType: 'Byte' - }, - WQC: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.WQC, - dataType: 'Byte' - }, - OpMode: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.OpMode.binary, - dataType: 'UInt32' - }, - CommandMan: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.ControlOp, - dataType: 'UInt32' - }, - StrategyMan: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.StrategyOp, - dataType: 'UInt32' - }, - ControlInt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.ControlInt, - dataType: 'UInt32' - }, - StrategyInt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.StrategyInt, - dataType: 'UInt32' - }, - CommandExt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.ControlExt, - dataType: 'UInt32' - }, - StrategyExt: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.StrategyExt, - dataType: 'UInt32' - }, - State: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.State.binary, - dataType: 'UInt32' - }, - CommandEnable: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.ControlEnable.binary, - dataType: 'UInt32' - }, - CurrentProcedure: { - namespaceIndex: P2OGalaxy, - nodeId: P2OPlanet.App_Dosing.Services.Empty.CurrentProcedure, - dataType: 'UInt32' + "name": "Empty", + "communication": { + "TagName": { + "value": "Empty" + }, + "TagDescription": { + "value": "Sample service with different parameters" + }, + "OSLevel": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.OSLevel", + "dataType": "Byte" + }, + "WQC": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.WQC", + "dataType": "Byte" + }, + "OpMode": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.OpMode.binary", + "dataType": "UInt32" + }, + "CommandMan": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.ControlOp", + "dataType": "UInt32" + }, + "StrategyMan": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.StrategyOp", + "dataType": "UInt32" + }, + "ControlInt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.ControlInt", + "dataType": "UInt32" + }, + "StrategyInt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.StrategyInt", + "dataType": "UInt32" + }, + "CommandExt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.ControlExt", + "dataType": "UInt32" + }, + "StrategyExt": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.StrategyExt", + "dataType": "UInt32" + }, + "State": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.State.binary", + "dataType": "UInt32" + }, + "CommandEnable": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.ControlEnable.binary", + "dataType": "UInt32" + }, + "CurrentProcedure": { + "namespaceIndex": "P2OGalaxy", + "nodeId": "P2OPlanet.App_Dosing.Services.Empty.CurrentProcedure", + "dataType": "UInt32" } }, - procedures: [ + "procedures": [ { - id: 1, - name: Empty_batch, - default: true, - sc: true, - parameters: [] + "id": 1, + "name": "Empty_batch", + "default": true, + "sc": true, + "parameters": [] } ], - parameters: [] + "parameters": [] } ] } diff --git a/src/modularPlantManager/pea/serviceSet/service/Service.spec.ts b/src/modularPlantManager/pea/serviceSet/service/Service.spec.ts index 91024051..61ad2ce9 100644 --- a/src/modularPlantManager/pea/serviceSet/service/Service.spec.ts +++ b/src/modularPlantManager/pea/serviceSet/service/Service.spec.ts @@ -35,25 +35,21 @@ import {PEAController, Service} from '../../index'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import {ServiceState} from './enum'; -import {PEAMockup} from '../../PEA.mockup'; -import * as peaOptions from '../../../../../tests/peaOptions.json'; -import * as peaOptionsServices from '../../../../../tests/peaOptions_testservice.json'; +import * as peaOptions from '../../../peaOptions.spec.json'; +import * as peaOptionsServices from '../../../peaOptions_testservice.spec.json'; import {MockupServer} from '../../../_utils'; import {AnaViewMockup} from '../../dataAssembly/indicatorElement/AnaView/AnaView.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {ServiceControlMockup} from '../../dataAssembly/ServiceControl/ServiceControl.mockup'; -import {namespaceUrl, setNamespaceUrl} from '../../../../../tests/namespaceUrl'; +import {ServiceControlMockup} from '../../dataAssembly/serviceControl/ServiceControl.mockup'; import {AnaServParamMockup} from '../../dataAssembly/operationElement/servParam/anaServParam/AnaServParam.mockup'; -import {AnaProcessValueIn, AnaServParam} from '../../dataAssembly'; -import {ModularPlantManager} from '../../../ModularPlantManager'; +import {AnaServParam} from '../../dataAssembly'; import {AnaProcessValueInMockup} from '../../dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.mockup'; chai.use(chaiAsPromised); const expect = chai.expect; describe('Service', () => { - const opcUAConnection = new OpcUaConnection('', ''); + const opcUAConnection = new OpcUaConnection(); context('constructor', () => { it('should fail with missing options', () => { @@ -71,7 +67,7 @@ describe('Service', () => { expect(() => new Service( {name: 'test', parameters: [], communication: {} as ServiceControlOptions, procedures: []}, opcUAConnection, '') - ).to.throw('Creating DataAssemblyController Error: No Communication variables found in DataAssemblyOptions'); + ).to.throw('Creating DataAssemblyController Error: No Communication dataAssemblies found in DataAssemblyOptions'); }); }); @@ -79,7 +75,7 @@ describe('Service', () => { it('should reject command if not connected', async () => { const pea = new PEAController(peaOptions as unknown as PEAOptions); const service = pea.services[0]; - await expect(service.executeCommand(ServiceCommand.start)).to.be.rejectedWith('Can not write node since OPC UA connection to PEA test is not established'); + await expect(service.executeCommand(ServiceCommand.start)).to.be.rejectedWith('Can not write node since OPC UA connection is not established'); }); it('should create service from PEATestServer json', () => { @@ -109,7 +105,7 @@ describe('Service', () => { it('should not find non existent procedure', () => { const procedure = service.getProcedureByNameOrDefault('ProcedureNotThere'); - expect(procedure).to.equal(undefined); + expect(procedure).to.throw; }); it('should get undefined when getting current procedure when not connected', () => { @@ -118,23 +114,18 @@ describe('Service', () => { }); context('dynamic test', () => { - let peaServer: PEAMockup; + let service: Service; - //let testService: TestServerService; let pea: PEAController; let mockupServer: MockupServer; - setNamespaceUrl(peaOptions as any); - beforeEach(async function () { this.timeout(5000); //set up mockup mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new AnaViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const mockupService = new ServiceControlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Trigonometry'); + new AnaViewMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + new ServiceControlMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Trigonometry'); await mockupServer.start(); pea = new PEAController(peaOptions as unknown as PEAOptions); @@ -147,16 +138,14 @@ describe('Service', () => { if(mockupServer) await mockupServer.shutdown(); }); -/* it('should get default procedure for default procedure', () => { - expect(service.getCurrentProcedure()).to.equal(service.getDefaultProcedure()); - //TODO: fix + it('should get current procedure which is undefined', () => { + expect(service.getCurrentProcedure()).to.equal(undefined); }); - it('should find parameter', () => { - const param = service.findInputParameter('Offset'); - expect(param?.name).to.equal('Offset'); - //TODO: fix - });*/ + it('should not find parameter of indicator element type', () => { + const param = service.findInputParameter('Trigonometry_default'); + expect(param?.name).to.equal(undefined); + }); it('should provide correct JSON', () => { expect(ServiceState[service.state]).to.equal('IDLE'); @@ -247,19 +236,19 @@ describe('Service', () => { stateChangeCount++; }); - await service.executeCommandAndWaitForStateChange(ServiceCommand.start); - await service.executeCommandAndWaitForStateChange(ServiceCommand.restart); - await service.executeCommandAndWaitForStateChange(ServiceCommand.stop); - await service.executeCommandAndWaitForStateChange(ServiceCommand.reset); - await service.executeCommandAndWaitForStateChange(ServiceCommand.start); - await service.executeCommandAndWaitForStateChange(ServiceCommand.pause); - await service.executeCommandAndWaitForStateChange(ServiceCommand.resume); - - await service.executeCommandAndWaitForStateChange(ServiceCommand.complete); - await service.executeCommandAndWaitForStateChange(ServiceCommand.abort); - await service.executeCommandAndWaitForStateChange(ServiceCommand.reset); - await service.executeCommandAndWaitForStateChange(ServiceCommand.start); - await service.executeCommandAndWaitForStateChange(ServiceCommand.complete); + await service.executeCommand(ServiceCommand.start); + await service.executeCommand(ServiceCommand.restart); + await service.executeCommand(ServiceCommand.stop); + await service.executeCommand(ServiceCommand.reset); + await service.executeCommand(ServiceCommand.start); + await service.executeCommand(ServiceCommand.pause); + await service.executeCommand(ServiceCommand.resume); + + await service.executeCommand(ServiceCommand.complete); + await service.executeCommand(ServiceCommand.abort); + await service.executeCommand(ServiceCommand.reset); + await service.executeCommand(ServiceCommand.start); + await service.executeCommand(ServiceCommand.complete); expect(stateChangeCount).to.equal(11); }).timeout(10000); @@ -269,22 +258,15 @@ describe('Service', () => { }); context('parameter dynamic', () => { it('set Parameter', async () => { - setNamespaceUrl(peaOptionsServices as any); const mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockupConfParam = new AnaServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'TestService.AnaConfParam_TestService_updateRate'); - const mockupParam = new AnaServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'TestService.AnaProcParam_TestService_factor'); - const mockupReportValue = new AnaViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'TestService.AnaReportValue_TestService_rvTime'); - const mockupProcessValueIn = new AnaProcessValueInMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'TestService.AnaProcessValueIn_TestService_pv'); - const mockupProcessValueOut = new AnaProcessValueInMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'TestService.AnaProcessValueOut_TestService_pvOutIntegral'); - const mockupService = new ServiceControlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'TestService'); + new AnaServParamMockup(mockupServer.nameSpace, mockupServer.rootObject, 'TestService.AnaConfParam_TestService_updateRate'); + new AnaServParamMockup(mockupServer.nameSpace, mockupServer.rootObject, 'TestService.AnaProcParam_TestService_factor'); + new AnaViewMockup(mockupServer.nameSpace, mockupServer.rootObject, 'TestService.AnaReportValue_TestService_rvTime'); + new AnaProcessValueInMockup(mockupServer.nameSpace, mockupServer.rootObject, 'TestService.AnaProcessValueIn_TestService_pv'); + new AnaProcessValueInMockup(mockupServer.nameSpace, mockupServer.rootObject, 'TestService.AnaProcessValueOut_TestService_pvOutIntegral'); + new ServiceControlMockup(mockupServer.nameSpace, mockupServer.rootObject, 'TestService'); await mockupServer.start(); const pea = new PEAController(peaOptionsServices as unknown as PEAOptions); @@ -296,11 +278,11 @@ describe('Service', () => { await service.setProcedure(procedure); } let curProcedure = await service.getCurrentProcedure(); - expect(curProcedure).to.be.undefined; // current procedure will be set on service start + expect(curProcedure).to.be.undefined; await service.start(); - await new Promise(f => setTimeout(f, 500)); // wait for change + await new Promise((resolve => service.serviceControl.on('state', resolve))); curProcedure = await service.getCurrentProcedure(); expect(curProcedure).to.not.be.undefined; @@ -309,7 +291,7 @@ describe('Service', () => { await service.setParameters([paramOptions], [pea]); - await new Promise(f => setTimeout(f, 500)); // wait for change + await new Promise((resolve => service.serviceControl.on('parameterChanged', resolve))); expect((procedure?.parameters[0] as AnaServParam).communication.VExt.value).to.equal(5); await pea.disconnectAndUnsubscribe(); diff --git a/src/modularPlantManager/pea/serviceSet/service/Service.ts b/src/modularPlantManager/pea/serviceSet/service/Service.ts index 0ab6d16b..698eb328 100644 --- a/src/modularPlantManager/pea/serviceSet/service/Service.ts +++ b/src/modularPlantManager/pea/serviceSet/service/Service.ts @@ -30,7 +30,7 @@ import { ServiceInterface, ServiceOptions, ServiceSourceMode } from '@p2olab/polaris-interface'; -import {OpcUaConnection} from '../../connection'; +import {DynamicDataItem, OpcUaConnection} from '../../connection'; import { controlEnableToJson, DataAssemblyControllerFactory, InputElement, ServiceControl, @@ -120,8 +120,7 @@ export class Service extends BaseService { } public get lastStatusChange(): Date { - if(this.serviceControl.communication.StateCur.timestamp) return this.serviceControl.communication.StateCur.timestamp; - else return new Date(); + return (this.serviceControl.communication.StateCur as DynamicDataItem)?.timestamp || new Date(); } public get currentProcedure(): number | undefined { @@ -151,7 +150,7 @@ export class Service extends BaseService { public async subscribeToService(): Promise { this.logger.info(`[${this.qualifiedName}] Subscribe to service`); this.serviceControl - .on('CommandEnable', () => { + .on('CommandEn', () => { this.logger.debug(`[${this.qualifiedName}] ControlEnable changed: ` + `${JSON.stringify(this.commandEnable)}`); this.eventEmitter.emit('controlEnable', this.commandEnable); @@ -165,7 +164,7 @@ export class Service extends BaseService { sourceMode: this.serviceControl.serviceSourceMode.getServiceSourceMode() }); }) - .on('State', () => { + .on('StateCur', () => { this.logger.debug(`[${this.qualifiedName}] State changed: ` + `${ServiceState[this.state]}`); this.eventEmitter.emit('state', this.state); @@ -222,7 +221,7 @@ export class Service extends BaseService { } // overridden method from Base Service - public async executeCommandAndWaitForStateChange(command: ServiceCommand): Promise { + public async executeCommand(command: ServiceCommand): Promise { if (!this.connection.isConnected()) { throw new Error('PEAController is not connected'); } @@ -239,34 +238,35 @@ export class Service extends BaseService { let expectedState=''; switch(command){ case('start'): - expectedState='EXECUTE'; + expectedState = 'EXECUTE'; break; case('stop'): - expectedState='STOPPED'; + expectedState = 'STOPPED'; break; case('reset'): - expectedState='IDLE'; + expectedState = 'IDLE'; break; case('abort'): - expectedState='ABORTED'; + expectedState = 'ABORTED'; break; case('complete'): - expectedState='COMPLETED'; + expectedState = 'COMPLETED'; break; case('pause'): - expectedState='PAUSED'; + expectedState = 'PAUSED'; break; case('resume'): - expectedState='EXECUTE'; + expectedState = 'EXECUTE'; break; case('hold'): - expectedState='HOLD'; + expectedState = 'HOLD'; + break; + case('unhold'): + expectedState = 'EXECUTE'; break; case('restart'): - // TODO is this okay? - // on 'restart' the program can't detect a change, because in the end the state stays at 'EXECUTE' - if (ServiceState[this.state] === 'EXECUTE') return; - + expectedState = 'EXECUTE'; + break; } await this.waitForStateChangeWithTimeout(expectedState); } @@ -321,7 +321,7 @@ export class Service extends BaseService { // first set opMode and then set procedure await this.setOperationMode(); - await this.serviceControl.communication.ProcedureExt.write(procedure.id); + await (this.serviceControl.communication.ProcedureExt as DynamicDataItem).write(procedure.id); } public getProcedureByNameOrDefault(procedureName: string): Procedure | undefined { @@ -331,9 +331,6 @@ export class Service extends BaseService { } else { procedure = this.procedures.find((proc) => proc.name === procedureName); } - if(!procedure){ - throw new Error('Could not find Procedure by Name or Default.'); - } return procedure; } @@ -376,7 +373,7 @@ export class Service extends BaseService { this.logger.debug(`[${this.qualifiedName}] Send command ${ServiceMtpCommand[command]}`); await this.setOperationMode(); - await this.serviceControl.communication.CommandExt.write(command); + await (this.serviceControl.communication.CommandExt as DynamicDataItem).write(command); this.logger.trace(`[${this.qualifiedName}] Command ${ServiceMtpCommand[command]} written`); } diff --git a/src/modularPlantManager/pea/serviceSet/service/procedure/Procedure.puml b/src/modularPlantManager/pea/serviceSet/service/procedure/Procedure.puml index a0005704..ed95541d 100644 --- a/src/modularPlantManager/pea/serviceSet/service/procedure/Procedure.puml +++ b/src/modularPlantManager/pea/serviceSet/service/procedure/Procedure.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceDisable.puml b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceDisable.puml index 324c3f58..d96c859f 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceDisable.puml +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceDisable.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceDisable.ts b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceDisable.ts index 5f1ce591..045b4b2d 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceDisable.ts +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceDisable.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceEnable.puml b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceEnable.puml index 6887fbde..6d3806f3 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceEnable.puml +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceEnable.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceEnable.ts b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceEnable.ts index 41016df2..741e39d0 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceEnable.ts +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceEnable.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceForce.puml b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceForce.puml index 90961301..aec76752 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceForce.puml +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceForce.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceForce.ts b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceForce.ts index 31189696..b5a23bc8 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceForce.ts +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceForce.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceSynchronisation.puml b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceSynchronisation.puml index be91690a..60d21d57 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceSynchronisation.puml +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceSynchronisation.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceSynchronisation.ts b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceSynchronisation.ts index ce559a66..abae5d94 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceSynchronisation.ts +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/ServiceSynchronisation.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-classes-per-file */ /* * MIT License * diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/index.ts b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/index.ts index 7d8add32..4355f560 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/index.ts +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/Instances/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './ServiceDisable'; export * from './ServiceSynchronisation'; export * from './ServiceEnable'; diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/ServiceRelation.puml b/src/modularPlantManager/pea/serviceSet/serviceRelation/ServiceRelation.puml index 057f7a7c..1a568d79 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/ServiceRelation.puml +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/ServiceRelation.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include ./Instances/ServiceDisable.puml diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/ServiceRelation.ts b/src/modularPlantManager/pea/serviceSet/serviceRelation/ServiceRelation.ts index 7b358ac8..d716015e 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/ServiceRelation.ts +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/ServiceRelation.ts @@ -24,7 +24,7 @@ */ export interface ServiceRelationInterface { - uuid?: string; + id?: string; description?: string; sourceServiceID: string; sourceProcedureID: string; @@ -35,7 +35,7 @@ export interface ServiceRelationInterface { } export interface ServiceRelationOptions { - uuid?: string; + id?: string; name?: string; sourceServiceID: string; sourceProcedureID: string; @@ -62,17 +62,17 @@ export abstract class ServiceRelation { // type of the ServiceRelation protected _type!: ServiceRelationType; protected _parentID: string; - protected _uuid: string; + protected _id: string; protected constructor(serviceRelationOptions: ServiceRelationOptions, parentID: string) { - // TODO: Define generic Object reference --> {name, uuid, type, description} + // TODO: Define generic Object reference --> {name, id, type, description} this.sourceServiceID = serviceRelationOptions.sourceServiceID; this.sourceProcedureID = serviceRelationOptions.sourceProcedureID; this.targetServiceID = serviceRelationOptions.targetServiceID; this.targetProcedureID = serviceRelationOptions.targetServiceID; this.sourceValue = serviceRelationOptions.sourceValue; this._parentID = parentID; - this._uuid = serviceRelationOptions.uuid || 'No uuid given'; + this._id = serviceRelationOptions.id || 'No id given'; } public getSourceServiceID(): string { @@ -101,7 +101,7 @@ export abstract class ServiceRelation { public json(): ServiceRelationInterface { return { - uuid: this._uuid, + id: this._id, sourceServiceID: this.sourceServiceID, sourceProcedureID: this.sourceProcedureID, sourceValue: this.sourceValue, diff --git a/src/modularPlantManager/pea/serviceSet/serviceRelation/index.ts b/src/modularPlantManager/pea/serviceSet/serviceRelation/index.ts index 113349ae..97106075 100644 --- a/src/modularPlantManager/pea/serviceSet/serviceRelation/index.ts +++ b/src/modularPlantManager/pea/serviceSet/serviceRelation/index.ts @@ -1,2 +1,27 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './ServiceRelation'; export * from './Instances'; diff --git a/src/modularPlantManager/pea/StateMachine/MtpStateMachine.ts b/src/modularPlantManager/pea/stateMachine/MtpStateMachine.ts similarity index 76% rename from src/modularPlantManager/pea/StateMachine/MtpStateMachine.ts rename to src/modularPlantManager/pea/stateMachine/MtpStateMachine.ts index fd0a7fa1..f1b0cda1 100644 --- a/src/modularPlantManager/pea/StateMachine/MtpStateMachine.ts +++ b/src/modularPlantManager/pea/stateMachine/MtpStateMachine.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + import { ActionFunctionMap, ConditionPredicate, interpret, Interpreter, Machine, MachineConfig, MachineOptions, StateMachine, StateSchema, @@ -10,7 +35,6 @@ import { ServiceStateString } from '../serviceSet/service/enum'; - export type UserContext = any; export interface InternalMtpCommand { @@ -287,40 +311,40 @@ export class MtpStateMachine { public readonly defaultOptions: UserDefinedServiceConfiguration = { guards: { - startingEnabled: () => true, - restartingEnabled: () => true, - executeEnabled: () => true, - completingEnabled: () => true, - pausingEnabled: () => true, - holdingEnabled: () => false, - unholdingEnabled: () => true, + startingEnabled: (): boolean => true, + restartingEnabled: (): boolean => true, + executeEnabled: (): boolean => true, + completingEnabled: (): boolean => true, + pausingEnabled: (): boolean => true, + holdingEnabled: (): boolean => false, + unholdingEnabled: (): boolean => true, }, actions: { - onIdle: () => { return; }, - onStarting: () => this.goToNextState(), - onExecute: () => { return; }, - onCompleting: () => this.goToNextState(), - onCompleted: () => { return; }, - onResetting: () => this.goToNextState(), - onPausing: () => this.goToNextState(), - onPaused: () => { return; }, - onResuming: () => this.goToNextState(), - onStopping: () => this.goToNextState(), - onStopped: () => { return; }, - onAborting: () => this.goToNextState(), - onAborted: () => { return; }, + onIdle: (): void => { return; }, + onStarting: (): void => this.goToNextState(), + onExecute: (): void => { return; }, + onCompleting: (): void => this.goToNextState(), + onCompleted: (): void => { return; }, + onResetting: (): void => this.goToNextState(), + onPausing: (): void => this.goToNextState(), + onPaused: (): void => { return; }, + onResuming: (): void => this.goToNextState(), + onStopping: (): void => this.goToNextState(), + onStopped: (): void => { return; }, + onAborting: (): void => this.goToNextState(), + onAborted: (): void => { return; }, }, }; private staticOptions: StaticServiceConfiguration = { - guards: { startingEnabledStatic: () => true}, + guards: { startingEnabledStatic: (): boolean => true}, actions: { - onStartingStatic: () => {this.updateProcedureCur();}, - onResettingStatic: () => {return;} + onStartingStatic: (): void => {this.updateProcedureCur();}, + onResettingStatic: (): void => {return;} } - } + }; - public reconfigure(updatedGuards: Partial, updatedActions: Partial) { + public reconfigure(updatedGuards: Partial, updatedActions: Partial): void { const guards: UserDefinedGuard = { ...this.staticOptions.guards,...this.defaultOptions.guards, ...updatedGuards} as UserDefinedGuard; const actions: UserDefinedActions = @@ -328,24 +352,24 @@ export class MtpStateMachine { this.stateMachine = this.stateMachine.withConfig({guards, actions}); } - public setProcedureReq(procedureReq: number){ + public setProcedureReq(procedureReq: number): void{ this.varProcedureReq = procedureReq; } - private updateProcedureCur(){ + private updateProcedureCur(): void{ this.varProcedureCur = this.getProcedureReq(); } - private resetProcedureCur(){ + private resetProcedureCur(): void{ this.varProcedureCur = 0; } - public getProcedureReq() {return this.varProcedureReq;} - public getProcedureCur() {return this.varProcedureCur;} + public getProcedureReq(): number {return this.varProcedureReq;} + public getProcedureCur(): number {return this.varProcedureCur;} /* Start ServiceStateMachine */ - public start() { + public start(): void { this.stateMachineService = interpret(this.stateMachine); this.stateMachineService.onTransition(() => console.log(`[STATEMACHINE] FSM (${this.name}): ${this.getState()}`)) .start(); @@ -372,7 +396,7 @@ export class MtpStateMachine { else throw Error('StateMachine not initialized.'); } - public goToNextState() { + public goToNextState(): void { if(this.stateMachineService) this.stateMachineService.send('SC'); } diff --git a/src/modularPlantManager/pea/textSet/Answer.puml b/src/modularPlantManager/pea/textSet/Answer.puml index 992cf83b..5ad191c8 100644 --- a/src/modularPlantManager/pea/textSet/Answer.puml +++ b/src/modularPlantManager/pea/textSet/Answer.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/textSet/EnumDefinition.puml b/src/modularPlantManager/pea/textSet/EnumDefinition.puml index bcfc0ebd..022687fa 100644 --- a/src/modularPlantManager/pea/textSet/EnumDefinition.puml +++ b/src/modularPlantManager/pea/textSet/EnumDefinition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include EnumItem.puml diff --git a/src/modularPlantManager/pea/textSet/EnumItem.puml b/src/modularPlantManager/pea/textSet/EnumItem.puml index 8f1c0f34..348e0f06 100644 --- a/src/modularPlantManager/pea/textSet/EnumItem.puml +++ b/src/modularPlantManager/pea/textSet/EnumItem.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/textSet/PositionText.puml b/src/modularPlantManager/pea/textSet/PositionText.puml index 1269e37c..77a2a899 100644 --- a/src/modularPlantManager/pea/textSet/PositionText.puml +++ b/src/modularPlantManager/pea/textSet/PositionText.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/pea/textSet/Question.puml b/src/modularPlantManager/pea/textSet/Question.puml index ac3a0e1b..ae407901 100644 --- a/src/modularPlantManager/pea/textSet/Question.puml +++ b/src/modularPlantManager/pea/textSet/Question.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include Answer.puml diff --git a/src/modularPlantManager/pea/textSet/ServiceInteraction.puml b/src/modularPlantManager/pea/textSet/ServiceInteraction.puml index 0897beb7..8bb0b7fb 100644 --- a/src/modularPlantManager/pea/textSet/ServiceInteraction.puml +++ b/src/modularPlantManager/pea/textSet/ServiceInteraction.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include Question.puml diff --git a/src/modularPlantManager/pea/textSet/ServicePosition.puml b/src/modularPlantManager/pea/textSet/ServicePosition.puml index 3f7ecbc2..e75e7e8f 100644 --- a/src/modularPlantManager/pea/textSet/ServicePosition.puml +++ b/src/modularPlantManager/pea/textSet/ServicePosition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include PositionText.puml diff --git a/src/modularPlantManager/pea/textSet/Text.puml b/src/modularPlantManager/pea/textSet/Text.puml index 10b253c4..ee32d5f3 100644 --- a/src/modularPlantManager/pea/textSet/Text.puml +++ b/src/modularPlantManager/pea/textSet/Text.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include Answer.puml diff --git a/src/modularPlantManager/pea/textSet/TextSet.puml b/src/modularPlantManager/pea/textSet/TextSet.puml index c4ead689..602c8ca8 100644 --- a/src/modularPlantManager/pea/textSet/TextSet.puml +++ b/src/modularPlantManager/pea/textSet/TextSet.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include ServiceInteraction.puml diff --git a/tests/peaOptions.json b/src/modularPlantManager/peaOptions.spec.json similarity index 52% rename from tests/peaOptions.json rename to src/modularPlantManager/peaOptions.spec.json index ac4a63ee..9360de79 100644 --- a/tests/peaOptions.json +++ b/src/modularPlantManager/peaOptions.spec.json @@ -10,163 +10,163 @@ "TagDescription":"Service for math operation Integral", "WQC":{ "nodeId":"Trigonometry.WQC", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Byte" }, "StateChannel":{ "nodeId":"Trigonometry.StateChannel", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "StateOffAut":{ "nodeId":"Trigonometry.StateOffAut", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "StateOpAut":{ "nodeId":"Trigonometry.StateOpAut", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "StateAutAut":{ "nodeId":"Trigonometry.StateAutAut", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "StateOffOp":{ "nodeId":"Trigonometry.StateOffOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "StateOpOp":{ "nodeId":"Trigonometry.StateOpOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "StateAutOp":{ "nodeId":"Trigonometry.StateAutOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "StateOpAct":{ "nodeId":"Trigonometry.StateOpAct", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "StateAutAct":{ "nodeId":"Trigonometry.StateAutAct", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "StateOffAct":{ "nodeId":"Trigonometry.StateOffAct", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "SrcChannel":{ "nodeId":"Trigonometry.SrcChannel", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "SrcExtAut":{ "nodeId":"Trigonometry.SrcExtAut", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "SrcIntAut":{ "nodeId":"Trigonometry.SrcIntAut", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "SrcIntOp":{ "nodeId":"Trigonometry.SrcIntOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "SrcExtOp":{ "nodeId":"Trigonometry.SrcExtOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "SrcExtAct":{ "nodeId":"Trigonometry.SrcExtAct", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "SrcIntAct":{ "nodeId":"Trigonometry.SrcIntAct", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" }, "OSLevel":{ "nodeId":"Trigonometry.OSLevel", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Byte" }, "CommandOp":{ "nodeId":"Trigonometry.CommandOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "CommandInt":{ "nodeId":"Trigonometry.CommandInt", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "CommandExt":{ "nodeId":"Trigonometry.CommandExt", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "ProcedureOp":{ "nodeId":"Trigonometry.ProcedureOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "ProcedureInt":{ "nodeId":"Trigonometry.ProcedureInt", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "ProcedureExt":{ "nodeId":"Trigonometry.ProcedureExt", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "CommandEn":{ "nodeId":"Trigonometry.CommandEn", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "StateCur":{ "nodeId":"Trigonometry.StateCur", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "ProcedureCur":{ "nodeId":"Trigonometry.ProcedureCur", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "ProcedureReq":{ "nodeId":"Trigonometry.ProcedureReq", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "InteractQuestionID":{ "nodeId":"Trigonometry.InteractQuestionID", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "InteractAnswerID":{ "nodeId":"Trigonometry.InteractAnswerID", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" }, "PosTextID":{ "nodeId":"Trigonometry.PosTextID", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" } }, "procedures":[ @@ -180,13 +180,19 @@ "name":"Trigonometry_default", "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/HealthStateView", "dataItems":{ - "TagName":"Trigonometry_default", - "TagDescription":"Default Procedure of Trigonometry", - "OSLevel":"0", + "TagName":{ + "value": "Trigonometry_default" + }, + "TagDescription":{ + "value": "Default Procedure of Trigonometry" + }, + "OSLevel":{ + "value": 0 + }, "WQC":{ "nodeId":"Trigonometry.Trigonometry_default.WQC", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Byte" } } } @@ -208,28 +214,28 @@ "TagDescription":"SimulatedNumericVar", "WQC":{ "nodeId":"Variable.WQC", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Byte" }, "V":{ "nodeId":"Variable.V", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" }, "VSclMin":{ "nodeId":"Variable.VSclMin", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" }, "VSclMax":{ "nodeId":"Variable.VSclMax", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" }, "VUnit":{ "nodeId":"Variable.VUnit", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Int16" } } } diff --git a/src/modularPlantManager/peaOptions_testservice.spec.json b/src/modularPlantManager/peaOptions_testservice.spec.json new file mode 100644 index 00000000..1dc9d4a9 --- /dev/null +++ b/src/modularPlantManager/peaOptions_testservice.spec.json @@ -0,0 +1,675 @@ +{ + "name":"Calculator", + "id":"test", + "pimadIdentifier":"4a30b752-b53d-4b3b-ab89-28a731d60b00", + "services":[ + { + "name":"TestService", + "communication":{ + "TagName":"TestService", + "TagDescription":"Service for math operation Integral", + "StateChannel":{ + "nodeId":"TestService.StateChannel", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOffAut":{ + "nodeId":"TestService.StateOffAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOpAut":{ + "nodeId":"TestService.StateOpAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateAutAut":{ + "nodeId":"TestService.StateAutAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOffOp":{ + "nodeId":"TestService.StateOffOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOpOp":{ + "nodeId":"TestService.StateOpOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateAutOp":{ + "nodeId":"TestService.StateAutOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOpAct":{ + "nodeId":"TestService.StateOpAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateAutAct":{ + "nodeId":"TestService.StateAutAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOffAct":{ + "nodeId":"TestService.StateOffAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcChannel":{ + "nodeId":"TestService.SrcChannel", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcExtAut":{ + "nodeId":"TestService.SrcExtAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcIntAut":{ + "nodeId":"TestService.SrcIntAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcIntOp":{ + "nodeId":"TestService.SrcIntOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcExtOp":{ + "nodeId":"TestService.SrcExtOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcExtAct":{ + "nodeId":"TestService.SrcExtAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcIntAct":{ + "nodeId":"TestService.SrcIntAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "OSLevel":{ + "nodeId":"TestService.OSLevel", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Byte" + }, + "WQC":{ + "nodeId":"TestService.WQC", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Byte" + }, + "CommandOp":{ + "nodeId":"TestService.CommandOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "CommandInt":{ + "nodeId":"TestService.CommandInt", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "CommandExt":{ + "nodeId":"TestService.CommandExt", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "ProcedureOp":{ + "nodeId":"TestService.ProcedureOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "ProcedureInt":{ + "nodeId":"TestService.ProcedureInt", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "ProcedureExt":{ + "nodeId":"TestService.ProcedureExt", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "CommandEn":{ + "nodeId":"TestService.CommandEn", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "StateCur":{ + "nodeId":"TestService.StateCur", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "ProcedureCur":{ + "nodeId":"TestService.ProcedureCur", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "ProcedureReq":{ + "nodeId":"TestService.ProcedureReq", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "InteractQuestionID":{ + "nodeId":"TestService.InteractQuestionID", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "InteractAnswerID":{ + "nodeId":"TestService.InteractAnswerID", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + }, + "PosTextID":{ + "nodeId":"TestService.PosTextID", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"UInt32" + } + }, + "procedures":[ + { + "id":1, + "name":"TestService_default", + "isDefault":true, + "isSelfCompleting":false, + "dataAssembly":[ + { + "name":"TestService_default", + "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/HealthStateView", + "dataItems":{ + "TagName":{ + "value": "TestService_default" + }, + "TagDescription": { + "value": "Default Procedure of TestService" + }, + "WQC":{ + "nodeId":"TestService.TestService_default.WQC", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Byte" + } + } + } + ], + "parameters":[ + { + "name":"AnaProcParam_TestService_factor", + "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaServParam", + "dataItems":{ + "TagName":{ + "value": "AnaProcParam_TestService_factor" + }, + "TagDescription":{ + "value": "Factor for scaling" + }, + "WQC":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.WQC", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Byte" + }, + "OSLevel":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.OSLevel", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Byte" + }, + "StateChannel":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.StateChannel", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOffAut":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.StateOffAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOpAut":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.StateOpAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateAutAut":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.StateAutAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOffOp":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.StateOffOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOpOp":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.StateOpOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateAutOp":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.StateAutOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOpAct":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.StateOpAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateAutAct":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.StateAutAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOffAct":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.StateOffAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcChannel":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.SrcChannel", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcExtAut":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.SrcExtAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcIntAut":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.SrcIntAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcIntOp":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.SrcIntOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcExtOp":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.SrcExtOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcExtAct":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.SrcExtAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcIntAct":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.SrcIntAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "VExt":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.VExt", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VOp":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.VOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VInt":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.VInt", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VReq":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.VReq", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VFbk":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.VFbk", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VOut":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.VOut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VSclMin":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.VSclMin", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VSclMax":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.VSclMax", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VMin":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.VMin", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VMax":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.VMax", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VUnit":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.VUnit", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Int16" + }, + "Sync":{ + "nodeId":"TestService.AnaProcParam_TestService_factor.Sync", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + } + } + } + ], + "reportParameters":[ + { + "name":"AnaReportValue_TestService_rvTime", + "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/IndicatorElement/StringView", + "dataItems":{ + "TagName":{ + "value": "AnaReportValue_TestService_rvTime" + }, + "TagDescription":{ + "value": "Final integration time" + }, + "WQC":{ + "nodeId":"TestService.AnaReportValue_TestService_rvTime.WQC", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Byte" + }, + "Text":{ + "nodeId":"TestService.AnaReportValue_TestService_rvTime.Text", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"String" + } + } + }, + { + "name":"AnaReportValue_TestService_rvOutScaled", + "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "dataItems":{ + "TagName":{ + "value": "AnaReportValue_TestService_rvOutScaled" + }, + "TagDescription":{ + "value": "Final scaled value out" + }, + "WQC":{ + "nodeId": "TestService.AnaReportValue_TestService_rvOutScaled.WQC", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Byte" + }, + "V":{ + "nodeId":"TestService.AnaReportValue_TestService_rvOutScaled.V", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VSclMin":{ + "nodeId": "TestService.AnaReportValue_TestService_rvOutScaled.VSclMin", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Float" + }, + "VSclMax":{ + "nodeId":"TestService.AnaReportValue_TestService_rvOutScaled.VSclMax", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VUnit":{ + "nodeId": "TestService.AnaReportValue_TestService_rvOutScaled.VUnit", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Int16" + } + } + } + ], + "processValuesIn":[ + { + "name":"AnaProcessValueIn_TestService_pv", + "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/InputElement/AnaProcessValueIn", + "dataItems":{ + "TagName":"AnaProcessValueIn_TestService_pv", + "TagDescription":"Analog Process Value Input", + "WQC":{ + "nodeId": "TestService.AnaProcessValueIn_TestService_pv.WQC", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Byte" + }, + "VExt":{ + "nodeId": "TestService.AnaProcessValueIn_TestService_pv.VExt", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Float" + }, + "VSclMin":{ + "nodeId":"TestService.AnaProcessValueIn_TestService_pv.VSclMin", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VSclMax":{ + "nodeId":"TestService.AnaProcessValueIn_TestService_pv.VSclMax", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VUnit":{ + "nodeId":"TestService.AnaProcessValueIn_TestService_pv.VUnit", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Int16" + } + } + } + ], + "processValuesOut":[ + { + "name":"AnaProcessValueOut_TestService_pvOutIntegral", + "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "dataItems":{ + "TagName":"AnaProcessValueOut_TestService_pvOutIntegral", + "TagDescription":"Integral of pv", + "WQC":{ + "nodeId": "TestService.AnaProcessValueOut_TestService_pvOutIntegral.WQC", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Byte" + }, + "V":{ + "nodeId": "TestService.AnaProcessValueOut_TestService_pvOutIntegral.V", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Float" + }, + "VSclMin":{ + "nodeId": "TestService.AnaProcessValueOut_TestService_pvOutIntegral.VSclMin", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Float" + }, + "VSclMax":{ + "nodeId": "TestService.AnaProcessValueOut_TestService_pvOutIntegral.VSclMax", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Float" + }, + "VUnit":{ + "nodeId": "TestService.AnaProcessValueOut_TestService_pvOutIntegral.VUnit", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Int16" + } + } + } + ] + } + ], + "parameters":[ + { + "name":"AnaConfParam_TestService_updateRate", + "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaServParam", + "dataItems":{ + "TagName":{ + "value": "AnaConfParam_TestService_updateRate" + }, + "TagDescription":{ + "value": "UpdateRate during execute" + }, + "OSLevel":{ + "nodeId": "TestService.AnaConfParam_TestService_updateRate.OSLevel", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Byte" + }, + "WQC":{ + "nodeId": "TestService.AnaConfParam_TestService_updateRate.WQC", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Byte" + }, + "StateChannel":{ + "nodeId": "TestService.AnaConfParam_TestService_updateRate.StateChannel", + "namespaceIndex": "urn:P2OLab:NodeOPCUA-Server", + "dataType": "Boolean" + }, + "StateOffAut":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.StateOffAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOpAut":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.StateOpAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateAutAut":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.StateAutAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOffOp":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.StateOffOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOpOp":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.StateOpOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateAutOp":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.StateAutOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOpAct":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.StateOpAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateAutAct":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.StateAutAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "StateOffAct":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.StateOffAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcChannel":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.SrcChannel", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcExtAut":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.SrcExtAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcIntAut":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.SrcIntAut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcIntOp":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.SrcIntOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcExtOp":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.SrcExtOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcExtAct":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.SrcExtAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "SrcIntAct":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.SrcIntAct", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + }, + "VExt":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.VExt", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VOp":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.VOp", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VInt":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.VInt", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VReq":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.VReq", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VFbk":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.VFbk", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VOut":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.VOut", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VSclMin":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.VSclMin", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VSclMax":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.VSclMax", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VMin":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.VMin", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VMax":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.VMax", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Float" + }, + "VUnit":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.VUnit", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Int16" + }, + "Sync":{ + "nodeId":"TestService.AnaConfParam_TestService_updateRate.Sync", + "namespaceIndex":"urn:P2OLab:NodeOPCUA-Server", + "dataType":"Boolean" + } + } + } + ] + } + ], + "username":"", + "password":"", + "hmiUrl":"", + "opcuaServerUrl":"opc.tcp://localhost:4334", + "dataAssemblies":[] +} diff --git a/src/modularPlantManager/polService/POLService.puml b/src/modularPlantManager/polService/POLService.puml index 03aca7be..53dc05cd 100644 --- a/src/modularPlantManager/polService/POLService.puml +++ b/src/modularPlantManager/polService/POLService.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include polServiceInstances/aggregatedService/AggregatedService.puml diff --git a/src/modularPlantManager/polService/POLService.spec.ts b/src/modularPlantManager/polService/POLService.spec.ts index 1de147c4..6e6e9a32 100644 --- a/src/modularPlantManager/polService/POLService.spec.ts +++ b/src/modularPlantManager/polService/POLService.spec.ts @@ -35,6 +35,7 @@ import { import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import * as fs from 'fs'; +import {ParameterInterface} from '@p2olab/polaris-interface'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -46,8 +47,8 @@ describe('POLService', () => { describe('via ModularPlantManager', () => { it('should instantiate two timers', async () => { const manager = new ModularPlantManager(); - manager.instantiatePOLService({name: 'timer1', type: 'timer'}); - manager.instantiatePOLService({name: 'timer2', type: 'timer'}); + manager.addPOLService({name: 'timer1', type: 'timer'}); + manager.addPOLService({name: 'timer2', type: 'timer'}); expect(manager.polServices).to.have.lengthOf(2); }); @@ -88,8 +89,7 @@ describe('POLService', () => { it('should instantiate aggregated service', async() => { const manager = new ModularPlantManager(); const peaSet = await manager.loadPEAController( - JSON.parse(fs.readFileSync('assets/peas/achema_demonstrator/peas_achema.json').toString()), - true); + JSON.parse(fs.readFileSync('assets/peas/achema_demonstrator/peas_achema.json').toString())); expect(peaSet).to.have.lengthOf(3); const asJson = parseJson( @@ -161,13 +161,13 @@ describe('POLService', () => { await timer.start(); expect(timer.state).to.equal(ServiceState.EXECUTE); expect(hit).to.equal(1); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.equal(100); await delay(45); expect(hit).to.equal(5); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(55, 5); @@ -176,7 +176,7 @@ describe('POLService', () => { expect(hit).to.equal(6); await delay(25); expect(hit).to.equal(6); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(55, 5); @@ -184,13 +184,13 @@ describe('POLService', () => { expect(hit).to.equal(6); await delay(12); expect(hit).to.equal(7); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(43, 5); await delay(20); expect(hit).to.equal(9); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(23, 5); @@ -247,13 +247,13 @@ describe('POLService', () => { await delay(110); params = f1.json().procedures[0].processValuesOut; - let value = params.find((p: any) => p.name === 'output'); - expect(value).to.have.property('value').to.be.closeTo(0.5, 0.03); + let value = params.find((p: ParameterInterface) => p.name === 'output'); + expect(value).to.have.property('value').to.be.closeTo(0.5, 0.04); await f1.pause(); await delay(100); params = f1.json().procedures[0].processValuesOut; - value = params.find((p: any) => p.name === 'output'); + value = params.find((p: ParameterInterface) => p.name === 'output'); expect(value).to.have.property('value').to.be.closeTo(0.874, 0.03); await f1.resume(); await delay(100); @@ -278,11 +278,11 @@ describe('POLService', () => { expect(params[0]).to.have.property('name', 'storage'); expect(params[0]).to.have.property('value', 2); - s1.setParameters([{name: 'storage', value: 'teststring'}]); + s1.setParameters([{name: 'storage', value: 'testing'}]); params = s1.json().procedures[0].parameters; expect(params).to.have.lengthOf(1); expect(params[0]).to.have.property('name', 'storage'); - expect(params[0]).to.have.property('value', 'teststring'); + expect(params[0]).to.have.property('value', 'testing'); await s1.start(); await s1.complete(); @@ -306,7 +306,7 @@ describe('POLService', () => { expect(params[0]).to.have.property('value', '2*t'); await f1.start(); - await new Promise((resolve) => { + await new Promise((resolve) => { f1.eventEmitter.once('parameterChanged', () => { resolve(); }); diff --git a/src/modularPlantManager/polService/POLServiceFactory.spec.ts b/src/modularPlantManager/polService/POLServiceFactory.spec.ts index 7fc4b66b..3adfe785 100644 --- a/src/modularPlantManager/polService/POLServiceFactory.spec.ts +++ b/src/modularPlantManager/polService/POLServiceFactory.spec.ts @@ -46,8 +46,8 @@ describe('POLServiceFactory', () => { describe('via ModularPlantManager', () => { it('should instantiate two timers', async () => { const manager = new ModularPlantManager(); - manager.instantiatePOLService({name: 'timer1', type: 'timer'}); - manager.instantiatePOLService({name: 'timer2', type: 'timer'}); + manager.addPOLService({name: 'timer1', type: 'timer'}); + manager.addPOLService({name: 'timer2', type: 'timer'}); expect(manager.polServices).to.have.lengthOf(2); }); @@ -55,7 +55,10 @@ describe('POLServiceFactory', () => { describe('Factory', () => { it('should instantiate timer', () => { - const timerJson = parseJson(fs.readFileSync('assets/polService/timer.json', 'utf8'), null, 60); + const timerJson = { + 'name': 'timer1', + 'type': 'timer' + }; const timer = POLServiceFactory.create(timerJson); @@ -88,8 +91,7 @@ describe('POLServiceFactory', () => { it('should instantiate aggregated service', async() => { const manager = new ModularPlantManager(); const peaSet = await manager.loadPEAController( - JSON.parse(fs.readFileSync('assets/peas/achema_demonstrator/peas_achema.json').toString()), - true); + JSON.parse(fs.readFileSync('assets/peas/achema_demonstrator/peas_achema.json').toString())); expect(peaSet).to.have.lengthOf(3); const asJson = parseJson( @@ -305,7 +307,7 @@ describe('POLServiceFactory', () => { expect(params[0]).to.have.property('value', '2*t'); await f1.start(); - await new Promise((resolve) => { + await new Promise((resolve) => { f1.eventEmitter.once('parameterChanged', () => { resolve(); }); diff --git a/src/modularPlantManager/polService/POLServiceFactory.ts b/src/modularPlantManager/polService/POLServiceFactory.ts index 3aba3f0e..973cdebc 100644 --- a/src/modularPlantManager/polService/POLServiceFactory.ts +++ b/src/modularPlantManager/polService/POLServiceFactory.ts @@ -54,7 +54,7 @@ export class POLServiceFactory { } return new AggregatedService(options as AggregatedServiceOptions, peaSet, polServices); } else { - throw new Error('Unknown pol service type ${options.type}'); + throw new Error(`Unknown pol service type ${options.type}`); } } } diff --git a/src/modularPlantManager/polService/Readme.md b/src/modularPlantManager/polService/Readme.md index c21f47db..5b7f7808 100644 --- a/src/modularPlantManager/polService/Readme.md +++ b/src/modularPlantManager/polService/Readme.md @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + Virtual Services / POL Services =============================== diff --git a/src/modularPlantManager/polService/aggregated-service-context.puml b/src/modularPlantManager/polService/aggregated-service-context.puml deleted file mode 100644 index a497165c..00000000 --- a/src/modularPlantManager/polService/aggregated-service-context.puml +++ /dev/null @@ -1,45 +0,0 @@ -@startuml -skinparam monochrome true - -frame POL { -node Polaris-VirtualServices { - card "CombinedDoseFill (AggregatedService)" as AggregatedService1 - card "SpecialRecipe (AggregatedService)" as AggregatedService2 - card Timer1 - } -} - -AggregatedService2 ..> AggregatedService1 -AggregatedService2 ..> Timer1 - -frame PEA-layer { - - node PEA2 { - card "Service Fill" as PEA2S1 - card "Service 2" as PEA2S2 - entity V2.1 - entity "T2.1" - } - - node PEA1 { - card "Service Dose" as PEA1S1 - card "Service 2" as PEA1S2 - entity "P1.1" - entity "V1.1" - } - -} - -AggregatedService1 ..> PEA1S1 -AggregatedService1 ..> PEA2S1 - -PEA1S1 ..> P1.1 -PEA1S1 ..> V1.1 - -PEA2S1 ..> V2.1 - -P1.1 ->> V1.1 -V1.1 ->> V2.1 -V2.1 ->> T2.1 - -@enduml \ No newline at end of file diff --git a/src/modularPlantManager/polService/index.ts b/src/modularPlantManager/polService/index.ts index 08a7374b..190f895b 100644 --- a/src/modularPlantManager/polService/index.ts +++ b/src/modularPlantManager/polService/index.ts @@ -1,4 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './POLService'; export * from './POLServiceFactory'; - export * from './polServiceInstances'; diff --git a/src/modularPlantManager/polService/polServiceInstances/FunctionGenerator.puml b/src/modularPlantManager/polService/polServiceInstances/FunctionGenerator.puml index 4645c4d3..6c00e422 100644 --- a/src/modularPlantManager/polService/polServiceInstances/FunctionGenerator.puml +++ b/src/modularPlantManager/polService/polServiceInstances/FunctionGenerator.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/polService/polServiceInstances/FunctionGenerator.spec.ts b/src/modularPlantManager/polService/polServiceInstances/FunctionGenerator.spec.ts index 6f54f21a..90ec6379 100644 --- a/src/modularPlantManager/polService/polServiceInstances/FunctionGenerator.spec.ts +++ b/src/modularPlantManager/polService/polServiceInstances/FunctionGenerator.spec.ts @@ -34,20 +34,21 @@ import { import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import * as fs from 'fs'; +import {ParameterInterface} from '@p2olab/polaris-interface'; chai.use(chaiAsPromised); const expect = chai.expect; -describe('VirtualService', () => { +describe('POLService', () => { const delay = require('timeout-as-promise'); const parseJson = require('json-parse-better-errors'); describe('via ModularPlantManager', () => { it('should instantiate two timers', async () => { const manager = new ModularPlantManager(); - manager.instantiatePOLService({name: 'timer1', type: 'timer'}); - manager.instantiatePOLService({name: 'timer2', type: 'timer'}); + manager.addPOLService({name: 'timer1', type: 'timer'}); + manager.addPOLService({name: 'timer2', type: 'timer'}); expect(manager.polServices).to.have.lengthOf(2); }); @@ -88,8 +89,7 @@ describe('VirtualService', () => { it('should instantiate aggregated service', async() => { const manager = new ModularPlantManager(); const peaSet = await manager.loadPEAController( - JSON.parse(fs.readFileSync('assets/peas/achema_demonstrator/peas_achema.json').toString()), - true); + JSON.parse(fs.readFileSync('assets/peas/achema_demonstrator/peas_achema.json').toString())); expect(peaSet).to.have.lengthOf(3); const asJson = parseJson( @@ -113,7 +113,7 @@ describe('VirtualService', () => { it('should fail with unknown virtual service type', () => { expect(() => POLServiceFactory.create({type: 'unknown', name: 'myUnknownVirtualService'})) - .to.throw('Unknown virtual service type'); + .to.throw('Unknown pol service type unknown'); }); }); @@ -161,13 +161,13 @@ describe('VirtualService', () => { await timer.start(); expect(timer.state).to.equal(ServiceState.EXECUTE); expect(hit).to.equal(1); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.equal(100); await delay(45); expect(hit).to.equal(5); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(55, 5); @@ -176,7 +176,7 @@ describe('VirtualService', () => { expect(hit).to.equal(6); await delay(25); expect(hit).to.equal(6); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(55, 5); @@ -184,13 +184,13 @@ describe('VirtualService', () => { expect(hit).to.equal(6); await delay(12); expect(hit).to.equal(7); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(43, 5); await delay(20); expect(hit).to.equal(9); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(23, 5); @@ -247,13 +247,13 @@ describe('VirtualService', () => { await delay(110); params = f1.json().procedures[0].processValuesOut; - let value = params.find((p: any) => p.name === 'output'); + let value = params.find((p: ParameterInterface) => p.name === 'output'); expect(value).to.have.property('value').to.be.closeTo(0.5, 0.04); await f1.pause(); await delay(100); params = f1.json().procedures[0].processValuesOut; - value = params.find((p: any) => p.name === 'output'); + value = params.find((p: ParameterInterface) => p.name === 'output'); expect(value).to.have.property('value').to.be.closeTo(0.841, 0.04); await f1.resume(); await delay(100); @@ -278,11 +278,11 @@ describe('VirtualService', () => { expect(params[0]).to.have.property('name', 'storage'); expect(params[0]).to.have.property('value', 2); - s1.setParameters([{name: 'storage', value: 'teststring'}]); + s1.setParameters([{name: 'storage', value: 'testing'}]); params = s1.json().procedures[0].parameters; expect(params).to.have.lengthOf(1); expect(params[0]).to.have.property('name', 'storage'); - expect(params[0]).to.have.property('value', 'teststring'); + expect(params[0]).to.have.property('value', 'testing'); await s1.start(); await s1.complete(); @@ -306,7 +306,7 @@ describe('VirtualService', () => { expect(params[0]).to.have.property('value', '2*t'); await f1.start(); - await new Promise((resolve) => { + await new Promise((resolve) => { f1.eventEmitter.once('parameterChanged', () => { resolve(); }); diff --git a/src/modularPlantManager/polService/polServiceInstances/PidController.puml b/src/modularPlantManager/polService/polServiceInstances/PidController.puml index 4645c4d3..6c00e422 100644 --- a/src/modularPlantManager/polService/polServiceInstances/PidController.puml +++ b/src/modularPlantManager/polService/polServiceInstances/PidController.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/polService/polServiceInstances/PidController.spec.ts b/src/modularPlantManager/polService/polServiceInstances/PidController.spec.ts index 0cede2ce..e0022441 100644 --- a/src/modularPlantManager/polService/polServiceInstances/PidController.spec.ts +++ b/src/modularPlantManager/polService/polServiceInstances/PidController.spec.ts @@ -35,6 +35,7 @@ import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import * as fs from 'fs'; import {POLServiceFactory} from '../POLServiceFactory'; +import {ParameterInterface} from '@p2olab/polaris-interface'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -46,8 +47,8 @@ describe('POLService', () => { describe('via ModularPlantManager', () => { it('should instantiate two timers', async () => { const manager = new ModularPlantManager(); - manager.instantiatePOLService({name: 'timer1', type: 'timer'}); - manager.instantiatePOLService({name: 'timer2', type: 'timer'}); + manager.addPOLService({name: 'timer1', type: 'timer'}); + manager.addPOLService({name: 'timer2', type: 'timer'}); expect(manager.polServices).to.have.lengthOf(2); }); @@ -88,8 +89,7 @@ describe('POLService', () => { it('should instantiate aggregated service', async () => { const manager = new ModularPlantManager(); const peaSet = await manager.loadPEAController( - JSON.parse(fs.readFileSync('assets/peas/achema_demonstrator/peas_achema.json').toString()), - true); + JSON.parse(fs.readFileSync('assets/peas/achema_demonstrator/peas_achema.json').toString())); expect(peaSet).to.have.lengthOf(3); const asJson = parseJson( @@ -161,13 +161,13 @@ describe('POLService', () => { await timer.start(); expect(timer.state).to.equal(ServiceState.EXECUTE); expect(hit).to.equal(1); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.equal(100); await delay(45); expect(hit).to.equal(5); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(55, 5); @@ -176,7 +176,7 @@ describe('POLService', () => { expect(hit).to.equal(6); await delay(25); expect(hit).to.equal(6); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(55, 5); @@ -184,13 +184,13 @@ describe('POLService', () => { expect(hit).to.equal(6); await delay(12); expect(hit).to.equal(7); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(43, 5); await delay(20); expect(hit).to.equal(9); - expect(timer.json().procedures[0].processValuesOut.find((p: any) => p.name === 'remainingTime')) + expect(timer.json().procedures[0].processValuesOut.find((p: ParameterInterface) => p.name === 'remainingTime')) .to.have.property('value') .to.closeTo(23, 5); @@ -247,13 +247,13 @@ describe('POLService', () => { await delay(110); params = f1.json().procedures[0].processValuesOut; - let value = params.find((p: any) => p.name === 'output'); + let value = params.find((p: ParameterInterface) => p.name === 'output'); expect(value).to.have.property('value').to.be.closeTo(0.5, 0.03); await f1.pause(); await delay(100); params = f1.json().procedures[0].processValuesOut; - value = params.find((p: any) => p.name === 'output'); + value = params.find((p: ParameterInterface) => p.name === 'output'); expect(value).to.have.property('value').to.be.closeTo(0.841, 0.03); await f1.resume(); await delay(100); @@ -278,11 +278,11 @@ describe('POLService', () => { expect(params[0]).to.have.property('name', 'storage'); expect(params[0]).to.have.property('value', 2); - s1.setParameters([{name: 'storage', value: 'teststring'}]); + s1.setParameters([{name: 'storage', value: 'testing'}]); params = s1.json().procedures[0].parameters; expect(params).to.have.lengthOf(1); expect(params[0]).to.have.property('name', 'storage'); - expect(params[0]).to.have.property('value', 'teststring'); + expect(params[0]).to.have.property('value', 'testing'); await s1.start(); await s1.complete(); @@ -306,7 +306,7 @@ describe('POLService', () => { expect(params[0]).to.have.property('value', '2*t'); await f1.start(); - await new Promise((resolve) => { + await new Promise((resolve) => { f1.eventEmitter.once('parameterChanged', () => { resolve(); }); diff --git a/src/modularPlantManager/polService/polServiceInstances/PidController.ts b/src/modularPlantManager/polService/polServiceInstances/PidController.ts index b8937d4a..17e96142 100644 --- a/src/modularPlantManager/polService/polServiceInstances/PidController.ts +++ b/src/modularPlantManager/polService/polServiceInstances/PidController.ts @@ -63,11 +63,11 @@ export class PidController extends POLService { public async onStarting(): Promise { this.ctr = new Controller({ - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase k_p: this.procedureParameters.find((param) => param.name === 'p')?.value as number, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase k_i: this.procedureParameters.find((param) => param.name === 'i')?.value as number, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase k_d: this.procedureParameters.find((param) => param.name === 'd')?.value as number }); } diff --git a/src/modularPlantManager/polService/polServiceInstances/Storage.puml b/src/modularPlantManager/polService/polServiceInstances/Storage.puml index 7aad7252..2a6bac8f 100644 --- a/src/modularPlantManager/polService/polServiceInstances/Storage.puml +++ b/src/modularPlantManager/polService/polServiceInstances/Storage.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/polService/polServiceInstances/Timer.puml b/src/modularPlantManager/polService/polServiceInstances/Timer.puml index df7904e3..b38e7412 100644 --- a/src/modularPlantManager/polService/polServiceInstances/Timer.puml +++ b/src/modularPlantManager/polService/polServiceInstances/Timer.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/AggregatedService.puml b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/AggregatedService.puml index 7f106fdf..72a32927 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/AggregatedService.puml +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/AggregatedService.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/AggregatedService.spec.ts b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/AggregatedService.spec.ts index 441f967d..16e34c59 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/AggregatedService.spec.ts +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/AggregatedService.spec.ts @@ -23,20 +23,14 @@ * SOFTWARE. */ -import {PEAOptions} from '@p2olab/polaris-interface'; -import {PEAController} from '../../../pea'; -import {ServiceState} from '../../../pea/dataAssembly'; import {Timer} from '../Timer'; import { AggregatedService, - AggregatedServiceOptions, CommandEnableOptions, StateMachineOptions } from './AggregatedService'; import {expect} from 'chai'; -import * as fs from 'fs'; -import {MockupServer} from '../../../_utils'; describe('AggregatedService', () => { diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/aggregated-service-context.puml b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/aggregated-service-context.puml new file mode 100644 index 00000000..a21582cd --- /dev/null +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/aggregated-service-context.puml @@ -0,0 +1,70 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +skinparam monochrome true + +frame POL { +node Polaris-VirtualServices { + card "CombinedDoseFill (AggregatedService)" as AggregatedService1 + card "SpecialRecipe (AggregatedService)" as AggregatedService2 + card Timer1 + } +} + +AggregatedService2 ..> AggregatedService1 +AggregatedService2 ..> Timer1 + +frame PEA-layer { + + node PEA2 { + card "Service Fill" as PEA2S1 + card "Service 2" as PEA2S2 + entity V2.1 + entity "T2.1" + } + + node PEA1 { + card "Service Dose" as PEA1S1 + card "Service 2" as PEA1S2 + entity "P1.1" + entity "V1.1" + } + +} + +AggregatedService1 ..> PEA1S1 +AggregatedService1 ..> PEA2S1 + +PEA1S1 ..> P1.1 +PEA1S1 ..> V1.1 + +PEA2S1 ..> V2.1 + +P1.1 ->> V1.1 +V1.1 ->> V2.1 +V2.1 ->> T2.1 + +@enduml \ No newline at end of file diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/index.ts b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/index.ts index 6f324360..bc87f575 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/index.ts +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/index.ts @@ -1,2 +1,27 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './petrinet'; export * from './AggregatedService'; diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet.puml b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet.puml index 99fd1fbc..445d1812 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet.puml +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet.ts b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet.ts index a1559148..0e0e1418 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet.ts +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet.ts @@ -77,7 +77,7 @@ export class Petrinet { public async run(): Promise { if (this.initialTransition) { this.listenToTransition(this.initialTransition); - await new Promise((resolve) => this.eventEmitter.once('completed', () => resolve())); + await new Promise((resolve) => this.eventEmitter.once('completed', () => resolve())); } } diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetState.puml b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetState.puml index 81338de1..f00f0d3a 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetState.puml +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetState.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetState.ts b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetState.ts index 2f7540d5..12c582dd 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetState.ts +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetState.ts @@ -57,7 +57,7 @@ export class PetrinetState { * @returns {Promise} */ public async execute(): Promise { - const tasks = this.operations.map((operation) => new Promise((resolve, reject) => { + const tasks = this.operations.map((operation) => new Promise((resolve, reject) => { catRecipe.info(`Start operation ${operation.pea?.id} ${operation.service.name} ` + `${JSON.stringify(operation.command)}`); operation.execute(); diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetTranistion.puml b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetTranistion.puml index d823aef4..78b06f76 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetTranistion.puml +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetTranistion.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetTransition.ts b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetTransition.ts index 49696f46..b95ce22d 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetTransition.ts +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/PetrinetTransition.ts @@ -53,10 +53,4 @@ export class PetrinetTransition { } } - public json() { - return { - nextStates: this.options.nextStates, - condition: this.condition!.json() - }; - } } diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet_complex.spec.puml b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet_complex.spec.puml index 722ae592..90d42827 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet_complex.spec.puml +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/Petrinet_complex.spec.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml skinparam monochrome true diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/index.ts b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/index.ts index cbd6ada2..1590159c 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/index.ts +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './Petrinet'; export * from './PetrinetState'; export * from './PetrinetTransition'; diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet-sample.puml b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet-sample.puml index fbf692dc..f877f99d 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet-sample.puml +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet-sample.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml skinparam monochrome true diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet-sample2.puml b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet-sample2.puml index 017894f9..c7299f14 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet-sample2.puml +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet-sample2.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml skinparam monochrome true diff --git a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet_old.puml b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet_old.puml index 9774b5b6..fcb2451f 100644 --- a/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet_old.puml +++ b/src/modularPlantManager/polService/polServiceInstances/aggregatedService/petrinet/petrinet_old.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml skinparam monochrome true diff --git a/src/modularPlantManager/polService/polServiceInstances/index.ts b/src/modularPlantManager/polService/polServiceInstances/index.ts index f39f75cc..b88749cc 100644 --- a/src/modularPlantManager/polService/polServiceInstances/index.ts +++ b/src/modularPlantManager/polService/polServiceInstances/index.ts @@ -1,5 +1,29 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './aggregatedService'; - export * from './FunctionGenerator'; export * from './PidController'; export * from './Storage'; diff --git a/src/modularPlantManager/recipe/Player.puml b/src/modularPlantManager/recipe/Player.puml index 7ef976f7..7232ac44 100644 --- a/src/modularPlantManager/recipe/Player.puml +++ b/src/modularPlantManager/recipe/Player.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include Recipe.puml diff --git a/src/modularPlantManager/recipe/Player.spec.ts b/src/modularPlantManager/recipe/Player.spec.ts index 60e1449a..ec68815d 100644 --- a/src/modularPlantManager/recipe/Player.spec.ts +++ b/src/modularPlantManager/recipe/Player.spec.ts @@ -31,8 +31,6 @@ import {Player, Recipe} from './index'; import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import * as fs from 'fs'; -import {timeout} from 'promise-timeout'; -import {PEAMockup} from '../pea/PEA.mockup'; import {MockupServer} from '../_utils'; chai.use(chaiAsPromised); @@ -67,7 +65,7 @@ describe('Player', () => { player.enqueue(recipe); player.start(); - await new Promise((resolve) => player.once('completed', resolve)); + await new Promise((resolve) => player.once('completed', resolve)); await pea.disconnectAndUnsubscribe(); }).timeout(10000); diff --git a/src/modularPlantManager/recipe/Player.ts b/src/modularPlantManager/recipe/Player.ts index 177c0214..b86ab179 100644 --- a/src/modularPlantManager/recipe/Player.ts +++ b/src/modularPlantManager/recipe/Player.ts @@ -174,7 +174,7 @@ export class Player extends (EventEmitter as new() => PlayerEmitter) { * * @returns Player */ - public async start() { + public async start(): Promise { catPlayer.info(`Start player: ${this._playlist.map((item) => item.name)} ` + `(current state: ${RecipeState[this.status]})`); if (this._playlist.length <= 0) { @@ -199,15 +199,15 @@ export class Player extends (EventEmitter as new() => PlayerEmitter) { this.emit('completed'); } else if (this.status === RecipeState.paused) { this._status = RecipeState.running; - this.getCurrentRecipe().peaSet.forEach((p) => { - p.resume(); + this.getCurrentRecipe().peaSet.forEach((peaController) => { + peaController.resumeAllServices(); }); } else { throw new Error('Player currently already running'); } } - public reset() { + public reset(): void { if (this.status === RecipeState.completed || this.status === RecipeState.stopped) { this._currentItem = -1; this._status = RecipeState.idle; @@ -218,7 +218,7 @@ export class Player extends (EventEmitter as new() => PlayerEmitter) { * Pause all peas used in current recipe * TODO: pause only those which should be currently in running due to the recipe */ - public pause() { + public async pause(): Promise { if (this.status === RecipeState.running) { this._status = RecipeState.paused; this.getCurrentRecipe().pause(); @@ -228,11 +228,11 @@ export class Player extends (EventEmitter as new() => PlayerEmitter) { /** * Stop the current recipe of player */ - public async stop() { - catPlayer.info('Stop player'); + public async stop(): Promise { if (this.status === RecipeState.running) { + catPlayer.info('Stopping player'); this._status = RecipeState.stopped; - await this.currentRecipeRun!.stop(); + await this.currentRecipeRun?.stop(); this.currentRecipeRun = undefined; } } @@ -241,17 +241,17 @@ export class Player extends (EventEmitter as new() => PlayerEmitter) { * Force transition of current recipe * */ - public forceTransition(stepName: string, nextStepName: string) { + public forceTransition(stepName: string, nextStepName: string): void { const recipe = this.getCurrentRecipe(); - if (recipe.currentStep!.name !== stepName) { - throw new Error(`Ẁrong step. Expected: ${recipe.currentStep!.name} - Actual: ${stepName}`); + if (recipe.currentStep?.name !== stepName) { + throw new Error(`Wrong step. Expected: ${recipe.currentStep?.name} - Actual: ${stepName}`); } const step = recipe.currentStep; - const transition = step!.transitions.find((tr) => tr.nextStepName === nextStepName); + const transition = step?.transitions.find((tr) => tr.nextStepName === nextStepName); if (!transition) { throw new Error('Does not contain nextStep'); } - step!.enterTransition(transition); + step?.enterTransition(transition); } /** Run current recipe in playlist and resolve when this recipe is completed diff --git a/src/modularPlantManager/recipe/Recipe.puml b/src/modularPlantManager/recipe/Recipe.puml index 60666542..e44903e0 100644 --- a/src/modularPlantManager/recipe/Recipe.puml +++ b/src/modularPlantManager/recipe/Recipe.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include step/Step.puml diff --git a/src/modularPlantManager/recipe/Recipe.spec.ts b/src/modularPlantManager/recipe/Recipe.spec.ts index b3dbea16..bd4748d1 100644 --- a/src/modularPlantManager/recipe/Recipe.spec.ts +++ b/src/modularPlantManager/recipe/Recipe.spec.ts @@ -23,22 +23,27 @@ * SOFTWARE. */ +/* eslint-disable */ import {ConditionType, RecipeInterface, RecipeOptions} from '@p2olab/polaris-interface'; import {PEAController} from '../pea'; import {Recipe} from './Recipe'; import * as assert from 'assert'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; + import * as fs from 'fs'; import {PEAMockup} from '../pea/PEA.mockup'; import {MockupServer} from '../_utils'; +/* eslint-enable */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; chai.use(chaiAsPromised); const expect = chai.expect; describe('Recipe', () => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const delay = require('timeout-as-promise'); it('should fail with missing name', () => { expect(() => new Recipe({ @@ -196,7 +201,7 @@ describe('Recipe', () => { expect(json).to.have.property('peas') .to.deep.equal(['Temper', 'React', 'Dose']); expect(json).to.have.property('options') - .to.have.property('initial_step', 'Startup.Init'); + .to.have.property('initialStep', 'Startup.Init'); expect(json).to.have.property('status', 'idle'); const step = recipe.steps[0]; diff --git a/src/modularPlantManager/recipe/Recipe.ts b/src/modularPlantManager/recipe/Recipe.ts index 551d2a7a..6cde2457 100644 --- a/src/modularPlantManager/recipe/Recipe.ts +++ b/src/modularPlantManager/recipe/Recipe.ts @@ -115,7 +115,7 @@ export class Recipe extends (EventEmitter as new() => RecipeEmitter) { this.initialStep = this.steps.find((step) => step.name === options.initialStep); } if (!this.initialStep) { - throw new Error(`"initial_step" property '${options.initialStep}' is not found in provided steps`); + throw new Error(`"initialStep" property '${options.initialStep}' is not found in provided steps`); } this.options = options; @@ -183,8 +183,8 @@ export class Recipe extends (EventEmitter as new() => RecipeEmitter) { if (this.status !== RecipeState.running) { throw new Error('Can only pause running recipe'); } - this.peaSet.forEach((p) => { - p.pause(); + this.peaSet.forEach((peaController) => { + peaController.pauseAllServices().then(); }); } @@ -198,7 +198,7 @@ export class Recipe extends (EventEmitter as new() => RecipeEmitter) { throw new Error('Can only stop running recipe'); } catRecipe.info(`Stop recipe ${this.name}`); - await Promise.all(Array.from(this.peaSet).map((p) => p.stop())); + await Promise.all(Array.from(this.peaSet).map((peaController) => peaController.stopAllServices())); this.status = RecipeState.stopped; if (this.stepListener) { this.stepListener.removeAllListeners('completed'); diff --git a/src/modularPlantManager/recipe/RecipeRun.puml b/src/modularPlantManager/recipe/RecipeRun.puml index d1e18fa4..3ece9b9c 100644 --- a/src/modularPlantManager/recipe/RecipeRun.puml +++ b/src/modularPlantManager/recipe/RecipeRun.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include Recipe.puml diff --git a/src/modularPlantManager/recipe/ScopeItem.puml b/src/modularPlantManager/recipe/ScopeItem.puml index da29b1fc..a07dd32d 100644 --- a/src/modularPlantManager/recipe/ScopeItem.puml +++ b/src/modularPlantManager/recipe/ScopeItem.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/recipe/ScopeItem.spec.ts b/src/modularPlantManager/recipe/ScopeItem.spec.ts index 5c70a5d0..38dcba4e 100644 --- a/src/modularPlantManager/recipe/ScopeItem.spec.ts +++ b/src/modularPlantManager/recipe/ScopeItem.spec.ts @@ -23,6 +23,7 @@ * SOFTWARE. */ +/* eslint-disable */ import {PEAController} from '../PEA'; import {OpcUaDataItem} from '../pea/connection'; import {ScopeItem} from './ScopeItem'; @@ -32,10 +33,8 @@ import {Expression} from 'expr-eval'; import * as fs from 'fs'; import {PEATestNumericVariable, waitForParameterChange, waitForVariableChange} from '../_utils'; import { MockupServer} from '../_utils'; +/* eslint-enable */ -/** - * Tests for [[ScopeItem]] - */ /* describe('ScopeItem', () => { @@ -56,7 +55,7 @@ describe('ScopeItem', () => { expect(extraction.scopeItems[0].name).to.equal('PEATestServer.Variable001'); }); - it('should work for multiple variables', () => { + it('should work for multiple dataAssemblies', () => { const extraction = ScopeItem.extractFromExpressionString( 'PEATestServer.Variable001 + PEATestServer.Variable002', [peaTestServer]); expect(extraction.scopeItems).to.have.lengthOf(2); @@ -64,7 +63,7 @@ describe('ScopeItem', () => { expect(extraction.scopeItems[1].name).to.equal('PEATestServer.Variable002'); }); - it('should work for multiple times of same variables', () => { + it('should work for multiple times of same dataAssemblies', () => { const extraction = ScopeItem.extractFromExpressionString( 'PEATestServer.Variable001 + PEATestServer.Variable001', [peaTestServer]); expect(extraction.scopeItems).to.have.lengthOf(1); @@ -172,7 +171,7 @@ describe('ScopeItem', () => { } }); - //(peaServer.variables[0] as PEATestNumericVariable).v = 3; + //(peaServer.dataAssemblies[0] as PEATestNumericVariable).v = 3; await waitForVariableChange(peaTestServer, 'Variable001', 3); expect(item.getScopeValue()).to.deep.equal({ 'PEATestServer': { @@ -180,7 +179,7 @@ describe('ScopeItem', () => { } }); - //(peaServer.variables[0] as PEATestNumericVariable).v = 4; + //(peaServer.dataAssemblies[0] as PEATestNumericVariable).v = 4; await waitForVariableChange(peaTestServer, 'Variable001', 4); expect(item.getScopeValue()).to.deep.equal({ 'PEATestServer': { diff --git a/src/modularPlantManager/recipe/ScopeItem.ts b/src/modularPlantManager/recipe/ScopeItem.ts index b49c3fdb..878259c3 100644 --- a/src/modularPlantManager/recipe/ScopeItem.ts +++ b/src/modularPlantManager/recipe/ScopeItem.ts @@ -79,7 +79,7 @@ export class ScopeItem { if (!pea){ throw new Error(`PEA "${item.pea}" couldn't be found`); } - const dataAssembly = pea.variables.find((v) => v.name === item.dataAssembly); + const dataAssembly = pea.dataAssemblies.find((v) => v.name === item.dataAssembly); if (!dataAssembly){ throw new Error(`DataAssembly "${item.dataAssembly}" couldn't be found within PEA "${item.pea}"`); } @@ -152,18 +152,18 @@ export class ScopeItem { } } else { // find DataAssemblyController in ProcessValues - if (pea.variables.find((v) => v.name === token)) { - dataAssembly = pea.variables.find((v) => v.name === token); + if (pea.dataAssemblies.find((v) => v.name === token)) { + dataAssembly = pea.dataAssemblies.find((v) => v.name === token); } else { catScopeItem.warn(`Could not evaluate variable "${variable}": ` + `Token "${token}" not found as dataAssembly ` + - `in PEA ${pea.id}: ${pea.variables.map((v) => v.name)}`); + `in PEA ${pea.id}: ${pea.dataAssemblies.map((v) => v.name)}`); } } if (!dataAssembly) { throw new Error(`Could not evaluate variable "${variable}": ` + `Token "${token}" not found as dataAssembly ` + - `in PEA ${pea.id}: ${pea.variables.map((v) => v.name)}`); + `in PEA ${pea.id}: ${pea.dataAssemblies.map((v) => v.name)}`); } // find DataAssemblyController variable diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_achema_entleeren_v0.1.0.json b/src/modularPlantManager/recipe/assets/recipes/recipe_achema_entleeren_v0.1.0.json index fd922001..c09405c7 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_achema_entleeren_v0.1.0.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_achema_entleeren_v0.1.0.json @@ -3,7 +3,7 @@ "name": "Entleeren ACHEMA", "description": "Entleert Reaktor", "author": "Markus Graube", - "initial_step": "Start", + "initialStep": "Start", "steps": [ { "name": "Start", @@ -32,7 +32,7 @@ ], "transitions": [ { - "next_step": "Stop", + "nextStep": "Stop", "condition": { "type": "state", "pea": "React", @@ -59,7 +59,7 @@ "service": "Fill", "state": "idle" }, - "next_step": "finished" + "nextStep": "finished" } ] } diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_achema_inbetriebnahme.json b/src/modularPlantManager/recipe/assets/recipes/recipe_achema_inbetriebnahme.json index 4987d64d..c166d092 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_achema_inbetriebnahme.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_achema_inbetriebnahme.json @@ -3,7 +3,7 @@ "name": "Inbetriebnahme für ACHEMA-Demonstrator", "description": "Befüllt Schläuche zwischen Dosierer und Reaktor. Rührt Gasblasen aus Kühlmedium", "author": "Markus Graube", - "initial_step": "Startup.Init.1", + "initialStep": "Startup.Init.1", "steps": [ { "name": "Startup.Init.1", @@ -16,7 +16,7 @@ ], "transitions": [ { - "next_step": "Startup.Init.2", + "nextStep": "Startup.Init.2", "condition": { "type": "state", "pea": "Dose", @@ -63,7 +63,7 @@ } ] }, - "next_step": "Running.Vorlegen" + "nextStep": "Running.Vorlegen" } ] }, @@ -116,7 +116,7 @@ ], "transitions": [ { - "next_step": "Running.Reagieren", + "nextStep": "Running.Reagieren", "condition": { "type": "state", "pea": "Dose", @@ -181,7 +181,7 @@ ], "transitions": [ { - "next_step": "Running.Ruhen", + "nextStep": "Running.Ruhen", "condition": { "type": "and", "conditions": [ @@ -208,7 +208,7 @@ "operations": [], "transitions": [ { - "next_step": "Running.Ruhen.Stop", + "nextStep": "Running.Ruhen.Stop", "condition": { "type": "time", "duration": 30 @@ -227,7 +227,7 @@ ], "transitions": [ { - "next_step": "Running.Aufheizen", + "nextStep": "Running.Aufheizen", "condition": { "type": "state", "pea": "React", @@ -259,7 +259,7 @@ ], "transitions": [ { - "next_step": "Running.Aufheizen.Stop", + "nextStep": "Running.Aufheizen.Stop", "condition": { "type": "variable", "pea": "Temper", @@ -286,7 +286,7 @@ ], "transitions": [ { - "next_step": "Shutdown.Entleeren.Start", + "nextStep": "Shutdown.Entleeren.Start", "condition": { "type": "and", "conditions": [ @@ -318,7 +318,7 @@ ], "transitions": [ { - "next_step": "Shutdown.Entleeren.Running", + "nextStep": "Shutdown.Entleeren.Running", "condition": { "type": "state", "pea": "Dose", @@ -340,7 +340,7 @@ ], "transitions": [ { - "next_step": "Shutdown.Entleeren.Stop", + "nextStep": "Shutdown.Entleeren.Stop", "condition": { "type": "state", "pea": "React", @@ -361,7 +361,7 @@ ], "transitions": [ { - "next_step": "finished", + "nextStep": "finished", "condition": { "type": "state", "pea": "Dose", diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.1.0.json b/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.1.0.json index 284b55fe..37f7c082 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.1.0.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.1.0.json @@ -3,7 +3,7 @@ "name": "Rezept ACHEMA", "description": "Ursprungsrezept zur ACHEMA 2018", "author": "Markus Graube", - "initial_step": "Startup.Init.1", + "initialStep": "Startup.Init.1", "steps": [ { "name": "Startup.Init.1", @@ -16,7 +16,7 @@ ], "transitions": [ { - "next_step": "Startup.Init.2", + "nextStep": "Startup.Init.2", "condition": { "type": "state", "pea": "Dose", @@ -56,7 +56,7 @@ "operator": "<=", "value": "0.1" }, - "next_step": "Running.Vorlegen" + "nextStep": "Running.Vorlegen" } ] }, @@ -104,7 +104,7 @@ ], "transitions": [ { - "next_step": "Running.Reagieren", + "nextStep": "Running.Reagieren", "condition": { "type": "state", "pea": "Dose", @@ -169,7 +169,7 @@ ], "transitions": [ { - "next_step": "Running.Ruhen", + "nextStep": "Running.Ruhen", "condition": { "type": "and", "conditions": [ @@ -196,7 +196,7 @@ "operations": [], "transitions": [ { - "next_step": "Running.Ruhen.Stop", + "nextStep": "Running.Ruhen.Stop", "condition": { "type": "time", "duration": 60 @@ -215,7 +215,7 @@ ], "transitions": [ { - "next_step": "Running.Aufheizen", + "nextStep": "Running.Aufheizen", "condition": { "type": "state", "pea": "React", @@ -247,7 +247,7 @@ ], "transitions": [ { - "next_step": "Running.Aufheizen.Stop", + "nextStep": "Running.Aufheizen.Stop", "condition": { "type": "variable", "pea": "Temper", @@ -274,7 +274,7 @@ ], "transitions": [ { - "next_step": "Shutdown.Entleeren.Start", + "nextStep": "Shutdown.Entleeren.Start", "condition": { "type": "and", "conditions": [ @@ -306,7 +306,7 @@ ], "transitions": [ { - "next_step": "Shutdown.Entleeren.Running", + "nextStep": "Shutdown.Entleeren.Running", "condition": { "type": "state", "pea": "Dose", @@ -328,7 +328,7 @@ ], "transitions": [ { - "next_step": "Shutdown.Entleeren.Stop", + "nextStep": "Shutdown.Entleeren.Stop", "condition": { "type": "state", "pea": "React", @@ -349,7 +349,7 @@ ], "transitions": [ { - "next_step": "finished", + "nextStep": "finished", "condition": { "type": "state", "pea": "Dose", diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.1.1.json b/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.1.1.json index 0a3808d1..de443b5a 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.1.1.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.1.1.json @@ -3,7 +3,7 @@ "name": "Rezept ACHEMA", "description": "Verbessertes Rezept zur ACHEMA 2018", "author": "Markus Graube", - "initial_step": "Startup.Init", + "initialStep": "Startup.Init", "steps": [ { "name": "Startup.Init", @@ -49,7 +49,7 @@ "service": "Tempering", "state": "execute" }, - "next_step": "Running.Vorlegen" + "nextStep": "Running.Vorlegen" } ] }, @@ -102,7 +102,7 @@ ], "transitions": [ { - "next_step": "Running.Reagieren", + "nextStep": "Running.Reagieren", "condition": { "type": "and", "conditions": [ @@ -178,7 +178,7 @@ ], "transitions": [ { - "next_step": "Running.Ruhen", + "nextStep": "Running.Ruhen", "condition": { "type": "and", "conditions": [ @@ -211,7 +211,7 @@ ], "transitions": [ { - "next_step": "Running.Ruhen.Stop", + "nextStep": "Running.Ruhen.Stop", "condition": { "type": "time", "duration": 20 @@ -230,7 +230,7 @@ ], "transitions": [ { - "next_step": "Running.Abkühlen", + "nextStep": "Running.Abkühlen", "condition": { "type": "state", "pea": "React", @@ -262,7 +262,7 @@ ], "transitions": [ { - "next_step": "Running.Abkühlen.Stop", + "nextStep": "Running.Abkühlen.Stop", "condition": { "type": "variable", "pea": "Temper", @@ -289,7 +289,7 @@ ], "transitions": [ { - "next_step": "Shutdown.Entleeren", + "nextStep": "Shutdown.Entleeren", "condition": { "type": "state", "pea": "React", @@ -311,7 +311,7 @@ ], "transitions": [ { - "next_step": "completed", + "nextStep": "completed", "condition": { "type": "state", "pea": "React", diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.2.0.json b/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.2.0.json index 08c996bc..62ecc28e 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.2.0.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_achema_v0.2.0.json @@ -3,7 +3,7 @@ "name": "Rezept ACHEMA", "description": "Verbessertes Rezept zur ACHEMA 2018", "author": "Markus Graube", - "initial_step": "Startup.Init", + "initialStep": "Startup.Init", "steps": [ { "name": "Startup.Init", @@ -49,7 +49,7 @@ "service": "Tempering", "state": "execute" }, - "next_step": "Running.Vorlegen" + "nextStep": "Running.Vorlegen" } ] }, @@ -102,7 +102,7 @@ ], "transitions": [ { - "next_step": "Running.Reagieren", + "nextStep": "Running.Reagieren", "condition": { "type": "and", "conditions": [ @@ -177,7 +177,7 @@ ], "transitions": [ { - "next_step": "Running.Ruhen", + "nextStep": "Running.Ruhen", "condition": { "type": "and", "conditions": [ @@ -210,7 +210,7 @@ ], "transitions": [ { - "next_step": "Running.Ruhen.Stop", + "nextStep": "Running.Ruhen.Stop", "condition": { "type": "time", "duration": 20 @@ -229,7 +229,7 @@ ], "transitions": [ { - "next_step": "Running.Abkühlen", + "nextStep": "Running.Abkühlen", "condition": { "type": "state", "pea": "React", @@ -260,7 +260,7 @@ ], "transitions": [ { - "next_step": "Running.Abkühlen.Stop", + "nextStep": "Running.Abkühlen.Stop", "condition": { "type": "variable", "pea": "Temper", @@ -287,7 +287,7 @@ ], "transitions": [ { - "next_step": "Shutdown.Entleeren", + "nextStep": "Shutdown.Entleeren", "condition": { "type": "state", "pea": "React", @@ -309,7 +309,7 @@ ], "transitions": [ { - "next_step": "completed", + "nextStep": "completed", "condition": { "type": "state", "pea": "React", diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_cif_test.json b/src/modularPlantManager/recipe/assets/recipes/recipe_cif_test.json index 24980ca4..8c216c16 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_cif_test.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_cif_test.json @@ -2,7 +2,7 @@ "version": "1.0.0", "name": "Testrezept für CIF Modul", "author": "Markus Graube", - "initial_step": "S1", + "initialStep": "S1", "steps": [ { "name": "S1", @@ -33,7 +33,7 @@ ], "transitions": [ { - "next_step": "S2", + "nextStep": "S2", "condition": { "type": "and", "conditions": [ @@ -63,7 +63,7 @@ ], "transitions": [ { - "next_step": "finished", + "nextStep": "finished", "condition": { "type": "state", "pea": "CIF", diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_dosierer_only.json b/src/modularPlantManager/recipe/assets/recipes/recipe_dosierer_only.json index aeaab886..2968e40d 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_dosierer_only.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_dosierer_only.json @@ -2,7 +2,7 @@ "version": "1.0.0", "name": "Simples Testrezept nur für Dosierer von PLT/SVT", "author": "Markus Graube", - "initial_step": "S1", + "initialStep": "S1", "steps": [ { "name": "S1", @@ -15,7 +15,7 @@ ], "transitions": [ { - "next_step": "S2", + "nextStep": "S2", "condition": { "type": "time", "duration": "5" @@ -34,7 +34,7 @@ ], "transitions": [ { - "next_step": "S3", + "nextStep": "S3", "condition": { "type": "state", "pea": "Dose", @@ -60,7 +60,7 @@ ], "transitions": [ { - "next_step": "S4", + "nextStep": "S4", "condition": { "type": "time", "duration": "5" @@ -79,7 +79,7 @@ ], "transitions": [ { - "next_step": "S5", + "nextStep": "S5", "condition": { "type": "state", "pea": "Dose", @@ -100,7 +100,7 @@ ], "transitions": [ { - "next_step": "finished", + "nextStep": "finished", "condition": { "type": "state", "pea": "Dose", diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_huber_only.json b/src/modularPlantManager/recipe/assets/recipes/recipe_huber_only.json index 0a5b278e..bfc562f1 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_huber_only.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_huber_only.json @@ -2,7 +2,7 @@ "version": "1.0.0", "name": "Simples Testrezept nur für Temperier-PEA von Huber", "author": "Markus Graube", - "initial_step": "S1", + "initialStep": "S1", "steps": [ { "name": "S1", @@ -22,7 +22,7 @@ ], "transitions": [ { - "next_step": "S2", + "nextStep": "S2", "condition": { "type": "time", "duration": "30" @@ -47,7 +47,7 @@ ], "transitions": [ { - "next_step": "S3", + "nextStep": "S3", "condition": { "type": "time", "duration": "30" @@ -77,7 +77,7 @@ ], "transitions": [ { - "next_step": "S4", + "nextStep": "S4", "condition": { "type": "time", "duration": 60 @@ -106,7 +106,7 @@ ], "transitions": [ { - "next_step": "S5", + "nextStep": "S5", "condition": { "type": "time", "duration": 60 @@ -125,7 +125,7 @@ ], "transitions": [ { - "next_step": "finished", + "nextStep": "finished", "condition": { "type": "state", "pea": "Temper", diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_reactor_only.json b/src/modularPlantManager/recipe/assets/recipes/recipe_reactor_only.json index d684b131..eb721cfd 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_reactor_only.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_reactor_only.json @@ -2,7 +2,7 @@ "version": "1.0.0", "name": "Simples Testrezept nur für Reaktor von Merck", "author": "Markus Graube", - "initial_step": "S1", + "initialStep": "S1", "steps": [ { "name": "S1", @@ -34,7 +34,7 @@ ], "transitions": [ { - "next_step": "S2", + "nextStep": "S2", "condition": { "type": "time", "duration": "10" @@ -59,7 +59,7 @@ ], "transitions": [ { - "next_step": "S3", + "nextStep": "S3", "condition": { "type": "state", "pea": "React", @@ -86,7 +86,7 @@ ], "transitions": [ { - "next_step": "finished", + "nextStep": "finished", "condition": { "type": "state", "pea": "React", diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_testserver_1.0.0.spec.json b/src/modularPlantManager/recipe/assets/recipes/recipe_testserver_1.0.0.spec.json index 5eee1b23..07adab5c 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_testserver_1.0.0.spec.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_testserver_1.0.0.spec.json @@ -2,14 +2,14 @@ "version": "1.0.0", "name": "Test recipe for testserver pea", "author": "Markus Graube", - "initial_step": "S0.CheckInitialConditions", + "initialStep": "S0.CheckInitialConditions", "steps": [ { "name": "S0.CheckInitialConditions", "operations": [], "transitions": [ { - "next_step": "S1", + "nextStep": "S1", "condition": { "type": "state", "pea": "ModuleTestServer", @@ -31,7 +31,7 @@ ], "transitions": [ { - "next_step": "S2", + "nextStep": "S2", "condition": { "type": "and", "conditions": [ @@ -61,7 +61,7 @@ ], "transitions": [ { - "next_step": "S3", + "nextStep": "S3", "condition": { "type": "state", "pea": "ModuleTestServer", @@ -82,7 +82,7 @@ ], "transitions": [ { - "next_step": "finished", + "nextStep": "finished", "condition": { "type": "state", "pea": "ModuleTestServer", diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_testserver_2services_1.0.0.spec.json b/src/modularPlantManager/recipe/assets/recipes/recipe_testserver_2services_1.0.0.spec.json index dbd74d5e..7db436ad 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_testserver_2services_1.0.0.spec.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_testserver_2services_1.0.0.spec.json @@ -2,7 +2,7 @@ "version": "1.0.0", "name": "Test recipe for testserver pea using two services", "author": "Markus Graube", - "initial_step": "S1", + "initialStep": "S1", "steps": [ { "name": "S1", @@ -15,7 +15,7 @@ ], "transitions": [ { - "next_step": "S2", + "nextStep": "S2", "condition": { "type": "state", "pea": "ModuleTestServer", @@ -41,7 +41,7 @@ ], "transitions": [ { - "next_step": "S3", + "nextStep": "S3", "condition": { "type": "and", "conditions": [ @@ -73,7 +73,7 @@ ], "transitions": [ { - "next_step": "S4", + "nextStep": "S4", "condition": { "type": "state", "pea": "ModuleTestServer", @@ -99,7 +99,7 @@ ], "transitions": [ { - "next_step": "S5", + "nextStep": "S5", "condition": { "type": "and", "conditions": [ @@ -136,7 +136,7 @@ ], "transitions": [ { - "next_step": "completed", + "nextStep": "completed", "condition": { "type": "and", "conditions": [ diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_time_local.spec.json b/src/modularPlantManager/recipe/assets/recipes/recipe_time_local.spec.json index 94f73c57..4f0ae425 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_time_local.spec.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_time_local.spec.json @@ -2,14 +2,14 @@ "version": "1.0.0", "name": "3 steps (0.2s, 0.3s, 0.2s) ohne Ansteuerung von Modulen", "author": "Markus Graube", - "initial_step": "S1", + "initialStep": "S1", "steps": [ { "name": "S1", "operations": [], "transitions": [ { - "next_step": "S2", + "nextStep": "S2", "condition": { "type": "time", "duration": 0.2 @@ -22,7 +22,7 @@ "operations": [], "transitions": [ { - "next_step": "S3", + "nextStep": "S3", "condition": { "type": "time", "duration": 0.3 @@ -35,7 +35,7 @@ "operations": [], "transitions": [ { - "next_step": "finished", + "nextStep": "finished", "condition": { "type": "time", "duration": 0.2 diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_slow.spec.json b/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_slow.spec.json index daf2b3ad..81d6b529 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_slow.spec.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_slow.spec.json @@ -2,14 +2,14 @@ "version": "1.0.0", "name": "3 steps slow (5s, 15s, 2s) without controlling physical PEAs", "author": "Markus Graube", - "initial_step": "S1", + "initialStep": "S1", "steps": [ { "name": "S1", "operations": [], "transitions": [ { - "next_step": "S2", + "nextStep": "S2", "condition": { "type": "time", "duration": 5 @@ -22,7 +22,7 @@ "operations": [], "transitions": [ { - "next_step": "S3", + "nextStep": "S3", "condition": { "type": "time", "duration": 15 @@ -35,7 +35,7 @@ "operations": [], "transitions": [ { - "next_step": "finished", + "nextStep": "finished", "condition": { "type": "time", "duration": 2 diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_very_slow.spec.json b/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_very_slow.spec.json index ae550017..33e9c145 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_very_slow.spec.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_very_slow.spec.json @@ -2,14 +2,14 @@ "version": "1.0.0", "name": "3 steps very slow (20s, 30s, 20s) ohne Ansteuerung von Modulen", "author": "Markus Graube", - "initial_step": "S1", + "initialStep": "S1", "steps": [ { "name": "S1", "operations": [], "transitions": [ { - "next_step": "S2", + "nextStep": "S2", "condition": { "type": "time", "duration": 20 @@ -22,7 +22,7 @@ "operations": [], "transitions": [ { - "next_step": "S3", + "nextStep": "S3", "condition": { "type": "time", "duration": 30 @@ -35,7 +35,7 @@ "operations": [], "transitions": [ { - "next_step": "finished", + "nextStep": "finished", "condition": { "type": "time", "duration": 20 diff --git a/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_wait_0.5s.spec.json b/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_wait_0.5s.spec.json index f3576c42..ce7be58d 100644 --- a/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_wait_0.5s.spec.json +++ b/src/modularPlantManager/recipe/assets/recipes/recipe_time_local_wait_0.5s.spec.json @@ -2,14 +2,14 @@ "version": "1.0.0", "name": "Wait 0.5s", "author": "Markus Graube", - "initial_step": "Wait", + "initialStep": "Wait", "steps": [ { "name": "Wait", "operations": [], "transitions": [ { - "next_step": "finished", + "nextStep": "finished", "condition": { "type": "time", "duration": 0.5 diff --git a/src/modularPlantManager/recipe/index.ts b/src/modularPlantManager/recipe/index.ts index e3878326..23fe1478 100644 --- a/src/modularPlantManager/recipe/index.ts +++ b/src/modularPlantManager/recipe/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './step/operation/Operation'; export * from './step/operation/Parameter'; export * from './Player'; diff --git a/src/modularPlantManager/recipe/step/Step.puml b/src/modularPlantManager/recipe/step/Step.puml index bf0fa79a..5344cc8c 100644 --- a/src/modularPlantManager/recipe/step/Step.puml +++ b/src/modularPlantManager/recipe/step/Step.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include transition/Transition.puml diff --git a/src/modularPlantManager/recipe/step/Step.spec.ts b/src/modularPlantManager/recipe/step/Step.spec.ts index f765451a..54d8d615 100644 --- a/src/modularPlantManager/recipe/step/Step.spec.ts +++ b/src/modularPlantManager/recipe/step/Step.spec.ts @@ -23,12 +23,8 @@ * SOFTWARE. */ -import {ConditionType, ServiceCommand} from '@p2olab/polaris-interface'; -import {PEAController} from '../../pea'; import {Step} from './Step'; - import {expect} from 'chai'; -import * as fs from 'fs'; import {MockupServer} from '../../_utils'; describe('Step', () => { diff --git a/src/modularPlantManager/recipe/step/operation/Operation.puml b/src/modularPlantManager/recipe/step/operation/Operation.puml index 1befe5cf..41e95535 100644 --- a/src/modularPlantManager/recipe/step/operation/Operation.puml +++ b/src/modularPlantManager/recipe/step/operation/Operation.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram !include Parameter.puml diff --git a/src/modularPlantManager/recipe/step/operation/Operation.spec.ts b/src/modularPlantManager/recipe/step/operation/Operation.spec.ts index c3d93758..57c3e308 100644 --- a/src/modularPlantManager/recipe/step/operation/Operation.spec.ts +++ b/src/modularPlantManager/recipe/step/operation/Operation.spec.ts @@ -23,6 +23,7 @@ * SOFTWARE. */ +/* eslint-disable */ import {OperationOptions, ServiceCommand} from '@p2olab/polaris-interface'; import {PEAController, Service} from '../../../pea'; import {Operation} from '../../index'; @@ -33,10 +34,13 @@ import * as fs from 'fs'; import {PEAMockup} from '../../../pea/PEA.mockup'; import {MockupServer} from '../../../_utils'; + chai.use(chaiAsPromised); const expect = chai.expect; +/* eslint-enable */ describe('Operation', () => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const delay = require('timeout-as-promise'); /* context('constructor', () => { diff --git a/src/modularPlantManager/recipe/step/operation/Operation.ts b/src/modularPlantManager/recipe/step/operation/Operation.ts index ab0900af..8f09dffb 100644 --- a/src/modularPlantManager/recipe/step/operation/Operation.ts +++ b/src/modularPlantManager/recipe/step/operation/Operation.ts @@ -25,7 +25,6 @@ import {OperationInterface, OperationOptions, ParameterOptions, ServiceCommand} from '@p2olab/polaris-interface'; import {BaseService, PEAController, Procedure, Service} from '../../../pea'; - import {EventEmitter} from 'events'; import {catOperation} from '../../../../logging'; @@ -111,9 +110,9 @@ export class Operation { this.state = 'completed'; this.emitter.emit('changed', 'completed'); this.emitter.removeAllListeners('changed'); - } catch (err) { + } catch (e) { numberOfTries++; - catOperation.debug(`Operation could not be executed due to error: : ${err.toString()}`); + catOperation.debug(`Operation could not be executed due to error: ${(e as Error).message}`); if (numberOfTries === Operation.MAX_RETRIES) { this.state = 'aborted'; this.emitter.emit('changed', 'aborted'); diff --git a/src/modularPlantManager/recipe/step/operation/Parameter.puml b/src/modularPlantManager/recipe/step/operation/Parameter.puml index 93e6f79c..0e2aaebe 100644 --- a/src/modularPlantManager/recipe/step/operation/Parameter.puml +++ b/src/modularPlantManager/recipe/step/operation/Parameter.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/modularPlantManager/recipe/step/operation/Parameter.spec.ts b/src/modularPlantManager/recipe/step/operation/Parameter.spec.ts index 37573088..001261d0 100644 --- a/src/modularPlantManager/recipe/step/operation/Parameter.spec.ts +++ b/src/modularPlantManager/recipe/step/operation/Parameter.spec.ts @@ -23,12 +23,14 @@ * SOFTWARE. */ +/* eslint-disable */ import {PEAController, Service} from '../../../pea'; import {Parameter} from '../../index'; import {expect} from 'chai'; import * as fs from 'fs'; import {MockupServer} from '../../../_utils'; +/* eslint-enable */ describe('Parameter', () => { /* @@ -140,7 +142,7 @@ describe('Parameter', () => { expect(param.getValue()).to.be.closeTo(1, 0.01); }); - it('should load with complex expression with dataAssembly variables', () => { + it('should load with complex expression with dataAssembly dataAssemblies', () => { const param = new Parameter({ name: 'Parameter001', value: '2 * PEATestServer.Variable001.V + peaTestServer.Variable002 + Variable\\.003' @@ -165,7 +167,7 @@ describe('Parameter', () => { expect(param.scopeArray[0].dataAssembly.name).to.equal('Variable001'); expect(param.scopeArray[0].dataAssembly.defaultReadDataItem?.value).to.equal(20); - //(mockupServer.variables[0] as PEATestNumericVariable).v = 10; + //(mockupServer.dataAssemblies[0] as PEATestNumericVariable).v = 10; await new Promise((resolve) => { param.listenToScopeArray().once('changed', () => resolve()); }); @@ -179,14 +181,14 @@ describe('Parameter', () => { }, [pea]); param.listenToScopeArray(); - //(peaTestServer.variables[0] as PEATestNumericVariable).v = 10; + //(peaTestServer.dataAssemblies[0] as PEATestNumericVariable).v = 10; await Promise.race([ new Promise((resolve) => param.eventEmitter.once('changed', resolve)), new Promise((resolve, reject) => setTimeout(reject, 1000, 'timeout')) ]); param.unlistenToScopeArray(); - //(peaTestServer.variables[0] as PEATestNumericVariable).v = 11; + //(peaTestServer.dataAssemblies[0] as PEATestNumericVariable).v = 11; await Promise.race([ new Promise((resolve, reject) => param.eventEmitter.once('changed', reject)), new Promise((resolve) => setTimeout(resolve, 1000)) diff --git a/src/modularPlantManager/recipe/step/operation/Parameter.ts b/src/modularPlantManager/recipe/step/operation/Parameter.ts index 5cfa7be0..1b300f6a 100644 --- a/src/modularPlantManager/recipe/step/operation/Parameter.ts +++ b/src/modularPlantManager/recipe/step/operation/Parameter.ts @@ -37,7 +37,7 @@ import {ScopeItem} from '../../ScopeItem'; const assign = require('assign-deep'); /** - * Static or Dynamic Parameter. Dynamic Parameters can depend on variables of the same or + * Static or Dynamic Parameter. Dynamic Parameters can depend on dataAssemblies of the same or * other PEAs. These can also be continuously updated (specified via continuous property) */ export class Parameter { @@ -48,7 +48,7 @@ export class Parameter { public readonly name: string; /** * Expression to be calculated and used as value. - * Can contain variables, which can be declared inside scopeArray or by using correct variable names + * Can contain dataAssemblies, which can be declared inside scopeArray or by using correct variable names * following this syntax "[pea].[processValue].[variable]". PEAController can be omitted if only one PEAController * is loaded. TestServerVariable can be omitted. Then "V" is used as variable. * "." in the name of PEAs or processVariables can be escaped with "\\." @@ -86,15 +86,15 @@ export class Parameter { // evaluate scopeArray this.scopeArray = (parameterOptions.scope || []) .map((item: ScopeOptions) => ScopeItem.extractFromScopeOptions(item, peas)); - // evaluate additional variables from expression + // evaluate additional dataAssemblies from expression try { const extraction = ScopeItem.extractFromExpressionString( this.value.toString(), peas, this.scopeArray.map((scope) => scope.name) ); this.expression = extraction.expression; this.scopeArray.push(...extraction.scopeItems); - } catch (err) { - throw new Error('Parsing error for Parameter ' + err.toString()); + } catch (e) { + throw new Error(`Parsing error for Parameter ${(e as Error).message}`); } this.logger.debug(`Scope array: ${this.scopeArray.map((s) => s.dataAssembly.name)}`); @@ -129,7 +129,7 @@ export class Parameter { * @returns number | boolean */ public getValue(): number | boolean { - // get current variables + // get current dataAssemblies const tasks = this.scopeArray.map((item) => item.getScopeValue()); const scope = assign(...tasks); diff --git a/src/modularPlantManager/recipe/step/transition/Transition.puml b/src/modularPlantManager/recipe/step/transition/Transition.puml index 1c64b879..3fdcf7ce 100644 --- a/src/modularPlantManager/recipe/step/transition/Transition.puml +++ b/src/modularPlantManager/recipe/step/transition/Transition.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/peaProvider/PEAOptionsParser/PEAOptionsParser.puml b/src/peaProvider/PEAOptionsParser/PEAOptionsParser.puml new file mode 100644 index 00000000..d6d806e3 --- /dev/null +++ b/src/peaProvider/PEAOptionsParser/PEAOptionsParser.puml @@ -0,0 +1,44 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml +'https://plantuml.com/class-diagram +!include ../../ModularPlantManager.puml +class PEAOptionsParser{ ++ {static} createPEAOptions(pimadIdentifier: string, manager: ModularPlantManager): Promise +- {static} createOptionsArrays(peaModel: PEAModel): PEAOptionsParserInterface +- {static} createDataAssemblyOptionsArray(dataAssemblyModels: DataAssemblyModel[]): DataAssemblyOptions[] +- {static} createServiceOptionsArray(serviceModels: ServiceModel[]): ServiceOptions[] +- {static} createProcedureOptionsArray(procedureModels: ProcedureModel[]): ProcedureOptions[] +- {static} createDataAssemblyOptions(dataAssemblyModel: DataAssemblyModel): DataAssemblyOptions +} +interface PEAModel +interface PEAOptions + +ModularPlantManager <..> PEAOptionsParser: <> + +PEAOptionsParser ..>PEAModel : <> +PEAOptionsParser ..>PEAOptions : <> +@enduml diff --git a/src/peaProvider/PEAOptionsParser/PEAOptionsParser.spec.json b/src/peaProvider/PEAOptionsParser/PEAOptionsParser.spec.json new file mode 100644 index 00000000..3a6928ba --- /dev/null +++ b/src/peaProvider/PEAOptionsParser/PEAOptionsParser.spec.json @@ -0,0 +1,18645 @@ +{ + "dataAssemblies": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Variable2", + "defaultValue": "Variable2", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "SimulatedNumericVar", + "defaultValue": "SimulatedNumericVar", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Variable2.WQC" + } + }, + "dataSourceIdentifier": "9ba9df50-36fd-46bd-bff4-cb74b16e65b9", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Variable2.V" + } + }, + "dataSourceIdentifier": "4dec0370-8786-4564-9b5c-cd4133eb3a3a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Variable2.VSclMin" + } + }, + "dataSourceIdentifier": "670c5518-d802-4dd5-8aa9-6c20c9c16ebd", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Variable2.VSclMax" + } + }, + "dataSourceIdentifier": "28c7cc38-c98c-440c-a644-b7c86daa3a7a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Variable2.VUnit" + } + }, + "dataSourceIdentifier": "991d4055-f6c9-4397-bd8a-f2489439f07a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "dataSourceIdentifier": "b11d75a2-52de-42fd-8117-0c650057125f", + "description": "inline TODO above", + "name": "Variable2", + "initialized": true, + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "pimadIdentifier": "9a19b022-f9f6-4945-b5c2-7c4302057c71", + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + }, + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Variable1", + "defaultValue": "Variable1", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "SimulatedNumericVar", + "defaultValue": "SimulatedNumericVar", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Variable1.WQC" + } + }, + "dataSourceIdentifier": "d2d598b4-04a9-4fcc-8113-bc4fbbc8b25b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Variable1.V" + } + }, + "dataSourceIdentifier": "a93b391b-e1e8-462f-b128-f7c0ada74ff8", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "15", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Variable1.VSclMin" + } + }, + "dataSourceIdentifier": "b64badf8-f705-4dad-b3c5-f7d1a354fabd", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Variable1.VSclMax" + } + }, + "dataSourceIdentifier": "885f34b9-d398-462b-95f0-20f3bac30e05", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "30", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Variable1.VUnit" + } + }, + "dataSourceIdentifier": "c501e12e-9502-4d14-b8b5-b2fc44f765bc", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "1038", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "dataSourceIdentifier": "2052a502-2437-4f18-964b-56f81375a953", + "description": "inline TODO above", + "name": "Variable1", + "initialized": true, + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "pimadIdentifier": "2b3115ec-babb-4c08-857b-d9f65a2f28eb", + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + } + ], + "dataModel": "MTPSUCLib/ModuleTypePackage", + "dataModelVersion": { + "major": -1, + "minor": -1, + "patch": -1, + "initialized": false + }, + "feas": [], + "name": "Calculator", + "endpoint": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "Endpoint", + "value": "opc.tcp://localhost:4334", + "defaultValue": "opc.tcp://localhost:4334", + "description": "Endpoint URL of the server - like 'opc.tcp://192.186.2.1:5555", + "pimadIdentifier": "TODO" + } + ], + "pimadIdentifier": "69b270f8-b826-49e7-8682-a25b5a5a0a57", + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "services": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "attributes": [], + "dataAssembly": { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Integral2", + "defaultValue": "Integral2", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Service for math operation Integral", + "defaultValue": "Service for math operation Integral", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.StateChannel" + } + }, + "dataSourceIdentifier": "36859cce-040c-4015-8488-44d3a70504e0", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Operation Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.StateOffAut" + } + }, + "dataSourceIdentifier": "237a1f2f-bd71-43ce-a6b4-465dee937190", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.StateOpAut" + } + }, + "dataSourceIdentifier": "5dc952fa-b89d-499a-b82b-35aa451c39da", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.StateAutAut" + } + }, + "dataSourceIdentifier": "0d243fcb-9c04-4749-8158-cfeafe724f20", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.StateOffOp" + } + }, + "dataSourceIdentifier": "28a2bffa-2f35-49c1-b30d-355fac54d399", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.StateOpOp" + } + }, + "dataSourceIdentifier": "340b3715-56c3-46fc-9d88-8c07cccf5dac", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.StateAutOp" + } + }, + "dataSourceIdentifier": "96cee496-4f2c-4758-a226-1ce7aa98cb9d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.StateOpAct" + } + }, + "dataSourceIdentifier": "61eba7a4-87df-400a-9267-7ad6c6bcbf40", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Operator Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.StateAutAct" + } + }, + "dataSourceIdentifier": "8450c317-f6f6-4947-92b3-74e3fe4f041b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Automatic Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.StateOffAct" + } + }, + "dataSourceIdentifier": "a5040ee6-0ef4-4078-9b66-c0bf871e19e4", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Offline Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.SrcChannel" + } + }, + "dataSourceIdentifier": "a8ac2d14-a2c5-4780-8936-f00065f3a1fe", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Service Source Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.SrcExtAut" + } + }, + "dataSourceIdentifier": "5d512761-2d90-4298-b1f1-cbb4492f07db", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.SrcIntAut" + } + }, + "dataSourceIdentifier": "1f687f54-15fc-4803-9a1d-1081c45a86ea", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Internal by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.SrcIntOp" + } + }, + "dataSourceIdentifier": "3b5851b0-1c48-4438-93f4-3c2ec87af62a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Intern by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.SrcExtOp" + } + }, + "dataSourceIdentifier": "7ecfcbf3-4b55-46d3-b974-ea8ccac4abb3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.SrcExtAct" + } + }, + "dataSourceIdentifier": "3a56b20b-f1d8-44dc-9d9d-2783a134787f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "External Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.SrcIntAct" + } + }, + "dataSourceIdentifier": "7c3fbc55-de1a-4d45-99ab-a935166cc09e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Internal Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "OSLevel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.OSLevel" + } + }, + "dataSourceIdentifier": "b45bdbf4-084e-49fc-9bb9-76f110387348", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.WQC" + } + }, + "dataSourceIdentifier": "734b907b-4679-49b6-b01b-122bff5884f0", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.CommandOp" + } + }, + "dataSourceIdentifier": "bb052761-8d8e-433c-805a-8659b01a9c81", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Command Input for Operator", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.CommandInt" + } + }, + "dataSourceIdentifier": "2552f157-012a-4a4c-924c-a73444ff9b63", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Command Input for Automatic-Intern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.CommandExt" + } + }, + "dataSourceIdentifier": "52df1427-cbdb-42d7-a612-3f6dd4f5f7d3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Command Input for Automatic-Extern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.ProcedureOp" + } + }, + "dataSourceIdentifier": "f4b14fa4-62f1-4aba-8b63-ff1fe362ae80", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Procedure Input for Operator", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.ProcedureInt" + } + }, + "dataSourceIdentifier": "234f26f2-590c-4921-8acc-1470e28cc552", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Procedure Input for Automatic-Intern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.ProcedureExt" + } + }, + "dataSourceIdentifier": "6aaab343-b813-46d1-a349-f6a0a38c4495", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Procedure Input for Automatic-Extern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandEn", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.CommandEn" + } + }, + "dataSourceIdentifier": "59a605ff-0e60-4456-acaa-8559100cb8aa", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Transition Clearance from the Current State", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateCur", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.StateCur" + } + }, + "dataSourceIdentifier": "5b3edc0f-21ce-4423-8688-06f68a1b439d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Current State", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureCur", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.ProcedureCur" + } + }, + "dataSourceIdentifier": "7b2b2c77-5ee6-4f8d-9fa5-b21a8d5c0d3f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Current Procedure", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureReq", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.ProcedureReq" + } + }, + "dataSourceIdentifier": "73b9a6b4-1744-42b5-8bbb-ce52657162b7", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Requested Procedure", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "InteractQuestionID", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.InteractQuestionID" + } + }, + "dataSourceIdentifier": "87c09c1c-96f5-4ea2-bcc7-ef238a3dd23f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Operator Request Question ID", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "InteractAnswerID", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.InteractAnswerID" + } + }, + "dataSourceIdentifier": "27a6830b-9bc4-4cce-88a5-4ab6443e417b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Operator Request Answer ID", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "PosTextID", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.PosTextID" + } + }, + "dataSourceIdentifier": "808d4969-c6ef-4efd-a5c9-7d325f88f89d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Service Information Text ID", + "pimadIdentifier": "TODO" + } + ], + "dataSourceIdentifier": "6e2f7e66-f7af-4642-b5c3-ad4975859e6b", + "description": "inline TODO above", + "name": "Integral2", + "initialized": true, + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/ServiceControl", + "pimadIdentifier": "e66e2191-e484-4685-a03d-907d0b04d902", + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + }, + "metaModelRef": "MTPServiceSUCLib/Service", + "name": "Integral2", + "parameters": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaConfParam_Integral2_updateRate", + "defaultValue": "AnaConfParam_Integral2_updateRate", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "UpdateRate during execute", + "defaultValue": "UpdateRate during execute", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "OSLevel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.OSLevel" + } + }, + "dataSourceIdentifier": "f1cf1618-80a5-4f93-857c-e5849c315fd0", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.WQC" + } + }, + "dataSourceIdentifier": "b20064e7-e880-439b-89fd-59af0b91acd2", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "WQC", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.StateChannel" + } + }, + "dataSourceIdentifier": "58eeee2f-9f6b-4f56-9094-7c23e7d2a769", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Operation Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.StateOffAut" + } + }, + "dataSourceIdentifier": "7dd14497-92ee-4915-abaa-3b703aaeb35c", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.StateOpAut" + } + }, + "dataSourceIdentifier": "b6ba32ad-3371-4f56-8333-b3725882660f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.StateAutAut" + } + }, + "dataSourceIdentifier": "538d53c8-d710-472f-98dd-57823d3613b7", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.StateOffOp" + } + }, + "dataSourceIdentifier": "858695f3-c455-4fa7-aedb-f6ff3114d343", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.StateOpOp" + } + }, + "dataSourceIdentifier": "a531beae-58c0-47f3-987d-4e69eb1d0ca9", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.StateAutOp" + } + }, + "dataSourceIdentifier": "2a314b13-cde1-4f9a-a3d2-3df654518a68", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.StateOpAct" + } + }, + "dataSourceIdentifier": "c02b53c6-165a-4f2a-854a-dd0d30eb3e12", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Operator Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.StateAutAct" + } + }, + "dataSourceIdentifier": "7119cdea-1fb1-4918-9010-1410eb9d229b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Automatic Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.StateOffAct" + } + }, + "dataSourceIdentifier": "10c22f29-f4d3-4adb-b1ca-a744fd805ca1", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Offline Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.SrcChannel" + } + }, + "dataSourceIdentifier": "fa119c58-4622-4fe2-978e-71ae1ebd6485", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Service Source Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.SrcExtAut" + } + }, + "dataSourceIdentifier": "1fcbfd06-ebf6-4bda-9a93-3fb80b16c725", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.SrcIntAut" + } + }, + "dataSourceIdentifier": "f0c72a03-03f7-4e82-8489-fdd2fad1d5ed", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Internal by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.SrcIntOp" + } + }, + "dataSourceIdentifier": "57f7da79-4cf2-4be3-990e-ffa5abc5d467", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Intern by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.SrcExtOp" + } + }, + "dataSourceIdentifier": "7551cfe7-8a69-4600-b1e2-7b18dc43b976", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.SrcExtAct" + } + }, + "dataSourceIdentifier": "3d747cba-747f-4f51-a7ff-fcf6b7261c14", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "External Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.SrcIntAct" + } + }, + "dataSourceIdentifier": "8a47c591-1107-4883-addf-73e33c4ab12e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Internal Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.VExt" + } + }, + "dataSourceIdentifier": "5d896635-763d-48e4-b33f-bf913ae0513f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Extern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.VOp" + } + }, + "dataSourceIdentifier": "5a85c4e4-6806-412b-962e-abfd6aca7d10", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Manual Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.VInt" + } + }, + "dataSourceIdentifier": "3530d1a9-393f-45af-921e-320a72b7c7a2", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Intern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VReq", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.VReq" + } + }, + "dataSourceIdentifier": "66566b61-69c9-4bab-803e-c4a17f517862", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Request Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VFbk", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.VFbk" + } + }, + "dataSourceIdentifier": "5674bafe-adf6-42e9-a07f-d8905106da1a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Feedback Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.VOut" + } + }, + "dataSourceIdentifier": "f5337387-967d-470c-bad7-b331314b9edd", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Output Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.VSclMin" + } + }, + "dataSourceIdentifier": "f888ab0a-76f7-423b-a1e7-7871abb91101", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.VSclMax" + } + }, + "dataSourceIdentifier": "9136a9a2-9660-4d2e-9b30-b953390c7be1", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.VMin" + } + }, + "dataSourceIdentifier": "ad83d8e3-a0b6-4061-aac3-2508ad085913", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.VMax" + } + }, + "dataSourceIdentifier": "dcc442da-b0d9-450d-9442-3abf4fc3cf18", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.VUnit" + } + }, + "dataSourceIdentifier": "b45fad2e-cf27-4818-964f-d4fd24a84d7e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "Sync", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaConfParam_Integral2_updateRate.Sync" + } + }, + "dataSourceIdentifier": "d386af0f-6d1a-4e44-9404-af9cf5e19e27", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Synchronization Mode", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaServParam", + "name": "AnaConfParam_Integral2_updateRate", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "reportValues": [], + "processValuesIn": [], + "processValuesOut": [], + "procedures": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "attributes": [ + { + "dataType": "xs:boolean", + "name": "IsSelfCompleting", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "value": "false" + }, + { + "dataType": "xs:unsignedLong", + "name": "ProcedureID", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "value": "1" + }, + { + "dataType": "xs:boolean", + "name": "IsDefault", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "value": "true" + } + ], + "dataAssembly": { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Integral2_default", + "defaultValue": "Integral2_default", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Default Procedure of Integral2", + "defaultValue": "Default Procedure of Integral2", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.Integral2_default.WQC" + } + }, + "dataSourceIdentifier": "003f2f4a-4e8e-4327-9542-56b275ffa6e7", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + } + ], + "dataSourceIdentifier": "4fa9c4ab-0817-4156-b3ff-fa08038548bf", + "description": "inline TODO above", + "name": "Integral2_default", + "initialized": true, + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/HealthStateView", + "pimadIdentifier": "57661ed8-3dc3-449f-bdba-c7935f72a9bd", + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + }, + "metaModelRef": "MTPServiceSUCLib/ServiceProcedure", + "name": "Integral2_default", + "parameters": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaProcParam_Integral2_factor", + "defaultValue": "AnaProcParam_Integral2_factor", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Factor for scaling", + "defaultValue": "Factor for scaling", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "OSLevel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.OSLevel" + } + }, + "dataSourceIdentifier": "419459ca-cf87-43e2-8f8d-c32393f529f6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.WQC" + } + }, + "dataSourceIdentifier": "e5fcdbc2-9e82-47e5-bfc9-6ba1cf1f8c3a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.StateChannel" + } + }, + "dataSourceIdentifier": "723cf814-9b3a-49dd-bc94-a5c7aa1d49de", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Operation Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.StateOffAut" + } + }, + "dataSourceIdentifier": "04196e7a-ca95-4dbf-add2-9870ff5edb9c", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.StateOpAut" + } + }, + "dataSourceIdentifier": "4f421daa-aadc-4fec-9408-f33213521b0b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.StateAutAut" + } + }, + "dataSourceIdentifier": "c22f0041-6671-48e4-bd41-69deeac89c75", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.StateOffOp" + } + }, + "dataSourceIdentifier": "e8cad0c4-f958-4dfa-a942-bac2778958bb", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.StateOpOp" + } + }, + "dataSourceIdentifier": "d2f94f5c-5393-4886-b878-b0c16d74f714", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.StateAutOp" + } + }, + "dataSourceIdentifier": "87f6fb09-2dd1-4434-bd36-6920cbf61725", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.StateOpAct" + } + }, + "dataSourceIdentifier": "537c35ed-b12f-4aba-9cb4-3385591dd365", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Operator Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.StateAutAct" + } + }, + "dataSourceIdentifier": "b0e453e9-e4c9-422b-a331-c006747bf9f6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Automatic Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.StateOffAct" + } + }, + "dataSourceIdentifier": "e2472195-f6c6-4a84-86ad-f6f53008cc40", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Offline Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.SrcChannel" + } + }, + "dataSourceIdentifier": "94944c30-4df2-4710-8137-24f216ec19fc", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Service Source Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.SrcExtAut" + } + }, + "dataSourceIdentifier": "2aaa7694-85eb-4ff1-9884-f8539ca488e6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.SrcIntAut" + } + }, + "dataSourceIdentifier": "96f2996d-71b0-4a8c-94e1-4b99bbaac9bb", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Internal by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.SrcIntOp" + } + }, + "dataSourceIdentifier": "248d589d-07dd-4be8-8a80-4f55a635cb28", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Intern by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.SrcExtOp" + } + }, + "dataSourceIdentifier": "efecf20f-ef31-47ee-9be0-ca0ad7a39676", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.SrcExtAct" + } + }, + "dataSourceIdentifier": "dea522f1-b4d5-4b9e-af3d-ed8c4a54f7fa", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "External Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.SrcIntAct" + } + }, + "dataSourceIdentifier": "c2898154-84ef-4ad6-85e7-15263bee5d20", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Internal Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.VExt" + } + }, + "dataSourceIdentifier": "a817a683-9d0f-457d-a084-c6dd6be5c28f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Extern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.VOp" + } + }, + "dataSourceIdentifier": "a334f67b-671c-45ab-ac15-33b2000876fa", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Manual Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.VInt" + } + }, + "dataSourceIdentifier": "33cc2e3f-4e38-433b-afac-b6a1af6e125d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Intern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VReq", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.VReq" + } + }, + "dataSourceIdentifier": "fa14d23c-7ad2-4f99-a78b-d56d71e74610", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Request Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VFbk", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.VFbk" + } + }, + "dataSourceIdentifier": "24bba4e8-0d9d-4d1b-8860-2ac1a3569c21", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Feedback Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.VOut" + } + }, + "dataSourceIdentifier": "bc25438c-6415-4d0e-b8a5-c8e3bb3c9381", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Output Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.VSclMin" + } + }, + "dataSourceIdentifier": "b33b0479-4065-4f8a-8ec2-f9dc23f98a48", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.VSclMax" + } + }, + "dataSourceIdentifier": "bd229f9b-8c1d-4312-abca-49712440253d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.VMin" + } + }, + "dataSourceIdentifier": "abc33835-fb88-43e7-aa29-5af6dd0ca046", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.VMax" + } + }, + "dataSourceIdentifier": "13d8606c-f39b-4546-a8c2-122e4528dc1a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.VUnit" + } + }, + "dataSourceIdentifier": "70b58588-c434-4f1a-af73-21cb1e694b1d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "Sync", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_factor.Sync" + } + }, + "dataSourceIdentifier": "2c53068a-56ed-4ae3-9dcf-82b66b87168a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Synchronization Mode", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaServParam", + "name": "AnaProcParam_Integral2_factor", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaProcParam_Integral2_offset", + "defaultValue": "AnaProcParam_Integral2_offset", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Offset for scaling", + "defaultValue": "Offset for scaling", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "OSLevel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.OSLevel" + } + }, + "dataSourceIdentifier": "44bf7aa0-7cd0-4aee-b1cb-ede6b2550a2c", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral2_offset.WQC" + } + }, + "dataSourceIdentifier": "3c988bc3-3d4a-4438-a689-700e19c801df", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "WQC", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.StateChannel" + } + }, + "dataSourceIdentifier": "09ebd2ab-9d7b-40e2-9f79-d5b02bf7372c", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Operation Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.StateOffAut" + } + }, + "dataSourceIdentifier": "0171dc75-5537-449f-9874-dd64deb20a41", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.StateOpAut" + } + }, + "dataSourceIdentifier": "17508edf-b390-47de-9531-1ad6a2aff59b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.StateAutAut" + } + }, + "dataSourceIdentifier": "f1ca391b-d5ec-4460-acc2-43c255b5efaa", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.StateOffOp" + } + }, + "dataSourceIdentifier": "d6db3aa9-500d-40d6-86e2-87dcb8f30cae", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.StateOpOp" + } + }, + "dataSourceIdentifier": "0655399a-768b-4af7-9cb6-7370413e9dbf", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.StateAutOp" + } + }, + "dataSourceIdentifier": "5ea80b8e-39fa-4cb7-a858-6890c5c1fce0", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.StateOpAct" + } + }, + "dataSourceIdentifier": "0f2e0551-825c-4889-be8b-235a4c475727", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Operator Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.StateAutAct" + } + }, + "dataSourceIdentifier": "27e69bda-0cb7-4515-a026-59558fad598e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Automatic Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.StateOffAct" + } + }, + "dataSourceIdentifier": "a7f8c767-ed0b-49cd-aee3-16a81f7b63b3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Offline Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.SrcChannel" + } + }, + "dataSourceIdentifier": "91d45ff2-d92e-46fd-aa14-1dc3009da62d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Service Source Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.SrcExtAut" + } + }, + "dataSourceIdentifier": "b54267d0-2b9c-41a2-bb27-c9d29cc3a6ea", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.SrcIntAut" + } + }, + "dataSourceIdentifier": "c7bc0379-5054-4c87-8dc9-c2a5c385b438", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Internal by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.SrcIntOp" + } + }, + "dataSourceIdentifier": "41315b53-b410-4b5c-82aa-56f9557bdd41", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Intern by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.SrcExtOp" + } + }, + "dataSourceIdentifier": "274afa69-4024-40e0-80cc-61ced280756b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.SrcExtAct" + } + }, + "dataSourceIdentifier": "3b9f42f1-0118-44b7-99f8-a129cd7c3d86", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "External Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.SrcIntAct" + } + }, + "dataSourceIdentifier": "e27fc5a3-55fd-4160-8cd8-d6512aabb939", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Internal Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.VExt" + } + }, + "dataSourceIdentifier": "9e22c5fe-9511-45f5-aee6-f7ea89731c28", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Extern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.VOp" + } + }, + "dataSourceIdentifier": "cebe0a8e-03c6-4af0-96bd-8fe72096377e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Manual Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.VInt" + } + }, + "dataSourceIdentifier": "49352186-ed2f-4426-b2ac-dc300bcd99c0", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Intern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VReq", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.VReq" + } + }, + "dataSourceIdentifier": "c2b211c4-1048-43ee-adf9-ddfe7190daf5", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Request Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VFbk", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.VFbk" + } + }, + "dataSourceIdentifier": "14ddfb51-776f-40d1-b97f-cc0e9f28f126", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Feedback Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.VOut" + } + }, + "dataSourceIdentifier": "edd85074-4b26-47a5-a616-1ebf3ecc0eaa", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Output Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.VSclMin" + } + }, + "dataSourceIdentifier": "8d581659-70c1-425a-964d-7261cf24b576", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.VSclMax" + } + }, + "dataSourceIdentifier": "1d107ec6-279a-41fc-aa0b-0b3bf3810b46", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.VMin" + } + }, + "dataSourceIdentifier": "59932c84-6a29-4d8c-9c3b-2fe360791b0a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.VMax" + } + }, + "dataSourceIdentifier": "17908b55-ffc2-4171-9ee0-876771ce9977", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.VUnit" + } + }, + "dataSourceIdentifier": "29e455a3-f01f-4211-ab39-7e8f82b4557a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "Sync", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral2_offset.Sync" + } + }, + "dataSourceIdentifier": "a809100f-4e9b-4b5d-afbc-bac6d706a80c", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Synchronization Mode", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaServParam", + "name": "AnaProcParam_Integral2_offset", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "reportValues": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaReportValue_Integral2_rvTime", + "defaultValue": "AnaReportValue_Integral2_rvTime", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Final integration time", + "defaultValue": "Final integration time", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvTime.WQC" + } + }, + "dataSourceIdentifier": "dff7c3c0-41b6-4b07-9216-7f83989fc9bb", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "Text", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvTime.Text" + } + }, + "dataSourceIdentifier": "36a4f4ca-b103-4147-b383-75108dc0c143", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/StringView", + "name": "AnaReportValue_Integral2_rvTime", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaReportValue_Integral2_rvOutScaled", + "defaultValue": "AnaReportValue_Integral2_rvOutScaled", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Final scaled value out", + "defaultValue": "Final scaled value out", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvOutScaled.WQC" + } + }, + "dataSourceIdentifier": "3d3f955e-a245-460c-af83-50f913cdc873", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvOutScaled.V" + } + }, + "dataSourceIdentifier": "a338e730-e168-4ad8-be3a-68204a88baec", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvOutScaled.VSclMin" + } + }, + "dataSourceIdentifier": "832a4e5c-1863-4013-861e-4df53da5ed28", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvOutScaled.VSclMax" + } + }, + "dataSourceIdentifier": "1d4e0484-7a64-4be9-8020-d65e073b6188", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvOutScaled.VUnit" + } + }, + "dataSourceIdentifier": "6c2069c8-8d92-44e0-815c-ebf39d3faf1b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "name": "AnaReportValue_Integral2_rvOutScaled", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaReportValue_Integral2_rvOutIntegral", + "defaultValue": "AnaReportValue_Integral2_rvOutIntegral", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Final integral value out", + "defaultValue": "Final integral value out", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvOutIntegral.WQC" + } + }, + "dataSourceIdentifier": "020acbfd-b72e-4aad-8595-8f77bc8e7f30", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvOutIntegral.V" + } + }, + "dataSourceIdentifier": "296c6341-365c-4482-858b-6c21fd9d2ea6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvOutIntegral.VSclMin" + } + }, + "dataSourceIdentifier": "da8b7608-3ee8-4aef-b87d-89652b71f98a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvOutIntegral.VSclMax" + } + }, + "dataSourceIdentifier": "e3703f7b-c628-4891-9d66-d010fa46cbdc", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaReportValue_Integral2_rvOutIntegral.VUnit" + } + }, + "dataSourceIdentifier": "41783124-ac62-43dc-86db-2beeddaf2700", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "name": "AnaReportValue_Integral2_rvOutIntegral", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "processValuesIn": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaProcessValueIn_Integral2_pv", + "defaultValue": "AnaProcessValueIn_Integral2_pv", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Analog Process Value Input", + "defaultValue": "Analog Process Value Input", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueIn_Integral2_pv.WQC" + } + }, + "dataSourceIdentifier": "f8b81ba9-48ad-4756-aa75-013d8aef2a6a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueIn_Integral2_pv.VExt" + } + }, + "dataSourceIdentifier": "71c8e066-47cc-4b6b-8ae3-59858a3ca8d6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Extern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueIn_Integral2_pv.VSclMin" + } + }, + "dataSourceIdentifier": "a2161285-d243-4b6a-9cd6-e147f788a8ec", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueIn_Integral2_pv.VSclMax" + } + }, + "dataSourceIdentifier": "ccde48e2-05b6-48a3-9ab0-00d62baa641c", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "10", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueIn_Integral2_pv.VUnit" + } + }, + "dataSourceIdentifier": "4e613dcd-8b59-4dd1-af10-0dbe7ca4718d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "1353", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/InputElement/AnaProcessValueIn", + "name": "AnaProcessValueIn_Integral2_pv", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "processValuesOut": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaProcessValueOut_Integral2_pvOutIntegral", + "defaultValue": "AnaProcessValueOut_Integral2_pvOutIntegral", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Integral of pv", + "defaultValue": "Integral of pv", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueOut_Integral2_pvOutIntegral.WQC" + } + }, + "dataSourceIdentifier": "5b67098e-9195-4385-a1b2-713f5e566eaf", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueOut_Integral2_pvOutIntegral.V" + } + }, + "dataSourceIdentifier": "5889e4c9-4ff4-443d-af80-8c872d745d74", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueOut_Integral2_pvOutIntegral.VSclMin" + } + }, + "dataSourceIdentifier": "7c7a8463-cd66-4090-a12d-163cb2702a83", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueOut_Integral2_pvOutIntegral.VSclMax" + } + }, + "dataSourceIdentifier": "ea5db5c7-9d0d-450e-b86c-9051553c537f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueOut_Integral2_pvOutIntegral.VUnit" + } + }, + "dataSourceIdentifier": "0d390f30-2d24-4bab-985c-004419d861d0", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "name": "AnaProcessValueOut_Integral2_pvOutIntegral", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaProcessValueOut_Integral2_pvOutScaled", + "defaultValue": "AnaProcessValueOut_Integral2_pvOutScaled", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "scaled value of pv", + "defaultValue": "scaled value of pv", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueOut_Integral2_pvOutScaled.WQC" + } + }, + "dataSourceIdentifier": "5dfdf0af-ebb3-490c-a9c6-ae09a8542814", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueOut_Integral2_pvOutScaled.V" + } + }, + "dataSourceIdentifier": "76377315-ef78-470d-9f80-107aa0d1acb5", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueOut_Integral2_pvOutScaled.VSclMin" + } + }, + "dataSourceIdentifier": "bc7efe4b-17df-4130-8229-c6af703dd420", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueOut_Integral2_pvOutScaled.VSclMax" + } + }, + "dataSourceIdentifier": "b7e5fdfc-709a-4891-bf7c-d20ff8d5fd34", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcessValueOut_Integral2_pvOutScaled.VUnit" + } + }, + "dataSourceIdentifier": "3dd554a5-b73e-491b-98be-af1323d0bf3d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "name": "AnaProcessValueOut_Integral2_pvOutScaled", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "dataSourceIdentifier": "178bef2d-160a-4d5b-abb5-bba03a4474d0", + "pimadIdentifier": "TODO" + } + ], + "dataSourceIdentifier": "820f9268-c2cb-4535-bcbf-6cf9f3253748", + "pimadIdentifier": "a36a672a-57ac-4782-acc5-5daf1e56342e" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "attributes": [], + "dataAssembly": { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Trigonometry", + "defaultValue": "Trigonometry", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Service for math operation Integral", + "defaultValue": "Service for math operation Integral", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.StateChannel" + } + }, + "dataSourceIdentifier": "6ac10825-7aba-4786-8298-f03ef101d314", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Operation Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.StateOffAut" + } + }, + "dataSourceIdentifier": "6b9b0fee-9d7f-42aa-9507-e8ed014ddf3f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.StateOpAut" + } + }, + "dataSourceIdentifier": "963f2f22-5019-4dae-a567-7e1df8475cf2", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.StateAutAut" + } + }, + "dataSourceIdentifier": "729aceef-3f07-4504-a2b3-84212f57a099", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.StateOffOp" + } + }, + "dataSourceIdentifier": "e1b1b876-8697-47f3-aec6-f8a9e2daf9cf", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.StateOpOp" + } + }, + "dataSourceIdentifier": "77e1550c-c8e3-4d9e-a349-89ddac272f8b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.StateAutOp" + } + }, + "dataSourceIdentifier": "333bc326-21a1-4ca1-a30c-b43e6c2e4991", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.StateOpAct" + } + }, + "dataSourceIdentifier": "6e2c2e95-1cf5-4a9c-bd34-932560ef7edc", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Operator Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.StateAutAct" + } + }, + "dataSourceIdentifier": "4d923aea-c199-4b3d-a9e3-061057ecb63a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Automatic Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.StateOffAct" + } + }, + "dataSourceIdentifier": "179a7aa8-bd4c-45f3-8465-7ea3a672a5d7", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Offline Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.SrcChannel" + } + }, + "dataSourceIdentifier": "335d1428-c9a8-4e2a-bddf-3008774eae21", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Service Source Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.SrcExtAut" + } + }, + "dataSourceIdentifier": "7a4ecba9-0a5d-4256-8f64-91f786960ba0", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.SrcIntAut" + } + }, + "dataSourceIdentifier": "90b6d4eb-54b1-406a-8bfa-d7162dd9b8d3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Internal by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.SrcIntOp" + } + }, + "dataSourceIdentifier": "cbc7ea94-0d84-40c3-bd58-72401f00b971", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Intern by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.SrcExtOp" + } + }, + "dataSourceIdentifier": "c25e4c17-a13c-4373-a561-9964ac7324dd", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.SrcExtAct" + } + }, + "dataSourceIdentifier": "2209ac24-065d-4e3c-b1ff-9ee64003289a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "External Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.SrcIntAct" + } + }, + "dataSourceIdentifier": "843d52c2-72cc-4374-9738-03eee1d60f59", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Internal Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "OSLevel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.OSLevel" + } + }, + "dataSourceIdentifier": "c55af549-7386-48a1-bd6f-dc0fca4064d8", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.WQC" + } + }, + "dataSourceIdentifier": "c6339f15-a556-4d56-992c-4b4e2b06b750", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.CommandOp" + } + }, + "dataSourceIdentifier": "b21d9073-9234-451c-ae0b-849bcd40ca07", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Command Input for Operator", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.CommandInt" + } + }, + "dataSourceIdentifier": "523881ce-1a38-448a-a042-823bf524f91e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Command Input for Automatic-Intern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.CommandExt" + } + }, + "dataSourceIdentifier": "bdc42497-009f-4c18-b32e-a4846c9d3221", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Command Input for Automatic-Extern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.ProcedureOp" + } + }, + "dataSourceIdentifier": "ace4372b-ca4d-44a9-af05-3c1dde0fdbb4", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Procedure Input for Operator", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.ProcedureInt" + } + }, + "dataSourceIdentifier": "5020f836-bba0-4bd7-b4f1-451c8d0d1329", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Procedure Input for Automatic-Intern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.ProcedureExt" + } + }, + "dataSourceIdentifier": "b4ecac86-bf44-4dc8-b3c5-7f7dffc92da0", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Procedure Input for Automatic-Extern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandEn", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.CommandEn" + } + }, + "dataSourceIdentifier": "d0734477-9918-4458-a49c-73338b3fc1a9", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Transition Clearance from the Current State", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateCur", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.StateCur" + } + }, + "dataSourceIdentifier": "74dd75d1-8c49-49c8-8097-3594e9c038fa", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Current State", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureCur", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.ProcedureCur" + } + }, + "dataSourceIdentifier": "2d83db14-7046-4250-99c2-f718f2dd3305", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Current Procedure", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureReq", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.ProcedureReq" + } + }, + "dataSourceIdentifier": "fa015e55-5505-4cfc-9935-8d8d4369e74a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Requested Procedure", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "InteractQuestionID", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.InteractQuestionID" + } + }, + "dataSourceIdentifier": "c89cfc1f-0f7f-46e5-8cf1-283e246ea409", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Operator Request Question ID", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "InteractAnswerID", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.InteractAnswerID" + } + }, + "dataSourceIdentifier": "4feb082d-c9f7-4df5-bc09-02a4d8eb1481", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Operator Request Answer ID", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "PosTextID", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.PosTextID" + } + }, + "dataSourceIdentifier": "5ea5e7c3-0c4c-4b6f-b503-b7f3989e9d8d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Service Information Text ID", + "pimadIdentifier": "TODO" + } + ], + "dataSourceIdentifier": "b0bc77ca-96a3-485e-87bc-316f428c824d", + "description": "inline TODO above", + "name": "Trigonometry", + "initialized": true, + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/ServiceControl", + "pimadIdentifier": "c26a02b0-3067-487e-915f-259ce1d35551", + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + }, + "metaModelRef": "MTPServiceSUCLib/Service", + "name": "Trigonometry", + "parameters": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Trigonometry_AnaConfParam_UpdateRate", + "defaultValue": "Trigonometry_AnaConfParam_UpdateRate", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "UpdateRateDuring Execute", + "defaultValue": "UpdateRateDuring Execute", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "OSLevel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.OSLevel" + } + }, + "dataSourceIdentifier": "879e3055-332e-4dc0-888a-f54db9db08b3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.WQC" + } + }, + "dataSourceIdentifier": "6e866e49-c445-4c8a-9fd8-99b819189607", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "WQC variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.StateChannel" + } + }, + "dataSourceIdentifier": "0c80a1f2-64f9-40aa-9257-cb5578b264f7", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Operation Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.StateOffAut" + } + }, + "dataSourceIdentifier": "308fd2b9-18a6-403a-a724-d422c6e26ca3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.StateOpAut" + } + }, + "dataSourceIdentifier": "c318f150-cbb9-4775-848a-49a6fa4d6667", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.StateAutAut" + } + }, + "dataSourceIdentifier": "579e840c-f41c-40f8-a843-9246006b5d95", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.StateOffOp" + } + }, + "dataSourceIdentifier": "1c523cb2-a186-4b1d-845b-1a4399018ff6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.StateOpOp" + } + }, + "dataSourceIdentifier": "06f360a5-1be9-4675-950e-bc73f31a0020", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.StateAutOp" + } + }, + "dataSourceIdentifier": "4cb7037b-6711-4c10-a53f-ea50d8a7a714", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.StateOpAct" + } + }, + "dataSourceIdentifier": "79f116a8-dd16-4eef-a253-7ff612d23d71", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Operator Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.StateAutAct" + } + }, + "dataSourceIdentifier": "a84c129b-f977-4c2b-beeb-630f074486ac", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Automatic Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.StateOffAct" + } + }, + "dataSourceIdentifier": "c25c1bf1-3ea0-452c-990f-cec2be9b9ce4", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Offline Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.SrcChannel" + } + }, + "dataSourceIdentifier": "46303793-b6eb-421a-832c-981bf98b0908", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Service Source Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.SrcExtAut" + } + }, + "dataSourceIdentifier": "64e18e2e-61a4-478d-a04b-8377b86645f9", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.SrcIntAut" + } + }, + "dataSourceIdentifier": "1e3932ea-5367-4c13-995e-7c1b2b9ab605", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Internal by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.SrcIntOp" + } + }, + "dataSourceIdentifier": "1375219e-eebb-45b5-95b6-e737be6359a8", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Intern by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.SrcExtOp" + } + }, + "dataSourceIdentifier": "dbf0bb61-b60f-461d-93f4-a12784841444", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.SrcExtAct" + } + }, + "dataSourceIdentifier": "6b906950-9939-4c4b-8380-8130655b1d3e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "External Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.SrcIntAct" + } + }, + "dataSourceIdentifier": "15b61594-2e4f-43b6-91b6-1aba690939b2", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Internal Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.VExt" + } + }, + "dataSourceIdentifier": "5554d1ed-3047-4e56-81db-712d2a9416f2", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Extern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.VOp" + } + }, + "dataSourceIdentifier": "39baaf5d-7854-4f8b-869b-bf3e6eeeb258", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Manual Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.VInt" + } + }, + "dataSourceIdentifier": "5d8850e0-05e8-493d-9645-efe72b5859e3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Intern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VReq", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.VReq" + } + }, + "dataSourceIdentifier": "13c7e323-f3c8-482b-8ad8-fa7899f28e0d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Request Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VFbk", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.VFbk" + } + }, + "dataSourceIdentifier": "151821a9-9569-4379-8dfc-84489f97f0a4", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Feedback Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.VOut" + } + }, + "dataSourceIdentifier": "c4eb01fc-4e46-433c-812b-53a247712712", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Output Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.VSclMin" + } + }, + "dataSourceIdentifier": "1d753e06-10ef-4da5-bc5f-d6a83ba677e9", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.VSclMax" + } + }, + "dataSourceIdentifier": "c1bc6f0f-cef8-47ee-b440-3335e0617844", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.VMin" + } + }, + "dataSourceIdentifier": "46cff096-770f-4df7-8a71-168d370f2d8d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.VMax" + } + }, + "dataSourceIdentifier": "1d47e001-fc4c-4413-a447-4a4f9e7ecbcc", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.VUnit" + } + }, + "dataSourceIdentifier": "e5986493-2ff9-44f0-be10-9f760fe505c9", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "1054", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "Sync", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaConfParam_UpdateRate.Sync" + } + }, + "dataSourceIdentifier": "73b36f25-0049-49c4-949d-f9c015b5b04a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Synchronization Mode", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaServParam", + "name": "Trigonometry_AnaConfParam_UpdateRate", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "reportValues": [], + "processValuesIn": [], + "processValuesOut": [], + "procedures": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "attributes": [ + { + "dataType": "xs:boolean", + "name": "IsSelfCompleting", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "value": "false" + }, + { + "dataType": "xs:unsignedLong", + "name": "ProcedureID", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "value": "1" + }, + { + "dataType": "xs:boolean", + "name": "IsDefault", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "value": "true" + } + ], + "dataAssembly": { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Trigonometry_default", + "defaultValue": "Trigonometry_default", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Default Procedure of Trigonometry", + "defaultValue": "Default Procedure of Trigonometry", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_default.WQC" + } + }, + "dataSourceIdentifier": "b749c9e8-2999-42ea-9ccf-652718d857e6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + } + ], + "dataSourceIdentifier": "98768474-c8f6-4108-9861-164741fa3a63", + "description": "inline TODO above", + "name": "Trigonometry_default", + "initialized": true, + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/HealthStateView", + "pimadIdentifier": "b88e5ede-20e5-41cf-941d-a8c6b21de74b", + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + }, + "metaModelRef": "MTPServiceSUCLib/ServiceProcedure", + "name": "Trigonometry_default", + "parameters": [], + "reportValues": [], + "processValuesIn": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Trigonometry_AnaProcessValueIn_Angle", + "defaultValue": "Trigonometry_AnaProcessValueIn_Angle", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Angle as input for calculation", + "defaultValue": "Angle as input for calculation", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueIn_Angle.WQC" + } + }, + "dataSourceIdentifier": "1bc8da3a-2f7e-4bc1-b78b-847c707f7381", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueIn_Angle.VExt" + } + }, + "dataSourceIdentifier": "d388a113-6863-4cc3-915c-a7e55d5f8482", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Extern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueIn_Angle.VSclMin" + } + }, + "dataSourceIdentifier": "dacdea76-8c27-4365-b599-d6d6d56f390d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueIn_Angle.VSclMax" + } + }, + "dataSourceIdentifier": "a300aeba-55ac-4554-829b-40a95cb5527f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueIn_Angle.VUnit" + } + }, + "dataSourceIdentifier": "3ad1e260-cc40-4e6f-a93f-c09765629598", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "1005", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/InputElement/AnaProcessValueIn", + "name": "Trigonometry_AnaProcessValueIn_Angle", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "processValuesOut": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Trigonometry_AnaProcessValueOut_Tangens", + "defaultValue": "Trigonometry_AnaProcessValueOut_Tangens", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "CalculationResult_Tangens", + "defaultValue": "CalculationResult_Tangens", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Tangens.WQC" + } + }, + "dataSourceIdentifier": "ba514a48-cb7d-4fda-9a9f-a922192f2013", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Tangens.V" + } + }, + "dataSourceIdentifier": "241f44fc-d0b4-434e-9d74-b08519a47e76", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Tangens.VSclMin" + } + }, + "dataSourceIdentifier": "91ec8d6d-fb66-41a5-8f61-0e5cd0c27f24", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Tangens.VSclMax" + } + }, + "dataSourceIdentifier": "db375215-7533-4b5a-ae72-2c3b7c170e4e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Tangens.VUnit" + } + }, + "dataSourceIdentifier": "015a3bbf-5f06-4e7f-85c6-081d2a2aefce", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "name": "Trigonometry_AnaProcessValueOut_Tangens", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Trigonometry_AnaProcessValueOut_Cosinus", + "defaultValue": "Trigonometry_AnaProcessValueOut_Cosinus", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "CalculationResult_Cosinus", + "defaultValue": "CalculationResult_Cosinus", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Cosinus.WQC" + } + }, + "dataSourceIdentifier": "1a2d3ede-6765-498e-9828-44003a8b994b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Cosinus.V" + } + }, + "dataSourceIdentifier": "7b2da736-9565-42cb-a2a1-25489b10afc5", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Cosinus.VSclMin" + } + }, + "dataSourceIdentifier": "af900db0-ba73-48b0-9895-296c924e17e1", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Cosinus.VSclMax" + } + }, + "dataSourceIdentifier": "e7646f6d-d2da-41d9-9ec1-e3ea7d7ff7a3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Cosinus.VUnit" + } + }, + "dataSourceIdentifier": "705cd7de-ed57-4ae9-919b-f02b96fb66e7", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "name": "Trigonometry_AnaProcessValueOut_Cosinus", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Trigonometry_AnaProcessValueOut_Sinus", + "defaultValue": "Trigonometry_AnaProcessValueOut_Sinus", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "CalculationResult_Sinus", + "defaultValue": "CalculationResult_Sinus", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Sinus.WQC" + } + }, + "dataSourceIdentifier": "9617898f-faf3-4cf0-9654-9b728711cf3b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Sinus.V" + } + }, + "dataSourceIdentifier": "8676015e-a6fb-4aab-bb88-f15a5e194f3d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Sinus.VSclMin" + } + }, + "dataSourceIdentifier": "c16af405-f073-4da2-b196-118421169ff7", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Sinus.VSclMax" + } + }, + "dataSourceIdentifier": "edf6ab8a-1441-4062-8f7a-dd7c607914c2", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Trigonometry.Trigonometry_AnaProcessValueOut_Sinus.VUnit" + } + }, + "dataSourceIdentifier": "7fc16a94-fb1c-451b-8079-4f9a41ae3fcc", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "name": "Trigonometry_AnaProcessValueOut_Sinus", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "dataSourceIdentifier": "e4a2e743-af75-4ae2-8115-8f215e4ee89c", + "pimadIdentifier": "TODO" + } + ], + "dataSourceIdentifier": "450948b6-e5f0-4cc2-abd4-f974c9d8e7c5", + "pimadIdentifier": "8b783d44-3891-4922-a248-2fc27b4c90ca" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "attributes": [], + "dataAssembly": { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Integral1", + "defaultValue": "Integral1", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Service for math operation Integral", + "defaultValue": "Service for math operation Integral", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.StateChannel" + } + }, + "dataSourceIdentifier": "ec60b02b-7470-412d-92b2-f5ae0f5ac653", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Operation Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.StateOffAut" + } + }, + "dataSourceIdentifier": "efb006ab-7e8e-4eb4-a1cf-7709eb7efc09", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.StateOpAut" + } + }, + "dataSourceIdentifier": "0b869f62-cdae-444b-9778-1d9b7d2c3cfb", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.StateAutAut" + } + }, + "dataSourceIdentifier": "67ead1c1-dad3-437b-a60d-f2bf438e889d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.StateOffOp" + } + }, + "dataSourceIdentifier": "82ea6b26-53cc-41c2-8a5f-cfbb9ffae747", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.StateOpOp" + } + }, + "dataSourceIdentifier": "c79d3d9e-e0a0-479c-b1cc-de62e7e0742f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.StateAutOp" + } + }, + "dataSourceIdentifier": "7eb6e84f-b1f2-4d91-ac7b-3fbe6daa582e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.StateOpAct" + } + }, + "dataSourceIdentifier": "adca7a0a-543d-446b-a2a5-340a246ea0e3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Operator Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.StateAutAct" + } + }, + "dataSourceIdentifier": "c4b6cdd0-a455-4225-93d5-39db76dcc8b6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Automatic Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.StateOffAct" + } + }, + "dataSourceIdentifier": "fa0bb4f5-984c-4b5f-aaf1-721c46216476", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Offline Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.SrcChannel" + } + }, + "dataSourceIdentifier": "779096b5-9e81-4838-9ebc-d2068bd7bcb7", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Service Source Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.SrcExtAut" + } + }, + "dataSourceIdentifier": "763899ed-c769-47cb-9643-5ba5fd740981", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.SrcIntAut" + } + }, + "dataSourceIdentifier": "2007ef96-0807-4229-8f17-d902fb084a41", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Internal by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.SrcIntOp" + } + }, + "dataSourceIdentifier": "345e2a6d-981d-4e77-a2f9-cdbc288c4f82", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Intern by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.SrcExtOp" + } + }, + "dataSourceIdentifier": "32b9d496-c51d-4986-b2f9-2506a48a3e98", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.SrcExtAct" + } + }, + "dataSourceIdentifier": "7c368e32-5558-4f17-bd78-5916cab1d6f0", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "External Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.SrcIntAct" + } + }, + "dataSourceIdentifier": "5a153ba5-5d01-4d46-a8bb-34c06d5fc813", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Internal Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "OSLevel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.OSLevel" + } + }, + "dataSourceIdentifier": "e7ef7e4c-6d74-403f-9ab5-8e5d6d0d73ed", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.WQC" + } + }, + "dataSourceIdentifier": "0e71bc46-f7fd-4f1a-9584-9930e641c68f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.CommandOp" + } + }, + "dataSourceIdentifier": "ec9811dd-6fb8-4a48-8cf3-0c4e1a661057", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Command Input for Operator", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.CommandInt" + } + }, + "dataSourceIdentifier": "5a31555e-747c-4103-a14b-9401873452d1", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Command Input for Automatic-Intern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.CommandExt" + } + }, + "dataSourceIdentifier": "279f4fe2-f974-40d4-a16a-2613bede1fab", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Command Input for Automatic-Extern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.ProcedureOp" + } + }, + "dataSourceIdentifier": "491ed7e3-6578-415e-893d-1d6b061f167e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Procedure Input for Operator", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.ProcedureInt" + } + }, + "dataSourceIdentifier": "c311ca8c-0a88-473a-a128-7649f04dac8a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Procedure Input for Automatic-Intern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.ProcedureExt" + } + }, + "dataSourceIdentifier": "0db208f9-c559-4256-8878-af2f795ce9d1", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Procedure Input for Automatic-Extern", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "CommandEn", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.CommandEn" + } + }, + "dataSourceIdentifier": "369c01e8-1359-4eff-9851-56be34054680", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Transition Clearance from the Current State", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateCur", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.StateCur" + } + }, + "dataSourceIdentifier": "f0ac1de4-8b97-4ed1-84b0-01ab8c6f8f6b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Current State", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureCur", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.ProcedureCur" + } + }, + "dataSourceIdentifier": "9177416d-96cb-4440-bca0-b942b3fda1ff", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Current Procedure", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "ProcedureReq", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.ProcedureReq" + } + }, + "dataSourceIdentifier": "b9a7fdb8-900b-48ec-baeb-28606c9b71dc", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Requested Procedure", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "InteractQuestionID", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.InteractQuestionID" + } + }, + "dataSourceIdentifier": "512a56d4-2f7a-411d-b816-3ba663310051", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Operator Request Question ID", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "InteractAnswerID", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.InteractAnswerID" + } + }, + "dataSourceIdentifier": "780e70d5-432e-48e0-84bc-34186704ad93", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Operator Request Answer ID", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "PosTextID", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.PosTextID" + } + }, + "dataSourceIdentifier": "24bb08a7-862e-4984-954e-531909f7bea3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Service Information Text ID", + "pimadIdentifier": "TODO" + } + ], + "dataSourceIdentifier": "643089db-8d3a-4c9d-8e8c-76f695052d98", + "description": "inline TODO above", + "name": "Integral1", + "initialized": true, + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/ServiceControl", + "pimadIdentifier": "f7cd6e22-bce0-4ba5-98e0-c326246a09f5", + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + }, + "metaModelRef": "MTPServiceSUCLib/Service", + "name": "Integral1", + "parameters": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaConfParam_Integral1_updateRate", + "defaultValue": "AnaConfParam_Integral1_updateRate", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "UpdateRate during execute", + "defaultValue": "UpdateRate during execute", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "OSLevel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.OSLevel" + } + }, + "dataSourceIdentifier": "3ce94b00-5cfa-473c-bb6a-9993bf510231", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.WQC" + } + }, + "dataSourceIdentifier": "531ffec8-ca6f-4c38-82da-9ac566817c92", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.StateChannel" + } + }, + "dataSourceIdentifier": "8db0f936-49a5-4e57-935a-61fa09fef61d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Operation Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.StateOffAut" + } + }, + "dataSourceIdentifier": "62865e87-989d-45b7-b1ed-06a715201596", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.StateOpAut" + } + }, + "dataSourceIdentifier": "083da124-ef0c-4efc-893a-e18e719c9916", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.StateAutAut" + } + }, + "dataSourceIdentifier": "a6479714-86f3-45bd-9304-866d01a1e921", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.StateOffOp" + } + }, + "dataSourceIdentifier": "f31975bc-8f92-4a95-ba5f-8765d45d95a1", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.StateOpOp" + } + }, + "dataSourceIdentifier": "9f4167d2-da2e-42d5-9736-77e66cfa1638", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.StateAutOp" + } + }, + "dataSourceIdentifier": "63bc182e-1967-4795-b112-862fd458e87b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.StateOpAct" + } + }, + "dataSourceIdentifier": "7cc23949-be0c-48b3-bad7-4cd744099d10", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Operator Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.StateAutAct" + } + }, + "dataSourceIdentifier": "cb7d9951-4782-4082-ade5-e0edf516ce5f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Automatic Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.StateOffAct" + } + }, + "dataSourceIdentifier": "cf1d9f6b-9e09-47e3-bbf2-ef8fdab5ac8d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Offline Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.SrcChannel" + } + }, + "dataSourceIdentifier": "17b5fff2-2ae9-43d8-a236-ac9208aa8815", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Service Source Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.SrcExtAut" + } + }, + "dataSourceIdentifier": "06633846-1b0f-4f92-8833-f91f79768dc7", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.SrcIntAut" + } + }, + "dataSourceIdentifier": "4d9bbb12-6054-4180-90a4-166f8888c33a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Internal by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.SrcIntOp" + } + }, + "dataSourceIdentifier": "18adcefe-b2b5-49b5-9475-0acf1d717850", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Intern by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.SrcExtOp" + } + }, + "dataSourceIdentifier": "44838fa8-455c-4724-8090-93a229cbf278", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.SrcExtAct" + } + }, + "dataSourceIdentifier": "1d03d8c7-c1ae-4dc3-9b46-1c1b47a0edf4", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "External Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.SrcIntAct" + } + }, + "dataSourceIdentifier": "ccebf746-0ccd-4ca2-835b-21bb4b6ca1de", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Internal Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.VExt" + } + }, + "dataSourceIdentifier": "5120e34e-261b-44da-8ab9-104a782780b5", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Extern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.VOp" + } + }, + "dataSourceIdentifier": "2e4b5837-01bc-40a8-8edd-232ca44be724", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Manual Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.VInt" + } + }, + "dataSourceIdentifier": "630cc2b8-46f8-4bd7-8dd0-67c8a687fbb6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Intern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VReq", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.VReq" + } + }, + "dataSourceIdentifier": "9a181067-98d7-4d42-bf63-71f6dca6dd3d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Request Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VFbk", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.VFbk" + } + }, + "dataSourceIdentifier": "73a75c0a-fe65-405f-aed4-73f57c7415a3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Feedback Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.VOut" + } + }, + "dataSourceIdentifier": "50f71869-80cf-4ae5-93c1-aa01e4c3d976", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Output Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.VSclMin" + } + }, + "dataSourceIdentifier": "9bf35683-89ed-4551-9e36-fd39bcd6564e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.VSclMax" + } + }, + "dataSourceIdentifier": "c9ffe8b1-1b6e-4c21-82fc-a6342a278ebb", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.VMin" + } + }, + "dataSourceIdentifier": "1f354d5f-7c53-420b-a40b-5a139a6f3442", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.VMax" + } + }, + "dataSourceIdentifier": "d3c73dab-f34e-482c-8fa5-d8338ef2300c", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.VUnit" + } + }, + "dataSourceIdentifier": "4aeaea95-3f26-4433-b0c2-6a620f5e716e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "Sync", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaConfParam_Integral1_updateRate.Sync" + } + }, + "dataSourceIdentifier": "accc0d5a-066f-4ae1-af3a-89d697e8acde", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Synchronization Mode", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaServParam", + "name": "AnaConfParam_Integral1_updateRate", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "reportValues": [], + "processValuesIn": [], + "processValuesOut": [], + "procedures": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "attributes": [ + { + "dataType": "xs:boolean", + "name": "IsSelfCompleting", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "value": "false" + }, + { + "dataType": "xs:unsignedLong", + "name": "ProcedureID", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "value": "1" + }, + { + "dataType": "xs:boolean", + "name": "IsDefault", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "value": "true" + } + ], + "dataAssembly": { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "Integral1_default", + "defaultValue": "Integral1_default", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Default Procedure of Integral1", + "defaultValue": "Default Procedure of Integral1", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.Integral1_default.WQC" + } + }, + "dataSourceIdentifier": "091cb441-e4d3-4777-b6c6-02fd3154dc0b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + } + ], + "dataSourceIdentifier": "91ecc5ec-30f5-42d1-9cdf-fb82b5552982", + "description": "inline TODO above", + "name": "Integral1_default", + "initialized": true, + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/HealthStateView", + "pimadIdentifier": "9e1a18c5-c169-48c5-b121-b969a507a83d", + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + }, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + }, + "metaModelRef": "MTPServiceSUCLib/ServiceProcedure", + "name": "Integral1_default", + "parameters": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaProcParam_Integral1_factor", + "defaultValue": "AnaProcParam_Integral1_factor", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Factor for scaling", + "defaultValue": "Factor for scaling", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "OSLevel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.OSLevel" + } + }, + "dataSourceIdentifier": "16db02fe-5fe8-48c5-af31-e7ffa3c2c355", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral2.AnaProcParam_Integral1_factor.WQC" + } + }, + "dataSourceIdentifier": "9d7dcf89-fbad-4c71-b4e9-278d299b69c6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "WQC Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.StateChannel" + } + }, + "dataSourceIdentifier": "c9df5f34-f1b4-4f24-9d2a-48b77b66a67b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Operation Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.StateOffAut" + } + }, + "dataSourceIdentifier": "b474da12-73de-4b4d-acf2-480b87300890", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.StateOpAut" + } + }, + "dataSourceIdentifier": "163015d0-1ac7-478f-8674-728b8bac27a9", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.StateAutAut" + } + }, + "dataSourceIdentifier": "d4b93aa8-6a92-469c-9b7d-86e3f161e540", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.StateOffOp" + } + }, + "dataSourceIdentifier": "eb050e75-23a5-4e10-9545-b76e9303fa90", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.StateOpOp" + } + }, + "dataSourceIdentifier": "5b2f14cd-20cb-4d4f-9304-20b2e169a2e2", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.StateAutOp" + } + }, + "dataSourceIdentifier": "018a79db-4872-4486-baff-3e3288d20291", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.StateOpAct" + } + }, + "dataSourceIdentifier": "3d08895d-928d-435d-9558-c9b84ccbf2b3", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Operator Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.StateAutAct" + } + }, + "dataSourceIdentifier": "e411fb13-b5b8-4a87-b47f-55f5e0658343", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Automatic Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.StateOffAct" + } + }, + "dataSourceIdentifier": "a68c9ca1-f0fd-41fd-90a0-fb92c5cbe120", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Offline Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.SrcChannel" + } + }, + "dataSourceIdentifier": "736e9a7b-64ec-46e0-aa05-2a089659c104", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Service Source Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.SrcExtAut" + } + }, + "dataSourceIdentifier": "86734bee-059c-490a-860b-9fd5ddb6b6d9", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.SrcIntAut" + } + }, + "dataSourceIdentifier": "8a31eae8-204a-44f7-9ec0-85a4cd2eddb8", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Internal by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.SrcIntOp" + } + }, + "dataSourceIdentifier": "61f56f61-5e94-493b-b570-c8b0246a8540", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Intern by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.SrcExtOp" + } + }, + "dataSourceIdentifier": "941c223b-0c2a-406c-9db6-3c0e3041b4b5", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.SrcExtAct" + } + }, + "dataSourceIdentifier": "bd59e034-539e-4bcb-9dd8-b8b3546686bb", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "External Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.SrcIntAct" + } + }, + "dataSourceIdentifier": "efff030a-6ee1-40b0-87a5-c5adab264ec8", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Internal Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.VExt" + } + }, + "dataSourceIdentifier": "9965aa2e-6b25-4763-b488-d95fff44ec22", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Extern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.VOp" + } + }, + "dataSourceIdentifier": "f2a34fee-ab2d-41e5-867d-bad97f08d68b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Manual Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.VInt" + } + }, + "dataSourceIdentifier": "6e07d969-9ad3-4521-90e6-7abc3efc4ef4", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Intern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VReq", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.VReq" + } + }, + "dataSourceIdentifier": "6275651b-fc87-425a-a391-b0d835fd8217", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Request Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VFbk", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.VFbk" + } + }, + "dataSourceIdentifier": "ef56b2e9-3709-4684-98ff-48168b70f6f6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Feedback Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.VOut" + } + }, + "dataSourceIdentifier": "a01a46cf-0f88-4159-b8f6-c27c362bfa8f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Output Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.VSclMin" + } + }, + "dataSourceIdentifier": "d1b23df4-97eb-4dfa-b6f0-91ead8d74c6a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.VSclMax" + } + }, + "dataSourceIdentifier": "6a72df29-b61d-4d78-aa47-e745632ba7bf", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.VMin" + } + }, + "dataSourceIdentifier": "9ce181a9-4ebe-46ca-bfd7-d211b374f446", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.VMax" + } + }, + "dataSourceIdentifier": "bc7f1c89-01ab-40c4-9b81-96e45d499d7b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.VUnit" + } + }, + "dataSourceIdentifier": "7a28e123-e50f-4198-a293-9d272e7f922b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "Sync", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_factor.Sync" + } + }, + "dataSourceIdentifier": "b068137b-c222-4938-879a-9cb892959534", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Synchronization Mode", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaServParam", + "name": "AnaProcParam_Integral1_factor", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaProcParam_Integral1_offset", + "defaultValue": "AnaProcParam_Integral1_offset", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Offset for scaling", + "defaultValue": "Offset for scaling", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "OSLevel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.OSLevel" + } + }, + "dataSourceIdentifier": "92c1c433-e283-4208-8392-d4238a423427", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "OS Level variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.WQC" + } + }, + "dataSourceIdentifier": "bfc5fc31-7255-4152-a0f7-ecb8fcffb59a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "WQC variable (0: Local HMI, >0: POL HMI)", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.StateChannel" + } + }, + "dataSourceIdentifier": "270bdd95-a70e-4de8-ac4e-0dccf5cabfeb", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Operation Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.StateOffAut" + } + }, + "dataSourceIdentifier": "8e0da651-19c7-4b0a-b098-a9f660d95200", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.StateOpAut" + } + }, + "dataSourceIdentifier": "b341a95d-9ad9-427c-80a6-6aca2f275acf", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.StateAutAut" + } + }, + "dataSourceIdentifier": "264492c0-5328-42fd-9b38-9ad7997b61fb", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.StateOffOp" + } + }, + "dataSourceIdentifier": "74cd964d-0fc6-4a96-9259-37dcd485ff89", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Offline by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.StateOpOp" + } + }, + "dataSourceIdentifier": "5e91bd2f-358b-4997-93cc-152558b270b7", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Operator by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.StateAutOp" + } + }, + "dataSourceIdentifier": "01b63465-7f65-4ff7-abb6-53ab3964a63c", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Operation Mode to Automatic by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOpAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.StateOpAct" + } + }, + "dataSourceIdentifier": "4e76946f-6247-4956-abf2-aee2c9ebed5a", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Operator Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateAutAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.StateAutAct" + } + }, + "dataSourceIdentifier": "d3808f09-46cc-462d-a220-6ca382adc3fe", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Automatic Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "StateOffAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.StateOffAct" + } + }, + "dataSourceIdentifier": "f2ef7fca-408b-43f8-9f7d-c80265801591", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Offline Mode Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcChannel", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.SrcChannel" + } + }, + "dataSourceIdentifier": "7a2f7363-2f01-4a3f-975f-ea77a2356b3e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Selection of the active Service Source Mode interaction channel", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.SrcExtAut" + } + }, + "dataSourceIdentifier": "e953d3dc-c765-4c79-9aae-841affd19e64", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.SrcIntAut" + } + }, + "dataSourceIdentifier": "195cf0c5-0061-44cf-ba31-5c787b106320", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Internal by automatic interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.SrcIntOp" + } + }, + "dataSourceIdentifier": "9b4e1643-1c0e-4d95-b826-d7c54b6eac6c", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to Intern by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.SrcExtOp" + } + }, + "dataSourceIdentifier": "f093a16f-8cf1-475a-9072-23874c5f9e72", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Set Source Mode to External by operator interaction", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcExtAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.SrcExtAct" + } + }, + "dataSourceIdentifier": "70a41028-3e3e-4a69-95a3-91649c7d20ba", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "External Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "SrcIntAct", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.SrcIntAct" + } + }, + "dataSourceIdentifier": "409c2ea6-eeb7-47f3-be0b-a3cfc838655f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Internal Source Active", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.VExt" + } + }, + "dataSourceIdentifier": "7ce51bd1-183c-4035-ab3d-524ab913205b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Extern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOp", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.VOp" + } + }, + "dataSourceIdentifier": "b78b94f2-d7e7-4ff0-a00e-4d4c016241ff", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Manual Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VInt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.VInt" + } + }, + "dataSourceIdentifier": "a4827ab9-25f0-4007-85ec-c88e4d176463", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Intern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VReq", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.VReq" + } + }, + "dataSourceIdentifier": "ed0d7bb4-5de3-4723-b2be-4f571b5be3e6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Request Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VFbk", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.VFbk" + } + }, + "dataSourceIdentifier": "f636f35f-6160-46d4-a21a-9d77c032136f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Feedback Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VOut", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.VOut" + } + }, + "dataSourceIdentifier": "369331e6-4dc0-439d-a78c-a47784179a0d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Output Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.VSclMin" + } + }, + "dataSourceIdentifier": "6e40a348-a469-402b-99fb-51826d6e627d", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.VSclMax" + } + }, + "dataSourceIdentifier": "16d50516-70bd-4134-8101-d43a6ab67735", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.VMin" + } + }, + "dataSourceIdentifier": "730890bc-5f6b-4561-8f1d-77d2e9bd6258", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.VMax" + } + }, + "dataSourceIdentifier": "fc06efc0-e42a-419b-ab05-d849098ec45f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.VUnit" + } + }, + "dataSourceIdentifier": "61984f21-a50f-42f7-a127-e06f54bd5b41", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "Sync", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcParam_Integral1_offset.Sync" + } + }, + "dataSourceIdentifier": "5d3ff6c7-1349-4a88-bf64-b18084b6bf6b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "false", + "description": "Synchronization Mode", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/OperationElement/AnaServParam", + "name": "AnaProcParam_Integral1_offset", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "reportValues": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaReportValue_Integral1_rvTime", + "defaultValue": "AnaReportValue_Integral1_rvTime", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Final integration time", + "defaultValue": "Final integration time", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvTime.WQC" + } + }, + "dataSourceIdentifier": "0316002c-e0a5-4b34-98b0-6d90bd48f15f", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "Text", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvTime.Text" + } + }, + "dataSourceIdentifier": "0fd17274-7cb5-41fe-9a28-d8cd32f03e6b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/StringView", + "name": "AnaReportValue_Integral1_rvTime", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaReportValue_Integral1_rvOutScaled", + "defaultValue": "AnaReportValue_Integral1_rvOutScaled", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Final scaled value out", + "defaultValue": "Final scaled value out", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvOutScaled.WQC" + } + }, + "dataSourceIdentifier": "086090b4-508a-47ca-9999-f21626a9fc15", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvOutScaled.V" + } + }, + "dataSourceIdentifier": "505cd811-9a9c-4895-885e-cd9b3f98f19e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvOutScaled.VSclMin" + } + }, + "dataSourceIdentifier": "2bd0dd3f-ccf9-4ad6-b06f-3a811c815911", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvOutScaled.VSclMax" + } + }, + "dataSourceIdentifier": "d37a70e8-c3fb-48ac-b4fd-6fec1866edbb", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvOutScaled.VUnit" + } + }, + "dataSourceIdentifier": "77ca4cd3-727f-4e81-9330-019380d7cfc6", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "name": "AnaReportValue_Integral1_rvOutScaled", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaReportValue_Integral1_rvOutIntegral", + "defaultValue": "AnaReportValue_Integral1_rvOutIntegral", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Final integral value out", + "defaultValue": "Final integral value out", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvOutIntegral.WQC" + } + }, + "dataSourceIdentifier": "b17b4d08-fb56-4f9f-9c3e-e5ee858f832b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvOutIntegral.V" + } + }, + "dataSourceIdentifier": "f2c14e0e-55b8-48ab-8827-89de8cc163dd", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvOutIntegral.VSclMin" + } + }, + "dataSourceIdentifier": "4ccf3b2c-c249-40ff-a411-ac8266c3714e", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvOutIntegral.VSclMax" + } + }, + "dataSourceIdentifier": "efa52683-d5ab-40b7-a8da-94ae55f65781", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaReportValue_Integral1_rvOutIntegral.VUnit" + } + }, + "dataSourceIdentifier": "51d5812e-1744-4da5-b757-ccb51b25a2b4", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "name": "AnaReportValue_Integral1_rvOutIntegral", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "processValuesIn": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaProcessValueIn_Integral1_pv", + "defaultValue": "AnaProcessValueIn_Integral1_pv", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Analog Process Value Input", + "defaultValue": "Analog Process Value Input", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueIn_Integral1_pv.WQC" + } + }, + "dataSourceIdentifier": "aa4ac030-e15c-4f61-aed7-ea21c5969b9b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VExt", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueIn_Integral1_pv.VExt" + } + }, + "dataSourceIdentifier": "2afd4086-4be1-45bf-b1f3-88650f8de3a0", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Extern Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueIn_Integral1_pv.VSclMin" + } + }, + "dataSourceIdentifier": "819292f2-9147-4a1d-acfe-bc945455fa91", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueIn_Integral1_pv.VSclMax" + } + }, + "dataSourceIdentifier": "c038d934-1587-4671-970e-23fb53c5581b", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "10", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueIn_Integral1_pv.VUnit" + } + }, + "dataSourceIdentifier": "e7c88835-b67c-494b-8087-087acd8ce5c4", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "1353", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/InputElement/AnaProcessValueIn", + "name": "AnaProcessValueIn_Integral1_pv", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "processValuesOut": [ + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaProcessValueOut_Integral1_pvOutIntegral", + "defaultValue": "AnaProcessValueOut_Integral1_pvOutIntegral", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "Integral of pv", + "defaultValue": "Integral of pv", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueOut_Integral1_pvOutIntegral.WQC" + } + }, + "dataSourceIdentifier": "172fbfeb-c44e-49af-9c69-fd6d006f1970", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueOut_Integral1_pvOutIntegral.V" + } + }, + "dataSourceIdentifier": "13fd2313-1591-49b6-8deb-66ce9cbd3ea5", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueOut_Integral1_pvOutIntegral.VSclMin" + } + }, + "dataSourceIdentifier": "bc86e1cc-04e2-4bb7-837b-4a60d50f4453", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueOut_Integral1_pvOutIntegral.VSclMax" + } + }, + "dataSourceIdentifier": "18c6c2df-efd7-4fd1-9bbd-9cc8ed7c7b60", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueOut_Integral1_pvOutIntegral.VUnit" + } + }, + "dataSourceIdentifier": "1bc1e77b-2f70-48e6-ac9b-299b4eda3234", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "name": "AnaProcessValueOut_Integral1_pvOutIntegral", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + { + "dataItems": [ + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagName", + "value": "AnaProcessValueOut_Integral1_pvOutScaled", + "defaultValue": "AnaProcessValueOut_Integral1_pvOutScaled", + "description": "TagName Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:string", + "name": "TagDescription", + "value": "scaled value of pv", + "defaultValue": "scaled value of pv", + "description": "TagDescription Field", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "WQC", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueOut_Integral1_pvOutScaled.WQC" + } + }, + "dataSourceIdentifier": "983c914d-f53d-44d4-ac94-c7c2a5bf1998", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "255", + "description": "Worst Quality Code variable", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "V", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueOut_Integral1_pvOutScaled.V" + } + }, + "dataSourceIdentifier": "5e6049c3-0e8c-4991-8997-06bdba542439", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMin", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueOut_Integral1_pvOutScaled.VSclMin" + } + }, + "dataSourceIdentifier": "6a18a79b-0e4d-465f-9e29-a81c012faa39", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Low Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VSclMax", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueOut_Integral1_pvOutScaled.VSclMax" + } + }, + "dataSourceIdentifier": "a8752e34-bb8e-4c2a-9c7a-b04772277eba", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "High Limit value", + "pimadIdentifier": "TODO" + }, + { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "dataType": "xs:IDREF", + "name": "VUnit", + "cIData": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "nodeId": { + "initialized": true, + "responseHandler": { + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + }, + "namespaceIndex": "urn:localhost:NodeOPCUA-Client", + "identifier": "Integral1.AnaProcessValueOut_Integral1_pvOutScaled.VUnit" + } + }, + "dataSourceIdentifier": "9af23247-c0c9-4b02-a901-1c65c00ecf27", + "metaModelRef": "MTPCommunicationICLib/DataItem/OPCUAItem", + "defaultValue": "0", + "description": "Enumeration value of the unit list", + "pimadIdentifier": "TODO" + } + ], + "metaModelRef": "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", + "name": "AnaProcessValueOut_Integral1_pvOutScaled", + "initialized": true, + "responseVendor": { + "errorResponseFactory": {}, + "dummyResponseFactory": {}, + "successResponseFactory": {}, + "warningResponseFactory": {} + } + } + ], + "dataSourceIdentifier": "26ab2481-e3b1-48b0-9619-de2f985b8156", + "pimadIdentifier": "TODO" + } + ], + "dataSourceIdentifier": "5cbfb281-add2-4cc6-87a6-51887937dc5e", + "pimadIdentifier": "5cbdd210-2ef1-4bac-aeb4-d21f23a1e5ec" + } + ], + "initialized": true +} diff --git a/src/modularPlantManager/pea/PiMAdParser/PiMAdParser.spec.ts b/src/peaProvider/PEAOptionsParser/PEAOptionsParser.spec.ts similarity index 65% rename from src/modularPlantManager/pea/PiMAdParser/PiMAdParser.spec.ts rename to src/peaProvider/PEAOptionsParser/PEAOptionsParser.spec.ts index 5bf9ecd5..8a513e94 100644 --- a/src/modularPlantManager/pea/PiMAdParser/PiMAdParser.spec.ts +++ b/src/peaProvider/PEAOptionsParser/PEAOptionsParser.spec.ts @@ -25,37 +25,25 @@ import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import * as fs from 'fs'; -import {PiMAdParser} from './PiMAdParser'; -import {ModularPlantManager} from '../../ModularPlantManager'; -import exp = require('constants'); +import {PEAOptionsParser} from './PEAOptionsParser'; +import * as peaReferenceModel from './PEAOptionsParser.spec.json'; +import {PEAModel} from '@p2olab/polaris-interface'; chai.use(chaiAsPromised); const expect = chai.expect; -describe('PiMAdParser', () => { - let pimadId=''; - let modularPlantManager: ModularPlantManager; - before(async ()=>{ - modularPlantManager = new ModularPlantManager(); - const peaModel = await modularPlantManager.addPEAToPimadPool({source: 'tests/testpea.zip'}); - pimadId = peaModel.pimadIdentifier; +describe('PEAOptionsParser', () => { - }); - //TODO: maybe test more it('createPEAOptions', async()=>{ - const peaOptions = await PiMAdParser.createPEAOptions(pimadId, modularPlantManager); + const peaModel = peaReferenceModel as any as PEAModel; + const peaOptions = await PEAOptionsParser.createPEAOptions(peaModel); let k: keyof typeof peaOptions; // Type is "one" | "two" | "three" expect(peaOptions).to.not.empty; for (k in peaOptions) { - //TODO: check hmiUrl - if(k == 'username'|| k == 'password' || k == 'hmiUrl' ){ - continue; - }else { - expect(peaOptions[k]).to.not.empty; + if(!(k == 'username'|| k == 'password' || k == 'hmiUrl' )){ + expect(peaOptions[k]).to.be.not.empty; } } - }); }); diff --git a/src/modularPlantManager/pea/PiMAdParser/PiMAdParser.ts b/src/peaProvider/PEAOptionsParser/PEAOptionsParser.ts similarity index 58% rename from src/modularPlantManager/pea/PiMAdParser/PiMAdParser.ts rename to src/peaProvider/PEAOptionsParser/PEAOptionsParser.ts index d4a411b1..1bd6740b 100644 --- a/src/modularPlantManager/pea/PiMAdParser/PiMAdParser.ts +++ b/src/peaProvider/PEAOptionsParser/PEAOptionsParser.ts @@ -1,15 +1,33 @@ -import { - DataAssemblyModel, - DataAssemblyOptions, - DataItemModel, - OpcUaNodeOptions, - PEAModel, PEAOptions, ProcedureModel, ServiceControlOptions, ServiceModel, ServiceOptions -} from '@p2olab/polaris-interface'; +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {DataAssemblyModel, DataAssemblyOptions, DataItemModel, PEAModel, PEAOptions, ProcedureModel, ServiceControlOptions, ServiceModel, ServiceOptions} from '@p2olab/polaris-interface'; import {ProcedureOptions} from '@p2olab/polaris-interface/dist/service/options'; -import {ModularPlantManager} from '../../ModularPlantManager'; -import {namespaceUrl} from '../../../../tests/namespaceUrl'; +import {IDProvider} from '../../modularPlantManager/_utils/idProvider/IDProvider'; -export interface PiMAdParserInterface{ +export interface PEAOptionsParserInterface{ dataAssemblyOptionsArray: DataAssemblyOptions[]; serviceOptionsArray: ServiceOptions[]; } @@ -17,40 +35,37 @@ export interface PiMAdParserInterface{ /** * This class helps parsing the PEAModel coming from PiMAd for creating PEAOptions */ -export class PiMAdParser { +export class PEAOptionsParser { /** - * parent function, which will be called in ModularPlantManager - * @param pimadIdentifier {string} uuid4 - * @param manager {ModularPlantManager} + * transformation of PEAModel to PEAOptions * @return {Promise} + * @param peaModel */ - public static async createPEAOptions(pimadIdentifier: string, manager: ModularPlantManager): Promise{ - const peaModel: PEAModel = await manager.getPEAFromPimadPool(pimadIdentifier); - const pimadParserObject = PiMAdParser.createOptionsArrays(peaModel); + public static async createPEAOptions(peaModel: PEAModel): Promise{ + const parsedOptions = PEAOptionsParser.createOptionsArrays(peaModel); const endpoint = peaModel.endpoint[0].value; - // create PEAOptions - const peaOptions: PEAOptions = { + + return { name: peaModel.name, - id: manager.generateUniqueIdentifier(), - pimadIdentifier: pimadIdentifier, - services: pimadParserObject.serviceOptionsArray, + id: IDProvider.generateIdentifier(), + pimadIdentifier: peaModel.pimadIdentifier, + services: parsedOptions.serviceOptionsArray, username: '', password: '', hmiUrl: '', opcuaServerUrl: endpoint, - dataAssemblies: pimadParserObject.dataAssemblyOptionsArray + dataAssemblies: parsedOptions.dataAssemblyOptionsArray }; - return peaOptions; } /** - * create DataAssemblyOptionsArray and ServiceOptionsArray, which are neccessary for PEAOptions + * create DataAssemblyOptionsArray and ServiceOptionsArray, which are necessary for PEAOptions * @param peaModel{PEAModel} * @private - * @return {PiMAdParserInterface} + * @return {PEAOptionsParserInterface} */ - private static createOptionsArrays(peaModel: PEAModel): PiMAdParserInterface { + private static createOptionsArrays(peaModel: PEAModel): PEAOptionsParserInterface { const dataAssemblyOptionsArray = this.createDataAssemblyOptionsArray(peaModel.dataAssemblies); const servicesOptionsArray = this.createServiceOptionsArray(peaModel.services); return {dataAssemblyOptionsArray: dataAssemblyOptionsArray, serviceOptionsArray: servicesOptionsArray}; @@ -64,23 +79,23 @@ export class PiMAdParser { private static createDataAssemblyOptionsArray(dataAssemblyModels: DataAssemblyModel[]): DataAssemblyOptions[]{ const dataAssemblyOptionsArray: DataAssemblyOptions[]=[]; dataAssemblyModels.forEach(dataAssemblyModel => { - const dataAssemblyOptions = PiMAdParser.createDataAssemblyOptions(dataAssemblyModel); + const dataAssemblyOptions = PEAOptionsParser.createDataAssemblyOptions(dataAssemblyModel); dataAssemblyOptionsArray.push(dataAssemblyOptions); }); return(dataAssemblyOptionsArray); } /** - * @param dataAssemblyModels {ServiceModelModel[]} * @return {ServiceOptions[]} * @private + * @param serviceModels */ private static createServiceOptionsArray(serviceModels: ServiceModel[]): ServiceOptions[]{ const servicesOptionsArray: ServiceOptions[] = []; serviceModels.forEach(serviceModel=> { const procedureOptionsArray = this.createProcedureOptionsArray(serviceModel.procedures); - const serviceDataAssemblyOptions = PiMAdParser.createDataAssemblyOptions(serviceModel.dataAssembly as DataAssemblyModel); - const parameters = PiMAdParser.createDataAssemblyOptionsArray(serviceModel.parameters); + const serviceDataAssemblyOptions = PEAOptionsParser.createDataAssemblyOptions(serviceModel.dataAssembly as DataAssemblyModel); + const parameters = PEAOptionsParser.createDataAssemblyOptionsArray(serviceModel.parameters); const serviceOptions: ServiceOptions = { name: serviceModel.name, @@ -95,16 +110,19 @@ export class PiMAdParser { } /** - * @param dataAssemblyModels {DataAssemblyModel[]} * @return {DataAssemblyOptions[]} * @private + * @param procedureModels */ private static createProcedureOptionsArray(procedureModels: ProcedureModel[]): ProcedureOptions[] { const procedureOptionsArray: ProcedureOptions[] = []; procedureModels.forEach(procedure =>{ const procedureName = procedure.name; - let isDefault: any, isSelfCompleting: any, procedureID=''; - procedure.attributes.forEach((attribute: { name: any; value: string}) =>{ + let isDefault = false; + let isSelfCompleting = false; + let procedureID = ''; + + procedure.attributes.forEach((attribute: { name: string; value: string}) =>{ switch(attribute.name){ case ('IsSelfCompleting'): isSelfCompleting = JSON.parse(attribute.value.toLocaleLowerCase()); @@ -119,18 +137,18 @@ export class PiMAdParser { }); //healthstateview - const procedureDataAssemblyOptions = [PiMAdParser.createDataAssemblyOptions(procedure.dataAssembly as DataAssemblyModel)]; + const procedureDataAssemblyOptions = [PEAOptionsParser.createDataAssemblyOptions(procedure.dataAssembly as DataAssemblyModel)]; - const procedureParameters = PiMAdParser.createDataAssemblyOptionsArray(procedure.parameters); - const reportValues = PiMAdParser.createDataAssemblyOptionsArray(procedure.reportValues); - const processValuesIn = PiMAdParser.createDataAssemblyOptionsArray(procedure.processValuesIn); - const processValuesOut = PiMAdParser.createDataAssemblyOptionsArray(procedure.processValuesOut); + const procedureParameters = PEAOptionsParser.createDataAssemblyOptionsArray(procedure.parameters); + const reportValues = PEAOptionsParser.createDataAssemblyOptionsArray(procedure.reportValues); + const processValuesIn = PEAOptionsParser.createDataAssemblyOptionsArray(procedure.processValuesIn); + const processValuesOut = PEAOptionsParser.createDataAssemblyOptionsArray(procedure.processValuesOut); const procedureOptions: ProcedureOptions = { id: procedureID, name: procedureName, - isDefault : isDefault as boolean, - isSelfCompleting: isSelfCompleting as boolean, + isDefault : isDefault, + isSelfCompleting: isSelfCompleting, dataAssembly: procedureDataAssemblyOptions, parameters: procedureParameters, reportParameters: reportValues, @@ -153,7 +171,7 @@ export class PiMAdParser { // Initializing baseDataAssemblyOptions, which will be filled during an iteration below const baseDataAssemblyOptions: { - [k: string]: any; + [k: string]: unknown; TagName: string; TagDescription: string; } = @@ -167,33 +185,30 @@ export class PiMAdParser { const dataAssemblyInterfaceClass= dataAssemblyModel.metaModelRef; const dataItems = dataAssemblyModel.dataItems; dataItems.map((dataItem: DataItemModel)=>{ - // Initializing variables, which will be assigned later + // Initializing dataAssemblies, which will be assigned later let namespaceIndex ='', nodeId='', value: undefined | string; const dataType=dataItem.dataType; const cIData = dataItem.cIData; if(cIData){ //dynamic nodeId= cIData.nodeId.identifier; namespaceIndex = cIData.nodeId.namespaceIndex; - // namespaceIndex = namespaceUrl; // for testing - const opcUaNodeOptions: OpcUaNodeOptions = { + // namespaceIndex = namespaceUri; // for testing + baseDataAssemblyOptions[dataItem.name as string] = { nodeId: nodeId, namespaceIndex: namespaceIndex, dataType: dataType, }; - baseDataAssemblyOptions[dataItem.name as string] = opcUaNodeOptions; } else { // static value = dataItem.value; baseDataAssemblyOptions[dataItem.name as string] = value; } }); - - // create dataAssemblyOptions with information collected above - const dataAssemblyOptions = { - name: dataAssemblyName, - metaModelRef: dataAssemblyInterfaceClass, - dataItems: baseDataAssemblyOptions - }; - return dataAssemblyOptions; + + return { + name: dataAssemblyName, + metaModelRef: dataAssemblyInterfaceClass, + dataItems: baseDataAssemblyOptions + }; } } diff --git a/src/peaProvider/PEAOptionsParser/PEAOptionsParserSequence.puml b/src/peaProvider/PEAOptionsParser/PEAOptionsParserSequence.puml new file mode 100644 index 00000000..3d86963d --- /dev/null +++ b/src/peaProvider/PEAOptionsParser/PEAOptionsParserSequence.puml @@ -0,0 +1,42 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@startuml + +skinparam monochrome false + +participant ModularPlantManager +participant PEAOptionsParser + +ModularPlantManager -> PEAOptionsParser: PEAOptionsParser.createPEAOptions(...) + +PEAOptionsParser ->ModularPlantManager: getPEAfromPimadPool() +ModularPlantManager->PEAOptionsParser: PEAModel +PEAOptionsParser->PEAOptionsParser: createOptionsArrays using PEAModel + +PEAOptionsParser->PEAOptionsParser: create PEAOptions +PEAOptionsParser ->ModularPlantManager: PEAOptions + +@enduml diff --git a/src/peaProvider/PEAProvider.spec.ts b/src/peaProvider/PEAProvider.spec.ts new file mode 100644 index 00000000..662f4777 --- /dev/null +++ b/src/peaProvider/PEAProvider.spec.ts @@ -0,0 +1,100 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import 'mocha'; +import {PEAProvider} from './PEAProvider'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('PEAProvider', async () => { + + const peaProvider = new PEAProvider(); + let testPeaIdentifier = ''; + + it('getAllPEAsFromPEAPool()', async () => { + expect(peaProvider.getAllPEAsFromPEAPool()).to.not.be.rejected; + }); + + it('getAllPEAsFromPEAPool(), empty', async () => { + const peaProvider = new PEAProvider(); + return expect(peaProvider.getAllPEAsFromPEAPool()).to.be.empty; + }); + + it('addPEAToPool() fails', async () => { + expect(peaProvider.addPEAToPool({source: 'tests/a.zip'})).to.be.rejected; + }); + + it('addPEAToPool()', async () => { + const peaModel = await peaProvider.addPEAToPool({source: 'tests/testpea.zip'}); + expect(peaModel).to.not.be.undefined; + testPeaIdentifier = peaModel.pimadIdentifier; + }); + + it('getPEAControllerOptionsByPEAIdentifier() to fail with empty identifier', async () => { + expect(peaProvider.getPEAControllerOptionsByPEAIdentifier('')).to.be.rejected; + }); + + it('getPEAControllerOptionsByPEAIdentifier() to fail with invalid identifier', async () => { + expect(peaProvider.getPEAControllerOptionsByPEAIdentifier('qwer1234')).to.be.rejected; + }); + + it('getPEAControllerOptionsByPEAIdentifier()', async () => { + expect(peaProvider.getPEAControllerOptionsByPEAIdentifier(testPeaIdentifier)).to.not.be.rejected; + }); + + it('deletePEAFromPEAPool() to fail with invalid identifier', async () => { + expect(peaProvider.deletePEAFromPEAPool('qwer1234')).to.not.throw; + }); + + it('deletePEAFromPEAPool() to fail with empty identifier', async () => { + expect(peaProvider.deletePEAFromPEAPool('')).to.be.rejected; + }); + + it('deletePEAFromPEAPool()', async () => { + let result; + await peaProvider.getAllPEAsFromPEAPool().then(value => result = value); + expect(result).to.be.an.instanceof(Array); + expect(result).to.have.lengthOf(1); + expect(peaProvider.deletePEAFromPEAPool(testPeaIdentifier)).to.not.throw; + expect(peaProvider.getAllPEAsFromPEAPool()).to.be.empty; + expect(peaProvider.deletePEAFromPEAPool(testPeaIdentifier)).to.be.rejected; + }); + + it('deleteAllPEAsFromPEAPool()', async () => { + expect(peaProvider.getAllPEAsFromPEAPool()).to.be.empty; + await peaProvider.addPEAToPool({source: 'tests/testpea.zip'}); + await peaProvider.addPEAToPool({source: 'tests/testpea.zip'}); + let result; + await peaProvider.getAllPEAsFromPEAPool().then(value => result = value); + expect(result).to.be.an.instanceof(Array); + expect(result).to.have.lengthOf(2); + expect(peaProvider.deleteAllPEAsFromPEAPool()).to.not.throw; + expect(peaProvider.getAllPEAsFromPEAPool()).to.be.empty; + }); + +}); diff --git a/src/peaProvider/PEAProvider.ts b/src/peaProvider/PEAProvider.ts new file mode 100644 index 00000000..1c88fd07 --- /dev/null +++ b/src/peaProvider/PEAProvider.ts @@ -0,0 +1,141 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {PEAModel, PEAOptions} from '@p2olab/polaris-interface'; +import {Backbone, PEAPool, PEAPoolVendor,} from '@p2olab/pimad-core'; +import {PEAOptionsParser} from './PEAOptionsParser/PEAOptionsParser'; +import PiMAdResponse = Backbone.PiMAdResponse; + + +export interface LoadOptions { + pea?: PEAOptions; + peas?: PEAOptions[]; + subMP?: Array<{ peas: PEAOptions[] }>; +} + +export class PEAProvider { + + public peaPool: PEAPool; + + constructor() { + this.peaPool = new PEAPoolVendor().buyDependencyPEAPool(); + this.peaPool.initializeMTPFreeze202001Importer(); + } + + /** + * Get PEAController from PEA-Pool by given identifier + * @param identifier Identifier + */ + public getPEAFromPEAPool(identifier: string): Promise{ + return new Promise((resolve,reject) => { + this.peaPool.getPEA(identifier, (response: PiMAdResponse) => { + if(response.getMessage()=='Success!') { + const peaModel = response.getContent() as PEAModel; + resolve(peaModel); + } else { + reject(new Error(response.getMessage())); + } + }); + }); + } + + /** + * Delete PEAController from PEA-Pool by given PEA-Identifier + * @param identifier PEA-Identifier + */ + public deletePEAFromPEAPool(identifier: string): Promise { + return new Promise((resolve,reject)=> { + this.peaPool.deletePEA(identifier,(response: PiMAdResponse) => { + if(response.getMessage()=='Success!') { + resolve(); + } + else { + reject(new Error(response.getMessage())); + } + }); + }); + } + + /** + * Delete PEAController from PEA-Pool by given PEA-Identifier + */ + public async deleteAllPEAsFromPEAPool(): Promise { + const peaModels = await this.getAllPEAsFromPEAPool(); + const tasks = peaModels.map((peaModel) => new Promise((resolve) => { + this.deletePEAFromPEAPool(peaModel.pimadIdentifier).then(resolve); + }) + ); + return Promise.all(tasks); + } + + /** + * Get all PEAs from PEA-Pool + * @return {Promise} + */ + public async getAllPEAsFromPEAPool(): Promise{ + return new Promise((resolve, reject)=>{ + this.peaPool.getAllPEAs((response: PiMAdResponse) => { + if(response.getMessage()=='Success!') resolve(response.getContent() as PEAModel[]); + else reject(new Error((response.getMessage()))); + }); + }); + } + + /** + * add PEA to PEAPool by given filepath + * @param filePath - filepath of the uploaded file in /uploads + */ + public addPEAToPool(filePath: { source: string}): Promise{ + return new Promise((resolve, reject)=>{ + this.peaPool.addPEA(filePath, (response: PiMAdResponse) => { + if(response.getMessage() == 'Success!') resolve(response.getContent() as PEAModel); + else reject(new Error(response.getMessage())); + }); + }); + } + + /** + * Get PEAControllerOptions of PEA identified by given identifier + * @param {string} identifier + */ + public async getPEAControllerOptionsByPEAIdentifier(identifier: string): Promise{ + if (!identifier) { + throw new Error(`PEA with identifier [${identifier}] not found.`); + } + const model = await this.getPEAFromPEAPool(identifier); + return await PEAOptionsParser.createPEAOptions(model); + } + + /** + * Get PEAControllerOptions of provided PEA-Model + * @param {PEAModel} model + */ + public async getPEAControllerOptionsByProvidedPEAModel(model: PEAModel): Promise{ + if (!model) { + throw new Error('No valid model provided!'); + } + return await PEAOptionsParser.createPEAOptions(model); + } +} diff --git a/src/server/Middleware.puml b/src/server/Middleware.puml index 8f3f28cd..e917590b 100644 --- a/src/server/Middleware.puml +++ b/src/server/Middleware.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/server/Routes.puml b/src/server/Routes.puml index ee32ca70..e9cd6087 100644 --- a/src/server/Routes.puml +++ b/src/server/Routes.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/server/externalTrigger/ExternalTrigger.puml b/src/server/externalTrigger/ExternalTrigger.puml index 48880780..a8dda6d1 100644 --- a/src/server/externalTrigger/ExternalTrigger.puml +++ b/src/server/externalTrigger/ExternalTrigger.puml @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + @startuml 'https://plantuml.com/class-diagram diff --git a/src/server/externalTrigger/ExternalTrigger.spec.ts b/src/server/externalTrigger/ExternalTrigger.spec.ts index 4ae973f6..c2c8286f 100644 --- a/src/server/externalTrigger/ExternalTrigger.spec.ts +++ b/src/server/externalTrigger/ExternalTrigger.spec.ts @@ -62,7 +62,7 @@ describe('ExternalTrigger', () => { it('should work with the sample server', async () => { let et: ExternalTrigger; - await new Promise( (resolve) => { + await new Promise( (resolve) => { et = new ExternalTrigger('opc.tcp://localhost:4334/Ua/MyLittleServer', 'ns=1;s=trigger', resolve); et.startMonitoring(); diff --git a/src/server/externalTrigger/ExternalTrigger.ts b/src/server/externalTrigger/ExternalTrigger.ts index d621553b..a04e6b7f 100644 --- a/src/server/externalTrigger/ExternalTrigger.ts +++ b/src/server/externalTrigger/ExternalTrigger.ts @@ -55,8 +55,7 @@ export class ExternalTrigger { this.nodeId = resolveNodeId(nodeId); this.callback = callback; this.client = OPCUAClient.create({ - // eslint-disable-next-line @typescript-eslint/camelcase - endpoint_must_exist: false, + endpointMustExist: false, connectionStrategy: { maxRetry: 5 } diff --git a/src/server/index.ts b/src/server/index.ts index cea1bc15..92956591 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './externalTrigger/ExternalTrigger'; export * from './middleware'; export * from './routes'; diff --git a/src/server/router/index.ts b/src/server/router/index.ts index 3bf94be7..500ba46d 100644 --- a/src/server/router/index.ts +++ b/src/server/router/index.ts @@ -1,3 +1,28 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + export * from './modularPlantManagerRouter'; export * from './peaRouter/peaRouter'; export * from './recipeRouter/playerRouter'; diff --git a/src/server/router/modularPlantManagerRouter.spec.ts b/src/server/router/modularPlantManagerRouter.spec.ts index 976af6ca..afc8b70c 100644 --- a/src/server/router/modularPlantManagerRouter.spec.ts +++ b/src/server/router/modularPlantManagerRouter.spec.ts @@ -44,7 +44,7 @@ describe('ModularPlantMangerRoutes', () => { await appServer.stop(); }); - context('#modularPlantManger', () => { + context('ModularPlantManger', () => { it('should allow interacting with all peas within MP', async () => { await request(app).post('/api/abortAllServices') @@ -129,10 +129,14 @@ describe('ModularPlantMangerRoutes', () => { }); - it('should provide version', (done) => { - request(app).get('/api/version') - .expect('Content-Type', /json/) - .expect(200, done); + context('version', () => { + + it('should provide version', (done) => { + request(app).get('/api/version') + .expect('Content-Type', /json/) + .expect(200, done); + }); + }); context('logs', () => { @@ -161,14 +165,14 @@ describe('ModularPlantMangerRoutes', () => { .expect(200, done); }); - it('should provide variables logs', (done) => { - request(app).get('/api/logs/variables') + it('should provide dataAssemblies logs', (done) => { + request(app).get('/api/logs/dataAssemblies') .expect('Content-Type', /json/) .expect(200, done); }); it('should provide service logs 2', (done) => { - request(app).get('/api/logs/variables.json') + request(app).get('/api/logs/dataAssemblies.json') .expect('Content-Type', /json/) .expect(200, done); }); diff --git a/src/server/router/modularPlantManagerRouter.ts b/src/server/router/modularPlantManagerRouter.ts index 216aea34..60a62069 100644 --- a/src/server/router/modularPlantManagerRouter.ts +++ b/src/server/router/modularPlantManagerRouter.ts @@ -35,10 +35,12 @@ import {recipeRunRouter} from './recipeRouter/recipeRunRouter'; import {recipeRouter} from './recipeRouter/recipeRouter'; import {playerRouter} from './recipeRouter/playerRouter'; import {polServiceRouter} from './polServiceRouter/polServiceRouter'; +import {pimadRouter} from './pimadRouter/pimadRouter'; export const modularPlantManagerRouter: Router = Router(); modularPlantManagerRouter.use('/pea', peaRouter); +modularPlantManagerRouter.use('/pimad', pimadRouter); modularPlantManagerRouter.use('/polService', polServiceRouter); modularPlantManagerRouter.use('/recipeRun', recipeRunRouter); modularPlantManagerRouter.use('/recipe', recipeRouter); @@ -71,7 +73,7 @@ modularPlantManagerRouter.get('/version', (req: Request, res: Response) => { */ modularPlantManagerRouter.get('/autoReset', asyncHandler(async (req: Request, res: Response) => { const manager: ModularPlantManager = req.app.get('manager'); - res.json({autoReset: manager.autoreset}); + res.json({autoReset: manager.autoReset}); })); /** @@ -83,12 +85,12 @@ modularPlantManagerRouter.get('/autoReset', asyncHandler(async (req: Request, re */ modularPlantManagerRouter.post('/autoReset', asyncHandler(async (req: Request, res: Response) => { const manager: ModularPlantManager = req.app.get('manager'); - manager.autoreset = yn(req.body.autoReset, {default: false}); - res.json({autoReset: manager.autoreset}); + manager.autoReset = yn(req.body.autoReset, {default: false}); + res.json({autoReset: manager.autoReset}); })); /** - * @api {post} /abort Abort all services + * @api {post} /abortAllServices Abort all services * @apiName AbortAllServices * @apiDescription Abort all services from all PEAs * @apiGroup ModularPlantManager @@ -100,7 +102,7 @@ modularPlantManagerRouter.post('/abortAllServices', asyncHandler(async (req: Req })); /** - * @api {post} /stop Stop all services + * @api {post} /stopAllServices Stop all services * @apiName StopAllServices * @apiDescription Abort all services from all PEAs * @apiGroup ModularPlantManager @@ -134,11 +136,11 @@ modularPlantManagerRouter.get('/logs(.json)?', asyncHandler(async (req: Request, })); /** - * @api {get} /logs/variables Get variable logs + * @api {get} /logs/dataAssemblies Get variable logs * @apiName GetVariableLogs * @apiGroup ModularPlantManager */ -modularPlantManagerRouter.get('/logs/variables(.json)?', asyncHandler(async (req: Request, res: Response) => { +modularPlantManagerRouter.get('/logs/dataAssemblies(.json)?', asyncHandler(async (req: Request, res: Response) => { const manager: ModularPlantManager = req.app.get('manager'); res.contentType('application/json').attachment() .send(JSON.stringify(manager.variableArchive.slice(-1000), null, 2)); diff --git a/src/server/router/peaRouter/peaRouter.spec.ts b/src/server/router/peaRouter/peaRouter.spec.ts index d6c57658..36a0426f 100644 --- a/src/server/router/peaRouter/peaRouter.spec.ts +++ b/src/server/router/peaRouter/peaRouter.spec.ts @@ -23,23 +23,18 @@ * SOFTWARE. */ -import {BackendNotification, PEAOptions, ServerSettingsOptions} from '@p2olab/polaris-interface'; -import {ModularPlantManager, PEAController} from '../../../modularPlantManager'; +import {PEAOptions} from '@p2olab/polaris-interface'; +import {ModularPlantManager, OpcUaConnectionSettings, PEAController} from '../../../modularPlantManager'; import {Server} from '../../server'; import {Application} from 'express'; -import * as WebSocket from 'ws'; import {MockupServer} from '../../../modularPlantManager/_utils'; -import path = require('path'); import {AnaViewMockup} from '../../../modularPlantManager/pea/dataAssembly/indicatorElement/AnaView/AnaView.mockup'; -import {Namespace, UAObject} from 'node-opcua'; -import {namespaceUrl, setNamespaceUrl} from '../../../../tests/namespaceUrl'; -import * as peaOptions from '../../../../tests/peaOptions.json'; -import {ServiceControlMockup} from '../../../modularPlantManager/pea/dataAssembly/ServiceControl/ServiceControl.mockup'; +import * as peaOptions from '../../../modularPlantManager/peaOptions.spec.json'; +import {ServiceControlMockup} from '../../../modularPlantManager/pea/dataAssembly/serviceControl/ServiceControl.mockup'; import {expect} from 'chai'; import {AnaServParamMockup} from '../../../modularPlantManager/pea/dataAssembly/operationElement/servParam/anaServParam/AnaServParam.mockup'; -import {AnaProcessValueInMockup} from '../../../modularPlantManager/pea/dataAssembly/inputElement/processValueIn/AnaProcessValueIn/AnaProcessValueIn.mockup'; -import * as peaOptionsServices from '../../../../tests/peaOptions_testservice.json'; +import * as peaOptionsServices from '../../../modularPlantManager/peaOptions_testservice.spec.json'; describe('PEARoutes', () => { @@ -72,17 +67,17 @@ describe('PEARoutes', () => { //if (mockupServer) await mockupServer.shutdown(); }); - context('/api/pea', () => { - it('should provide empty peas array', async () => { - await request(app).get('/api/pea') + context('/api/pea/allPEAs', () => { + it('should provide empty array of PEAs', async () => { + await request(app).get('/api/pea/allPEAs') .expect('Content-Type', /json/) .expect(200) .expect([]); }); - it('should provide not empty peas array', async () => { + it('should provide pea array containing one PEA', async () => { const peaController = new PEAController(peaOptionsDummy); manager.peas.push(peaController); - await request(app).get('/api/pea') + await request(app).get('/api/pea/allPEAs') .expect('Content-Type', /json/) .expect(200) .expect([{ @@ -96,7 +91,7 @@ describe('PEARoutes', () => { it('should get pea', async () => { const peaController = new PEAController(peaOptionsDummy); manager.peas.push(peaController); - await request(app).get('/api/pea/test') + await request(app).get(`/api/pea/${peaController.id}`) .expect(200) .expect({ name: 'test', id: 'test', pimadIdentifier: 'test', description: '', endpoint: 'localhost', @@ -114,7 +109,7 @@ describe('PEARoutes', () => { it('should provide download for existing pea', async () => { const peaController = new PEAController(peaOptionsDummy); manager.peas.push(peaController); - await request(app).get('/api/pea/test/download') + await request(app).get(`/api/pea/${peaController.id}/download`) .expect(200) .expect(peaController.options); }); @@ -124,54 +119,6 @@ describe('PEARoutes', () => { }); }); - context('/addByPiMAd', () => { - it('should work with test file', async () => { - await request(app).post('/api/pea/addByPiMAd') - .attach('uploadedFile', path.resolve('tests/testpea.zip')) - .expect(200); - }); - it('should fail, wrong file type', async () => { - await request(app).post('/api/pea/addByPiMAd') - .attach('uploadedFile', path.resolve('tests/anamon.json')) - .expect(500) - .expect(/Error: Unknown source type /); - }); - it('should fail, file does not exist', async () => { - //TODO - }); - }); - - context('/PiMAdPEAs', () => { - it('should work, empty pool', async () => { - await request(app).get('/api/pea/PiMAdPEAs') - .expect(200) - .expect([]); - }); - it('should work with not empty pool', async () => { - await manager.addPEAToPimadPool({source: 'tests/testpea.zip'}); - await request(app).get('/api/pea/PiMAdPEAs') - .expect(200); - }); - it('should fail', async () => { - const pimadpool =(manager.pimadPool as any) = null; - await request(app).get('/api/pea/PiMAdPEAs').expect(500); - }); - }); - - context('delete, /PiMAd/:pimadId', () => { - it('should work', async () => { - const pimadPEA= await manager.addPEAToPimadPool({source: 'tests/testpea.zip'}); //TODO maybe use a lighter file - await request(app).delete('/api/pea/PiMAd/'+pimadPEA.pimadIdentifier) - .expect(200) - .expect(/Successfully deleted PiMAd-PEA/); - }); - it('should fail', async () => { - await request(app).delete('/api/pea/PiMAd/abc1234') - .expect(500) - .expect(/Error: PEA not found/); - }); - - }); context('/api/pea/loadPEA', () => { it('should fail while loading pea without content', async () => { @@ -181,84 +128,85 @@ describe('PEARoutes', () => { .expect('Error: No valid PiMAd Identifier'); }); it('should load PEAController', async () => { - const peaModel = await manager.addPEAToPimadPool({source: 'tests/testpea.zip'}); - const pimadIdentifier = peaModel.pimadIdentifier; + const peaModel = await manager.peaProvider.addPEAToPool({source: 'tests/testpea.zip'}); + const identifier = peaModel.pimadIdentifier; await request(app).post('/api/pea/loadPEA') - .send({id: pimadIdentifier}) + .send({id: identifier}) .expect(200); }); }); - context('Server Settings', () => { - it('should get server settings', async () => { + context('Connection Settings', () => { + it('should get connection settings', async () => { const peaController: PEAController = new PEAController(peaOptionsDummy); manager.peas.push(peaController); - await request(app).get('/api/pea/test/getServerSettings') + await request(app).get(`/api/pea/${peaController.id}/getConnectionSettings`) .expect(200) - .expect({ serverUrl: 'localhost', username: 'admin', password: '1234' }); + .expect({endpointUrl: 'localhost', securityPolicy: 'None', securityMode: 'None', userIdentityInfo: 'Anonymous'}); }); - it('getServerSetting should fail , wrong peaId', async () => { - await request(app).get('/api/pea/wrongId/getServerSettings') + + it('getConnectionSettings should fail with invalid peaId', async () => { + await request(app).get('/api/pea/xyz/getConnectionSettings') .expect(500) - .expect(/Error: PEA with id wrongId not found/); + .expect(/Error: PEA with id xyz not found/); }); - it('should update server settings', async () => { + it('should update connection settings', async () => { const peaController: PEAController = new PEAController(peaOptionsDummy); manager.peas.push(peaController); - const options: ServerSettingsOptions = {username: 'peter', password: '5678', serverUrl: 'localhost:4334', id: 'test' }; - await request(app).post('/api/pea/updateServerSettings') + await request(app).get(`/api/pea/${peaController.id}/getConnectionSettings`) + .expect(200) + .expect({endpointUrl: 'localhost', securityPolicy: 'None', securityMode: 'None', userIdentityInfo: 'Anonymous'}); + + const options: OpcUaConnectionSettings = {endpoint: 'localhost:4334'}; + await request(app).post(`/api/pea/${peaController.id}/updateConnectionSettings`) .send(options) .expect(200) - .expect(/Successfully updated the server settings!/); + .expect(/Successfully updated the connection settings!/); + + await request(app).get(`/api/pea/${peaController.id}/getConnectionSettings`) + .expect(200) + .expect({endpointUrl: 'localhost:4334', securityPolicy: 'None', securityMode: 'None', userIdentityInfo: 'Anonymous'}); }); - it('updateServerSettings should fail, wrong peaId', async () => { - const options: ServerSettingsOptions = {username: 'peter', password: '5678', serverUrl: 'localhost:4334', id: 'wrongId' }; - await request(app).post('/api/pea/updateServerSettings') + + it('updateServerSettings should fail with invalid peaId', async () => { + const options: OpcUaConnectionSettings = {endpoint: 'localhost:4334'}; + await request(app).post('/api/pea/xyz/updateConnectionSettings') .send(options) .expect(500) - .expect(/Error: PEA with id wrongId not found/); + .expect(/Error: PEA with id xyz not found/); }); }); describe('with Mockup', () => { - //set namespaceUrl in peaOptions - setNamespaceUrl(peaOptions as any); + before(async () => { mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockup = new AnaViewMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Variable'); - const mockupService = new ServiceControlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'Trigonometry'); + new AnaViewMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Variable'); + new ServiceControlMockup(mockupServer.nameSpace, mockupServer.rootObject, 'Trigonometry'); await mockupServer.start(); }); + after(async () => { await mockupServer.shutdown(); }); context('connect', ()=>{ it('should connect and disconnect, AnaView & Service', async() => { - const peaController = new PEAController(peaOptions as unknown as PEAOptions, false); + const peaController = new PEAController(peaOptions as unknown as PEAOptions); manager.peas.push(peaController); - await request(app).post('/api/pea/test/connect').send().expect(200) + await request(app).post(`/api/pea/${peaController.id}/connect`).send().expect(200) .expect({peaId:'test',status:'Successfully connected'}); - await request(app).post('/api/pea/test/disconnect').send().expect(200) + await request(app).post(`/api/pea/${peaController.id}/disconnect`).send().expect(200) .expect({peaId:'test',status:'Successfully disconnected'}); - /* // wait until first update of state via websocket - const ws = new WebSocket('ws:/localhost:3000'); - await new Promise((resolve) => ws.on('message', function incoming(msg) { - const data: BackendNotification = JSON.parse(msg.toString()); - if (data.message === 'service' && data.service.status) { - ws.removeListener('message', incoming); - resolve(); - } - }));*/ }).timeout(4000); + it('should fail to connect, wrong peaId', async() => { await request(app).post('/api/pea/abc1234/connect').send().expect(500) .expect('Error: PEA with id abc1234 not found'); }); + it('should fail to disconnect, wrong peaId', async() => { await request(app).post('/api/pea/abc1234/disconnect').send().expect(500) .expect('Error: PEA with id abc1234 not found'); @@ -267,14 +215,15 @@ describe('PEARoutes', () => { context('delete PEA', ()=>{ it('delete', async() => { - const peaController = new PEAController(peaOptions as unknown as PEAOptions, false); + const peaController = new PEAController(peaOptions as unknown as PEAOptions); manager.peas.push(peaController); - await request(app).delete('/api/pea/test') + await request(app).delete(`/api/pea/${peaController.id}`) .expect(200) .expect({peaId:'test',status:'Successfully deleted'}); expect(manager.peas.length).to.equal(0); }); - it('delete to fail, wrong id', async() => { + + it('delete to fail, wrong peaId', async() => { await request(app).delete('/api/pea/abc1234') .expect(500) .expect('Error: PEA with id abc1234 not found'); @@ -284,9 +233,9 @@ describe('PEARoutes', () => { context('/:peaId/service/:serviceName', ()=> { it('should get service', async() => { //connect first - const peaController = new PEAController(peaOptions as unknown as PEAOptions, false); + const peaController = new PEAController(peaOptions as unknown as PEAOptions); manager.peas.push(peaController); - await request(app).get('/api/pea/test/service/Trigonometry').send().expect(200); + await request(app).get(`/api/pea/${peaController.id}/service/Trigonometry`).send().expect(200); }); it('should fail to get service, wrong pea id', async() => { await request(app).get('/api/pea/abc1234/service/Trigonometry') @@ -295,25 +244,25 @@ describe('PEARoutes', () => { .expect('Error: PEA with id abc1234 not found'); }); it('should fail to get service, wrong pea id', async() => { - const peaController = new PEAController(peaOptionsDummy, false); + const peaController = new PEAController(peaOptionsDummy); manager.peas.push(peaController); - await request(app).get('/api/pea/test/service/Trigonometry') + await request(app).get(`/api/pea/${peaController.id}/service/Trigonometry`) .send() .expect(500) - .expect('Error: [test] Could not find service with name Trigonometry'); + .expect(`Error: [${peaController.id}] Could not find service with name Trigonometry`); }); }); context('/:peaId/service/:serviceName/:command', ()=> { it('should send command', async () => { //connect first - const peaController = new PEAController(peaOptions as unknown as PEAOptions, false); + const peaController = new PEAController(peaOptions as unknown as PEAOptions); manager.peas.push(peaController); - await request(app).post('/api/pea/test/connect').send().expect(200) + await request(app).post(`/api/pea/${peaController.id}/connect`).send().expect(200) .expect({peaId: 'test', status: 'Successfully connected'}); - await request(app).post('/api/pea/test/service/Trigonometry/start').send().expect(200); + await request(app).post(`/api/pea/${peaController.id}/service/Trigonometry/start`).send().expect(200); - await request(app).post('/api/pea/test/disconnect').send().expect(200) + await request(app).post(`/api/pea/${peaController.id}/disconnect`).send().expect(200) .expect({peaId:'test',status:'Successfully disconnected'}); }); @@ -323,55 +272,53 @@ describe('PEARoutes', () => { }); it('should fail to send command, service not found', async () => { - const peaController = new PEAController(peaOptionsDummy, false); + const peaController = new PEAController(peaOptionsDummy); manager.peas.push(peaController); - await request(app).post('/api/pea/test/service/Trigonometry/start').send().expect(500) - .expect('Error: [test] Could not find service with name Trigonometry'); + await request(app).post(`/api/pea/${peaController.id}/service/Trigonometry/start`).send().expect(500) + .expect(`Error: [${peaController.id}] Could not find service with name Trigonometry`); }); }); }); context('/:peaId/service/:serviceName', ()=> { - //set namespaceUrl - setNamespaceUrl(peaOptionsServices as any); - it('should fail, wrong peaId', async () => { + it('should fail with unknown PEA identifier', async () => { await request(app).post('/api/pea/abc1234/service/Trigonometry').send().expect(500) .expect(/Error: PEA with id abc1234 not found/); }); it('should fail , service not found', async () => { - const peaController = new PEAController(peaOptionsDummy, false); + const peaController = new PEAController(peaOptionsDummy); manager.peas.push(peaController); - await request(app).post('/api/pea/test/service/Trigonometry').send().expect(500) - .expect('"Error: [test] Could not find service with name Trigonometry"'); + await request(app).post(`/api/pea/${peaController.id}/service/Trigonometry`).send().expect(500) + .expect(`"Error: [${peaController.id}] Could not find service with name Trigonometry"`); }); + it('should fail, could not find procedure', async () => { - const peaController = new PEAController(peaOptions as unknown as PEAOptions, false); + const peaController = new PEAController(peaOptions as unknown as PEAOptions); manager.peas.push(peaController); - await request(app).post('/api/pea/test/service/Trigonometry').send().expect(500) + await request(app).post(`/api/pea/${peaController.id}/service/Trigonometry`).send().expect(500) .send({procedure:'test'}) .expect('"Error: Could not find Procedure by Name or Default."'); }); + it('should set parameter', async () => { const mockupServer = new MockupServer(); await mockupServer.initialize(); - const mockupParam = new AnaServParamMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'TestService.AnaProcParam_TestService_factor'); - const mockupService = new ServiceControlMockup(mockupServer.namespace as Namespace, - mockupServer.rootComponent as UAObject, 'TestService'); + new AnaServParamMockup(mockupServer.nameSpace, mockupServer.rootObject, 'TestService.AnaProcParam_TestService_factor'); + new ServiceControlMockup(mockupServer.nameSpace, mockupServer.rootObject, 'TestService'); await mockupServer.start(); const pea = new PEAController(peaOptionsServices as unknown as PEAOptions); manager.peas.push(pea); await pea.connectAndSubscribe(); - await request(app).post('/api/pea/test/service/TestService/start').send().expect(200); + await request(app).post(`/api/pea/${pea.id}/service/TestService/start`).send().expect(200); - const response = await request(app).post('/api/pea/test/service/TestService').send().expect(200) + await request(app).post(`/api/pea/${pea.id}/service/TestService`).send().expect(200) .send({procedure:'TestService_default', parameters: [{name: 'AnaProcParam_TestService_factor', value: 5}]}); await pea.disconnectAndUnsubscribe(); await mockupServer.shutdown(); - }).timeout(10000); + }).timeout(1500000); }); }); diff --git a/src/server/router/peaRouter/peaRouter.ts b/src/server/router/peaRouter/peaRouter.ts index 1bf27437..bc4d4d67 100644 --- a/src/server/router/peaRouter/peaRouter.ts +++ b/src/server/router/peaRouter/peaRouter.ts @@ -23,44 +23,20 @@ * SOFTWARE. */ -import {ModularPlantManager, ServiceState} from '../../../modularPlantManager'; +import {ModularPlantManager} from '../../../modularPlantManager'; import {Request, Response, Router} from 'express'; import * as asyncHandler from 'express-async-handler'; import {constants} from 'http2'; import {ServiceCommand} from '@p2olab/polaris-interface'; import {catServer} from '../../../logging'; -import * as path from 'path'; export const peaRouter: Router = Router(); -// TODO: Place this code somewhere else? -// set up Multer for parsing uploaded file -const fs = require('fs'); -const multer = require('multer'); -// create uploads directory -if (fs.existsSync('uploads/')) { - // delete uploads folder, because it could contain files, which haven't been deleted successfully due to crash - fs.rmdirSync('uploads/', {recursive: true}); -}// create new uploads folder -fs.mkdirSync('uploads/'); - -// set up filename and destination -const storage = multer.diskStorage({ - destination: function (req: any, file: any, cb: any) { - cb(null, path.join('uploads/')); - }, - filename: (req: any, file: { fieldname: string; originalname: any }, cb: (arg0: null, arg1: string) => void) => { - cb(null, file.originalname); - } -}); -const upload = multer({storage: storage}); - /** - * @api {post} /addByOptions Load/Instantiate PEAController via PEAController-options directly + * @api {post} /loadPEA Load/Instantiate PEAController in ModularPlantManager * @apiName PostPEA * @apiGroup PEAController - * @apiParam {PEAOptions} pea PiMAdIdentifier */ peaRouter.post('/loadPEA', async (req, res) => { catServer.info('Load PEAController via PEAController-Options'); @@ -68,60 +44,22 @@ peaRouter.post('/loadPEA', async (req, res) => { try { await manager.loadPEAController(req.body.id); res.status(200).send('"Success!"'); - } catch (e) { + } catch (e: any) { console.log(e); res.status(500).send(e.toString()); } }); /** - * @api {post} /addByPiMAd Add PEAController via PiMAd. (Receiving FormData from Frontend and parse with Multer lib) - * @apiName PostPEA - * @apiGroup PEAController - * @apiParam {PEAOptions} pea PEAController to be added. - */ -peaRouter.post('/addByPiMAd', upload.single('uploadedFile'),async (req, res) => { - // parse filepath of uploaded file - const filePath: string = (req as MulterRequest).file.path; - //create object to pass to PiMAd - const object = {source:filePath}; - - const manager: ModularPlantManager = req.app.get('manager'); - try{ - await manager.addPEAToPimadPool(object); - res.status(200).send('"Success!"'); - } catch(e){ - console.log(e); - res.status(500).send('"'+e.toString()+'"'); - } -}); - -/** - * @api {get} Get all PEAs from PiMAd - * @apiName GetPiMAdPEAs - * @apiGroup PEAController - */ -peaRouter.get('/PiMAdPEAs', asyncHandler(async (req: Request, res: Response) => { - const manager: ModularPlantManager = req.app.get('manager'); - try{ - const pimadPEAs = await manager.getAllPEAsFromPimadPool(); - res.status(200).send(pimadPEAs); - } catch(e){ - console.log(e); - res.status(500).send('"'+e.toString()+'"'); - } -})); - -/** - * @api {get} Get all PEAControllers + * @api {get} Get all PEAControllers of ModularPlantManager * @apiName GetPEAControllers * @apiGroup PEAController */ -peaRouter.get('', asyncHandler(async (req: Request, res: Response) => { +peaRouter.get('/allPEAs', asyncHandler(async (req: Request, res: Response) => { const manager: ModularPlantManager = req.app.get('manager'); try { res.json(manager.getAllPEAControllers()); - } catch (e) { + } catch (e: any) { console.log(e); res.status(500).send(e.toString()); } @@ -137,43 +75,42 @@ peaRouter.get('/:peaId', (req: Request, res: Response) => { const manager: ModularPlantManager = req.app.get('manager'); try { res.send(manager.getPEAController(req.params.peaId).json()); - } catch (e) { + } catch (e: any) { console.log(e); res.status(constants.HTTP_STATUS_NOT_FOUND).send(e.toString()); } }); /** - * @api {get} /:peaId/getServerSettings - * @apiName GetSettings + * @api {get} /:peaId/getConnectionSettings + * @apiName GetConnectionSettings * @apiGroup PEAController * @apiParam {string} peaId */ -peaRouter.get('/:peaId/getServerSettings', (req: Request, res: Response) => { +peaRouter.get('/:peaId/getConnectionSettings', (req: Request, res: Response) => { const manager: ModularPlantManager = req.app.get('manager'); try{ - const body = manager.getServerSettings(req.params.peaId); + const peaController = manager.getPEAController(req.params.peaId); + const body = peaController.getCurrentConnectionSettings(); res.status(200).send(body); - }catch (e) { - console.log(e); + }catch (e: any) { res.status(500).send(e.toString()); } - }); /** - * @api {post} /updateServerSettings - * @apiName PostServerSettings + * @api {post} /:peaId/updateConnectionSettings + * @apiName PostConnectionSettings * @apiGroup PEAController - * @apiParam {ServerSettingsOptions} options + * @apiParam {ConnectionSettingsOptions} options */ -peaRouter.post('/updateServerSettings', asyncHandler(async (req: Request, res: Response) => { +peaRouter.post('/:peaId/updateConnectionSettings', asyncHandler(async (req: Request, res: Response) => { const manager: ModularPlantManager = req.app.get('manager'); try{ - manager.updateServerSettings(req.body); - res.status(200).send('"'+'Successfully updated the server settings!'+'"'); - } catch(e){ - console.log(e); + const peaController = manager.getPEAController(req.params.peaId); + peaController.updateConnection(req.body); + res.status(200).send('"'+'Successfully updated the connection settings!'+'"'); + } catch(e: any){ res.status(500).send(e.toString()); } })); @@ -190,7 +127,7 @@ peaRouter.get('/:peaId/download', (req: Request, res: Response) => { }); /** - * @api {post} /:peaId/connect Connect PEAController by ID and subscribe to variables + * @api {post} /:peaId/connect Connect PEAController by ID and subscribe to dataAssemblies * @apiName ConnectPEA * @apiGroup PEAController * @apiParam {string} peaId ID of PEAController to be connected. @@ -201,7 +138,7 @@ peaRouter.post('/:peaId/connect', asyncHandler(async (req: Request, res: Respons const pea = manager.getPEAController(req.params.peaId); await pea.connectAndSubscribe(); res.status(200).send({peaId: pea.id, status: 'Successfully connected'}); - } catch (e) { + } catch (e: any) { res.status(500).send(e.toString()); console.log(e); } @@ -219,15 +156,14 @@ peaRouter.post('/:peaId/disconnect', asyncHandler(async (req: Request, res: Resp const pea = manager.getPEAController(req.params.peaId); await pea.disconnectAndUnsubscribe(); res.status(200).send({peaId: pea.id, status: 'Successfully disconnected'}); - }catch (e) { + }catch (e: any) { console.log(e); res.status(500).send(e.toString()); } - })); /** - * @api {delete} /:peaId Delete PEAController by ID + * @api {delete} /:peaId Delete PEAController by ID * @apiName DeletePEA * @apiGroup PEAController * @apiParam {string} peaId ID of PEAController to be deleted @@ -238,30 +174,12 @@ peaRouter.delete('/:peaId', asyncHandler(async (req: Request, res: Response) => try { await manager.removePEAController(req.params.peaId); res.status(200).send({peaId: req.params.peaId, status: 'Successfully deleted'}); - } catch (e) { + } catch (e: any) { console.log(e); res.status(500).send(e.toString()); } })); -/** - * @api {delete} /:peaId Delete PiMAdPEA by identifier - * @apiName DeletePiMAdPEA - * @apiGroup PiMAdPEA - * @apiParam {string} pimadIdentifier - */ - -peaRouter.delete('/PiMAd/:peaId', asyncHandler(async (req: Request, res: Response) => { - const manager: ModularPlantManager = req.app.get('manager'); - try{ - await manager.deletePEAFromPimadPool(req.params.peaId); - res.status(200).send('"Successfully deleted PiMAd-PEA!"'); - } catch(e){ - console.log(e); - res.status(500).send('"'+e.toString()+'"'); - } -})); - /** * @api {post} /:peaId/service/:serviceName Configure service * @apiName ConfigureService @@ -287,7 +205,7 @@ peaRouter.post('/:peaId/service/:serviceName', asyncHandler(async (req: Request, await service.setParameters(req.body.parameters, manager.peas); } res.json(service.json()); - }catch(e){ + }catch(e: any){ console.log(e); res.status(500).send('"'+e.toString()+'"'); } @@ -319,26 +237,24 @@ peaRouter.post('/:peaId/service/:serviceName/:command', asyncHandler(async (req: await service.setParameters(req.body.parameters, manager.peas); } const command = req.params.command as ServiceCommand; - await service.executeCommandAndWaitForStateChange(command); + await service.executeCommand(command); res.json({ pea: req.params.peaId, service: service.name, command: req.params.command, - status: 'Command succesfully send' + status: 'Command successfully send' }); - } catch (e) { + } catch (e: any) { console.log(e); res.status(500).send(e.toString()); } - - })); /** - * @api {get} /pea/:PEAId/service/:serviceName Get service statusNode + * @api {get} /pea/:peaId/service/:serviceName Get service statusNode * @apiName GetService * @apiGroup PEAController - * @apiParam {string} peaId PEAController id + * @apiParam {string} peaId PEA ID * @apiParam {string} serviceName Name of service */ peaRouter.get('/:peaId/service/:serviceName', asyncHandler(async (req: Request, res: Response) => { @@ -347,15 +263,8 @@ peaRouter.get('/:peaId/service/:serviceName', asyncHandler(async (req: Request, const service = manager.getService(req.params.peaId, req.params.serviceName); res.json(service.json()); } - catch(e){ + catch(e: any){ console.log(e); res.status(500).send(e.toString()); } })); - -/** - *This interface is needed for Multer to work correctly. - */ -interface MulterRequest extends Request { - file: any; -} diff --git a/src/server/router/pimadRouter/pimadRouter.spec.ts b/src/server/router/pimadRouter/pimadRouter.spec.ts new file mode 100644 index 00000000..c73d41a9 --- /dev/null +++ b/src/server/router/pimadRouter/pimadRouter.spec.ts @@ -0,0 +1,113 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the 'Software'), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {ModularPlantManager} from '../../../modularPlantManager'; +import {Server} from '../../server'; + +import {Application} from 'express'; +import path = require('path'); + + +describe('PiMAdRoutes', () => { + const request = require('supertest'); + let app: Application; + let appServer: Server; + let manager: ModularPlantManager; + + beforeEach(() => { + manager = new ModularPlantManager(); + appServer = new Server(manager); + appServer.startHttpServer(3000); + appServer.initSocketServer(); + app = appServer.app; + }); + + afterEach(async () => { + await appServer.stop(); + }); + + context('add PEA to pool', () => { + it('should work with test file', async () => { + await request(app).post('/api/pimad/addPEA') + .attach('uploadedFile', path.resolve('tests/testpea.zip')) + .expect(200); + }); + it('should fail, wrong file type', async () => { + await request(app).post('/api/pimad/addPEA') + .attach('uploadedFile', path.resolve('tests/testpea.json')) + .expect(500) + .expect(/Error: Unknown source type /); + }); + }); + + context('PiMAd allPEAs', () => { + + it('should work, empty pool', async () => { + await request(app).get('/api/pimad/allPEAs') + .expect(200) + .expect([]); + }); + + it('should work with not empty pool', async () => { + await manager.peaProvider.addPEAToPool({source: 'tests/testpea.zip'}); + await request(app).get('/api/pimad/allPEAs') + .expect(200); + }); + }); + + context('Get PEA from PiMAd, /pimad/:peaId', () => { + + it('should work', async () => { + const pimadPEA= await manager.peaProvider.addPEAToPool({source: 'tests/testpea.zip'}); + await request(app).get(`/api/pimad/${pimadPEA.pimadIdentifier}`) + .expect(200); + }); + + it('should fail', async () => { + await request(app).get('/api/pimad/abc1234') + .expect(500) + .expect(/Error: PEA not found/); + }); + + }); + + context('Remove PEA from PiMAd, /pimad/:peaId', () => { + + it('should work', async () => { + const pimadPEA= await manager.peaProvider.addPEAToPool({source: 'tests/testpea.zip'}); + await request(app).delete(`/api/pimad/${pimadPEA.pimadIdentifier}`) + .expect(200) + .expect(/Successfully deleted PiMAd-PEA/); + }); + + it('should fail', async () => { + await request(app).delete('/api/pimad/abc1234') + .expect(500) + .expect(/Error: PEA not found/); + }); + + }); + +}); diff --git a/src/server/router/pimadRouter/pimadRouter.ts b/src/server/router/pimadRouter/pimadRouter.ts new file mode 100644 index 00000000..c71dc555 --- /dev/null +++ b/src/server/router/pimadRouter/pimadRouter.ts @@ -0,0 +1,136 @@ +/* + * MIT License + * + * Copyright (c) 2021 P2O-Lab , + * Chair for Process Control Systems, Technische Universität Dresden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import {ModularPlantManager} from '../../../modularPlantManager'; +import {Request, Response, Router} from 'express'; +import * as asyncHandler from 'express-async-handler'; +import * as path from 'path'; + +export const pimadRouter: Router = Router(); + + +/** + *This interface is needed for Multer to work correctly. + */ +interface MulterRequest extends Request { + file: any; +} + +// set up Multer for parsing uploaded file +const fs = require('fs'); +const multer = require('multer'); + +// create uploads directory +if (fs.existsSync('uploads/')) { + // delete uploads folder, because it could contain files, which haven't been deleted successfully due to crash + fs.rmSync('uploads/', {recursive: true}); +}// create new uploads folder +fs.mkdirSync('uploads/'); + + +// set up filename and destination +const storage = multer.diskStorage({ + destination: function (req: any, file: any, cb: any) { + cb(null, path.join('uploads/')); + }, + filename: (req: any, file: { filename: string; originalname: any }, cb: (arg0: null, arg1: string) => void) => { + cb(null, file.originalname); + } +}); +const upload = multer({storage: storage}); + + + +/** + * @api {post} /addPEA Add PEA to PiMAd PEA Pool by receiving MTP FormData from Frontend and parse with Multer lib + * @apiName PostPEA + * @apiGroup PiMAd + * @apiParam {PEAOptions} MTP of PEA to be added. + */ +pimadRouter.post('/addPEA', upload.single('uploadedFile'), async (req, res) => { + // parse filepath of uploaded file + const filePath: string = (req as MulterRequest).file.path; + //create object to pass to PiMAd + const object = {source:filePath}; + + const manager: ModularPlantManager = req.app.get('manager'); + try{ + await manager.peaProvider.addPEAToPool(object); + res.status(200).send('"Success!"'); + } catch(e: any){ + console.log(e); + res.status(500).send('"'+e.toString()+'"'); + } +}); + +/** + * @api {get} Get all PEAs from PiMAd + * @apiName GetPiMAdPEAs + * @apiGroup PiMAd + */ +pimadRouter.get('/allPEAs', asyncHandler(async (req: Request, res: Response) => { + const manager: ModularPlantManager = req.app.get('manager'); + try{ + const pimadPEAs = await manager.peaProvider.getAllPEAsFromPEAPool(); + res.status(200).send(pimadPEAs); + } catch(e: any){ + console.log(e); + res.status(500).send('"'+e.toString()+'"'); + } +})); + +/** + * @api {get} /:peaId Get PEA from PiMAd + * @apiName GetPEA + * @apiGroup PiMAd + * @apiParam {string} peaId ID of PEAController to be received as json + */ +pimadRouter.get('/:peaId', (req: Request, res: Response) => { + const manager: ModularPlantManager = req.app.get('manager'); + try { + res.send(manager.getPEAController(req.params.peaId).json()); + } catch (e: any) { + console.log(e); + res.status(500).send(e.toString()); + } +}); + +/** + * @api {delete} /:peaId Delete PEA by identifier + * @apiName DeletePEA + * @apiGroup PiMAd + * @apiParam {string} identifier + */ + +pimadRouter.delete('/:peaId', asyncHandler(async (req: Request, res: Response) => { + const manager: ModularPlantManager = req.app.get('manager'); + try{ + await manager.peaProvider.deletePEAFromPEAPool(req.params.peaId); + res.status(200).send('"Successfully deleted PiMAd-PEA!"'); + } catch(e: any){ + console.log(e); + res.status(500).send('"'+e.toString()+'"'); + } +})); diff --git a/src/server/router/polServiceRouter/polServiceRouter.ts b/src/server/router/polServiceRouter/polServiceRouter.ts index 4004069b..b031a177 100644 --- a/src/server/router/polServiceRouter/polServiceRouter.ts +++ b/src/server/router/polServiceRouter/polServiceRouter.ts @@ -39,7 +39,7 @@ export const polServiceRouter: Router = Router(); */ polServiceRouter.get('/', asyncHandler(async (req: Request, res: Response) => { const manager: ModularPlantManager = req.app.get('manager'); - res.json(await manager.getPOLServices()); + res.json(manager.getPOLServices()); })); /** @@ -56,7 +56,7 @@ polServiceRouter.get('/:polServiceId', asyncHandler(async (req: Request, res: Re throw new Error('POL Service not found'); } res.json(polService.json()); - } catch (err) { + } catch (err: any) { res.status(400).send(err.toString()); } })); @@ -72,7 +72,7 @@ polServiceRouter.delete('/:polServiceId', asyncHandler(async (req: Request, res: const manager: ModularPlantManager = req.app.get('manager'); manager.removePOLService(req.params.polServiceId); res.send({status: 'Successful deleted', id: req.params.polServiceId}); - } catch (err) { + } catch (err: any) { res.status(400).send(err.toString()); } })); @@ -87,7 +87,7 @@ polServiceRouter.delete('/:polServiceId', asyncHandler(async (req: Request, res: polServiceRouter.put('', asyncHandler(async (req: Request, res: Response) => { catServer.debug(`PUT /polService: ${JSON.stringify(req.body)}`); const manager: ModularPlantManager = req.app.get('manager'); - manager.instantiatePOLService(req.body); + manager.addPOLService(req.body); res.json({status: 'pol service successful instantiated'}); })); @@ -132,7 +132,7 @@ polServiceRouter.post('/:polServiceId/:command', asyncHandler(async (req: Reques res.json({ polService: polService.name, command: req.params.command, - status: 'Command succesfully sent' + status: 'Command successfully sent' }); } })); diff --git a/src/server/router/recipeRouter/playerRouter.ts b/src/server/router/recipeRouter/playerRouter.ts index 88a50d73..4df5ab93 100644 --- a/src/server/router/recipeRouter/playerRouter.ts +++ b/src/server/router/recipeRouter/playerRouter.ts @@ -60,8 +60,8 @@ playerRouter.post('/start', asyncHandler(async (req: Request, res: Response) => */ playerRouter.post('/pause', asyncHandler(async (req: Request, res: Response) => { const manager: ModularPlantManager = req.app.get('manager'); - const result = await manager.player.pause(); - res.json(result); + await manager.player.pause(); + res.status(200).send; })); /** @@ -71,8 +71,8 @@ playerRouter.post('/pause', asyncHandler(async (req: Request, res: Response) => */ playerRouter.post('/stop', asyncHandler(async (req: Request, res: Response) => { const manager: ModularPlantManager = req.app.get('manager'); - const result = await manager.player.stop(); - res.json(result); + await manager.player.stop(); + res.status(200).send; })); /** @@ -82,8 +82,8 @@ playerRouter.post('/stop', asyncHandler(async (req: Request, res: Response) => { */ playerRouter.post('/reset', asyncHandler(async (req: Request, res: Response) => { const manager: ModularPlantManager = req.app.get('manager'); - const result = await manager.player.reset(); - res.json(result); + await manager.player.reset(); + res.status(200).send; })); /** diff --git a/src/server/router/recipeRouter/recipeRouter.ts b/src/server/router/recipeRouter/recipeRouter.ts index 64c77e55..1ce47ddd 100644 --- a/src/server/router/recipeRouter/recipeRouter.ts +++ b/src/server/router/recipeRouter/recipeRouter.ts @@ -84,8 +84,8 @@ recipeRouter.delete('/:recipeId', (req: Request, res: Response) => { try { manager.removeRecipe(req.params.recipeId); res.send({status: 'Successful deleted', id: req.params.recipeId}); - } catch (err) { - res.status(400).send(err.toString()); + } catch (e) { + res.status(400).send((e as Error).message); } }); diff --git a/tests/anamon.json b/tests/anamon.json deleted file mode 100644 index 71948466..00000000 --- a/tests/anamon.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "V": { - "nodeId": "Variable.V", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMin": { - "nodeId": "Variable.VSclMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMax": { - "nodeId": "Variable.VSclMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VUnit": { - "nodeId": "Variable.VUnit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OSLevel": { - "nodeId": "Variable.OSLevel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VAHEn": { - "nodeId": "Variable.VAHEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VAHLim": { - "nodeId": "Variable.VAHLim", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VAHAct": { - "nodeId": "Variable.VAHAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - - "VWHEn": { - "nodeId": "Variable.VWHEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VWHLim": { - "nodeId": "Variable.VWHLim", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VWHAct": { - "nodeId": "Variable.VWHAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - - "VTHEn": { - "nodeId": "Variable.VTHEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VTHLim": { - "nodeId": "Variable.VTHLim", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VTHAct": { - "nodeId": "Variable.VTHAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - - "VTLEn": { - "nodeId": "Variable.VTLEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VTLLim": { - "nodeId": "Variable.VTLLim", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VTLAct": { - "nodeId": "Variable.VTLAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - - "VWLEn": { - "nodeId": "Variable.VWLEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VWLLim": { - "nodeId": "Variable.VWLLim", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VWLAct": { - "nodeId": "Variable.VWLAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - - "VALEn": { - "nodeId": "Variable.VALEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VALLim": { - "nodeId": "Variable.VALLim", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VALAct": { - "nodeId": "Variable.VALAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/anaprocessvaluein.json b/tests/anaprocessvaluein.json deleted file mode 100644 index f09b19f8..00000000 --- a/tests/anaprocessvaluein.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VExt": { - "nodeId": "Variable.VExt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VUnit": { - "nodeId": "Variable.VUnit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMax": { - "nodeId": "Variable.VSclMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMin": { - "nodeId": "Variable.VSclMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/anaserveparam.json b/tests/anaserveparam.json deleted file mode 100644 index b07be52d..00000000 --- a/tests/anaserveparam.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMin": { - "nodeId": "Variable.VSclMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMax": { - "nodeId": "Variable.VSclMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VUnit": { - "nodeId": "Variable.VUnit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OSLevel": { - "nodeId": "Variable.OSLevel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcChannel": { - "nodeId": "Variable.SrcChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcExtAut": { - "nodeId": "Variable.SrcExtAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAut": { - "nodeId": "Variable.SrcIntAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntOp": { - "nodeId": "Variable.SrcIntOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcExtOp": { - "nodeId": "Variable.SrcExtOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAct": { - "nodeId": "Variable.SrcIntAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcExtAct": { - "nodeId": "Variable.SrcExtAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateChannel": { - "nodeId": "Variable.StateChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAut": { - "nodeId": "Variable.StateOffAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAut": { - "nodeId": "Variable.StateOpAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAut": { - "nodeId": "Variable.StateAutAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffOp": { - "nodeId": "Variable.StateOffOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpOp": { - "nodeId": "Variable.StateOpOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutOp": { - "nodeId": "Variable.StateAutOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAct": { - "nodeId": "Variable.StateOpAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAct": { - "nodeId": "Variable.StateAutAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAct": { - "nodeId": "Variable.StateOffAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Sync": { - "nodeId": "Variable.Sync", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VExt": { - "nodeId": "Variable.VExt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VOp": { - "nodeId": "Variable.VOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VInt": { - "nodeId": "Variable.VInt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VOut": { - "nodeId": "Variable.VOut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VFbk": { - "nodeId": "Variable.VFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VReq": { - "nodeId": "Variable.VReq", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VMin": { - "nodeId": "Variable.VMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VMax": { - "nodeId": "Variable.VMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/anaview.json b/tests/anaview.json deleted file mode 100644 index bc0633c9..00000000 --- a/tests/anaview.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "V": { - "nodeId": "Variable.V", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMin": { - "nodeId": "Variable.VSclMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMax": { - "nodeId": "Variable.VSclMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VUnit": { - "nodeId": "Variable.VUnit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/binmanint.json b/tests/binmanint.json deleted file mode 100644 index cd5fc1d1..00000000 --- a/tests/binmanint.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "OSLevel": { - "nodeId": "Variable.OSLevel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VOut": { - "nodeId": "Variable.VOut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState0": { - "nodeId": "Variable.VState0", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState1": { - "nodeId": "Variable.VState1", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VMan": { - "nodeId": "Variable.VMan", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VInt": { - "nodeId": "Variable.VInt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VRbk": { - "nodeId": "Variable.VRbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VFbk": { - "nodeId": "Variable.VFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcChannel": { - "nodeId": "Variable.SrcChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManAut": { - "nodeId": "Variable.SrcManAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAut": { - "nodeId": "Variable.SrcIntAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntOp": { - "nodeId": "Variable.SrcIntOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManOp": { - "nodeId": "Variable.SrcManOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAct": { - "nodeId": "Variable.SrcIntAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManAct": { - "nodeId": "Variable.SrcManAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - - diff --git a/tests/binmon.json b/tests/binmon.json deleted file mode 100644 index 1196d415..00000000 --- a/tests/binmon.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "V": { - "nodeId": "Variable.V", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState0": { - "nodeId": "Variable.VState0", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState1": { - "nodeId": "Variable.VState1", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OSLevel": { - "nodeId": "Variable.OSLevel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VFlutEn": { - "nodeId": "Variable.VFlutEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VFlutTi": { - "nodeId": "Variable.VFlutTi", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VFlutCnt": { - "nodeId": "Variable.VFlutCnt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VFlutAct": { - "nodeId": "Variable.VFlutAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/binmon_static.json b/tests/binmon_static.json deleted file mode 100644 index a92a4c4c..00000000 --- a/tests/binmon_static.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": "0", - "V": { - "nodeId": "Variable.V", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState0": { - "nodeId": "Variable.VState0", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState1": { - "nodeId": "Variable.VState1", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OSLevel": "0", - "VFlutEn": { - "nodeId": "Variable.VState0", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VFlutTi": { - "nodeId": "Variable.VState1", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VFlutCnt": { - "nodeId": "Variable.VFlutCnt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VFlutAct": { - "nodeId": "Variable.VFlutAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/binprocessvaluein.json b/tests/binprocessvaluein.json deleted file mode 100644 index 00741325..00000000 --- a/tests/binprocessvaluein.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VExt": { - "nodeId": "Variable.VExt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState0": { - "nodeId": "Variable.VState0", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState1": { - "nodeId": "Variable.VState1", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/binserveparam.json b/tests/binserveparam.json deleted file mode 100644 index 318b4eb4..00000000 --- a/tests/binserveparam.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OSLevel": { - "nodeId": "Variable.OSLevel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcChannel": { - "nodeId": "Variable.SrcChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcExtAut": { - "nodeId": "Variable.SrcExtAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAut": { - "nodeId": "Variable.SrcIntAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntOp": { - "nodeId": "Variable.SrcIntOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcExtOp": { - "nodeId": "Variable.SrcExtOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAct": { - "nodeId": "Variable.SrcIntAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcExtAct": { - "nodeId": "Variable.SrcExtAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateChannel": { - "nodeId": "Variable.StateChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAut": { - "nodeId": "Variable.StateOffAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAut": { - "nodeId": "Variable.StateOpAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAut": { - "nodeId": "Variable.StateAutAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffOp": { - "nodeId": "Variable.StateOffOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpOp": { - "nodeId": "Variable.StateOpOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutOp": { - "nodeId": "Variable.StateAutOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAct": { - "nodeId": "Variable.StateOpAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAct": { - "nodeId": "Variable.StateAutAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAct": { - "nodeId": "Variable.StateOffAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Sync": { - "nodeId": "Variable.Sync", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VExt": { - "nodeId": "Variable.VExt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VOp": { - "nodeId": "Variable.VOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VInt": { - "nodeId": "Variable.VInt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VOut": { - "nodeId": "Variable.VOut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VFbk": { - "nodeId": "Variable.VFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VReq": { - "nodeId": "Variable.VReq", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState0": { - "nodeId": "Variable.VState0", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState1": { - "nodeId": "Variable.VState1", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/binview.json b/tests/binview.json deleted file mode 100644 index 2b22b8f4..00000000 --- a/tests/binview.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "V": { - "nodeId": "Variable.V", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState0": { - "nodeId": "Variable.VState0", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VState1": { - "nodeId": "Variable.VState1", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/dintmanint.json b/tests/dintmanint.json deleted file mode 100644 index 8b45e72d..00000000 --- a/tests/dintmanint.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "OSLevel": { - "nodeId": "Variable.OSLevel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VUnit": { - "nodeId": "Variable.VUnit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VMin": { - "nodeId": "Variable.VMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VMax": { - "nodeId": "Variable.VMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VOut": { - "nodeId": "Variable.VOut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMax": { - "nodeId": "Variable.VSclMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMin": { - "nodeId": "Variable.VSclMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VMan": { - "nodeId": "Variable.VMan", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VInt": { - "nodeId": "Variable.VInt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VRbk": { - "nodeId": "Variable.VRbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VFbk": { - "nodeId": "Variable.VFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcChannel": { - "nodeId": "Variable.SrcChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManAut": { - "nodeId": "Variable.SrcManAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAut": { - "nodeId": "Variable.SrcIntAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntOp": { - "nodeId": "Variable.SrcIntOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManOp": { - "nodeId": "Variable.SrcManOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAct": { - "nodeId": "Variable.SrcIntAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManAct": { - "nodeId": "Variable.SrcManAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - - diff --git a/tests/dintview.json b/tests/dintview.json deleted file mode 100644 index bc0633c9..00000000 --- a/tests/dintview.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "V": { - "nodeId": "Variable.V", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMin": { - "nodeId": "Variable.VSclMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VSclMax": { - "nodeId": "Variable.VSclMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "VUnit": { - "nodeId": "Variable.VUnit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/indicatorelement.json b/tests/indicatorelement.json deleted file mode 100644 index 2160dd01..00000000 --- a/tests/indicatorelement.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/lockview.json b/tests/lockview.json deleted file mode 100644 index cdbef195..00000000 --- a/tests/lockview.json +++ /dev/null @@ -1,424 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Logic": { - "nodeId": "Variable.Logic", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Out": { - "nodeId": "Variable.Out", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OutQC": { - "nodeId": "Variable.OutQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In1En": { - "nodeId": "Variable.In1En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In1": { - "nodeId": "Variable.In1", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In1QC": { - "nodeId": "Variable.In1QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In1Inv": { - "nodeId": "Variable.In1Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In1Txt": { - "nodeId": "Variable.In1Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In2En": { - "nodeId": "Variable.In2En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In2": { - "nodeId": "Variable.In2", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In2QC": { - "nodeId": "Variable.In2QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In2Inv": { - "nodeId": "Variable.In2Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In2Txt": { - "nodeId": "Variable.In2Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In3En": { - "nodeId": "Variable.In3En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In3": { - "nodeId": "Variable.In3", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In3QC": { - "nodeId": "Variable.In3QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In3Inv": { - "nodeId": "Variable.In3Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In3Txt": { - "nodeId": "Variable.In3Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In4En": { - "nodeId": "Variable.In4En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In4": { - "nodeId": "Variable.In4", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In4QC": { - "nodeId": "Variable.In4QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In4Inv": { - "nodeId": "Variable.In4Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In4Txt": { - "nodeId": "Variable.In4Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In5En": { - "nodeId": "Variable.In5En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In5": { - "nodeId": "Variable.In5", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In5QC": { - "nodeId": "Variable.In5QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In5Inv": { - "nodeId": "Variable.In5Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In5Txt": { - "nodeId": "Variable.In5Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In6En": { - "nodeId": "Variable.In6En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In6": { - "nodeId": "Variable.In6", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In6QC": { - "nodeId": "Variable.In6QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In6Inv": { - "nodeId": "Variable.In6Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In6Txt": { - "nodeId": "Variable.In6Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In7En": { - "nodeId": "Variable.In7En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In7": { - "nodeId": "Variable.In7", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In7QC": { - "nodeId": "Variable.In7QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In7Inv": { - "nodeId": "Variable.In7Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In7Txt": { - "nodeId": "Variable.In7Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In8En": { - "nodeId": "Variable.In8En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In8": { - "nodeId": "Variable.In8", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In8QC": { - "nodeId": "Variable.In8QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In8Inv": { - "nodeId": "Variable.In8Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In8Txt": { - "nodeId": "Variable.In8Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In9En": { - "nodeId": "Variable.In9En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In9": { - "nodeId": "Variable.In9", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In9QC": { - "nodeId": "Variable.In9QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In9Inv": { - "nodeId": "Variable.In9Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In9Txt": { - "nodeId": "Variable.In9Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In10En": { - "nodeId": "Variable.In10En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In10": { - "nodeId": "Variable.In10", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In10QC": { - "nodeId": "Variable.In10QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In10Inv": { - "nodeId": "Variable.In10Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In10Txt": { - "nodeId": "Variable.In10Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In11En": { - "nodeId": "Variable.In11En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In11": { - "nodeId": "Variable.In11", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In11QC": { - "nodeId": "Variable.In11QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In11Inv": { - "nodeId": "Variable.In11Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In11Txt": { - "nodeId": "Variable.In11Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In12En": { - "nodeId": "Variable.In12En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In12": { - "nodeId": "Variable.In12", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In12QC": { - "nodeId": "Variable.In12QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In12Inv": { - "nodeId": "Variable.In12Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In12Txt": { - "nodeId": "Variable.In12Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In13En": { - "nodeId": "Variable.In13En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In13": { - "nodeId": "Variable.In13", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In13QC": { - "nodeId": "Variable.In13QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In13Inv": { - "nodeId": "Variable.In13Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In13Txt": { - "nodeId": "Variable.In13Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In14En": { - "nodeId": "Variable.In14En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In14": { - "nodeId": "Variable.In14", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In14QC": { - "nodeId": "Variable.In14QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In14Inv": { - "nodeId": "Variable.In14Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In14Txt": { - "nodeId": "Variable.In14Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In15En": { - "nodeId": "Variable.In15En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In15": { - "nodeId": "Variable.In15", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In15QC": { - "nodeId": "Variable.In15QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In15Inv": { - "nodeId": "Variable.In15Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In15Txt": { - "nodeId": "Variable.In15Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In16En": { - "nodeId": "Variable.In16En", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In16": { - "nodeId": "Variable.In16", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In16QC": { - "nodeId": "Variable.In16QC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In16Inv": { - "nodeId": "Variable.In16Inv", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "In16Txt": { - "nodeId": "Variable.In16Txt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} diff --git a/tests/monanadrv.json b/tests/monanadrv.json deleted file mode 100644 index fc715f82..00000000 --- a/tests/monanadrv.json +++ /dev/null @@ -1,347 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "OSLevel": { - "nodeId": "Variable.OSLevel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateChannel": { - "nodeId": "Variable.StateChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAut": { - "nodeId": "Variable.StateOffAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAut": { - "nodeId": "Variable.StateOpAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAut": { - "nodeId": "Variable.StateAutAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffOp": { - "nodeId": "Variable.StateOffOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpOp": { - "nodeId": "Variable.StateOpOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutOp": { - "nodeId": "Variable.StateAutOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAct": { - "nodeId": "Variable.StateOpAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAct": { - "nodeId": "Variable.StateAutAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAct": { - "nodeId": "Variable.StateOffAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "ResetOp": { - "nodeId": "Variable.ResetOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "ResetAut": { - "nodeId": "Variable.ResetAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PermEn": { - "nodeId": "Variable.PermEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Permit": { - "nodeId": "Variable.Permit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "IntlEn": { - "nodeId": "Variable.IntlEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Interlock": { - "nodeId": "Variable.Interlock", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "ProtEn": { - "nodeId": "Variable.ProtEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Protect": { - "nodeId": "Variable.Protect", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcChannel": { - "nodeId": "Variable.SrcChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManAut": { - "nodeId": "Variable.SrcManAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAut": { - "nodeId": "Variable.SrcIntAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntOp": { - "nodeId": "Variable.SrcIntOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManOp": { - "nodeId": "Variable.SrcManOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAct": { - "nodeId": "Variable.SrcIntAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManAct": { - "nodeId": "Variable.SrcManAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SafePos": { - "nodeId": "Variable.SafePos", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SafePosAct": { - "nodeId": "Variable.SafePosAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "FwdAut": { - "nodeId": "Variable.FwdAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "FwdCtrl": { - "nodeId": "Variable.FwdCtrl", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "FwdEn": { - "nodeId": "Variable.FwdEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "FwdFbk": { - "nodeId": "Variable.FwdFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "FwdFbkCalc": { - "nodeId": "Variable.FwdFbkCalc", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "FwdOp": { - "nodeId": "Variable.FwdOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RevAut": { - "nodeId": "Variable.RevAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RevCtrl": { - "nodeId": "Variable.RevCtrl", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RevEn": { - "nodeId": "Variable.RevEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RevFbk": { - "nodeId": "Variable.RevFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RevFbkCalc": { - "nodeId": "Variable.RevFbkCalc", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RevOp": { - "nodeId": "Variable.RevOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StopAut": { - "nodeId": "Variable.StopAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StopOp": { - "nodeId": "Variable.StopOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Trip": { - "nodeId": "Variable.Trip", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmSclMin": { - "nodeId": "Variable.RpmSclMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmSclMax": { - "nodeId": "Variable.RpmSclMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmUnit": { - "nodeId": "Variable.RpmUnit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmMin": { - "nodeId": "Variable.RpmMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmMax": { - "nodeId": "Variable.RpmMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmInt": { - "nodeId": "Variable.RpmInt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmMan": { - "nodeId": "Variable.RpmMan", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Rpm": { - "nodeId": "Variable.Rpm", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmFbk": { - "nodeId": "Variable.RpmFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmFbkCalc": { - "nodeId": "Variable.RpmFbkCalc", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmRbk": { - "nodeId": "Variable.RpmRbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonEn": { - "nodeId": "Variable.MonEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonSafePos": { - "nodeId": "Variable.MonSafePos", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonStatErr": { - "nodeId": "Variable.MonStatErr", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonDynErr": { - "nodeId": "Variable.MonDynErr", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonStatTi": { - "nodeId": "Variable.MonStatTi", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonDynTi": { - "nodeId": "Variable.MonDynTi", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmErr": { - "nodeId": "Variable.RpmErr", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmAHEn": { - "nodeId": "Variable.RpmAHEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmAHLim": { - "nodeId": "Variable.RpmAHLim", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmAHAct": { - "nodeId": "Variable.RpmAHAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmALEn": { - "nodeId": "Variable.RpmALEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmALLim": { - "nodeId": "Variable.RpmALLim", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "RpmALAct": { - "nodeId": "Variable.RpmALAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - - diff --git a/tests/monanavlv.json b/tests/monanavlv.json deleted file mode 100644 index c1f1ea6b..00000000 --- a/tests/monanavlv.json +++ /dev/null @@ -1,339 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OSLevel": { - "nodeId": "Variable.OSLevel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "ResetOp": { - "nodeId": "Variable.ResetOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "ResetAut": { - "nodeId": "Variable.ResetAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PermEn": { - "nodeId": "Variable.PermEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Permit": { - "nodeId": "Variable.Permit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "IntlEn": { - "nodeId": "Variable.IntlEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Interlock": { - "nodeId": "Variable.Interlock", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "ProtEn": { - "nodeId": "Variable.ProtEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Protect": { - "nodeId": "Variable.Protect", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateChannel": { - "nodeId": "Variable.StateChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAut": { - "nodeId": "Variable.StateOffAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAut": { - "nodeId": "Variable.StateOpAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAut": { - "nodeId": "Variable.StateAutAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffOp": { - "nodeId": "Variable.StateOffOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpOp": { - "nodeId": "Variable.StateOpOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutOp": { - "nodeId": "Variable.StateAutOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAct": { - "nodeId": "Variable.StateOpAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAct": { - "nodeId": "Variable.StateAutAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAct": { - "nodeId": "Variable.StateOffAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SafePos": { - "nodeId": "Variable.SafePos", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SafePosEn": { - "nodeId": "Variable.SafePosEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SafePosAct": { - "nodeId": "Variable.SafePosAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OpenAut": { - "nodeId": "Variable.OpenAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OpenFbk": { - "nodeId": "Variable.OpenFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OpenFbkCalc": { - "nodeId": "Variable.OpenFbkCalc", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OpenOp": { - "nodeId": "Variable.OpenOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "CloseAut": { - "nodeId": "Variable.CloseAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "CloseFbk": { - "nodeId": "Variable.CloseFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "CloseFbkCalc": { - "nodeId": "Variable.CloseFbkCalc", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "CloseOp": { - "nodeId": "Variable.CloseOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PermitEn": { - "nodeId": "Variable.PermitEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Permit": { - "nodeId": "Variable.Permit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "IntlEn": { - "nodeId": "Variable.IntlEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Interlock": { - "nodeId": "Variable.Interlock", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "ProtEn": { - "nodeId": "Variable.ProtEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Protect": { - "nodeId": "Variable.Protect", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonEn": { - "nodeId": "Variable.MonEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonSafePos": { - "nodeId": "Variable.MonSafePos", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonStatErr": { - "nodeId": "Variable.MonStatErr", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonDynErr": { - "nodeId": "Variable.MonDynErr", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonStatTi": { - "nodeId": "Variable.MonStatTi", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonDynTi": { - "nodeId": "Variable.MonDynTi", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcChannel": { - "nodeId": "Variable.SrcChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManAut": { - "nodeId": "Variable.SrcManAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAut": { - "nodeId": "Variable.SrcIntAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntOp": { - "nodeId": "Variable.SrcIntOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManOp": { - "nodeId": "Variable.SrcManOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAct": { - "nodeId": "Variable.SrcIntAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManAct": { - "nodeId": "Variable.SrcManAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Pos": { - "nodeId": "Variable.Pos", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosFbk": { - "nodeId": "Variable.PosFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosFbkCalc": { - "nodeId": "Variable.PosFbkCalc", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosRbk": { - "nodeId": "Variable.PosRbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosInt": { - "nodeId": "Variable.PosInt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosMan": { - "nodeId": "Variable.PosMan", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosUnit": { - "nodeId": "Variable.PosUnit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosMax": { - "nodeId": "Variable.PosMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosMin": { - "nodeId": "Variable.PosMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosSclMax": { - "nodeId": "Variable.PosSclMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosSclMin": { - "nodeId": "Variable.PosSclMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OpenAct": { - "nodeId": "Variable.OpenAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "CloseAct": { - "nodeId": "Variable.CloseAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosReachedFbk": { - "nodeId": "Variable.PosReachedFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PosTolerance": { - "nodeId": "Variable.PosTolerance", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonPosTi": { - "nodeId": "Variable.MonPosTi", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonPosErr": { - "nodeId": "Variable.MonPosErr", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} diff --git a/tests/monbinvlv.json b/tests/monbinvlv.json deleted file mode 100644 index 72e7887b..00000000 --- a/tests/monbinvlv.json +++ /dev/null @@ -1,224 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OSLevel": { - "nodeId": "Variable.OSLevel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "ResetOp": { - "nodeId": "Variable.ResetOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "ResetAut": { - "nodeId": "Variable.ResetAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PermEn": { - "nodeId": "Variable.PermEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Permit": { - "nodeId": "Variable.Permit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "IntlEn": { - "nodeId": "Variable.IntIEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Interlock": { - "nodeId": "Variable.Interlock", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "ProtEn": { - "nodeId": "Variable.ProtEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Protect": { - "nodeId": "Variable.Protect", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateChannel": { - "nodeId": "Variable.StateChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAut": { - "nodeId": "Variable.StateOffAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAut": { - "nodeId": "Variable.StateOpAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAut": { - "nodeId": "Variable.StateAutAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffOp": { - "nodeId": "Variable.StateOffOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpOp": { - "nodeId": "Variable.StateOpOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutOp": { - "nodeId": "Variable.StateAutOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAct": { - "nodeId": "Variable.StateOpAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAct": { - "nodeId": "Variable.StateAutAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAct": { - "nodeId": "Variable.StateOffAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SafePos": { - "nodeId": "Variable.SafePos", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SafePosEn": { - "nodeId": "Variable.SafePosEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SafePosAct": { - "nodeId": "Variable.SafePosAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OpenAut": { - "nodeId": "Variable.OpenAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OpenFbk": { - "nodeId": "Variable.OpenFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OpenFbkCalc": { - "nodeId": "Variable.OpenFbkCalc", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OpenOp": { - "nodeId": "Variable.OpenOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "CloseAut": { - "nodeId": "Variable.CloseAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "CloseFbk": { - "nodeId": "Variable.CloseFbk", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "CloseFbkCalc": { - "nodeId": "Variable.CloseFbkCalc", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "CloseOp": { - "nodeId": "Variable.CloseOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Ctrl": { - "nodeId": "Variable.Ctrl", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PermitEn": { - "nodeId": "Variable.PermitEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Permit": { - "nodeId": "Variable.Permit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "IntlEn": { - "nodeId": "Variable.IntlEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Interlock": { - "nodeId": "Variable.Interlock", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "ProtEn": { - "nodeId": "Variable.ProtEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Protect": { - "nodeId": "Variable.Protect", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonEn": { - "nodeId": "Variable.MonEn", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonSafePos": { - "nodeId": "Variable.MonSafePos", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonStatErr": { - "nodeId": "Variable.MonStatErr", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonDynErr": { - "nodeId": "Variable.MonDynErr", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonStatTi": { - "nodeId": "Variable.MonStatTi", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MonDynTi": { - "nodeId": "Variable.MonDynTi", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} diff --git a/tests/namespaceUrl.ts b/tests/namespaceUrl.ts deleted file mode 100644 index 29d1a7af..00000000 --- a/tests/namespaceUrl.ts +++ /dev/null @@ -1,41 +0,0 @@ -import {PEAOptions} from '@p2olab/polaris-interface'; - -/** - * Set NamespaceUrl for testing purpose - */ - -// set your namespaceUrl here -export const namespaceUrl = 'urn:DESKTOP-DLSN8FE:NodeOPCUA-Server'; - -export function iterateDataItemsAndSetNameSpaceUrl(array: any){ - array.forEach((object: any) =>{ - for (const key in object.dataItems as any) { - //skip static values - if((typeof(object.dataItems as any)[key] != 'string')){ - (object.dataItems as any)[key].namespaceIndex = namespaceUrl; - } - } - for (const key in object.communication as any) { - //skip static values - if((typeof(object.communication as any)[key] != 'string')){ - (object.communication as any)[key].namespaceIndex = namespaceUrl; - } - } - }); -} - -export function setNamespaceUrl(peaOptions: PEAOptions){ - iterateDataItemsAndSetNameSpaceUrl(peaOptions.dataAssemblies); - iterateDataItemsAndSetNameSpaceUrl(peaOptions.services); - peaOptions.services.forEach(service => { - if(service.parameters) iterateDataItemsAndSetNameSpaceUrl(service.parameters); - service.procedures.forEach(procedure => { - if(procedure.parameters) iterateDataItemsAndSetNameSpaceUrl(procedure.parameters); - if(procedure.reportParameters) iterateDataItemsAndSetNameSpaceUrl(procedure.reportParameters); - if(procedure.processValuesIn) iterateDataItemsAndSetNameSpaceUrl(procedure.processValuesIn); - if(procedure.processValuesOut) iterateDataItemsAndSetNameSpaceUrl(procedure.processValuesOut); - if(procedure.dataAssembly) iterateDataItemsAndSetNameSpaceUrl(procedure.dataAssembly); - }); - }); -} - diff --git a/tests/peaModel.json b/tests/peaModel.json deleted file mode 100644 index 139fbe3e..00000000 --- a/tests/peaModel.json +++ /dev/null @@ -1,8497 +0,0 @@ -{ - "dataAssemblies":[ - { - "dataItems":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagName", - "value":"Variable2", - "defaultValue":"Variable2", - "description":"TagName Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagDescription", - "value":"SimulatedNumericVar", - "defaultValue":"SimulatedNumericVar", - "description":"TagDescription Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"WQC", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Variable2.WQC" - } - }, - "dataSourceIdentifier":"9ba9df50-36fd-46bd-bff4-cb74b16e65b9", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"255", - "description":"Worst Quality Code variable", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"V", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Variable2.V" - } - }, - "dataSourceIdentifier":"4dec0370-8786-4564-9b5c-cd4133eb3a3a", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Value", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"VSclMin", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Variable2.VSclMin" - } - }, - "dataSourceIdentifier":"670c5518-d802-4dd5-8aa9-6c20c9c16ebd", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Low Limit value", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"VSclMax", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Variable2.VSclMax" - } - }, - "dataSourceIdentifier":"28c7cc38-c98c-440c-a644-b7c86daa3a7a", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"High Limit value", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"VUnit", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Variable2.VUnit" - } - }, - "dataSourceIdentifier":"991d4055-f6c9-4397-bd8a-f2489439f07a", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Enumeration value of the unit list", - "pimadIdentifier":"TODO" - } - ], - "dataSourceIdentifier":"b11d75a2-52de-42fd-8117-0c650057125f", - "description":"inline TODO above", - "name":"Variable2", - "initialized":true, - "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", - "pimadIdentifier":"ba91d859-f26a-4b80-9eba-b356ec3c5a87", - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - } - }, - { - "dataItems":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagName", - "value":"Variable1", - "defaultValue":"Variable1", - "description":"TagName Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagDescription", - "value":"SimulatedNumericVar", - "defaultValue":"SimulatedNumericVar", - "description":"TagDescription Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"WQC", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Variable1.WQC" - } - }, - "dataSourceIdentifier":"d2d598b4-04a9-4fcc-8113-bc4fbbc8b25b", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"255", - "description":"Worst Quality Code variable", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"V", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Variable1.V" - } - }, - "dataSourceIdentifier":"a93b391b-e1e8-462f-b128-f7c0ada74ff8", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"15", - "description":"Value", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"VSclMin", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Variable1.VSclMin" - } - }, - "dataSourceIdentifier":"b64badf8-f705-4dad-b3c5-f7d1a354fabd", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Low Limit value", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"VSclMax", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Variable1.VSclMax" - } - }, - "dataSourceIdentifier":"885f34b9-d398-462b-95f0-20f3bac30e05", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"30", - "description":"High Limit value", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"VUnit", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Variable1.VUnit" - } - }, - "dataSourceIdentifier":"c501e12e-9502-4d14-b8b5-b2fc44f765bc", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"1038", - "description":"Enumeration value of the unit list", - "pimadIdentifier":"TODO" - } - ], - "dataSourceIdentifier":"2052a502-2437-4f18-964b-56f81375a953", - "description":"inline TODO above", - "name":"Variable1", - "initialized":true, - "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView", - "pimadIdentifier":"e394e348-9fa2-4bb9-96a2-0003599fdde2", - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - } - } - ], - "dataModel":"MTPSUCLib/ModuleTypePackage", - "dataModelVersion":{ - "major":-1, - "minor":-1, - "patch":-1, - "initialized":false - }, - "feas":[ - - ], - "name":"Calculator", - "endpoint":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"Endpoint", - "value":"opc.tcp://localhost:4334", - "defaultValue":"opc.tcp://localhost:4334", - "description":"Endpoint URL of the server - like 'opc.tcp://192.186.2.1:5555", - "pimadIdentifier":"TODO" - } - ], - "pimadIdentifier":"684e05f8-5285-4598-859b-69d01a989bb1", - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "services":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "attributes":[ - - ], - "dataAssembly":{ - "dataItems":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagName", - "value":"Integral2", - "defaultValue":"Integral2", - "description":"TagName Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagDescription", - "value":"Service for math operation Integral", - "defaultValue":"Service for math operation Integral", - "description":"TagDescription Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:byte", - "name":"WQC", - "value":"255", - "defaultValue":"255", - "description":"Worst Quality Code variable", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateChannel", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.StateChannel" - } - }, - "dataSourceIdentifier":"36859cce-040c-4015-8488-44d3a70504e0", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Selection of the active Operation Mode interaction channel", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOffAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.StateOffAut" - } - }, - "dataSourceIdentifier":"237a1f2f-bd71-43ce-a6b4-465dee937190", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Offline by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOpAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.StateOpAut" - } - }, - "dataSourceIdentifier":"5dc952fa-b89d-499a-b82b-35aa451c39da", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Operator by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateAutAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.StateAutAut" - } - }, - "dataSourceIdentifier":"0d243fcb-9c04-4749-8158-cfeafe724f20", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Automatic by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOffOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.StateOffOp" - } - }, - "dataSourceIdentifier":"28a2bffa-2f35-49c1-b30d-355fac54d399", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Offline by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOpOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.StateOpOp" - } - }, - "dataSourceIdentifier":"340b3715-56c3-46fc-9d88-8c07cccf5dac", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Operator by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateAutOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.StateAutOp" - } - }, - "dataSourceIdentifier":"96cee496-4f2c-4758-a226-1ce7aa98cb9d", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Automatic by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOpAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.StateOpAct" - } - }, - "dataSourceIdentifier":"61eba7a4-87df-400a-9267-7ad6c6bcbf40", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Operator Mode Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateAutAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.StateAutAct" - } - }, - "dataSourceIdentifier":"8450c317-f6f6-4947-92b3-74e3fe4f041b", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Automatic Mode Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOffAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.StateOffAct" - } - }, - "dataSourceIdentifier":"a5040ee6-0ef4-4078-9b66-c0bf871e19e4", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Offline Mode Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcChannel", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.SrcChannel" - } - }, - "dataSourceIdentifier":"a8ac2d14-a2c5-4780-8936-f00065f3a1fe", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Selection of the active Service Source Mode interaction channel", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcExtAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.SrcExtAut" - } - }, - "dataSourceIdentifier":"5d512761-2d90-4298-b1f1-cbb4492f07db", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to External by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcIntAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.SrcIntAut" - } - }, - "dataSourceIdentifier":"1f687f54-15fc-4803-9a1d-1081c45a86ea", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to Internal by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcIntOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.SrcIntOp" - } - }, - "dataSourceIdentifier":"3b5851b0-1c48-4438-93f4-3c2ec87af62a", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to Intern by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcExtOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.SrcExtOp" - } - }, - "dataSourceIdentifier":"7ecfcbf3-4b55-46d3-b974-ea8ccac4abb3", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to External by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcExtAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.SrcExtAct" - } - }, - "dataSourceIdentifier":"3a56b20b-f1d8-44dc-9d9d-2783a134787f", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"External Source Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcIntAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.SrcIntAct" - } - }, - "dataSourceIdentifier":"7c3fbc55-de1a-4d45-99ab-a935166cc09e", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Internal Source Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"OSLevel", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.OSLevel" - } - }, - "dataSourceIdentifier":"b45bdbf4-084e-49fc-9bb9-76f110387348", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"OS Level variable (0: Local HMI, >0: POL HMI)", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"WQC", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.WQC" - } - }, - "dataSourceIdentifier":"734b907b-4679-49b6-b01b-122bff5884f0", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"255", - "description":"Worst Quality Code variable", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.CommandOp" - } - }, - "dataSourceIdentifier":"bb052761-8d8e-433c-805a-8659b01a9c81", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Command Input for Operator", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandInt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.CommandInt" - } - }, - "dataSourceIdentifier":"2552f157-012a-4a4c-924c-a73444ff9b63", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Command Input for Automatic-Intern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandExt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.CommandExt" - } - }, - "dataSourceIdentifier":"52df1427-cbdb-42d7-a612-3f6dd4f5f7d3", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Command Input for Automatic-Extern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.ProcedureOp" - } - }, - "dataSourceIdentifier":"f4b14fa4-62f1-4aba-8b63-ff1fe362ae80", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Procedure Input for Operator", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureInt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.ProcedureInt" - } - }, - "dataSourceIdentifier":"234f26f2-590c-4921-8acc-1470e28cc552", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Procedure Input for Automatic-Intern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureExt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.ProcedureExt" - } - }, - "dataSourceIdentifier":"6aaab343-b813-46d1-a349-f6a0a38c4495", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Procedure Input for Automatic-Extern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandEn", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.CommandEn" - } - }, - "dataSourceIdentifier":"59a605ff-0e60-4456-acaa-8559100cb8aa", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Transition Clearance from the Current State", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateCur", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.StateCur" - } - }, - "dataSourceIdentifier":"5b3edc0f-21ce-4423-8688-06f68a1b439d", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Current State", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureCur", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.ProcedureCur" - } - }, - "dataSourceIdentifier":"7b2b2c77-5ee6-4f8d-9fa5-b21a8d5c0d3f", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Current Procedure", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureReq", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.ProcedureReq" - } - }, - "dataSourceIdentifier":"73b9a6b4-1744-42b5-8bbb-ce52657162b7", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Requested Procedure", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"InteractQuestionID", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.InteractQuestionID" - } - }, - "dataSourceIdentifier":"87c09c1c-96f5-4ea2-bcc7-ef238a3dd23f", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Operator Request Question ID", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"InteractAnswerID", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.InteractAnswerID" - } - }, - "dataSourceIdentifier":"27a6830b-9bc4-4cce-88a5-4ab6443e417b", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Operator Request Answer ID", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"PosTextID", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.PosTextID" - } - }, - "dataSourceIdentifier":"808d4969-c6ef-4efd-a5c9-7d325f88f89d", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Service Information Text ID", - "pimadIdentifier":"TODO" - } - ], - "dataSourceIdentifier":"6e2f7e66-f7af-4642-b5c3-ad4975859e6b", - "description":"inline TODO above", - "name":"Integral2", - "initialized":true, - "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/ServiceControl", - "pimadIdentifier":"4ac34f94-5d66-4442-a795-249124f0f3a8", - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - } - }, - "metaModelRef":"MTPServiceSUCLib/Service", - "name":"Integral2", - "parameters":[ - - ], - "procedures":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "attributes":[ - { - "dataType":"xs:boolean", - "name":"IsSelfCompleting", - "initialized":true, - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "value":"false" - }, - { - "dataType":"xs:unsignedLong", - "name":"ProcedureID", - "initialized":true, - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "value":"1" - }, - { - "dataType":"xs:boolean", - "name":"IsDefault", - "initialized":true, - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "value":"true" - } - ], - "dataAssembly":{ - "dataItems":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagName", - "value":"Integral2_default", - "defaultValue":"Integral2_default", - "description":"TagName Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"OSLevel", - "value":"0", - "defaultValue":"0", - "description":"Should try adding Dynamic OSLevel", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagDescription", - "value":"Default Procedure of Integral2", - "defaultValue":"Default Procedure of Integral2", - "description":"TagDescription Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"WQC", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral2.Integral2_default.WQC" - } - }, - "dataSourceIdentifier":"003f2f4a-4e8e-4327-9542-56b275ffa6e7", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"255", - "description":"Worst Quality Code variable", - "pimadIdentifier":"TODO" - } - ], - "dataSourceIdentifier":"4fa9c4ab-0817-4156-b3ff-fa08038548bf", - "description":"inline TODO above", - "name":"Integral2_default", - "initialized":true, - "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/HealthStateView", - "pimadIdentifier":"28cd91e0-994b-45e7-b2c8-36b1c98d7673", - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - } - }, - "metaModelRef":"MTPServiceSUCLib/ServiceProcedure", - "name":"Integral2_default", - "parameters":[ - - ], - "dataSourceIdentifier":"178bef2d-160a-4d5b-abb5-bba03a4474d0", - "pimadIdentifier":"TODO" - } - ], - "dataSourceIdentifier":"820f9268-c2cb-4535-bcbf-6cf9f3253748", - "pimadIdentifier":"2c421035-07e3-4cdc-a557-7175b59a8ec3" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "attributes":[ - - ], - "dataAssembly":{ - "dataItems":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagName", - "value":"Trigonometry", - "defaultValue":"Trigonometry", - "description":"TagName Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagDescription", - "value":"Service for math operation Integral", - "defaultValue":"Service for math operation Integral", - "description":"TagDescription Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:byte", - "name":"WQC", - "value":"255", - "defaultValue":"255", - "description":"Worst Quality Code variable", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateChannel", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.StateChannel" - } - }, - "dataSourceIdentifier":"6ac10825-7aba-4786-8298-f03ef101d314", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Selection of the active Operation Mode interaction channel", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOffAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.StateOffAut" - } - }, - "dataSourceIdentifier":"6b9b0fee-9d7f-42aa-9507-e8ed014ddf3f", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Offline by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOpAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.StateOpAut" - } - }, - "dataSourceIdentifier":"963f2f22-5019-4dae-a567-7e1df8475cf2", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Operator by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateAutAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.StateAutAut" - } - }, - "dataSourceIdentifier":"729aceef-3f07-4504-a2b3-84212f57a099", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Automatic by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOffOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.StateOffOp" - } - }, - "dataSourceIdentifier":"e1b1b876-8697-47f3-aec6-f8a9e2daf9cf", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Offline by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOpOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.StateOpOp" - } - }, - "dataSourceIdentifier":"77e1550c-c8e3-4d9e-a349-89ddac272f8b", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Operator by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateAutOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.StateAutOp" - } - }, - "dataSourceIdentifier":"333bc326-21a1-4ca1-a30c-b43e6c2e4991", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Automatic by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOpAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.StateOpAct" - } - }, - "dataSourceIdentifier":"6e2c2e95-1cf5-4a9c-bd34-932560ef7edc", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Operator Mode Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateAutAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.StateAutAct" - } - }, - "dataSourceIdentifier":"4d923aea-c199-4b3d-a9e3-061057ecb63a", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Automatic Mode Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOffAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.StateOffAct" - } - }, - "dataSourceIdentifier":"179a7aa8-bd4c-45f3-8465-7ea3a672a5d7", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Offline Mode Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcChannel", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.SrcChannel" - } - }, - "dataSourceIdentifier":"335d1428-c9a8-4e2a-bddf-3008774eae21", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Selection of the active Service Source Mode interaction channel", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcExtAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.SrcExtAut" - } - }, - "dataSourceIdentifier":"7a4ecba9-0a5d-4256-8f64-91f786960ba0", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to External by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcIntAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.SrcIntAut" - } - }, - "dataSourceIdentifier":"90b6d4eb-54b1-406a-8bfa-d7162dd9b8d3", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to Internal by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcIntOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.SrcIntOp" - } - }, - "dataSourceIdentifier":"cbc7ea94-0d84-40c3-bd58-72401f00b971", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to Intern by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcExtOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.SrcExtOp" - } - }, - "dataSourceIdentifier":"c25e4c17-a13c-4373-a561-9964ac7324dd", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to External by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcExtAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.SrcExtAct" - } - }, - "dataSourceIdentifier":"2209ac24-065d-4e3c-b1ff-9ee64003289a", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"External Source Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcIntAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.SrcIntAct" - } - }, - "dataSourceIdentifier":"843d52c2-72cc-4374-9738-03eee1d60f59", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Internal Source Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"OSLevel", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.OSLevel" - } - }, - "dataSourceIdentifier":"c55af549-7386-48a1-bd6f-dc0fca4064d8", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"OS Level variable (0: Local HMI, >0: POL HMI)", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"WQC", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.WQC" - } - }, - "dataSourceIdentifier":"c6339f15-a556-4d56-992c-4b4e2b06b750", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"255", - "description":"Worst Quality Code variable", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.CommandOp" - } - }, - "dataSourceIdentifier":"b21d9073-9234-451c-ae0b-849bcd40ca07", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Command Input for Operator", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandInt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.CommandInt" - } - }, - "dataSourceIdentifier":"523881ce-1a38-448a-a042-823bf524f91e", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Command Input for Automatic-Intern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandExt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.CommandExt" - } - }, - "dataSourceIdentifier":"bdc42497-009f-4c18-b32e-a4846c9d3221", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Command Input for Automatic-Extern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.ProcedureOp" - } - }, - "dataSourceIdentifier":"ace4372b-ca4d-44a9-af05-3c1dde0fdbb4", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Procedure Input for Operator", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureInt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.ProcedureInt" - } - }, - "dataSourceIdentifier":"5020f836-bba0-4bd7-b4f1-451c8d0d1329", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Procedure Input for Automatic-Intern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureExt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.ProcedureExt" - } - }, - "dataSourceIdentifier":"b4ecac86-bf44-4dc8-b3c5-7f7dffc92da0", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Procedure Input for Automatic-Extern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandEn", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.CommandEn" - } - }, - "dataSourceIdentifier":"d0734477-9918-4458-a49c-73338b3fc1a9", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Transition Clearance from the Current State", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateCur", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.StateCur" - } - }, - "dataSourceIdentifier":"74dd75d1-8c49-49c8-8097-3594e9c038fa", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Current State", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureCur", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.ProcedureCur" - } - }, - "dataSourceIdentifier":"2d83db14-7046-4250-99c2-f718f2dd3305", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Current Procedure", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureReq", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.ProcedureReq" - } - }, - "dataSourceIdentifier":"fa015e55-5505-4cfc-9935-8d8d4369e74a", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Requested Procedure", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"InteractQuestionID", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.InteractQuestionID" - } - }, - "dataSourceIdentifier":"c89cfc1f-0f7f-46e5-8cf1-283e246ea409", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Operator Request Question ID", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"InteractAnswerID", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.InteractAnswerID" - } - }, - "dataSourceIdentifier":"4feb082d-c9f7-4df5-bc09-02a4d8eb1481", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Operator Request Answer ID", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"PosTextID", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.PosTextID" - } - }, - "dataSourceIdentifier":"5ea5e7c3-0c4c-4b6f-b503-b7f3989e9d8d", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Service Information Text ID", - "pimadIdentifier":"TODO" - } - ], - "dataSourceIdentifier":"b0bc77ca-96a3-485e-87bc-316f428c824d", - "description":"inline TODO above", - "name":"Trigonometry", - "initialized":true, - "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/ServiceControl", - "pimadIdentifier":"32709dda-bb2f-44f5-b814-8daa97aceb8d", - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - } - }, - "metaModelRef":"MTPServiceSUCLib/Service", - "name":"Trigonometry", - "parameters":[ - - ], - "procedures":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "attributes":[ - { - "dataType":"xs:boolean", - "name":"IsSelfCompleting", - "initialized":true, - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "value":"false" - }, - { - "dataType":"xs:unsignedLong", - "name":"ProcedureID", - "initialized":true, - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "value":"1" - }, - { - "dataType":"xs:boolean", - "name":"IsDefault", - "initialized":true, - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "value":"true" - } - ], - "dataAssembly":{ - "dataItems":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagName", - "value":"Trigonometry_default", - "defaultValue":"Trigonometry_default", - "description":"TagName Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagDescription", - "value":"Default Procedure of Trigonometry", - "defaultValue":"Default Procedure of Trigonometry", - "description":"TagDescription Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"OSLevel", - "value":"0", - "defaultValue":"0", - "description":"Should try adding Dynamic OSLevel", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"WQC", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Trigonometry.Trigonometry_default.WQC" - } - }, - "dataSourceIdentifier":"b749c9e8-2999-42ea-9ccf-652718d857e6", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"255", - "description":"Worst Quality Code variable", - "pimadIdentifier":"TODO" - } - ], - "dataSourceIdentifier":"98768474-c8f6-4108-9861-164741fa3a63", - "description":"inline TODO above", - "name":"Trigonometry_default", - "initialized":true, - "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/HealthStateView", - "pimadIdentifier":"6f3ff4f9-50a3-494f-b417-f96b8e5ddee9", - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - } - }, - "metaModelRef":"MTPServiceSUCLib/ServiceProcedure", - "name":"Trigonometry_default", - "parameters":[ - - ], - "dataSourceIdentifier":"e4a2e743-af75-4ae2-8115-8f215e4ee89c", - "pimadIdentifier":"TODO" - } - ], - "dataSourceIdentifier":"450948b6-e5f0-4cc2-abd4-f974c9d8e7c5", - "pimadIdentifier":"e2d888ce-aa00-4ee5-95ef-adc84737bf7c" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "attributes":[ - - ], - "dataAssembly":{ - "dataItems":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagName", - "value":"Integral1", - "defaultValue":"Integral1", - "description":"TagName Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagDescription", - "value":"Service for math operation Integral", - "defaultValue":"Service for math operation Integral", - "description":"TagDescription Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:byte", - "name":"WQC", - "value":"255", - "defaultValue":"255", - "description":"Worst Quality Code variable", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateChannel", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.StateChannel" - } - }, - "dataSourceIdentifier":"ec60b02b-7470-412d-92b2-f5ae0f5ac653", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Selection of the active Operation Mode interaction channel", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOffAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.StateOffAut" - } - }, - "dataSourceIdentifier":"efb006ab-7e8e-4eb4-a1cf-7709eb7efc09", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Offline by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOpAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.StateOpAut" - } - }, - "dataSourceIdentifier":"0b869f62-cdae-444b-9778-1d9b7d2c3cfb", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Operator by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateAutAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.StateAutAut" - } - }, - "dataSourceIdentifier":"67ead1c1-dad3-437b-a60d-f2bf438e889d", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Automatic by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOffOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.StateOffOp" - } - }, - "dataSourceIdentifier":"82ea6b26-53cc-41c2-8a5f-cfbb9ffae747", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Offline by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOpOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.StateOpOp" - } - }, - "dataSourceIdentifier":"c79d3d9e-e0a0-479c-b1cc-de62e7e0742f", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Operator by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateAutOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.StateAutOp" - } - }, - "dataSourceIdentifier":"7eb6e84f-b1f2-4d91-ac7b-3fbe6daa582e", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Operation Mode to Automatic by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOpAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.StateOpAct" - } - }, - "dataSourceIdentifier":"adca7a0a-543d-446b-a2a5-340a246ea0e3", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Operator Mode Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateAutAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.StateAutAct" - } - }, - "dataSourceIdentifier":"c4b6cdd0-a455-4225-93d5-39db76dcc8b6", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Automatic Mode Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateOffAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.StateOffAct" - } - }, - "dataSourceIdentifier":"fa0bb4f5-984c-4b5f-aaf1-721c46216476", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Offline Mode Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcChannel", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.SrcChannel" - } - }, - "dataSourceIdentifier":"779096b5-9e81-4838-9ebc-d2068bd7bcb7", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Selection of the active Service Source Mode interaction channel", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcExtAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.SrcExtAut" - } - }, - "dataSourceIdentifier":"763899ed-c769-47cb-9643-5ba5fd740981", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to External by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcIntAut", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.SrcIntAut" - } - }, - "dataSourceIdentifier":"2007ef96-0807-4229-8f17-d902fb084a41", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to Internal by automatic interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcIntOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.SrcIntOp" - } - }, - "dataSourceIdentifier":"345e2a6d-981d-4e77-a2f9-cdbc288c4f82", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to Intern by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcExtOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.SrcExtOp" - } - }, - "dataSourceIdentifier":"32b9d496-c51d-4986-b2f9-2506a48a3e98", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Set Source Mode to External by operator interaction", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcExtAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.SrcExtAct" - } - }, - "dataSourceIdentifier":"7c368e32-5558-4f17-bd78-5916cab1d6f0", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"External Source Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"SrcIntAct", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.SrcIntAct" - } - }, - "dataSourceIdentifier":"5a153ba5-5d01-4d46-a8bb-34c06d5fc813", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"false", - "description":"Internal Source Active", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"OSLevel", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.OSLevel" - } - }, - "dataSourceIdentifier":"e7ef7e4c-6d74-403f-9ab5-8e5d6d0d73ed", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"OS Level variable (0: Local HMI, >0: POL HMI)", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"WQC", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.WQC" - } - }, - "dataSourceIdentifier":"0e71bc46-f7fd-4f1a-9584-9930e641c68f", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"255", - "description":"Worst Quality Code variable", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.CommandOp" - } - }, - "dataSourceIdentifier":"ec9811dd-6fb8-4a48-8cf3-0c4e1a661057", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Command Input for Operator", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandInt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.CommandInt" - } - }, - "dataSourceIdentifier":"5a31555e-747c-4103-a14b-9401873452d1", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Command Input for Automatic-Intern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandExt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.CommandExt" - } - }, - "dataSourceIdentifier":"279f4fe2-f974-40d4-a16a-2613bede1fab", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Command Input for Automatic-Extern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureOp", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.ProcedureOp" - } - }, - "dataSourceIdentifier":"491ed7e3-6578-415e-893d-1d6b061f167e", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Procedure Input for Operator", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureInt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.ProcedureInt" - } - }, - "dataSourceIdentifier":"c311ca8c-0a88-473a-a128-7649f04dac8a", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Procedure Input for Automatic-Intern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureExt", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.ProcedureExt" - } - }, - "dataSourceIdentifier":"0db208f9-c559-4256-8878-af2f795ce9d1", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Procedure Input for Automatic-Extern", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"CommandEn", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.CommandEn" - } - }, - "dataSourceIdentifier":"369c01e8-1359-4eff-9851-56be34054680", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Transition Clearance from the Current State", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"StateCur", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.StateCur" - } - }, - "dataSourceIdentifier":"f0ac1de4-8b97-4ed1-84b0-01ab8c6f8f6b", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Current State", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureCur", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.ProcedureCur" - } - }, - "dataSourceIdentifier":"9177416d-96cb-4440-bca0-b942b3fda1ff", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Current Procedure", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"ProcedureReq", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.ProcedureReq" - } - }, - "dataSourceIdentifier":"b9a7fdb8-900b-48ec-baeb-28606c9b71dc", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Requested Procedure", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"InteractQuestionID", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.InteractQuestionID" - } - }, - "dataSourceIdentifier":"512a56d4-2f7a-411d-b816-3ba663310051", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Operator Request Question ID", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"InteractAnswerID", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.InteractAnswerID" - } - }, - "dataSourceIdentifier":"780e70d5-432e-48e0-84bc-34186704ad93", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Operator Request Answer ID", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"PosTextID", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.PosTextID" - } - }, - "dataSourceIdentifier":"24bb08a7-862e-4984-954e-531909f7bea3", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"0", - "description":"Service Information Text ID", - "pimadIdentifier":"TODO" - } - ], - "dataSourceIdentifier":"643089db-8d3a-4c9d-8e8c-76f695052d98", - "description":"inline TODO above", - "name":"Integral1", - "initialized":true, - "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/ServiceControl", - "pimadIdentifier":"b1a355cf-b9ca-40a0-b33f-824a6896efa1", - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - } - }, - "metaModelRef":"MTPServiceSUCLib/Service", - "name":"Integral1", - "parameters":[ - - ], - "procedures":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "attributes":[ - { - "dataType":"xs:boolean", - "name":"IsSelfCompleting", - "initialized":true, - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "value":"false" - }, - { - "dataType":"xs:unsignedLong", - "name":"ProcedureID", - "initialized":true, - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "value":"1" - }, - { - "dataType":"xs:boolean", - "name":"IsDefault", - "initialized":true, - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "value":"true" - } - ], - "dataAssembly":{ - "dataItems":[ - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagName", - "value":"Integral1_default", - "defaultValue":"Integral1_default", - "description":"TagName Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"TagDescription", - "value":"Default Procedure of Integral1", - "defaultValue":"Default Procedure of Integral1", - "description":"TagDescription Field", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:IDREF", - "name":"WQC", - "cIData":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "nodeId":{ - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "identifier":"Integral1.Integral1_default.WQC" - } - }, - "dataSourceIdentifier":"091cb441-e4d3-4777-b6c6-02fd3154dc0b", - "metaModelRef":"MTPCommunicationICLib/DataItem/OPCUAItem", - "defaultValue":"255", - "description":"Worst Quality Code variable", - "pimadIdentifier":"TODO" - }, - { - "initialized":true, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - }, - "dataType":"xs:string", - "name":"OSLevel", - "value":"0", - "defaultValue":"0", - "description":"Should try adding Dynamic OSLevel", - "pimadIdentifier":"TODO" - } - ], - "dataSourceIdentifier":"91ecc5ec-30f5-42d1-9cdf-fb82b5552982", - "description":"inline TODO above", - "name":"Integral1_default", - "initialized":true, - "metaModelRef":"MTPDataObjectSUCLib/DataAssembly/DiagnosticElement/HealthStateView", - "pimadIdentifier":"3c1fa11c-e752-42a1-ab76-3d5f8908848c", - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - }, - "responseHandler":{ - "responseVendor":{ - "errorResponseFactory":{ - - }, - "dummyResponseFactory":{ - - }, - "successResponseFactory":{ - - }, - "warningResponseFactory":{ - - } - } - } - }, - "metaModelRef":"MTPServiceSUCLib/ServiceProcedure", - "name":"Integral1_default", - "parameters":[ - - ], - "dataSourceIdentifier":"26ab2481-e3b1-48b0-9619-de2f985b8156", - "pimadIdentifier":"TODO" - } - ], - "dataSourceIdentifier":"5cbfb281-add2-4cc6-87a6-51887937dc5e", - "pimadIdentifier":"0b9bbeb7-1292-4bd2-934f-568b61954b3d" - } - ], - "initialized":true -} diff --git a/tests/pidctrl.json b/tests/pidctrl.json deleted file mode 100644 index e2654317..00000000 --- a/tests/pidctrl.json +++ /dev/null @@ -1,219 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "OSLevel": { - "nodeId": "Variable.OSLevel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateChannel": { - "nodeId": "Variable.StateChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAut": { - "nodeId": "Variable.StateOffAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAut": { - "nodeId": "Variable.StateOpAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAut": { - "nodeId": "Variable.StateAutAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffOp": { - "nodeId": "Variable.StateOffOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpOp": { - "nodeId": "Variable.StateOpOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutOp": { - "nodeId": "Variable.StateAutOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOpAct": { - "nodeId": "Variable.StateOpAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateAutAct": { - "nodeId": "Variable.StateAutAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "StateOffAct": { - "nodeId": "Variable.StateOffAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcChannel": { - "nodeId": "Variable.SrcChannel", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManAut": { - "nodeId": "Variable.SrcManAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAut": { - "nodeId": "Variable.SrcIntAut", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntOp": { - "nodeId": "Variable.SrcIntOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManOp": { - "nodeId": "Variable.SrcManOp", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcIntAct": { - "nodeId": "Variable.SrcIntAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SrcManAct": { - "nodeId": "Variable.SrcManAct", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PV": { - "nodeId": "Variable.PV", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PVSclMin": { - "nodeId": "Variable.PVSclMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PVSclMax": { - "nodeId": "Variable.PVSclMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "PVUnit": { - "nodeId": "Variable.PVUnit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SP": { - "nodeId": "Variable.SP", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SPSclMax": { - "nodeId": "Variable.SPSclMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SPSclMin": { - "nodeId": "Variable.SPSclMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SPUnit": { - "nodeId": "Variable.SPUnit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SPMan": { - "nodeId": "Variable.SPMan", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SPManMin": { - "nodeId": "Variable.SPManMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SPManMax": { - "nodeId": "Variable.SPManMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SPInt": { - "nodeId": "Variable.SPInt", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SPIntMin": { - "nodeId": "Variable.SPIntMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "SPIntMax": { - "nodeId": "Variable.SPIntMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MV": { - "nodeId": "Variable.MV", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MVMan": { - "nodeId": "Variable.MVMan", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MVMin": { - "nodeId": "Variable.MVMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MVMax": { - "nodeId": "Variable.MVMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MVSclMax": { - "nodeId": "Variable.MVSclMax", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MVSclMin": { - "nodeId": "Variable.MVSclMin", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "MVUnit": { - "nodeId": "Variable.MVUnit", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "P": { - "nodeId": "Variable.P", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Ti": { - "nodeId": "Variable.Ti", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Td": { - "nodeId": "Variable.Td", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} diff --git a/tests/servicecontrol.json b/tests/servicecontrol.json deleted file mode 100644 index 0d9ccd95..00000000 --- a/tests/servicecontrol.json +++ /dev/null @@ -1,164 +0,0 @@ -{ - "TagName":"Variable", - "TagDescription":"Service for math operation Integral", - "WQC":{ - "nodeId":"Variable.WQC", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "StateChannel":{ - "nodeId":"Variable.StateChannel", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "StateOffAut":{ - "nodeId":"Variable.StateOffAut", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "StateOpAut":{ - "nodeId":"Variable.StateOpAut", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "StateAutAut":{ - "nodeId":"Variable.StateAutAut", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "StateOffOp":{ - "nodeId":"Variable.StateOffOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "StateOpOp":{ - "nodeId":"Variable.StateOpOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "StateAutOp":{ - "nodeId":"Variable.StateAutOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "StateOpAct":{ - "nodeId":"Variable.StateOpAct", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "StateAutAct":{ - "nodeId":"Variable.StateAutAct", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "StateOffAct":{ - "nodeId":"Variable.StateOffAct", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "SrcChannel":{ - "nodeId":"Variable.SrcChannel", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "SrcExtAut":{ - "nodeId":"Variable.SrcExtAut", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "SrcIntAut":{ - "nodeId":"Variable.SrcIntAut", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "SrcIntOp":{ - "nodeId":"Variable.SrcIntOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "SrcExtOp":{ - "nodeId":"Variable.SrcExtOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "SrcExtAct":{ - "nodeId":"Variable.SrcExtAct", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "SrcIntAct":{ - "nodeId":"Variable.SrcIntAct", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "OSLevel":{ - "nodeId":"Variable.OSLevel", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "CommandOp":{ - "nodeId":"Variable.CommandOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "CommandInt":{ - "nodeId":"Variable.CommandInt", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "CommandExt":{ - "nodeId":"Variable.CommandExt", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "ProcedureOp":{ - "nodeId":"Variable.ProcedureOp", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "ProcedureInt":{ - "nodeId":"Variable.ProcedureInt", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "ProcedureExt":{ - "nodeId":"Variable.ProcedureExt", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "CommandEn":{ - "nodeId":"Variable.CommandEn", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "StateCur":{ - "nodeId":"Variable.StateCur", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "ProcedureCur":{ - "nodeId":"Variable.ProcedureCur", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "ProcedureReq":{ - "nodeId":"Variable.ProcedureReq", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "InteractQuestionID":{ - "nodeId":"Variable.InteractQuestionID", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "InteractAnswerID":{ - "nodeId":"Variable.InteractAnswerID", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - }, - "PosTextID":{ - "nodeId":"Variable.PosTextID", - "namespaceIndex":"urn:localhost:NodeOPCUA-Client", - "dataType":"xs:IDREF" - } -} diff --git a/tests/stringview.json b/tests/stringview.json deleted file mode 100644 index 7fcc173c..00000000 --- a/tests/stringview.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "TagName": "Variable", - "TagDescription": "Test", - "WQC": { - "nodeId": "Variable.WQC", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - }, - "Text": { - "nodeId": "Variable.Text", - "namespaceIndex": "localhost", - "dataType": "xs:IDREF" - } -} - - diff --git a/tests/testpea.json b/tests/testpea.json new file mode 100644 index 00000000..e69de29b