node-red-zelecproto 0.1.0 → 0.1.1
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/645.js +7 -80
- package/698.js +17 -46
- package/package.json +1 -1
package/645.js
CHANGED
|
@@ -534,52 +534,17 @@ function decode645(_msg) {
|
|
|
534
534
|
}
|
|
535
535
|
};
|
|
536
536
|
|
|
537
|
-
//
|
|
537
|
+
// 状态字2/3只保留原始数值和binary,具体位义由上层业务或文档表解释。
|
|
538
538
|
const w2 = readU16LE();
|
|
539
|
-
const dir = (b) => (b ? '反向' : '正向');
|
|
540
539
|
const word2 = (w2 === null) ? null : {
|
|
541
540
|
rawValue: w2,
|
|
542
|
-
binary: bin16(w2)
|
|
543
|
-
fields: {
|
|
544
|
-
'A相有功功率方向': dir(bit(w2, 0)),
|
|
545
|
-
'B相有功功率方向': dir(bit(w2, 1)),
|
|
546
|
-
'C相有功功率方向': dir(bit(w2, 2)),
|
|
547
|
-
'A相无功功率方向': dir(bit(w2, 4)),
|
|
548
|
-
'B相无功功率方向': dir(bit(w2, 5)),
|
|
549
|
-
'C相无功功率方向': dir(bit(w2, 6))
|
|
550
|
-
}
|
|
541
|
+
binary: bin16(w2)
|
|
551
542
|
};
|
|
552
543
|
|
|
553
|
-
// —— 状态字3(与你现有的 04000503 保持一致)——
|
|
554
544
|
const w3 = readU16LE();
|
|
555
|
-
const supplyBits = (w3 === null) ? 0 : ((w3 >> 1) & 0b11);
|
|
556
|
-
const supplyMode = (
|
|
557
|
-
supplyBits === 0 ? '主电源' :
|
|
558
|
-
supplyBits === 1 ? '辅助电源' :
|
|
559
|
-
supplyBits === 2 ? '电池供电' : '保留'
|
|
560
|
-
);
|
|
561
|
-
const meterTypeBits = (w3 === null) ? 0 : ((w3 >> 8) & 0b11);
|
|
562
|
-
const meterType = (
|
|
563
|
-
meterTypeBits === 0 ? '非预付费表' :
|
|
564
|
-
meterTypeBits === 1 ? '电量型预付费表' :
|
|
565
|
-
meterTypeBits === 2 ? '电费型预付费表' : '保留'
|
|
566
|
-
);
|
|
567
545
|
const word3 = (w3 === null) ? null : {
|
|
568
546
|
rawValue: w3,
|
|
569
|
-
binary: bin16(w3)
|
|
570
|
-
fields: {
|
|
571
|
-
当前运行时段套数: (bit(w3, 0) ? '第二套' : '第一套'),
|
|
572
|
-
供电方式: supplyMode,
|
|
573
|
-
编程允许状态: (bit(w3, 3) ? '有效' : '失效'),
|
|
574
|
-
继电器状态: (bit(w3, 4) ? '断' : '通'),
|
|
575
|
-
当前运行时区套数: (bit(w3, 5) ? '第二套' : '第一套'),
|
|
576
|
-
继电器命令状态: (bit(w3, 6) ? '断' : '通'),
|
|
577
|
-
预跳闸报警状态: (bit(w3, 7) ? '有' : '无'),
|
|
578
|
-
电能表类型: meterType,
|
|
579
|
-
当前运行分时费率套数: (bit(w3, 10) ? '第二套' : '第一套'),
|
|
580
|
-
当前阶梯套数: (bit(w3, 11) ? '第二套' : '第一套'),
|
|
581
|
-
保电状态: (bit(w3, 12) ? '保电' : '非保电')
|
|
582
|
-
}
|
|
547
|
+
binary: bin16(w3)
|
|
583
548
|
};
|
|
584
549
|
|
|
585
550
|
// —— 密钥状态字(与你现有的 04000508 保持一致,32位)——
|
|
@@ -630,64 +595,26 @@ function decode645(_msg) {
|
|
|
630
595
|
}
|
|
631
596
|
};
|
|
632
597
|
} else if (di === '04000502' && arrPush.length >= 6) {
|
|
633
|
-
//
|
|
598
|
+
// 状态字2只返回原始数值,binary为bit15..bit0。
|
|
634
599
|
const lo = arrPush[4] & 0xFF;
|
|
635
600
|
const hi = arrPush[5] & 0xFF;
|
|
636
601
|
const v = (hi << 8) | lo;
|
|
637
602
|
const bin = v.toString(2).padStart(16, '0');
|
|
638
603
|
|
|
639
|
-
const bit = (n) => ((v >> n) & 0x1);
|
|
640
|
-
const dir = (b) => (b ? '反向' : '正向');
|
|
641
|
-
|
|
642
604
|
value = {
|
|
643
605
|
rawValue: v,
|
|
644
|
-
binary: bin
|
|
645
|
-
fields: {
|
|
646
|
-
'A相有功功率方向': dir(bit(0)),
|
|
647
|
-
'B相有功功率方向': dir(bit(1)),
|
|
648
|
-
'C相有功功率方向': dir(bit(2)),
|
|
649
|
-
'A相无功功率方向': dir(bit(4)),
|
|
650
|
-
'B相无功功率方向': dir(bit(5)),
|
|
651
|
-
'C相无功功率方向': dir(bit(6))
|
|
652
|
-
}
|
|
606
|
+
binary: bin
|
|
653
607
|
};
|
|
654
608
|
} else if (di === '04000503' && arrPush.length >= 6) {
|
|
655
|
-
//
|
|
609
|
+
// 状态字3只返回原始数值,binary为bit15..bit0。
|
|
656
610
|
const lo = arrPush[4] & 0xFF;
|
|
657
611
|
const hi = arrPush[5] & 0xFF;
|
|
658
612
|
const v = (hi << 8) | lo;
|
|
659
613
|
const bin = v.toString(2).padStart(16, '0');
|
|
660
614
|
|
|
661
|
-
const supplyBits = (v >> 1) & 0b11; // bit2-bit1
|
|
662
|
-
const supplyMode = (
|
|
663
|
-
supplyBits === 0 ? '主电源' :
|
|
664
|
-
supplyBits === 1 ? '辅助电源' :
|
|
665
|
-
supplyBits === 2 ? '电池供电' : '保留'
|
|
666
|
-
);
|
|
667
|
-
|
|
668
|
-
const meterTypeBits = (v >> 8) & 0b11; // bit9-bit8
|
|
669
|
-
const meterType = (
|
|
670
|
-
meterTypeBits === 0 ? '非预付费表' :
|
|
671
|
-
meterTypeBits === 1 ? '电量型预付费表' :
|
|
672
|
-
meterTypeBits === 2 ? '电费型预付费表' : '保留'
|
|
673
|
-
);
|
|
674
|
-
|
|
675
615
|
value = {
|
|
676
616
|
rawValue: v,
|
|
677
|
-
binary: bin
|
|
678
|
-
fields: {
|
|
679
|
-
当前运行时段套数: (v & 0x1) ? '第二套' : '第一套', // bit0
|
|
680
|
-
供电方式: supplyMode, // bit2-bit1
|
|
681
|
-
编程允许状态: (v & (1 << 3)) ? '有效' : '失效', // bit3
|
|
682
|
-
继电器状态: (v & (1 << 4)) ? '断' : '通', // bit4(线路实际工作状态)
|
|
683
|
-
当前运行时区套数: (v & (1 << 5)) ? '第二套' : '第一套', // bit5
|
|
684
|
-
继电器命令状态: (v & (1 << 6)) ? '断' : '通', // bit6(远程拉闸命令)
|
|
685
|
-
预跳闸报警状态: (v & (1 << 7)) ? '有' : '无', // bit7
|
|
686
|
-
电能表类型: meterType, // bit9-bit8
|
|
687
|
-
当前运行分时费率套数: (v & (1 << 10)) ? '第二套' : '第一套', // bit10
|
|
688
|
-
当前阶梯套数: (v & (1 << 11)) ? '第二套' : '第一套', // bit11
|
|
689
|
-
保电状态: (v & (1 << 12)) ? '保电' : '非保电' // bit12
|
|
690
|
-
}
|
|
617
|
+
binary: bin
|
|
691
618
|
};
|
|
692
619
|
}
|
|
693
620
|
// else if (['0000FF00', '0001FF00', '0002FF00'].includes(di) && arrPush.length > 4) {
|
package/698.js
CHANGED
|
@@ -870,18 +870,25 @@ function parseStatusWordFromAxdrBitString(buffer) {
|
|
|
870
870
|
const bytes = buffer.slice(start, end);
|
|
871
871
|
if (bytes.length < 2) return null;
|
|
872
872
|
const bits = [];
|
|
873
|
+
const lowToHighBits = [];
|
|
874
|
+
// A-XDR bit-string按每字节高位到低位展开;另保留低位到高位展示用于和现场口径对照。
|
|
873
875
|
for (const byte of bytes.slice(0, 2)) {
|
|
874
876
|
for (let bit = 7; bit >= 0; bit--) {
|
|
875
877
|
bits.push((byte >> bit) & 0x01);
|
|
876
878
|
}
|
|
879
|
+
for (let bit = 0; bit <= 7; bit++) {
|
|
880
|
+
lowToHighBits.push((byte >> bit) & 0x01);
|
|
881
|
+
}
|
|
877
882
|
}
|
|
878
883
|
let statusWord = 0;
|
|
884
|
+
// 文档表F.x中的bit编号按展开后的bit-string下标映射,后续binary再按645一致的数值形式输出。
|
|
879
885
|
for (let i = 0; i < 16; i++) {
|
|
880
886
|
statusWord |= bits[i] << i;
|
|
881
887
|
}
|
|
882
888
|
return {
|
|
883
889
|
statusWord,
|
|
884
|
-
|
|
890
|
+
binaryLowToHigh: lowToHighBits.slice(0, 16).join(''),
|
|
891
|
+
binaryHighToLow: bits.slice(0, 16).join('')
|
|
885
892
|
};
|
|
886
893
|
}
|
|
887
894
|
|
|
@@ -959,38 +966,14 @@ function parseMeterStatusWord3(dataBuffer) {
|
|
|
959
966
|
if (statusWord === null) throw new Error('无法解析状态字');
|
|
960
967
|
|
|
961
968
|
const val16 = statusWord & 0xFFFF; // 低16位
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
const supplyBits = (val16 >> 1) & 0b11; // bit2-bit1
|
|
965
|
-
const supplyMode = (
|
|
966
|
-
supplyBits === 0 ? '主电源' :
|
|
967
|
-
supplyBits === 1 ? '辅助电源' :
|
|
968
|
-
supplyBits === 2 ? '电池供电' : '保留'
|
|
969
|
-
);
|
|
970
|
-
|
|
971
|
-
const meterTypeBits = (val16 >> 8) & 0b11; // bit9-bit8
|
|
972
|
-
const meterType = (
|
|
973
|
-
meterTypeBits === 0 ? '非预付费表' :
|
|
974
|
-
meterTypeBits === 1 ? '电量型预付费表' :
|
|
975
|
-
meterTypeBits === 2 ? '电费型预付费表' : '保留'
|
|
976
|
-
);
|
|
969
|
+
// binary按最终状态字数值输出(bit15..bit0),与645状态字binary保持一致。
|
|
970
|
+
const bin = val16.toString(2).padStart(16, '0');
|
|
977
971
|
|
|
978
972
|
result.value = {
|
|
979
973
|
rawValue: val16,
|
|
980
974
|
binary: bin,
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
供电方式: supplyMode, // bit2-bit1
|
|
984
|
-
编程允许状态: (val16 & (1 << 3)) ? '有效' : '失效', // bit3
|
|
985
|
-
继电器状态: (val16 & (1 << 4)) ? '断' : '通', // bit4(线路实际工作状态)
|
|
986
|
-
当前运行时区套数: (val16 & (1 << 5)) ? '第二套' : '第一套',
|
|
987
|
-
继电器命令状态: (val16 & (1 << 6)) ? '断' : '通', // bit6(远程拉闸命令)
|
|
988
|
-
预跳闸报警状态: (val16 & (1 << 7)) ? '有' : '无', // bit7
|
|
989
|
-
电能表类型: meterType, // bit9-bit8
|
|
990
|
-
当前运行分时费率套数: (val16 & (1 << 10)) ? '第二套' : '第一套',
|
|
991
|
-
当前阶梯套数: (val16 & (1 << 11)) ? '第二套' : '第一套',
|
|
992
|
-
保电状态: (val16 & (1 << 12)) ? '保电' : '非保电'
|
|
993
|
-
}
|
|
975
|
+
...(bitStringStatus?.binaryLowToHigh ? { binaryLowToHigh: bitStringStatus.binaryLowToHigh } : {}),
|
|
976
|
+
...(bitStringStatus?.binaryHighToLow ? { binaryHighToLow: bitStringStatus.binaryHighToLow } : {})
|
|
994
977
|
};
|
|
995
978
|
|
|
996
979
|
setSuccessResult(result, {
|
|
@@ -1016,27 +999,15 @@ function parseMeterStatusWord2(dataBuffer) {
|
|
|
1016
999
|
if (statusWord === null) throw new Error('无法解析状态字');
|
|
1017
1000
|
|
|
1018
1001
|
const val16 = statusWord & 0xFFFF;
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
const bit = (n) => ((val16 >> n) & 0x1);
|
|
1022
|
-
const dir = (b) => (b ? '反向' : '正向'); // 0=正向, 1=反向
|
|
1023
|
-
|
|
1024
|
-
// 按表F.2位义生成具名字段
|
|
1025
|
-
const fields = {
|
|
1026
|
-
'A相有功功率方向': dir(bit(0)), // bit0
|
|
1027
|
-
'B相有功功率方向': dir(bit(1)), // bit1
|
|
1028
|
-
'C相有功功率方向': dir(bit(2)), // bit2
|
|
1029
|
-
'A相无功功率方向': dir(bit(4)), // bit4
|
|
1030
|
-
'B相无功功率方向': dir(bit(5)), // bit5
|
|
1031
|
-
'C相无功功率方向': dir(bit(6)) // bit6
|
|
1032
|
-
// 其余bit3、bit7、bit8~bit15为保留
|
|
1033
|
-
};
|
|
1002
|
+
// binary按最终状态字数值输出(bit15..bit0),与645状态字binary保持一致。
|
|
1003
|
+
const bin = val16.toString(2).padStart(16, '0');
|
|
1034
1004
|
|
|
1035
1005
|
result.value = {
|
|
1036
1006
|
rawValue: val16,
|
|
1037
1007
|
binary: bin,
|
|
1038
|
-
|
|
1039
|
-
|
|
1008
|
+
...(bitStringStatus?.binaryLowToHigh ? { binaryLowToHigh: bitStringStatus.binaryLowToHigh } : {}),
|
|
1009
|
+
...(bitStringStatus?.binaryHighToLow ? { binaryHighToLow: bitStringStatus.binaryHighToLow } : {}),
|
|
1010
|
+
bits: decodeMeterStatusBits(val16)
|
|
1040
1011
|
};
|
|
1041
1012
|
|
|
1042
1013
|
setSuccessResult(result, { statusWord: val16, statusWordHex: val16.toString(16).padStart(4, '0').toUpperCase(), statusBits: decodeMeterStatusBits(val16) }, { generic: { dataType: 'bit-string' } });
|