Форум: "Система";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Внизcrc16 и modbus Найти похожие ветки
← →
revo (2003-12-02 17:14) [0]Кто нибудь работал с modbus? Как там вычислять CRC?
С уважением,
Revo.
← →
Вася Пупкин (2003-12-02 21:21) [1]Кто-нибудь работал с yandex? поиск по modbus crc16.
Насколько я помню, в описании протокола это есть. И даже с примером на С.
ps могу ошибаться - работал давно с Modbus+, все материалы, которые остались - дома и глубоко зарыты. Может, поищу вечером.
← →
Adder (2003-12-02 23:27) [2]Вот... держи Unit на BP7
unit crc;
interface
uses kuodata;
function crc16(Start:byte;UsDataLen:byte;PMes:PVMessage):word;
implementation
const
(* Table of CRC values for high-order byte *)
auchCRCHi: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
);
(* Table of CRC values for low-order byte *)
auchCRCLo: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
);
function crc16(Start:byte;UsDataLen:byte;PMes:PVMessage):word;
var
i:word;
uIndex:byte ; (* will index into CRC lookup*)
uchCRCHi : byte;
uchCRCLo :byte;
begin { $4409}
{PMes:=@Mes;}
uchCRCHi := $FF ; (* high CRC byte initialized *)
uchCRCLo := $FF ; (* low CRC byte initialized *)
for i:=Start to UsDataLen-1 do
begin
uIndex := uchCRCHi xor PMes^[i] ; (* calculate the CRC*)
uchCRCHi := uchCRCLo xor auchCRCHi[uIndex] ;
uchCRCLo := auchCRCLo[uIndex] ;
end;
crc16:= (uchCRCHi shl 8 or uchCRCLo) ;
end;
end.
← →
Adder (2003-12-02 23:39) [3]в kuodata.pas:
Type
Vmessage = array [0..255] of byte;
PVMessage = ^Vmessage;
← →
GEN++ (2003-12-03 00:15) [4]Сейчас с ним работаю. Даже небольшой "сервер " сделал.
А CRC16 для 3-х байтовой последовательности вычисляю так:
function TForm1.CHSM(SID,nomBlk,kolBlk:byte):word;
//подсчет контрольной суммы байтовой последовательности
//<SID>,<outReq>,<kolBlk>
var
b:array[1..3] of byte;//массив байт для которых считается CRC16
//описан в модуле
//как глобальная переменная
ctBt:word;
ctShift:word;
CRC,CRC1:word;
flC:boolean;
loCRC,hiCRC,x:byte;
const
CRC_O:word=$61;
CRC_1:word=$A001;
begin
b[1]:=SID;
b[2]:=nomBlk;
b[3]:=kolBlk;
CRC:=CRC_O;
for ctBt:=1 to 3 do
begin
ctShift:=0;
CRC:=CRC xor b[ctBt];
repeat
if (CRC mod 2)>0 then flC:=true else flC:=false;
CRC:=CRC shr 1;
if flC then CRC:=CRC xor CRC_1;
ctShift:=ctShift+1;
until ctShift=8;
end;
result:=CRC;
end;
При разработке приложения для взаимодействия PC под W98,Xp и
т.п. следует учесть, что мах быстродейсвия можно добиться не
более чем 3..5 транзакций/сек (при худшем варианте)
← →
Вася Пупкин (2003-12-03 01:07) [5]И в догонку к сказанному -)
http://www.modicon.com/techpubs/toc7.html
http://www.modicon.com/techpubs/crc7.html
← →
revo (2003-12-03 08:55) [6]Большое спасибо всем !!!
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c