PLC如何與單片機進行通訊(單片機如何與電腦通信)
原創不易,請勿抄襲!
通訊是一個工控朋友學習或者工作到一定程度不得不面對的一個難題,可也是區別新手和高手的一道分水嶺,新手遇到通訊問題往往會比較抓狂,不知道如何著手,而老手即使面對沒有經驗的設備也會有一個大概的思路.有朋友問我關于西門子PLC與單片機通訊的問題,今天給大家匯總一下.
首先西門子PLC與單片機共有三種辦法進行信號交換:
1 信號線連接.這是一種最簡單的方式,即在單片機和PLC之間進行連接信號線,PLC的輸入接單片機輸出;PLC輸出接單片機輸入,這是一種最普遍的方式,通過這種方式PLC幾乎可以和任何工控的控制裝置連接,比如伺服系統,變頻器,機器人等等!缺點是如果需要傳遞的信號太多,那么電纜數量也會很大,而且一旦電纜損壞,維護起來很困難!
2 自由口通訊,以前我們多次講到過自由口通訊,而且專門講解過ASCII碼,有需要的朋友可以去我以前的文章里去找,今天不重復了。
3 第三種方法是利用ModBus協議進行通訊。
本節主要講解以PLC作主站,51單片機作從站,用ModBus協議進行通訊。PLC讀取單片機保持寄存器區的數據。S7-200PLC程序主要通過調用Modubs RTU 主站指令庫完成。
一、調用 Modbus RTU 主站初始化和控制子程序
使用 SM0.0 調用 MBUS_CTRL 完成主站的初始化,并啟動其功能控制:
各參數意義如下:
1 EN 使能:必須保證每一掃描周期都被使能(使用 SM0.0)
2 Mode 模式:為 1 時,使能 Modbus 協議功能;為 0 時恢復為系統 PPI 協議
3 Baud 波特率:支持的通訊波特率為1200,2400,4800,9600,19200,38400,57600,115200。
4 Parity 校驗:校驗方式選擇;0=無校驗,1=奇較驗,2=偶較驗。
5 Timeout 超時:主站等待從站響應的時間,以毫秒為單位,典型的設置值為 1000 毫秒(1 秒),允許設置的范圍為 1 - 32767。
注意: 這個值必須設置足夠大以保證從站有時間響應。
6 Done 完成位:初始化完成,此位會自動置1。可以用該位啟動 MBUS_MSG 讀寫操作(見例程)
7 Error 初始化錯誤代碼(只有在 Done 位為1時有效): 0= 無錯誤,1= 校驗選擇非法,2= 波特率選擇非法,3= 模式選擇非法。
二、調用 Modbus RTU 主站讀寫子程序MBUS_MSG,發送一個Modbus 請求;
各參數意義如下:
常見的錯誤:
如果多個 MBUS_MSG 指令同時使能會造成 6 號錯誤庫存儲區被程序其它地方復用,有時也會造成6 號錯誤從站 delay 參數設的時間過長會造成主站 3 號錯誤從站掉電或不運行,網絡故障都會造成主站 3 號錯誤。
含義如下:
1 EN 使能:同一時刻只能有一個讀寫功能(即 MBUS_MSG)使能
注意:建議每一個讀寫功能(即 MBUS_MSG)都用上一個 MBUS_MSG 指令的 Done 完成位來激活,以保證所有讀寫指令循環進行(見例程)。
2 First 讀寫請求位:每一個新的讀寫請求必須使用脈沖觸發
3 Slave 從站地址:可選擇的范圍 1 - 247
4 RW 從站地址:0 = 讀, 1 = 寫;注意:
1. 開關量輸出和保持寄存器支持讀和寫功能
2. 開關量輸入和模擬量輸入只支持讀功能
5 Addr 讀寫從站的數據地址:選擇讀寫的數據類型
00001 至 0xxxx - 開關量輸出
10001 至 1xxxx - 開關量輸入
30001 至 3xxxx - 模擬量輸入
40001 至 4xxxx - 保持寄存器
6 Count 數據個數;通訊的數據個數(位或字的個數)
注意: Modbus主站可讀/寫的最大數據量為120個字(是指每一個 MBUS_MSG 指令)
7 DataPtr 數據指針:
1. 如果是讀指令,讀回的數據放到這個數據區中
2. 如果是寫指令,要寫出的數據放到這個數據區中
8 Done 完成位 讀寫功能完成位
9 Error 錯誤代碼:只有在 Done 位為1時,錯誤代碼才有效
0 = 無錯誤
1 = 響應校驗錯誤
2 = 未用
3 = 接收超時(從站無響應)
4 = 請求參數錯誤(slave address, Modbus address, count, RW)
5 = Modbus/自由口未使能
6 = Modbus正在忙于其它請求
7 = 響應錯誤(響應不是請求的操作)
8 = 響應CRC校驗和錯誤
-
101 = 從站不支持請求的功能
102 = 從站不支持數據地址
103 = 從站不支持此種數據類型
104 = 從站設備故障
105 = 從站接受了信息,但是響應被延遲
106 = 從站忙,拒絕了該信息
107 = 從站拒絕了信息
108 = 從站存儲器奇偶錯誤
三、需要從站支持的功能及Modbus 保持寄存器地址映射
為了支持上述 Modbus 地址的讀寫,Modbus Master 協議庫需要從站支持下列功能:
Modbus 保持寄存器地址映射舉例:
四、S7-200PLC程序
五、單片機程序;STC11F04E單片機,9600波特率
START: MOV TMOD,#21H ;定時器1是8位再裝入,定時器0為16位定時器
MOV TH1,#0FDH;預置初值(按照波特率9600BPS預置初值)
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 ;串口中斷優先
SETB TR1 ;啟動定時器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 看門狗設置使能
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 ;啟動定時器0
;ANL AUX,#07FH ;p3.0p3.1當串口
ORL AUX,#80H ;p1.7,p1.6當串口
CLR P3.7 ;485芯片接收使能
WA1: ;MOV WDT_CONTR ,#37H;喂狗; SETB CW
JNB FLAG_0,WA1 ;FLAG_0=1表示已經接收到上位機數據
CLR TR0
MOV A,2CH ;檢查設備地址是01h碼,設本機地址碼是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 ;向主機發送數據子程序
FZJ0: MOV R2,#10H
FZJ1: CLR EA
ANL AUX,#07FH ;p3.0p3.1當串口
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 ;發送數據
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
用串口助手檢測到的數據如下圖。
