Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zhart
LECPServer
提交
a2bd39d0
L
LECPServer
项目概览
zhart
/
LECPServer
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
LECPServer
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
a2bd39d0
编写于
2月 28, 2021
作者:
D
DESKTOP-7ENJ933\xeden
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
更新1.0.18 添加Byte类型的读写,Byte类型长度必须是偶数
上级
1f7f3c35
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
139 addition
and
12 deletion
+139
-12
global/main.js
global/main.js
+102
-4
modules/dashboard.js
modules/dashboard.js
+37
-8
未找到文件。
global/main.js
浏览文件 @
a2bd39d0
// global value
// global value
var
g_version
=
"
v1.0.1
7
"
;
var
g_version
=
"
v1.0.1
8
"
;
$
(
"
[name='lb_version']
"
).
html
(
"
2020 © LECPServer By Leanboard Tech Ltd |
"
+
g_version
+
"
"
);
$
(
"
[name='lb_version']
"
).
html
(
"
2020 © LECPServer By Leanboard Tech Ltd |
"
+
g_version
+
"
"
);
JsProxyAPI
.
setTitle
(
"
LECPServer
"
+
g_version
)
JsProxyAPI
.
setTitle
(
"
LECPServer
"
+
g_version
)
JsProxyAPI
.
setNotifyIcon
(
"
logo.ico
"
);
JsProxyAPI
.
setNotifyIcon
(
"
logo.ico
"
);
...
@@ -474,6 +474,28 @@ function init_webapi_server() {
...
@@ -474,6 +474,28 @@ function init_webapi_server() {
}
else
{
}
else
{
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err
"
+
done
[
1
],
"
rtval
"
:
null
});
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err
"
+
done
[
1
],
"
rtval
"
:
null
});
}
}
}
else
if
(
type
==
"
Byte
"
)
{
if
(
protocol
==
"
modbus
"
){
let
addr
=
plc_read_node
(
node
,
g_plc_data
,
"
addr
"
);
addr
=
addr
.
toLowerCase
();
if
(
addr
.
startsWith
(
"
holding
"
)
||
addr
.
startsWith
(
"
h
"
)){
addr
=
addr
.
replace
(
"
holding
"
,
""
);
addr
=
addr
.
replace
(
"
h
"
,
""
);
done
=
JsProxyAPI
.
plcWriteBlocking
(
g_handler_plc
[
dev
],
addr
,
j
[
'
value
'
]);
}
else
if
(
addr
.
startsWith
(
"
input
"
)
||
addr
.
startsWith
(
"
i
"
)){
return
JSON
.
stringify
({
"
errcode
"
:
4058
,
"
errmsg
"
:
"
modbus does not support input register writing
"
,
"
rtval
"
:
null
});
}
else
{
addr
=
addr
;
done
=
JsProxyAPI
.
plcWriteBlocking
(
g_handler_plc
[
dev
],
addr
,
j
[
'
value
'
]);
}
}
else
{
done
=
JsProxyAPI
.
plcWriteBlocking
(
g_handler_plc
[
dev
],
plc_read_node
(
node
,
g_plc_data
,
"
addr
"
),
j
[
'
value
'
]);
}
if
(
done
[
0
]
==
true
)
{
return
JSON
.
stringify
({
"
errcode
"
:
0
,
"
errmsg
"
:
""
});
}
else
{
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err
"
+
done
[
1
],
"
rtval
"
:
null
});
}
}
else
if
(
type
==
"
Word
"
)
{
}
else
if
(
type
==
"
Word
"
)
{
if
(
protocol
==
"
modbus
"
){
if
(
protocol
==
"
modbus
"
){
let
addr
=
plc_read_node
(
node
,
g_plc_data
,
"
addr
"
);
let
addr
=
plc_read_node
(
node
,
g_plc_data
,
"
addr
"
);
...
@@ -496,7 +518,6 @@ function init_webapi_server() {
...
@@ -496,7 +518,6 @@ function init_webapi_server() {
}
else
{
}
else
{
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err
"
+
done
[
1
],
"
rtval
"
:
null
});
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err
"
+
done
[
1
],
"
rtval
"
:
null
});
}
}
}
else
if
(
type
==
"
DWord
"
)
{
}
else
if
(
type
==
"
DWord
"
)
{
if
(
protocol
==
"
modbus
"
){
if
(
protocol
==
"
modbus
"
){
let
addr
=
plc_read_node
(
node
,
g_plc_data
,
"
addr
"
);
let
addr
=
plc_read_node
(
node
,
g_plc_data
,
"
addr
"
);
...
@@ -565,7 +586,7 @@ function init_webapi_server() {
...
@@ -565,7 +586,7 @@ function init_webapi_server() {
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err
"
+
done
[
1
],
"
rtval
"
:
null
});
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err
"
+
done
[
1
],
"
rtval
"
:
null
});
}
}
}
else
{
}
else
{
return
JSON
.
stringify
({
"
errcode
"
:
4007
,
"
errmsg
"
:
"
Key type is not in Word / DWord /Bool / String / Float / Double
"
});
return
JSON
.
stringify
({
"
errcode
"
:
4007
,
"
errmsg
"
:
"
Key type is not in
Byte /
Word / DWord /Bool / String / Float / Double
"
});
}
}
}
catch
(
e
)
{
}
catch
(
e
)
{
return
JSON
.
stringify
({
"
errcode
"
:
4056
,
"
errmsg
"
:
"
plc_write_node err:
"
+
e
,
"
rtval
"
:
null
});
return
JSON
.
stringify
({
"
errcode
"
:
4056
,
"
errmsg
"
:
"
plc_write_node err:
"
+
e
,
"
rtval
"
:
null
});
...
@@ -673,6 +694,28 @@ function init_webapi_server() {
...
@@ -673,6 +694,28 @@ function init_webapi_server() {
}
else
{
}
else
{
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err [
"
+
node
+
"
] [
"
+
v
+
"
]
"
+
done
[
1
],
"
rtval
"
:
null
});
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err [
"
+
node
+
"
] [
"
+
v
+
"
]
"
+
done
[
1
],
"
rtval
"
:
null
});
}
}
}
else
if
(
type
==
"
Byte
"
)
{
if
(
protocol
==
"
modbus
"
){
let
addr
=
plc_read_node
(
node
,
g_plc_data
,
"
addr
"
);
addr
=
addr
.
toLowerCase
();
if
(
addr
.
startsWith
(
"
holding
"
)
||
addr
.
startsWith
(
"
h
"
)){
addr
=
addr
.
replace
(
"
holding
"
,
""
);
addr
=
addr
.
replace
(
"
h
"
,
""
);
done
=
JsProxyAPI
.
plcWriteBlocking
(
g_handler_plc
[
dev
],
addr
,
v
);
}
else
if
(
addr
.
startsWith
(
"
input
"
)
||
addr
.
startsWith
(
"
i
"
)){
return
JSON
.
stringify
({
"
errcode
"
:
4058
,
"
errmsg
"
:
"
modbus does not support input register writing
"
,
"
rtval
"
:
null
});
}
else
{
addr
=
addr
;
done
=
JsProxyAPI
.
plcWriteBlocking
(
g_handler_plc
[
dev
],
addr
,
v
);
}
}
else
{
done
=
JsProxyAPI
.
plcWriteBlocking
(
g_handler_plc
[
dev
],
plc_read_node
(
node
,
g_plc_data
,
"
addr
"
),
v
);
}
if
(
done
[
0
]
==
true
)
{
// return JSON.stringify({ "errcode": 0, "errmsg": "" });
}
else
{
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err [
"
+
node
+
"
] [
"
+
v
+
"
]
"
+
done
[
1
],
"
rtval
"
:
null
});
}
}
else
if
(
type
==
"
Word
"
)
{
}
else
if
(
type
==
"
Word
"
)
{
if
(
protocol
==
"
modbus
"
){
if
(
protocol
==
"
modbus
"
){
let
addr
=
plc_read_node
(
node
,
g_plc_data
,
"
addr
"
);
let
addr
=
plc_read_node
(
node
,
g_plc_data
,
"
addr
"
);
...
@@ -762,7 +805,7 @@ function init_webapi_server() {
...
@@ -762,7 +805,7 @@ function init_webapi_server() {
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err [
"
+
node
+
"
] [
"
+
v
+
"
]
"
+
done
[
1
],
"
rtval
"
:
null
});
return
JSON
.
stringify
({
"
errcode
"
:
4057
,
"
errmsg
"
:
"
plc_write_node err [
"
+
node
+
"
] [
"
+
v
+
"
]
"
+
done
[
1
],
"
rtval
"
:
null
});
}
}
}
else
{
}
else
{
return
JSON
.
stringify
({
"
errcode
"
:
4007
,
"
errmsg
"
:
"
Key type is not in Word / DWord /Bool / String / Float / Double
"
});
return
JSON
.
stringify
({
"
errcode
"
:
4007
,
"
errmsg
"
:
"
Key type is not in
Byte /
Word / DWord /Bool / String / Float / Double
"
});
}
}
}
catch
(
e
)
{
}
catch
(
e
)
{
return
JSON
.
stringify
({
"
errcode
"
:
4056
,
"
errmsg
"
:
"
plc_write_node err [
"
+
node
+
"
]
"
+
e
,
"
rtval
"
:
null
});
return
JSON
.
stringify
({
"
errcode
"
:
4056
,
"
errmsg
"
:
"
plc_write_node err [
"
+
node
+
"
]
"
+
e
,
"
rtval
"
:
null
});
...
@@ -945,6 +988,32 @@ async function init_plc() {
...
@@ -945,6 +988,32 @@ async function init_plc() {
}
}
// 读取PLC信息 Byte
function
plc_read_await
(
handler
,
addr
,
length
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
JsProxyAPI
.
plcRead
(
handler
,
addr
,
length
,
function
(
success
,
value
)
{
if
(
success
)
{
resolve
(
value
);
}
else
{
reject
(
value
);
}
});
});
}
// 写入PLC信息 Byte
function
plc_write_await
(
handler
,
addr
,
data
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
JsProxyAPI
.
plcWrite
(
handler
,
addr
,
data
,
function
(
success
,
value
)
{
if
(
success
)
{
resolve
(
value
);
}
else
{
reject
(
value
);
}
});
});
}
// 读取PLC信息 WORD
// 读取PLC信息 WORD
function
plc_read_uint16_await
(
handler
,
addr
,
length
)
{
function
plc_read_uint16_await
(
handler
,
addr
,
length
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
...
@@ -1171,6 +1240,9 @@ async function sync_plc_nodes_await() {
...
@@ -1171,6 +1240,9 @@ async function sync_plc_nodes_await() {
}
else
if
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
type
'
]
==
"
Bool
"
)
{
}
else
if
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
type
'
]
==
"
Bool
"
)
{
let
c
=
parseInt
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
length
'
]);
let
c
=
parseInt
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
length
'
]);
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
value
'
]
=
new
Array
(
c
).
fill
(
false
);
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
value
'
]
=
new
Array
(
c
).
fill
(
false
);
}
else
if
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
type
'
]
==
"
Byte
"
)
{
let
c
=
parseInt
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
length
'
]);
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
value
'
]
=
new
Array
(
c
).
fill
(
0
);
}
else
if
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
type
'
]
==
"
Word
"
)
{
}
else
if
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
type
'
]
==
"
Word
"
)
{
let
c
=
parseInt
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
length
'
]);
let
c
=
parseInt
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
length
'
]);
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
value
'
]
=
new
Array
(
c
).
fill
(
0
);
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
value
'
]
=
new
Array
(
c
).
fill
(
0
);
...
@@ -1252,6 +1324,32 @@ async function sync_plc_nodes_await() {
...
@@ -1252,6 +1324,32 @@ async function sync_plc_nodes_await() {
// 其他类型的PLC读取Bool
// 其他类型的PLC读取Bool
rt
=
await
plc_read_bool_await
(
g_handler_plc
[
dev
],
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
addr
'
],
parseInt
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
length
'
]));
rt
=
await
plc_read_bool_await
(
g_handler_plc
[
dev
],
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
addr
'
],
parseInt
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
length
'
]));
}
}
}
else
if
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
type
'
]
==
"
Byte
"
)
{
if
(
protocol
==
"
modbus
"
)
{
// modbus类型的PLC读取Byte
// modbus Byte 类型的地址结构有三种 holdingN inputN N
// 如 001 holding001 input001 分别代表 保持寄存器001 保持寄存器001 和输入寄存器001
// 默认使用保持寄存器
addr
=
addr_src
.
toLowerCase
();
if
(
addr
.
startsWith
(
"
holding
"
)
||
addr
.
startsWith
(
"
h
"
)){
addr
=
addr
.
replace
(
"
holding
"
,
""
);
addr
=
addr
.
replace
(
"
h
"
,
""
);
rt
=
await
plc_read_await
(
g_handler_plc
[
dev
],
"
x=3;
"
+
addr
,
parseInt
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
length
'
])
/
2
);
}
else
if
(
addr
.
startsWith
(
"
input
"
)
||
addr
.
startsWith
(
"
i
"
)){
addr
=
addr
.
replace
(
"
input
"
,
""
);
addr
=
addr
.
replace
(
"
i
"
,
""
);
rt
=
await
plc_read_await
(
g_handler_plc
[
dev
],
"
x=4;
"
+
addr
,
parseInt
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
length
'
])
/
2
);
}
else
{
addr
=
addr
;
rt
=
await
plc_read_await
(
g_handler_plc
[
dev
],
"
x=3;
"
+
addr
,
parseInt
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
length
'
])
/
2
);
}
}
else
{
// 其他类型的PLC读取Byte
rt
=
await
plc_read_await
(
g_handler_plc
[
dev
],
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
addr
'
],
parseInt
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
length
'
])
/
2
);
}
}
else
if
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
type
'
]
==
"
Word
"
)
{
}
else
if
(
g_plc_data
[
'
NODES
'
][
dev
][
key
][
'
type
'
]
==
"
Word
"
)
{
if
(
protocol
==
"
modbus
"
)
{
if
(
protocol
==
"
modbus
"
)
{
// modbus类型的PLC读取Word
// modbus类型的PLC读取Word
...
...
modules/dashboard.js
浏览文件 @
a2bd39d0
var
plc_dev_apg_select
=
""
;
var
plc_dev_apg_select
=
""
;
var
apg_dashboard
=
null
;
var
apg_dashboard
=
null
;
var
apg_last_val_of_length
=
""
;
function
init_apg_dashboard
(){
function
init_apg_dashboard
()
{
apg_dashboard
=
new
AppendGrid
({
apg_dashboard
=
new
AppendGrid
({
element
:
"
dt_process_start_page_start_page
"
,
element
:
"
dt_process_start_page_start_page
"
,
uiFramework
:
"
default
"
,
uiFramework
:
"
default
"
,
...
@@ -28,6 +29,7 @@ function init_apg_dashboard(){
...
@@ -28,6 +29,7 @@ function init_apg_dashboard(){
ctrlOptions
:
{
ctrlOptions
:
{
""
:
""
,
""
:
""
,
"
Bool
"
:
"
Bool
"
,
"
Bool
"
:
"
Bool
"
,
"
Byte
"
:
"
Byte
"
,
"
Word
"
:
"
Word
"
,
"
Word
"
:
"
Word
"
,
"
DWord
"
:
"
DWord
"
,
"
DWord
"
:
"
DWord
"
,
"
String
"
:
"
String
"
,
"
String
"
:
"
String
"
,
...
@@ -46,7 +48,7 @@ function init_apg_dashboard(){
...
@@ -46,7 +48,7 @@ function init_apg_dashboard(){
// e.target.style.backgroundColor = null;
// e.target.style.backgroundColor = null;
}
}
},
},
}
}
},
},
{
{
...
@@ -57,7 +59,32 @@ function init_apg_dashboard(){
...
@@ -57,7 +59,32 @@ function init_apg_dashboard(){
min
:
0
,
min
:
0
,
max
:
99999999
max
:
99999999
},
},
cellClass
:
"
form-control-input-sm
"
cellClass
:
"
form-control-input-sm
"
,
// Add change event
events
:
{
click
:
function
(
e
)
{
let
rowIndex
=
apg_dashboard
.
getRowIndex
(
parseInt
(
e
.
uniqueIndex
));
let
type
=
apg_dashboard
.
getCtrlValue
(
"
type
"
,
rowIndex
);
apg_last_val_of_length
=
e
.
target
.
value
;
},
change
:
function
(
e
)
{
let
rowIndex
=
apg_dashboard
.
getRowIndex
(
parseInt
(
e
.
uniqueIndex
));
let
type
=
apg_dashboard
.
getCtrlValue
(
"
type
"
,
rowIndex
);
// 针对Byte类型,需要偶数
if
(
type
===
"
Byte
"
)
{
if
(
parseInt
(
e
.
target
.
value
)
%
2
!==
0
)
{
// not odd
if
(
parseInt
(
apg_last_val_of_length
)
>
parseInt
(
e
.
target
.
value
)){
// --
e
.
target
.
value
=
parseInt
(
e
.
target
.
value
)
-
1
;
}
else
{
// ++
e
.
target
.
value
=
parseInt
(
e
.
target
.
value
)
+
1
;
}
}
}
}
}
},
},
{
{
name
:
"
note
"
,
name
:
"
note
"
,
...
@@ -90,7 +117,7 @@ function init_apg_dashboard(){
...
@@ -90,7 +117,7 @@ function init_apg_dashboard(){
let
inputGroup
=
document
.
createElement
(
"
div
"
);
let
inputGroup
=
document
.
createElement
(
"
div
"
);
inputGroup
.
classList
.
add
(
"
input-group
"
);
inputGroup
.
classList
.
add
(
"
input-group
"
);
parent
.
appendChild
(
inputGroup
);
parent
.
appendChild
(
inputGroup
);
// Create the input elementt
// Create the input elementt
let
inputControl
=
document
.
createElement
(
"
button
"
);
let
inputControl
=
document
.
createElement
(
"
button
"
);
let
copyControl
=
document
.
createElement
(
"
button
"
);
let
copyControl
=
document
.
createElement
(
"
button
"
);
...
@@ -100,7 +127,7 @@ function init_apg_dashboard(){
...
@@ -100,7 +127,7 @@ function init_apg_dashboard(){
inputControl
.
setAttribute
(
"
data-tags
"
,
uniqueIndex
);
inputControl
.
setAttribute
(
"
data-tags
"
,
uniqueIndex
);
inputControl
.
appendChild
(
t_send
);
inputControl
.
appendChild
(
t_send
);
inputGroup
.
appendChild
(
inputControl
);
inputGroup
.
appendChild
(
inputControl
);
copyControl
.
name
=
"
btn_dashboard_page_row_copy
"
;
copyControl
.
name
=
"
btn_dashboard_page_row_copy
"
;
copyControl
.
setAttribute
(
"
data-tags
"
,
uniqueIndex
);
copyControl
.
setAttribute
(
"
data-tags
"
,
uniqueIndex
);
copyControl
.
appendChild
(
t_copy
);
copyControl
.
appendChild
(
t_copy
);
...
@@ -199,8 +226,10 @@ $("#dt_process_start_page_start_page").on("click", "button[name='btn_dashboard_p
...
@@ -199,8 +226,10 @@ $("#dt_process_start_page_start_page").on("click", "button[name='btn_dashboard_p
if
(
type
!=
"
String
"
)
{
if
(
type
!=
"
String
"
)
{
let
a
=
rsp
.
split
(
"
,
"
);
let
a
=
rsp
.
split
(
"
,
"
);
let
max
=
length
;
let
max
=
length
;
if
(
a
.
length
<
length
)
{
if
(
type
!=
"
Byte
"
)
{
max
=
a
.
length
if
(
a
.
length
<
length
)
{
max
=
a
.
length
}
}
}
for
(
i
=
0
;
i
<
max
;
i
++
)
{
for
(
i
=
0
;
i
<
max
;
i
++
)
{
buff
.
push
(
a
[
i
]);
buff
.
push
(
a
[
i
]);
...
@@ -502,7 +531,7 @@ $("[name='btn_dashboard_page_delete_device']").on("click", function () {
...
@@ -502,7 +531,7 @@ $("[name='btn_dashboard_page_delete_device']").on("click", function () {
let
last_device_select
=
plc_dev_apg_select
;
let
last_device_select
=
plc_dev_apg_select
;
JsProxyAPI
.
fileWrite
(
"
plc.conf
"
,
JSON
.
stringify
(
g_plc_data
,
null
,
"
\t
"
));
JsProxyAPI
.
fileWrite
(
"
plc.conf
"
,
JSON
.
stringify
(
g_plc_data
,
null
,
"
\t
"
));
init_device_list
();
init_device_list
();
// 重新加载所有设备
// 重新加载所有设备
plc_close_all
();
plc_close_all
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录