Red de conocimiento informático - Conocimiento informático - Cómo leer el valor en el registro modbus

Cómo leer el valor en el registro modbus

El siguiente es un ejemplo de comunicación ModBus RTU escrito en VC

(I) Configuración del puerto de comunicación

DCB dcb;

hCom=CreateFile("COM1",

GENERIC_READ|GENERIC_WRITE,

0

NULL,

OPEN_EXISTING,

0,

NULL);

if(hCom==INVALID_HANDLE_VALUE)

{

MessageBox("createfile error,error");

}

BOOL error=SetupComm(hCom,1024,1024);

if(!error)

MessageBox("setupcomm error");

p>

error =GetCommState(hCom,&dcb);

if(!error)

MessageBox("getcommstate,error");

dcb .BaudRate=2400;

dcb.ByteSize = 8;

dcb.Parity=EVENPARITY; //NOPARITY;

dcb.StopBits =ONESTOPBIT;

p>

error=SetCommState(hCom,&dcb);

(ii) Cálculo del dígito de control CRC

UINT crc

void calccrc(BYTE crcbuf )

{

YTE i;

crc=crc ^ crcbuf;

for(i=0 ;i<8;i++ )

{

BYTE TT;

TT=crc&1;

crc=crc>>1;

crc=crc&0x7fff;

si (TT==1)

crc=crc^0xa001;

crc=crc&0xffff ;

}

}

(C), envío de datos

zxaddr=11; //Leer los datos del instrumento de detección con dirección 11

zxnum=10;//Leer los datos de 10 canales

writebuf2[0]= zxaddr;

writebuf2[1]=3;

writebuf2[2]=0;

writebuf2[3]=0;

writebuf2[4]=0;

writebuf2[5 ]=zxnum;

crc=0xffff;

alccrc(writebuf2[0]);

alccrc(writebuf2[1]);

alccrc( writebuf2[2]);

alccrc(writebuf2[3]);

alccrc(writebuf2[4]);

alccrc(writebuf2 [5]) ;

writebuf2[6]=crc & 0xff;

writebuf2[7]=crc/0x100;

WriteFile(hCom,writebuf2, 8, etc.

omnum,NULL);

(4), lectura de datos

ReadFile(hCom,writebuf,5+zxnum*2,&comnum,NULL //Leer datos del canal zxnum

(4), lectura de datos

ReadFile(hCom,writebuf,5+zxnum*2,&comnum,NULL); p>

Se pueden agregar procedimientos de manejo de errores, como error de código de dirección, juicio de error de código CRC y manejo de fallas de comunicación.

La función CRC simple es la siguiente:

unsigned short CRC16(puchMsg, usDataLen)

unsigned char *puchMsg /* Mensaje a verificar por CRC; * /

unsigned short usDataLen; /* El número de bytes en el mensaje*/

{

unsigned char uchCRCHi = 0xFF /* Byte CRC alto; inicialización */

unsigned char uchCRCLo = 0xFF /* Inicialización de bytes CRC bajo*/

unsigned uIndex /* Índice en bucle CRC*/

while; (usDataLen--) /* Transmitir buffer de mensajes*/

{

uIndex = uchCRCHi ^ *puchMsgg++ /* Calcular CRC */

uchCRCHi = uchCRCLo; ^ auchCRCHi[uIndex} ;

uchCRCLo = auchCRCLo[uIndex] ;

}

return (uchCRCHi << 8 | uchCRCLo) ;

}

/* Tabla de valores de bytes altos de CRC*/

carácter estático sin firmar auchCRCHi[] = {

0x00, 0xC1, 0x81, 0x40, 0x01 , 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81 , 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x01, 0xC0, 0x80.0x41, 0x00, 0xC1, 0x81, 0x40,

0x00 , 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1,

0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0.0x80, 0x4 1,

0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0xc1,

0x81, 0x40, 0xc1, 0x40, 0x01, 0x80, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 40,

0x01, 0xC0, 0x80.0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81 , 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0

x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40,

0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01.0xc0,

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, xC0 ,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40 , 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1.0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1 , 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00.0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41 , 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40

}; p>

/* Tabla de valores de bytes bajos de CRC*/

carácter estático auchCRCLo[] = {

0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02 , 0xC2, 0xC6, 0x06,

0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C.0x0D, 0xCD,

0x0F, 0xCF, 0xCE, 0x0E, 0x0A. , 0xCA, 0xCB, 0x0B, 0xC9, 0x09,

0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,

0x1E, 0xDE, 0xDF , 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,

0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

0x11 , 0xD1, 0xD0.0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,

0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,

0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F.0x3E, 0xFE, 0xFA, 0x3A,

0x3B, 0xFB, 0x3

9. 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,

0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D.0xED,

0xEC、0x2C、0xE4、0x24、0x25、0xE5、0x27、0xE7、0xE6、0x26、

0x22、0xE2、0xE3、0x23、0xE1、0x21、0x20、0xE0、0xA0、0x60、

0x61, 0xa1, 0x63, 0xa3, 0xa2, 0x62, 0x66, 0xa6, 0xa7, 0x67,

0xa5, 0x65, 0x64, 0xa4, 0x6c, 0xac, 0xad, 0x6d, 0xaf, 0x6f ,

0x6E, 0xAE, 0xAA, 0x6A.0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,

0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA , 0xBE, 0x7E,

0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4.0x74, 0x75, 0xB5,

0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2 , 0xB3, 0x73, 0xB1, 0x71,

0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,

0x96, 0x56 , 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,

0x5D、0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,

0x99, 0x59, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,

0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, C, 0x8C ,

0x44, 0x84, 0x85, 0x45, 0x87.0x47, 0x46, 0x86, 0x82, 0x42,

0x43, 0x83, 0x41, 0x81, 0x80, 0x40

} ;

0x44, 0x84, 0x85, 0x45, 0x87.