提交 a2bd39d0 编写于 作者: D DESKTOP-7ENJ933\xeden

更新1.0.18 添加Byte类型的读写,Byte类型长度必须是偶数

上级 1f7f3c35
// global value // global value
var g_version = "v1.0.17"; var g_version = "v1.0.18";
$("[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
......
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.
先完成此消息的编辑!
想要评论请 注册