Счетчики серии СЭТ-4ТМ для работы в составе автоматизированных систем контроля и учета электроэнергии и в составе систем автоматизированного сбора диспетчерской информации, страница 33

Зачеркнутые флаги, связанные с ошибками КС массивов журнала событий и не устанавливаются, начиная с версии 23.XX.XX. Вместо них устанавливается флаг Е-23 при считывании любой испорченной записи журналов событий или журнала показателей качества электричества. Этот флаг должен обрабатываться верхним уровнем при запросе каждой записи массива журнала, если счетчик ответил кодом «внутренняя ошибка». При каждом новом обращении на чтение любой записи массива журнала флаг Е-23 сбрасывается.


Приложение C  – Быстрый расчет CRC c полиномом MODBUS на языке Паскаль

const srCRCHi:array[0..255] of byte = (

$00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41,

$00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,

$00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41,

$00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,

$00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40,

$01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40,

$00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40,

$01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,

$00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41,

$00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41,

$01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40,

$01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,

$00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40);

      srCRCLo:array[0..255] of byte = (

$00, $C0, $C1, $01, $C3, $03, $02, $C2, $C6, $06, $07, $C7, $05, $C5, $C4, $04, $CC, $0C, $0D, $CD,

$0F, $CF, $CE, $0E, $0A, $CA, $CB, $0B, $C9, $09, $08, $C8, $D8, $18, $19, $D9, $1B, $DB, $DA, 1A,

$1E, $DE, $DF, $1F, $DD, $1D, $1C, $DC, $14, $D4, $D5, $15, $D7, $17, $16, $D6, $D2, $12, $13, $D3,

$11, $D1, $D0, $10, $F0, $30, $31, $F1, $33, $F3, $F2, $32, $36, $F6, $F7, $37, $F5, $35, $34, $F4,

$3C, $FC, $FD, $3D, $FF, $3F, $3E, $FE, $FA, $3A, $3B, $FB, $39, $F9, $F8, $38, $28, $E8, $E9, $29,

$EB, $2B, $2A, $EA, $EE, $2E, $2F, $EF, $2D, $ED, $EC, $2C, $E4, $24, $25, $E5, $27, $E7, $E6, $26,

$22, $E2, $E3, $23, $E1, $21, $20, $E0, $A0, $60, $61, $A1, $63, $A3, $A2, $62, $66, $A6, $A7, $67,

$A5, $65, $64, $A4, $6C, $AC, $AD, $6D, $AF, $6F, $6E, $AE, $AA, $6A, $6B, $AB, $69, $A9, $A8, $68,

$78, $B8, $B9, $79, $BB, $7B, $7A, $BA, $BE, $7E, $7F, $BF, $7D, $BD, $BC, $7C, $B4, $74, $75, $B5,

$77, $B7, $B6, $76, $72, $B2, $B3, $73, $B1, $71, $70, $B0, $50, $90, $91, $51, $93, $53, $52, $92,

$96, $56, $57, $97, $55, $95, $94, $54, $9C, $5C, $5D, $9D, $5F, $9F, $9E, $5E, $5A, $9A, $9B, $5B,

$99, $59, $58, $98, $88, $48, $49, $89, $4B, $8B, $8A, $4A, $4E, $8E, $8F, $4F, $8D, $4D, $4C, $8C,

$44, $84, $85, $45, $87, $47, $46, $86, $82, $42, $43, $83, $41, $81, $80, $40);

 const InitCRC:word = $FFFF;

function UpdCRC(C : byte; oldCRC : word) : word;

var i: byte;

    arrCRC: array [0..1] of byte absolute oldCRC;

begin

  i:= arrCRC[1] xor C;

  arrCRC[1]:= arrCRC[0] xor srCRCHi[i];

  arrCRC[0]:= srCRCLo[i];

  UpdCRC:=oldCRC;

end;


// Пусть BufSend содержит подготовленный для посылки пакет длиной LengthSend байт

      Crc := UpdCRC(BufSend[0],InitCRC);

      For I := 1 to LengthSend-1 do Crc := UpdCRC(BufSend[I], Crc);

      BufSend[LengthSend] := Crc mod 256;

      BufSend[LengthSend + 1] := Crc div 256;

Примеры:

1. Тест канала связи по адресу 00h:                       00h\00h\01h\B0h;

2. Тест канала связи по адресу 01h:                       01h\00h\00h\20h;

3. Открыть канал связи по адресу 05h с паролем 000000:

05h\01h\30h\30h\30h\30h \30h\30h \CEh\1Bh


Приложение D  – Расчет CRC протокола MODBUS

(Источник: Описание Modbus протокола редакция 21.07.97 г)

Generating a CRC

Step 1 Load a 16-ditregister with FFFF hex (all 1`s). Call this the CRC register.

Step 2 Exclusive OR the first eight-bit byte of the message with the low order byte of the 16-bit CRC register, putting the result in the CRC register.

Step 3 Shift the CRC register one bit to the right (toward the LSB), zerofilling the MSB. Extract and examine the LSB.

Step 4 If the LSB is 0, repeat Step 3 (another shift). If the LSB is 1, Exclusive OR the CRC register with the polynomial value A001 hex (1010 0000 0000 0001).

Step 5 Repeat Steps 3 and 4 until eight shifts have been performed.  When this is done, a complete eight-bit byte will have been processed.

Step 6 Repeat Steps 2…5 for the next eight-bit byte of the message/ Continue doing this until all bytes have been processed.

Result The final contents of the CRC register is the CRC value.

Step 7 When the CRC is placed into the message, its upper and lower bytes must be swapped as described below.

Placing the CRC into the Message

When the 16-bit CRC (two eight-bit bytes) is transmitted in the message, the low order byte will be transmitted first, followed by the high order byte-e.g., if CRC value is 1241 hex (0001 0010 0100 0001):

Address

Func.

Data

Count

Data

Data

Data

Data

CRC Lo

41h

CRC Hi

12h