node-red-zelecproto 0.0.9 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/698.js +33 -5
- package/package.json +1 -1
package/698.js
CHANGED
|
@@ -859,6 +859,32 @@ function toBigEndian16(value) {
|
|
|
859
859
|
// 将小端(低字节在前)转换为大端(高字节在前)
|
|
860
860
|
return (lower << 8) | upper;
|
|
861
861
|
}
|
|
862
|
+
|
|
863
|
+
function parseStatusWordFromAxdrBitString(buffer) {
|
|
864
|
+
if (!Buffer.isBuffer(buffer) || buffer.length < 3 || buffer[0] !== 0x04) return null;
|
|
865
|
+
const L = readAxdrLength(buffer, 1);
|
|
866
|
+
const byteLen = Math.ceil(L.len / 8);
|
|
867
|
+
const start = 1 + L.size;
|
|
868
|
+
const end = start + byteLen;
|
|
869
|
+
if (end > buffer.length) return null;
|
|
870
|
+
const bytes = buffer.slice(start, end);
|
|
871
|
+
if (bytes.length < 2) return null;
|
|
872
|
+
const bits = [];
|
|
873
|
+
for (const byte of bytes.slice(0, 2)) {
|
|
874
|
+
for (let bit = 7; bit >= 0; bit--) {
|
|
875
|
+
bits.push((byte >> bit) & 0x01);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
let statusWord = 0;
|
|
879
|
+
for (let i = 0; i < 16; i++) {
|
|
880
|
+
statusWord |= bits[i] << i;
|
|
881
|
+
}
|
|
882
|
+
return {
|
|
883
|
+
statusWord,
|
|
884
|
+
binary: bits.slice(0, 16).join('')
|
|
885
|
+
};
|
|
886
|
+
}
|
|
887
|
+
|
|
862
888
|
/**
|
|
863
889
|
* 解析电表运行状态字2 - 与645协议格式保持一致
|
|
864
890
|
* @param {Buffer} dataBuffer - 数据缓冲区
|
|
@@ -928,11 +954,12 @@ function parseMeterStatusWord3(dataBuffer) {
|
|
|
928
954
|
const oad = '20140203';
|
|
929
955
|
const result = createStandardResult("电表运行状态字3", oad, dataBuffer);
|
|
930
956
|
try {
|
|
931
|
-
const
|
|
957
|
+
const bitStringStatus = parseStatusWordFromAxdrBitString(dataBuffer);
|
|
958
|
+
const statusWord = bitStringStatus?.statusWord ?? parseMeterStatusOptimized(dataBuffer);
|
|
932
959
|
if (statusWord === null) throw new Error('无法解析状态字');
|
|
933
960
|
|
|
934
961
|
const val16 = statusWord & 0xFFFF; // 低16位
|
|
935
|
-
const bin = val16.toString(2).padStart(16, '0');
|
|
962
|
+
const bin = bitStringStatus?.binary ?? val16.toString(2).padStart(16, '0');
|
|
936
963
|
|
|
937
964
|
const supplyBits = (val16 >> 1) & 0b11; // bit2-bit1
|
|
938
965
|
const supplyMode = (
|
|
@@ -984,11 +1011,12 @@ function parseMeterStatusWord2(dataBuffer) {
|
|
|
984
1011
|
const oad = '20140202';
|
|
985
1012
|
const result = createStandardResult("电表运行状态字2", oad, dataBuffer);
|
|
986
1013
|
try {
|
|
987
|
-
const
|
|
1014
|
+
const bitStringStatus = parseStatusWordFromAxdrBitString(dataBuffer);
|
|
1015
|
+
const statusWord = bitStringStatus?.statusWord ?? parseMeterStatusOptimized(dataBuffer);
|
|
988
1016
|
if (statusWord === null) throw new Error('无法解析状态字');
|
|
989
1017
|
|
|
990
1018
|
const val16 = statusWord & 0xFFFF;
|
|
991
|
-
const bin = val16.toString(2).padStart(16, '0');
|
|
1019
|
+
const bin = bitStringStatus?.binary ?? val16.toString(2).padStart(16, '0');
|
|
992
1020
|
|
|
993
1021
|
const bit = (n) => ((val16 >> n) & 0x1);
|
|
994
1022
|
const dir = (b) => (b ? '反向' : '正向'); // 0=正向, 1=反向
|
|
@@ -3005,4 +3033,4 @@ function batchMsg698(msg) {
|
|
|
3005
3033
|
}
|
|
3006
3034
|
|
|
3007
3035
|
module.exports = batchMsg698;
|
|
3008
|
-
module.exports.batchMsg698 = batchMsg698;
|
|
3036
|
+
module.exports.batchMsg698 = batchMsg698;
|