grunig-nodes
Version:
Grünig Nodes Library
565 lines (524 loc) • 27.8 kB
JavaScript
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);
};