PLC如何與單片機(jī)進(jìn)行通訊(單片機(jī)如何與電腦通信)
原創(chuàng)不易,請(qǐng)勿抄襲!
通訊是一個(gè)工控朋友學(xué)習(xí)或者工作到一定程度不得不面對(duì)的一個(gè)難題,可也是區(qū)別新手和高手的一道分水嶺,新手遇到通訊問題往往會(huì)比較抓狂,不知道如何著手,而老手即使面對(duì)沒有經(jīng)驗(yàn)的設(shè)備也會(huì)有一個(gè)大概的思路.有朋友問我關(guān)于西門子PLC與單片機(jī)通訊的問題,今天給大家匯總一下.
首先西門子PLC與單片機(jī)共有三種辦法進(jìn)行信號(hào)交換:
1 信號(hào)線連接.這是一種最簡(jiǎn)單的方式,即在單片機(jī)和PLC之間進(jìn)行連接信號(hào)線,PLC的輸入接單片機(jī)輸出;PLC輸出接單片機(jī)輸入,這是一種最普遍的方式,通過這種方式PLC幾乎可以和任何工控的控制裝置連接,比如伺服系統(tǒng),變頻器,機(jī)器人等等!缺點(diǎn)是如果需要傳遞的信號(hào)太多,那么電纜數(shù)量也會(huì)很大,而且一旦電纜損壞,維護(hù)起來很困難!
2 自由口通訊,以前我們多次講到過自由口通訊,而且專門講解過ASCII碼,有需要的朋友可以去我以前的文章里去找,今天不重復(fù)了。
3 第三種方法是利用ModBus協(xié)議進(jìn)行通訊。
本節(jié)主要講解以PLC作主站,51單片機(jī)作從站,用ModBus協(xié)議進(jìn)行通訊。PLC讀取單片機(jī)保持寄存器區(qū)的數(shù)據(jù)。S7-200PLC程序主要通過調(diào)用Modubs RTU 主站指令庫完成。
一、調(diào)用 Modbus RTU 主站初始化和控制子程序
使用 SM0.0 調(diào)用 MBUS_CTRL 完成主站的初始化,并啟動(dòng)其功能控制:
各參數(shù)意義如下:
1 EN 使能:必須保證每一掃描周期都被使能(使用 SM0.0)
2 Mode 模式:為 1 時(shí),使能 Modbus 協(xié)議功能;為 0 時(shí)恢復(fù)為系統(tǒng) PPI 協(xié)議
3 Baud 波特率:支持的通訊波特率為1200,2400,4800,9600,19200,38400,57600,115200。
4 Parity 校驗(yàn):校驗(yàn)方式選擇;0=無校驗(yàn),1=奇較驗(yàn),2=偶較驗(yàn)。
5 Timeout 超時(shí):主站等待從站響應(yīng)的時(shí)間,以毫秒為單位,典型的設(shè)置值為 1000 毫秒(1 秒),允許設(shè)置的范圍為 1 - 32767。
注意: 這個(gè)值必須設(shè)置足夠大以保證從站有時(shí)間響應(yīng)。
6 Done 完成位:初始化完成,此位會(huì)自動(dòng)置1??梢杂迷撐粏?dòng) MBUS_MSG 讀寫操作(見例程)
7 Error 初始化錯(cuò)誤代碼(只有在 Done 位為1時(shí)有效): 0= 無錯(cuò)誤,1= 校驗(yàn)選擇非法,2= 波特率選擇非法,3= 模式選擇非法。
二、調(diào)用 Modbus RTU 主站讀寫子程序MBUS_MSG,發(fā)送一個(gè)Modbus 請(qǐng)求;
各參數(shù)意義如下:
常見的錯(cuò)誤:
如果多個(gè) MBUS_MSG 指令同時(shí)使能會(huì)造成 6 號(hào)錯(cuò)誤庫存儲(chǔ)區(qū)被程序其它地方復(fù)用,有時(shí)也會(huì)造成6 號(hào)錯(cuò)誤從站 delay 參數(shù)設(shè)的時(shí)間過長會(huì)造成主站 3 號(hào)錯(cuò)誤從站掉電或不運(yùn)行,網(wǎng)絡(luò)故障都會(huì)造成主站 3 號(hào)錯(cuò)誤。
含義如下:
1 EN 使能:同一時(shí)刻只能有一個(gè)讀寫功能(即 MBUS_MSG)使能
注意:建議每一個(gè)讀寫功能(即 MBUS_MSG)都用上一個(gè) MBUS_MSG 指令的 Done 完成位來激活,以保證所有讀寫指令循環(huán)進(jìn)行(見例程)。
2 First 讀寫請(qǐng)求位:每一個(gè)新的讀寫請(qǐng)求必須使用脈沖觸發(fā)
3 Slave 從站地址:可選擇的范圍 1 - 247
4 RW 從站地址:0 = 讀, 1 = 寫;注意:
1. 開關(guān)量輸出和保持寄存器支持讀和寫功能
2. 開關(guān)量輸入和模擬量輸入只支持讀功能
5 Addr 讀寫從站的數(shù)據(jù)地址:選擇讀寫的數(shù)據(jù)類型
00001 至 0xxxx - 開關(guān)量輸出
10001 至 1xxxx - 開關(guān)量輸入
30001 至 3xxxx - 模擬量輸入
40001 至 4xxxx - 保持寄存器
6 Count 數(shù)據(jù)個(gè)數(shù);通訊的數(shù)據(jù)個(gè)數(shù)(位或字的個(gè)數(shù))
注意: Modbus主站可讀/寫的最大數(shù)據(jù)量為120個(gè)字(是指每一個(gè) MBUS_MSG 指令)
7 DataPtr 數(shù)據(jù)指針:
1. 如果是讀指令,讀回的數(shù)據(jù)放到這個(gè)數(shù)據(jù)區(qū)中
2. 如果是寫指令,要寫出的數(shù)據(jù)放到這個(gè)數(shù)據(jù)區(qū)中
8 Done 完成位 讀寫功能完成位
9 Error 錯(cuò)誤代碼:只有在 Done 位為1時(shí),錯(cuò)誤代碼才有效
0 = 無錯(cuò)誤
1 = 響應(yīng)校驗(yàn)錯(cuò)誤
2 = 未用
3 = 接收超時(shí)(從站無響應(yīng))
4 = 請(qǐng)求參數(shù)錯(cuò)誤(slave address, Modbus address, count, RW)
5 = Modbus/自由口未使能
6 = Modbus正在忙于其它請(qǐng)求
7 = 響應(yīng)錯(cuò)誤(響應(yīng)不是請(qǐng)求的操作)
8 = 響應(yīng)CRC校驗(yàn)和錯(cuò)誤
-
101 = 從站不支持請(qǐng)求的功能
102 = 從站不支持?jǐn)?shù)據(jù)地址
103 = 從站不支持此種數(shù)據(jù)類型
104 = 從站設(shè)備故障
105 = 從站接受了信息,但是響應(yīng)被延遲
106 = 從站忙,拒絕了該信息
107 = 從站拒絕了信息
108 = 從站存儲(chǔ)器奇偶錯(cuò)誤
三、需要從站支持的功能及Modbus 保持寄存器地址映射
為了支持上述 Modbus 地址的讀寫,Modbus Master 協(xié)議庫需要從站支持下列功能:
Modbus 保持寄存器地址映射舉例:
四、S7-200PLC程序
五、單片機(jī)程序;STC11F04E單片機(jī),9600波特率
START: MOV TMOD,#21H ;定時(shí)器1是8位再裝入,定時(shí)器0為16位定時(shí)器
MOV TH1,#0FDH;預(yù)置初值(按照波特率9600BPS預(yù)置初值)
MOV TL1,#0FDH; 0FDH=9600=11.0592
MOV TH0, #0DCH;88H ;8800=12t,7000=stc1t
MOV TL0, #00H
ORL IE, #92H ;EA=1,ES=1;ET0=1
SETB PS ;串口中斷優(yōu)先
SETB TR1 ;啟動(dòng)定時(shí)器1
MOV 98H,#50H ;scon
MOV P1M0,#01000000b ; P1M0=0 P1M1=0雙向口 P1M0=1 P1M1=0輸入口 P1M0=0 P1M1=1推挽輸出20ma
MOV P1M1,#10000000b
MOV WDT_CONTR ,#27H 看門狗設(shè)置使能
QL0: MOV A,#00H
MOV R0,#10H
MOV R2,#9BH ;10-ABH清零
CLEAR: MOV @R0,A
INC R0
DJNZ R2,CLEAR
CLR FLAG
CLR FLAG_0
SETB TR0 ;啟動(dòng)定時(shí)器0
;ANL AUX,#07FH ;p3.0p3.1當(dāng)串口
ORL AUX,#80H ;p1.7,p1.6當(dāng)串口
CLR P3.7 ;485芯片接收使能
WA1: ;MOV WDT_CONTR ,#37H;喂狗; SETB CW
JNB FLAG_0,WA1 ;FLAG_0=1表示已經(jīng)接收到上位機(jī)數(shù)據(jù)
CLR TR0
MOV A,2CH ;檢查設(shè)備地址是01h碼,設(shè)本機(jī)地址碼是1
MOV R2,A
XRL A,#01H
JNZ QL0
ACALL FSZJ ;FH: DB 01H,03H,16,00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,10H,11H,12H,0DH,0EH,0FH,10H,11H,12H,13H,14H,15H,16H,17H,18H,19H,1AH,1BH,1CH,1DH,1EH,1FH;18
ACALL DELAY
CALL FZJ
AJMP QL0
FZJ: MOV R0,#2cH ;向主機(jī)發(fā)送數(shù)據(jù)子程序
FZJ0: MOV R2,#10H
FZJ1: CLR EA
ANL AUX,#07FH ;p3.0p3.1當(dāng)串口
FZL1: MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
DJNZ R2,FZL1
SETB EA
RET
FSZJ: MOV DPTR,#FH
MOV R2,#19;
ORL AUX,#80H
SETB P3.7 ;發(fā)送數(shù)據(jù)
MOV R0,#40H
FSZJA: MOV A,#0H
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R2,FSZJA
MOV R0,#40H
MOV CRCCD,#19
LCALL CRC1
MOV R2,#21
MOV R0,#40H
FSZJ2: MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
DJNZ R2,FSZJ2
SETB EA
RET
FH:DB 01H,03H,16,00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,10H,11H,12H,0DH,0EH,0FH,10H,11H,12H,13H,14H,15H,16H,17H,18H,19H,1AH,1BH,1CH,1DH,1EH,1FH;18
用串口助手檢測(cè)到的數(shù)據(jù)如下圖。
