通信協(xié)議(ASCII).doc
《通信協(xié)議(ASCII).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《通信協(xié)議(ASCII).doc(11頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
. 組態(tài)王與單片機(jī)協(xié)議 1.通訊口設(shè)置: 通訊方式:RS-232,RS-485,RS-422均可。 波特率: 由單片機(jī)決定(2400,4800,9600and19200bps)。 字節(jié)數(shù)據(jù)格式:由單片機(jī)決定。 起始位 數(shù)據(jù)位 校驗(yàn)位 停止位 注意:在組態(tài)王中設(shè)置的通訊參數(shù)如波特率,數(shù)據(jù)位,停止位,奇偶校驗(yàn)必須與單片機(jī)編程中的通訊參數(shù)一致 2.在組態(tài)王中定義設(shè)備地址的格式 格式:##.?!? 前面的兩個(gè)字符是設(shè)備地址,范圍為0-255,此地址為單片機(jī)的地址,由單片機(jī)中的程序決定 ; 后面的一個(gè)字符是用戶設(shè)定是否打包,“0”為不打包、“1”為打包,用戶一旦在定義設(shè)備時(shí)確定了打包,組態(tài)王將處理讀下位機(jī)變量時(shí)數(shù)據(jù)打包的工作。 3.在組態(tài)王中定義的寄存器格式 寄存器名稱 dd上限 dd下限 數(shù)據(jù)類型 Xdd 65535 0 FLOAT/BYTE/UINT 斜體字dd代表數(shù)據(jù)地址,此地址與單片機(jī)的數(shù)據(jù)地址相對(duì)應(yīng)。 注意:在組態(tài)王中定義變量時(shí),一個(gè)X寄存器根據(jù)所選數(shù)據(jù)類型(BYTE,UINT,FLOAT)的不同分別占用一個(gè)、兩個(gè),四個(gè)字節(jié),定義不同的數(shù)據(jù)類型要注意寄存器后面的地址,同一數(shù)據(jù)區(qū)內(nèi)不可交叉定義不同數(shù)據(jù)類型的變量。為提高通訊速度建議用戶使用連續(xù)的數(shù)據(jù)區(qū)。 例如, 1、在單片機(jī)中定義從地址0開始的數(shù)據(jù)類型為BYTE型的變量: 則在組態(tài)王中定義相應(yīng)的變量的寄存器為X0、X1、X2、X3、X4。。。。。。。。,數(shù)據(jù)類型為BYTE,每個(gè)變量占一個(gè)字節(jié) 2、在單片機(jī)中定義從地址100開始的數(shù)據(jù)類型為UINT型的變量: 則在組態(tài)王中定義相應(yīng)的變量的寄存器為X100、X102、X104、X106、X108。。。。。。。。,數(shù)據(jù)類型UINT,每個(gè)變量占兩個(gè)字節(jié) 3、在單片機(jī)中定義從地址200開始的數(shù)據(jù)類型為FLOAT型的變量: 則在組態(tài)王中定義相應(yīng)的變量的寄存器為X200、X204、X208、X212。。。。。。。, 數(shù)據(jù)類型FLOAT,每個(gè)變量占四個(gè)字節(jié) 3.組態(tài)王與單片機(jī)通訊的命令格式: 讀寫格式(除字頭、字尾外所有字節(jié)均為ASCII碼) 字頭 設(shè)備地址 標(biāo)志 數(shù)據(jù)地址 數(shù)據(jù)字節(jié)數(shù) 數(shù)據(jù)… 異或 CR 說明; 字頭:1字節(jié)1個(gè)ASCII碼,40H 設(shè)備地址: 1字節(jié)2個(gè)ASCII碼,0—255(即0---0x0ffH) 標(biāo)志:1字節(jié)2個(gè)ASCII碼,bit0~bit7, bit0= 0:讀,bit0= 1:寫。 bit1= 0:不打包。 bit3bit2 = 00,數(shù)據(jù)類型為字節(jié)。 bit3bit2 = 01,數(shù)據(jù)類型為字。 bit3bit2 = 1x,數(shù)據(jù)類型為浮點(diǎn)數(shù)。 數(shù)據(jù)地址: 2字節(jié)4個(gè)ASCII碼,0x0000~0xffff 數(shù)據(jù)字節(jié)數(shù):1字節(jié)2個(gè)ASCII碼,1—100,實(shí)際讀寫的數(shù)據(jù)的字節(jié)數(shù)。 數(shù)據(jù)…:為實(shí)際的數(shù)據(jù)轉(zhuǎn)換為ASCII碼,個(gè)數(shù)為字節(jié)數(shù)乘2。 異或:異或從設(shè)備地址到異或字節(jié)前,異或值轉(zhuǎn)換成2個(gè)ASCII碼 CR:0x0d。 通訊嘗試恢復(fù)命令(COMERROR),請(qǐng)求地址為0的一個(gè)BYTE數(shù)據(jù) 3.1.上位機(jī)發(fā)送讀命令 字頭 設(shè)備地址 標(biāo)志 數(shù)據(jù)地址 數(shù)據(jù)字節(jié)數(shù) 異或 CR 下位機(jī)應(yīng)答:若正常: 字頭 設(shè)備地址 數(shù)據(jù)字節(jié)數(shù) 數(shù)據(jù)… 異或 CR 若不正常: 字頭 設(shè)備地址 ** 異或 CR 例1:讀15號(hào)儀表,數(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號(hào)儀表,數(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.上位機(jī)發(fā)送寫命令 字頭 設(shè)備地址 標(biāo)志 數(shù)據(jù)地址 數(shù)據(jù)字節(jié)數(shù) 數(shù)據(jù)… 異或 CR 下位機(jī)應(yīng)答:若正常: 字頭 設(shè)備地址 ## 異或 CR 若不正常: 字頭 設(shè)備地址 ** 異或 CR 例1:寫15號(hào)儀表,數(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號(hào)儀表,數(shù)據(jù)地址為15。寫數(shù)據(jù)65535,數(shù)據(jù)類型為浮點(diǎn)型,打包。組態(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)志 寫操作 浮點(diǎn)型 打包 數(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.浮點(diǎn)數(shù)格式: 4字節(jié)浮點(diǎn)數(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é)浮點(diǎn)數(shù)格式: (1)第一字節(jié) (2)第二字節(jié) (3)第三字節(jié) (4)第四字節(jié) 注:數(shù)符=0——正,數(shù)符=1——負(fù) 階符=0——正,階符=1——負(fù) 數(shù) 符 階 符 階 碼 D7 D6 D5 ~ D0 ★ 浮點(diǎn)數(shù)可表示范圍:-1×232~1×232 ★ 數(shù)符:1位 階符:1位 階碼:6位 例:流量積算控制儀表瞬時(shí)流量測(cè)量值數(shù)據(jù)=100.210 轉(zhuǎn)換成浮點(diǎ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進(jìn)制: 0 0 7 200 102 102 數(shù) 符 階 符 階 碼 小 數(shù) 部 分 小 數(shù) 部 分 小 數(shù) 部 分 第一字節(jié) 第二字節(jié) 第三字節(jié) 第四字節(jié) 十六進(jìn)制: 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ù)為十六進(jìn)制表示的十進(jìn)制數(shù)。如:實(shí)時(shí)測(cè)量值為500,則用十六進(jìn)制表示為1F4H。儀表通訊傳輸是將上述十六進(jìn)制數(shù)據(jù)轉(zhuǎn)化為標(biāo)準(zhǔn)ASCII碼(即一字節(jié)的16進(jìn)制數(shù)轉(zhuǎn)化為2個(gè)ASCII碼──高4位ASCII碼+低4位ASCII碼)。 如:上述數(shù)據(jù)1F4H(16進(jìn)制 ),傳輸時(shí),轉(zhuǎn)化為ASCII碼則為30H、31H、46H、34H。 6.此浮點(diǎn)數(shù)格式的轉(zhuǎn)換: 1) ASCII碼到浮點(diǎn)數(shù): /* in:char* c 要轉(zhuǎn)化的ASII碼字符,應(yīng)為4個(gè)字符。 Return :轉(zhuǎn)換后的浮點(diǎ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) 浮點(diǎn)數(shù)到ASCII碼: /* in:char * c: 存儲(chǔ)浮點(diǎn)數(shù)轉(zhuǎn)換后的ASCII碼字符。 Float d: 要轉(zhuǎn)換的浮點(diǎ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.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
18 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 通信協(xié)議 ASCII
鏈接地址:http://m.appdesigncorp.com/p-1109597.html