|
MODBUS-51工程版從機,附帶ModBusPol上位機測試軟件
0.png (44.95 KB, 下載次數(shù): 185)
下載附件
2018-10-1 23:04 上傳
0.png (124.54 KB, 下載次數(shù): 172)
下載附件
2018-10-1 23:04 上傳
單片機源程序如下:
- #include "modbus.h"
- #include "resister.h"
- /******************數(shù)據(jù)舉例,移植數(shù)據(jù)定義修改區(qū),resister.h也需要修改***********************************/
- uint ROdat[3]={1,123,456}; //3個只讀整型
- uint RWdat[3]={1,123,456}; //3個可讀可寫整型
- float temp=23.4; //一個浮點型
- long adc=789654; //一個long型
- bit ROstatus0=0; //只讀線圈
- bit ROstatus1=1; //只讀線圈
- bit RWstatus0=0; //可讀可寫線圈
- bit RWstatus1=1; //可讀可寫線圈
- /********************************************************************
- modbus RTU 的C51程序
- 單片機AT89C51 11.0592MHZ
- 通信波特率 9600 8位數(shù)據(jù) 1位停止位 485通位接口
- 單片機控制板地址 localAddr(變量)
- 0x01 0x03 0x00 0x00 0x01 0x84 0x0a
- **********************************************************************/
- uchar LocalAddr = 0x01; //單片機控制板的地址
- /***********************************************/
- union uf
- {
- uint x[2];
- float y;
- }ftemp;
- union ul
- {
- uint x[2];
- long y;
- }ltemp;
- uchar receTimeOut; //接收超時
- uchar sendCount; //發(fā)送字節(jié)個數(shù)
- uchar receCount; //接收到的字節(jié)個數(shù)
- uchar receBuf[50];
- uchar sendBuf[50];
- bit bt1ms; //定時標志位
- /* CRC 高位字節(jié)值表 */
- uchar code 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, 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, 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,
- 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, 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
- } ;
- /* CRC低位字節(jié)值表*/
- uchar code 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, 0x39, 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, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
- 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
- 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
- 0x43, 0x83, 0x41, 0x81, 0x80, 0x40
- } ;
- //-------------------------------定時器0 1ms 中斷 -------------------------
- void timer0_IntProc() interrupt 1
- {
- TL0 = 0x66;
- TH0 = 0xFC;
- bt1ms = 1;
- }
- void presetSingleRegister(void);
- uint setCoilVal(uint addr,uint tempData);
- uint getCoilVal(uint addr,uint *tempData);
- uint getRegisterVal(uint addr,uint *tempData);
- uint setRegisterVal(uint addr,uint tempData);
- //--------------------------------串行中斷程序---------------------------
- void comm_IntProc() interrupt 4
- {
- if(RI)
- {
- RI = 0;
- receTimeOut = 10; //通訊超時值這個地方很重要 10ms
- receBuf[receCount] = SBUF;
- receCount++; //接收地址偏移寄存器加1
- }
- if(TI)
- TI=0;
- }
- //------------------------------------定時處理--------------------------------
- void timeProc(void)
- {
- if(bt1ms)
- {
- bt1ms = 0;
- if(receTimeOut>0)
- {
- receTimeOut--;
- if(receTimeOut==0 && receCount>0) //判斷通訊接收是否超時
- {
- b485Send = 0; //將485置為接收狀態(tài)
- receCount = 0;// //將接收地址偏移寄存器清零
- }
- }
- }
- }
- //-----------------------------初始化中斷------------------------------------
- void InitUartAndTimer0(void)
- {
- TMOD= 0x21; //T0用于定時,T1用于波特
- TL0 = 0x66;
- TH0 = 0xFC;
- TR0 = 1;
- ET0 = 1; //開中斷T0
- //-----------------------------------------------
- SCON=0x50;
- TH1=0xfd;
- TL1=0xfd;
- TR1=1;
- EA=1;
- ES=1;
- TI=0;
- b485Send = 0; //處于接收
- }
- //--------------------------初始化-----------------------------
- void initProg(void)
- {
- InitUartAndTimer0();
- }
- /***************************CRC校驗碼生成函數(shù) ********************************/
- uint crc16(uchar *puchMsg, uint usDataLen)
- {
- uchar uchCRCHi = 0xFF ; /* 高CRC字節(jié)初始化 */
- uchar uchCRCLo = 0xFF ; /* 低CRC 字節(jié)初始化 */
- uint uIndex ; /* CRC循環(huán)中的索引 */
- while (usDataLen--) /* 傳輸消息緩沖區(qū) */
- {
- uIndex = uchCRCHi ^ *puchMsg++ ; /* 計算CRC */
- uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
- uchCRCLo = auchCRCLo[uIndex] ;
- }
- return (uchCRCLo << 8 | uchCRCHi) ;
- }
- void uartsends(uchar buff[],uchar len)
- {
- uchar i;
- for(i=0;i<len;i++)
- {
- SBUF=buff[i];
- while(!TI);
- TI=0;
- }
- }
- /*******************************串口發(fā)送函數(shù) ********************************/
- void Begin_send(void)
- {
- b485Send = 1; //處于發(fā)送
- uartsends(sendBuf,sendCount);
- b485Send = 0; //發(fā)送完后將485置于接收狀態(tài)
- receCount = 0; //清接收地址偏移寄存器
- }
- //fuction:01 讀單個或多個線圈狀態(tài)
- void readCoils(void)
- {
- uint addr;
- uint tempAddr;
- uint byteCount;
- uint bitCount;
- uint crcData;
- uint position;
- uint i,k;
- uint tempData;
- uchar exit = 0;
- addr = (receBuf[2]<<8) + receBuf[3];
- tempAddr = addr;
- bitCount = (receBuf[4]<<8) + receBuf[5]; //讀取的位個數(shù)
- byteCount = bitCount / 8; //字節(jié)個數(shù)
- if(bitCount%8 != 0)
- byteCount++;
- for(k=0;k<byteCount;k++)//字節(jié)位置
- {
- position = k + 3;
- sendBuf[position] = 0;
- for(i=0;i<8;i++)
- {
- getCoilVal(tempAddr,&tempData);
- sendBuf[position] |= tempData << i;
- tempAddr++;
- if(tempAddr >= addr+bitCount)//讀完
- {
- exit = 1;
- break;
- }
- }
- if(exit == 1)
- break;
- }
- sendBuf[0] = LocalAddr;
- sendBuf[1] = 0x01;
- sendBuf[2] = byteCount;
- byteCount += 3;
- crcData = crc16(sendBuf,byteCount);
- sendBuf[byteCount] = crcData & 0xff;
- byteCount++;
- sendBuf[byteCount] = crcData >> 8;
- sendCount = byteCount + 1;
- Begin_send();
- }
- //fuction:02 讀取線圈輸入(只讀寄存器)狀態(tài)
- void readInPutCoils(void)
- {
- uint addr;
- uint tempAddr;
- uint byteCount;
- uint bitCount;
- uint crcData;
- uint position;
- uint i,k;
- uint tempData;
- uchar exit = 0;
- addr = (receBuf[2]<<8) + receBuf[3];
- tempAddr = addr +10000; //只讀線圈寄存器偏移地址10000
- bitCount = (receBuf[4]<<8) + receBuf[5]; //讀取的位個數(shù)
- byteCount = bitCount / 8; //字節(jié)個數(shù)
- if(bitCount%8 != 0)
- byteCount++;
- for(k=0;k<byteCount;k++)//字節(jié)位置
- {
- position = k + 3;
- sendBuf[position] = 0;
- for(i=0;i<8;i++)
- {
- getCoilVal(tempAddr,&tempData);
- sendBuf[position] |= tempData << i;
- tempAddr++;
- if(tempAddr >= addr+bitCount)//讀完
- {
- exit = 1;
- break;
- }
- }
- if(exit == 1)
- break;
- }
- sendBuf[0] = LocalAddr;
- sendBuf[1] = 0x02;
- sendBuf[2] = byteCount;
- byteCount += 3;
- crcData = crc16(sendBuf,byteCount);
- sendBuf[byteCount] = crcData & 0xff;
- byteCount++;
- sendBuf[byteCount] = crcData >> 8;
- sendCount = byteCount + 1;
- Begin_send();
- }
- /********function code : 03,讀取多個寄存器值 ********/
- void readRegisters(void)
- {
- uint addr;
- uint tempAddr;
- uint crcData;
- uint readCount;
- uint byteCount;
- uint i;
- uint tempData = 0;
- addr = (receBuf[2]<<8) + receBuf[3];
- tempAddr = addr+40000; //+40000,保持寄存器偏移地址
- readCount = (receBuf[4]<<8) + receBuf[5]; //要讀的個數(shù) ,整型
- byteCount = readCount * 2; //每個寄存器內(nèi)容占高,低兩個字節(jié)
- for(i=0;i<byteCount;i+=2,tempAddr++)
- {
- getRegisterVal(tempAddr,&tempData);
- sendBuf[i+3] = tempData >> 8;
- sendBuf[i+4] = tempData & 0xff;
- }
- sendBuf[0] = LocalAddr;
- sendBuf[1] = 3; //function code : 03
- sendBuf[2] = byteCount;
- byteCount += 3; //加上前面的地址,功能碼,地址 共3+byteCount個字節(jié)
- crcData = crc16(sendBuf,byteCount);
- sendBuf[byteCount] = crcData & 0xff; // CRC代碼低位在前
- byteCount++;
- sendBuf[byteCount] = crcData >> 8 ; //高位在后
- sendCount = byteCount + 1; //例如byteCount=49,則sendBuf[]中實際上有49+1個元素待發(fā)
- Begin_send();
- }
- //fuction 04:讀取輸入寄存器
- void readInPutRegisters(void)
- {
- uint addr;
- uint tempAddr;
- uint crcData;
- uint readCount;
- uint byteCount;
- uint i;
- uint tempData = 0;
- addr = (receBuf[2]<<8) + receBuf[3];
- tempAddr = addr+30000; //+輸入寄存器偏移地址:30000
- readCount = (receBuf[4]<<8) + receBuf[5]; //要讀的個數(shù) ,整型
- byteCount = readCount * 2; //每個寄存器內(nèi)容占高,低兩個字節(jié)
- for(i=0;i<byteCount;i+=2,tempAddr++)
- {
- getRegisterVal(tempAddr,&tempData);
- sendBuf[i+3] = tempData >> 8;
- sendBuf[i+4] = tempData & 0xff;
- }
- sendBuf[0] = LocalAddr;
- sendBuf[1] = 4; //function code : 04
- sendBuf[2] = byteCount;
- byteCount += 3; //加上前面的地址,功能碼,地址 共3+byteCount個字節(jié)
- crcData = crc16(sendBuf,byteCount);
- sendBuf[byteCount] = crcData & 0xff; // CRC代碼低位在前
- byteCount++;
- sendBuf[byteCount] = crcData >> 8 ; //高位在后
- sendCount = byteCount + 1; //例如byteCount=49,則sendBuf[]中實際上有49+1個元素待發(fā)
- Begin_send();
- }
-
- //fuction:05 ,強制單個線圈
- void forceSingleCoil(void)
- {
- uint addr;
- uint tempAddr;
- uint tempData;
- uint onOff;
- uchar i;
- addr = (receBuf[2]<<8) + receBuf[3];
- tempAddr = addr;
- onOff = (receBuf[4]<<8) + receBuf[5];
- if(onOff == 0xff00)
- {
- tempData = 1;//設(shè)為ON
- }
- else if(onOff == 0x0000)//設(shè)為OFF
- {
- tempData = 0;
- }
- setCoilVal(tempAddr,tempData);
- for(i=0;i<receCount;i++)
- {
- sendBuf[i] = receBuf[i];
- }
- sendCount = receCount;
- Begin_send();
- }
- /****************fuction:06設(shè)置單個寄存器ok**********************************************************/
- //主機器發(fā)送 地址,功能碼,寄存器高位,寄存器低位,數(shù)據(jù)數(shù)高位, 數(shù)數(shù)低位,CRC低位,CRC高位
- //例如設(shè)置D0 發(fā)送, 01 06 00 3F 00 01 */
- /*********************************************************************************/
- void presetSingleRegister(void)
- {
- uint addr;
- uint tempAddr;
- uint tempData;
- uint crcData;
- addr = (receBuf[2]<<8) + receBuf[3];
- tempAddr = (addr+40000);
- tempData = (receBuf[4]<<8) + receBuf[5];
- setRegisterVal(tempAddr,tempData);
- sendBuf[0] = LocalAddr;
- sendBuf[1] = 6; //function code : 16
- sendBuf[2] = addr >> 8; //寄存器地址高位
- sendBuf[3] = addr & 0xff;//寄存器地址低位
- sendBuf[4] =receBuf[4];
- sendBuf[5] =receBuf[5];
- crcData = crc16(sendBuf,6);//生成CRC校驗碼
- sendBuf[6] = crcData & 0xff; //CRC代碼低位在前
- sendBuf[7] = crcData >> 8; //高位在后
- sendCount = 8;
- Begin_send();
- }
- /********從機響應(yīng)主機問詢函數(shù),function code : 15,強置多線圈值 *********/
- //////////////詢問數(shù)據(jù)包格式:
- ///////////////////////// receBuf[0] receBuf[1] receBuf[2] receBuf[3] receBuf[4] receBuf[5] receBuf[6] receBuf[7] receBuf[8] ... receBuf[9] receBuf[10]
- //詢問數(shù)據(jù)格式:receBuf[]={從站地址, 功能碼, 起始地址高位,起始地址低位,寄存器數(shù)高位,寄存器數(shù)低位, 字節(jié)計數(shù), 數(shù)據(jù)高位, 數(shù)據(jù)低位,... 校驗碼低位, 校驗碼高位}
- /****************************************************************************/
- void forceMultipleCoils(void)
- {
- uint addr;
- uint tempAddr;
- uint byteCount;
- uint bitCount;
- uint crcData;
- uint tempData;
- uint i,k;
- uchar exit = 0;
- addr = (receBuf[2]<<8) + receBuf[3];
- tempAddr = addr;
- bitCount = (receBuf[4]<<8) + receBuf[5];
- byteCount = bitCount / 8; //字節(jié)個數(shù)
- if(bitCount%8 != 0)
- byteCount++;
- for(k=0;k<byteCount;k++)//字節(jié)位置
- {
- for(i=0;i<8;i++)
- {
- tempData = (receBuf[k+3] >>i)&0x01;
- setCoilVal(tempAddr,tempData);
- tempAddr++;
- if(tempAddr >= addr+bitCount)//讀完
- {
- exit = 1;
- break;
- }
- }
-
- if(exit == 1)
- break;
- }
- sendBuf[0] = LocalAddr;
- sendBuf[1] = 15; //function code : 16
- sendBuf[2] = addr >> 8; //寄存器地址高位
- sendBuf[3] = addr & 0xff;//寄存器地址低位
- sendBuf[4] = bitCount >> 8;//待設(shè)置寄存器數(shù)量高位
- sendBuf[5] = bitCount & 0xff;//待設(shè)置寄存器數(shù)量低位
- crcData = crc16(sendBuf,6);//生成CRC校驗碼
- sendBuf[6] = crcData & 0xff; //CRC代碼低位在前
- sendBuf[7] = crcData >> 8; //高位在后
- sendCount = 8;
- Begin_send();
- }
- /********從機響應(yīng)主機問詢函數(shù),function code : 16,設(shè)置多個寄存器值 *********/
- //////////////詢問數(shù)據(jù)包格式:
- ///////////////////////// receBuf[0] receBuf[1] receBuf[2] receBuf[3] receBuf[4] receBuf[5] receBuf[6] receBuf[7] receBuf[8] ... receBuf[9] receBuf[10]
- //詢問數(shù)據(jù)格式:receBuf[]={從站地址, 功能碼, 起始地址高位,起始地址低位,寄存器數(shù)高位,寄存器數(shù)低位, 字節(jié)計數(shù), 數(shù)據(jù)高位, 數(shù)據(jù)低位,... 校驗碼低位, 校驗碼高位}
- /****************************************************************************/
- void presetMultipleRegisters(void)
- {
- uint addr;
- uint tempAddr;
- uint setCount;
- uint crcData;
- uint tempData;
- uchar i;
- addr = (receBuf[2]<<8) + receBuf[3];
- tempAddr = addr+40000;
- setCount = (receBuf[4]<<8) + receBuf[5];
- for(i=0;i<setCount;i++,tempAddr++)
- {
- tempData = (receBuf[i*2+7]<<8) + receBuf[i*2+8];//待設(shè)置寄存器值
- setRegisterVal(tempAddr,tempData);
- }
- sendBuf[0] = LocalAddr;
- sendBuf[1] = 16; //function code : 16
- sendBuf[2] = addr >> 8; //寄存器地址高位
- sendBuf[3] = addr & 0xff;//寄存器地址低位
- sendBuf[4] = setCount >> 8;//待設(shè)置寄存器數(shù)量高位
- sendBuf[5] = setCount & 0xff;//待設(shè)置寄存器數(shù)量低位
- crcData = crc16(sendBuf,6);//生成CRC校驗碼
- sendBuf[6] = crcData & 0xff; //CRC代碼低位在前
- sendBuf[7] = crcData >> 8; //高位在后
- sendCount = 8;
- Begin_send();
- }
- /*************************查詢uart接收的數(shù)據(jù)包內(nèi)容函數(shù) **************************/
- ////函數(shù)功能:叢機根據(jù)串口接收到的數(shù)據(jù)包receBuf[1]里面的內(nèi)容,即function code執(zhí)行相應(yīng)的命令
- /********************************************************************************/
- void checkComm0Modbus(void) //10ms內(nèi)必須響應(yīng)接收數(shù)據(jù)
- {
- uint crcData;
- uint tempData;
- uint temp;
- if(receCount > 4) //如果接收到數(shù)據(jù)
- {
- switch(receBuf[1])
- {
- case 1: //讀取寄存器(一個或多個)
- {
- if(receCount >= 8) //從詢問數(shù)據(jù)包格式可知,receCount應(yīng)該等于8 ,接收完成一組數(shù)據(jù)應(yīng)該關(guān)閉接收中斷
- {
- if(receBuf[0]==LocalAddr) //核對地址
- {
- crcData = crc16(receBuf,6); //核對校驗碼
- temp=receBuf[7];
- temp=(temp<<8)+receBuf[6];
- if(crcData == temp)
- if(receBuf[1] == 1)
- {
- readCoils(); //讀取線圈輸出狀態(tài)(一個或多個)
- }
- receCount = 0;
- }
-
- }
- break;
- }
- case 2: //讀取寄存器(一個或多個)
- {
- if(receCount >= 8) //從詢問數(shù)據(jù)包格式可知,receCount應(yīng)該等于8 ,接收完成一組數(shù)據(jù)應(yīng)該關(guān)閉接收中斷
- {
- if(receBuf[0]==LocalAddr) //核對地址
- {
- crcData = crc16(receBuf,6); //核對校驗碼
- temp=receBuf[7];
- temp=(temp<<8)+receBuf[6];
- if(crcData == temp)
- if(receBuf[1] == 2)
- {
- readInPutCoils(); //讀取線圈輸入狀態(tài)(一個或多個)
- }
- receCount = 0;
- }
-
- }
- break;
- }
- case 3: //讀取寄存器(一個或多個)
- {
- if(receCount >= 8) //從詢問數(shù)據(jù)包格式可知,receCount應(yīng)該等于8 ,接收完成一組數(shù)據(jù)應(yīng)該關(guān)閉接收中斷
- {
- if(receBuf[0]==LocalAddr) //核對地址
- {
- crcData = crc16(receBuf,6); //核對校驗碼
- temp=receBuf[7];
- temp=(temp<<8)+receBuf[6];
- if(crcData == temp)
- if(receBuf[1] == 3)
- {
- readRegisters(); //讀取保持寄存器(一個或多個)
- }
- receCount = 0;
- }
- }
- break;
- }
- case 4: //讀取寄存器(一個或多個)
- {
- if(receCount >= 8) //從詢問數(shù)據(jù)包格式可知,receCount應(yīng)該等于8 ,接收完成一組數(shù)據(jù)應(yīng)該關(guān)閉接收中斷
- {
- if(receBuf[0]==LocalAddr) //核對地址
- {
- crcData = crc16(receBuf,6); //核對校驗碼
- temp=receBuf[7];
- temp=(temp<<8)+receBuf[6];
- if(crcData == temp)
- if(receBuf[1] == 4)
- {
- readInPutRegisters(); //讀取輸入寄存器(一個或多個)
- }
- receCount = 0;
- }
-
- }
- break;
- }
- case 5: //讀取寄存器(一個或多個)
- {
- if(receCount >= 8) //從詢問數(shù)據(jù)包格式可知,receCount應(yīng)該等于8 ,接收完成一組數(shù)據(jù)應(yīng)該關(guān)閉接收中斷
- {
- if(receBuf[0]==LocalAddr) //核對地址
- {
- crcData = crc16(receBuf,6); //核對校驗碼
- temp=receBuf[7];
- temp=(temp<<8)+receBuf[6];
- if(crcData == temp)
- if(receBuf[1] == 5)
- {
- forceSingleCoil(); //強置單個線圈 狀態(tài)
- }
- receCount = 0;
- }
-
- }
- break;
- }
- case 6: if(receCount >= 8)
- {
- if(receBuf[0]==LocalAddr)
- {
- crcData = crc16(receBuf,6);
- temp=receBuf[7];
- temp=(temp<<8)+receBuf[6];
- if(crcData == temp)
- if(receBuf[1] == 6)
- {
- presetSingleRegister(); //預(yù)置單個保持寄存器
- // SaveSetupDataToFlash(); //保存設(shè)置數(shù)據(jù)
- }
- receCount = 0;
- }
- }
- break;
- case 15://設(shè)置多個線圈
- tempData = receBuf[6];
- tempData += 9; //數(shù)據(jù)個數(shù)
- if(receCount >= tempData)
- {
- if(receBuf[0]==LocalAddr )
- {
- crcData = crc16(receBuf,tempData-2);
- if(crcData == (receBuf[tempData-1]<<8)+ receBuf[tempData-2])//更改了??
- {
- forceMultipleCoils();
- // SaveSetupDataToFlash(); //保存設(shè)置數(shù)據(jù)
- }
- }
- receCount = 0;
- }
- break;
- case 16: //設(shè)置多個寄存器
- {
- tempData = (receBuf[4]<<8) + receBuf[5]; //設(shè)置寄存器個數(shù)
- tempData = tempData * 2; //數(shù)據(jù)個數(shù)= 寄存器*2
- tempData += 9; //從詢問數(shù)據(jù)包格式可知,receCount應(yīng)該等于9+byteCount
- if(receCount >= tempData)
- {
- if(receBuf[0]==LocalAddr ) //核對地址
- {
- crcData = crc16(receBuf,tempData-2);
- temp=receBuf[tempData-1];
- temp=(temp<<8)+receBuf[tempData-2];
- if(crcData == temp)
- {
- presetMultipleRegisters();
- //SaveSetupDataToFlash(); //保存設(shè)置數(shù)據(jù)
- }
- }
- receCount = 0;
- }
- break;
- }
- default: break;
- }
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
MODBUS-51工程版從機.rar
(3.71 MB, 下載次數(shù): 779)
2018-10-1 22:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|