Modbus通信協(xié)議教程
《Modbus通信協(xié)議教程》由會(huì)員分享,可在線閱讀,更多相關(guān)《Modbus通信協(xié)議教程(41頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
Modbus 通信協(xié)議 一 Modbus 協(xié)議簡(jiǎn)介 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é)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu) 而不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通 信的 它描述了一控制器請(qǐng)求訪問其它設(shè)備的過程 如果回應(yīng)來自其它設(shè)備的請(qǐng)求 以及 怎樣偵測(cè)錯(cuò)誤并記錄 它制定了消息域格局和內(nèi)容的公共格式 當(dāng)在一 Modbus 網(wǎng)絡(luò)上通信時(shí) 此協(xié)議決定了每個(gè)控制器須要知道它們的設(shè)備地址 識(shí)別按地址發(fā)來的消息 決定要產(chǎn)生何種行動(dòng) 如果需要回應(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é)地址 路由路徑及錯(cuò)誤檢測(cè)的方 法 1 在 Modbus 網(wǎng)絡(luò)上轉(zhuǎn)輸 標(biāo)準(zhǔn)的 Modbus 口是使用一 RS 232C 兼容串行接口 它定義了連接口的針腳 電纜 信號(hào)位 傳輸波特率 奇偶校驗(yàn) 控制器能直接或經(jīng)由 Modem 組網(wǎng) 控制器通信使用主 從技術(shù) 即僅一設(shè)備 主設(shè)備 能初始化傳輸 查詢 其它 設(shè)備 從設(shè)備 根據(jù)主設(shè)備查詢提供的數(shù)據(jù)作出相應(yīng)反應(yīng) 典型的主設(shè)備 主機(jī)和可編程 儀表 典型的從設(shè)備 可編程控制器 主設(shè)備可單獨(dú)和從設(shè)備通信 也能以廣播方式和所有從設(shè)備通信 如果單獨(dú)通信 從設(shè)備返回一消息作為回應(yīng) 如果是以廣播方式查詢的 則不作任何回應(yīng) Modbus 協(xié)議建 立了主設(shè)備查詢的格式 設(shè)備 或廣播 地址 功能代碼 所有要發(fā)送的數(shù)據(jù) 一錯(cuò)誤檢 測(cè)域 從設(shè)備回應(yīng)消息也由 Modbus 協(xié)議構(gòu)成 包括確認(rèn)要行動(dòng)的域 任何要返回的數(shù)據(jù) 和一錯(cuò)誤檢測(cè)域 如果在消息接收過程中發(fā)生一錯(cuò)誤 或從設(shè)備不能執(zhí)行其命令 從設(shè)備 將建立一錯(cuò)誤消息并把它作為回應(yīng)發(fā)送出去 2 在其它類型網(wǎng)絡(luò)上轉(zhuǎn)輸 在其它網(wǎng)絡(luò)上 控制器使用對(duì)等技術(shù)通信 故任何控制都能初始和其它控制器的通 信 這樣在單獨(dú)的通信過程中 控制器既可作為主設(shè)備也可作為從設(shè)備 提供的多個(gè)內(nèi)部 通道可允許同時(shí)發(fā)生的傳輸進(jìn)程 在消息位 Modbus 協(xié)議仍提供了主 從原則 盡管網(wǎng)絡(luò)通信方法是 對(duì)等 如果一 控制器發(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ù)量 錯(cuò)誤 檢測(cè)域?yàn)閺脑O(shè)備提供了一種驗(yàn)證消息內(nèi)容是否正確的方法 2 回應(yīng) 如果從設(shè)備產(chǎn)生一正常的回應(yīng) 在回應(yīng)消息中的功能代碼是在查詢消息中的功能代 碼的回應(yīng) 數(shù)據(jù)段包括了從設(shè)備收集的數(shù)據(jù) 象寄存器值或狀態(tài) 如果有錯(cuò)誤發(fā)生 功能 代碼將被修改以用于指出回應(yīng)消息是錯(cuò)誤的 同時(shí)數(shù)據(jù)段包含了描述此錯(cuò)誤信息的代碼 錯(cuò)誤檢測(cè)域允許主設(shè)備確認(rèn)消息內(nèi)容是否可用 二 兩種傳輸方式 控制器能設(shè)置為兩種傳輸模式 ASCII 或 RTU 中的任何一種在標(biāo)準(zhǔn)的 Modbus 網(wǎng) 絡(luò)通信 用戶選擇想要的模式 包括串口通信參數(shù) 波特率 校驗(yàn)方式等 在配置每個(gè) 控制器的時(shí)候 在一個(gè) 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)信息交換代碼 模式通信 在消 息中的每個(gè) 8Bit 字節(jié)都作為兩個(gè) ASCII 字符發(fā)送 這種方式的主要優(yōu)點(diǎn)是字符發(fā)送的時(shí)間 間隔可達(dá)到 1 秒而不產(chǎn)生錯(cuò)誤 代碼系統(tǒng) 十六進(jìn)制 ASCII 字符 0 9 A F 消息中的每個(gè) ASCII 字符都是一個(gè)十六進(jìn)制字符組成 每個(gè)字節(jié)的位 1 個(gè)起始位 7 個(gè)數(shù)據(jù)位 最小的有效位先發(fā)送 1 個(gè)奇偶校驗(yàn)位 無校驗(yàn)則無 1 個(gè)停止位 有校驗(yàn)時(shí) 2 個(gè) Bit 無校驗(yàn)時(shí) 錯(cuò)誤檢測(cè)域 LRC 縱向冗長(zhǎng)檢測(cè) 2 RTU 模式 當(dāng)控制器設(shè)為在 Modbus 網(wǎng)絡(luò)上以 RTU 遠(yuǎn)程終端單元 模式通信 在消息中的每 個(gè) 8Bit 字節(jié)包含兩個(gè) 4Bit 的十六進(jìn)制字符 這種方式的主要優(yōu)點(diǎn)是 在同樣的波特率下 可比 ASCII 方式傳送更多的數(shù)據(jù) 代碼系統(tǒng) 8 位二進(jìn)制 十六進(jìn)制數(shù) 0 9 A F 消息中的每個(gè) 8 位域都是一個(gè)兩個(gè)十六進(jìn)制字符組成 每個(gè)字節(jié)的位 1 個(gè)起始位 8 個(gè)數(shù)據(jù)位 最小的有效位先發(fā)送 1 個(gè)奇偶校驗(yàn)位 無校驗(yàn)則無 1 個(gè)停止位 有校驗(yàn)時(shí) 2 個(gè) Bit 無校驗(yàn)時(shí) 錯(cuò)誤檢測(cè)域 CRC 循環(huán)冗長(zhǎng)檢測(cè) 三 Modbus 消息幀 兩種傳輸模式中 ASCII 或 RTU 傳輸設(shè)備以將 Modbus 消息轉(zhuǎn)為有起點(diǎn)和終點(diǎn) 的幀 這就允許接收的設(shè)備在消息起始處開始工作 讀地址分配信息 判斷哪一個(gè)設(shè)備被 選中 廣播方式則傳給所有設(shè)備 判知何時(shí)信息已完成 部分的消息也能偵測(cè)到并且錯(cuò) 誤能設(shè)置為返回結(jié)果 1 ASCII 幀 使用 ASCII 模式 消息以冒號(hào) 字符 ASCII 碼 3AH 開始 以回車換行符結(jié)束 ASCII 碼 0DH 0AH 其它域可以使用的傳輸字符是十六進(jìn)制的 0 9 A F 網(wǎng)絡(luò)上的設(shè)備不斷偵測(cè) 字符 當(dāng)有一個(gè)冒號(hào)接收到時(shí) 每個(gè)設(shè)備都解碼下個(gè)域 地址域 來判斷是否發(fā)給自己的 消息中字符間發(fā)送的時(shí)間間隔最長(zhǎng)不能超過 1 秒 否則接收的設(shè)備將認(rèn)為傳輸錯(cuò)誤 一個(gè)典型消息幀如下所示 起始位 設(shè)備地址 功能代碼 數(shù)據(jù) LRC 校驗(yàn) 結(jié)束符 1 個(gè)字符 2 個(gè)字符 2 個(gè)字符 n 個(gè)字符 2 個(gè)字符 2 個(gè)字符 圖 2 ASCII 消息幀 2 RTU 幀 使用 RTU 模式 消息發(fā)送至少要以 3 5 個(gè)字符時(shí)間的停頓間隔開始 在網(wǎng)絡(luò)波特率 下多樣的字符時(shí)間 這是最容易實(shí)現(xiàn)的 如下圖的 T1 T2 T3 T4 所示 傳輸?shù)牡谝粋€(gè)域是 設(shè)備地址 可以使用的傳輸字符是十六進(jìn)制的 0 9 A F 網(wǎng)絡(luò)設(shè)備不斷偵測(cè)網(wǎng)絡(luò)總線 包 括停頓間隔時(shí)間內(nèi) 當(dāng)?shù)谝粋€(gè)域 地址域 接收到 每個(gè)設(shè)備都進(jìn)行解碼以判斷是否發(fā)往 自己的 在最后一個(gè)傳輸字符之后 一個(gè)至少 3 5 個(gè)字符時(shí)間的停頓標(biāo)定了消息的結(jié)束 一個(gè)新的消息可在此停頓后開始 整個(gè)消息幀必須作為一連續(xù)的流轉(zhuǎn)輸 如果在幀完成之前有超過 1 5 個(gè)字符時(shí)間的停 頓時(shí)間 接收設(shè)備將刷新不完整的消息并假定下一字節(jié)是一個(gè)新消息的地址域 同樣地 如果一個(gè)新消息在小于 3 5 個(gè)字符時(shí)間內(nèi)接著前個(gè)消息開始 接收的設(shè)備將認(rèn)為它是前一 消息的延續(xù) 這將導(dǎo)致一個(gè)錯(cuò)誤 因?yàn)樵谧詈蟮?CRC 域的值不可能是正確的 一典型的消 息幀如下所示 起始位 設(shè)備地址 功能代碼 數(shù)據(jù) CRC 校驗(yàn) 結(jié)束符 T1 T2 T3 T4 8Bit 8Bit n 個(gè) 8Bit 16Bit T1 T2 T3 T4 圖 3 RTU 消息幀 3 地址域 消息幀的地址域包含兩個(gè)字符 ASCII 或 8Bit RTU 可能的從設(shè)備地址是 0 247 十進(jìn)制 單個(gè)設(shè)備的地址范圍是 1 247 主設(shè)備通過將要聯(lián)絡(luò)的從設(shè)備的地址放 入消息中的地址域來選通從設(shè)備 當(dāng)從設(shè)備發(fā)送回應(yīng)消息時(shí) 它把自己的地址放入回應(yīng)的 地址域中 以便主設(shè)備知道是哪一個(gè)設(shè)備作出回應(yīng) 地址 0 是用作廣播地址 以使所有的從設(shè)備都能認(rèn)識(shí) 當(dāng) Modbus 協(xié)議用于更高水準(zhǔn) 的網(wǎng)絡(luò) 廣播可能不允許或以其它方式代替 4 如何處理功能域 消息幀中的功能代碼域包含了兩個(gè)字符 ASCII 或 8Bits RTU 可能的代碼范 圍是十進(jìn)制的 1 255 當(dāng)然 有些代碼是適用于所有控制器 有此是應(yīng)用于某種控制器 還有些保留以備后用 當(dāng)消息從主設(shè)備發(fā)往從設(shè)備時(shí) 功能代碼域?qū)⒏嬷畯脑O(shè)備需要執(zhí)行哪些行為 例如 去讀取輸入的開關(guān)狀態(tài) 讀一組寄存器的數(shù)據(jù)內(nèi)容 讀從設(shè)備的診斷狀態(tài) 允許調(diào)入 記 錄 校驗(yàn)在從設(shè)備中的程序等 當(dāng)從設(shè)備回應(yīng)時(shí) 它使用功能代碼域來指示是正?;貞?yīng) 無誤 還是有某種錯(cuò)誤發(fā)生 稱作異議回應(yīng) 對(duì)正常回應(yīng) 從設(shè)備僅回應(yīng)相應(yīng)的功能代碼 對(duì)異議回應(yīng) 從設(shè)備返 回一等同于正常代碼的代碼 但最重要的位置為邏輯 1 例如 一從主設(shè)備發(fā)往從設(shè)備的消息要求讀一組保持寄存器 將產(chǎn)生如下功能代碼 0 0 0 0 0 0 1 1 十六進(jìn)制 03H 對(duì)正?;貞?yīng) 從設(shè)備僅回應(yīng)同樣的功能代碼 對(duì)異議回應(yīng) 它返回 1 0 0 0 0 0 1 1 十六進(jìn)制 83H 除功能代碼因異議錯(cuò)誤作了修改外 從設(shè)備將一獨(dú)特的代碼放到回應(yīng)消息的數(shù)據(jù)域 中 這能告訴主設(shè)備發(fā)生了什么錯(cuò)誤 主設(shè)備應(yīng)用程序得到異議的回應(yīng)后 典型的處理過程是重發(fā)消息 或者診斷發(fā)給從 設(shè)備的消息并報(bào)告給操作員 5 數(shù)據(jù)域 數(shù)據(jù)域是由兩個(gè)十六進(jìn)制數(shù)集合構(gòu)成的 范圍 00 FF 根據(jù)網(wǎng)絡(luò)傳輸模式 這可以 是由一對(duì) ASCII 字符組成或由一 RTU 字符組成 從主設(shè)備發(fā)給從設(shè)備消息的數(shù)據(jù)域包含附加的信息 從設(shè)備必須用于進(jìn)行執(zhí)行由功 能代碼所定義的所為 這包括了象不連續(xù)的寄存器地址 要處理項(xiàng)的數(shù)目 域中實(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ù) 如果沒有錯(cuò)誤發(fā)生 從從設(shè)備返回的數(shù)據(jù)域包含請(qǐng)求的數(shù)據(jù) 如果有錯(cuò)誤發(fā)生 此 域包含一異議代碼 主設(shè)備應(yīng)用程序可以用來判斷采取下一步行動(dòng) 在某種消息中數(shù)據(jù)域可以是不存在的 0 長(zhǎng)度 例如 主設(shè)備要求從設(shè)備回應(yīng)通信 事件記錄 功能代碼 0B 十六進(jìn)制 從設(shè)備不需任何附加的信息 6 錯(cuò)誤檢測(cè)域 標(biāo)準(zhǔn)的 Modbus 網(wǎng)絡(luò)有兩種錯(cuò)誤檢測(cè)方法 錯(cuò)誤檢測(cè)域的內(nèi)容視所選的檢測(cè)方法而定 ASCII 當(dāng)選用 ASCII 模式作字符幀 錯(cuò)誤檢測(cè)域包含兩個(gè) ASCII 字符 這是使用 LRC 縱 向冗長(zhǎng)檢測(cè) 方法對(duì)消息內(nèi)容計(jì)算得出的 不包括開始的冒號(hào)符及回車換行符 LRC 字符 附加在回車換行符前面 RTU 當(dāng)選用 RTU 模式作字符幀 錯(cuò)誤檢測(cè)域包含一 16Bits 值 用兩個(gè) 8 位的字符來實(shí)現(xiàn) 錯(cuò)誤檢測(cè)域的內(nèi)容是通過對(duì)消息內(nèi)容進(jìn)行循環(huán)冗長(zhǎng)檢測(cè)方法得出的 CRC 域附加在消息的 最后 添加時(shí)先是低字節(jié)然后是高字節(jié) 故 CRC 的高位字節(jié)是發(fā)送消息的最后一個(gè)字節(jié) 7 字符的連續(xù)傳輸 當(dāng)消息在標(biāo)準(zhǔn)的 Modbus 系列網(wǎng)絡(luò)傳輸時(shí) 每個(gè)字符或字節(jié)以如下方式發(fā)送 從左到 右 最低有效位 最高有效位 使用 ASCII 字符幀時(shí) 位的序列是 有奇偶校驗(yàn) 啟始 位 1 2 3 4 5 6 7 奇偶 位 停止 位 無奇偶校驗(yàn) 啟始 位 1 2 3 4 5 6 7 停止 位 停止 位 圖 4 位順序 ASCII 使用 RTU 字符幀時(shí) 位的序列是 有奇偶校驗(yàn) 啟始位 1 2 3 4 5 6 7 8 奇偶位 停止位 無奇偶校驗(yàn) 啟始 位 1 2 3 4 5 6 7 8 停止位 停止 位 圖 4 位順序 RTU 四 錯(cuò)誤檢測(cè)方法 標(biāo)準(zhǔn)的 Modbus 串行網(wǎng)絡(luò)采用兩種錯(cuò)誤檢測(cè)方法 奇偶校驗(yàn)對(duì)每個(gè)字符都可用 幀檢 測(cè) LRC 或 CRC 應(yīng)用于整個(gè)消息 它們都是在消息發(fā)送前由主設(shè)備產(chǎn)生的 從設(shè)備在接 收過程中檢測(cè)每個(gè)字符和整個(gè)消息幀 用戶要給主設(shè)備配置一預(yù)先定義的超時(shí)時(shí)間間隔 這個(gè)時(shí)間間隔要足夠長(zhǎng) 以使任 何從設(shè)備都能作為正常反應(yīng) 如果從設(shè)備測(cè)到一傳輸錯(cuò)誤 消息將不會(huì)接收 也不會(huì)向主 設(shè)備作出回應(yīng) 這樣超時(shí)事件將觸發(fā)主設(shè)備來處理錯(cuò)誤 發(fā)往不存在的從設(shè)備的地址也會(huì) 產(chǎn)生超時(shí) 1 奇偶校驗(yàn) 用戶可以配置控制器是奇或偶校驗(yàn) 或無校驗(yàn) 這將決定了每個(gè)字符中的奇偶校驗(yàn) 位是如何設(shè)置的 如果指定了奇或偶校驗(yàn) 1 的位數(shù)將算到每個(gè)字符的位數(shù)中 ASCII 模式 7 個(gè)數(shù)據(jù) 位 RTU 中 8 個(gè)數(shù)據(jù)位 例如 RTU 字符幀中包含以下 8 個(gè)數(shù)據(jù)位 1 1 0 0 0 1 0 1 整個(gè) 1 的數(shù)目是 4 個(gè) 如果便用了偶校驗(yàn) 幀的奇偶校驗(yàn)位將是 0 便得整個(gè) 1 的 個(gè)數(shù)仍是 4 個(gè) 如果便用了奇校驗(yàn) 幀的奇偶校驗(yàn)位將是 1 便得整個(gè) 1 的個(gè)數(shù)是 5 個(gè) 如果沒有指定奇偶校驗(yàn)位 傳輸時(shí)就沒有校驗(yàn)位 也不進(jìn)行校驗(yàn)檢測(cè) 代替一附加 的停止位填充至要傳輸?shù)淖址麕?2 LRC 檢測(cè) 使用 ASCII 模式 消息包括了一基于 LRC 方法的錯(cuò)誤檢測(cè)域 LRC 域檢測(cè)了消息域 中除開始的冒號(hào)及結(jié)束的回車換行號(hào)外的內(nèi)容 LRC 域是一個(gè)包含一個(gè) 8 位二進(jìn)制值的字節(jié) LRC 值由傳輸設(shè)備來計(jì)算并放到消息 幀中 接收設(shè)備在接收消息的過程中計(jì)算 LRC 并將它和接收到消息中 LRC 域中的值比 較 如果兩值不等 說明有錯(cuò)誤 LRC 方法是將消息中的 8Bit 的字節(jié)連續(xù)累加 丟棄了進(jìn)位 LRC 簡(jiǎn)單函數(shù)如下 static unsigned char LRC auchMsg usDataLen unsigned char auchMsg 要進(jìn)行計(jì)算的消息 unsigned short usDataLen LRC 要處理的字節(jié)的數(shù)量 unsigned char uchLRC 0 LRC 字節(jié)初始化 while usDataLen 傳送消息 uchLRC auchMsg 累加 return unsigned char char uchLRC 3 CRC 檢測(cè) 使用 RTU 模式 消息包括了一基于 CRC 方法的錯(cuò)誤檢測(cè)域 CRC 域檢測(cè)了整個(gè)消 息的內(nèi)容 CRC 域是兩個(gè)字節(jié) 包含一 16 位的二進(jìn)制值 它由傳輸設(shè)備計(jì)算后加入到消息中 接收設(shè)備重新計(jì)算收到消息的 CRC 并與接收到的 CRC 域中的值比較 如果兩值不同 則有誤 CRC 是先調(diào)入一值是全 1 的 16 位寄存器 然后調(diào)用一過程將消息中連續(xù)的 8 位字 節(jié)各當(dāng)前寄存器中的值進(jìn)行處理 僅每個(gè)字符中的 8Bit 數(shù)據(jù)對(duì) CRC 有效 起始位和停止 位以及奇偶校驗(yàn)位均無效 CRC 產(chǎn)生過程中 每個(gè) 8 位字符都單獨(dú)和寄存器內(nèi)容相或 OR 結(jié)果向最低有效 位方向移動(dòng) 最高有效位以 0 填充 LSB 被提取出來檢測(cè) 如果 LSB 為 1 寄存器單獨(dú)和 預(yù)置的值或一下 如果 LSB 為 0 則不進(jìn)行 整個(gè)過程要重復(fù) 8 次 在最后一位 第 8 位 完成后 下一個(gè) 8 位字節(jié)又單獨(dú)和寄存器的當(dāng)前值相或 最終寄存器中的值 是消息中所 有的字節(jié)都執(zhí)行之后的 CRC 值 CRC 添加到消息中時(shí) 低字節(jié)先加入 然后高字節(jié) CRC 簡(jiǎn)單函數(shù)如下 unsigned short CRC16 puchMsg usDataLen unsigned char puchMsg 要進(jìn)行 CRC 校驗(yàn)的消息 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 計(jì)算 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é)會(huì) EIA 制訂并發(fā)布的 RS 232 在 1962 年發(fā)布 命名為 EIA 232 E 作為工業(yè)標(biāo)準(zhǔn) 以保 證不同廠家產(chǎn)品之間的兼容 RS 422 由 RS 232 發(fā)展而來 它是為彌補(bǔ) RS 232 之不足而提 出的 為改進(jìn) RS 232 通信距離短 速率低的缺點(diǎn) RS 422 定義了一種平衡通信接口 將 傳輸速率提高到 10Mb s 傳輸距離延長(zhǎng)到 4000 英尺 速率低于 100kb s 時(shí) 并允許在一 條平衡總線上連接最多 10 個(gè)接收器 RS 422 是一種單機(jī)發(fā)送 多機(jī)接收的單向 平衡傳 輸規(guī)范 被命名為 TIA EIA 422 A 標(biāo)準(zhǔn) 為擴(kuò)展應(yīng)用范圍 EIA 又于 1983 年在 RS 422 基 礎(chǔ)上制定了 RS 485 標(biāo)準(zhǔn) 增加了多點(diǎn) 雙向通信能力 即允許多個(gè)發(fā)送器連接到同一條 總線上 同時(shí)增加了發(fā)送器的驅(qū)動(dòng)能力和沖突保護(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)只對(duì)接口的電氣特性做出規(guī)定 而不涉及接插件 電纜或協(xié)議 在此基礎(chǔ)上用戶可以建立自己的高層通信協(xié)議 因此在視頻界的應(yīng)用 許多 廠家都建立了一套高層通信協(xié)議 或公開或廠家獨(dú)家使用 如錄像機(jī)廠家中的 Sony 與松 下對(duì)錄像機(jī)的 RS 422 控制協(xié)議是有差異的 視頻服務(wù)器上的控制協(xié)議則更多了 如 Louth Odetis 協(xié)議是公開的 而 ProLINK 則是基于 Profile 上的 二 RS 232 串行接口標(biāo)準(zhǔn) 目前 RS 232 是 PC 機(jī)與通信工業(yè)中應(yīng)用最廣泛的一種串行接口 RS 232 被定義為一 種在低速率串行通訊中增加通訊距離的單端標(biāo)準(zhǔn) RS 232 采取不平衡傳輸方式 即所謂單 端通訊 圖 1 收 發(fā)端的數(shù)據(jù)信號(hào)是相對(duì)于信號(hào)地 如從 DTE 設(shè)備發(fā)出的數(shù)據(jù)在使用 DB25 連接 器時(shí)是 2 腳相對(duì) 7 腳 信號(hào)地 的電平 DB25 各引腳定義參見圖 1 典型的 RS 232 信號(hào) 在正負(fù)電平之間擺動(dòng) 在發(fā)送數(shù)據(jù)時(shí) 發(fā)送端驅(qū)動(dòng)器輸出正電平在 5 15V 負(fù)電平在 5 15V 電平 當(dāng)無數(shù)據(jù)傳輸時(shí) 線上為 TTL 從開始傳送數(shù)據(jù)到結(jié)束 線上電平從 TTL 電平到 RS 232 電平再返回 TTL 電平 接收器典型的工作電平在 3 12V 與 3 12V 由 于發(fā)送電平與接收電平的差僅為 2V 至 3V 左右 所以其共模抑制能力差 再加上雙絞線上 的分布電容 其傳送距離最大為約 15 米 最高速率為 20kb s RS 232 是為點(diǎn)對(duì)點(diǎn) 即只 用一對(duì)收 發(fā)設(shè)備 通訊而設(shè)計(jì)的 其驅(qū)動(dòng)器負(fù)載為 3 7k 所以 RS 232 適合本地設(shè)備 之間的通信 其有關(guān)電氣參數(shù)參見表 1 規(guī)定 RS232 RS422 R485 工作方式 單端 差分 差分 節(jié)點(diǎn)數(shù) 1 收 1 發(fā) 1 發(fā) 10 收 1 發(fā) 32 收 最大傳輸電纜長(zhǎng)度 50 英尺 400 英尺 400 英尺 最大傳輸速率 20Kb S 10Mb s 10Mb s 最大驅(qū)動(dòng)輸出電壓 25V 0 25V 6V 7V 12V 驅(qū)動(dòng)器輸出信號(hào)電平 負(fù)載最小值 負(fù)載 5V 15V 2 0V 1 5V 驅(qū)動(dòng)器輸出信號(hào)電平 空載最大值 空載 25V 6V 6V 驅(qū)動(dòng)器負(fù)載阻抗 3K 7K 100 54 擺率 最大值 30V s N A N A 接收器輸入電壓范圍 15V 10V 10V 7V 12V 接收器輸入門限 3V 200mV 200mV 接收器輸入電阻 3K 7K 4K 最小 12K 驅(qū)動(dòng)器共模電壓 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ù)信號(hào)采用差分傳輸方式 也稱作平衡傳輸 它使用一對(duì)雙絞線 將其中一線定義為 A 另一線定義為 B 如圖 2 圖 2 通常情況下 發(fā)送驅(qū)動(dòng)器 A B 之間的正電平在 2 6V 是一個(gè)邏輯狀態(tài) 負(fù)電平 在 2 6V 是另一個(gè)邏輯狀態(tài) 另有一個(gè)信號(hào)地 C 在 RS 485 中還有一 使能 端 而在 RS 422 中這是可用可不用的 使能 端是用于控制發(fā)送驅(qū)動(dòng)器與傳輸線的切斷與連接 當(dāng) 使能 端起作用時(shí) 發(fā)送驅(qū)動(dòng)器處于高阻狀態(tài) 稱作 第三態(tài) 即它是有別于邏輯 1 與 0 的第三態(tài) 接收器也作與發(fā)送端相對(duì)的規(guī)定 收 發(fā)端通過平衡雙絞線將 AA 與 BB 對(duì)應(yīng)相連 當(dāng)在收端 AB 之間有大于 200mV 的電平時(shí) 輸出正邏輯電平 小于 200mV 時(shí) 輸出負(fù)邏 輯電平 接收器接收平衡線上的電平范圍通常在 200mV 至 6V 之間 參見圖 3 圖 3 2 RS 422 電氣規(guī)定 RS 422 標(biāo)準(zhǔn)全稱是 平衡電壓數(shù)字接口電路的電氣特性 它定義了接口電路的特性 圖 5 是典型的 RS 422 四線接口 實(shí)際上還有一根信號(hào)地線 共 5 根線 圖 4 是其 DB9 連 接器引腳定義 由于接收器采用高輸入阻抗和發(fā)送驅(qū)動(dòng)器比 RS232 更強(qiáng)的驅(qū)動(dòng)能力 故允 許在相同傳輸線上連接多個(gè)接收節(jié)點(diǎn) 最多可接 10 個(gè)節(jié)點(diǎn) 即一個(gè)主設(shè)備 Master 其 余為從設(shè)備 Salve 從設(shè)備之間不能通信 所以 RS 422 支持點(diǎn)對(duì)多的雙向通信 接收 器輸入阻抗為 4k 故發(fā)端最大負(fù)載能力是 10 4k 100 終接電阻 RS 422 四線接口由 于采用單獨(dú)的發(fā)送和接收通道 因此不必控制數(shù)據(jù)方向 各裝置之間任何必須的信號(hào)交換 均可以按軟件方式 XON XOFF 握手 或硬件方式 一對(duì)單獨(dú)的雙絞線 圖 4 圖 5 RS 422 的最大傳輸距離為 4000 英尺 約 1219 米 最大傳輸速率為 10Mb s 其平 衡雙絞線的長(zhǎng)度與傳輸速率成反比 在 100kb s 速率以下 才可能達(dá)到最大傳輸距離 只 有在很短的距離下才能獲得最高速率傳輸 一般 100 米長(zhǎng)的雙絞線上所能獲得的最大傳輸 速率僅為 1Mb s RS 422 需要一終接電阻 要求其阻值約等于傳輸電纜的特性阻抗 在矩距離傳輸時(shí) 可不需終接電阻 即一般在 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 可以采用二線與 四線方式 二線制可實(shí)現(xiàn)真正的多點(diǎn)雙向通信 參見圖 6 而采用四線連接時(shí) 與 RS 422 一樣只能實(shí)現(xiàn)點(diǎn)對(duì)多的通信 即只能有一個(gè)主 Master 設(shè)備 其余為從設(shè)備 但它比 RS 422 有改進(jìn) 無論四線還是二線連接方式總 線上可多接到 32 個(gè)設(shè)備 參見圖 7 圖 6 圖 7 RS 485 與 RS 422 的不同還在于其共模輸出電壓是不同的 RS 485 是 7V 至 12V 之 間 而 RS 422 在 7V 至 7V 之間 RS 485 接收器最小輸入阻抗為 12k 劍 鳵 S 422 是 4k 健 舊峽梢運(yùn)礡 S 485 滿足所有 RS 422 的規(guī)范 所以 RS 485 的驅(qū)動(dòng)器可以用在 RS 422 網(wǎng)絡(luò)中應(yīng)用 RS 485 有關(guān)電氣規(guī)定參見表 1 RS 485 與 RS 422 一樣 其最大傳輸距離約為 1219 米 最大傳輸速率為 10Mb s 平 衡雙絞線的長(zhǎng)度與傳輸速率成反比 在 100kb s 速率以下 才可能使用規(guī)定最長(zhǎng)的電纜長(zhǎng) 度 只有在很短的距離下才能獲得最高速率傳輸 一般 100 米長(zhǎng)雙絞線最大傳輸速率僅為 1Mb s RS 485 需要 2 個(gè)終接電阻 其阻值要求等于傳輸電纜的特性阻抗 在矩距離傳輸時(shí)可 不需終接電阻 即一般在 300 米以下不需終接電阻 終接電阻接在傳輸總線的兩端 四 RS 422 與 RS 485 的網(wǎng)絡(luò)安裝注意要點(diǎn) RS 422 可支持 10 個(gè)節(jié)點(diǎn) RS 485 支持 32 個(gè)節(jié)點(diǎn) 因此多節(jié)點(diǎn)構(gòu)成網(wǎng)絡(luò) 網(wǎng)絡(luò)拓?fù)?一般采用終端匹配的總線型結(jié)構(gòu) 不支持環(huán)形或星形網(wǎng)絡(luò) 在構(gòu)建網(wǎng)絡(luò)時(shí) 應(yīng)注意如下幾 點(diǎn) 1 采用一條雙絞線電纜作總線 將各個(gè)節(jié)點(diǎn)串接起來 從總線到每個(gè)節(jié)點(diǎn)的引出線 長(zhǎng)度應(yīng)盡量短 以便使引出線中的反射信號(hào)對(duì)總線信號(hào)的影響最低 圖 8 所示為實(shí)際應(yīng)用 中常見的一些錯(cuò)誤連接方式 a c e 和正確的連接方式 b d f a c e 這三種網(wǎng) 絡(luò)連接盡管不正確 在短距離 低速率仍可能正常工作 但隨著通信距離的延長(zhǎng)或通信速 率的提高 其不良影響會(huì)越來越嚴(yán)重 主要原因是信號(hào)在各支路末端反射后與原信號(hào)疊加 會(huì)造成信號(hào)質(zhì)量下降 2 應(yīng)注意總線特性阻抗的連續(xù)性 在阻抗不連續(xù)點(diǎn)就會(huì)發(fā)生信號(hào)的反射 下列幾種 情況易產(chǎn)生這種不連續(xù)性 總線的不同區(qū)段采用了不同電纜 或某一段總線上有過多收發(fā) 器緊靠在一起安裝 再者是過長(zhǎng)的分支線引出到總線 總之 應(yīng)該提供一條單一 連續(xù)的信號(hào)通道作為總線 圖 8 五 RS 422 與 RS 485 傳輸線上匹配的一些說明 對(duì) RS 422 與 RS 485 總線網(wǎng)絡(luò)一般要使用終接電阻進(jìn)行匹配 但在短距離與低速率 下可以不用考慮終端匹配 那么在什么情況下不用考慮匹配呢 理論上 在每個(gè)接收數(shù)據(jù) 信號(hào)的中點(diǎn)進(jìn)行采樣時(shí) 只要反射信號(hào)在開始采樣時(shí)衰減到足夠低就可以不考慮匹配 但 這在實(shí)際上難以掌握 美國 MAXIM 公司有篇文章提到一條經(jīng)驗(yàn)性的原則可以用來判斷在 什么樣的數(shù)據(jù)速率和電纜長(zhǎng)度時(shí)需要進(jìn)行匹配 當(dāng)信號(hào)的轉(zhuǎn)換時(shí)間 上升或下降時(shí)間 超 過電信號(hào)沿總線單向傳輸所需時(shí)間的 3 倍以上時(shí)就可以不加匹配 例如具有限斜率特性的 RS 485 接口 MAX483 輸出信號(hào)的上升或下降時(shí)間最小為 250ns 典型雙絞線上的信號(hào)傳輸 速率約為 0 2m ns 24AWG PVC 電纜 那么只要數(shù)據(jù)速率在 250kb s 以內(nèi) 電纜長(zhǎng)度不 超過 16 米 采用 MAX483 作為 RS 485 接口時(shí)就可以不加終端匹配 一般終端匹配采用終接電阻方法 前文已有提及 RS 422 在總線電纜的遠(yuǎn)端并接電 阻 RS 485 則應(yīng)在總線電纜的開始和末端都需并接終接電阻 終接電阻一般在 RS 422 網(wǎng) 絡(luò)中取 100 在 RS 485 網(wǎng)絡(luò)中取 120 相當(dāng)于電纜特性阻抗的電阻 因?yàn)榇蠖鄶?shù)雙絞線 電纜特性阻抗大約在 100 120 這種匹配方法簡(jiǎn)單有效 但有一個(gè)缺點(diǎn) 匹配電阻要消 耗較大功率 對(duì)于功耗限制比較嚴(yán)格的系統(tǒng)不太適合 另外一種比較省電的匹配方式是 RC 匹配 如圖 9 利用一只電容 C 隔斷直流成分可 以節(jié)省大部分功率 但電容 C 的取值是個(gè)難點(diǎn) 需要在功耗和匹配質(zhì)量間進(jìn)行折衷 還有一種采用二極管的匹配方法 如圖 10 這種方案雖未實(shí)現(xiàn)真正的 匹配 但它 利用二極管的鉗位作用能迅速削弱反射信號(hào) 達(dá)到改善信號(hào)質(zhì)量的目的 節(jié)能效果顯著 圖 9 圖 10 六 RS 422 與 RS 485 的接地問題 電子系統(tǒng)接地是很重要的 但常常被忽視 接地處理不當(dāng)往往會(huì)導(dǎo)致電子系統(tǒng)不能 穩(wěn)定工作甚至危及系統(tǒng)安全 RS 422 與 RS 485 傳輸網(wǎng)絡(luò)的接地同樣也是很重要的 因?yàn)?接地系統(tǒng)不合理會(huì)影響整個(gè)網(wǎng)絡(luò)的穩(wěn)定性 尤其是在工作環(huán)境比較惡劣和傳輸距離較遠(yuǎn)的 情況下 對(duì)于接地的要求更為嚴(yán)格 否則接口損壞率較高 很多情況下 連接 RS 422 RS 485 通信鏈路時(shí)只是簡(jiǎn)單地用一對(duì)雙絞線將各個(gè)接口的 A B 端連接起來 而 忽略了信號(hào)地的連接 這種連接方法在許多場(chǎng)合是能正常工作的 但卻埋下了很大的隱患 這有下面二個(gè)原因 1 共模干擾問題 正如前文已述 RS 422 與 RS 485 接口均采用差分方式傳輸信號(hào)方 式 并不需要相對(duì)于某個(gè)參照點(diǎn)來檢測(cè)信號(hào) 系統(tǒng)只需檢測(cè)兩線之間的電位差就可以了 但人們往往忽視了收發(fā)器有一定的共模電壓范圍 如 RS 422 共模電壓范圍為 7 7V 而 RS 485 收發(fā)器共模電壓范圍為 7 12V 只有滿足上述條件 整個(gè)網(wǎng)絡(luò)才能正常工作 當(dāng) 網(wǎng)絡(luò)線路中共模電壓超出此范圍時(shí)就會(huì)影響通信的穩(wěn)定可靠 甚至損壞接口 以圖 11 為例 當(dāng)發(fā)送驅(qū)動(dòng)器 A 向接收器 B 發(fā)送數(shù)據(jù)時(shí) 發(fā)送驅(qū)動(dòng)器 A 的輸出共模電壓為 VOS 由于兩 個(gè)系統(tǒng)具有各自獨(dú)立的接地系統(tǒng) 存在著地電位差 VGPD 那么 接收器輸入端的共模電 壓 VCM 就會(huì)達(dá)到 VCM VOS VGPD RS 422 與 RS 485 標(biāo)準(zhǔn)均規(guī)定 VOS 3V 但 VGPD 可能會(huì)有很大幅度 十幾伏甚至數(shù)十伏 并可能伴有強(qiáng)干擾信號(hào) 致使接收器共模輸入 VCM 超出正常范圍 并在傳輸線路上產(chǎn)生干擾電流 輕則影響正常通信 重則損壞通信接 口電路 圖 11 2 EMI 問題 發(fā)送驅(qū)動(dòng)器輸出信號(hào)中的共模部分需要一個(gè)返回通路 如沒有一 個(gè)低阻的返回通道 信號(hào)地 就會(huì)以輻射的形式返回源端 整個(gè)總線就會(huì)像一個(gè)巨大的 天線向外輻射電磁波 由于上述原因 RS 422 RS 485 盡管采用差分平衡傳輸方式 但對(duì)整個(gè) RS 422 或 RS 485 網(wǎng)絡(luò) 必須有一條低阻的信號(hào)地 一條低阻的信號(hào)地將兩個(gè)接口的工作地連接起來 使共模干擾電壓 VGPD 被短路 這條信號(hào)地可以是額外的一條線 非屏蔽雙絞線 或者 是屏蔽雙絞線的屏蔽層 這是最通常的接地方法 值得注意的是 這種做法僅對(duì)高阻型共模干擾有效 由于干擾源內(nèi)阻大 短接后不 會(huì)形成很大的接地環(huán)路電流 對(duì)于通信不會(huì)有很大影響 當(dāng)共模干擾源內(nèi)阻較低時(shí) 會(huì)在 接地線上形成較大的環(huán)路電流 影響正常通信 筆者認(rèn)為 可以采取以下三種措施 1 如果干擾源內(nèi)阻不是非常小 可以在接地線上加限流電阻以限制干擾電流 接地電阻的增加可能會(huì)使共模電壓升高 但只要控制在適當(dāng)?shù)姆秶鷥?nèi)就不會(huì)影響正常通信 2 采用浮地技術(shù) 隔斷接地環(huán)路 這是較常用也是十分有效的一種方法 當(dāng)共 模干擾內(nèi)阻很小時(shí)上述方法已不能奏效 此時(shí)可以考慮將引入干擾的節(jié)點(diǎn) 例如處于惡劣 的工作環(huán)境的現(xiàn)場(chǎng)設(shè)備 浮置起來 也就是系統(tǒng)的電路地與機(jī)殼或大地隔離 這樣就隔 斷了接地環(huán)路 不會(huì)形成很大的環(huán)路電流 3 采用隔離接口 有些情況下 出于安全或其它方面的考慮 電路地必須與機(jī) 殼或大地相連 不能懸浮 這時(shí)可以采用隔離接口來隔斷接地回路 但是仍然應(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 以上時(shí) 輸出為正邏輯 反之 則輸出為負(fù)邏輯 但由于第三態(tài)的存在 即在主機(jī)在發(fā)端發(fā)完一個(gè)信息數(shù)據(jù)后 將 總線置于第三態(tài) 即總線空閑時(shí)沒有任何信號(hào)驅(qū)動(dòng)總線 使 AB 之間的電壓在 200 200mV 直至趨于 0V 這帶來了一個(gè)問題 接收器輸出狀態(tài)不確定 如果接收機(jī)的 輸出為 0V 網(wǎng)絡(luò)中從機(jī)將把其解釋為一個(gè)新的啟動(dòng)位 并試圖讀取后續(xù)字節(jié) 由于永遠(yuǎn)不 會(huì)有停止位 產(chǎn)生一個(gè)幀錯(cuò)誤結(jié)果 不再有設(shè)備請(qǐng)求總線 網(wǎng)絡(luò)陷于癱瘓狀態(tài) 除上述所 述的總線空閑會(huì)造成兩線電壓差低于 200mV 的情況外 開路或短路時(shí)也會(huì)出現(xiàn)這種情況 故應(yīng)采取一定的措施避免接收器處于不確定狀態(tài) 圖 13 通常是在總線上加偏置 當(dāng)總線空閑或開路時(shí) 利用偏置電阻將總線偏置在一個(gè)確 定的狀態(tài) 差分電壓 200mV 如圖 13 將 A 上拉到地 B 下拉到 5V 電阻的典型值 是 1k 具體數(shù)值隨電纜的電容變化而變化 上述方法是比較經(jīng)典的方法 但它仍然不能解決總線短路時(shí)的問題 有些廠家將接 收門限移到 200mV 50mV 可解決這個(gè)問題 例如 Maxim 公司的 MAX3080 系列 RS 485 接口 不僅省去了外部偏置電阻 而且解決了總線短路情況下的失效保護(hù)問題 八 RS 422 與 RS 485 的瞬態(tài)保護(hù) 前文提到的信號(hào)接地措施 只對(duì)低頻率的共模干擾有保護(hù)作用 對(duì)于頻率很高的瞬 態(tài)干擾就無能為力了 由于傳輸線對(duì)高頻信號(hào)而言就是相當(dāng)于電感 因此對(duì)于高頻瞬態(tài)干 擾 接地線實(shí)際等同于開路 這樣的瞬態(tài)干擾雖然持續(xù)時(shí)間短暫 但可能會(huì)有成百上千伏 的電壓 實(shí)際應(yīng)用環(huán)境下還是存在高頻瞬態(tài)干擾的可能 一般在切換大功率感性負(fù)載如電機(jī) 變壓器 繼電器等或閃電過程中都會(huì)產(chǎn)生幅度很高的瞬態(tài)干擾 如果不加以適當(dāng)防護(hù)就會(huì) 損壞 RS 422 或 RS 485 通信接口 對(duì)于這種瞬態(tài)干擾可以采用隔離或旁路的方法加以防護(hù) 1 隔離保護(hù)方法 這種方案實(shí)際上將瞬態(tài)高壓轉(zhuǎn)移到隔離接口中的電隔離層上 由 于隔離層的高絕緣電阻 不會(huì)產(chǎn)生損害性的浪涌電流 起到保護(hù)接口的作用 通常采用高 頻變壓器 光耦等元件實(shí)現(xiàn)接口的電氣隔離 已有器件廠商將所有這些元件集成在一片 IC 中 使用起來非常簡(jiǎn)便 如 Maxim 公司的 MAX1480 MAX1490 隔離電壓可達(dá) 2500V 這種方案的優(yōu)點(diǎn)是可以承受高電壓 持續(xù)時(shí)間較長(zhǎng)的瞬態(tài)干擾 實(shí)現(xiàn)起來也比較容易 缺 點(diǎn)是成本較高 2 旁路保護(hù)方法 這種方案利用瞬態(tài)抑制元件 如 TVS MOV 氣體放電管等 將危害性的瞬態(tài)能量旁路到大地 優(yōu)點(diǎn)是成本較低 缺點(diǎn)是保護(hù)能力有限 只能保護(hù)一定 能量以內(nèi)的瞬態(tài)干擾 持續(xù)時(shí)間不能很長(zhǎng) 而且需要有一條良好的連接大地的通道 實(shí)現(xiàn) 起來比較困難 實(shí)際應(yīng)用中是將上述兩種方案結(jié)合起來靈活加以運(yùn)用 如圖 14 在這種方 法中 隔離接口對(duì)大幅度瞬態(tài)干擾進(jìn)行隔離 旁路元件則保護(hù)隔離接口不被過高的瞬態(tài)電 壓擊穿 MODBUS 通訊協(xié)議及編程 ModBus 通訊協(xié)議分為 RTU 協(xié)議和 ASCII 協(xié)議 我公司的多種儀表都采用 ModBus RTU 通訊協(xié)議 如 CH2000 智能電力監(jiān)測(cè)儀 CH2000M 電力參數(shù)采集模塊 巡檢表 數(shù) 顯表 光柱數(shù)顯表等 下面就 ModBus RTU 協(xié)議簡(jiǎn)要介紹如下 一 通訊協(xié)議 一 通訊傳送方式 通訊傳送分為獨(dú)立的信息頭 和發(fā)送的編碼數(shù)據(jù) 以下的通訊傳送方式定義也與 MODBUS RTU 通訊規(guī)約相兼容 編 碼 8 位二進(jìn)制 起始位 1 位 數(shù)據(jù)位 8 位 奇偶校驗(yàn)位 1 位 偶校驗(yàn)位 停止位 1 位 錯(cuò)誤校檢 CRC 冗余循環(huán)碼 初始結(jié)構(gòu) 4 字節(jié)的時(shí)間 地址碼 1 字節(jié) 功能碼 1 字節(jié) 數(shù)據(jù)區(qū) N 字節(jié) 錯(cuò)誤校檢 16 位 CRC 碼 結(jié)束結(jié)構(gòu) 4 字節(jié)的時(shí)間 地址碼 地址碼為通訊傳送的第一個(gè)字節(jié) 這個(gè)字節(jié)表明由用戶設(shè)定地址碼的從機(jī)將 接收由主機(jī)發(fā)送來的信息 并且每個(gè)從機(jī)都有具有唯一的地址碼 并且響應(yīng)回送均以各自 的地址碼開始 主機(jī)發(fā)送的地址碼表明將發(fā)送到的從機(jī)地址 而從機(jī)發(fā)送的地址碼表明回 送的從機(jī)地址 功能碼 通訊傳送的第二個(gè)字節(jié) ModBus 通訊規(guī)約定義功能號(hào)為 1 到 127 本儀表只 利用其中的一部分功能碼 作為主機(jī)請(qǐng)求發(fā)送 通過功能碼告訴從機(jī)執(zhí)行什么動(dòng)作 作為 從機(jī)響應(yīng) 從機(jī)發(fā)送的功能碼與從主機(jī)發(fā)送來的功能碼一樣 并表明從機(jī)已響應(yīng)主機(jī)進(jìn)行 操作 如果從機(jī)發(fā)送的功能碼的最高位為 比如功能碼大與此同時(shí) 127 則表明從機(jī)沒有 響應(yīng)操作或發(fā)送出錯(cuò) 數(shù)據(jù)區(qū) 數(shù)據(jù)區(qū)是根據(jù)不同的功能碼而不同 數(shù)據(jù)區(qū)可以是實(shí)際數(shù)值 設(shè)置點(diǎn) 主機(jī) 發(fā)送給從機(jī)或從機(jī)發(fā)送給主機(jī)的地址 CRC 碼 二字節(jié)的錯(cuò)誤檢測(cè)碼 二 通訊規(guī)約 當(dāng)通訊命令發(fā)送至儀器時(shí) 符合相應(yīng)地址碼的設(shè)備接通訊命令 并除去地址碼 讀取 信息 如果沒有出錯(cuò) 則執(zhí)行相應(yīng)的任務(wù) 然后把執(zhí)行結(jié)果返送給發(fā)送者 返送的信息中 包括地址碼 執(zhí)行動(dòng)作的功能碼 執(zhí)行動(dòng)作后結(jié)果的數(shù)據(jù)以及錯(cuò)誤校驗(yàn)碼 如果出錯(cuò)就不 發(fā)送任何信息 1 信息幀結(jié)構(gòu) 地址碼 功能碼 數(shù)據(jù)區(qū) 錯(cuò)誤校驗(yàn)碼 8 位 8 位 N 8 位 16 位 地址碼 地址碼是信息幀的第一字節(jié) 8 位 從 0 到 255 這個(gè)字節(jié)表明由用戶設(shè)置地 址的從機(jī)將接收由主機(jī)發(fā)送來的信息 每個(gè)從機(jī)都必須有唯一的地址碼 并且只有符合地 址碼的從機(jī)才能響應(yīng)回送 當(dāng)從機(jī)回送信息時(shí) 相當(dāng)?shù)牡刂反a表明該信息來自于何處 功能碼 主機(jī)發(fā)送的功能碼告訴從機(jī)執(zhí)行什么任務(wù) 表 1 1 列出的功能碼都有具體的 含義及操作 代碼 含義 操作 03 讀取數(shù)據(jù) 讀取當(dāng)前寄存器內(nèi)一個(gè)或多個(gè)二進(jìn)制值 06 重置單一寄存器 把設(shè)置的二進(jìn)制值寫入單一寄存器 數(shù)據(jù)區(qū) 數(shù)據(jù)區(qū)包含需要從機(jī)執(zhí)行什么動(dòng)作或由從機(jī)采集的返送信息 這些信息可以 是數(shù)值 參考地址等等 例如 功能碼告訴從機(jī)讀取寄存器的值 則數(shù)據(jù)區(qū)必需包含要讀 取寄存器的起始地址及讀取長(zhǎng)度 對(duì)于不同的從機(jī) 地址和數(shù)據(jù)信息都不相同 錯(cuò)誤校驗(yàn)碼 主機(jī)或從機(jī)可用校驗(yàn)碼進(jìn)行判別接收信息是否出錯(cuò) 有時(shí) 由于電子噪 聲或其它一些干擾 信息在傳輸過程中會(huì)發(fā)生細(xì)微的變化 錯(cuò)誤校驗(yàn)碼保證了主機(jī)或從機(jī) 對(duì)在傳送過程中出錯(cuò)的信息不起作用 這樣增加了系統(tǒng)的安全和效率 錯(cuò)誤校驗(yàn)采用 CRC 16 校驗(yàn)方法 注 信息幀的格式都基本相同 地址碼 功能碼 數(shù)據(jù)區(qū)和錯(cuò)誤校驗(yàn)碼 2 錯(cuò)誤校驗(yàn) 冗余循環(huán)碼 CRC 包含 2 個(gè)字節(jié) 即 16 位二進(jìn)制 CRC 碼由發(fā)送設(shè)備計(jì)算 放置 于發(fā)送信息的尾部 接收信息的設(shè)備再重新計(jì)算接收到信息的 CRC 碼 比較計(jì)算得到的 CRC 碼是否與接收到的相符 如果兩者不相符 則表明出錯(cuò) CRC 碼的計(jì)算方法是 先預(yù)置 16 位寄存器全為 1 再逐步把每 8 位數(shù)據(jù)信息進(jìn)行處理 在進(jìn)行 CRC 碼計(jì)算時(shí)只用 8 位數(shù)據(jù)位 起始位及停止位 如有奇偶校驗(yàn)位的話也包括奇偶 校驗(yàn)位 都不參與 CRC 碼計(jì)算 在計(jì)算 CRC 碼時(shí) 8 位數(shù)據(jù)與寄存器的數(shù)據(jù)相異或 得到的結(jié)果向低位移一字節(jié) 用 0 填補(bǔ)最高位 再檢查最低位 如果最低位為 1 把寄存器的內(nèi)容與預(yù)置數(shù)相異或 如 果最低位為 0 不進(jìn)行異或運(yùn)算 這個(gè)過程一直重復(fù) 8 次 第 8 次移位后 下一個(gè) 8 位再與現(xiàn)在寄存器的內(nèi)容相相異或 這個(gè)過程與以上一樣重復(fù) 8 次 當(dāng)所有的數(shù)據(jù)信息處理完后 最后寄存器的內(nèi)容即為 CRC 碼值 CRC 碼中的數(shù)據(jù)發(fā)送 接收時(shí)低字節(jié)在前 計(jì)算 CRC 碼的步驟為 預(yù)置 16 位寄存器為十六進(jìn)制 FFFF 即全為 1 稱此寄存器為 CRC 寄存器 把第一個(gè) 8 位數(shù)據(jù)與 16 位 CRC 寄存器的低位相異或 把結(jié)果放于 CRC 寄存器 把寄存器的內(nèi)容右移一位 朝低位 用 0 填補(bǔ)最高位 檢查最低位 如果最低位為 0 重復(fù)第 3 步 再次移位 如果最低位為 1 CRC 寄存器與多項(xiàng)式 A001 1010 0000 0000 0001 進(jìn)行異或 重復(fù)步驟 3 和 4 直到右移 8 次 這樣整個(gè) 8 位數(shù)據(jù)全部進(jìn)行了處理 重復(fù)步驟 2 到步驟 5 進(jìn)行下一個(gè) 8 位數(shù)據(jù)的處理 最后得到的 CRC 寄存器即為 CRC 碼 3 功能碼 03 讀取點(diǎn)和返回值 儀表采用 Modbus RTU 通訊規(guī)約 利用通訊命令 可以進(jìn)行讀取點(diǎn) 保持寄存器 或 返回值 輸入寄存器 的操作 保持和輸入寄存器都是 16 位 2 字節(jié) 值 并且高位在前 這樣用于儀表的讀取點(diǎn)和返回值都是 2 字節(jié) 一次最多可讀取寄存器數(shù)是 60 由于一些可 編程控制器不用功能碼 03 所以功能碼 03 被用作讀取點(diǎn)和返回值 從機(jī)響應(yīng)的命令格式 是從機(jī)地址 功能碼 數(shù)據(jù)區(qū)及 CRC 碼 數(shù)據(jù)區(qū)中的寄存器數(shù)據(jù)都是每?jī)蓚€(gè)字節(jié)高字節(jié)在 前 4 功能碼 06 單點(diǎn)保存 主機(jī)利用這條命令把單點(diǎn)數(shù)據(jù)保存到儀表的存儲(chǔ)器 從機(jī)也用這個(gè)功能碼向主機(jī)返送 信息 二 編程舉例 下面是一個(gè)用 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.請(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您。
下載文檔到電腦,查找使用更方便
15 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- Modbus 通信協(xié)議 教程
鏈接地址:http://www.820124.com/p-9290230.html