串口轉(zhuǎn)繼電器通信協(xié)議 V1.0
協(xié)議:自帶CRC檢驗(yàn)程序 非常經(jīng)典
0.png (401.43 KB, 下載次數(shù): 38)
下載附件
2017-11-20 03:45 上傳
1 簡(jiǎn)介
RY51SD8P232/485 是一款串口控制繼電器模塊,針對(duì)工業(yè)及家庭應(yīng)用而設(shè)計(jì),可用于 工業(yè)自動(dòng)化及物聯(lián)網(wǎng)系統(tǒng)集成。RY51SD8P232/485 兼容任何主流操作系統(tǒng),提供兩種標(biāo)準(zhǔn) 工業(yè)串行通信接口 RS-232 和 RS-485,均可支持高達(dá) 115.2kbps 的通信速率。板載 8 路獨(dú)立 繼電器,兩種通信接口均支持高達(dá) 15 級(jí)級(jí)聯(lián),支持自定義及 Modbus RTU 通信協(xié)議。
2 關(guān)鍵特性
0.png (197.7 KB, 下載次數(shù): 36)
下載附件
2017-11-20 03:45 上傳
供電接口
輸入直流電壓 9~30V,標(biāo)準(zhǔn) 5.5-2.1 插孔供電接口和工業(yè)接線端子,兩種供電方式。為主 從供電模式,當(dāng)插孔處電源接入時(shí),無(wú)論接線端子是否連接電源,均由插孔處供電。當(dāng)插孔處未插入電源時(shí),才可由接線端子供電。
電源指示燈 當(dāng)有電源接入時(shí),電源指示燈點(diǎn)亮。
8 位撥碼開關(guān) 用于設(shè)置通信波特率、設(shè)置通信方式、模塊地址設(shè)置,注意設(shè)置好后,模塊重新加電生效。
撥碼開關(guān)從左往右依次為 bit1 至 bit8,每一位的具體功能后續(xù)介紹。撥碼開關(guān)的某一位 往上撥表示邏輯“0”,往下?lián)鼙硎具壿嫛?”。
通信方式選擇跳線,如上圖所示,當(dāng)跳線帽連接至左邊時(shí)為 RS-232 通信,當(dāng)跳線帽連接
至右邊時(shí)為 RS-485 通信,默認(rèn)為 RS-232 通信。
通信指示燈 發(fā)送或接收數(shù)據(jù)時(shí),通信燈閃爍。
8 路繼電器狀態(tài)指示燈 繼電器某路打開時(shí),對(duì)應(yīng)的指示燈點(diǎn)亮。
8 路繼電器接線端子
每路繼電器配備了一個(gè)三腳的接線端子,以繼電器 S1 為例,如上圖,中間和左邊管腳
為常閉合狀態(tài),中間與右邊管腳為常斷開狀態(tài)。繼電器打開時(shí),中間與左邊管腳斷開, 中間與右邊管腳連接,其它繼電器與此相同。負(fù)載與設(shè)備接線方法如上圖所示。
5 級(jí)聯(lián)方式
模塊可實(shí)現(xiàn)最多 15 級(jí)主從模式級(jí)聯(lián),RS-485、RS-232 級(jí)聯(lián)方式示意圖如下所示。
0.png (57.52 KB, 下載次數(shù): 40)
下載附件
2017-11-20 03:47 上傳
在通信過(guò)程中需保證所有模塊通信波特率相同,通信波特率由撥碼開關(guān) bit1->bit3 設(shè)定。
主機(jī)通過(guò)模塊地址來(lái)區(qū)分網(wǎng)絡(luò)中的模塊,因此,需保證每個(gè)模塊的地址均不相同。,模 塊地址由撥碼開關(guān) bit5->bit8 設(shè)定。
6 波特率設(shè)置
最高波特率可達(dá) 115200bps,由撥碼開關(guān) bit1->bit3 設(shè)定,設(shè)置如下圖所示,設(shè)置好后, 模塊重新上電生效。
7 模塊地址設(shè)置
模塊地址由撥碼開關(guān) bit5->bit8 設(shè)定,設(shè)置范圍為:0x00~0x0E 共 15 個(gè)地址,如下圖所 示。設(shè)置好后,模塊重新上電生效。
8 通信協(xié)議
支持 modbus RTU 以及自定義兩種通信協(xié)議。通信協(xié)議由撥碼開關(guān) bit4 來(lái)選擇,當(dāng) bit4 為邏輯 1 時(shí),如下圖右邊所示,設(shè)置為 modbus RTU 通信協(xié)議。當(dāng) bit4 為邏輯 0 時(shí),如下圖 左邊所示,設(shè)置為自定義通信協(xié)議。
Modbus RTU 通信協(xié)議一幀完整的數(shù)據(jù)包括“地址+命令+數(shù)據(jù)+校驗(yàn)”內(nèi)容。數(shù)據(jù)發(fā)送順
序?yàn)榈刂吩谇埃詈鬄樾r?yàn)。字節(jié)發(fā)送為低位至高位的順序。校驗(yàn)數(shù)值為“地址+命令+數(shù)據(jù)” 計(jì)算結(jié)果。如下圖所示,一幀數(shù)據(jù)包括 8bit 地址,16bit 命令,N 個(gè)字節(jié)數(shù)據(jù),2 字節(jié)的 CRC16校驗(yàn)。
0.png (51.39 KB, 下載次數(shù): 45)
下載附件
2017-11-20 03:49 上傳
地址:8bit 地址值為模塊的地址;
命令:命令的字節(jié) 1 表示“寫”繼電器或 “讀”繼電器,0x01 表示“寫”,即控制模塊繼 電器開或關(guān),0x02 表示 “讀”,即讀取模塊繼電器狀態(tài)。
命令的字節(jié) 2 表示控制的繼電器開關(guān)的方式,0x11:同時(shí)控制 8 個(gè)繼電器中任意開 或關(guān)。0x22:打開某幾個(gè)或全部,其他保持不變。0x33:關(guān)閉某幾個(gè)或全部,其他保 持不變。具體哪些繼電器由數(shù)據(jù) 1 決定。0x44:與字節(jié) 1 的 0x02 配合使用。
數(shù)據(jù):數(shù)據(jù) 1 為一個(gè)字節(jié)即 8bit,每一 bit 對(duì)應(yīng)的一個(gè)繼電器,最高位對(duì)應(yīng)的繼電器 S8,依
順序排列,最低位對(duì)應(yīng)繼電器 S1。對(duì)應(yīng)位為“1”表示打開繼電器,“0”表示關(guān)閉繼 電器。數(shù)據(jù) 2~N 為可選數(shù)據(jù)。
CRC16 校驗(yàn):為前面所以數(shù)據(jù)的校驗(yàn)值,共包括 2 個(gè)字節(jié),高字節(jié)在前,低字節(jié)在后。 注:地址 0x0F 為廣播地址,只有“寫”繼電器時(shí)起作用,對(duì)所有級(jí)聯(lián)模塊同時(shí)寫數(shù)據(jù),與
模塊實(shí)際地址無(wú)關(guān)。 應(yīng)用實(shí)例:
0x00 0x01 0x11 0x01 0x9C 0x74
使地址為 0x00 的模塊,打開繼電器 1 其它關(guān)閉。其中,0x9C 0x74 分別為前面數(shù)據(jù)的
CRC16 校驗(yàn)高、低字節(jié)。
0x00 0x01 0x22 0x02 0xC8 0x85
使地址為 0x00 的模塊,打開繼電器 2 其它不變。其中,0xC8 0x85 分別為前面數(shù)據(jù)的
CRC16 校驗(yàn)高、低字節(jié)。
0x0E 0x01 0x33 0x7F 0x06 0x1C
使地址為 15 的模塊,關(guān)閉繼電器 8 其它不變。其中,0x06 0x1C 分別為前面數(shù)據(jù)的
CRC16 校驗(yàn)高、低字節(jié)。
0x01 0x02 0x44 0x21 0x53
讀取地址為 0x01 模塊 8 各繼電器狀態(tài),模塊返回?cái)?shù)據(jù)如下:
0x01 0x02 0x01 0xFF 0xE1 0xC8
讀模塊時(shí),返回?cái)?shù)據(jù)格式如下所示:
返回的地址為被讀模塊的地址,命令字節(jié) 1、2 為固定值 0x02、0x01,數(shù)據(jù) 1 為 8 路繼
電器的狀態(tài)值,某一位為 1 表示該路繼電器為打開,為 0 表示關(guān)閉狀態(tài)。最后兩個(gè)字節(jié)為前 面 4 字節(jié)的 CRC16 校驗(yàn)值。
自定義通信:自定義通信方式與 modbus RTU 的唯一區(qū)別為,不帶 CRC16 校驗(yàn),即發(fā)送和接 收的數(shù)據(jù)沒(méi)有最后兩個(gè)字節(jié)。
注:該模塊只是實(shí)現(xiàn)了 modbus RTU 的部分功能,在實(shí)際應(yīng)用中以上述講解的通信方式為準(zhǔn)。 部分控制數(shù)據(jù)如下圖所示:
9 測(cè)試軟件
模塊配置了測(cè)試軟件,界面如下圖所示,可運(yùn)行于 XP/win7/win10 等操作系統(tǒng)。軟件包
括控制繼電器,讀取繼電器,顯示繼電器狀態(tài)以及計(jì)算 CRC16 功能。
使用軟件時(shí),首先設(shè)置好與模塊對(duì)應(yīng)的“端口”、“波特率”、“地址碼”,然后點(diǎn)擊“打 開串口”按鈕,若串口成功打開,左邊紅色指示燈點(diǎn)亮。
若需要控制打開某個(gè)繼電器則勾選相應(yīng)的繼電器,如果通信方式為 modbus RTU 則勾選 “校驗(yàn)”選項(xiàng)(自定義模式不勾選),點(diǎn)擊“控制”按鈕,將相應(yīng)的數(shù)據(jù)發(fā)送出去,發(fā)送的 數(shù)據(jù)將以 16 進(jìn)制的格式顯示在“已發(fā)送”編輯框中。
點(diǎn)擊“讀狀態(tài)”按鈕,接收到的數(shù)據(jù)將顯示在“已接收”編輯框中,繼電器的狀態(tài)將顯 示在右上部分 8 個(gè)顯示小燈處。
另外,軟件還集成了 CRC16 校驗(yàn)計(jì)算功能,16 進(jìn)制數(shù)據(jù)輸入格式如下圖所示,點(diǎn)擊“計(jì) 算”按鈕,計(jì)算結(jié)果顯示到編輯框中,高字節(jié)在前,低字節(jié)在后,如下圖所示“DC”高字 節(jié),“BC”為低字節(jié)。
注:輸入數(shù)據(jù)時(shí)中間以空格隔開,注意最后一個(gè)數(shù)后面請(qǐng)勿添加空格。
10 CRC16 函數(shù)
單片機(jī)源程序如下:
- /* CRC16 計(jì)算函數(shù), ptr-數(shù)據(jù)指針, len-數(shù)據(jù)長(zhǎng)度,返回值-計(jì)算出的 CRC16 數(shù)值 */
- unsigned int GetCRC16(unsigned char *ptr, unsigned char len)
- {
- unsigned int index;
- unsigned char crch = 0xFF; //高 CRC 字節(jié)
- unsigned char crcl = 0xFF; //低 CRC 字節(jié)
- unsigned char code TabH[] = { //CRC 高位字節(jié)值表
- 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} ;
- unsigned char code TabL[] = { //CRC 低位字節(jié)值表
- 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} ;
- while (len--) //計(jì)算指定長(zhǎng)度的 CRC
- { index = crch ^ *ptr++; crch = crcl ^ TabH[index]; crcl = TabL[index];
- }
- return ((crch<<8) | crcl);
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
串口轉(zhuǎn)繼電器通信協(xié)議 V1.0.pdf
(1006.28 KB, 下載次數(shù): 44)
2017-11-19 22:18 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|