public IAinSettings GetResult(byte[] reply)
        {
            if (reply[0] != OneBasedAinNumber)
            {
                throw new Exception("неверный номер АИН в ответе, ожидался " + OneBasedAinNumber);
            }

            // TODO: check if reply[0] is equal oneBasedAinNumber
            var replyWithoutAinNumber = reply.Skip(1).ToList();


            var bp52 = new BytesPair(replyWithoutAinNumber[104], replyWithoutAinNumber[105]);
            //Console.WriteLine("<<READ>> NPRM = " + bp52.First.ToString("X2") + bp52.Second.ToString("X2"));
            var np            = bp52.First & 0x1F;
            var nimpFloorCode = (bp52.First & 0xE0) >> 5;
            var fanMode       = AinTelemetryFanWorkmodeExtensions.FromIoBits(bp52.Second & 0x03);
            var directCurrentMagnetization = bp52.Second.GetBit(3);

            return(new AinSettingsSimple(
                       new BytesPair(replyWithoutAinNumber[0], replyWithoutAinNumber[1]),
                       BytesPairToDecimalQ8Converter.ConvertBytesPairToDecimalQ8(new BytesPair(replyWithoutAinNumber[2],
                                                                                               replyWithoutAinNumber[3])),
                       // kiW
                       (replyWithoutAinNumber[4] + (replyWithoutAinNumber[5] << 8) + (replyWithoutAinNumber[6] << 16) +
                        (replyWithoutAinNumber[7] << 24)) / 16777216.0m,
                       new BytesPair(replyWithoutAinNumber[8], replyWithoutAinNumber[9]).LowFirstSignedValue / 1000.0m,
                       new BytesPair(replyWithoutAinNumber[10], replyWithoutAinNumber[11]).LowFirstSignedValue,
                       new BytesPair(replyWithoutAinNumber[12], replyWithoutAinNumber[13]).LowFirstSignedValue,
                       new BytesPair(replyWithoutAinNumber[14], replyWithoutAinNumber[15]).LowFirstSignedValue,

                       // Fnom:
                       new BytesPair(replyWithoutAinNumber[16], replyWithoutAinNumber[17]).LowFirstSignedValue / 10.0m,
                       // Fmax:
                       new BytesPair(replyWithoutAinNumber[18], replyWithoutAinNumber[19]).LowFirstSignedValue / 10.0m,
                       // DflLim:
                       new BytesPair(replyWithoutAinNumber[20], replyWithoutAinNumber[21]).LowFirstSignedValue / 1000.0m,
                       new BytesPair(replyWithoutAinNumber[22], replyWithoutAinNumber[23]).LowFirstSignedValue / 1000.0m,
                       new BytesPair(replyWithoutAinNumber[24], replyWithoutAinNumber[25]).LowFirstSignedValue,
                       new BytesPair(replyWithoutAinNumber[26], replyWithoutAinNumber[27]).LowFirstSignedValue / 1000.0m,
                       new BytesPair(replyWithoutAinNumber[28], replyWithoutAinNumber[29]).LowFirstUnsignedValue,
                       new BytesPair(replyWithoutAinNumber[30], replyWithoutAinNumber[31]).LowFirstUnsignedValue,
                       new BytesPair(replyWithoutAinNumber[32], replyWithoutAinNumber[33]).LowFirstSignedValue,
                       new BytesPair(replyWithoutAinNumber[34], replyWithoutAinNumber[35]).LowFirstSignedValue,
                       new BytesPair(replyWithoutAinNumber[36], replyWithoutAinNumber[37]).LowFirstSignedValue,
                       new BytesPair(replyWithoutAinNumber[38], replyWithoutAinNumber[39]).LowFirstSignedValue,

                       // TauR:
                       new BytesPair(replyWithoutAinNumber[40], replyWithoutAinNumber[41]).LowFirstSignedValue / 10000.0m,
                       // Lm:
                       new BytesPair(replyWithoutAinNumber[42], replyWithoutAinNumber[43]).LowFirstSignedValue / 100000.0m,
                       // Lsl:
                       new BytesPair(replyWithoutAinNumber[44], replyWithoutAinNumber[45]).LowFirstSignedValue / 1000000.0m,
                       // Lrl:
                       new BytesPair(replyWithoutAinNumber[46], replyWithoutAinNumber[47]).LowFirstSignedValue / 1000000.0m,

                       // reserved 24:
                       new BytesPair(replyWithoutAinNumber[48], replyWithoutAinNumber[49]),
                       BytesPairToDecimalQ8Converter.ConvertBytesPairToDecimalQ8(new BytesPair(replyWithoutAinNumber[50],
                                                                                               replyWithoutAinNumber[51])),
                       // kiFi:
                       (replyWithoutAinNumber[52] + (replyWithoutAinNumber[53] << 8) + (replyWithoutAinNumber[54] << 16) +
                        (replyWithoutAinNumber[55] << 24)) / 16777216.0m,

                       // reserved 28:
                       new BytesPair(replyWithoutAinNumber[56], replyWithoutAinNumber[57]),

                       // kpId:
                       BytesPairToDecimalQ8Converter.ConvertBytesPairToDecimalQ8(new BytesPair(replyWithoutAinNumber[58],
                                                                                               replyWithoutAinNumber[59])),
                       // kiId:
                       (replyWithoutAinNumber[60] + (replyWithoutAinNumber[61] << 8) + (replyWithoutAinNumber[62] << 16) +
                        (replyWithoutAinNumber[63] << 24)) / 16777216.0m,

                       // reserverd 32:
                       new BytesPair(replyWithoutAinNumber[64], replyWithoutAinNumber[65]),

                       // kpIq:
                       BytesPairToDecimalQ8Converter.ConvertBytesPairToDecimalQ8(new BytesPair(replyWithoutAinNumber[66],
                                                                                               replyWithoutAinNumber[67])),
                       // kiIq:
                       (replyWithoutAinNumber[68] + (replyWithoutAinNumber[69] << 8) + (replyWithoutAinNumber[70] << 16) +
                        (replyWithoutAinNumber[71] << 24)) / 16777216.0m,
                       new BytesPair(replyWithoutAinNumber[72], replyWithoutAinNumber[73]).LowFirstSignedValue * 0.1m,
                       new BytesPair(replyWithoutAinNumber[74], replyWithoutAinNumber[75]).LowFirstSignedValue * 0.1m,
                       // Unom:
                       new BytesPair(replyWithoutAinNumber[76], replyWithoutAinNumber[77]).LowFirstSignedValue /
                       (decimal)Math.Sqrt(2.0),
                       // TauFlLim:
                       new BytesPair(replyWithoutAinNumber[78], replyWithoutAinNumber[79]).LowFirstSignedValue / 10000.0m,
                       // Rs:
                       new BytesPair(replyWithoutAinNumber[80], replyWithoutAinNumber[81]).LowFirstSignedValue / 10000.0m,
                       // fmin:
                       new BytesPair(replyWithoutAinNumber[82], replyWithoutAinNumber[83]).LowFirstSignedValue / 10.0m,
                       new BytesPair(replyWithoutAinNumber[84], replyWithoutAinNumber[85]).LowFirstSignedValue / 10000.0m,
                       new BytesPair(replyWithoutAinNumber[86], replyWithoutAinNumber[87]).LowFirstSignedValue / 10000.0m,
                       new BytesPair(replyWithoutAinNumber[88], replyWithoutAinNumber[89]).LowFirstSignedValue / 10000.0m,
                       new BytesPair(replyWithoutAinNumber[90], replyWithoutAinNumber[91]).LowFirstSignedValue / 10000.0m,
                       new BytesPair(replyWithoutAinNumber[92], replyWithoutAinNumber[93]).LowFirstSignedValue,
                       new BytesPair(replyWithoutAinNumber[94], replyWithoutAinNumber[95]).LowFirstSignedValue,
                       new BytesPair(replyWithoutAinNumber[96], replyWithoutAinNumber[97]),
                       new BytesPair(replyWithoutAinNumber[98], replyWithoutAinNumber[99]),

                       // reserverd 50:
                       new BytesPair(replyWithoutAinNumber[100], replyWithoutAinNumber[101]),

                       // reserverd 51:
                       new BytesPair(replyWithoutAinNumber[102], replyWithoutAinNumber[103]),

                       // Param52 (np and others):
                       np,
                       nimpFloorCode,
                       fanMode,
                       directCurrentMagnetization,
                       new BytesPair(replyWithoutAinNumber[106], replyWithoutAinNumber[107]).LowFirstSignedValue / 1000.0m,
                       new BytesPair(replyWithoutAinNumber[108], replyWithoutAinNumber[109]).LowFirstSignedValue / 10.0m,
                       new BytesPair(replyWithoutAinNumber[110], replyWithoutAinNumber[111]).LowFirstSignedValue,
                       new BytesPair(replyWithoutAinNumber[112], replyWithoutAinNumber[113]).LowFirstSignedValue,

                       // Status byte:
                       (replyWithoutAinNumber[114] & 0x01) == 0x01,
                       (replyWithoutAinNumber[114] & 0x02) == 0x02,
                       (replyWithoutAinNumber[114] & 0x04) == 0x04
                       ));
        }
예제 #2
0
        public byte[] Serialize()
        {
            var settingsSerialized = new byte[114];

            settingsSerialized[0] = _settings.Reserved00.First;
            settingsSerialized[1] = _settings.Reserved00.Second;
            Console.WriteLine("_settings.KpW = " + _settings.KpW.ToString("f10"));
            var bpKpW = BytesPairToDecimalQ8Converter.ConvertToBytesPairQ8(_settings.KpW);

            settingsSerialized[2] = bpKpW.First;
            settingsSerialized[3] = bpKpW.Second;
            Console.WriteLine("_settings.KpW SERIALIZED = " + bpKpW);


            var ushbp52 = (ushort)(_settings.Np | (_settings.NimpFloorCode << 5) |
                                   ((_settings.FanMode.ToIoBits() & 0x03) << 8));

            Console.WriteLine("NPRM without DCM = " + ushbp52.ToString("X4"));
            ushbp52 = _settings.DirectCurrentMagnetization ? ushbp52.SetBit(11) : ushbp52.ResetBit(11);
            var bp52 = BytesPair.FromUnsignedShortLowFirst(ushbp52);

            Console.WriteLine("NPRM = " + bp52);


            settingsSerialized.SerializeIntLowFirst(4, (int)(_settings.KiW * 16777216.0m));
            settingsSerialized.SerializeShortLowFirst(8, (short)(_settings.FiNom * 1000.0m));
            settingsSerialized.SerializeShortLowFirst(10, _settings.Imax);
            settingsSerialized.SerializeShortLowFirst(12, _settings.UdcMax);
            settingsSerialized.SerializeShortLowFirst(14, _settings.UdcMin);

            settingsSerialized.SerializeUshortLowFirst(16, (ushort)(_settings.Fnom * 10.0m));
            settingsSerialized.SerializeUshortLowFirst(18, (ushort)(_settings.Fmax * 10.0m));

            settingsSerialized.SerializeShortLowFirst(20, (short)(_settings.DflLim * 1000.0m));
            settingsSerialized.SerializeShortLowFirst(22, (short)(_settings.FlMinMin * 1000.0m));

            settingsSerialized.SerializeShortLowFirst(24, _settings.IoutMax);
            settingsSerialized.SerializeShortLowFirst(26, (short)(_settings.FiMin * 1000.0m));

            settingsSerialized.SerializeUshortLowFirst(28, _settings.DacCh);
            settingsSerialized.SerializeUshortLowFirst(30, _settings.Imcw);

            settingsSerialized.SerializeShortLowFirst(32, _settings.Ia0);
            settingsSerialized.SerializeShortLowFirst(34, _settings.Ib0);
            settingsSerialized.SerializeShortLowFirst(36, _settings.Ic0);
            settingsSerialized.SerializeShortLowFirst(38, _settings.Udc0);
            settingsSerialized.SerializeShortLowFirst(40, (short)(_settings.TauR * 10000.0m));
            settingsSerialized.SerializeShortLowFirst(42, (short)(_settings.Lm * 100000.0m));
            settingsSerialized.SerializeShortLowFirst(44, (short)(_settings.Lsl * 1000000.0m));
            settingsSerialized.SerializeShortLowFirst(46, (short)(_settings.Lrl * 1000000.0m));

            settingsSerialized[48] = _settings.Reserved24.First;
            settingsSerialized[49] = _settings.Reserved24.Second;

            var bpKpFi = BytesPairToDecimalQ8Converter.ConvertToBytesPairQ8(_settings.KpFi);

            settingsSerialized[50] = bpKpFi.First;
            settingsSerialized[51] = bpKpFi.Second;

            settingsSerialized.SerializeIntLowFirst(52, (int)(_settings.KiFi * 16777216.0m));

            settingsSerialized[56] = _settings.Reserved28.First;
            settingsSerialized[57] = _settings.Reserved28.Second;

            var bpKpId = BytesPairToDecimalQ8Converter.ConvertToBytesPairQ8(_settings.KpId);

            settingsSerialized[58] = bpKpId.First;
            settingsSerialized[59] = bpKpId.Second;

            settingsSerialized.SerializeIntLowFirst(60, (int)(_settings.KiId * 16777216.0m));


            settingsSerialized[64] = _settings.Reserved32.First;
            settingsSerialized[65] = _settings.Reserved32.Second;


            var bpKpIq = BytesPairToDecimalQ8Converter.ConvertToBytesPairQ8(_settings.KpIq);

            settingsSerialized[66] = bpKpIq.First;
            settingsSerialized[67] = bpKpIq.Second;

            settingsSerialized.SerializeIntLowFirst(68, (int)(_settings.KiIq * 16777216.0m));

            settingsSerialized.SerializeShortLowFirst(72, (short)(_settings.AccDfDt * 10.0m));
            settingsSerialized.SerializeShortLowFirst(74, (short)(_settings.DecDfDt * 10.0m));
            settingsSerialized.SerializeUshortLowFirst(76,
                                                       (ushort)Math.Round(_settings.Unom * (decimal)Math.Sqrt(2.0)));

            settingsSerialized.SerializeShortLowFirst(78, (short)(_settings.TauFlLim * 10000.0m));

            settingsSerialized.SerializeUshortLowFirst(80, (ushort)(_settings.Rs * 10000.0m));

            settingsSerialized.SerializeUshortLowFirst(82, (ushort)(_settings.Fmin * 10.0m));
            settingsSerialized.SerializeShortLowFirst(84, (short)(_settings.TauM * 10000.0m));
            settingsSerialized.SerializeShortLowFirst(86, (short)(_settings.TauF * 10000.0m));
            settingsSerialized.SerializeShortLowFirst(88, (short)(_settings.TauFSet * 10000.0m));
            settingsSerialized.SerializeShortLowFirst(90, (short)(_settings.TauFi * 10000.0m));
            settingsSerialized.SerializeShortLowFirst(92, _settings.IdSetMin);
            settingsSerialized.SerializeShortLowFirst(94, _settings.IdSetMax);


            settingsSerialized[96] = _settings.UchMin.First;
            settingsSerialized[97] = _settings.UchMin.Second;

            settingsSerialized[98] = _settings.UchMax.First;
            settingsSerialized[99] = _settings.UchMax.Second;


            settingsSerialized[100] = _settings.Reserved50.First;
            settingsSerialized[101] = _settings.Reserved50.Second;

            settingsSerialized[102] = _settings.Reserved51.First;
            settingsSerialized[103] = _settings.Reserved51.Second;


            settingsSerialized[104] = bp52.First;
            settingsSerialized[105] = bp52.Second;


            settingsSerialized.SerializeShortLowFirst(106, (short)(_settings.UmodThr * 1000.0m));
            settingsSerialized.SerializeShortLowFirst(108, (short)(_settings.EmdecDfdt * 10.0m));
            settingsSerialized.SerializeShortLowFirst(110, _settings.TextMax);
            settingsSerialized.SerializeShortLowFirst(112, _settings.ToHl);

            var result = new byte[115];

            result[0] = OneBasedAinNumber;
            settingsSerialized.CopyTo(result, 1);
            return(result);
        }