<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • Linux下的Modbus設備方協議軟件介紹

     2013-9-17              

            Modbus協議是一種已廣泛應用于當今工業控制領域的通用通訊協議。通過此協議,控制器相互之間、或控制器經由網絡(如以太網)可以和其它設備之間進行通信。Modbus協議使用的是主從通訊技術,即由主設備主動查詢和操作從設備。一般將主控設備方所使用的協議稱為Modbus Master,從設備方使用的服務器協議稱為Modbus Slave。典型的主設備包括工控機和工業控制器等;典型的從設備如PLC可編程控制器等。Modbus通訊物理接口可以選用串口(包括RS232和RS485),也可以選擇以太網口。其通信遵循以下的過程:

              主設備向從設備發送請求; 
              從設備分析并處理主設備的請求,然后向主設備發送結果; 
              如果出現任何差錯,從設備將返回一個異常功能碼。

     

            英創公司提供的ARM9嵌入式主板系列產品,均帶有豐富的串口、網絡資源、通用GPIO接口等,同時具有強大的處理能力,除了適用于作為Modbus 主設備的開發應用,還可以作為ModBus從設備的開發應用。主控協議軟件在英創的“Linux下的ModBus主控協議軟件”一文已有介紹, 在本文中主要介紹基于實現ModBus設備方協議的軟件包“Linux下的ModBus設備方協議軟件”(以下簡稱mbusslave軟件包)。該軟件的是以C函數加靜態庫libmbusslave.a的形式提供給客戶。主要特征如下:

              非常適用于實時的工業應用。 
              可以支持基于串口的Modbus協議應用或者基于TCP的Modbus協議應用。 
              支持RTU傳輸模式。 
              支持大多數的Modbus功能碼操作,包括對線圈、離散開關輸入的位操作,以及對寄存器的字節操作。 
              可以獲取通訊中傳輸協議的錯誤代碼的詳細信息。

     

            作為ModBus服務器,無論是基于串口還是基于TCP,在英創提供的mbusslave軟件包中,實現了對于ModBus應用報文的分析與響應,這只是ModBus通訊的一部分。另一部分是還需要有對應用數據的訪問,這部分的內容則需要用戶自己來進行定義,為了方便客戶的使用,在mbusslave軟件包中通過函數指針的形式,實現了這些用戶接口函數的自動加載,將用戶應用數據處理和ModBus應用報文響應關聯起來。用戶只需根據需求定義這些接口函數來實現相應的功能,各個函數具體的定義是通過專門的一個CPP文件:DataProvider.cpp來實現。所以在使用英創的mbusslave軟件包時,有兩個部分組成,一部分是 modbus_slave.h/ libmbusslave.a定義的API函數;另一部分是DataProvider.h /DataProvider.cpp定義的用戶數據接口函數,其中接口函數需要用戶在DataProvider.cpp中具體實現。

     

    一、mbusslave軟件包API函數

     

            為了方便應用程序的使用,對不同的通訊介質保持一致的代碼形式,英創所提供的mbusslave軟件包的API函數可以同時支持基于串口和TCP的Modbus協議,應用程序只需要在調用初始化函數時,用不同參數區分即可。以下介紹英創modbusSlave軟件包的相關API函數,各個函數的定義如下:

     

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    功能描述:

            通過串口或者網絡TCP打開ModBus協議,連接到ModBus設備。對于串口方式,通過該函數打開串口,并設置相應串口的通訊參數,以滿足數據和控制命令的通訊;對于TCP方式,通過該函數和ModBus設備建立基于Socket方式的TCP連接,利用該連接進行數據和控制命令的通訊。

    輸入參數 pPortName:

            該參數為char類型的字符串,該字符串中包含了啟動ModBus協議的需要設置的通訊參數信息。對于串口模式和TCP兩種模式分別采用不同的格式的字符串。
    (1) 串口模式: 
            字符串必須以ttyS作為開頭,后面再帶上需要設置的串口通訊參數。格式為: ttySIdx:baudRate-dataBits-stopBits-parity
    其中Idx為串口序號,':' 后為串口通訊參數,各個通訊參數均用整型數據來表示,依次為波特率、數據位、停止位、校驗位,校驗位 0-無校驗 1-奇校驗 2-偶校驗。 
            如ttyS2作為通訊的協議口,波特率:9600bps、8為數據位、1個停止位、無校驗。其格式如下:'ttyS2:9600-8-1-0' ;

            也可以直接就用 'ttyS2' 來表示,表明串口所用的為缺省參數:波特率 9600bps 數據位 8 停止位 1 無奇偶校驗。
    (2) TCP模式: 
            字符串以IP地址或者”*”作為開頭,':'后為指定TCP連接的特殊端口號,ModBus協議中缺省端口為502。如果不需要指定特殊端口,可以不帶此參數。格式如:'192.168.201.178' 或者“*”,使用端口號為502;
    slaveAddr: 
            ModBus Slave設備地址。
    timeout: 
            設置ModBus協議通訊響應的超時時間,單位為毫秒ms
    mbusSlave_Interface: 
            數據處理函數指針結構,即需要加載ModBus Slave設備響應各個功能的用戶數據處理接口函數。這些用戶接口函數是由用戶自己提供,用戶可以根據選擇的功能來實現。這些函數的名稱和定義是固定的。分別為: 
            (1) 功能:讀保持寄存器/讀寫寄存器,實現功能碼3、23
    int ReadHoldingRegistersTable( int startRef, short regArr[], int refCnt ); 
            (2) 功能:寫寄存器,實現功能碼6、16、22、23
    int WriteHoldingRegistersTable( int startRef, const short regArr[], int refCnt ); 
            (3) 功能:讀輸入寄存器,實現功能碼4
    int ReadInputRegistersTable( int startRef, short regArr[], int refCnt ); 
            (4) 功能:讀線圈,實現功能碼1
    int ReadCoilsTable( int startRef, char bitArr[], int refCnt ); 
            (5) 功能:寫線圈,實現功能碼5、15
    int WriteCoilsTable( int startRef, const char bitArr[], int refCnt ); 
            (6) 功能:讀離散量,實現功能碼 2
    int ReadInputDiscretesTable( int startRef, char bitArr[], int refCnt );
    返回值 = NULL: 啟動ModBus設備失敗。
    != NULL: 啟動ModBus設備成功,并返回相應的操作句柄。
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (1) HANDLE mbusSlave_StartupServer( char* pPortName, int slaveAddr, int timeout, ModBusSlave_Interface mbusSlave_Interface );

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: ModBus 服務器執行函數,用于對ModBus報文的分析和響應。 
            該函數為阻塞模式,阻塞的時間為函數mbusSlave_StartupServer (…)中設置的ModBus協議通訊響應的超時時間 timeout,也相當于等待請求響應的超時時間。實際應用中需要在線程中不斷地調用該函數。
    輸入參數 
            hPort: 啟動ModBus設備后獲取的操作句柄
    返回值 0: 相應操作成功 
            !=0: 錯誤代碼,可調用函數mbusSlave_GetErrorText(…)獲取錯誤的文本信息
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (2) int mbusSlave_ServerLoop( HANDLE hPort );

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 功能描述: 關閉ModBus服務器應用。
    輸入參數 
            hPort: 啟動ModBus設備后獲取的操作句柄
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (3) void mbusSlave_ShutdownServer( HANDLE hPort );

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 獲取ModBus軟件包的版本信息。
    返回值 : ModBus軟件包的版本信息。
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    (4) char * mbusSlave_GetPackageVersion( );


    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 根據錯誤代碼獲取錯誤文本信息。
    返回值 :錯誤文本信息。
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (5) char * mbusSlave_GetErrorText( int errCode );

    modbus_Slave API調用的使用范例:

    1、啟動modbus設備方協議

    TCP方式:

            hPort = mbusSlave_StartupServer( '*', 1, 10000, mbusSlave_Interface );
    串口方式: 
            hPort=mbusSlave_StartupServer( 'ttyS2:9600-8-1-0',1,10000, mbusSlave_Interface );

    2、線程中調用Serverloop 響應請求 
            while( 1 ) 
            { 
                    result = mbusSlave_ServerLoop( hPort ); 
                    if( result!=0 ) // 檢查是否返回錯誤 
                    { 
                            // 出錯處理:本例為獲取并打印錯誤代碼的文本信息 
                            strcpy( strText, mbusSlave_GetErrorText( result ) ); 
                            i1 = strlen( strText ); 
                            if( i1>0 ) 
                            { 
                                    printf( ' error code: %s!\n', strText ); 
                            } 
                    } 
            }

     

    二、mbusslave軟件包用戶接口函數

     

            在DataProvider.h中共定義了6個用戶數據接口函數定義如下:

     

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 讀保持寄存器/讀寫寄存器,實現功能碼3、23
    輸入參數 
            startRef: 寄存器的起始地址,范圍:1-0x10000 
            regArr: 讀取寄存器的值 
            refCnt: 需要讀取的寄存器數目,范圍:1-125
    返回值 
            =1:操作成功 
            =0:不支持該項操作
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (1)int ReadHoldingRegistersTable( int startRef, short regArr[], int refCnt );

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 寫寄存器,實現功能碼6、16、22、23
    輸入參數 
            startRef: 寄存器的起始地址,范圍:1-0x10000 
            regArr: 寫寄存器的值 
            refCnt: 需要操作的寄存器數目,范圍:1-125
    返回值 
            =1:操作成功 
            =0:不支持該項操作
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (2)int WriteHoldingRegistersTable( int startRef, const short regArr[], int refCnt );

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 讀輸入寄存器,實現功能碼4
    輸入參數 
            startRef: 寄存器的起始地址,范圍:1-0x10000 
            regArr: 讀取寄存器的值 
            refCnt: 需要讀取的寄存器數目,范圍:1-125
    返回值 
            =1:操作成功 
            =0:不支持該項操作
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (3)int ReadInputRegistersTable ( int startRef, short regArr[], int refCnt );

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 讀線圈,實現功能碼1
    輸入參數 
            startRef: 寄存器的起始地址,范圍:1-0x10000 
            bitArr: 讀取線圈的值 
            refCnt: 需要讀取的線圈數目,范圍:1-2000
    返回值 
            =1:操作成功 
            =0:不支持該項操作
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (4)int ReadCoilsTable( int startRef, char bitArr[], int refCnt );

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 寫線圈,實現功能碼5、15
    輸入參數 
            startRef: 寄存器的起始地址,范圍:1-0x10000 
            bitArr: 寫線圈的值 
            refCnt: 需要操作的線圈數目,范圍:1-2000
    返回值 
            =1:操作成功 
            =0:不支持該項操作
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (5)int WriteCoilsTable( int startRef, const char bitArr[], int refCnt );

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 讀離散量,實現功能碼 2
    輸入參數 
            startRef: 寄存器的起始地址,范圍:1-0x10000 
            bitArr: 讀取離散量的值 
            refCnt: 需要讀取的離散量數目,范圍:1-2000
    返回值 
            =1:操作成功 
            =0:不支持該項操作
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (6)int ReadInputDiscretesTable( int startRef, char bitArr[], int refCnt );

     

            英創現有的Linux工控主板均可支持該協議軟件,感興趣的客戶向公司索取相關的測試代碼。

     

            相關閱讀:英創嵌入式Linux工控主板支持Modbus主控協議軟件

    久久久久久久久毛片精品| 国产精品视频久久久久久| AV天堂午夜精品一区| 精品国产一区二区三区av片| 亚洲精品成人av在线| 99精品免费视品| 内射一区二区精品视频在线观看| 久久中文字幕精品| 夜色www国产精品资源站| 精品国产一区二区三区AV性色| 亚洲国产精品自在自线观看| 99国产精品自在自在久久| 香蕉久久丫精品忘忧草产品| 亚洲综合一区二区精品导航| 国产成人精品无码一区二区三区| 国产91精品久久久久久久| 精品国产性色无码AV网站| 久久AV无码精品人妻糸列| 亚洲精品无码不卡| 久久国产免费观看精品| 久久se精品一区二区影院 | 久久www免费人成精品香蕉| 国内精品久久久久久影院| 99精品国产高清一区二区麻豆 | 日韩精品视频免费网址| 成人综合久久精品色婷婷| 91精品在线国产| 精品无码人妻一区二区免费蜜桃 | 视频一区二区精品的福利| 99er热精品视频| 自拍偷在线精品自拍偷99| 国产对白精品刺激一区二区| 久久99精品久久久久久动态图| 久久精品国产精品亚洲艾草网| 亚洲精品一品区二品区三品区| 在线精品动漫一区二区无广告| 成人精品视频一区二区三区| 国内精品久久久久久不卡影院| 9i9精品国产免费久久| 国产线视频精品免费观看视频 | 亚洲欧美精品午睡沙发|