UNPKG

grunig-nodes

Version:

Grünig Nodes Library

565 lines (524 loc) 27.8 kB
module.exports = function(RED) { function ProcessControl(config) { RED.nodes.createNode(this, config); var node = this; var mysql = require('mysql'); var mssql = require('mssql'); node.databaseConfig = RED.nodes.getNode(config.database); if (this.databaseConfig) { } else { // Keine Konfigurationsnode konfiguriert node.error("Keine Konfigurationsnode konfiguriert"); } // MySQL-Verbindungsinformationen var host = node.databaseConfig.host; var port = node.databaseConfig.port; var user = node.databaseConfig.user; var password = node.databaseConfig.password; var database = node.databaseConfig.database; var mssqlSelected = node.databaseConfig.mssql; node.status({fill:"red",shape:"ring",text:"disconnected"}); var connection; var connected = false; var defaultProgramSelected = false; var sqlResult = null; var msgData = null; var magPosValue = []; var lastMagPos = 0; var IgnoreMagazineValue = false; connect(); // Verbindung zur MySQL-Datenbank herstellen, wenn gültige Verbindungsinformationen vorhanden sind function connect() { node.status({ fill: "green", shape: "ring", text: "connecting..." }); if (host && port && user && password && database) { if (mssqlSelected) { // MSSQL-Konfiguration const sqlConfig = { user: user, password: password, server: host, port: parseInt(port, 10), // Port in Zahl umwandeln database: database, options: { encrypt: true, enableArithAbort: true, trustServerCertificate: true // Akzeptiert selbstsignierte Zertifikate } }; connection = new mssql.ConnectionPool(sqlConfig); connection.connect().then(() => { node.status({ fill: "green", shape: "dot", text: "connected to MSSQL" }); connected = true; }).catch(err => { node.status({ fill: "red", shape: "ring", text: "ERROR: " + err.message }); node.error("Error connecting to MSSQL: " + err.message); }); } else { // MySQL-Verbindung connection = mysql.createConnection({ host: host, port: port, user: user, password: password, database: database }); connection.connect(function (err) { if (err) { node.status({ fill: "red", shape: "ring", text: "ERROR: " + err.message }); node.error("Error connecting to MySQL: " + err.message); } else { node.status({ fill: "green", shape: "dot", text: "connected to MySQL" }); connected = true; } }); } } else { node.error("Missing connection information"); } } // Function to close the database connection function disconnect() { if (mssqlSelected && connection) { connection.close().then(() => { node.status({ fill: "red", shape: "ring", text: "disconnected from MSSQL" }); connected = false; }).catch(err => { node.error("Error disconnecting from MSSQL: " + err.message); }); } else if (connection) { connection.end(err => { if (err) { node.error("Error disconnecting from MySQL: " + err.message); } else { node.status({ fill: "red", shape: "ring", text: "disconnected from MySQL" }); connected = false; } }); } } function getSQLresult(topic, callback) { try { if (connection && topic) { connection.query(topic, function(error, results, fields) { if (error) { node.error("Error executing MySQL query: " + error.message); return callback(error, null); } // Ergebnis zur Nachricht hinzufügen und senden callback(null, results); }); } } catch (error) { node.error("Error executing MySQL query: " + error.message); callback(error, null); } } function FrameManager(funct_frameID, funct_process, funct_function, msg_frameID, msg_process, callback) { if (!connection || connected === false) { host = node.databaseConfig.host; port = node.databaseConfig.port; user = node.databaseConfig.user; password = node.databaseConfig.password; database = node.databaseConfig.database; connect(); } else { // Einstellungen speichern var inputFrameId = funct_frameID; var inputFunct = funct_process; var inputProcess = funct_function; var sqlDataRecieved = false; var frameId, funct, process; if (inputFrameId === ""){ frameId = msg_frameID; } else { frameId = inputFrameId } if (inputProcess === "none"){ process = msg_process + "PN"; } else { process = inputProcess; } if (inputFunct === "none") { funct = funct_function; } else { funct = inputFunct; } var payload = {}; var topic = ""; payload.frameID = frameId; if (frameId && frameId !== 0) { // MySQL-Verbindung verwenden, um die Abfrage auszuführen if (funct == "ReadAllData") { topic = ` SELECT FrameId.FrameId, Frame.*, FrameData.ManufacturingDate, ProfileType.Profile, Material.Material, Mesh.*, MeshData.*, MeshAngle.Angle, Program.*, Customized.* FROM FrameId LEFT JOIN Frame ON FrameId.FKey_Frame = Frame.PKey_Frame LEFT JOIN FrameData ON FrameId.FKey_FrameData = FrameData.PKey_FrameData LEFT JOIN ProfileType ON Frame.FKey_ProfileType = ProfileType.PKey_ProfileType LEFT JOIN Material ON Frame.FKey_Material = Material.PKey_Material LEFT JOIN Mesh ON FrameId.FKey_Mesh = Mesh.PKey_Mesh LEFT JOIN MeshData ON FrameId.FKey_MeshData = MeshData.PKey_MeshData LEFT JOIN MeshAngle ON MeshData.FKey_MeshAngle = MeshAngle.PKey_MeshAngle LEFT JOIN Program ON FrameId.FKey_Program = Program.PKey_Program LEFT JOIN Customized ON FrameId.FKey_Customized = Customized.PKey_Customized WHERE FrameId.FrameId = '` + frameId + `'`; } else { topic = ` SELECT FrameId.PKey_FrameId, Program.*, Frame.TypNo FROM FrameId LEFT JOIN Program ON FrameId.FKey_Program = Program.PKey_Program LEFT JOIN Frame ON FrameId.FKey_Frame = Frame.PKey_Frame WHERE FrameId.FrameId = '` + frameId + `'`; } // MySQL-Verbindung verwenden, um die Abfrage auszuführen getSQLresult(topic, function(error, result) { if (error) { node.error("Error executing MySQL query: " + error.message); sqlDataRecieved = false; callback(error, null); } else { if (mssqlSelected) { result = result.recordset; } sqlResult = result; var programNumber, frameNumber; if (Array.isArray(sqlResult) && sqlResult.length <= 0) { msgData = {payload: "Error01"}; callback(null, msgData); return; } else if (funct === "ReadProgram") { if (sqlResult[0]["TypNo"]) { frameNumber = sqlResult[0]["TypNo"]; } else { msgData = {payload: "Error01"}; callback(null, msgData); return; } if (sqlResult[0][process]) { programNumber = sqlResult[0][process]; } else { msgData = {payload: "Error01"}; callback(null, msgData); return; } msgData = { payload: { "ProgramNumber": programNumber, "FrameNumber": frameNumber } } callback(null, msgData); } else if (funct === "ReadAllData") { if (sqlResult[0]) { msgData = {payload: sqlResult[0]}; callback(null, msgData); } else { msgData = {payload: "Error01"}; callback(null, msgData); return; } } if (funct === "CounterIncrease") { var programId = sqlResult[0].PKey_Program; // Ermitteln der Endung basierend auf dem inputProcess Wert var inputProcessPC = process + "PC"; // Hinzufügen der Endung zum CounterValue var counterValue = parseInt(sqlResult[0][inputProcessPC]) + 1; var topic = ` UPDATE Program SET '${inputProcessPC}' = '${counterValue}' WHERE PKey_Program = '` + programId + `'`; msgData = { payload: { programId: programId, counterValue: counterValue }, }; if (inputProcessPC && counterValue && programId) { getSQLresult(topic, function(error, result) { if (error) { node.error("Error executing MySQL query: " + error.message); sqlDataRecieved = false; callback(error, null); } else { sqlResult = result; callback(null, msgData); } }); } else { node.error("no valid input: ", topic); callback("no valid input", null); } } } }); } else { node.error("FrameID is not allowed to be 0 or undefined: " + frameId); callback("FrameID is not allowed to be 0", null); } } } // Nachrichtenverarbeitungsfunktion node.on('input', function(msg) { node.dirty = true; var machineID = msg.payload.MachineID; var magDataEnabled = config.magDataEnabled; var stmDataEnabled = config.stmDataEnabled; var defaultProgram = String(msg.payload.defaultProgram || config.defaultProgram || ""); var loadingActive = msg.payload.LoadingActive; var magPos = msg.payload.MagPos; if (msg.topic.includes("ProcessControl/IgnoreMagazineValue")) { IgnoreMagazineValue = msg.payload.Payload; } if (magPos <= 0 || magPos > 10) { lastMagPos = magPos; } if (lastMagPos !== magPos && loadingActive === "visible") { lastMagPos = magPos; var value = magPosValue[magPos]; if (value === undefined && IgnoreMagazineValue === false) { // Wenn kein Programm gefunden wurde, wird das default Programm gesetzt defaultProgramSelected = true; value = { "FrameId": [], "JobId": [], "Process": "", "Program": defaultProgram } } // Reset magPosValue magPosValue[magPos] = undefined; msgReset = [{ payload: { "FrameId": [], "JobId": [], "Process": "", "Program": "" }, topic: "GRUNIG/" + machineID + "/ProcessControl/MagPos" + magPos }] msgData = [{ payload: value, topic: "GRUNIG/" + machineID + "/ProcessControl/Loading" }]; node.send([msgReset,]); if (IgnoreMagazineValue === true) { var msgIgnoreMagazineValue = [{ payload: false, topic: "GRUNIG/" + machineID + "/ProcessControl/IgnoreMagazineValue" }] node.send([msgIgnoreMagazineValue,]); } else { node.send([msgData,]); } } if (msg.topic.includes(machineID) || msg.topic.includes("timer")) { if (msg.topic.includes("ProcessControl/Loading") || magDataEnabled && msg.topic.includes("ProcessControl/MagPos")) { var frameID = msg.payload.Payload.FrameId; var process = msg.payload.Payload.Process; var program = msg.payload.Payload.Program || ""; var jobID = msg.payload.Payload.JobId[0]; if (defaultProgramSelected && msg.topic.includes("ProcessControl/Loading")) { defaultProgramSelected = false; //NextProgramNumber if (program === "") { node.error("no default Program selected"); } else { value = program; } msgData = [{ payload: { 'value': value, 'unit': "#", }, topic: "GRUNIG/" + machineID + "/IO/NextProgramNumber" }]; if (value) { node.send([msgData,]); } } else if (frameID && process) { // Aufruf der FrameManager-Funktion mit einer Callback-Funktion FrameManager("", "none", "ReadAllData", frameID[0], process, function(error, result) { if (error) { node.error("Error executing FrameManager: " + error.message); } else { var value, status; if (result.payload !== "Error01"){ //Status status = "Successful"; value = true; msgData = [{ payload: { 'Success': value, 'Message': status }, topic: "GRUNIG/" + machineID + "/ProcessControl/Status" }]; node.send([msgData,]); if (magDataEnabled && msg.topic.includes("ProcessControl/MagPos")) { var match = msg.topic.match(/ProcessControl\/MagPos(\d+)$/); if (match) { var pos = parseInt(match[1], 10); magPosValue[pos] = msg.payload.Payload; } } if (msg.topic.includes("ProcessControl/Loading")) { if (stmDataEnabled) { // NextProgramNumberSTM if (program === "") { value = result.payload.ExposurePN; } else { value = program; } msgData = [{ payload: { 'value': value, 'unit': "#", }, topic: "GRUNIG/" + machineID + "/IO/NextProgramNumberSTM" }]; node.send([msgData,]); } //NextFrameNumber value = result.payload.TypNo; msgData = [{ payload: { 'value': value, 'unit': "#", }, topic: "GRUNIG/" + machineID + "/IO/NextFrameNumber" }]; if (value) { node.send([msgData,]); } //FrameID value = parseInt(frameID[0]); if (isNaN(value) || value === undefined) { value = 0; // Setzen Sie den Wert auf 0 } msgData = [{ payload: { 'value': value, 'unit': "#", }, topic: "GRUNIG/" + machineID + "/IO/FrameID" }]; node.send([msgData,]); //JobID value = parseInt(jobID); if (isNaN(value) || value === undefined) { value = 0; // Setzen Sie den Wert auf 0 } msgData = [{ payload: { 'value': value, 'unit': "#", }, topic: "GRUNIG/" + machineID + "/IO/JobID" }]; node.send([msgData,]); //set Storage msgData = [{ payload: { 'FrameId': frameID, 'StorageLocation': machineID, }, topic: "GRUNIG/ProcessControl/Storage" }]; node.send([msgData,]); //set Data msgData = [{ payload: { 'Process': process, 'FrameID': frameID }, topic: "DataProcessControl" }]; node.send([,msgData]); //NextProgramNumber if (program === "") { value = result.payload[process + "PN"]; } else { value = program; } msgData = [{ payload: { 'value': value, 'unit': "#", }, topic: "GRUNIG/" + machineID + "/IO/NextProgramNumber" }]; if (value) { node.send([msgData,]); } } } else { //Status status = "FrameID [ " + frameID[0] + " ] not found"; value = false; msgData = [{ payload: { 'Success': value, 'Message': status }, topic: "GRUNIG/" + machineID + "/ProcessControl/Status" }]; node.send([msgData,]); } } }); } } } }); // Node wird geschlossen node.on('close', function() { disconnect(); }); } // Node-Typ registrieren RED.nodes.registerType("ProcessControl", ProcessControl); };