Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
1-53482
Max_Ivanych
2004-02-06 10:32
2004.02.17
Как можно передать сообщение DOS-программе?


1-53568
EvgeniyR
2004-02-06 16:11
2004.02.17
Модальная форма MDI


1-53588
Сибулбо
2004-02-08 12:08
2004.02.17
Dos>Win кодировка


1-53504
Forest Maniac
2004-02-05 22:34
2004.02.17
Ошибка I/O никак не могу обойти =(


6-53670
pepper
2003-12-08 15:25
2004.02.17
Сетевой диск





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский