Cómo leer el valor en el registro modbus
(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>
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; p>
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, p >
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> 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.