diff --git a/data.db b/data.db index 4b0af30..e469ca1 100644 Binary files a/data.db and b/data.db differ diff --git a/index.d.ts b/index.d.ts index c114aae..369ca53 100644 --- a/index.d.ts +++ b/index.d.ts @@ -10,8 +10,8 @@ export type AppConfig = { log_interval_ms: number; }; -export type RegisterType = "HR" | "IR" -export type NumberType = 'UI16' | 'I16' | 'UI32' | 'I32' | 'FP32' +export type RegisterType = "HR" | "IR" | "DI" | "DO"; +export type NumberType = 'UI16' | 'I16' | 'UI32' | 'I32' | 'FP32' | 'BOOL'; export type DisplayValue = { data?: number; diff --git a/migrations/001-init.sql b/migrations/001-init.sql index bb9ad93..08f6fa3 100644 --- a/migrations/001-init.sql +++ b/migrations/001-init.sql @@ -34,8 +34,8 @@ CREATE TABLE IF NOT EXISTS "display_values" ( "name" VARCHAR(32) NOT NULL, "slave_id" INTEGER NOT NULL, "reg_addr" INTEGER DEFAULT 0 NOT NULL CHECK(reg_addr >= 0 AND reg_addr <= 65534), - "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", + "reg_type" VARCHAR(3) NOT NULL CHECK(reg_type IN("HR", "IR", "DI", "DO")) DEFAULT "IR", + "reg_format" VARCHAR(5) NOT NULL CHECK(reg_format IN("UI16", "I16", "UI32", "I32", "FP32", "BOOL")) DEFAULT "UI16", PRIMARY KEY("id"), FOREIGN KEY("slave_id") REFERENCES modbus_slaves("id") ON DELETE CASCADE ); @@ -48,7 +48,7 @@ CREATE TABLE IF NOT EXISTS "display_values" ( -- -- JSON Format: -- -- { -- -- graph: [{ reg_addr: 1 value: 4 }], --- -- display_values: [{ reg_addr: 1, name: "CV1" }] +-- -- display_values: [{ ... }] -- -- } -- "data" TEXT NOT NULL, -- PRIMARY KEY("id"), @@ -74,7 +74,10 @@ INSERT INTO "display_values" ( (6, "SP", 2, 15, "UI16", "IR"), (7, "CV1", 3, 16, "UI16", "HR"), (8, "CV2", 3, 17, "FP32", "HR"), - (9, "SP", 3, 15, "UI16", "IR"); + (9, "SP", 3, 15, "UI16", "IR"), + (10, "Control action type", 3, 0, "BOOL", "DI"), + (11, "Status ALARM1", 3, 1, "BOOL", "DO"), + (12, "Status ALARM2", 3, 2, "BOOL", "DO"); -------------------------------------------------------------------------------- -- Down -------------------------------------------------------------------------------- diff --git a/public/index.html b/public/index.html index cd81eac..c5bc604 100644 --- a/public/index.html +++ b/public/index.html @@ -287,7 +287,7 @@ +
+ diff --git a/services/modbus.service.js b/services/modbus.service.js index 0799227..9afa17d 100644 --- a/services/modbus.service.js +++ b/services/modbus.service.js @@ -82,7 +82,7 @@ export const modbusService = { /** * @param {number} addr - * @param {"HR" | "IR" | "DI"} type + * @param {import("..").RegisterType} type * @param {import("..").NumberType} format * @return {Promise} buffer data */ @@ -108,7 +108,10 @@ export const modbusService = { data = await modbusClient.readInputRegisters(addr, len); break; case "DI": - data = await modbusClient.readDiscreteInputs(addr, len); + data = await modbusClient.readDiscreteInputs(addr, 1); + break; + case "DO": + data = await modbusClient.readCoils(addr, 1); break; default: throw new Error("Incorrect modbus register type!"); diff --git a/utils/number.js b/utils/number.js index 97484e9..e6829b7 100644 --- a/utils/number.js +++ b/utils/number.js @@ -18,4 +18,6 @@ export function readNumberFromBuf(buf, type, order) { 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(); + + if (type === 'BOOL') return Buffer.from(buf).readUint8(); } \ No newline at end of file diff --git a/validators/display-value.schema.js b/validators/display-value.schema.js index 3e3259c..e2e13e6 100644 --- a/validators/display-value.schema.js +++ b/validators/display-value.schema.js @@ -5,8 +5,8 @@ export const displayValueSchema = object({ name: string().required(), slave_id: number().required(), reg_addr: number().min(0).max(65534).required(), - reg_format: string().oneOf(["UI16", "I16", "UI32", "I32", "FP32"]).required(), - reg_type: string().oneOf(["HR", "IR"]).required() + reg_format: string().oneOf(["UI16", "I16", "UI32", "I32", "FP32", "BOOL"]).required(), + reg_type: string().oneOf(["HR", "IR", "DI", "DO"]).required() }) export const removeDisplayValueSchema = displayValueSchema.pick(['id']); \ No newline at end of file