欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2696|回復(fù): 0
收起左側(cè)

PC和單片機(jī)通過MODBUS RTU通信

[復(fù)制鏈接]
ID:504942 發(fā)表于 2019-4-4 17:21 | 顯示全部樓層 |閱讀模式
最近研究了一下MODBUS通信,在STC12C5A60S2單片機(jī)上實(shí)現(xiàn)了MODBUS協(xié)議的部分功能,方便上位機(jī)從單片機(jī)系統(tǒng)上獲取數(shù)據(jù),比如由單片機(jī)獲取的溫度、濕度、或者控制信號(hào)的狀態(tài)等。有了MODBUS協(xié)議后,上位機(jī)的開發(fā)就很方便了,可以使用C#等高級(jí)語言通過串口通信,或者使用組態(tài)王直接通過串口通信而不需要寫代碼,這些都?xì)w功于MODBUS協(xié)議的開放性,很多的組態(tài)軟件都能提供對(duì)他的支持。甚至通過PLC直接可以和單片機(jī)通信,比如在PLC系統(tǒng)上沒有AD時(shí),可以使用單片也來進(jìn)行AD,然后通過MODBUS返回給PLC進(jìn)行相應(yīng)的控制。
通過MODBUS協(xié)議可以實(shí)現(xiàn)主機(jī)和多個(gè)從機(jī)進(jìn)行通謝,而每個(gè)從機(jī)有唯一的地址,主機(jī)就靠這個(gè)地址和從機(jī)進(jìn)行通信。每一幀數(shù)據(jù)都要通過CRC進(jìn)行校驗(yàn),保證通信的正確性。
在進(jìn)行多機(jī)通信時(shí)只需要把每個(gè)從機(jī)的串口并到一起即可,見后面的圖。
單片機(jī)中3號(hào)功能的核心代碼如下:
unsigned char createRespond_M(unsigned char *respondMessage,unsigned char* _messageReceived ,unsigned int* _registerData)
{
    unsigned char  i,j;
    unsigned char  numberOfPoints = 0;
    unsigned char_slaveAddress = 0 ;
    unsigned char  bytesToSend = 0;
    unsigned char  startAddress=0;
    unsigned charcrcCalculation[]={0,0,0};
    unsigned int CntHi= _messageReceived[4];  //將其轉(zhuǎn)換為int型,然后放到高8位。
    CntHi = CntHi<<8;                    
    numberOfPoints = CntHi| _messageReceived[5];
    if(numberOfPoints > MaxnumberOfPoints)
    {
        return  0;
    }
   
    bytesToSend = 2 *numberOfPoints +5;
    _slaveAddress = _messageReceived[0];
    respondMessage[0] =_slaveAddress;
    respondMessage[1] = 3;
    respondMessage[2] =2 * numberOfPoints;
    startAddress = (((unsigned int)(_messageReceived[2])) << 8) |_messageReceived[3];
    j= 0;
    for (i = 0; i< numberOfPoints; i++)
    {
        respondMessage[i + j + 3] = ((_registerData[startAddress + i] >> 8)& 0xff);
        respondMessage[i + j + 4] =(_registerData[startAddress + i] & 0xff);
        j++;
    }
    calculateCRC(respondMessage, bytesToSend - 2,crcCalculation);
    respondMessage[bytesToSend - 2] = crcCalculation[0];
    respondMessage[bytesToSend - 1] = crcCalculation[1];
    return bytesToSend;
}
//對(duì)接收的數(shù)據(jù)進(jìn)行CRC檢驗(yàn),同時(shí)判斷是否為Address所指定的從機(jī)地址和是否為function3功能。
bitCheckRecData(unsigned char * RecData,unsigned charAddress)
{
    if(RecData[0] ==Address && RecData[1] == 3)   //地址為自己的地址,同時(shí)功能碼為3(function3)
    {
        if(checkCRC(RecData,8))
        {
            return 1;
        }
    }
    return 0;
}
本例中每個(gè)從機(jī)返回80個(gè)字節(jié)的數(shù)據(jù),1號(hào)機(jī)返回i+1,  2號(hào)機(jī)返回2*i+1   ,當(dāng)然在實(shí)際運(yùn)用中只要自己定義所返回的數(shù)據(jù)的含義即可。比如1,2字節(jié)代表溫度,3,4字節(jié)代表濕度,接下來的4個(gè)字節(jié)代表P0,P1,P2,P3端口的狀態(tài)等?梢宰杂啥x,很方便。
具體效果見下圖:
把兩塊板的串口通過杜綁線連在一起。
在TEXTBOX中輸入從機(jī)的地址,返回相應(yīng)的數(shù)據(jù)
如果輸入的地址從機(jī)不存在,那么通信將會(huì)超時(shí),就會(huì)提示通信故障。這個(gè)是根據(jù)通信超時(shí)來判斷的。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表