• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 手機與無線通信 > 設計應用 > Modbus RTU通信協議在MCF51QE128上的實現

    Modbus RTU通信協議在MCF51QE128上的實現

    作者: 時間:2008-07-21 來源:網絡 收藏

    引言


    工業控制已從單機控制走向集中監控、集散控制,如今已進入網絡集約制造時代。工業控制器連網也為網絡管理提供了方便。就是工業控制器的網絡中的一種。是應用于電子控制器上的一種規約。通過此,控制器相互之間、控制器經由網絡(例如以太網)和其他設備之間可以。它已經成為主流的工業標準之一。不同廠商生產的控制設備通過協議可以連成工業網絡,進行集中監控。

    Modbus協議


    1 通信傳送方式


    每一個數據字節包括:每個字節的位、1個起始位、8個數據位、最小的有效位先發送、1個奇偶校驗位(無校驗則無)、1個停止位(有校驗時)、2個停止位(無校驗時)。


    模式下每個字節的格式(11bit)如下:
    編碼系統:8位二進制
    字節組成:1bit起始位、8bit數據位,最低位最先發送、1bit奇偶校驗位、1bit停止位(或者沒奇偶校驗位,就發送一個附加的停止位)。


    2 數據幀結構


    地址碼:地址碼為通信傳送的第一字節。這字節表明由用戶設定地址碼的從機將接收由主機發送來的信息。并且每個從機都有唯一的地址碼,并且響應回送均以各自的地址碼開始。主機發送的地址碼表明將發送到的從機地址,而從機發送的地址碼表明回送的從機地址。


    功能碼:通信傳送的第二字節。ModBus通信規約定義功能號為1~127。根據實際需要只利用其中的一部分功能碼。作為主機請求發送,通過功能碼告訴從機執行什么動作。作為從機響應,從機發送的功能碼與從主機發送來的功能碼一樣,并表明從機已響應主機進行操作。如果從機發送的功能碼的最高位為1,則表明從機沒有響應操作或發送出錯。

    表1 每一個完整的數據幀構成

    數據區:數據區根據不同的功能碼而不同。數據區可以是實際數值、設置點、主機發送給從機或從機發送給主機的地址。


    CRC碼:二字節的錯誤檢測碼。冗余循環碼檢查(CRC)包含兩字節,即16位二進制。CRC碼由發送設備計算,放置于發送信息的尾部。接收信息的設備再重新計算接收到信息的CRC碼,比較計算得到的CRC碼是否與接收到的相符,如果兩者不相符,則表明出錯。CRC碼的計算方法是,先預置16位寄存器全為1。再逐步把每8位數據信息進行處理。在進行CRC碼計算時只用8位數據位、起始位及停止位,如有奇偶校驗位的話也包括奇偶校驗位,都不參與CRC碼計算。


    在計算CRC碼時,8位數據與寄存器的數據相異或,得到的結果向低位移一位,用0填補最高位。再檢查最低位,如果最低位為1,把寄存器的內容與預置數相異或,如果最低位為0,不進行異或運算。


    這個過程一直重復8次。第8次移位后,下一個8位再與現在寄存器的內容相異或,這個過程與以上一樣重復8次。當所有的數據信息處理完后,最后寄存器的內容即為CRC碼值。CRC碼中的數據發送、接收時低字節在前。在實際應用中,為了提高運算速度,采用了查表的方法取代計算方法。


    3 Modbus 數據幀結構


    模式下,每一個數據幀之間的間隔至少是3.5個字符位。一個完整的數據幀必須要連續的傳送,當一幀消息中兩字節間的間距大于1.5字符位時,此數據幀錯誤,被接受方放棄。


    當通信波特率小于等于19 200b/s。對1.5個字符位/3.5個字符位計算時間有嚴格要求。當通信波特率大于19 200b/s。1.5個字符位固定為750μs,3.5個字符位固定為1.75ms。官方的Modbus RTU規定標準為3.5個字符長周期,不同的串口設備由于使用環境不同可能在發送中出現5~10字長的間隙。對于Modbus RTU來說比較安全的設置為50ms。


    4 用到的功能代碼


    用到的功能代碼如表2所示。

    表2 功能代碼

    的主要特性


    系統核心控制器采用的是Freescale公司推出的32位單片機。它是一款32位ColdFire V1 MCU,特點包括:停止電流降至370nA,6μs喚醒時間,超低運行電流為50mA;50.33MHz ColdFire V1內核運行頻率;25.165MHz的總線頻率;最大為8KB的RAM;最高128KB的閃存;24信道的12位ADC;兩個模擬比較器;2xSCI、2xI2C、2xSPI;一個6信道和兩個3信道的定時器PWM模塊;RTC;最多70路通用輸入/輸出(GPIO);系統集成頻率鎖定環(FLL)和軟件看門狗;內部時鐘源(ICS);低功耗外部32kHz振蕩器;電壓范圍為1.8~ 3.6V;增強型內部振蕩器、電壓調節器和實時計數器。通用開發環境是CodeWarrior for Microcontrollers 6.0。

    軟件設計


    1 接收軟件流程
    如圖1所示。

    圖1 從機軟件流程


    2 配置串口和定時器


    void usart_init()
    {
    SCI1C1=0x13;//9bit character mode,odd parity
    SCI1C2=0x2c;
    SCI1BDL=0x29;//38400bps
    SCI1BDH=0;
    }
    void timer3_init(void)//8MHz主時鐘1333Hz中斷判斷命令包結束
    {
    TPM3CNTH=0;
    TPM3CNTL=0;
    TPM3MODH=0x49;
    TPM3MODL=0xbe;
    TPM3SC=0x48;
    }


    3 解包modbus RTU的程序


    void interrupt VectorNumber_ Vsci1rx SCI_RX_ISR(void)//字節接收程序
    {
    if(SCI1S1_PF==1)communication_error=1;//字節校驗錯誤置通信失敗標志位
    *(pointer_RX1)=SCI1D;//將數據放入緩沖隊列
    pointer_RX1++;//隊列指針后移
    len_RX1++;//收到字節長度加1
    timer3_reset();//定時器復位
    timer3_init();//定時器重啟動
    }
    void interrupt VectorNumber_Vtpm3ovf Timer3_ISR(void)//判斷命令包接收結束
    {
    timer3_cnt++;//定時器中斷次數加1
    if(timer3_cnt==2)
    {
    timer3_reset();//定時器復位
    pointer_RX1=Buffer_RX1;//隊列指針初始化
    full_RX1=1;//收完置標志位
    }
    }


    4 CRC查表產生函數


    由于篇幅有限,此處不再詳述,表具體內容可參照相關參考文獻。

    總結


    筆者的設計基于MCF51QE128控制核心來Modbus協議,已經成功進行了實際應用,通信可靠,而且起來比較容易。該設計為采用MCF51QE128微控制器進行工業產品設計通信的應用提供了參考方案。



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 建瓯市| 高陵县| 石柱| 阿拉善盟| 白朗县| 汕头市| 库伦旗| 扎赉特旗| 河源市| 博湖县| 黄石市| 普陀区| 上杭县| 黄浦区| 濉溪县| 怀来县| 子长县| 綦江县| 普兰店市| 泉州市| 迁西县| 许昌县| 安西县| 邢台市| 济源市| 沧州市| 舞钢市| 南岸区| 安远县| 江西省| 晋州市| 平果县| 西安市| 金坛市| 河南省| 岚皋县| 东方市| 桑日县| 冀州市| 太白县| 桑植县|