Chinese brand PSU_monitoring rs485 and Mango
-
That fixed it indeed.
i noticed i can check scripting code by clicking on the "little green Script dot".
Its still not clear to me.
-
Data source collects makes connection to device. ( interval for set here )
that is the easy part, -
tcp/ip Data point asks for data ( command data point )
-
tcp/ip Data point response listen for data
-
tcp/ip Data point "link" this to Scripting data point, "message queue" datapoint.
-
in the "link" script screen i put in ?? which pieces of code ?
-
in the Script Data source i also put in which pieces ?
i tried a lot of combinations, but i don t see it.
-
-
Response --> Point Link to parse values --> Scripting Data Source to process message queue into points' values
-
Alright i got it. thnx.
i had little play with :
var busVoltage = /[0-9A-Fa-f]{46}([0-9A-Fa-f]{8}).*/.exec(source.value);
var extractedValue = busVoltage[1];print (busVoltage[1]);
Script result:
42453939so that works, i found code for converting the hex to float, but no knowledge of writing (java) coding structure is a show stopper at the moment. but i do have fun learning , gehehe
-
Nice!
All the scripts use JavaScript.
-
little update ,
i found that i need to convert in javascript the with sort of
function hex2float(num) { var sign = (num & 0x80000000) ? -1 : 1; var exponent = ((num >> 23) & 0xff) - 127; var mantissa = 1 + ((num & 0x7fffff) / 0x7fffff); return sign * mantissa * Math.pow(2, exponent); } window.alert (hex2float("0xA4703942")); //flipped does the trick window.alert (hex2float("0x423970A4")); // outcome 46,36..... ( not rounded ) `` so little progress here.
-
Perfectum Resultativum ;
-
now put all this in Mango needs again some pointers i think..
-
i got this in " point links as script " , is this ok ?
and what to put in :
the script - source script. ?
i tried 1000 different combinations. and reading the wiki / manuals. but sorry, i don't
get it... -
Looking at your message queue, there are no identifiers. I assume this is because this is always for the same point. You could connect the point link to a point directly representing that value, if there is only one point's value in a message. Otherwise, you'll want some identifiers so that your script can parse the message queue and set points identified by the identifier to the value. I would have the identifiers in an object, where the object looks something like...
{ "identifier1" : p334, .....}
Where p334 is the variable name for the context point of the script.
-
identifiers, object etc, is probably JavaScript terms....hmm and i was thinking it was almost done, gehehe.
i need a neighbor with programming skills ( the neighbors house is for sale btw )
so back to learning books .. -
Ha! Well, we'll see how the politics here go ;)
Identifier is just a name that you can use in both places. Object is a JavaScript term for things defined as { "key": value }. Other names are Map and Dictionary.
-
ok learned "Object"
Can someone point me some explanation links about :
var identifierMap = { "messageIdentifier" : contextPoint1 .... }
cant find much on " indentifierMap " on internet somehow.
-
That's just a variable name, so that later in the script you can type
var ident = "messageIdentifier"; identifierMap[ ident ].set( /*your value here*/ );
Where context points are added to the script through the UI of the Scripting data source.
-
"messageIdentiefier" is the variable/object coming from point link script right ?
-
Yeah. It looks like right now you're setting message queue to something like
49.73;49.73;49.73;
The identifier would be useful if you have multiple values to get out of a message. You explicitly know their positions when you extract the values, so you can give them something you can identify them with. So instead your message queue may look like,
busVoltage-49.73;busVoltage-49.73;busVoltage-49.73;otherValue-106.2;yetAnotherValue-78.1;
such that you could identify where to set those values out to in the script.
-
this is what i got,
and point link details :
-
I would then modify the
return target.value + result + ";" ;
to
return target.value + "busvolt-" + result + ";" ;
But I think you will want to support multiple data extractions from the same message, like,
return target.value + "busvolt-" + result + ";otherMeasuredValue-" + result2 ;
Also, you may have to have call parseFloat, like so:
identifierMap[ messageInfo[0] ].set( parseFloat( messageInfo[1] ));
-
Well, looks something is working :
i ques this is normal ?
-
Alright. made some changes as, reading where not what the should be. now i get the right results from reading the Hex.
Script "message Queue"
// get Hex from source var busVoltage = /[0-9A-Fa-f]{30}([0-9A-Fa-f]{16}).*/.exec(source.value); var extractedValue = busVoltage[1]; var PsuLoad = /[0-9A-Fa-f]{78}([0-9A-Fa-f]{16}).*/.exec(source.value); var extractedValue = PsuLoad[1]; // Alarm relays Bit ( 1 is Alarm ) var Alarm = /[0-9A-Fa-f]{185}([0-9A-Fa-f]{1}).*/.exec(source.value); var extractedValue = Alarm[1]; // door alarm Bit (1 is Door open ) var DoorAlarm = /[0-9A-Fa-f]{185}([0-9A-Fa-f]{1}).*/.exec(source.value); var extractedValue = DoorAlarm[1]; var message = busVoltage[1]; function toASCII(message) { var result = ""; while(message.length > 1) { //parse two characters at a time var charCode = message.substr(0, 2); result += String.fromCharCode( "0x" + charCode ); message = message.substr(2); } return result; } // swap bytes /hex function swap32(val) { return ((val & 0xFF) << 24) | ((val & 0xFF00) << 8) | ((val >> 8) & 0xFF00) | ((val >> 24) & 0xFF); } //print (message); function hex2float(num) { var sign = (num & 0x80000000) ? -1 : 1; var exponent = ((num >> 23) & 0xff) - 127; var mantissa = 1 + ((num & 0x7fffff) / 0x7fffff); return sign * mantissa * Math.pow(2, exponent); } function roundToTwo(num) { return +(Math.round(num + "e+2") + "e-2"); } // covert Hex to String var subresult = (toASCII(message)); // create human readabe number var result = (roundToTwo(hex2float("0x" +subresult))); // send payload return target.value + "MainAlarm-" + Alarm[1] + ";" + "Door-" + DoorAlarm[1] + ";" + "busvolt-" + result + ";" ;
at this point i get as result : MainAlarm-0;Door-0;busvolt-53.68;
thats correct.
so i have right input , further i am still completely lost in how i should proceed.
i added my other (modbus) device and thats straight forward , enter the source and add data points to it. thats easy.
now why cant i see the logic for the other source.. -
Did made some progress, via an other approach ;
Created : tcp/ip source ( 2 sec update period )
Created : Data Point to that :"loggingType":"NONE", "dataType":"ALPHANUMERIC", "queryable":true, "readCommand":"<your_hex_request_for_your_device>", "settable":false, "valueIndex":0, "valueRegex":".*",
Created META-source
Created : Data Point to that :"name":"DoorAlarm", "enabled":true, "dataType":"ALPHANUMERIC", "updateContext":true, "varName":"p110"
added in script field :
// get Hex from source // Alarm relays Bit ( 1 is Alarm ) var DoorAlarm = /[0-9A-Fa-f]{185}([0-9A-Fa-f]{1}).*/.exec(p110.value); var extractedValue = DoorAlarm[1]; // payload return "DoorAlarm- " + DoorAlarm[1];
...
So i added some other "Meta-data points" for other values.
This works ok, and i can understand how it works.Now the first approach has probably benefits in setting up many same kind devices/values i guess , so i am focusing on that as well , as i would like to understand how that should work.