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.
Files changed (2) hide show
  1. package/698.js +33 -5
  2. 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 statusWord = parseMeterStatusOptimized(dataBuffer);
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 statusWord = parseMeterStatusOptimized(dataBuffer);
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-red-zelecproto",
3
- "version": "0.0.9",
3
+ "version": "0.1.0",
4
4
  "description": "node-red zelecproto node",
5
5
  "main": "index.js",
6
6
  "scripts": {