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