//表面式倾角计 sensorType=43
// 1、线序: 红>12V+ ,黑>12V- , 白>485A , 绿>485B
// 2、采集指令:01 04 00 00 00 12 70 07 ( 1>地址码 ,2>功能码 , 3、4>寄存器起始位 , 5、6>读取寄存器个数, 8>CRC-L,9>CRC-H 。校验码 CRC-16 Modbus)
// 3、应答数据示例:04 04 24 4B 65 00 0F 00 FD 02 E0 FD 71 05 33 05 2E 05 28 05 25 05 1E 05 15 05 25 05 3C 05 52 05 6D 05 92 05 A4 05 B8 7C 4E (1>地址码 ,2>功能码 ,3>数据字节数 ,4、5>传感器编号 ,6、7>传感器型号,8、9>温度*10,10、11>X轴角度*100 ,12、13>Y轴角度*100 ……。 注:温度和倾角数据均为 INT16 带正负号的整型数据)
// 4、解析目标:X=X轴角度,Y=Y轴角度,Temperature=温度
function Decode(fPort, bytes) {
var jsonobj;
var result = 0;
// 当前时间
var myDate = new Date();
var current_time = myDate.toLocaleString();
// 采集数据为41个字节
if (bytes.length >= 41) {
jsonobj = {
"Flag": 1,
"SensorType": 43,
"SensorNumberThird": 0,
"X": parseX(bytes),
"Y": parseY(bytes),
"Temperature": parseTemperature(bytes),
"Timestamp": current_time
};
} else {
jsonobj = {
"Flag": -1,
"SensorType": 43,
"SensorNumberThird": 0,
"Timestamp": current_time
};
}
return jsonobj;
}
// 计算温度值 8-9为温度*10
function parseTemperature(bytes) {
var tempBinVal = hexToBinary(bytes[7], 8) + hexToBinary(bytes[8], 8);
// console.info("temperature binaryValue", tempBinVal);
// 最高位为0为正式,1则为负数
if(tempBinVal.substring(0, 1) == '0') {
return parseInt(tempBinVal, 2) *(0.1);
}else { //负数
return binToComplement(tempBinVal, 16) * (-1 * 0.1);
}
}
// 计算X值 10-11为X轴角度*100
function parseX(bytes) {
var xBinVal = hexToBinary(bytes[9], 8) + hexToBinary(bytes[10], 8);
// 最高位为0为正式,1则为负数
if(xBinVal.substring(0, 1) == '0') {
return parseInt(xBinVal, 2) *(0.01);
}else { //负数用补码表示,绝对值需要求原码
return binToComplement(xBinVal, 16) * (-1 * 0.01);
}
}
// 计算Y值 12-13为Y轴角度*100
function parseY(bytes) {
var yBinVal = hexToBinary(bytes[11], 8) + hexToBinary(bytes[12], 8);
// 最高位为0为正式,1则为负数
if(yBinVal.substring(0, 1) == '0') {
return parseInt(yBinVal, 2) *(0.01);
}else { //负数
return binToComplement(yBinVal, 16) * (-1 * 0.01);
}
}
// 16进制转2进制
function hexToBinary(value, length) {
// 16进制转为10进制
var intValue = parseInt(value, 16);
return intToBinary(intValue, length);
}
// 10进制转16进制
function intToHex(value, length) {
var number = value.toString(16);
return (Array(length).join("0") + number).slice(-length);//高位补0
}
// 10进制转2进制
function intToBinary(value, length) {
var number = value.toString(2);
return (Array(length).join("0") + number).slice(-length);//高位补0
}
// 16进制转ASCII
function hexToASCII(hexCharCodeStr) {
var trimedStr = hexCharCodeStr.trim();
var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
var len = rawStr.length;
if (len % 2 !== 0) {
console.info("存在非法字符!");
return "";
}
var curCharCode;
var resultStr = [];
for (var i = 0; i < len; i = i + 2) {
curCharCode = parseInt(rawStr.substr(i, 2), 16);
resultStr.push(String.fromCharCode(curCharCode));
}
return resultStr.join("");
}
// 2进制的补码,结果为十进制绝对值
function binToComplement(value, length) {
// 二进制高位补0
var binVal = (Array(length).join("0") + value).slice(-length);
// 正数的补码是原码本身
if(binVal.substring(0, 1) == '0') {
return parseInt(binVal, 2);
}else {
// 负数的补码为原码取反+1
return parseInt(binVal.substring(1, length).replace('-',0).split('').map(bit=>bit=='0'?'1':'0').join(''), 2)+1;
}
}
// 字符串转为数组
function transfer(str) {
var array = str.split(" ");
var array2 = "";
for(var i = 0; i < array.length; i++) {
array2 += "'" + array[i] + "',";
}
return array2;
}
var bytes = ['04','04','24','4B','65','00','0F','00','FD','02','E0','FD','71','05','33','05','2E','05','28','05','25','05','1E','05','15','05','25','05','3C','05','52','05','6D','05','92','05','A4','05','B8','7C','4E'];
var result = Decode(1, bytes);
console.log(result);
console