Modbus通信協(xié)議教程
《Modbus通信協(xié)議教程》由會員分享,可在線閱讀,更多相關(guān)《Modbus通信協(xié)議教程(41頁珍藏版)》請在裝配圖網(wǎng)上搜索。
Modbus 通信協(xié)議 一 Modbus 協(xié)議簡介 Modbus 協(xié)議是應(yīng)用于電子控制器上的一種通用語言 通過此協(xié)議 控制器相互之間 控制器經(jīng)由網(wǎng)絡(luò) 例如以太網(wǎng) 和其它設(shè)備之間可以通信 它已經(jīng)成為一通用工業(yè)標(biāo)準(zhǔn) 有了它 不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò) 進(jìn)行集中監(jiān)控 此協(xié)議定義了一個控制器能認(rèn)識使用的消息結(jié)構(gòu) 而不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通 信的 它描述了一控制器請求訪問其它設(shè)備的過程 如果回應(yīng)來自其它設(shè)備的請求 以及 怎樣偵測錯誤并記錄 它制定了消息域格局和內(nèi)容的公共格式 當(dāng)在一 Modbus 網(wǎng)絡(luò)上通信時 此協(xié)議決定了每個控制器須要知道它們的設(shè)備地址 識別按地址發(fā)來的消息 決定要產(chǎn)生何種行動 如果需要回應(yīng) 控制器將生成反饋信息并 用 Modbus 協(xié)議發(fā)出 在其它網(wǎng)絡(luò)上 包含了 Modbus 協(xié)議的消息轉(zhuǎn)換為在此網(wǎng)絡(luò)上使用 的幀或包結(jié)構(gòu) 這種轉(zhuǎn)換也擴(kuò)展了根據(jù)具體的網(wǎng)絡(luò)解決節(jié)地址 路由路徑及錯誤檢測的方 法 1 在 Modbus 網(wǎng)絡(luò)上轉(zhuǎn)輸 標(biāo)準(zhǔn)的 Modbus 口是使用一 RS 232C 兼容串行接口 它定義了連接口的針腳 電纜 信號位 傳輸波特率 奇偶校驗 控制器能直接或經(jīng)由 Modem 組網(wǎng) 控制器通信使用主 從技術(shù) 即僅一設(shè)備 主設(shè)備 能初始化傳輸 查詢 其它 設(shè)備 從設(shè)備 根據(jù)主設(shè)備查詢提供的數(shù)據(jù)作出相應(yīng)反應(yīng) 典型的主設(shè)備 主機和可編程 儀表 典型的從設(shè)備 可編程控制器 主設(shè)備可單獨和從設(shè)備通信 也能以廣播方式和所有從設(shè)備通信 如果單獨通信 從設(shè)備返回一消息作為回應(yīng) 如果是以廣播方式查詢的 則不作任何回應(yīng) Modbus 協(xié)議建 立了主設(shè)備查詢的格式 設(shè)備 或廣播 地址 功能代碼 所有要發(fā)送的數(shù)據(jù) 一錯誤檢 測域 從設(shè)備回應(yīng)消息也由 Modbus 協(xié)議構(gòu)成 包括確認(rèn)要行動的域 任何要返回的數(shù)據(jù) 和一錯誤檢測域 如果在消息接收過程中發(fā)生一錯誤 或從設(shè)備不能執(zhí)行其命令 從設(shè)備 將建立一錯誤消息并把它作為回應(yīng)發(fā)送出去 2 在其它類型網(wǎng)絡(luò)上轉(zhuǎn)輸 在其它網(wǎng)絡(luò)上 控制器使用對等技術(shù)通信 故任何控制都能初始和其它控制器的通 信 這樣在單獨的通信過程中 控制器既可作為主設(shè)備也可作為從設(shè)備 提供的多個內(nèi)部 通道可允許同時發(fā)生的傳輸進(jìn)程 在消息位 Modbus 協(xié)議仍提供了主 從原則 盡管網(wǎng)絡(luò)通信方法是 對等 如果一 控制器發(fā)送一消息 它只是作為主設(shè)備 并期望從從設(shè)備得到回應(yīng) 同樣 當(dāng)控制器接收 到一消息 它將建立一從設(shè)備回應(yīng)格式并返回給發(fā)送的控制器 3 查詢 回應(yīng)周期 1 查詢 查詢消息中的功能代碼告之被選中的從設(shè)備要執(zhí)行何種功能 數(shù)據(jù)段包含了從設(shè)備 要執(zhí)行功能的任何附加信息 例如功能代碼 03 是要求從設(shè)備讀保持寄存器并返回它們的內(nèi) 容 數(shù)據(jù)段必須包含要告之從設(shè)備的信息 從何寄存器開始讀及要讀的寄存器數(shù)量 錯誤 檢測域為從設(shè)備提供了一種驗證消息內(nèi)容是否正確的方法 2 回應(yīng) 如果從設(shè)備產(chǎn)生一正常的回應(yīng) 在回應(yīng)消息中的功能代碼是在查詢消息中的功能代 碼的回應(yīng) 數(shù)據(jù)段包括了從設(shè)備收集的數(shù)據(jù) 象寄存器值或狀態(tài) 如果有錯誤發(fā)生 功能 代碼將被修改以用于指出回應(yīng)消息是錯誤的 同時數(shù)據(jù)段包含了描述此錯誤信息的代碼 錯誤檢測域允許主設(shè)備確認(rèn)消息內(nèi)容是否可用 二 兩種傳輸方式 控制器能設(shè)置為兩種傳輸模式 ASCII 或 RTU 中的任何一種在標(biāo)準(zhǔn)的 Modbus 網(wǎng) 絡(luò)通信 用戶選擇想要的模式 包括串口通信參數(shù) 波特率 校驗方式等 在配置每個 控制器的時候 在一個 Modbus 網(wǎng)絡(luò)上的所有設(shè)備都必須選擇相同的傳輸模式和串口參數(shù) ASCII 模式 地址 功能代碼 數(shù)據(jù)數(shù)量 數(shù)據(jù) 1 數(shù)據(jù)n LRC 高字節(jié) LRC 低字節(jié) 回車 換行 RTU 模式 地址 功能代碼 數(shù)據(jù)數(shù)量 數(shù)據(jù) 1 數(shù)據(jù) n CRC 低字節(jié) CRC 高字節(jié) 所選的 ASCII 或 RTU 方式僅適用于標(biāo)準(zhǔn)的 Modbus 網(wǎng)絡(luò) 它定義了在這些網(wǎng)絡(luò)上連 續(xù)傳輸?shù)南⒍蔚拿恳晃?以及決定怎樣將信息打包成消息域和如何解碼 在其它網(wǎng)絡(luò)上 象 MAP 和 Modbus Plus Modbus 消息被轉(zhuǎn)成與串行傳輸無關(guān)的幀 1 ASCII 模式 當(dāng)控制器設(shè)為在 Modbus 網(wǎng)絡(luò)上以 ASCII 美國標(biāo)準(zhǔn)信息交換代碼 模式通信 在消 息中的每個 8Bit 字節(jié)都作為兩個 ASCII 字符發(fā)送 這種方式的主要優(yōu)點是字符發(fā)送的時間 間隔可達(dá)到 1 秒而不產(chǎn)生錯誤 代碼系統(tǒng) 十六進(jìn)制 ASCII 字符 0 9 A F 消息中的每個 ASCII 字符都是一個十六進(jìn)制字符組成 每個字節(jié)的位 1 個起始位 7 個數(shù)據(jù)位 最小的有效位先發(fā)送 1 個奇偶校驗位 無校驗則無 1 個停止位 有校驗時 2 個 Bit 無校驗時 錯誤檢測域 LRC 縱向冗長檢測 2 RTU 模式 當(dāng)控制器設(shè)為在 Modbus 網(wǎng)絡(luò)上以 RTU 遠(yuǎn)程終端單元 模式通信 在消息中的每 個 8Bit 字節(jié)包含兩個 4Bit 的十六進(jìn)制字符 這種方式的主要優(yōu)點是 在同樣的波特率下 可比 ASCII 方式傳送更多的數(shù)據(jù) 代碼系統(tǒng) 8 位二進(jìn)制 十六進(jìn)制數(shù) 0 9 A F 消息中的每個 8 位域都是一個兩個十六進(jìn)制字符組成 每個字節(jié)的位 1 個起始位 8 個數(shù)據(jù)位 最小的有效位先發(fā)送 1 個奇偶校驗位 無校驗則無 1 個停止位 有校驗時 2 個 Bit 無校驗時 錯誤檢測域 CRC 循環(huán)冗長檢測 三 Modbus 消息幀 兩種傳輸模式中 ASCII 或 RTU 傳輸設(shè)備以將 Modbus 消息轉(zhuǎn)為有起點和終點 的幀 這就允許接收的設(shè)備在消息起始處開始工作 讀地址分配信息 判斷哪一個設(shè)備被 選中 廣播方式則傳給所有設(shè)備 判知何時信息已完成 部分的消息也能偵測到并且錯 誤能設(shè)置為返回結(jié)果 1 ASCII 幀 使用 ASCII 模式 消息以冒號 字符 ASCII 碼 3AH 開始 以回車換行符結(jié)束 ASCII 碼 0DH 0AH 其它域可以使用的傳輸字符是十六進(jìn)制的 0 9 A F 網(wǎng)絡(luò)上的設(shè)備不斷偵測 字符 當(dāng)有一個冒號接收到時 每個設(shè)備都解碼下個域 地址域 來判斷是否發(fā)給自己的 消息中字符間發(fā)送的時間間隔最長不能超過 1 秒 否則接收的設(shè)備將認(rèn)為傳輸錯誤 一個典型消息幀如下所示 起始位 設(shè)備地址 功能代碼 數(shù)據(jù) LRC 校驗 結(jié)束符 1 個字符 2 個字符 2 個字符 n 個字符 2 個字符 2 個字符 圖 2 ASCII 消息幀 2 RTU 幀 使用 RTU 模式 消息發(fā)送至少要以 3 5 個字符時間的停頓間隔開始 在網(wǎng)絡(luò)波特率 下多樣的字符時間 這是最容易實現(xiàn)的 如下圖的 T1 T2 T3 T4 所示 傳輸?shù)牡谝粋€域是 設(shè)備地址 可以使用的傳輸字符是十六進(jìn)制的 0 9 A F 網(wǎng)絡(luò)設(shè)備不斷偵測網(wǎng)絡(luò)總線 包 括停頓間隔時間內(nèi) 當(dāng)?shù)谝粋€域 地址域 接收到 每個設(shè)備都進(jìn)行解碼以判斷是否發(fā)往 自己的 在最后一個傳輸字符之后 一個至少 3 5 個字符時間的停頓標(biāo)定了消息的結(jié)束 一個新的消息可在此停頓后開始 整個消息幀必須作為一連續(xù)的流轉(zhuǎn)輸 如果在幀完成之前有超過 1 5 個字符時間的停 頓時間 接收設(shè)備將刷新不完整的消息并假定下一字節(jié)是一個新消息的地址域 同樣地 如果一個新消息在小于 3 5 個字符時間內(nèi)接著前個消息開始 接收的設(shè)備將認(rèn)為它是前一 消息的延續(xù) 這將導(dǎo)致一個錯誤 因為在最后的 CRC 域的值不可能是正確的 一典型的消 息幀如下所示 起始位 設(shè)備地址 功能代碼 數(shù)據(jù) CRC 校驗 結(jié)束符 T1 T2 T3 T4 8Bit 8Bit n 個 8Bit 16Bit T1 T2 T3 T4 圖 3 RTU 消息幀 3 地址域 消息幀的地址域包含兩個字符 ASCII 或 8Bit RTU 可能的從設(shè)備地址是 0 247 十進(jìn)制 單個設(shè)備的地址范圍是 1 247 主設(shè)備通過將要聯(lián)絡(luò)的從設(shè)備的地址放 入消息中的地址域來選通從設(shè)備 當(dāng)從設(shè)備發(fā)送回應(yīng)消息時 它把自己的地址放入回應(yīng)的 地址域中 以便主設(shè)備知道是哪一個設(shè)備作出回應(yīng) 地址 0 是用作廣播地址 以使所有的從設(shè)備都能認(rèn)識 當(dāng) Modbus 協(xié)議用于更高水準(zhǔn) 的網(wǎng)絡(luò) 廣播可能不允許或以其它方式代替 4 如何處理功能域 消息幀中的功能代碼域包含了兩個字符 ASCII 或 8Bits RTU 可能的代碼范 圍是十進(jìn)制的 1 255 當(dāng)然 有些代碼是適用于所有控制器 有此是應(yīng)用于某種控制器 還有些保留以備后用 當(dāng)消息從主設(shè)備發(fā)往從設(shè)備時 功能代碼域?qū)⒏嬷畯脑O(shè)備需要執(zhí)行哪些行為 例如 去讀取輸入的開關(guān)狀態(tài) 讀一組寄存器的數(shù)據(jù)內(nèi)容 讀從設(shè)備的診斷狀態(tài) 允許調(diào)入 記 錄 校驗在從設(shè)備中的程序等 當(dāng)從設(shè)備回應(yīng)時 它使用功能代碼域來指示是正?;貞?yīng) 無誤 還是有某種錯誤發(fā)生 稱作異議回應(yīng) 對正?;貞?yīng) 從設(shè)備僅回應(yīng)相應(yīng)的功能代碼 對異議回應(yīng) 從設(shè)備返 回一等同于正常代碼的代碼 但最重要的位置為邏輯 1 例如 一從主設(shè)備發(fā)往從設(shè)備的消息要求讀一組保持寄存器 將產(chǎn)生如下功能代碼 0 0 0 0 0 0 1 1 十六進(jìn)制 03H 對正常回應(yīng) 從設(shè)備僅回應(yīng)同樣的功能代碼 對異議回應(yīng) 它返回 1 0 0 0 0 0 1 1 十六進(jìn)制 83H 除功能代碼因異議錯誤作了修改外 從設(shè)備將一獨特的代碼放到回應(yīng)消息的數(shù)據(jù)域 中 這能告訴主設(shè)備發(fā)生了什么錯誤 主設(shè)備應(yīng)用程序得到異議的回應(yīng)后 典型的處理過程是重發(fā)消息 或者診斷發(fā)給從 設(shè)備的消息并報告給操作員 5 數(shù)據(jù)域 數(shù)據(jù)域是由兩個十六進(jìn)制數(shù)集合構(gòu)成的 范圍 00 FF 根據(jù)網(wǎng)絡(luò)傳輸模式 這可以 是由一對 ASCII 字符組成或由一 RTU 字符組成 從主設(shè)備發(fā)給從設(shè)備消息的數(shù)據(jù)域包含附加的信息 從設(shè)備必須用于進(jìn)行執(zhí)行由功 能代碼所定義的所為 這包括了象不連續(xù)的寄存器地址 要處理項的數(shù)目 域中實際數(shù)據(jù) 字節(jié)數(shù) 例如 如果主設(shè)備需要從設(shè)備讀取一組保持寄存器 功能代碼 03 數(shù)據(jù)域指定了 起始寄存器以及要讀的寄存器數(shù)量 如果主設(shè)備寫一組從設(shè)備的寄存器 功能代碼 10 十六 進(jìn)制 數(shù)據(jù)域則指明了要寫的起始寄存器以及要寫的寄存器數(shù)量 數(shù)據(jù)域的數(shù)據(jù)字節(jié)數(shù) 要寫入寄存器的數(shù)據(jù) 如果沒有錯誤發(fā)生 從從設(shè)備返回的數(shù)據(jù)域包含請求的數(shù)據(jù) 如果有錯誤發(fā)生 此 域包含一異議代碼 主設(shè)備應(yīng)用程序可以用來判斷采取下一步行動 在某種消息中數(shù)據(jù)域可以是不存在的 0 長度 例如 主設(shè)備要求從設(shè)備回應(yīng)通信 事件記錄 功能代碼 0B 十六進(jìn)制 從設(shè)備不需任何附加的信息 6 錯誤檢測域 標(biāo)準(zhǔn)的 Modbus 網(wǎng)絡(luò)有兩種錯誤檢測方法 錯誤檢測域的內(nèi)容視所選的檢測方法而定 ASCII 當(dāng)選用 ASCII 模式作字符幀 錯誤檢測域包含兩個 ASCII 字符 這是使用 LRC 縱 向冗長檢測 方法對消息內(nèi)容計算得出的 不包括開始的冒號符及回車換行符 LRC 字符 附加在回車換行符前面 RTU 當(dāng)選用 RTU 模式作字符幀 錯誤檢測域包含一 16Bits 值 用兩個 8 位的字符來實現(xiàn) 錯誤檢測域的內(nèi)容是通過對消息內(nèi)容進(jìn)行循環(huán)冗長檢測方法得出的 CRC 域附加在消息的 最后 添加時先是低字節(jié)然后是高字節(jié) 故 CRC 的高位字節(jié)是發(fā)送消息的最后一個字節(jié) 7 字符的連續(xù)傳輸 當(dāng)消息在標(biāo)準(zhǔn)的 Modbus 系列網(wǎng)絡(luò)傳輸時 每個字符或字節(jié)以如下方式發(fā)送 從左到 右 最低有效位 最高有效位 使用 ASCII 字符幀時 位的序列是 有奇偶校驗 啟始 位 1 2 3 4 5 6 7 奇偶 位 停止 位 無奇偶校驗 啟始 位 1 2 3 4 5 6 7 停止 位 停止 位 圖 4 位順序 ASCII 使用 RTU 字符幀時 位的序列是 有奇偶校驗 啟始位 1 2 3 4 5 6 7 8 奇偶位 停止位 無奇偶校驗 啟始 位 1 2 3 4 5 6 7 8 停止位 停止 位 圖 4 位順序 RTU 四 錯誤檢測方法 標(biāo)準(zhǔn)的 Modbus 串行網(wǎng)絡(luò)采用兩種錯誤檢測方法 奇偶校驗對每個字符都可用 幀檢 測 LRC 或 CRC 應(yīng)用于整個消息 它們都是在消息發(fā)送前由主設(shè)備產(chǎn)生的 從設(shè)備在接 收過程中檢測每個字符和整個消息幀 用戶要給主設(shè)備配置一預(yù)先定義的超時時間間隔 這個時間間隔要足夠長 以使任 何從設(shè)備都能作為正常反應(yīng) 如果從設(shè)備測到一傳輸錯誤 消息將不會接收 也不會向主 設(shè)備作出回應(yīng) 這樣超時事件將觸發(fā)主設(shè)備來處理錯誤 發(fā)往不存在的從設(shè)備的地址也會 產(chǎn)生超時 1 奇偶校驗 用戶可以配置控制器是奇或偶校驗 或無校驗 這將決定了每個字符中的奇偶校驗 位是如何設(shè)置的 如果指定了奇或偶校驗 1 的位數(shù)將算到每個字符的位數(shù)中 ASCII 模式 7 個數(shù)據(jù) 位 RTU 中 8 個數(shù)據(jù)位 例如 RTU 字符幀中包含以下 8 個數(shù)據(jù)位 1 1 0 0 0 1 0 1 整個 1 的數(shù)目是 4 個 如果便用了偶校驗 幀的奇偶校驗位將是 0 便得整個 1 的 個數(shù)仍是 4 個 如果便用了奇校驗 幀的奇偶校驗位將是 1 便得整個 1 的個數(shù)是 5 個 如果沒有指定奇偶校驗位 傳輸時就沒有校驗位 也不進(jìn)行校驗檢測 代替一附加 的停止位填充至要傳輸?shù)淖址麕?2 LRC 檢測 使用 ASCII 模式 消息包括了一基于 LRC 方法的錯誤檢測域 LRC 域檢測了消息域 中除開始的冒號及結(jié)束的回車換行號外的內(nèi)容 LRC 域是一個包含一個 8 位二進(jìn)制值的字節(jié) LRC 值由傳輸設(shè)備來計算并放到消息 幀中 接收設(shè)備在接收消息的過程中計算 LRC 并將它和接收到消息中 LRC 域中的值比 較 如果兩值不等 說明有錯誤 LRC 方法是將消息中的 8Bit 的字節(jié)連續(xù)累加 丟棄了進(jìn)位 LRC 簡單函數(shù)如下 static unsigned char LRC auchMsg usDataLen unsigned char auchMsg 要進(jìn)行計算的消息 unsigned short usDataLen LRC 要處理的字節(jié)的數(shù)量 unsigned char uchLRC 0 LRC 字節(jié)初始化 while usDataLen 傳送消息 uchLRC auchMsg 累加 return unsigned char char uchLRC 3 CRC 檢測 使用 RTU 模式 消息包括了一基于 CRC 方法的錯誤檢測域 CRC 域檢測了整個消 息的內(nèi)容 CRC 域是兩個字節(jié) 包含一 16 位的二進(jìn)制值 它由傳輸設(shè)備計算后加入到消息中 接收設(shè)備重新計算收到消息的 CRC 并與接收到的 CRC 域中的值比較 如果兩值不同 則有誤 CRC 是先調(diào)入一值是全 1 的 16 位寄存器 然后調(diào)用一過程將消息中連續(xù)的 8 位字 節(jié)各當(dāng)前寄存器中的值進(jìn)行處理 僅每個字符中的 8Bit 數(shù)據(jù)對 CRC 有效 起始位和停止 位以及奇偶校驗位均無效 CRC 產(chǎn)生過程中 每個 8 位字符都單獨和寄存器內(nèi)容相或 OR 結(jié)果向最低有效 位方向移動 最高有效位以 0 填充 LSB 被提取出來檢測 如果 LSB 為 1 寄存器單獨和 預(yù)置的值或一下 如果 LSB 為 0 則不進(jìn)行 整個過程要重復(fù) 8 次 在最后一位 第 8 位 完成后 下一個 8 位字節(jié)又單獨和寄存器的當(dāng)前值相或 最終寄存器中的值 是消息中所 有的字節(jié)都執(zhí)行之后的 CRC 值 CRC 添加到消息中時 低字節(jié)先加入 然后高字節(jié) CRC 簡單函數(shù)如下 unsigned short CRC16 puchMsg usDataLen unsigned char puchMsg 要進(jìn)行 CRC 校驗的消息 unsigned short usDataLen 消息中字節(jié)數(shù) unsigned char uchCRCHi 0 xFF 高 CRC 字節(jié)初始化 unsigned char uchCRCLo 0 xFF 低 CRC 字節(jié)初始化 unsigned uIndex CRC 循環(huán)中的索引 while usDataLen 傳輸消息緩沖區(qū) uIndex uchCRCHi puchMsgg 計算 CRC uchCRCHi uchCRCLo auchCRCHi uIndex uchCRCLo auchCRCLo uIndex return uchCRCHi 8 uchCRCLo CRC 高位字節(jié)值表 static unsigned char auchCRCHi 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 0 x01 0 xC0 0 x80 0 x41 0 x01 0 xC0 0 x80 0 x41 0 x00 0 xC1 0 x81 0 x40 CRC 低位字節(jié)值表 static char auchCRCLo 0 x00 0 xC0 0 xC1 0 x01 0 xC3 0 x03 0 x02 0 xC2 0 xC6 0 x06 0 x07 0 xC7 0 x05 0 xC5 0 xC4 0 x04 0 xCC 0 x0C 0 x0D 0 xCD 0 x0F 0 xCF 0 xCE 0 x0E 0 x0A 0 xCA 0 xCB 0 x0B 0 xC9 0 x09 0 x08 0 xC8 0 xD8 0 x18 0 x19 0 xD9 0 x1B 0 xDB 0 xDA 0 x1A 0 x1E 0 xDE 0 xDF 0 x1F 0 xDD 0 x1D 0 x1C 0 xDC 0 x14 0 xD4 0 xD5 0 x15 0 xD7 0 x17 0 x16 0 xD6 0 xD2 0 x12 0 x13 0 xD3 0 x11 0 xD1 0 xD0 0 x10 0 xF0 0 x30 0 x31 0 xF1 0 x33 0 xF3 0 xF2 0 x32 0 x36 0 xF6 0 xF7 0 x37 0 xF5 0 x35 0 x34 0 xF4 0 x3C 0 xFC 0 xFD 0 x3D 0 xFF 0 x3F 0 x3E 0 xFE 0 xFA 0 x3A 0 x3B 0 xFB 0 x39 0 xF9 0 xF8 0 x38 0 x28 0 xE8 0 xE9 0 x29 0 xEB 0 x2B 0 x2A 0 xEA 0 xEE 0 x2E 0 x2F 0 xEF 0 x2D 0 xED 0 xEC 0 x2C 0 xE4 0 x24 0 x25 0 xE5 0 x27 0 xE7 0 xE6 0 x26 0 x22 0 xE2 0 xE3 0 x23 0 xE1 0 x21 0 x20 0 xE0 0 xA0 0 x60 0 x61 0 xA1 0 x63 0 xA3 0 xA2 0 x62 0 x66 0 xA6 0 xA7 0 x67 0 xA5 0 x65 0 x64 0 xA4 0 x6C 0 xAC 0 xAD 0 x6D 0 xAF 0 x6F 0 x6E 0 xAE 0 xAA 0 x6A 0 x6B 0 xAB 0 x69 0 xA9 0 xA8 0 x68 0 x78 0 xB8 0 xB9 0 x79 0 xBB 0 x7B 0 x7A 0 xBA 0 xBE 0 x7E 0 x7F 0 xBF 0 x7D 0 xBD 0 xBC 0 x7C 0 xB4 0 x74 0 x75 0 xB5 0 x77 0 xB7 0 xB6 0 x76 0 x72 0 xB2 0 xB3 0 x73 0 xB1 0 x71 0 x70 0 xB0 0 x50 0 x90 0 x91 0 x51 0 x93 0 x53 0 x52 0 x92 0 x96 0 x56 0 x57 0 x97 0 x55 0 x95 0 x94 0 x54 0 x9C 0 x5C 0 x5D 0 x9D 0 x5F 0 x9F 0 x9E 0 x5E 0 x5A 0 x9A 0 x9B 0 x5B 0 x99 0 x59 0 x58 0 x98 0 x88 0 x48 0 x49 0 x89 0 x4B 0 x8B 0 x8A 0 x4A 0 x4E 0 x8E 0 x8F 0 x4F 0 x8D 0 x4D 0 x4C 0 x8C 0 x44 0 x84 0 x85 0 x45 0 x87 0 x47 0 x46 0 x86 0 x82 0 x42 0 x43 0 x83 0 x41 0 x81 0 x80 0 x40 RS 232 RS 422 與 RS 485 標(biāo)準(zhǔn)及應(yīng)用 一 RS 232 RS 422 與 RS 485 的由來 RS 232 RS 422 與 RS 485 都是串行數(shù)據(jù)接口標(biāo)準(zhǔn) 最初都是由電子工業(yè)協(xié)會 EIA 制訂并發(fā)布的 RS 232 在 1962 年發(fā)布 命名為 EIA 232 E 作為工業(yè)標(biāo)準(zhǔn) 以保 證不同廠家產(chǎn)品之間的兼容 RS 422 由 RS 232 發(fā)展而來 它是為彌補 RS 232 之不足而提 出的 為改進(jìn) RS 232 通信距離短 速率低的缺點 RS 422 定義了一種平衡通信接口 將 傳輸速率提高到 10Mb s 傳輸距離延長到 4000 英尺 速率低于 100kb s 時 并允許在一 條平衡總線上連接最多 10 個接收器 RS 422 是一種單機發(fā)送 多機接收的單向 平衡傳 輸規(guī)范 被命名為 TIA EIA 422 A 標(biāo)準(zhǔn) 為擴(kuò)展應(yīng)用范圍 EIA 又于 1983 年在 RS 422 基 礎(chǔ)上制定了 RS 485 標(biāo)準(zhǔn) 增加了多點 雙向通信能力 即允許多個發(fā)送器連接到同一條 總線上 同時增加了發(fā)送器的驅(qū)動能力和沖突保護(hù)特性 擴(kuò)展了總線共模范圍 后命名為 TIA EIA 485 A 標(biāo)準(zhǔn) 由于 EIA 提出的建議標(biāo)準(zhǔn)都是以 RS 作為前綴 所以在通訊工業(yè)領(lǐng) 域 仍然習(xí)慣將上述標(biāo)準(zhǔn)以 RS 作前綴稱謂 RS 232 RS 422 與 RS 485 標(biāo)準(zhǔn)只對接口的電氣特性做出規(guī)定 而不涉及接插件 電纜或協(xié)議 在此基礎(chǔ)上用戶可以建立自己的高層通信協(xié)議 因此在視頻界的應(yīng)用 許多 廠家都建立了一套高層通信協(xié)議 或公開或廠家獨家使用 如錄像機廠家中的 Sony 與松 下對錄像機的 RS 422 控制協(xié)議是有差異的 視頻服務(wù)器上的控制協(xié)議則更多了 如 Louth Odetis 協(xié)議是公開的 而 ProLINK 則是基于 Profile 上的 二 RS 232 串行接口標(biāo)準(zhǔn) 目前 RS 232 是 PC 機與通信工業(yè)中應(yīng)用最廣泛的一種串行接口 RS 232 被定義為一 種在低速率串行通訊中增加通訊距離的單端標(biāo)準(zhǔn) RS 232 采取不平衡傳輸方式 即所謂單 端通訊 圖 1 收 發(fā)端的數(shù)據(jù)信號是相對于信號地 如從 DTE 設(shè)備發(fā)出的數(shù)據(jù)在使用 DB25 連接 器時是 2 腳相對 7 腳 信號地 的電平 DB25 各引腳定義參見圖 1 典型的 RS 232 信號 在正負(fù)電平之間擺動 在發(fā)送數(shù)據(jù)時 發(fā)送端驅(qū)動器輸出正電平在 5 15V 負(fù)電平在 5 15V 電平 當(dāng)無數(shù)據(jù)傳輸時 線上為 TTL 從開始傳送數(shù)據(jù)到結(jié)束 線上電平從 TTL 電平到 RS 232 電平再返回 TTL 電平 接收器典型的工作電平在 3 12V 與 3 12V 由 于發(fā)送電平與接收電平的差僅為 2V 至 3V 左右 所以其共模抑制能力差 再加上雙絞線上 的分布電容 其傳送距離最大為約 15 米 最高速率為 20kb s RS 232 是為點對點 即只 用一對收 發(fā)設(shè)備 通訊而設(shè)計的 其驅(qū)動器負(fù)載為 3 7k 所以 RS 232 適合本地設(shè)備 之間的通信 其有關(guān)電氣參數(shù)參見表 1 規(guī)定 RS232 RS422 R485 工作方式 單端 差分 差分 節(jié)點數(shù) 1 收 1 發(fā) 1 發(fā) 10 收 1 發(fā) 32 收 最大傳輸電纜長度 50 英尺 400 英尺 400 英尺 最大傳輸速率 20Kb S 10Mb s 10Mb s 最大驅(qū)動輸出電壓 25V 0 25V 6V 7V 12V 驅(qū)動器輸出信號電平 負(fù)載最小值 負(fù)載 5V 15V 2 0V 1 5V 驅(qū)動器輸出信號電平 空載最大值 空載 25V 6V 6V 驅(qū)動器負(fù)載阻抗 3K 7K 100 54 擺率 最大值 30V s N A N A 接收器輸入電壓范圍 15V 10V 10V 7V 12V 接收器輸入門限 3V 200mV 200mV 接收器輸入電阻 3K 7K 4K 最小 12K 驅(qū)動器共模電壓 3V 3V 1V 3V 接收器共模電壓 7V 7V 7V 12V 表 1 三 RS 422 與 RS 485 串行接口標(biāo)準(zhǔn) 1 平衡傳輸 RS 422 RS 485 與 RS 232 不一樣 數(shù)據(jù)信號采用差分傳輸方式 也稱作平衡傳輸 它使用一對雙絞線 將其中一線定義為 A 另一線定義為 B 如圖 2 圖 2 通常情況下 發(fā)送驅(qū)動器 A B 之間的正電平在 2 6V 是一個邏輯狀態(tài) 負(fù)電平 在 2 6V 是另一個邏輯狀態(tài) 另有一個信號地 C 在 RS 485 中還有一 使能 端 而在 RS 422 中這是可用可不用的 使能 端是用于控制發(fā)送驅(qū)動器與傳輸線的切斷與連接 當(dāng) 使能 端起作用時 發(fā)送驅(qū)動器處于高阻狀態(tài) 稱作 第三態(tài) 即它是有別于邏輯 1 與 0 的第三態(tài) 接收器也作與發(fā)送端相對的規(guī)定 收 發(fā)端通過平衡雙絞線將 AA 與 BB 對應(yīng)相連 當(dāng)在收端 AB 之間有大于 200mV 的電平時 輸出正邏輯電平 小于 200mV 時 輸出負(fù)邏 輯電平 接收器接收平衡線上的電平范圍通常在 200mV 至 6V 之間 參見圖 3 圖 3 2 RS 422 電氣規(guī)定 RS 422 標(biāo)準(zhǔn)全稱是 平衡電壓數(shù)字接口電路的電氣特性 它定義了接口電路的特性 圖 5 是典型的 RS 422 四線接口 實際上還有一根信號地線 共 5 根線 圖 4 是其 DB9 連 接器引腳定義 由于接收器采用高輸入阻抗和發(fā)送驅(qū)動器比 RS232 更強的驅(qū)動能力 故允 許在相同傳輸線上連接多個接收節(jié)點 最多可接 10 個節(jié)點 即一個主設(shè)備 Master 其 余為從設(shè)備 Salve 從設(shè)備之間不能通信 所以 RS 422 支持點對多的雙向通信 接收 器輸入阻抗為 4k 故發(fā)端最大負(fù)載能力是 10 4k 100 終接電阻 RS 422 四線接口由 于采用單獨的發(fā)送和接收通道 因此不必控制數(shù)據(jù)方向 各裝置之間任何必須的信號交換 均可以按軟件方式 XON XOFF 握手 或硬件方式 一對單獨的雙絞線 圖 4 圖 5 RS 422 的最大傳輸距離為 4000 英尺 約 1219 米 最大傳輸速率為 10Mb s 其平 衡雙絞線的長度與傳輸速率成反比 在 100kb s 速率以下 才可能達(dá)到最大傳輸距離 只 有在很短的距離下才能獲得最高速率傳輸 一般 100 米長的雙絞線上所能獲得的最大傳輸 速率僅為 1Mb s RS 422 需要一終接電阻 要求其阻值約等于傳輸電纜的特性阻抗 在矩距離傳輸時 可不需終接電阻 即一般在 300 米以下不需終接電阻 終接電阻接在傳輸電纜的最遠(yuǎn)端 RS 422 有關(guān)電氣參數(shù)見表 1 3 RS 485 電氣規(guī)定 由于 RS 485 是從 RS 422 基礎(chǔ)上發(fā)展而來的 所以 RS 485 許多電氣規(guī)定與 RS 422 相仿 如都采用平衡傳輸方式 都需要在傳輸線上接終接電阻等 RS 485 可以采用二線與 四線方式 二線制可實現(xiàn)真正的多點雙向通信 參見圖 6 而采用四線連接時 與 RS 422 一樣只能實現(xiàn)點對多的通信 即只能有一個主 Master 設(shè)備 其余為從設(shè)備 但它比 RS 422 有改進(jìn) 無論四線還是二線連接方式總 線上可多接到 32 個設(shè)備 參見圖 7 圖 6 圖 7 RS 485 與 RS 422 的不同還在于其共模輸出電壓是不同的 RS 485 是 7V 至 12V 之 間 而 RS 422 在 7V 至 7V 之間 RS 485 接收器最小輸入阻抗為 12k 劍 鳵 S 422 是 4k 健 舊峽梢運礡 S 485 滿足所有 RS 422 的規(guī)范 所以 RS 485 的驅(qū)動器可以用在 RS 422 網(wǎng)絡(luò)中應(yīng)用 RS 485 有關(guān)電氣規(guī)定參見表 1 RS 485 與 RS 422 一樣 其最大傳輸距離約為 1219 米 最大傳輸速率為 10Mb s 平 衡雙絞線的長度與傳輸速率成反比 在 100kb s 速率以下 才可能使用規(guī)定最長的電纜長 度 只有在很短的距離下才能獲得最高速率傳輸 一般 100 米長雙絞線最大傳輸速率僅為 1Mb s RS 485 需要 2 個終接電阻 其阻值要求等于傳輸電纜的特性阻抗 在矩距離傳輸時可 不需終接電阻 即一般在 300 米以下不需終接電阻 終接電阻接在傳輸總線的兩端 四 RS 422 與 RS 485 的網(wǎng)絡(luò)安裝注意要點 RS 422 可支持 10 個節(jié)點 RS 485 支持 32 個節(jié)點 因此多節(jié)點構(gòu)成網(wǎng)絡(luò) 網(wǎng)絡(luò)拓?fù)?一般采用終端匹配的總線型結(jié)構(gòu) 不支持環(huán)形或星形網(wǎng)絡(luò) 在構(gòu)建網(wǎng)絡(luò)時 應(yīng)注意如下幾 點 1 采用一條雙絞線電纜作總線 將各個節(jié)點串接起來 從總線到每個節(jié)點的引出線 長度應(yīng)盡量短 以便使引出線中的反射信號對總線信號的影響最低 圖 8 所示為實際應(yīng)用 中常見的一些錯誤連接方式 a c e 和正確的連接方式 b d f a c e 這三種網(wǎng) 絡(luò)連接盡管不正確 在短距離 低速率仍可能正常工作 但隨著通信距離的延長或通信速 率的提高 其不良影響會越來越嚴(yán)重 主要原因是信號在各支路末端反射后與原信號疊加 會造成信號質(zhì)量下降 2 應(yīng)注意總線特性阻抗的連續(xù)性 在阻抗不連續(xù)點就會發(fā)生信號的反射 下列幾種 情況易產(chǎn)生這種不連續(xù)性 總線的不同區(qū)段采用了不同電纜 或某一段總線上有過多收發(fā) 器緊靠在一起安裝 再者是過長的分支線引出到總線 總之 應(yīng)該提供一條單一 連續(xù)的信號通道作為總線 圖 8 五 RS 422 與 RS 485 傳輸線上匹配的一些說明 對 RS 422 與 RS 485 總線網(wǎng)絡(luò)一般要使用終接電阻進(jìn)行匹配 但在短距離與低速率 下可以不用考慮終端匹配 那么在什么情況下不用考慮匹配呢 理論上 在每個接收數(shù)據(jù) 信號的中點進(jìn)行采樣時 只要反射信號在開始采樣時衰減到足夠低就可以不考慮匹配 但 這在實際上難以掌握 美國 MAXIM 公司有篇文章提到一條經(jīng)驗性的原則可以用來判斷在 什么樣的數(shù)據(jù)速率和電纜長度時需要進(jìn)行匹配 當(dāng)信號的轉(zhuǎn)換時間 上升或下降時間 超 過電信號沿總線單向傳輸所需時間的 3 倍以上時就可以不加匹配 例如具有限斜率特性的 RS 485 接口 MAX483 輸出信號的上升或下降時間最小為 250ns 典型雙絞線上的信號傳輸 速率約為 0 2m ns 24AWG PVC 電纜 那么只要數(shù)據(jù)速率在 250kb s 以內(nèi) 電纜長度不 超過 16 米 采用 MAX483 作為 RS 485 接口時就可以不加終端匹配 一般終端匹配采用終接電阻方法 前文已有提及 RS 422 在總線電纜的遠(yuǎn)端并接電 阻 RS 485 則應(yīng)在總線電纜的開始和末端都需并接終接電阻 終接電阻一般在 RS 422 網(wǎng) 絡(luò)中取 100 在 RS 485 網(wǎng)絡(luò)中取 120 相當(dāng)于電纜特性阻抗的電阻 因為大多數(shù)雙絞線 電纜特性阻抗大約在 100 120 這種匹配方法簡單有效 但有一個缺點 匹配電阻要消 耗較大功率 對于功耗限制比較嚴(yán)格的系統(tǒng)不太適合 另外一種比較省電的匹配方式是 RC 匹配 如圖 9 利用一只電容 C 隔斷直流成分可 以節(jié)省大部分功率 但電容 C 的取值是個難點 需要在功耗和匹配質(zhì)量間進(jìn)行折衷 還有一種采用二極管的匹配方法 如圖 10 這種方案雖未實現(xiàn)真正的 匹配 但它 利用二極管的鉗位作用能迅速削弱反射信號 達(dá)到改善信號質(zhì)量的目的 節(jié)能效果顯著 圖 9 圖 10 六 RS 422 與 RS 485 的接地問題 電子系統(tǒng)接地是很重要的 但常常被忽視 接地處理不當(dāng)往往會導(dǎo)致電子系統(tǒng)不能 穩(wěn)定工作甚至危及系統(tǒng)安全 RS 422 與 RS 485 傳輸網(wǎng)絡(luò)的接地同樣也是很重要的 因為 接地系統(tǒng)不合理會影響整個網(wǎng)絡(luò)的穩(wěn)定性 尤其是在工作環(huán)境比較惡劣和傳輸距離較遠(yuǎn)的 情況下 對于接地的要求更為嚴(yán)格 否則接口損壞率較高 很多情況下 連接 RS 422 RS 485 通信鏈路時只是簡單地用一對雙絞線將各個接口的 A B 端連接起來 而 忽略了信號地的連接 這種連接方法在許多場合是能正常工作的 但卻埋下了很大的隱患 這有下面二個原因 1 共模干擾問題 正如前文已述 RS 422 與 RS 485 接口均采用差分方式傳輸信號方 式 并不需要相對于某個參照點來檢測信號 系統(tǒng)只需檢測兩線之間的電位差就可以了 但人們往往忽視了收發(fā)器有一定的共模電壓范圍 如 RS 422 共模電壓范圍為 7 7V 而 RS 485 收發(fā)器共模電壓范圍為 7 12V 只有滿足上述條件 整個網(wǎng)絡(luò)才能正常工作 當(dāng) 網(wǎng)絡(luò)線路中共模電壓超出此范圍時就會影響通信的穩(wěn)定可靠 甚至損壞接口 以圖 11 為例 當(dāng)發(fā)送驅(qū)動器 A 向接收器 B 發(fā)送數(shù)據(jù)時 發(fā)送驅(qū)動器 A 的輸出共模電壓為 VOS 由于兩 個系統(tǒng)具有各自獨立的接地系統(tǒng) 存在著地電位差 VGPD 那么 接收器輸入端的共模電 壓 VCM 就會達(dá)到 VCM VOS VGPD RS 422 與 RS 485 標(biāo)準(zhǔn)均規(guī)定 VOS 3V 但 VGPD 可能會有很大幅度 十幾伏甚至數(shù)十伏 并可能伴有強干擾信號 致使接收器共模輸入 VCM 超出正常范圍 并在傳輸線路上產(chǎn)生干擾電流 輕則影響正常通信 重則損壞通信接 口電路 圖 11 2 EMI 問題 發(fā)送驅(qū)動器輸出信號中的共模部分需要一個返回通路 如沒有一 個低阻的返回通道 信號地 就會以輻射的形式返回源端 整個總線就會像一個巨大的 天線向外輻射電磁波 由于上述原因 RS 422 RS 485 盡管采用差分平衡傳輸方式 但對整個 RS 422 或 RS 485 網(wǎng)絡(luò) 必須有一條低阻的信號地 一條低阻的信號地將兩個接口的工作地連接起來 使共模干擾電壓 VGPD 被短路 這條信號地可以是額外的一條線 非屏蔽雙絞線 或者 是屏蔽雙絞線的屏蔽層 這是最通常的接地方法 值得注意的是 這種做法僅對高阻型共模干擾有效 由于干擾源內(nèi)阻大 短接后不 會形成很大的接地環(huán)路電流 對于通信不會有很大影響 當(dāng)共模干擾源內(nèi)阻較低時 會在 接地線上形成較大的環(huán)路電流 影響正常通信 筆者認(rèn)為 可以采取以下三種措施 1 如果干擾源內(nèi)阻不是非常小 可以在接地線上加限流電阻以限制干擾電流 接地電阻的增加可能會使共模電壓升高 但只要控制在適當(dāng)?shù)姆秶鷥?nèi)就不會影響正常通信 2 采用浮地技術(shù) 隔斷接地環(huán)路 這是較常用也是十分有效的一種方法 當(dāng)共 模干擾內(nèi)阻很小時上述方法已不能奏效 此時可以考慮將引入干擾的節(jié)點 例如處于惡劣 的工作環(huán)境的現(xiàn)場設(shè)備 浮置起來 也就是系統(tǒng)的電路地與機殼或大地隔離 這樣就隔 斷了接地環(huán)路 不會形成很大的環(huán)路電流 3 采用隔離接口 有些情況下 出于安全或其它方面的考慮 電路地必須與機 殼或大地相連 不能懸浮 這時可以采用隔離接口來隔斷接地回路 但是仍然應(yīng)該有一條 地線將隔離側(cè)的公共端與其它接口的工作地相連 參見圖 12 圖 12 七 RS 422 與 RS 485 的網(wǎng)絡(luò)失效保護(hù) RS 422 與 RS 485 標(biāo)準(zhǔn)都規(guī)定了接收器門限為 200mV 這樣規(guī)定能夠提供比較高的 噪聲抑制能力 如前文所述 當(dāng)接收器 A 電平比 B 電平高 200mV 以上時 輸出為正邏輯 反之 則輸出為負(fù)邏輯 但由于第三態(tài)的存在 即在主機在發(fā)端發(fā)完一個信息數(shù)據(jù)后 將 總線置于第三態(tài) 即總線空閑時沒有任何信號驅(qū)動總線 使 AB 之間的電壓在 200 200mV 直至趨于 0V 這帶來了一個問題 接收器輸出狀態(tài)不確定 如果接收機的 輸出為 0V 網(wǎng)絡(luò)中從機將把其解釋為一個新的啟動位 并試圖讀取后續(xù)字節(jié) 由于永遠(yuǎn)不 會有停止位 產(chǎn)生一個幀錯誤結(jié)果 不再有設(shè)備請求總線 網(wǎng)絡(luò)陷于癱瘓狀態(tài) 除上述所 述的總線空閑會造成兩線電壓差低于 200mV 的情況外 開路或短路時也會出現(xiàn)這種情況 故應(yīng)采取一定的措施避免接收器處于不確定狀態(tài) 圖 13 通常是在總線上加偏置 當(dāng)總線空閑或開路時 利用偏置電阻將總線偏置在一個確 定的狀態(tài) 差分電壓 200mV 如圖 13 將 A 上拉到地 B 下拉到 5V 電阻的典型值 是 1k 具體數(shù)值隨電纜的電容變化而變化 上述方法是比較經(jīng)典的方法 但它仍然不能解決總線短路時的問題 有些廠家將接 收門限移到 200mV 50mV 可解決這個問題 例如 Maxim 公司的 MAX3080 系列 RS 485 接口 不僅省去了外部偏置電阻 而且解決了總線短路情況下的失效保護(hù)問題 八 RS 422 與 RS 485 的瞬態(tài)保護(hù) 前文提到的信號接地措施 只對低頻率的共模干擾有保護(hù)作用 對于頻率很高的瞬 態(tài)干擾就無能為力了 由于傳輸線對高頻信號而言就是相當(dāng)于電感 因此對于高頻瞬態(tài)干 擾 接地線實際等同于開路 這樣的瞬態(tài)干擾雖然持續(xù)時間短暫 但可能會有成百上千伏 的電壓 實際應(yīng)用環(huán)境下還是存在高頻瞬態(tài)干擾的可能 一般在切換大功率感性負(fù)載如電機 變壓器 繼電器等或閃電過程中都會產(chǎn)生幅度很高的瞬態(tài)干擾 如果不加以適當(dāng)防護(hù)就會 損壞 RS 422 或 RS 485 通信接口 對于這種瞬態(tài)干擾可以采用隔離或旁路的方法加以防護(hù) 1 隔離保護(hù)方法 這種方案實際上將瞬態(tài)高壓轉(zhuǎn)移到隔離接口中的電隔離層上 由 于隔離層的高絕緣電阻 不會產(chǎn)生損害性的浪涌電流 起到保護(hù)接口的作用 通常采用高 頻變壓器 光耦等元件實現(xiàn)接口的電氣隔離 已有器件廠商將所有這些元件集成在一片 IC 中 使用起來非常簡便 如 Maxim 公司的 MAX1480 MAX1490 隔離電壓可達(dá) 2500V 這種方案的優(yōu)點是可以承受高電壓 持續(xù)時間較長的瞬態(tài)干擾 實現(xiàn)起來也比較容易 缺 點是成本較高 2 旁路保護(hù)方法 這種方案利用瞬態(tài)抑制元件 如 TVS MOV 氣體放電管等 將危害性的瞬態(tài)能量旁路到大地 優(yōu)點是成本較低 缺點是保護(hù)能力有限 只能保護(hù)一定 能量以內(nèi)的瞬態(tài)干擾 持續(xù)時間不能很長 而且需要有一條良好的連接大地的通道 實現(xiàn) 起來比較困難 實際應(yīng)用中是將上述兩種方案結(jié)合起來靈活加以運用 如圖 14 在這種方 法中 隔離接口對大幅度瞬態(tài)干擾進(jìn)行隔離 旁路元件則保護(hù)隔離接口不被過高的瞬態(tài)電 壓擊穿 MODBUS 通訊協(xié)議及編程 ModBus 通訊協(xié)議分為 RTU 協(xié)議和 ASCII 協(xié)議 我公司的多種儀表都采用 ModBus RTU 通訊協(xié)議 如 CH2000 智能電力監(jiān)測儀 CH2000M 電力參數(shù)采集模塊 巡檢表 數(shù) 顯表 光柱數(shù)顯表等 下面就 ModBus RTU 協(xié)議簡要介紹如下 一 通訊協(xié)議 一 通訊傳送方式 通訊傳送分為獨立的信息頭 和發(fā)送的編碼數(shù)據(jù) 以下的通訊傳送方式定義也與 MODBUS RTU 通訊規(guī)約相兼容 編 碼 8 位二進(jìn)制 起始位 1 位 數(shù)據(jù)位 8 位 奇偶校驗位 1 位 偶校驗位 停止位 1 位 錯誤校檢 CRC 冗余循環(huán)碼 初始結(jié)構(gòu) 4 字節(jié)的時間 地址碼 1 字節(jié) 功能碼 1 字節(jié) 數(shù)據(jù)區(qū) N 字節(jié) 錯誤校檢 16 位 CRC 碼 結(jié)束結(jié)構(gòu) 4 字節(jié)的時間 地址碼 地址碼為通訊傳送的第一個字節(jié) 這個字節(jié)表明由用戶設(shè)定地址碼的從機將 接收由主機發(fā)送來的信息 并且每個從機都有具有唯一的地址碼 并且響應(yīng)回送均以各自 的地址碼開始 主機發(fā)送的地址碼表明將發(fā)送到的從機地址 而從機發(fā)送的地址碼表明回 送的從機地址 功能碼 通訊傳送的第二個字節(jié) ModBus 通訊規(guī)約定義功能號為 1 到 127 本儀表只 利用其中的一部分功能碼 作為主機請求發(fā)送 通過功能碼告訴從機執(zhí)行什么動作 作為 從機響應(yīng) 從機發(fā)送的功能碼與從主機發(fā)送來的功能碼一樣 并表明從機已響應(yīng)主機進(jìn)行 操作 如果從機發(fā)送的功能碼的最高位為 比如功能碼大與此同時 127 則表明從機沒有 響應(yīng)操作或發(fā)送出錯 數(shù)據(jù)區(qū) 數(shù)據(jù)區(qū)是根據(jù)不同的功能碼而不同 數(shù)據(jù)區(qū)可以是實際數(shù)值 設(shè)置點 主機 發(fā)送給從機或從機發(fā)送給主機的地址 CRC 碼 二字節(jié)的錯誤檢測碼 二 通訊規(guī)約 當(dāng)通訊命令發(fā)送至儀器時 符合相應(yīng)地址碼的設(shè)備接通訊命令 并除去地址碼 讀取 信息 如果沒有出錯 則執(zhí)行相應(yīng)的任務(wù) 然后把執(zhí)行結(jié)果返送給發(fā)送者 返送的信息中 包括地址碼 執(zhí)行動作的功能碼 執(zhí)行動作后結(jié)果的數(shù)據(jù)以及錯誤校驗碼 如果出錯就不 發(fā)送任何信息 1 信息幀結(jié)構(gòu) 地址碼 功能碼 數(shù)據(jù)區(qū) 錯誤校驗碼 8 位 8 位 N 8 位 16 位 地址碼 地址碼是信息幀的第一字節(jié) 8 位 從 0 到 255 這個字節(jié)表明由用戶設(shè)置地 址的從機將接收由主機發(fā)送來的信息 每個從機都必須有唯一的地址碼 并且只有符合地 址碼的從機才能響應(yīng)回送 當(dāng)從機回送信息時 相當(dāng)?shù)牡刂反a表明該信息來自于何處 功能碼 主機發(fā)送的功能碼告訴從機執(zhí)行什么任務(wù) 表 1 1 列出的功能碼都有具體的 含義及操作 代碼 含義 操作 03 讀取數(shù)據(jù) 讀取當(dāng)前寄存器內(nèi)一個或多個二進(jìn)制值 06 重置單一寄存器 把設(shè)置的二進(jìn)制值寫入單一寄存器 數(shù)據(jù)區(qū) 數(shù)據(jù)區(qū)包含需要從機執(zhí)行什么動作或由從機采集的返送信息 這些信息可以 是數(shù)值 參考地址等等 例如 功能碼告訴從機讀取寄存器的值 則數(shù)據(jù)區(qū)必需包含要讀 取寄存器的起始地址及讀取長度 對于不同的從機 地址和數(shù)據(jù)信息都不相同 錯誤校驗碼 主機或從機可用校驗碼進(jìn)行判別接收信息是否出錯 有時 由于電子噪 聲或其它一些干擾 信息在傳輸過程中會發(fā)生細(xì)微的變化 錯誤校驗碼保證了主機或從機 對在傳送過程中出錯的信息不起作用 這樣增加了系統(tǒng)的安全和效率 錯誤校驗采用 CRC 16 校驗方法 注 信息幀的格式都基本相同 地址碼 功能碼 數(shù)據(jù)區(qū)和錯誤校驗碼 2 錯誤校驗 冗余循環(huán)碼 CRC 包含 2 個字節(jié) 即 16 位二進(jìn)制 CRC 碼由發(fā)送設(shè)備計算 放置 于發(fā)送信息的尾部 接收信息的設(shè)備再重新計算接收到信息的 CRC 碼 比較計算得到的 CRC 碼是否與接收到的相符 如果兩者不相符 則表明出錯 CRC 碼的計算方法是 先預(yù)置 16 位寄存器全為 1 再逐步把每 8 位數(shù)據(jù)信息進(jìn)行處理 在進(jìn)行 CRC 碼計算時只用 8 位數(shù)據(jù)位 起始位及停止位 如有奇偶校驗位的話也包括奇偶 校驗位 都不參與 CRC 碼計算 在計算 CRC 碼時 8 位數(shù)據(jù)與寄存器的數(shù)據(jù)相異或 得到的結(jié)果向低位移一字節(jié) 用 0 填補最高位 再檢查最低位 如果最低位為 1 把寄存器的內(nèi)容與預(yù)置數(shù)相異或 如 果最低位為 0 不進(jìn)行異或運算 這個過程一直重復(fù) 8 次 第 8 次移位后 下一個 8 位再與現(xiàn)在寄存器的內(nèi)容相相異或 這個過程與以上一樣重復(fù) 8 次 當(dāng)所有的數(shù)據(jù)信息處理完后 最后寄存器的內(nèi)容即為 CRC 碼值 CRC 碼中的數(shù)據(jù)發(fā)送 接收時低字節(jié)在前 計算 CRC 碼的步驟為 預(yù)置 16 位寄存器為十六進(jìn)制 FFFF 即全為 1 稱此寄存器為 CRC 寄存器 把第一個 8 位數(shù)據(jù)與 16 位 CRC 寄存器的低位相異或 把結(jié)果放于 CRC 寄存器 把寄存器的內(nèi)容右移一位 朝低位 用 0 填補最高位 檢查最低位 如果最低位為 0 重復(fù)第 3 步 再次移位 如果最低位為 1 CRC 寄存器與多項式 A001 1010 0000 0000 0001 進(jìn)行異或 重復(fù)步驟 3 和 4 直到右移 8 次 這樣整個 8 位數(shù)據(jù)全部進(jìn)行了處理 重復(fù)步驟 2 到步驟 5 進(jìn)行下一個 8 位數(shù)據(jù)的處理 最后得到的 CRC 寄存器即為 CRC 碼 3 功能碼 03 讀取點和返回值 儀表采用 Modbus RTU 通訊規(guī)約 利用通訊命令 可以進(jìn)行讀取點 保持寄存器 或 返回值 輸入寄存器 的操作 保持和輸入寄存器都是 16 位 2 字節(jié) 值 并且高位在前 這樣用于儀表的讀取點和返回值都是 2 字節(jié) 一次最多可讀取寄存器數(shù)是 60 由于一些可 編程控制器不用功能碼 03 所以功能碼 03 被用作讀取點和返回值 從機響應(yīng)的命令格式 是從機地址 功能碼 數(shù)據(jù)區(qū)及 CRC 碼 數(shù)據(jù)區(qū)中的寄存器數(shù)據(jù)都是每兩個字節(jié)高字節(jié)在 前 4 功能碼 06 單點保存 主機利用這條命令把單點數(shù)據(jù)保存到儀表的存儲器 從機也用這個功能碼向主機返送 信息 二 編程舉例 下面是一個用 VC 編寫的 ModBus RTU 通訊的例子 一 通訊口設(shè)置 DCB dcb hCom CreateFile COM1 GENERIC READ GENERIC WRITE 0 NULL OPEN EXISTING 0 NULL if hCom INVALID HANDLE VALUE MessageBox createfile error error BOOL error SetupComm hCom 1024 1024 if error MessageBox setupcomm error error GetCommState hCom if error MessageBox- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
15 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- Modbus 通信協(xié)議 教程
鏈接地址:http://www.820124.com/p-9290230.html