Hi all,
I have a challenge, but there is a real problem.
I have more database entries(SQLITE) and based on it is running communication on modbus TCP.
Database entries(IP, ID, port) are used for modbus flex getter to read more devices.
Is there a counter, which counting, if data was correctly readed, or no. But based on it, I need for every DB row(device) calculate, which has wrong communication.
Is based on conversion RTU to TCP, so ping is at this moment out off game. Because, TCP running mostly without problems, only RTU conversion has sometimes problems (RS485).
…. and go on. …
I have s script, based on writing to flow.set variable, as an array, but I think, is not completely correct.
Here is :
var msg1, msg2, msg3,msg4,msg5, msg6, msg7, msg8, msg9,chrg_status, alarm_err;
var sel_row = parseInt(flow.get("db_row_id")); // database ID from autoincremented ROW
var inp_data = msg.payload; //flow.get("msg_data");
var data_l = inp_data.length;
var data_extr = inp_data.split(";"); // data from devices set to DB
var name_color = "white";
var sNumber = parseInt(flow.get("sNum"));// rotating number, non-reflecting to DB IDs
var loc_tcolor, com_err = [], cntDiff=0;
var cntWrong=[]; // counter wrong messages
var cntWcomb = flow.get(["cntW","UPSid1"]);// get wrong messages
var cntComm=[]; // counter all messages
var cntCcomb = flow.get(["cntC","UPSid2"]);// get all counted messages
var wpom1 =parseInt(cntWcomb[0]);// extraction from wrong get data
var wpom2 =parseInt(cntWcomb[1]);
var cpom1 =parseInt(cntCcomb[0]);// extraction from all counted get data
var cpom2 =parseInt(cntCcomb[1]);
if (!wpom2){// if is not set, setting to row ID DB
wpom2=sel_row;
}
if (!cpom2){
cpom2=sel_row; //if is not set, setting to row ID DB
}
if (!wpom1){
cntWrong[sNumber] = 0;// if is not set, setting to zero
}else{
cntWrong[sNumber] = wpom1;
}
if (!cpom1) {
cntComm[sNumber] = 0; // if is not set, setting to zero
}else{
cntComm[sNumber] = cpom1;
}
if (data_extr[9]==0){// only for data table, not immportant for counters
chrg_status=68;
} else if (data_extr[9] == 1) {
chrg_status = 34;
} else if (data_extr[9] == 2) {
chrg_status = 0;
}
if (com_err[sNumber] <7){// errors corresponding values ... not importat for counters
com_err[sNumber] = data_extr[12];
}
if (com_err[sNumber] ==0){
alarm_err = "green";
} else if (com_err[sNumber] >= 1) {
alarm_err = "red";
}
msg2 = { payload: sel_row };
// counters, counting and resets
if (cntComm[sNumber]>10){
cntComm[sNumber] = 0;
flow.set(["cntC","UPSid2"],[cntComm[sNumber],sel_row]);
cntWrong[sNumber] = 0;
flow.set(["cntW","UPSid1"],[cntWrong[sNumber],sel_row]);
}else{
cntComm[sNumber] ++;
flow.set(["cntC","UPSid2"],[cntComm[sNumber],sel_row]);
if (data_l<10){ // if counted less than 10 data packets, count as wrong
cntWrong[sNumber]++;
flow.set(["cntW","UPSid1"],[cntWrong[sNumber],sel_row]);
}
}
if (cntComm[sNumber]==10){// if counted summary for one DB row 10 go to calculation of wrong and correct
cntDiff = cntComm[sNumber] - cntWrong[sNumber];
if (cntDiff>5 || cntWrong[sNumber]>10){ // if is difference more than 50%, is wrong communication (err=7 is colored in table row as red)
com_err=7;
}
}
Rest of code is only for debug outputs to most message outs on function node.
So if you help me, I will be glad. I am out of minds, I am working on it for 2 days.
Thanks, Bobo