• <strike id="aymay"></strike>
    <strike id="aymay"></strike>
    <ul id="aymay"><dfn id="aymay"></dfn></ul>
    <ul id="aymay"><sup id="aymay"></sup></ul>
  • <del id="aymay"></del>

    Modbus協(xié)議實(shí)現(xiàn)單片機(jī)與PLC之間通訊的設(shè)計(jì)

    2013-11-08 15:56 來(lái)源:互聯(lián)網(wǎng) 作者:洛小辰

    控制器能設(shè)置為兩種傳輸模式:ASCII和RTU,在同樣的波特率下,RTU可比ASCII方式傳送更多的數(shù)據(jù),所以采用KTU模式。

    (1) 典型的RTU消息幀

    典型的RTU消息幀如表1所示。

    41


    RTU消息幀的地址域包含8bit。可能的從設(shè)備地址是0...127(十進(jìn)制)。其中地址0是用作廣播地址,以使所有的從設(shè)備都能認(rèn)識(shí)。主設(shè)備通過(guò)將要聯(lián)絡(luò)的從設(shè)備的地址放入消息中的地址域來(lái)選通從設(shè)備。當(dāng)從設(shè)備發(fā)送回應(yīng)消息時(shí),它把自己的地址放入回應(yīng)的地址域中,以便主設(shè)備知道是哪一個(gè)設(shè)備作出回應(yīng)。

    RTU消息幀中的功能代碼域包含了8bits,當(dāng)消息從主設(shè)備發(fā)往從設(shè)備時(shí),功能代碼域?qū)⒏嬷畯脑O(shè)備需要執(zhí)行哪些行為;當(dāng)從設(shè)備回應(yīng)時(shí),它使用功能代碼域來(lái)指示是正常回應(yīng)(無(wú)誤)還是有某種錯(cuò)誤發(fā)生(稱作異議回應(yīng),一般是將功能碼的最高位由0改為1)。

    從主設(shè)備發(fā)給從設(shè)備消息的數(shù)據(jù)域包含附加的信息:從設(shè)備必須用于進(jìn)行執(zhí)行由功能代碼所定義的行為。這包括了像不連續(xù)的寄存器地址,要處理項(xiàng)的數(shù)目,域中實(shí)際數(shù)據(jù)字節(jié)數(shù)。如果沒(méi)有錯(cuò)誤發(fā)生,從從設(shè)備返回的數(shù)據(jù)域包含請(qǐng)求的數(shù)據(jù)。如果有錯(cuò)誤發(fā)生,此域包含一異議代碼,主設(shè)備應(yīng)用程序可以用來(lái)判斷采取下一步行動(dòng)。

    當(dāng)選用RTU模式作字符幀時(shí),錯(cuò)誤檢測(cè)域包含一16Bits值(用兩個(gè)8位的字符來(lái)實(shí)現(xiàn))。錯(cuò)誤檢測(cè)域的內(nèi)容是通過(guò)對(duì)消息內(nèi)容進(jìn)行循環(huán)冗長(zhǎng)檢測(cè)(CRC)方法得出的。CRC域附加在消息的最后,添加時(shí)先是低字節(jié)然后是高字節(jié)。

    (2) 所有的Modbus功能碼

    Modbus的功能碼定義如表2所示。

    42


    3 常用功能通訊程序的設(shè)計(jì)[5]

    本文介紹了幾個(gè)Modbus常用功能程序的設(shè)計(jì)。筆者采用單片機(jī)作為主機(jī),在單片機(jī)上編寫(xiě)程序?qū)崿F(xiàn)單片機(jī)與PLC之間的通訊。由單片機(jī)向PLC發(fā)出命令信息,PLC自動(dòng)作出回應(yīng)。PLC通過(guò)單片機(jī)的串行通訊口通訊,程序用C51實(shí)現(xiàn)。程序的子函數(shù)及其功能:

    (1) 串口初始化

    void ProtocolInit(void)

    函數(shù)功能:串口設(shè)置為異步通訊方式1(起始位1位,數(shù)據(jù)位8位,停止位1位);定時(shí)/計(jì)數(shù)器1設(shè)置為波特率發(fā)生器,通訊速率 9600bps;開(kāi)串行中斷,并把串行中斷設(shè)置為高優(yōu)先級(jí)。

    (2) CRC簡(jiǎn)單函數(shù)

    unsigned char Crc16(unsigned char *puchMsg, unsigned char usDataLen)

    函數(shù)功能:先調(diào)入一值是全“1”的16位寄存器,然后調(diào)用一過(guò)程將消息中連續(xù)的8位字節(jié)各當(dāng)前寄存器中的值進(jìn)行處理。每個(gè)8位字符都單獨(dú)和寄存器內(nèi)容相或 (OR),結(jié)果向最低有效位方向移動(dòng),最高有效位以0填充。LSB被提取出來(lái)檢測(cè),如果LSB為1,寄存器單獨(dú)和預(yù)置的值或一下,如果LSB為0,則不進(jìn)行。整個(gè)過(guò)程要重復(fù)8次。在最后一位(第8位)完成后,下一個(gè)8位字節(jié)又單獨(dú)和寄存器的當(dāng)前值相或。最終寄存器中的值,是消息中所有的字節(jié)都執(zhí)行之后的 CRC值。

    (3) 初始化變量

    void Initvar(void)

    函數(shù)功能:初始化所有過(guò)程變量。

    (4) 串行中斷服務(wù)程序

    void ProtocolSerialProcess(void) interrupt 4 using 2

    函數(shù)功能:發(fā)送中斷發(fā)送主機(jī)形成的命令數(shù)組,發(fā)送完后置標(biāo)志位;接收中斷接收PLC返回的響應(yīng)數(shù)組,存入接收數(shù)組,并置標(biāo)志位,且假設(shè)響應(yīng)正確,留待主機(jī)處理。

    (5) 讀N個(gè)位變量(線圈)

    void ProtocolRead_bit(unsigned char DeviceAddr/* PLC局號(hào)*/, unsigned char RegType/*寄存器類型*/, unsigned int BitAddr/*起始地址*/, unsigned char SubAddr/*子地址*/, unsigned int BitNum/*位數(shù)*/)

    函數(shù)功能:根據(jù)函數(shù)參數(shù),形成讀N個(gè)位變量的命令數(shù)組,啟動(dòng)發(fā)送。等待發(fā)送完并接收完(如超時(shí)未接收完則重新發(fā)送)。分析接收數(shù)組:正確,保存讀取的數(shù)據(jù);錯(cuò)誤,重新發(fā)送。

    (6) 寫(xiě)一個(gè)位變量

    void ProtocolSetBit(unsigned char DeviceAddr/* PLC局號(hào)*/, unsigned char RegType/*寄存器類型*/, unsigned int BitAddr/*地址*/, unsigned char SubAddr/*子地址*/, unsigned int ClrSet/*寫(xiě)值“1”或“0”*/)

    函數(shù)功能:根據(jù)函數(shù)參數(shù),形成置某位變量為“1”或“0”的命令數(shù)組,啟動(dòng)發(fā)送。等待發(fā)送完并接收完(如超時(shí)未接收完則重新發(fā)送)。分析接收數(shù)組:正確,返回;錯(cuò)誤,重新發(fā)送。

    (7) 讀N個(gè)字節(jié)變量

    void ProtocolReadByte(unsigned char DeviceAddr/* PLC局號(hào)*/, unsigned char RegType/*寄存器類型*/, unsigned int RegAddr/*起始地址*/, unsigned char SubAddr/*子地址*/, unsigned int RegNum/*個(gè)數(shù)*/)

    函數(shù)功能:根據(jù)函數(shù)參數(shù),形成讀N個(gè)字節(jié)變量的命令數(shù)組,啟動(dòng)發(fā)送。等待發(fā)送完并接收完(如超時(shí)未接收完則重新發(fā)送)。分析接收數(shù)組:正確,保存讀取的數(shù)據(jù);錯(cuò)誤,重新發(fā)送。

    (8) 寫(xiě)N個(gè)字節(jié)變量

    void ProtocolSetByte(unsigned char DeviceAddr/* PLC局號(hào)*/, unsigned char RegType/*寄存器類型*/, unsigned int RegAddr/*起始地址*/, unsigned char SubAddr/*子地址*/, unsigned int RegNum/*個(gè)數(shù)*/)

    函數(shù)功能:根據(jù)函數(shù)參數(shù),形成寫(xiě)N個(gè)字變量的命令數(shù)組(要寫(xiě)的數(shù)從某參數(shù)數(shù)組中讀取),啟動(dòng)發(fā)送。等待發(fā)送完并接收完(如超時(shí)未接收完則重新發(fā)送)。分析接收數(shù)組:正確,返回;錯(cuò)誤,重新發(fā)送。

    4 結(jié)束語(yǔ)

    以上的程序已經(jīng)通過(guò)實(shí)驗(yàn),并應(yīng)用于實(shí)際的人機(jī)系統(tǒng)中。依照類似的方法,可以編寫(xiě)其他不同功能的程序,實(shí)現(xiàn)對(duì)PLC的不同控制和操作。利用單片機(jī)和PLC進(jìn)行優(yōu)勢(shì)互補(bǔ),可以組成網(wǎng)絡(luò)化、智能化的工業(yè)控制系統(tǒng)。另外整個(gè)單片機(jī)系統(tǒng)程序用C51語(yǔ)言編程,程序簡(jiǎn)潔,便于閱讀與調(diào)試。單片機(jī)和人機(jī)界面結(jié)合可以實(shí)時(shí)的顯示PLC的工作狀況,實(shí)時(shí)的控制、設(shè)置、調(diào)整PLC工作情況,提高工業(yè)控制的自動(dòng)化程度和實(shí)時(shí)性。

    單片機(jī) PLC

    相關(guān)閱讀

    暫無(wú)數(shù)據(jù)

    一周熱門(mén)

    主站蜘蛛池模板: 精品人妻无码一区二区色欲产成人 | 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二 | 国产精品欧美久久久久天天影视| 日韩精品内射视频免费观看| 久久午夜无码鲁丝片午夜精品 | 亚洲精品自产拍在线观看动漫| 精品性影院一区二区三区内射| 亚洲国产精品成人久久蜜臀| 精品久久久久久无码中文字幕| 日韩一级精品视频在线观看| 国产成人精品日本亚洲专| 久久精品中文无码资源站| 亚洲精品无码成人片久久| 久久久久人妻一区精品果冻| 国产高清精品在线| 欧美视频精品一区二区三区 | 国产精品多人p群无码| 久久水蜜桃亚洲av无码精品麻豆| 亚洲а∨天堂久久精品9966| 久久夜色精品国产www| 久久久人妻精品无码一区| 国产精品午夜无码AV天美传媒| 777被窝午夜精品影院| 欧美黑人巨大精品| 久久99国产精品一区二区| 久久精品国产半推半就| 欧美激情精品久久久久| 国产成人精品大尺度在线观看| 国产99视频精品专区| 国产精品小视频免费无限app | 国产成人精品精品欧美| 国内精品91最新在线观看| 国产精品久久久久久搜索| 国产精品视频久久久| 欧美精品福利视频| 奇米精品一区二区三区在线观看| 亚洲精品国产成人专区| 成人国产精品日本在线观看| 99精品电影一区二区免费看| 国产精品免费一区二区三区| 精品国产香蕉伊思人在线在线亚洲一区二区 |