Ik heb een Kaifa slimme meter met een 3x25A aansluiting.
Mijn aansluiting zit aardig vol met o.a. een 2-fase inductie, 3,5kW oven enz.
Heb 14 zonnepanelen
Uitlezing via de P1 poort op 115kB in een eigen processor systeem.

Bedoeling is om hieruit de voorwaarden te destilleren waaronder een nog toe te installeren elektrische boiler mag opwarmen zonder dat de hoofdzekering er uit vliegt. Die uitlezing ziet er als hieronder uit:

Weet iemand hoe de sum of crc onderaan berekend moet worden ?

een 3F boiler van 3000W zou ik daar zo bij durven zetten. dat is 1000W per fase. immers heb je met een grotere boiler de tijd. je zou ook een klok ertussen kunnen zetten. niet opwarmen rond etenstijd, zeg tussen 16 en 20 uur.

De uitlezing was op een tijdstip dat eigenlijk alleen fase 1 enigszins belast was. Er nog het een en ander bij. Op zich zou het kunnen met een tijdschakelaar maar er zitten wat haken en ogen bij. Bovendien heb ik smeltpatronen als hoofdzekering. Die wil je er niet uit laten vliegen.
Mijn vraag gaat over de methodiek van sum of crc berekening om enige zekerheid te hebben over de betrouwbaarheid van de uitlezing. Ik heb zo nu en dan leesfoutjes die ik tot nu toe heb kunnen opvangen met een soort credibility controle. De standen moeten beginnen met een ( en eindigen met een * en daartussen cijfers al dan niet met een punt er in.

Zie de DSMR 5 specificatie.

CRC is a CRC16 value calculated over the preceding characters in the data message (from
“/” to “!” using the polynomial: x16+x15+x2+1). CRC16 uses no XOR in, no XOR out and is
computed with least significant bit first. The value is represented as 4 hexadecimal charac-
ters (MSB first).

Ik gebruik deze procedure op mijn smart meter DSMR V5.
Werkt ook op de V4 meter van mijn broer.


//
// Special CRC16 algorithm for My EnergyMeter.
// - Specs are not very clear. May not work for other meters.
// - Works perfectly on my meter
bool CrcOk()
{
   unsigned short crc = 0;

   for (size_t Index = 0; Index < BufferIndex; Index++)
   {
      crc = crc ^ szMsgBuffer[Index];
      for (size_t y = 0; y < 8; y++)
      {
         if ((crc & 0x0001) == 0x0001)
         {  crc = (crc >> 1) ^ 0xA001;
         }
         else
         {  crc = (crc >> 1);
         }
      }

      if(szMsgBuffer[Index] == '!')
      {  // End of message. Next 4 bytes should be CRC16
         if(BufferIndex >= (Index + 4))
         {  Index += 1;
            if(crc == HexToInt(&szMsgBuffer[Index], 4))
            {  // Console.printf("-- P1 message complete. %d bytes, CrC Ok\n", BufferIndex);
               return true;
            }
            else
            {  Console.printf("-- P1 message complete. CRC16 Error.\n");
               return false;
            }
         }
         else
         {  // Message incomplete.
            return false;
         }
      }
   }
   return false;
}

@PE9SMS en deKees.
Dank voor jullie reactie. Standaard 16-bit CRC dus toch.
Mijn firmware nog eens nakijken.