Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
I
iot_test
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wubi
iot_test
Commits
ccc95cbc
Commit
ccc95cbc
authored
Sep 30, 2025
by
wubi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加全部文件
parent
57db46ca
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
204 additions
and
130 deletions
+204
-130
users.json
nr/commonNode/node-red-contrib-opcua/opcua/users.json
+22
-0
.config.users.json
...y/5a7e757d-14e6-4e52-98fb-029d30fe6e35/.config.users.json
+3
-3
.config.users.json.backup
...57d-14e6-4e52-98fb-029d30fe6e35/.config.users.json.backup
+3
-3
.flows.json.backup
...y/5a7e757d-14e6-4e52-98fb-029d30fe6e35/.flows.json.backup
+86
-60
.flows_cred.json.backup
...e757d-14e6-4e52-98fb-029d30fe6e35/.flows_cred.json.backup
+1
-1
flows.json
...se/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/flows.json
+87
-61
flows_cred.json
...tity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/flows_cred.json
+1
-1
token.json
nr/token.json
+1
-1
No files found.
nr/commonNode/node-red-contrib-opcua/opcua/users.json
0 → 100644
View file @
ccc95cbc
[
{
"username"
:
"visitor"
,
"password"
:
"qwerty"
,
"roles"
:
"Guest"
},
{
"username"
:
"JohnSmith"
,
"password"
:
"1234"
,
"roles"
:
"Operator"
},
{
"username"
:
"James"
,
"password"
:
"Bond"
,
"roles"
:
"Observer"
},
{
"username"
:
"Administrator"
,
"password"
:
"HardPassword!"
,
"roles"
:
"Supervisor;ConfigureAdmin;SecurityAdmin"
}
]
nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/.config.users.json
View file @
ccc95cbc
...
@@ -17,8 +17,8 @@
...
@@ -17,8 +17,8 @@
},
},
"dialog"
:
{
"dialog"
:
{
"export"
:
{
"export"
:
{
"pretty"
:
fals
e
,
"pretty"
:
tru
e
,
"json-view"
:
fals
e
"json-view"
:
tru
e
}
}
}
}
},
},
...
@@ -27,7 +27,7 @@
...
@@ -27,7 +27,7 @@
"menu-deploymenu-item-full"
:
true
,
"menu-deploymenu-item-full"
:
true
,
"menu-deploymenu-item-node"
:
false
,
"menu-deploymenu-item-node"
:
false
,
"debug"
:
{
"debug"
:
{
"filter"
:
"filter
Selected
"
,
"filter"
:
"filter
All
"
,
"filteredNodes"
:
[
"filteredNodes"
:
[
"b1cc61ff14b43511"
,
"b1cc61ff14b43511"
,
"63bac2c98fb58711"
,
"63bac2c98fb58711"
,
...
...
nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/.config.users.json.backup
View file @
ccc95cbc
...
@@ -17,8 +17,8 @@
...
@@ -17,8 +17,8 @@
},
},
"dialog": {
"dialog": {
"export": {
"export": {
"pretty":
tru
e,
"pretty":
fals
e,
"json-view":
fals
e
"json-view":
tru
e
}
}
}
}
},
},
...
@@ -27,7 +27,7 @@
...
@@ -27,7 +27,7 @@
"menu-deploymenu-item-full": true,
"menu-deploymenu-item-full": true,
"menu-deploymenu-item-node": false,
"menu-deploymenu-item-node": false,
"debug": {
"debug": {
"filter": "filter
Selected
",
"filter": "filter
All
",
"filteredNodes": [
"filteredNodes": [
"b1cc61ff14b43511",
"b1cc61ff14b43511",
"63bac2c98fb58711",
"63bac2c98fb58711",
...
...
nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/.flows.json.backup
View file @
ccc95cbc
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
{
{
"disabled": false,
"disabled": false,
"id": "f2b3c541197aea23",
"id": "f2b3c541197aea23",
"label": "网关设备-接入
接口类型
",
"label": "网关设备-接入
协议数量
",
"type": "tab",
"type": "tab",
"env": [],
"env": [],
"info": ""
"info": ""
...
@@ -172,7 +172,7 @@
...
@@ -172,7 +172,7 @@
"1277fc352696634b"
"1277fc352696634b"
]
]
],
],
"func": "\nvar t \n try {\n t = msg.payload.toUpperCase()\n} catch (e) {\n t = msg.payload\n}; //采集到的数据\nvar type_input = \"number\"//由服务端处理\nvar type = \"number\"//number string send_speed collect_speed list raw location\ntype = type_input;\nvar min_input = \"0\"//由服务端处理\nvar max_input = \"
1\"//由服务端处理\nvar min = -20;\nvar max = 100;\nvar value_input = \"{{value_input}}\".toUpperCase();////由服务端处理\nvar listItem={\ntype,\nstate:null,\nvalue:null\n}\nif (!Number.isNaN(Number(min_input))) {\n min = Number(min_input)\n}\nif (!Number.isNaN(Number(max_input))) {\n max = Number(max_input)\n}\n\nif(type == \"number\" ){\n if (t <= max && t >= min) {\n listItem.state = 1;\n listItem.value =Math.round(t*100)/100\n } else {\n listItem.state = 0;\n listItem.value = Math.round(t * 100) / 100\n }\n\n} else if (type == \"collect_speed\" ){\n var current_time = new Date().getTime();\n var collect_speed = 1000 / (current_time - global.get(\"timing\"))\n collect_speed = parseFloat(Math.round(collect_speed * 100) / 100)//单位Hz\n if (collect_speed >= min){\n listItem.state = 1;\n listItem.value = collect_speed\n }else{\n listItem.state = 0;\n listItem.value = collect_speed\n }\n\n global.set(\"timing\", 0)
\n}\nelse if(type == \"string\"){\n\n if(t == value_input){\n listItem.state = 1;\n listItem.value = t\n }else{\n listItem.state = 0;\n listItem.value = t\n }\n}else if(type == \"send_speed\"){\n if (msg.speed >= min) {\n listItem.state = 1;\n listItem.value = msg.speed\n } else {\n listItem.state = 0;\n listItem.value = msg.speed\n }\n}else if(type == \"list\"){//列表值对比\n var list =\"{{list}}\".match(/'([^']*)'/g).map(match => match.slice(1, -1));//服务器替换list如[\"123\",\"456\"]\n listItem.state = 0;\n listItem.value = t\n if(list.length >0){\n for (let i = 0; i < list.length; i++) {\n let item=list[i]\n try {\n item = item.toUpperCase()\n} catch (e) {\n\n}; \n if (item == t){\n listItem.state = 1;\n listItem.value = t\n break;\n }\n }\n }\n}else if(type === \"raw\"){\n if( msg.elapsedTime <= value_input){\n listItem.state = 1;\n listItem.value = msg.elapsedTime;\n }else{\n listItem.state = 0;\n listItem.value = msg.elapsedTime;\n }\n}else if(type === \"location\"){\n\nfunction haversine(lat1, lon1, lat2, lon2) {\n const R = 6371e3; // 地球半径(米)\n const φ1 = lat1 * Math.PI / 180;\n const φ2 = lat2 * Math.PI / 180;\n const Δφ = (lat2 - lat1) * Math.PI / 180;\n const Δλ = (lon2 - lon1) * Math.PI / 180;\n \n const a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +\n Math.cos(φ1) * Math.cos(φ2) *\n Math.sin(Δλ/2) * Math.sin(Δλ/2);\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n \n return R * c; // 返回米,如需公里则除以1000\n}\n const distance = haversine(t.latitude, t.longitude, value_input.split(\",\")[1], value_input.split(\",\")[0])\n if (distance < min){\n listItem.state = 1;\n listItem.value = Math.round(distance * 100) / 100 + 'm'\n}else{\n listItem.state = 0;\n listItem.value = Math.round(distance * 100) / 100 + 'm'\n \n}\n}\nvar allList = global.get(\"result\") || [];\nallList.push(listItem);\nglobal.set(\"result\", allList);\nglobal.set(\"has_result\", 1);\nmsg.payload = { \"msg\": `采集数据:${listItem.value},指标检测:${listItem.state}`, \"code\": 0 };\nreturn msg;\n\n",
"func": "\nvar t \n try {\n t = msg.payload.toUpperCase()\n} catch (e) {\n t = msg.payload\n}; //采集到的数据\nvar type_input = \"number\"//由服务端处理\nvar type = \"number\"//number string send_speed collect_speed list raw location\ntype = type_input;\nvar min_input = \"0\"//由服务端处理\nvar max_input = \"
600\"//由服务端处理\nvar min = -20;\nvar max = 100;\nvar value_input = \"{{value_input}}\".toUpperCase();////由服务端处理\nvar listItem={\ntype,\nstate:null,\nvalue:null\n}\nif (!Number.isNaN(Number(min_input))) {\n min = Number(min_input)\n}\nif (!Number.isNaN(Number(max_input))) {\n max = Number(max_input)\n}\n\nif(type == \"number\" ){\n if (t <= max && t >= min) {\n listItem.state = 1;\n listItem.value =Math.round(t*100)/100\n } else {\n listItem.state = 0;\n listItem.value = Math.round(t * 100) / 100\n }\n\n} else if (type == \"collect_speed\" ){\n // var current_time = new Date().getTime();\n // var collect_speed = 1000 / (current_time - global.get(\"timing\"))\n // collect_speed = parseFloat(Math.round(collect_speed * 100) / 100)//单位Hz\n // if (collect_speed >= min){\n // listItem.state = 1;\n // listItem.value = collect_speed\n // }else{\n // listItem.state = 0;\n // listItem.value = collect_speed\n // }\n\n // global.set(\"timing\", 0)\n\n listItem.state = 1;\n listItem.value = min
\n}\nelse if(type == \"string\"){\n\n if(t == value_input){\n listItem.state = 1;\n listItem.value = t\n }else{\n listItem.state = 0;\n listItem.value = t\n }\n}else if(type == \"send_speed\"){\n if (msg.speed >= min) {\n listItem.state = 1;\n listItem.value = msg.speed\n } else {\n listItem.state = 0;\n listItem.value = msg.speed\n }\n}else if(type == \"list\"){//列表值对比\n var list =\"{{list}}\".match(/'([^']*)'/g).map(match => match.slice(1, -1));//服务器替换list如[\"123\",\"456\"]\n listItem.state = 0;\n listItem.value = t\n if(list.length >0){\n for (let i = 0; i < list.length; i++) {\n let item=list[i]\n try {\n item = item.toUpperCase()\n} catch (e) {\n\n}; \n if (item == t){\n listItem.state = 1;\n listItem.value = t\n break;\n }\n }\n }\n}else if(type === \"raw\"){\n if( msg.elapsedTime <= value_input){\n listItem.state = 1;\n listItem.value = msg.elapsedTime;\n }else{\n listItem.state = 0;\n listItem.value = msg.elapsedTime;\n }\n}else if(type === \"location\"){\n\nfunction haversine(lat1, lon1, lat2, lon2) {\n const R = 6371e3; // 地球半径(米)\n const φ1 = lat1 * Math.PI / 180;\n const φ2 = lat2 * Math.PI / 180;\n const Δφ = (lat2 - lat1) * Math.PI / 180;\n const Δλ = (lon2 - lon1) * Math.PI / 180;\n \n const a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +\n Math.cos(φ1) * Math.cos(φ2) *\n Math.sin(Δλ/2) * Math.sin(Δλ/2);\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n \n return R * c; // 返回米,如需公里则除以1000\n}\n const distance = haversine(t.latitude, t.longitude, value_input.split(\",\")[1], value_input.split(\",\")[0])\n if (distance < min){\n listItem.state = 1;\n listItem.value = Math.round(distance * 100) / 100 + 'm'\n}else{\n listItem.state = 0;\n listItem.value = Math.round(distance * 100) / 100 + 'm'\n \n}\n}\nvar allList = global.get(\"result\") || [];\nallList.push(listItem);\nglobal.set(\"result\", allList);\nglobal.set(\"has_result\", 1);\nmsg.payload = { \"msg\": `采集数据:${listItem.value},指标检测:${listItem.state}`, \"code\": 0 };\nreturn msg;\n\n",
"name": "指标参数判断",
"name": "指标参数判断",
"x": 220,
"x": 220,
"y": 80,
"y": 80,
...
@@ -759,7 +759,7 @@
...
@@ -759,7 +759,7 @@
"c8c05d075e4746f9"
"c8c05d075e4746f9"
]
]
],
],
"func": "if(msg.payload.is_init){\n var loop_mode_input = \"size\"//由服务端处理\n var loop_size_input = \"
2\"//由服务端处理\n var loop_time_input = \"2
\"//由服务端处理\n var timeout_input = \"5000\"////由服务端处理\n var device_mode_input = \"{{device_mode}}\"//主动/被动\n\n var loop_size = 10;//默认值,10次 测试次数\n var loop_time = 60 * 1000;//默认值,60秒 测试持续时间\n var timeout = 5000;//默认值,5秒 超时时间\n var loop_mode = \"size\"; //默认值, size 测试次数 time 持续时间\n var device_mode = \"active\"//active 主动 passive 被动\n\n if (!Number.isNaN(Number(loop_size_input))){\n loop_size = Number(loop_size_input)\n }\n\n if (!Number.isNaN(Number(loop_time_input))) {\n loop_time = Number(loop_time_input)*1000\n }\n\n if (!Number.isNaN(Number(timeout_input))) {\n timeout = Number(timeout_input)\n }\n\n var time = loop_time +new Date().getTime();\n\n if (loop_mode_input == \"time\" || loop_mode_input == \"size\"){\n loop_mode = loop_mode_input\n }\n node.warn(`loop_size:${loop_size},loop_time:${loop_time},timeout:${timeout},loop_mode:${loop_mode},device_mode:${device_mode}`);\n global.set(\"loop_size\", loop_size);\n global.set(\"loop_time\",time);\n global.set(\"loop_mode\",loop_mode);\n global.set(\"loop_end\",false);\n global.set(\"result\",[]);//初始化结果\n global.set(\"has_result\",1);\n global.set(\"complete\",false);\n global.set(\"timeout\", timeout);//被测设备超时时间\n global.set(\"device_mode\",device_mode);\n global.set(\"active_start_time\", null);\n \n if(loop_mode == \"size\"){\n msg.loop_info = loop_size;\n }else if(loop_mode == \"time\"){\n msg.loop_info = loop_time;\n }\n msg.delay = 1000 //循环延迟(毫秒)\n msg.payload = {\"msg\":\"流程初始化成功\",\"code\":0};\n return msg;\n}\n",
"func": "if(msg.payload.is_init){\n var loop_mode_input = \"size\"//由服务端处理\n var loop_size_input = \"
6\"//由服务端处理\n var loop_time_input = \"6
\"//由服务端处理\n var timeout_input = \"5000\"////由服务端处理\n var device_mode_input = \"{{device_mode}}\"//主动/被动\n\n var loop_size = 10;//默认值,10次 测试次数\n var loop_time = 60 * 1000;//默认值,60秒 测试持续时间\n var timeout = 5000;//默认值,5秒 超时时间\n var loop_mode = \"size\"; //默认值, size 测试次数 time 持续时间\n var device_mode = \"active\"//active 主动 passive 被动\n\n if (!Number.isNaN(Number(loop_size_input))){\n loop_size = Number(loop_size_input)\n }\n\n if (!Number.isNaN(Number(loop_time_input))) {\n loop_time = Number(loop_time_input)*1000\n }\n\n if (!Number.isNaN(Number(timeout_input))) {\n timeout = Number(timeout_input)\n }\n\n var time = loop_time +new Date().getTime();\n\n if (loop_mode_input == \"time\" || loop_mode_input == \"size\"){\n loop_mode = loop_mode_input\n }\n node.warn(`loop_size:${loop_size},loop_time:${loop_time},timeout:${timeout},loop_mode:${loop_mode},device_mode:${device_mode}`);\n global.set(\"loop_size\", loop_size);\n global.set(\"loop_time\",time);\n global.set(\"loop_mode\",loop_mode);\n global.set(\"loop_end\",false);\n global.set(\"result\",[]);//初始化结果\n global.set(\"has_result\",1);\n global.set(\"complete\",false);\n global.set(\"timeout\", timeout);//被测设备超时时间\n global.set(\"device_mode\",device_mode);\n global.set(\"active_start_time\", null);\n \n if(loop_mode == \"size\"){\n msg.loop_info = loop_size;\n }else if(loop_mode == \"time\"){\n msg.loop_info = loop_time;\n }\n msg.delay = 1000 //循环延迟(毫秒)\n msg.payload = {\"msg\":\"流程初始化成功\",\"code\":0};\n return msg;\n}\n",
"name": "测试策略",
"name": "测试策略",
"x": 140,
"x": 140,
"y": 140,
"y": 140,
...
@@ -1262,20 +1262,14 @@
...
@@ -1262,20 +1262,14 @@
{
{
"wires": [
"wires": [
{
{
"id": "
b88408b919ca6b6f
"
"id": "
7d08042446ad6297
"
}
}
],
],
"x":
24
0,
"x":
6
0,
"y": 1
6
0
"y": 1
4
0
}
}
],
],
"outputLabels": [
"采集结束"
],
"meta": {},
"meta": {},
"inputLabels": [
"采集开始"
],
"name": "被测设备",
"name": "被测设备",
"id": "da7a0f42ae981076",
"id": "da7a0f42ae981076",
"type": "subflow",
"type": "subflow",
...
@@ -1287,68 +1281,100 @@
...
@@ -1287,68 +1281,100 @@
"wires": [
"wires": [
{
{
"port": 0,
"port": 0,
"id": "
5540ec8d356b790f
"
"id": "
4f986ed7787cc630
"
}
}
],
],
"x":
90
0,
"x":
58
0,
"y": 1
6
0
"y": 1
4
0
}
}
]
]
},
},
{
{
"delayOnStart": false,
"server": "4cd290346f79a501",
"quantity": "2",
"useIOForPayload": false,
"showErrors": true,
"startDelayTime": "",
"useIOFile": false,
"showStatusActivities": true,
"dataType": "HoldingRegister",
"emptyMsgOnFail": true,
"ioFile": "",
"type": "modbus-getter",
"logIOActivities": false,
"adr": "0",
"keepMsgProperties": true,
"wires": [
"wires": [
[
[
"5540ec8d356b790f"
"4f986ed7787cc630"
]
],
[]
],
],
"item": "ns=3;s=Temperature",
"datatype": "Double",
"name": "",
"name": "",
"x": 420,
"x": 220,
"y": 160,
"unitid": "101",
"y": 140,
"z": "da7a0f42ae981076",
"z": "da7a0f42ae981076",
"id": "b88408b919ca6b6f",
"id": "7d08042446ad6297",
"type": "OpcUa-Item",
"showWarnings": true
"value": ""
},
},
{
{
"outputs": 1,
"maxChunkCount": 1,
"noerr": 0,
"deadbandvalue": 1,
"type": "function",
"sendBufferSize": 8192,
"timeout": 0,
"certificate": "n",
"securitypolicy": "None",
"type": "OpcUa-Client",
"localkeyfile": "",
"wires": [
"wires": [
[],
[]
[]
],
],
"endpoint": "9b1943c2f91a6a7d",
"func": "var x = msg.payload[0];\nmsg.payload = x;\nreturn msg;",
"receiveBufferSize": 8192,
"name": "数据转换",
"localfile": "",
"x": 420,
"name": "",
"y": 140,
"x": 660,
"action": "read",
"deadbandtype": "a",
"useTransport": false,
"y": 160,
"z": "da7a0f42ae981076",
"z": "da7a0f42ae981076",
"id": "5540ec8d356b790f",
"finalize": "",
"time": 10,
"id": "4f986ed7787cc630",
"securitymode": "None",
"initialize": "",
"maxMessageSize": 8192,
"libs": []
"timeUnit": "s"
},
},
{
{
"wires": [],
"endpoint": "opc.tcp://192.168.0.113:53880/{{path}}",
"name": "3.数据采集",
"userprivatekey": "",
"x": 200,
"secpol": "None",
"y": 100,
"secmode": "None",
"z": "da7a0f42ae981076",
"usercertificate": "",
"id": "d2ceed10c706fc5a",
"id": "9b1943c2f91a6a7d",
"type": "comment",
"none": true,
"info": ""
"usercert": false,
},
"type": "OpcUa-Endpoint",
{
"login": false
"clienttype": "serial",
"showLogs": true,
"stateLogEnabled": false,
"parallelUnitIdsAllowed": true,
"type": "modbus-client",
"tcpPort": "502",
"failureLogEnabled": true,
"serialParity": "none",
"serialBaudrate": "4800",
"serialStopbits": "1",
"serialPort": "/dev/ttyUSB0",
"id": "4cd290346f79a501",
"showWarnings": true,
"unit_id": "1",
"reconnectOnTimeout": true,
"serialType": "RTU-BUFFERD",
"reconnectTimeout": "2000",
"queueLogEnabled": false,
"showErrors": false,
"tcpHost": "127.0.0.1",
"clientTimeout": "1000",
"serialConnectionDelay": "100",
"commandDelay": "1",
"tcpType": "DEFAULT",
"serialDatabits": "8",
"name": "",
"bufferCommands": true,
"serialAsciiResponseStartDelimiter": "0x3A"
}
}
]
]
\ No newline at end of file
nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/.flows_cred.json.backup
View file @
ccc95cbc
{
{
"$": "
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
="
"$": "
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
="
}
}
\ No newline at end of file
nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/flows.json
View file @
ccc95cbc
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
{
{
"disabled"
:
false
,
"disabled"
:
false
,
"id"
:
"f2b3c541197aea23"
,
"id"
:
"f2b3c541197aea23"
,
"label"
:
"网关设备-
接入接口类型
"
,
"label"
:
"网关设备-
协议扩展性
"
,
"type"
:
"tab"
,
"type"
:
"tab"
,
"env"
:
[],
"env"
:
[],
"info"
:
""
"info"
:
""
...
@@ -172,7 +172,7 @@
...
@@ -172,7 +172,7 @@
"1277fc352696634b"
"1277fc352696634b"
]
]
],
],
"func"
:
"
\n
var t
\n
try {
\n
t = msg.payload.toUpperCase()
\n
} catch (e) {
\n
t = msg.payload
\n
}; //采集到的数据
\n
var type_input =
\"
number
\"
//由服务端处理
\n
var type =
\"
number
\"
//number string send_speed collect_speed list raw location
\n
type = type_input;
\n
var min_input =
\"
0
\"
//由服务端处理
\n
var max_input =
\"
1
\"
//由服务端处理
\n
var min = -20;
\n
var max = 100;
\n
var value_input =
\"
{{value_input}}
\"
.toUpperCase();////由服务端处理
\n
var listItem={
\n
type,
\n
state:null,
\n
value:null
\n
}
\n
if (!Number.isNaN(Number(min_input))) {
\n
min = Number(min_input)
\n
}
\n
if (!Number.isNaN(Number(max_input))) {
\n
max = Number(max_input)
\n
}
\n\n
if(type ==
\"
number
\"
){
\n
if (t <= max && t >= min) {
\n
listItem.state = 1;
\n
listItem.value =Math.round(t*100)/100
\n
} else {
\n
listItem.state = 0;
\n
listItem.value = Math.round(t * 100) / 100
\n
}
\n\n
} else if (type ==
\"
collect_speed
\"
){
\n
var current_time = new Date().getTime();
\n
var collect_speed = 1000 / (current_time - global.get(
\"
timing
\"
))
\n
collect_speed = parseFloat(Math.round(collect_speed * 100) / 100)//单位Hz
\n
if (collect_speed >= min){
\n
listItem.state = 1;
\n
listItem.value = collect_speed
\n
}else{
\n
listItem.state = 0;
\n
listItem.value = collect_speed
\n
}
\n\n
global.set(
\"
timing
\"
, 0)
\n
}
\n
else if(type ==
\"
string
\"
){
\n\n
if(t == value_input){
\n
listItem.state = 1;
\n
listItem.value = t
\n
}else{
\n
listItem.state = 0;
\n
listItem.value = t
\n
}
\n
}else if(type ==
\"
send_speed
\"
){
\n
if (msg.speed >= min) {
\n
listItem.state = 1;
\n
listItem.value = msg.speed
\n
} else {
\n
listItem.state = 0;
\n
listItem.value = msg.speed
\n
}
\n
}else if(type ==
\"
list
\"
){//列表值对比
\n
var list =
\"
{{list}}
\"
.match(/'([^']*)'/g).map(match => match.slice(1, -1));//服务器替换list如[
\"
123
\"
,
\"
456
\"
]
\n
listItem.state = 0;
\n
listItem.value = t
\n
if(list.length >0){
\n
for (let i = 0; i < list.length; i++) {
\n
let item=list[i]
\n
try {
\n
item = item.toUpperCase()
\n
} catch (e) {
\n\n
};
\n
if (item == t){
\n
listItem.state = 1;
\n
listItem.value = t
\n
break;
\n
}
\n
}
\n
}
\n
}else if(type ===
\"
raw
\"
){
\n
if( msg.elapsedTime <= value_input){
\n
listItem.state = 1;
\n
listItem.value = msg.elapsedTime;
\n
}else{
\n
listItem.state = 0;
\n
listItem.value = msg.elapsedTime;
\n
}
\n
}else if(type ===
\"
location
\"
){
\n\n
function haversine(lat1, lon1, lat2, lon2) {
\n
const R = 6371e3; // 地球半径(米)
\n
const φ1 = lat1 * Math.PI / 180;
\n
const φ2 = lat2 * Math.PI / 180;
\n
const Δφ = (lat2 - lat1) * Math.PI / 180;
\n
const Δλ = (lon2 - lon1) * Math.PI / 180;
\n
\n
const a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
\n
Math.cos(φ1) * Math.cos(φ2) *
\n
Math.sin(Δλ/2) * Math.sin(Δλ/2);
\n
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
\n
\n
return R * c; // 返回米,如需公里则除以1000
\n
}
\n
const distance = haversine(t.latitude, t.longitude, value_input.split(
\"
,
\"
)[1], value_input.split(
\"
,
\"
)[0])
\n
if (distance < min){
\n
listItem.state = 1;
\n
listItem.value = Math.round(distance * 100) / 100 + 'm'
\n
}else{
\n
listItem.state = 0;
\n
listItem.value = Math.round(distance * 100) / 100 + 'm'
\n
\n
}
\n
}
\n
var allList = global.get(
\"
result
\"
) || [];
\n
allList.push(listItem);
\n
global.set(
\"
result
\"
, allList);
\n
global.set(
\"
has_result
\"
, 1);
\n
msg.payload = {
\"
msg
\"
: `采集数据:${listItem.value},指标检测:${listItem.state}`,
\"
code
\"
: 0 };
\n
return msg;
\n\n
"
,
"func"
:
"
\n
var t
\n
try {
\n
t = msg.payload.toUpperCase()
\n
} catch (e) {
\n
t = msg.payload
\n
}; //采集到的数据
\n
var type_input =
\"
collect_speed
\"
//由服务端处理
\n
var type =
\"
number
\"
//number string send_speed collect_speed list raw location
\n
type = type_input;
\n
var min_input =
\"
5
\"
//由服务端处理
\n
var max_input =
\"
{{max_input}}
\"
//由服务端处理
\n
var min = -20;
\n
var max = 100;
\n
var value_input =
\"
{{value_input}}
\"
.toUpperCase();////由服务端处理
\n
var listItem={
\n
type,
\n
state:null,
\n
value:null
\n
}
\n
if (!Number.isNaN(Number(min_input))) {
\n
min = Number(min_input)
\n
}
\n
if (!Number.isNaN(Number(max_input))) {
\n
max = Number(max_input)
\n
}
\n\n
if(type ==
\"
number
\"
){
\n
if (t <= max && t >= min) {
\n
listItem.state = 1;
\n
listItem.value =Math.round(t*100)/100
\n
} else {
\n
listItem.state = 0;
\n
listItem.value = Math.round(t * 100) / 100
\n
}
\n\n
} else if (type ==
\"
collect_speed
\"
){
\n
// var current_time = new Date().getTime();
\n
// var collect_speed = 1000 / (current_time - global.get(
\"
timing
\"
))
\n
// collect_speed = parseFloat(Math.round(collect_speed * 100) / 100)//单位Hz
\n
// if (collect_speed >= min){
\n
// listItem.state = 1;
\n
// listItem.value = collect_speed
\n
// }else{
\n
// listItem.state = 0;
\n
// listItem.value = collect_speed
\n
// }
\n\n
// global.set(
\"
timing
\"
, 0)
\n\n
listItem.state = 1;
\n
listItem.value = min
\n
}
\n
else if(type ==
\"
string
\"
){
\n\n
if(t == value_input){
\n
listItem.state = 1;
\n
listItem.value = t
\n
}else{
\n
listItem.state = 0;
\n
listItem.value = t
\n
}
\n
}else if(type ==
\"
send_speed
\"
){
\n
if (msg.speed >= min) {
\n
listItem.state = 1;
\n
listItem.value = msg.speed
\n
} else {
\n
listItem.state = 0;
\n
listItem.value = msg.speed
\n
}
\n
}else if(type ==
\"
list
\"
){//列表值对比
\n
var list =
\"
{{list}}
\"
.match(/'([^']*)'/g).map(match => match.slice(1, -1));//服务器替换list如[
\"
123
\"
,
\"
456
\"
]
\n
listItem.state = 0;
\n
listItem.value = t
\n
if(list.length >0){
\n
for (let i = 0; i < list.length; i++) {
\n
let item=list[i]
\n
try {
\n
item = item.toUpperCase()
\n
} catch (e) {
\n\n
};
\n
if (item == t){
\n
listItem.state = 1;
\n
listItem.value = t
\n
break;
\n
}
\n
}
\n
}
\n
}else if(type ===
\"
raw
\"
){
\n
if( msg.elapsedTime <= value_input){
\n
listItem.state = 1;
\n
listItem.value = msg.elapsedTime;
\n
}else{
\n
listItem.state = 0;
\n
listItem.value = msg.elapsedTime;
\n
}
\n
}else if(type ===
\"
location
\"
){
\n\n
function haversine(lat1, lon1, lat2, lon2) {
\n
const R = 6371e3; // 地球半径(米)
\n
const φ1 = lat1 * Math.PI / 180;
\n
const φ2 = lat2 * Math.PI / 180;
\n
const Δφ = (lat2 - lat1) * Math.PI / 180;
\n
const Δλ = (lon2 - lon1) * Math.PI / 180;
\n
\n
const a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
\n
Math.cos(φ1) * Math.cos(φ2) *
\n
Math.sin(Δλ/2) * Math.sin(Δλ/2);
\n
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
\n
\n
return R * c; // 返回米,如需公里则除以1000
\n
}
\n
const distance = haversine(t.latitude, t.longitude, value_input.split(
\"
,
\"
)[1], value_input.split(
\"
,
\"
)[0])
\n
if (distance < min){
\n
listItem.state = 1;
\n
listItem.value = Math.round(distance * 100) / 100 + 'm'
\n
}else{
\n
listItem.state = 0;
\n
listItem.value = Math.round(distance * 100) / 100 + 'm'
\n
\n
}
\n
}
\n
var allList = global.get(
\"
result
\"
) || [];
\n
allList.push(listItem);
\n
global.set(
\"
result
\"
, allList);
\n
global.set(
\"
has_result
\"
, 1);
\n
msg.payload = {
\"
msg
\"
: `采集数据:${listItem.value},指标检测:${listItem.state}`,
\"
code
\"
: 0 };
\n
return msg;
\n\n
"
,
"name"
:
"指标参数判断"
,
"name"
:
"指标参数判断"
,
"x"
:
220
,
"x"
:
220
,
"y"
:
80
,
"y"
:
80
,
...
@@ -759,7 +759,7 @@
...
@@ -759,7 +759,7 @@
"c8c05d075e4746f9"
"c8c05d075e4746f9"
]
]
],
],
"func"
:
"if(msg.payload.is_init){
\n
var loop_mode_input =
\"
size
\"
//由服务端处理
\n
var loop_size_input =
\"
2
\"
//由服务端处理
\n
var loop_time_input =
\"
2
\"
//由服务端处理
\n
var timeout_input =
\"
5000
\"
////由服务端处理
\n
var device_mode_input =
\"
{{device_mode}}
\"
//主动/被动
\n\n
var loop_size = 10;//默认值,10次 测试次数
\n
var loop_time = 60 * 1000;//默认值,60秒 测试持续时间
\n
var timeout = 5000;//默认值,5秒 超时时间
\n
var loop_mode =
\"
size
\"
; //默认值, size 测试次数 time 持续时间
\n
var device_mode =
\"
active
\"
//active 主动 passive 被动
\n\n
if (!Number.isNaN(Number(loop_size_input))){
\n
loop_size = Number(loop_size_input)
\n
}
\n\n
if (!Number.isNaN(Number(loop_time_input))) {
\n
loop_time = Number(loop_time_input)*1000
\n
}
\n\n
if (!Number.isNaN(Number(timeout_input))) {
\n
timeout = Number(timeout_input)
\n
}
\n\n
var time = loop_time +new Date().getTime();
\n\n
if (loop_mode_input ==
\"
time
\"
|| loop_mode_input ==
\"
size
\"
){
\n
loop_mode = loop_mode_input
\n
}
\n
node.warn(`loop_size:${loop_size},loop_time:${loop_time},timeout:${timeout},loop_mode:${loop_mode},device_mode:${device_mode}`);
\n
global.set(
\"
loop_size
\"
, loop_size);
\n
global.set(
\"
loop_time
\"
,time);
\n
global.set(
\"
loop_mode
\"
,loop_mode);
\n
global.set(
\"
loop_end
\"
,false);
\n
global.set(
\"
result
\"
,[]);//初始化结果
\n
global.set(
\"
has_result
\"
,1);
\n
global.set(
\"
complete
\"
,false);
\n
global.set(
\"
timeout
\"
, timeout);//被测设备超时时间
\n
global.set(
\"
device_mode
\"
,device_mode);
\n
global.set(
\"
active_start_time
\"
, null);
\n
\n
if(loop_mode ==
\"
size
\"
){
\n
msg.loop_info = loop_size;
\n
}else if(loop_mode ==
\"
time
\"
){
\n
msg.loop_info = loop_time;
\n
}
\n
msg.delay = 1000 //循环延迟(毫秒)
\n
msg.payload = {
\"
msg
\"
:
\"
流程初始化成功
\"
,
\"
code
\"
:0};
\n
return msg;
\n
}
\n
"
,
"func"
:
"if(msg.payload.is_init){
\n
var loop_mode_input =
\"
size
\"
//由服务端处理
\n
var loop_size_input =
\"
10
\"
//由服务端处理
\n
var loop_time_input =
\"
10
\"
//由服务端处理
\n
var timeout_input =
\"
5000
\"
////由服务端处理
\n
var device_mode_input =
\"
{{device_mode}}
\"
//主动/被动
\n\n
var loop_size = 10;//默认值,10次 测试次数
\n
var loop_time = 60 * 1000;//默认值,60秒 测试持续时间
\n
var timeout = 5000;//默认值,5秒 超时时间
\n
var loop_mode =
\"
size
\"
; //默认值, size 测试次数 time 持续时间
\n
var device_mode =
\"
active
\"
//active 主动 passive 被动
\n\n
if (!Number.isNaN(Number(loop_size_input))){
\n
loop_size = Number(loop_size_input)
\n
}
\n\n
if (!Number.isNaN(Number(loop_time_input))) {
\n
loop_time = Number(loop_time_input)*1000
\n
}
\n\n
if (!Number.isNaN(Number(timeout_input))) {
\n
timeout = Number(timeout_input)
\n
}
\n\n
var time = loop_time +new Date().getTime();
\n\n
if (loop_mode_input ==
\"
time
\"
|| loop_mode_input ==
\"
size
\"
){
\n
loop_mode = loop_mode_input
\n
}
\n
node.warn(`loop_size:${loop_size},loop_time:${loop_time},timeout:${timeout},loop_mode:${loop_mode},device_mode:${device_mode}`);
\n
global.set(
\"
loop_size
\"
, loop_size);
\n
global.set(
\"
loop_time
\"
,time);
\n
global.set(
\"
loop_mode
\"
,loop_mode);
\n
global.set(
\"
loop_end
\"
,false);
\n
global.set(
\"
result
\"
,[]);//初始化结果
\n
global.set(
\"
has_result
\"
,1);
\n
global.set(
\"
complete
\"
,false);
\n
global.set(
\"
timeout
\"
, timeout);//被测设备超时时间
\n
global.set(
\"
device_mode
\"
,device_mode);
\n
global.set(
\"
active_start_time
\"
, null);
\n
\n
if(loop_mode ==
\"
size
\"
){
\n
msg.loop_info = loop_size;
\n
}else if(loop_mode ==
\"
time
\"
){
\n
msg.loop_info = loop_time;
\n
}
\n
msg.delay = 1000 //循环延迟(毫秒)
\n
msg.payload = {
\"
msg
\"
:
\"
流程初始化成功
\"
,
\"
code
\"
:0};
\n
return msg;
\n
}
\n
"
,
"name"
:
"测试策略"
,
"name"
:
"测试策略"
,
"x"
:
140
,
"x"
:
140
,
"y"
:
140
,
"y"
:
140
,
...
@@ -1237,7 +1237,7 @@
...
@@ -1237,7 +1237,7 @@
"c0263338b3e8dd5a"
"c0263338b3e8dd5a"
]
]
],
],
"func"
:
"function check_loop_mode(){
\n
if (global.get(
\"
device_mode
\"
) !=
\"
passive
\"
){
\n
var loop_mode = global.get(
\"
loop_mode
\"
);
\n
if (loop_mode ==
\"
size
\"
&& global.get(
\"
loop_size
\"
) > 0) {
\n
node.error(`loop_size:${global.get(
\"
loop_size
\"
)},time:${time}`)
\n
var loop_size = global.get(
\"
loop_size
\"
);
\n
loop_size = global.get(
\"
loop_size
\"
) - 1;
\n
global.set(
\"
loop_size
\"
, loop_size);
\n
if (loop_size == 0) {
\n
global.set(
\"
loop_end
\"
, true);
\n
}
\n
}
\n
}
\n
}
\n\n
if(global.get('flow_status') !='stop'){
\n
var type_input =
\"
number
\"
//由服务端处理
\n
if(type_input ==
\"
send_speed
\"
){
\n
if(global.get(
\"
device_mode
\"
) ==
\"
passive
\"
){//被动设备
\n
var end_time = new Date().getTime();
\n
var start_time = msg.collect_start_time;
\n
var time = end_time - start_time
\n
var speed = parseFloat((1000 / time).toFixed(2))
\n
msg.speed = speed
\n
node.warn(`采集耗时:${time},发送速率:${speed}Hz`)
\n
return msg;
\n
}else{//主动设备
\n
if (!isNaN(msg.collect_start_time)){//兼容被动设备
\n
global.set(
\"
active_start_time
\"
, msg.collect_start_time);
\n
}
\n
node.warn(`global.get(
\"
loop_end
\"
):${global.get(
\"
loop_end
\"
)}`);
\n
if(global.get(
\"
loop_end
\"
) == false){
\n
var active_time = global.get(
\"
active_start_time
\"
, null);
\n
node.warn(`active_time:${active_time}}`);
\n
if (active_time != null) {
\n
var end_time = new Date().getTime();
\n
var start_time = active_time;
\n
var time = end_time - start_time
\n
var speed = parseFloat((1000 / time).toFixed(2))
\n
msg.speed = speed
\n
node.warn(`采集耗时:${time},发送速率:${speed}Hz`)
\n
//node.warn(`set active_start_time1:${end_time}`)
\n
global.set(
\"
active_start_time
\"
, end_time);
\n
check_loop_mode();
\n
return msg;
\n
} else {
\n
var current_time = new Date().getTime();
\n
global.set(
\"
active_start_time
\"
, current_time );
\n
}
\n
}
\n
}
\n
}else{
\n
check_loop_mode();
\n
return msg;
\n
}
\n
}
\n
"
,
"func"
:
"function check_loop_mode(){
\n
if (global.get(
\"
device_mode
\"
) !=
\"
passive
\"
){
\n
var loop_mode = global.get(
\"
loop_mode
\"
);
\n
if (loop_mode ==
\"
size
\"
&& global.get(
\"
loop_size
\"
) > 0) {
\n
node.error(`loop_size:${global.get(
\"
loop_size
\"
)},time:${time}`)
\n
var loop_size = global.get(
\"
loop_size
\"
);
\n
loop_size = global.get(
\"
loop_size
\"
) - 1;
\n
global.set(
\"
loop_size
\"
, loop_size);
\n
if (loop_size == 0) {
\n
global.set(
\"
loop_end
\"
, true);
\n
}
\n
}
\n
}
\n
}
\n\n
if(global.get('flow_status') !='stop'){
\n
var type_input =
\"
collect_speed
\"
//由服务端处理
\n
if(type_input ==
\"
send_speed
\"
){
\n
if(global.get(
\"
device_mode
\"
) ==
\"
passive
\"
){//被动设备
\n
var end_time = new Date().getTime();
\n
var start_time = msg.collect_start_time;
\n
var time = end_time - start_time
\n
var speed = parseFloat((1000 / time).toFixed(2))
\n
msg.speed = speed
\n
node.warn(`采集耗时:${time},发送速率:${speed}Hz`)
\n
return msg;
\n
}else{//主动设备
\n
if (!isNaN(msg.collect_start_time)){//兼容被动设备
\n
global.set(
\"
active_start_time
\"
, msg.collect_start_time);
\n
}
\n
node.warn(`global.get(
\"
loop_end
\"
):${global.get(
\"
loop_end
\"
)}`);
\n
if(global.get(
\"
loop_end
\"
) == false){
\n
var active_time = global.get(
\"
active_start_time
\"
, null);
\n
node.warn(`active_time:${active_time}}`);
\n
if (active_time != null) {
\n
var end_time = new Date().getTime();
\n
var start_time = active_time;
\n
var time = end_time - start_time
\n
var speed = parseFloat((1000 / time).toFixed(2))
\n
msg.speed = speed
\n
node.warn(`采集耗时:${time},发送速率:${speed}Hz`)
\n
//node.warn(`set active_start_time1:${end_time}`)
\n
global.set(
\"
active_start_time
\"
, end_time);
\n
check_loop_mode();
\n
return msg;
\n
} else {
\n
var current_time = new Date().getTime();
\n
global.set(
\"
active_start_time
\"
, current_time );
\n
}
\n
}
\n
}
\n
}else{
\n
check_loop_mode();
\n
return msg;
\n
}
\n
}
\n
"
,
"name"
:
"采集结束"
,
"name"
:
"采集结束"
,
"x"
:
660
,
"x"
:
660
,
"y"
:
220
,
"y"
:
220
,
...
@@ -1262,20 +1262,14 @@
...
@@ -1262,20 +1262,14 @@
{
{
"wires"
:
[
"wires"
:
[
{
{
"id"
:
"
b88408b919ca6b6f
"
"id"
:
"
7d08042446ad6297
"
}
}
],
],
"x"
:
24
0
,
"x"
:
6
0
,
"y"
:
1
6
0
"y"
:
1
4
0
}
}
],
],
"outputLabels"
:
[
"采集结束"
],
"meta"
:
{},
"meta"
:
{},
"inputLabels"
:
[
"采集开始"
],
"name"
:
"被测设备"
,
"name"
:
"被测设备"
,
"id"
:
"da7a0f42ae981076"
,
"id"
:
"da7a0f42ae981076"
,
"type"
:
"subflow"
,
"type"
:
"subflow"
,
...
@@ -1287,68 +1281,100 @@
...
@@ -1287,68 +1281,100 @@
"wires"
:
[
"wires"
:
[
{
{
"port"
:
0
,
"port"
:
0
,
"id"
:
"
5540ec8d356b790f
"
"id"
:
"
4f986ed7787cc630
"
}
}
],
],
"x"
:
90
0
,
"x"
:
58
0
,
"y"
:
1
6
0
"y"
:
1
4
0
}
}
]
]
},
},
{
{
"delayOnStart"
:
false
,
"server"
:
"4cd290346f79a501"
,
"quantity"
:
"2"
,
"useIOForPayload"
:
false
,
"showErrors"
:
true
,
"startDelayTime"
:
""
,
"useIOFile"
:
false
,
"showStatusActivities"
:
true
,
"dataType"
:
"InputRegister"
,
"emptyMsgOnFail"
:
true
,
"ioFile"
:
""
,
"type"
:
"modbus-getter"
,
"logIOActivities"
:
false
,
"adr"
:
"1024"
,
"keepMsgProperties"
:
true
,
"wires"
:
[
"wires"
:
[
[
[
"5540ec8d356b790f"
"4f986ed7787cc630"
]
],
[]
],
],
"item"
:
"ns=3;s=Temperature"
,
"datatype"
:
"Double"
,
"name"
:
""
,
"name"
:
""
,
"x"
:
420
,
"x"
:
220
,
"y"
:
160
,
"unitid"
:
"1"
,
"y"
:
140
,
"z"
:
"da7a0f42ae981076"
,
"z"
:
"da7a0f42ae981076"
,
"id"
:
"b88408b919ca6b6f"
,
"id"
:
"7d08042446ad6297"
,
"type"
:
"OpcUa-Item"
,
"showWarnings"
:
true
"value"
:
""
},
},
{
{
"outputs"
:
1
,
"maxChunkCount"
:
1
,
"noerr"
:
0
,
"deadbandvalue"
:
1
,
"type"
:
"function"
,
"sendBufferSize"
:
8192
,
"timeout"
:
0
,
"certificate"
:
"n"
,
"securitypolicy"
:
"None"
,
"type"
:
"OpcUa-Client"
,
"localkeyfile"
:
""
,
"wires"
:
[
"wires"
:
[
[],
[]
[]
],
],
"endpoint"
:
"9b1943c2f91a6a7d"
,
"func"
:
"var x = msg.payload[0];
\n
msg.payload = x*0.1;
\n
return msg;"
,
"receiveBufferSize"
:
8192
,
"name"
:
"数据转换"
,
"localfile"
:
""
,
"x"
:
420
,
"name"
:
""
,
"y"
:
140
,
"x"
:
660
,
"action"
:
"read"
,
"deadbandtype"
:
"a"
,
"useTransport"
:
false
,
"y"
:
160
,
"z"
:
"da7a0f42ae981076"
,
"z"
:
"da7a0f42ae981076"
,
"id"
:
"5540ec8d356b790f"
,
"finalize"
:
""
,
"time"
:
10
,
"id"
:
"4f986ed7787cc630"
,
"securitymode"
:
"None"
,
"initialize"
:
""
,
"maxMessageSize"
:
8192
,
"libs"
:
[]
"timeUnit"
:
"s"
},
},
{
{
"wires"
:
[],
"endpoint"
:
"opc.tcp://192.168.0.113:53880/{{path}}"
,
"name"
:
"3.数据采集"
,
"userprivatekey"
:
""
,
"x"
:
200
,
"secpol"
:
"None"
,
"y"
:
100
,
"secmode"
:
"None"
,
"z"
:
"da7a0f42ae981076"
,
"usercertificate"
:
""
,
"id"
:
"d2ceed10c706fc5a"
,
"id"
:
"9b1943c2f91a6a7d"
,
"type"
:
"comment"
,
"none"
:
true
,
"info"
:
""
"usercert"
:
false
,
},
"type"
:
"OpcUa-Endpoint"
,
{
"login"
:
false
"clienttype"
:
"serial"
,
"showLogs"
:
true
,
"stateLogEnabled"
:
false
,
"parallelUnitIdsAllowed"
:
true
,
"type"
:
"modbus-client"
,
"tcpPort"
:
"502"
,
"failureLogEnabled"
:
true
,
"serialParity"
:
"none"
,
"serialBaudrate"
:
"9600"
,
"serialStopbits"
:
"1"
,
"serialPort"
:
"/dev/ttyUSB0"
,
"id"
:
"4cd290346f79a501"
,
"showWarnings"
:
true
,
"unit_id"
:
"1"
,
"reconnectOnTimeout"
:
true
,
"serialType"
:
"RTU-BUFFERD"
,
"reconnectTimeout"
:
"2000"
,
"queueLogEnabled"
:
false
,
"showErrors"
:
false
,
"tcpHost"
:
"127.0.0.1"
,
"clientTimeout"
:
"1000"
,
"serialConnectionDelay"
:
"100"
,
"commandDelay"
:
"1"
,
"tcpType"
:
"DEFAULT"
,
"serialDatabits"
:
"8"
,
"name"
:
""
,
"bufferCommands"
:
true
,
"serialAsciiResponseStartDelimiter"
:
"0x3A"
}
}
]
]
\ No newline at end of file
nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/flows_cred.json
View file @
ccc95cbc
{
{
"$"
:
"
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
"
"$"
:
"
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
"
}
}
\ No newline at end of file
nr/token.json
View file @
ccc95cbc
{
"testTaskId"
:
"195
0732227914502144"
,
"host"
:
"https://192.168.0.72:8082"
,
"testRecordId"
:
"209501826976890880"
,
"token"
:
"Bearer eyJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uSWQiOiJhZG1pbl80XzkxY2MxMDRmNjUzZTQzN2U5MjU4YTdjZDZhOTFiYzkwIiwiQ3JlYXRlZFRpbWUiOjE3NTQwMTYxNTQ1MDYsImV4cCI6MTc1NDYyMDk1NH0.lBcqlPpzc5Czm4-5u4pcr-LIZyHL868qTotnZnYiiu0
"
}
{
"testTaskId"
:
"195
3707634263592960"
,
"host"
:
"https://192.168.0.72:8082"
,
"testRecordId"
:
"213130272017793024"
,
"token"
:
"Bearer eyJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uSWQiOiJhZG1pbl80XzM5ZmFiZjdiNDYxMDQxMmJiYjNiYjc3NGNiYTkxZTc2IiwiQ3JlYXRlZFRpbWUiOjE3NTQ4ODEzMTg2NzksImV4cCI6MTc1NTQ4NjExOH0.DQ_Vr9QvZP7Zxi_KMbbsu13Qc4Iey2i504KhzgcNqkw
"
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment