Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2010, 21:11   #1
Gawwws
Пользователь
 
Регистрация: 18.10.2008
Сообщений: 65
По умолчанию 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 div 256;

      BufSend[LengthSend + 1] := Crc mod 256;
Мне надо перевести на VB. Масивы я задал, а вот с обработкой проблема.

Может кто-то знает оба языка. Так-же, если поможет, есть исходник на С+.
Gawwws вне форума Ответить с цитированием
Старый 26.02.2010, 23:54   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

приблизительно так:
Код:
Const InitCRC As Long = 65535

Function UpdCRC(C As Byte, oldCRC As Long) As Long
Dim i As Byte, b0 As Byte, b1 As Byte

  b0 = oldCRC Mod 256
  b1 = oldCRC \ 256
  i = b1 Xor C
  b1 = b0 Xor srcrchi(i)
  b0 = srcrclo(i)
  UpdCRC = b1 * 256 + b0
End Function


Const LengthSend As Long = 1000
Dim BufSend(LengthSend) As Long

Sub SetCRC()
Dim CRC As Long, i As Long
  CRC = UpdCRC(BufSend(0), InitCRC)
  For i = 1 To LengthSend - 3
    CRC = UpdCRC(BufSend(i), CRC)
  Next
  BufSend(LengthSend) = CRC \ 256
  BufSend(LengthSend) = CRC Mod 256
End Sub
увы, код не проверял
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 27.02.2010, 00:10   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

на си и delphi и у меня есть а код на паскале вы взяли отсюда

...небольшой ликбез по поиску, запускаем гугль и вводим "crc modbus в vb", первая-же >>> ссылка <<<
Код:
Public Function CRC(buf() As Byte, lbuf As Integer) As Integer
'-------------------------------------------------

' returns the MODBUS CRC of the lbuf first bytes of "buf" buffer (buf is a global array of bytes)
Dim CRC1 As Integer

CRC1 = &HFFFF ' init CRC
For i = 0 To lbuf - 1 Step 1 ' for each byte
CRC1 = CRC1 Xor buf(i)
For j = 0 To 7 Step 1 ' for each bit
k = CRC1 And 1 ' memo bit 0 state
CRC1 = ((CRC1 And &HFFFE) / 2) And H7FFF ' Shift right with 0 at left
If k > 0 Then CRC1 = CRC1 Xor &HA001 ' Bocuse
Next j
Next i
CRC = CRC1
End Function

еще...

Public Sub GetCRC(ByVal bValue As Byte)
Dim iValue As New UnsignedInteger
Dim CRCTemp As New UnsignedInteger
Dim Bit As Byte

iValue = CuInt(bValue)
CRCTemp = iCurrentCRC Xor iValue
For Bit = 0 To 7
If (CRCTemp And 1) = 1 Then
CRCTemp = CRCTemp \ 2
CRCTemp = CRCTemp Xor 40961
Else
CRCTemp = CRCTemp \ 2
End If
Next
iCurrentCRC = CRCTemp

End Sub
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 27.02.2010 в 00:12.
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CRC c полиномом MODBUS Gawwws Помощь студентам 0 26.02.2010 20:50
CRC ОШИБКА mikki1130 Софт 0 26.11.2009 18:42
Помогите....с полиномом! alisa87 Общие вопросы C/C++ 1 26.05.2009 16:13