From 92d5449246679293b7c0521721b6743a712dd881 Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Thu, 2 Nov 2023 14:43:39 +0300 Subject: [PATCH] read display values --- controllers/modbus.controller.js | 3 ++- data.db | Bin 20480 -> 20480 bytes index.d.ts | 4 +++- migrations/001-init.sql | 23 +++++++++++----------- public/index.html | 1 + public/js/app.js | 2 +- services/modbus.service.js | 30 +++++++++++++++++------------ utils/number.js | 2 ++ validators/display-value.schema.js | 3 ++- 9 files changed, 41 insertions(+), 27 deletions(-) diff --git a/controllers/modbus.controller.js b/controllers/modbus.controller.js index 3305220..2fb1df8 100644 --- a/controllers/modbus.controller.js +++ b/controllers/modbus.controller.js @@ -75,7 +75,8 @@ export const modbusController = { 'id', dv.id, 'name', dv.name, 'reg_addr', dv.reg_addr, - 'reg_format', dv.reg_format + 'reg_format', dv.reg_format, + 'reg_type', dv.reg_type ), ', ' ) || ']' END AS display_values FROM modbus_slaves AS ms diff --git a/data.db b/data.db index 76368a9dcb425530601ca45f827da37cfd2d6bfb..73f3c09798d350ef6d8d2d5fe53c8fd8525911fb 100644 GIT binary patch delta 790 zcmbV~&u`LT9LC?bEf!kJO9vHAm#*|+AYq1rOqXpjNH8>UfpoCwX?hrQ2Y-a%fy`xK zBqpAi@4=grc-6yf;>8%f`UiMX54(EU|KRs+fh`_w+Qa+w^E}_@o4oxo?vL?ESN9P@ zA^0W_jveNT+CIA6{-b~-gp-KeiMAy(oIDzgMd^7&5L4MKez8su!)ZmRxYcsAYBtL^ zZdG6DUua2I=|E4=9~TY7ajl#pMXb*D&Q|+T=fSN?F?1lk`}Z=vR4} z;`zItDc#1{@p^I`W8Qli-Qz<-9truQ!6hN~dL4^MdtZN6-+j2-r30<$4YZDc9omym z=*J6b%ITl~bGnD;*El(6`bE3F$J=zxFr!w>v6n1RVGX)vq!z8ybC&IuDZvVqxkS8L0#7^c*-!097^_1Gs&Kh0kUL#L_gA0SrIWA|S5%88&3Ve4Fu8q~=-y za?M8ys}qJfZZ?8yGiDh?zdTF%chHI=QFY-B{jkvVaQ-L3i2lBwIUgY{L{7*r@|}Dl z@5qQeCHG0oOPed?K#hn<#aPug8a#1a)@d#*q6Cv*WnQhhtizl*(`-Io^Evh0%*suy zYAC=GVC7Wae}m<7Xt$WD-grLlZiUUqFxMoX)k$!LM$BZ4E&KiXZx;OQ6Q>h2med7_la{j;xr?WonUz(ZfmMEEqbMui z)Hp_V2GJFTP5zmAnI)428VCXd zyN*ALn}dx(kdcuwIDlDDfQOxpK^Vw!4l`sH5a4EmNip#Y@UX(9jF|WYcvxUOLndAU zE@q%YPLLTq0>BuR5(ct?9_AL{W&|n&a}2ozHYwcZXVjQ{M_+@Fg};@7{{jC2{`vf^ t{HZ{Pgz?KN$TJFx@{9XcD!8PUWhSSJcm{=f8k&WqCFT^TPHy$D1^};= 0 AND reg_addr <= 65534), - -- "reg_type" VARCHAR(3) CHECK(reg_type IN("HR", "IR", "DI", "DO")) DEFAULT "IR", - "reg_format" INTEGER NOT NULL CHECK(reg_format IN(16, 32)) DEFAULT 16, + "reg_type" VARCHAR(3) NOT NULL CHECK(reg_type IN("HR", "IR")) DEFAULT "IR", + "reg_format" VARCHAR(5) NOT NULL CHECK(reg_format IN("UI16", "I16", "UI32", "I32", "FP32")) DEFAULT "UI16", PRIMARY KEY("id"), FOREIGN KEY("slave_id") REFERENCES modbus_slaves("id") ON DELETE CASCADE ); @@ -64,16 +64,17 @@ INSERT INTO "modbus_slaves" ( (4, "Device #4", NULL, NULL, NULL, "Label 4", 0); INSERT INTO "display_values" ( - "id", "name", "slave_id", "reg_addr", "reg_format" + "id", "name", "slave_id", "reg_addr", "reg_format", "reg_type" ) VALUES - (1, "CV1", 1, 10, 16), - (2, "CV2", 1, 11, 16), - (3, "SP", 1, 12, 16), - (4, "CV1", 2, 13, 16), - (5, "CV2", 2, 14, 16), - (6, "SP", 2, 15, 16), - (7, "CV1", 3, 16, 16), - (8, "SP", 3, 17, 16); + (1, "CV1", 1, 10, "UI16", "IR"), + (2, "CV2", 1, 11, "I16", "IR"), + (3, "SP", 1, 12, "UI32", "IR"), + (4, "CV1", 2, 13, "I32", "IR"), + (5, "CV2", 2, 14, "I16", "IR"), + (6, "SP", 2, 15, "UI16", "IR"), + (7, "CV1", 3, 16, "UI16", "HR"), + (8, "CV2", 3, 17, "FP32", "HR"), + (9, "SP", 3, 15, "UI16", "IR"); -------------------------------------------------------------------------------- -- Down -------------------------------------------------------------------------------- diff --git a/public/index.html b/public/index.html index 20e279d..8bae9e4 100644 --- a/public/index.html +++ b/public/index.html @@ -238,6 +238,7 @@
Value: Reg Addr: + Reg Type: Format:
diff --git a/public/js/app.js b/public/js/app.js index 0142c7a..c98f0c5 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -32,10 +32,10 @@ document.addEventListener("alpine:init", async () => { const { is_configured } = await api.get("/app/is_configured"); this.is_configured = is_configured; + connStatusEventSource.onmessage = (e) => (this.is_opened = e.data === "true"); if (config) this.config = config; if (is_configured) { - connStatusEventSource.onmessage = (e) => (this.is_opened = e.data === "true"); await utils.wait(500); this.currentPage = "monitoring"; return; diff --git a/services/modbus.service.js b/services/modbus.service.js index f66c419..d8022a4 100644 --- a/services/modbus.service.js +++ b/services/modbus.service.js @@ -7,7 +7,7 @@ export const modbusService = { * @return {Promise} */ async readDataFromDevice(device) { - const { g_display_reg_format, g_display_reg_addr, g_display_reg_type } = device; + const { g_display_reg_format, g_display_reg_addr, g_display_reg_type, display_values } = device; /** @type {import("..").EventDataStream} */ const data = { graph: null, displayValues: [] }; @@ -16,22 +16,22 @@ export const modbusService = { /* Read data for graph */ if (g_display_reg_addr !== null) { - const graphValue = await this.readModbusRegisters(g_display_reg_addr, g_display_reg_type, g_display_reg_format); + const graphValueBuf = await this.readModbusRegisters(g_display_reg_addr, g_display_reg_type, g_display_reg_format); data.graph = { - value: utils.readNumberFromBuf(graphValue, device.g_display_reg_format, 'BE'), + value: utils.readNumberFromBuf(graphValueBuf, device.g_display_reg_format, 'BE'), format: g_display_reg_format } } /* Read data for display values */ - if (device.display_values) { - for (const value of device.display_values) { - value.data = Buffer.from((await this.readModbusRegisters(value.reg_addr, 'HR', 'UI16'))).readUInt16BE(); + if (display_values) { + for (const v of device.display_values) { + const displayValueBuf = await this.readModbusRegisters(v.reg_addr, v.reg_type, v.reg_format) + v.data = utils.readNumberFromBuf(displayValueBuf, v.reg_format, 'BE') + data.displayValues.push(v); } } - data.displayValues = device.display_values; - return data; }, @@ -44,10 +44,16 @@ export const modbusService = { async readModbusRegisters(addr, type, format) { let data; let len = 1; - - if (format.includes('32')) len = 2; - if (format.includes('64')) len = 4; - if (format.includes('128')) len = 8; + + switch (format) { + case 'UI32': + case 'I32': + case 'FP32': + len = 2; + break; + default: + break; + } switch (type) { case 'HR': diff --git a/utils/number.js b/utils/number.js index d0bc699..97484e9 100644 --- a/utils/number.js +++ b/utils/number.js @@ -9,11 +9,13 @@ export function readNumberFromBuf(buf, type, order) { if (type === 'UI16' && order === 'BE') return Buffer.from(buf).readUInt16BE(); if (type === 'I16' && order === 'BE') return Buffer.from(buf).readInt16BE(); if (type === 'UI32' && order === 'BE') return Buffer.from(buf).readUint32BE(); + if (type === 'I32' && order === 'BE') return Buffer.from(buf).readInt32BE(); if (type === 'FP32' && order === 'BE') return Buffer.from(buf).readFloatBE(); /* Little-Endian */ if (type === 'UI16' && order === 'LE') return Buffer.from(buf).readUInt16LE(); if (type === 'I16' && order === 'LE') return Buffer.from(buf).readInt16LE(); if (type === 'UI32' && order === 'LE') return Buffer.from(buf).readUint32LE(); + if (type === 'I32' && order === 'LE') return Buffer.from(buf).readInt32LE(); if (type === 'FP32' && order === 'LE') return Buffer.from(buf).readFloatLE(); } \ No newline at end of file diff --git a/validators/display-value.schema.js b/validators/display-value.schema.js index e4d4ae7..3e3259c 100644 --- a/validators/display-value.schema.js +++ b/validators/display-value.schema.js @@ -5,7 +5,8 @@ export const displayValueSchema = object({ name: string().required(), slave_id: number().required(), reg_addr: number().min(0).max(65534).required(), - reg_format: number().oneOf([16, 32]).required() + reg_format: string().oneOf(["UI16", "I16", "UI32", "I32", "FP32"]).required(), + reg_type: string().oneOf(["HR", "IR"]).required() }) export const removeDisplayValueSchema = displayValueSchema.pick(['id']); \ No newline at end of file