Cómo leer continuamente el valor del registro en modbusEl siguiente es un ejemplo de comunicación ModBusRTU escrito en VC (a). El puerto de comunicación está configurado en hCom=CreateFile("COM1"; , GENERIC_READ|GENERIC_WRITE ,0,NULL,OPEN_EXISTING,0,NULL);if(hCom ==INVALID_HANDLE_VALUE){MessageBox("createfileerror,error");}BOOLerror=SetupComm(hCom,1024,1024);if(!error) MessageBox("setupcommerror "); error=GetCommState(hCom,amp;dcb);if(!error)MessageBox("getcommstate,error");dcb.BaudRate=2400;dcb.ByteSize=8;dcb.Parity=EVENPARITY; //NOPARITY; dcb.StopBits=ONESTOPBIT;error=SetCommState(hCom,amp;dcb);(ii), cálculo de la suma de comprobación CRC UINTcrcvoidcalccrc(BYTEcrcbuf) {BYTEi;crc=crc^crcbuf;for(i=0;igt;1 ;crc =crcamp;0x7fff;if(TT==1)crc=crc^0xa001;crc=crcamp;0xffff;}}(iii), transmisión de datos zxaddr=11 //Leer la dirección de los datos de la tabla de patrulla 11 zxnum; =10 ; //leer diez canales de datos writebuf2[0]=zxaddr; writebuf2[1]=0; writebuf2[5]= zxnum; crc= 0xffff; calccrc( writebuf2[0]); calccrc( writebuf2[4]); 5] ); writebuf2[6]=crcamp;0xff; writebuf2[7]=crc/0x100; WriteFile(hCom, writebuf2, 8, amp; comnum, NULL); *2, amp; comnum, NULL); // La lectura de datos del canal zxnum puede agregar procedimientos de manejo de errores, como error de código de dirección, juicio de error de código CRC, manejo de fallas de comunicación, etc.
La función CRC simple es la siguiente: unsignedshortCRC16(puchMsg, usDataLen); //lee los datos del archivo.usDataLen) unsignedchar*puchMsg /*Información a verificar por CRC*/ unsignedshortusDataLen;/*Número de bytes de información* / { unsignedcharuchCRCHi=0xFF;/* Inicialización de bytes CRC alto*/ unsignedcharuchCRCLo=0xFF;/* Inicialización de bytes CRC bajo*/ unsigneduIndex;/* Índice en bucle CRC*/ while(usDataLen--)/* Transferir búfer de mensajes* /{ uIndex=uchCRCHi^*puchMsgg;/*Calcular CRC*/uchCRCHi=uchCRCLo^auchCRCHi[uIndex};uchCRCLo=auchCRCLo[uIndex];}return(uchCRCHilt;lt;8|uchCRCLo);}//*CRC palabra alta Valor de sección tabla */ staticunsignedcharauchCRCHi[]={0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, C1, 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,0 xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 80, 0x41, 0x00, 0xC1, 0x81 , 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0 x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, , 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,0xC0,0x80,0x41,0 x00 ,0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x8