通信協(xié)議(ASCII).doc
《通信協(xié)議(ASCII).doc》由會員分享,可在線閱讀,更多相關(guān)《通信協(xié)議(ASCII).doc(11頁珍藏版)》請在裝配圖網(wǎng)上搜索。
. 組態(tài)王與單片機協(xié)議 1.通訊口設(shè)置: 通訊方式:RS-232,RS-485,RS-422均可。 波特率: 由單片機決定(2400,4800,9600and19200bps)。 字節(jié)數(shù)據(jù)格式:由單片機決定。 起始位 數(shù)據(jù)位 校驗位 停止位 注意:在組態(tài)王中設(shè)置的通訊參數(shù)如波特率,數(shù)據(jù)位,停止位,奇偶校驗必須與單片機編程中的通訊參數(shù)一致 2.在組態(tài)王中定義設(shè)備地址的格式 格式:##.?!? 前面的兩個字符是設(shè)備地址,范圍為0-255,此地址為單片機的地址,由單片機中的程序決定 ; 后面的一個字符是用戶設(shè)定是否打包,“0”為不打包、“1”為打包,用戶一旦在定義設(shè)備時確定了打包,組態(tài)王將處理讀下位機變量時數(shù)據(jù)打包的工作。 3.在組態(tài)王中定義的寄存器格式 寄存器名稱 dd上限 dd下限 數(shù)據(jù)類型 Xdd 65535 0 FLOAT/BYTE/UINT 斜體字dd代表數(shù)據(jù)地址,此地址與單片機的數(shù)據(jù)地址相對應(yīng)。 注意:在組態(tài)王中定義變量時,一個X寄存器根據(jù)所選數(shù)據(jù)類型(BYTE,UINT,FLOAT)的不同分別占用一個、兩個,四個字節(jié),定義不同的數(shù)據(jù)類型要注意寄存器后面的地址,同一數(shù)據(jù)區(qū)內(nèi)不可交叉定義不同數(shù)據(jù)類型的變量。為提高通訊速度建議用戶使用連續(xù)的數(shù)據(jù)區(qū)。 例如, 1、在單片機中定義從地址0開始的數(shù)據(jù)類型為BYTE型的變量: 則在組態(tài)王中定義相應(yīng)的變量的寄存器為X0、X1、X2、X3、X4。。。。。。。。,數(shù)據(jù)類型為BYTE,每個變量占一個字節(jié) 2、在單片機中定義從地址100開始的數(shù)據(jù)類型為UINT型的變量: 則在組態(tài)王中定義相應(yīng)的變量的寄存器為X100、X102、X104、X106、X108。。。。。。。。,數(shù)據(jù)類型UINT,每個變量占兩個字節(jié) 3、在單片機中定義從地址200開始的數(shù)據(jù)類型為FLOAT型的變量: 則在組態(tài)王中定義相應(yīng)的變量的寄存器為X200、X204、X208、X212。。。。。。。, 數(shù)據(jù)類型FLOAT,每個變量占四個字節(jié) 3.組態(tài)王與單片機通訊的命令格式: 讀寫格式(除字頭、字尾外所有字節(jié)均為ASCII碼) 字頭 設(shè)備地址 標(biāo)志 數(shù)據(jù)地址 數(shù)據(jù)字節(jié)數(shù) 數(shù)據(jù)… 異或 CR 說明; 字頭:1字節(jié)1個ASCII碼,40H 設(shè)備地址: 1字節(jié)2個ASCII碼,0—255(即0---0x0ffH) 標(biāo)志:1字節(jié)2個ASCII碼,bit0~bit7, bit0= 0:讀,bit0= 1:寫。 bit1= 0:不打包。 bit3bit2 = 00,數(shù)據(jù)類型為字節(jié)。 bit3bit2 = 01,數(shù)據(jù)類型為字。 bit3bit2 = 1x,數(shù)據(jù)類型為浮點數(shù)。 數(shù)據(jù)地址: 2字節(jié)4個ASCII碼,0x0000~0xffff 數(shù)據(jù)字節(jié)數(shù):1字節(jié)2個ASCII碼,1—100,實際讀寫的數(shù)據(jù)的字節(jié)數(shù)。 數(shù)據(jù)…:為實際的數(shù)據(jù)轉(zhuǎn)換為ASCII碼,個數(shù)為字節(jié)數(shù)乘2。 異或:異或從設(shè)備地址到異或字節(jié)前,異或值轉(zhuǎn)換成2個ASCII碼 CR:0x0d。 通訊嘗試恢復(fù)命令(COMERROR),請求地址為0的一個BYTE數(shù)據(jù) 3.1.上位機發(fā)送讀命令 字頭 設(shè)備地址 標(biāo)志 數(shù)據(jù)地址 數(shù)據(jù)字節(jié)數(shù) 異或 CR 下位機應(yīng)答:若正常: 字頭 設(shè)備地址 數(shù)據(jù)字節(jié)數(shù) 數(shù)據(jù)… 異或 CR 若不正常: 字頭 設(shè)備地址 ** 異或 CR 例1:讀15號儀表,數(shù)據(jù)地址為15的數(shù)據(jù)。其中數(shù)據(jù)為100,數(shù)據(jù)類型為字節(jié),不打包。組態(tài)王所發(fā)數(shù)據(jù)為: 40 30 46 43 30 30 30 30 46 30 31 37 32 0d 字頭 設(shè)備地址15 標(biāo)志 讀操作 字節(jié)型 不打包 數(shù)據(jù)地址15 數(shù)據(jù)字節(jié)數(shù)1 異或 若正確: 40 30 46 30 31 36 34 37 35 0d 字頭 設(shè)備地址15 數(shù)據(jù)字節(jié)數(shù)1 數(shù)據(jù)100 異或 若不正確: 40 30 46 2a 2a 37 36 0d 字頭 設(shè)備地址15 ** 異或 例2:讀15號儀表,數(shù)據(jù)地址為15的數(shù)據(jù)。其中數(shù)據(jù)為100,數(shù)據(jù)類型為字節(jié),打包。組態(tài)王所發(fā)數(shù)據(jù)為: 40 30 46 43 32 30 30 30 46 30 31 37 30 0d 字頭 設(shè)備地址15 標(biāo)志 讀操作 字節(jié)型 打包 數(shù)據(jù)地址15 數(shù)據(jù)字節(jié)數(shù)1 異或 若正確: 40 30 46 30 31 36 34 37 35 0d 字頭 設(shè)備地址15 數(shù)據(jù)字節(jié)數(shù)1 數(shù)據(jù)100 異或 若不正確: 40 30 46 2a 2a 37 36 0d 設(shè)備地址15 ** 異或 3.2.上位機發(fā)送寫命令 字頭 設(shè)備地址 標(biāo)志 數(shù)據(jù)地址 數(shù)據(jù)字節(jié)數(shù) 數(shù)據(jù)… 異或 CR 下位機應(yīng)答:若正常: 字頭 設(shè)備地址 ## 異或 CR 若不正常: 字頭 設(shè)備地址 ** 異或 CR 例1:寫15號儀表,數(shù)據(jù)地址為15。寫數(shù)據(jù)255,數(shù)據(jù)類型為字,不打包。組態(tài)王所發(fā)數(shù)據(jù)為: 40 30 46 43 35 30 30 30 46 30 32 30 30 46 46 37 34 0d 字頭 設(shè)備地址15 標(biāo)志 寫操作 字型 不打包 數(shù)據(jù)地址15 數(shù)據(jù)字節(jié)數(shù)2 數(shù)據(jù)255 異或 若正確: 40 30 46 23 23 37 36 0d 字頭 設(shè)備地址15 ## 異或 若不正確: 40 30 46 2a 2a 37 36 0d 字頭 設(shè)備地址15 ** 異或 例2:寫15號儀表,數(shù)據(jù)地址為15。寫數(shù)據(jù)65535,數(shù)據(jù)類型為浮點型,打包。組態(tài)王所發(fā)數(shù)據(jù)為: 40 30 46 43 46 30 30 30 46 30 34 31 30 46 46 46 46 30 30 字頭 設(shè)備地址15 標(biāo)志 寫操作 浮點型 打包 數(shù)據(jù)地址15 數(shù)據(jù)字節(jié)數(shù)4 數(shù)據(jù)65535 30 30 0d 異或 若正確: 40 30 46 23 23 37 36 0d 字頭 設(shè)備地址15 ## 異或 若不正確: 40 30 46 2a 2a 37 36 0d 字頭 設(shè)備地址15 ** 異或 5.浮點數(shù)格式: 4字節(jié)浮點數(shù) = 第一字節(jié)高4位ASCII碼+第一字節(jié)低4位ASCII碼 +第二字節(jié)高4位ASCII碼+第二字節(jié)低4位ASCII碼 +第三字節(jié)高4位ASCII碼+第三字節(jié)低4位ASCII碼 +第四字節(jié)高4位ASCII碼+第四字節(jié)低4位ASCII碼 第1字節(jié)低4位 第2字節(jié)低4位 第3字節(jié)低4位 第4字節(jié)低4位 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 第1字節(jié)高4位 第2字節(jié)高4位 第3字節(jié)高4位 第4字節(jié)高4位 ★ 四字節(jié)浮點數(shù)格式: (1)第一字節(jié) (2)第二字節(jié) (3)第三字節(jié) (4)第四字節(jié) 注:數(shù)符=0——正,數(shù)符=1——負 階符=0——正,階符=1——負 數(shù) 符 階 符 階 碼 D7 D6 D5 ~ D0 ★ 浮點數(shù)可表示范圍:-1×232~1×232 ★ 數(shù)符:1位 階符:1位 階碼:6位 例:流量積算控制儀表瞬時流量測量值數(shù)據(jù)=100.210 轉(zhuǎn)換成浮點數(shù):100.210=27′0.7828125=0716+C816+6616+6616 =30ASCII+37ASCII+43ASCII+38ASCII+36ASCII+36ASCII+36ASCII+36ASCII 小數(shù)部份:0.7828125 T 0.7828125′256=200.4T 0.4′256=102.4T0.4′256=102.4 小數(shù)部分乘以256 整數(shù)部份為第二字節(jié)(200) 第二字節(jié)小數(shù)部分乘以256 整數(shù)部份為第三字節(jié)(102) 第三字節(jié)小數(shù)部分乘以256 整數(shù)部份為第四字節(jié)(102) 10進制: 0 0 7 200 102 102 數(shù) 符 階 符 階 碼 小 數(shù) 部 分 小 數(shù) 部 分 小 數(shù) 部 分 第一字節(jié) 第二字節(jié) 第三字節(jié) 第四字節(jié) 十六進制: ASCII碼: 0 0 7 C8 66 66 30 37 43( C )、38(8) 36(6)、36(6) 36(6)、36(6) 第一字節(jié) 第二字節(jié) 第三字節(jié) 第四字節(jié) 傳輸格式如下: 第1字節(jié)低4位 第2字節(jié)低4位 第3字節(jié)低4位 第4字節(jié)低4位 30 37 43 38 36 36 36 36 第1字節(jié)高4位 第2字節(jié)高4位 第3字節(jié)高4位 第4字節(jié)高4位 3、注: 儀表內(nèi)部數(shù)據(jù)為十六進制表示的十進制數(shù)。如:實時測量值為500,則用十六進制表示為1F4H。儀表通訊傳輸是將上述十六進制數(shù)據(jù)轉(zhuǎn)化為標(biāo)準(zhǔn)ASCII碼(即一字節(jié)的16進制數(shù)轉(zhuǎn)化為2個ASCII碼──高4位ASCII碼+低4位ASCII碼)。 如:上述數(shù)據(jù)1F4H(16進制 ),傳輸時,轉(zhuǎn)化為ASCII碼則為30H、31H、46H、34H。 6.此浮點數(shù)格式的轉(zhuǎn)換: 1) ASCII碼到浮點數(shù): /* in:char* c 要轉(zhuǎn)化的ASII碼字符,應(yīng)為4個字符。 Return :轉(zhuǎn)換后的浮點數(shù)。 */ float C4toD(char * c) { BYTE Hd[30], Jiema[30]; float DTc[30]; float Decimal = 0; memset(Hd, 0, sizeof(Hd)); memset(Jiema, 0, sizeof(Jiema)); memset(DTc, 0, sizeof(DTc)); float returnflo = 0; BOOL ShuFU = FALSE, JieFU = FALSE; if((c[7] > 0x40) && (c[7] < 0x47)) Hd[7] = ((c[7] - 0x37) & 0x0f); else if((c[7] > 0x60) && (c[7] < 0x67)) Hd[7] = ((c[7] - 0x57) & 0x0f); else Hd[7] = ((c[7] - 0x30) & 0x0f); if((c[6] > 0x40) && (c[6] < 0x47)) Hd[6] = ((c[6] - 0x37) & 0x0f); else if((c[6] > 0x60) && (c[6] < 0x67)) Hd[6] = ((c[6] - 0x57) & 0x0f); else Hd[6] = ((c[6] - 0x30) & 0x0f); DTc[2] = (float)(((float)(Hd[6] * 16.0) + (float)(Hd[7])) / 256.0); if((c[5] > 0x40) && (c[5] < 0x47)) Hd[5] = ((c[5] - 0x37) & 0x0f); else if((c[5] > 0x60) && (c[5] < 0x67)) Hd[5] = ((c[5] - 0x57) & 0x0f); else Hd[5] = ((c[5] - 0x30) & 0x0f); if((c[4] > 0x40) && (c[4] < 0x47)) Hd[4] = ((c[4] - 0x37) & 0x0f); else if((c[4] > 0x60) && (c[4] < 0x67)) Hd[4] = ((c[4] - 0x57) & 0x0f); else Hd[4] = ((c[4] - 0x30) & 0x0f); DTc[1] = (float)((((float)(Hd[4] * 16.0) + (float)Hd[5]) + DTc[2]) / 256.0); if((c[3] > 0x40) && (c[3] < 0x47)) Hd[3] = ((c[3] - 0x37) & 0x0f); else if((c[3] > 0x60) && (c[3] < 0x67)) Hd[3] = ((c[3] - 0x57) & 0x0f); else Hd[3] = ((c[3] - 0x30) & 0x0f); if((c[2] > 0x40) && (c[2] < 0x47)) Hd[2] = ((c[2] - 0x37) & 0x0f); else if((c[2] > 0x60) && (c[2] < 0x67)) Hd[2] = ((c[2] - 0x57) & 0x0f); else Hd[2] = ((c[2] - 0x30) & 0x0f); Decimal = (float)(((float)(Hd[2] * 16) + (float)(Hd[3]) + DTc[1])/ 256.0); if((c[1] > 0x40) && (c[1] < 0x47)) Jiema[1] = ((c[1] - 0x37) & 0x0f); else if((c[1] > 0x60) && (c[1] < 0x67)) Jiema[1] = ((c[1] - 0x57) & 0x0f); else Jiema[1] = ((c[1] - 0x30) & 0x0f); if((c[0] > 0x40) && (c[0] < 0x47)) Jiema[0] = ((c[0] - 0x37) & 0x0f); else if((c[0] > 0x60) && (c[0] < 0x67)) Jiema[0] = ((c[0] - 0x57) & 0x0f); else Jiema[0] = ((c[0] - 0x30) & 0x0f); ShuFU = ((Jiema[0] & 0x08) >> 3) > 0; JieFU = ((Jiema[0] & 0x04) >> 2) > 0; Jiema[2] = (Jiema[0] & 0x03) * 16 + Jiema[1]; if(JieFU) returnflo = (float)pow(2, (-1) * Jiema[2]) * Decimal; else returnflo = (float)pow(2, Jiema[2]) * Decimal; if(ShuFU) returnflo = (-1) * returnflo; return returnflo; } 2) 浮點數(shù)到ASCII碼: /* in:char * c: 存儲浮點數(shù)轉(zhuǎn)換后的ASCII碼字符。 Float d: 要轉(zhuǎn)換的浮點數(shù)。 Return : 無。 */ void D4toC(char * c,float d) { BYTE i = 0, Jiema = 0; char inbyte1[30]; BOOL ShuFu = FALSE, JieFu = FALSE; int inbyte2 = 0, inbyte3 = 0, inbyte4 = 0; char afterbyte2[30], afterbyte3[30], afterbyte4[30]; float F_afterbyte2 = 0, F_afterbyte3 = 0, F_afterbyte4 = 0; memset(inbyte1, 0x30, sizeof(inbyte1)); memset(afterbyte2, 0x30, sizeof(afterbyte2)); memset(afterbyte3, 0x30, sizeof(afterbyte3)); memset(afterbyte4, 0x30, sizeof(afterbyte4)); inbyte1[10] = 0x0; afterbyte2[10] = 0x0; afterbyte3[10] = 0x0; afterbyte4[10] = 0x0; if(d == 0) { for(int j = 0; j < 8; j++) c[j] = 0x30; return; } if(d < 0) { ShuFu = TRUE; d = (-1) * d; } while(d > 1) { d =(float)(d / 2.0); i ++; } while(d <= 0.5) { JieFu = TRUE; d = (float)(d * 2.0); i ++; } if(d == 1) { for(int j = 2; j < 8; j++) c[j] = 0x46; } else { inbyte2 = (int)(d * 256); F_afterbyte2 = (d * 256) - (int)(d * 256); inbyte3 = (int)(F_afterbyte2 * 256); F_afterbyte3 = (F_afterbyte2 * 256) - (int)(F_afterbyte2 * 256); inbyte4 = (int)(F_afterbyte3 * 256); F_afterbyte4 = (F_afterbyte3 * 256) - (int)(F_afterbyte3 * 256); itoa(inbyte2, afterbyte2, 16); itoa(inbyte3, afterbyte3, 16); itoa(inbyte4, afterbyte4, 16); if(inbyte2 == 0) { c[2] = 0x30; c[3] = 0x30; } else if(inbyte2 < 16) { c[2] = 0x30; c[3] = afterbyte2[0]; } else { c[2] = afterbyte2[0]; c[3] = afterbyte2[1]; } if(inbyte3 == 0) { c[4] = 0x30; c[5] = 0x30; } else if(inbyte3 < 16) { c[4] = 0x30; c[5] = afterbyte3[0]; } else { c[4] = afterbyte3[0]; c[5] = afterbyte3[1]; } if(inbyte4 == 0) { c[6] = 0x30; c[7] = 0x30; } else if(inbyte4 < 16) { c[6] = 0x30; c[7] = afterbyte4[0]; } else { c[6] = afterbyte4[0]; c[7] = afterbyte4[1]; } } if(JieFu) { if(i > 0x3f) i = 0x3f; } else if(i > 0x32) i = 32; if(ShuFu) i = i | 0x80; if(JieFu) i = i | 0x40; itoa(i, inbyte1, 16); if(inbyte1 == 0) { c[0] = 0x30; c[1] = 0x30; } else if(i < 16) { c[0] = 0x30; c[1] = inbyte1[0]; } else { c[0] = inbyte1[0]; c[1] = inbyte1[1]; } for(i = 0; i < 8; i ++) { if((c[i] > 0x60) && (c[i] < 0x67)) c[i] = c[i] - 0x20; } c[8] = 0x00; } 11 可編輯修改- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
18 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 通信協(xié)議 ASCII
鏈接地址:http://m.appdesigncorp.com/p-1109597.html