<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>
  • 英創(chuàng)嵌入式Linux工控主板支持Modbus主控協(xié)議軟件

     2013-6-20              

    1、簡述

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

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

     

            英創(chuàng)公司提供的ARM9嵌入式主板系列產(chǎn)品,均帶有豐富的串口、網(wǎng)絡資源,同時具有強大的處理能力,非常適用于作為Modbus 主設備的開發(fā)應用,為了加快做這類應用的開發(fā)速度,英創(chuàng)公司特推出Linux下的Modbus主控軟件,該軟件的是以C函數(shù)靜態(tài)庫文件libmbusmaster.a的形式提供給客戶。主要特征如下:

              非常適用于實時的工業(yè)應用,特別可以廣泛應用于對于PLC的控制。 
              可以支持基于串口的Modbus協(xié)議或者基于TCP的Modbus協(xié)議。 
              支持RTU傳輸模式。 
              支持大多數(shù)的Modbus功能碼操作,包括對線圈、離散開關(guān)輸入的位操作,以及對寄存器的字節(jié)操作。 
              支持廣播地址。 
              可以獲取通訊中傳輸協(xié)議的錯誤代碼的詳細信息。

     

    2、Modbus Master API函數(shù)簡介

            為了方便應用程序的使用,對不同的通訊介質(zhì)保持一致的代碼形式,英創(chuàng)所提供的ModBus主控軟件包的API函數(shù)可以同時支持基于串口和TCP的Modbus Master協(xié)議,應用程序只需要在調(diào)用初始化函數(shù)時,用不同參數(shù)區(qū)分即可。有關(guān)Modbus通訊的具體使用方法,請參考Modbus標準文獻以及被控設備的通訊接口數(shù)據(jù)手冊。以下介紹英創(chuàng)Modbus主控軟件的相關(guān)API函數(shù),各個函數(shù)的定義如下:

     

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

    功能描述:通過串口或者網(wǎng)絡TCP打開ModBus協(xié)議,連接到ModBus設備。對于串口方式,通過該函數(shù)打開串口,并設置相應串口的通訊參數(shù),以滿足數(shù)據(jù)和控制命令的通訊;對于TCP方式,通過該函數(shù)和ModBus設備建立基于Socket方式的TCP連接,利用該連接進行數(shù)據(jù)和控制命令的通訊。
    輸入?yún)?shù) pPortName: 
            該參數(shù)為CHAR類型的字符串,該字符串中包含了打開ModBus協(xié)議的需要設置的通訊參數(shù)信息。對于串口模式和TCP兩種模式分別采用不同的格式的字符串。
    (1) 串口模式:
            字符串必須以ttyS作為開頭,后面再帶上需要設置的串口通訊參數(shù)。格式為: ttySIdx:baudRate-dataBits-stopBits-parity
            其中Idx為串口序號,':' 后為串口通訊參數(shù),各個通訊參數(shù)均用整型數(shù)據(jù)來表示,依次為波特率、數(shù)據(jù)位、停止位、校驗位,校驗位 0-無校驗 1-奇校驗 2-偶校驗。
            如串口3作為通訊的協(xié)議口,波特率:9600bps、8為數(shù)據(jù)位、1個停止位、無校驗。其格式如下:
            'ttyS3:9600-8-1-0' ;
            也可以直接就用 'ttyS3' 來表示,表明串口所用的為缺省參數(shù):波特率 9600bps 數(shù)據(jù)位 8 停止位 1 無奇偶校驗。
    (2) TCP模式:
            字符串以IP地址作為開頭,':'后為指定TCP連接的特殊端口號,ModBus協(xié)議中缺省端口為502。如果不需要指定特殊端口,可以不帶此參數(shù)。格式如:
            '192.168.201.178' ,使用端口號為502;
            '192.168.201.178:2000' ,使用端口號為2000;
    返回值 = NULL: 連接ModBus設備失敗。
            != NULL: 連接ModBus設備成功,并返回相應的操作句柄。
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    (1) HANDLE mbusMaster_OpenPortProtocol( char* pPortName );

     

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

    功能描述: 關(guān)閉ModBus設備連接,同時釋放使用的系統(tǒng)資源。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
    返回值 = FALSE: 關(guān)閉操作失敗。 = TRUE: 關(guān)閉操作成功。
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (2) int mbusMaster_ClosePortProtocol( HANDLE hPort );

     

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

    功能描述: 設置ModBus通訊的超時時間,單位為毫秒。并返回實際設置的超時時間。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
            milliseconds: ModBus通訊超時時間,單位為毫秒。
    返回值 < 0: 操作失敗。 > 0: 實際設置的超時時間。
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    (3) int mbusMaster_SetTimeout( HANDLE hPort, int milliseconds );

     

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

    功能描述: 讀取ModBus從機設備的線圈值,實現(xiàn)ModBus功能碼1。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
            slaveAddr: ModBus從機設備的地址,地址范圍為: 1~255
            startRef: 需要讀取線圈的起始值,其范圍為: 1~0x10000 
            bitArr: 存放讀取線圈數(shù)據(jù)的數(shù)組
            refCnt: 需要讀取的線圈數(shù)量,其范圍為: 1~2000
    返回值 != 0: 該功能操作失敗,返回值為相應的出錯代碼。 = 0: 該功能操作成功。
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    (4) int mbusMaster_ReadCoils( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, int bitArr[], UINT16 refCnt);

     

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 讀取ModBus從機設備離散量的輸入值,實現(xiàn)ModBus功能碼2。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
            slaveAddr: ModBus從機設備的地址,地址范圍為: 1~255
            startRef: 需要讀取離散量的起始值,其范圍為: 1~0x10000
            bitArr: 存放讀取離散量輸入數(shù)據(jù)的數(shù)組
            refCnt: 需要讀取的離散量數(shù)量,其范圍為: 1~2000
    返回值 != 0: 該功能操作失敗,返回值為相應的出錯代碼。 = 0: 該功能操作成功。
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (5) int mbusMaster_ReadInputDiscretes( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, int bitArr[], UINT16 refCnt);

     

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: ModBus從機設備的單個線圈的寫入操作,實現(xiàn)ModBus功能碼5。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
            slaveAddr: ModBus從機設備的地址,地址范圍為: 1~255
            bitAddr: 需要操作的線圈地址,其范圍為: 1~0x10000
            bitVal: 寫入線圈的值, 1-置位(ON) 0-清(OFF)
    返回值 != 0: 該功能操作失敗,返回值為相應的出錯代碼。= 0: 該功能操作成功。
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (6) int mbusMaster_WriteCoil( HANDLE hPort, UCHAR slaveAddr, UINT16 bitAddr, int bitVal );

     

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: ModBus從機設備的多個線圈的寫入操作,實現(xiàn)ModBus功能碼15。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
            slaveAddr: ModBus從機設備的地址,地址范圍為: 1~255
            startRef: 需要設置的線圈起始值,其范圍為: 1~0x10000
            bitArr: 需要設置線圈數(shù)據(jù)的數(shù)組
            refCnt: 需要設置的線圈數(shù)量,其范圍為: 1~800
    返回值 != 0: 該功能操作失敗,返回值為相應的出錯代碼。 = 0: 該功能操作成功。
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (7) int mbusMaster_ForceMultipleCoils( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, int bitArr[], UINT16 refCnt);

     

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

    功能描述: 讀取ModBus從機設備多個寄存器值,實現(xiàn)ModBus功能碼3。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
            slaveAddr: ModBus從機設備的地址,地址范圍為: 1~255
            startRef: 需要讀取寄存器的起始值,其范圍為: 1~0x10000
            regArr: 存放讀取寄存器值的數(shù)組
            refCnt: 需要讀取的寄存器數(shù)量,其范圍為: 1~125
    返回值 != 0: 該功能操作失敗,返回值為相應的出錯代碼。 = 0: 該功能操作成功。
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (8) int mbusMaster_ReadMultipleRegisters( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, UINT16 regArr[], UINT16 refCnt );

     

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 讀取ModBus從機設備輸入寄存器值,實現(xiàn)ModBus功能碼4。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
            slaveAddr: ModBus從機設備的地址,地址范圍為: 1~255
            startRef: 需要讀取輸入寄存器的起始值,其范圍為: 1~0x10000
            regArr: 存放讀取輸入寄存器值的數(shù)組
            refCnt: 需要讀取的輸入寄存器數(shù)量,其范圍為: 1~125
    返回值 != 0: 該功能操作失敗,返回值為相應的出錯代碼。 = 0: 該功能操作成功。
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (9) int mbusMaster_ReadInputRegisters( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, UINT16 regArr[], UINT16 refCnt);

     

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

    功能描述: ModBus從機設備多個寄存器的寫操作,實現(xiàn)ModBus功能碼16。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
            slaveAddr: ModBus從機設備的地址,地址范圍為: 1~255
            startRef: 需要讀取寄存器的起始值,其范圍為: 1~0x10000
            regArr: 需寫入寄存器值的數(shù)組
            refCnt: 需要操作的寄存器數(shù)量,其范圍為: 1~100
    返回值 != 0: 該功能操作失敗,返回值為相應的出錯代碼。 = 0: 該功能操作成功。
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    (10) int mbusMaster_WriteMultipleRegisters( HANDLE hPort, UCHAR slaveAddr, UINT16 startRef, UINT16 regArr[], UINT16 refCnt);

     

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

    功能描述: 對ModBus從機設備單個寄存器的寫操作,實現(xiàn)ModBus功能碼6。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
            slaveAddr: ModBus從機設備的地址,地址范圍為: 1~255
            regAddr: 需要操作寄存器的地址,其范圍為: 1~0x10000
            regVal: 需寫入寄存器的值
    返回值 != 0: 該功能操作失敗,返回值為相應的出錯代碼。 = 0: 該功能操作成功。
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    (11) int mbusMaster_WriteSingleRegister( HANDLE hPort, UCHAR slaveAddr, UINT16 regAddr, UINT16 regVal );

     

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 功能描述: 對ModBus從機設備屏蔽寫寄存器,實現(xiàn)ModBus功能碼22。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
            slaveAddr: ModBus從機設備的地址,地址范圍為: 1~255
            regAddr: 需要操作寄存器的地址,其范圍為: 1~0x10000
            andMask: 屏蔽寫與數(shù)據(jù)
            orMask: 屏蔽寫或數(shù)據(jù)
    返回值 != 0: 該功能操作失敗,返回值為相應的出錯代碼。 = 0: 該功能操作成功。
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (12) int mbusMaster_MaskWriteRegister( HANDLE hPort, UCHAR slaveAddr, UINT16 regAddr, UINT16 andMask, UINT16 orMask);

     

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

    功能描述: 對ModBus從機設備讀寫多個寄存器操作,實現(xiàn)ModBus功能碼23。
    輸入?yún)?shù) hPort: 連接ModBus設備返回的有效操作句柄。
            slaveAddr: ModBus從機設備的地址,地址范圍為: 1~255
            readRef: 需要讀取多個寄存器的起始值,其范圍為: 1~0x10000
            readArr: 存放讀取寄存器值的數(shù)組
            readCnt: 需要讀取的寄存器數(shù)量,其范圍為: 1~125
            writeRef: 需要寫入多個寄存器的起始值,其范圍為: 1~0x10000
            writeArr: 寫入寄存器值的數(shù)組
            writeCnt: 需要寫入的寄存器數(shù)量,其范圍為: 1~125
    返回值 != 0: 該功能操作失敗,返回值為相應的出錯代碼。 = 0: 該功能操作成功。
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    (13) int mbusMaster_ReadWriteRegisters( HANDLE hPort, UCHAR slaveAddr, UINT16 readRef,UINT16 readArr[],UINT16 readCnt, UINT16 writeRef, UINT16 writeArr[], UINT16 writeCnt);

     

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 獲取ModBus軟件包的版本信息。
    返回值 : CHAR類型的字符串,為ModBus軟件包的版本信息。
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (14) char * mbusMaster_GetPackageVersion( );

     

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    功能描述: 根據(jù)錯誤代碼獲取錯誤文本信息。
    返回值 : CHAR類型的字符串,為錯誤文本信息。
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    (15) char * mbusMaster_GetErrorText( int errCode );

     

    3、應用例程

            對于應用來說,所建立的應用程序工程只需要包含modbus_Master.h、libmbusmaster.a文件即可方便實現(xiàn)對于modbus Master協(xié)議API函數(shù)的調(diào)用。以下代碼為一個簡單的調(diào)用例程:

     

            // MbusMasterTest.cpp : Defines the entry point for the application.
            //
            #include
            #include
            #include
            #include  
            #include
            #include
            #include
            #include
            #include
            #include 'modbus_Master.h'

            //char *hostName = '192.168.201.178';
            //char *hostName = 'ttyS3:9600-8-1-0';
            char hostName[80];

            int main( int argc,char* argv[] )
            {
                    int i1, result;
                    int portno, baudRate;
                    UINT16 dataArr[8];
                    char str[200];
                    HANDLE hPort;

                    // 解析命令行參數(shù):串口號 波特率
                    if( argc > 1 )
                            portno = atoi( argv[1] );
                    else
                            portno = 3;
                    if( argc > 2 )
                            baudRate = atoi( argv[2]); 
                    else
                            baudRate = 9600;

                    printf( 'port:%d baudrate:%d\n', portno, baudRate);
                    sprintf( hostName, 'ttyS%d:%d-8-1-0', portno, baudRate );
                    // 啟動ModBus協(xié)議,連接到Modbus設備
                    hPort = mbusMaster_OpenPortProtocol( hostName );
                    if( hPort==INVALID_HANDLE_VALUE )
                    {
                            printf( 'Open fail!\n');
                            return -1;
                    }

                    //進入主循環(huán)
                    for( ; ; )
                    {
                            result = mbusMaster_ReadMultipleRegisters( hPort, 1, 1, dataArr, sizeof(dataArr) / 2); 
                            //result = mbusMaster_WriteCoil( hPort, 1, 1, 1 );
                            if (result == 0)
                            {
                                    for (i1 = 0; i1 < int(sizeof(dataArr) / 2); i1++)
                                    { 
                                            printf('[%d]: %hd\n', i1 + 1, dataArr[i1]); 
                                    } 
                            }
                            else
                            { 
                                    strcpy( str,mbusMaster_GetErrorText( result ) ); 
                                    i1 = strlen( str );
                                    if( i1>0 )
                                    {
                                            printf( '%s!\n', str );
                                    }
                            }
                            sleep(1);
                    }

                    mbusMaster_ClosePortProtocol( hPort );
                    return 0;
            }

     

            該工程文件中用到專用靜態(tài)庫libmbusmaster.a,在eclipse環(huán)境對此程序編譯時,需要設置相應的編譯屬性。在Project Explorer視窗下,選擇需要設置的工程文件,然后點擊鼠標右鍵,選擇 Properties項,在窗口中選擇C/C++ Build -> Settings -> Tool Settings -> Sourcery G++ C++ Linker -> Libraries,如下圖所示。其中的一個窗口用于指定庫文件的名稱,一個用于指定庫文件的路徑。

     

     

            相關(guān)閱讀:Linux下的Modbus設備方協(xié)議軟件介紹

    国内精品乱码卡1卡2卡3免费| 久久国产精品免费一区| 日韩精品视频一区二区三区| 2022国内精品免费福利视频| 麻豆精品无码国产在线果冻| 亚洲综合一区二区精品导航| 精品国产乱码久久久久久浪潮| 亚洲综合精品第一页| 久久久久国产精品熟女影院| 日韩A∨精品日韩在线观看| 凹凸国产熟女精品视频| 久久久这里只有精品加勒比| 久久99精品国产自在现线小黄鸭 | 国产va免费精品观看精品| 亚洲国产精品va在线播放| 久久九九久精品国产免费直播| 国产成人亚洲精品蜜芽影院| 欧美日韩精品SUV| 亚洲国产成人99精品激情在线| 久久亚洲AV午夜福利精品一区 | 国产精品99久久久久久www| 精品久久久中文字幕| 亚洲精品天堂无码中文字幕| 国产精品久久一区二区三区| 久久精品人人槡人妻人人玩AV| 国产成人无码精品一区二区三区| 国内精品久久久久国产盗摄| 国产精品丝袜久久久久久不卡| 欧洲精品一区二区三区在线观看 | 国产亚洲午夜精品| 国产成人精品福利网站人| 青青青亚洲精品国产| 精品日韩二区三区精品视频| 国产精品无码专区AV在线播放| 亚洲人成色777777精品| 亚洲精品无AMM毛片| 色哟哟精品视频在线观看| 国产精品美女一区二区三区 | 动漫精品第一区二区三区| 国产精品一区二区综合| 国产伦精品一区二区三区无广告 |