|
@@ -121,7 +121,8 @@ export function writeRegister(action, valueToWrite) {
|
|
|
stopHeartbeat();
|
|
stopHeartbeat();
|
|
|
}
|
|
}
|
|
|
let value = valueToWrite;
|
|
let value = valueToWrite;
|
|
|
- if (!TS.includes(action) && valueToWrite !== null && valueToWrite !== '' && valueToWrite !== undefined) {
|
|
|
|
|
|
|
+ // 特殊处理 WRITE_ADDRESS_OLD,避免将数组转换为整数
|
|
|
|
|
+ if (!TS.includes(action) && valueToWrite !== null && valueToWrite !== '' && valueToWrite !== undefined && action !== "WRITE_ADDRESS_OLD") {
|
|
|
value = parseInt(valueToWrite, 10);
|
|
value = parseInt(valueToWrite, 10);
|
|
|
}
|
|
}
|
|
|
if (action =='WRITE_ADDRESS'){
|
|
if (action =='WRITE_ADDRESS'){
|
|
@@ -226,7 +227,7 @@ function generateModbusFrame(protocol, action, valueToWrite) {
|
|
|
if ((valueToWrite == NaN || valueToWrite == null) && config.value !== undefined && config.value !== null) {
|
|
if ((valueToWrite == NaN || valueToWrite == null) && config.value !== undefined && config.value !== null) {
|
|
|
valueToWrite = config.value;
|
|
valueToWrite = config.value;
|
|
|
}
|
|
}
|
|
|
- if (action !== 'WRITE_ADDRESS' && action !== "GET_ADDRESS"){
|
|
|
|
|
|
|
+ if (action !== 'WRITE_ADDRESS' && action !== "GET_ADDRESS" && action !== "WRITE_ADDRESS_OLD"){
|
|
|
slaveAddress = _globalSlaveAddress;
|
|
slaveAddress = _globalSlaveAddress;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -257,19 +258,37 @@ function generateModbusFrame(protocol, action, valueToWrite) {
|
|
|
finalBuffer[buffer1.length + 1] = crc[1];
|
|
finalBuffer[buffer1.length + 1] = crc[1];
|
|
|
buffer = finalBuffer;
|
|
buffer = finalBuffer;
|
|
|
} else {
|
|
} else {
|
|
|
- buffer = new Uint8Array(6);
|
|
|
|
|
- buffer[0] = slaveAddress;
|
|
|
|
|
- buffer[1] = functionCode;
|
|
|
|
|
- buffer[2] = (startAddress >> 8) & 0xFF;
|
|
|
|
|
- buffer[3] = startAddress & 0xFF;
|
|
|
|
|
- buffer[4] = (valueToWrite >> 8) & 0xFF;
|
|
|
|
|
- buffer[5] = valueToWrite & 0xFF;
|
|
|
|
|
-
|
|
|
|
|
- const crc = calculateCRC(buffer);
|
|
|
|
|
- const finalBuffer = new Uint8Array(buffer.length + crc.length);
|
|
|
|
|
- finalBuffer.set(buffer);
|
|
|
|
|
- finalBuffer.set(crc, buffer.length);
|
|
|
|
|
- buffer = finalBuffer;
|
|
|
|
|
|
|
+ // 特殊处理 WRITE_ADDRESS_OLD 指令 - 不添加CRC
|
|
|
|
|
+ if (action === "WRITE_ADDRESS_OLD" && Array.isArray(valueToWrite)) {
|
|
|
|
|
+ // 为 WRITE_ADDRESS_OLD 创建特定的帧格式,不带CRC
|
|
|
|
|
+ buffer = new Uint8Array(4 + valueToWrite.length * 2); // 4字节头 + 数据
|
|
|
|
|
+ buffer[0] = slaveAddress;
|
|
|
|
|
+ buffer[1] = functionCode;
|
|
|
|
|
+ buffer[2] = (startAddress >> 8) & 0xFF;
|
|
|
|
|
+ buffer[3] = startAddress & 0xFF;
|
|
|
|
|
+
|
|
|
|
|
+ // 填充数据 (两个16位寄存器值)
|
|
|
|
|
+ for (let i = 0; i < valueToWrite.length; i++) {
|
|
|
|
|
+ const offset = 4 + (i * 2);
|
|
|
|
|
+ buffer[offset] = (valueToWrite[i] >> 8) & 0xFF;
|
|
|
|
|
+ buffer[offset + 1] = valueToWrite[i] & 0xFF;
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 原有逻辑保持不变
|
|
|
|
|
+ buffer = new Uint8Array(6);
|
|
|
|
|
+ buffer[0] = slaveAddress;
|
|
|
|
|
+ buffer[1] = functionCode;
|
|
|
|
|
+ buffer[2] = (startAddress >> 8) & 0xFF;
|
|
|
|
|
+ buffer[3] = startAddress & 0xFF;
|
|
|
|
|
+ buffer[4] = (valueToWrite >> 8) & 0xFF;
|
|
|
|
|
+ buffer[5] = valueToWrite & 0xFF;
|
|
|
|
|
+
|
|
|
|
|
+ const crc = calculateCRC(buffer);
|
|
|
|
|
+ const finalBuffer = new Uint8Array(buffer.length + crc.length);
|
|
|
|
|
+ finalBuffer.set(buffer);
|
|
|
|
|
+ finalBuffer.set(crc, buffer.length);
|
|
|
|
|
+ buffer = finalBuffer;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return buffer;
|
|
return buffer;
|
|
@@ -362,11 +381,15 @@ export function parseBluetoothData(hexString) {
|
|
|
const byteStrings = formattedHexString.split(' ').filter(s => s.length > 0);
|
|
const byteStrings = formattedHexString.split(' ').filter(s => s.length > 0);
|
|
|
console.log("字节字符串数组:", JSON.stringify(byteStrings));
|
|
console.log("字节字符串数组:", JSON.stringify(byteStrings));
|
|
|
console.log("字节数组长度:", byteStrings.length);
|
|
console.log("字节数组长度:", byteStrings.length);
|
|
|
|
|
+
|
|
|
if (byteStrings.length < 10 ){ //其他操作执行成功
|
|
if (byteStrings.length < 10 ){ //其他操作执行成功
|
|
|
|
|
+ //就地址23 42 02 23 23 0C 96
|
|
|
|
|
+ register.oldAddressValue = parseInt(byteStrings[0], 16);
|
|
|
// 其他操作执行成功
|
|
// 其他操作执行成功
|
|
|
- return;
|
|
|
|
|
|
|
+ return register;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
if (!byteStrings || byteStrings.length < 3) {
|
|
if (!byteStrings || byteStrings.length < 3) {
|
|
|
throw new Error('蓝牙数据不完整');
|
|
throw new Error('蓝牙数据不完整');
|
|
|
}
|
|
}
|
|
@@ -467,10 +490,10 @@ export function parseBluetoothData(hexString) {
|
|
|
register.Interval_61 = insertDecimal(register.inter_61.toString(), 2);
|
|
register.Interval_61 = insertDecimal(register.inter_61.toString(), 2);
|
|
|
} else if (i === 61) { // 上坡度_两位小数
|
|
} else if (i === 61) { // 上坡度_两位小数
|
|
|
register.UpGrade_62 = valueInt16.toString();
|
|
register.UpGrade_62 = valueInt16.toString();
|
|
|
- register.UpGrade_62 = insertDecimal(register.UpGrade_62, 2);
|
|
|
|
|
|
|
+ register.UpGrade_62 = insertDecimal(register.UpGrade_62.toString(), 2);
|
|
|
} else if (i === 62) { // 下坡度_两位小数
|
|
} else if (i === 62) { // 下坡度_两位小数
|
|
|
register.DownGrade_63 = valueInt16.toString();
|
|
register.DownGrade_63 = valueInt16.toString();
|
|
|
- register.DownGrade_63 = insertDecimal(register.DownGrade_63, 2);
|
|
|
|
|
|
|
+ register.DownGrade_63 = insertDecimal(register.DownGrade_63.toString(), 2);
|
|
|
} else if (i === 63) { // 东限位
|
|
} else if (i === 63) { // 东限位
|
|
|
register.EasternLimit_64 = valueInt16;
|
|
register.EasternLimit_64 = valueInt16;
|
|
|
register.qEasternLimit_64 = register.EasternLimit_64.toString();
|
|
register.qEasternLimit_64 = register.EasternLimit_64.toString();
|
|
@@ -603,10 +626,10 @@ function parseZigbeeData(hexString) {
|
|
|
register.Interval_61 = insertDecimal(register.inter_61.toString(), 2);
|
|
register.Interval_61 = insertDecimal(register.inter_61.toString(), 2);
|
|
|
} else if (i === 33) { // 上坡度_两位小数34-33
|
|
} else if (i === 33) { // 上坡度_两位小数34-33
|
|
|
register.UpGrade_62 = valueInt16.toString();
|
|
register.UpGrade_62 = valueInt16.toString();
|
|
|
- register.UpGrade_62 = insertDecimal(register.UpGrade_62, 2);
|
|
|
|
|
|
|
+ register.UpGrade_62 = insertDecimal(register.UpGrade_62.toString(), 2);
|
|
|
} else if (i === 34) { // 下坡度_两位小数35-34
|
|
} else if (i === 34) { // 下坡度_两位小数35-34
|
|
|
register.DownGrade_63 = valueInt16.toString();
|
|
register.DownGrade_63 = valueInt16.toString();
|
|
|
- register.DownGrade_63 = insertDecimal(register.DownGrade_63, 2);
|
|
|
|
|
|
|
+ register.DownGrade_63 = insertDecimal(register.DownGrade_63.toString(), 2);
|
|
|
} else if (i === 39) { // 东限位40-39
|
|
} else if (i === 39) { // 东限位40-39
|
|
|
register.EasternLimit_64 = valueInt16;
|
|
register.EasternLimit_64 = valueInt16;
|
|
|
register.qEasternLimit_64 = register.EasternLimit_64.toString();
|
|
register.qEasternLimit_64 = register.EasternLimit_64.toString();
|
|
@@ -692,7 +715,9 @@ function parseZigbeeData(hexString) {
|
|
|
qRealAngle_43: '',
|
|
qRealAngle_43: '',
|
|
|
qRealAngle_31: '',
|
|
qRealAngle_31: '',
|
|
|
FaultCode_10:'',
|
|
FaultCode_10:'',
|
|
|
- FaultCodeDescription: ''
|
|
|
|
|
|
|
+ FaultCodeDescription: '',
|
|
|
|
|
+ oldAddressValue: '',
|
|
|
|
|
+
|
|
|
};
|
|
};
|
|
|
return register;
|
|
return register;
|
|
|
}
|
|
}
|