|
這幾天測(cè)試西門子200PLC和組態(tài)王自由口方式進(jìn)行通信。 因?yàn)橐郧皼]做過這方面的通信,組態(tài)王也只熟悉一點(diǎn),所以網(wǎng)上找點(diǎn)資料看看。 原以為很簡單的通信,感覺就是觸摸屏和PLC通信那樣,簡單配置一下參數(shù):地址、波特率等。 現(xiàn)在看來還真是差不多,只是要看的資料很多,結(jié)合起來看,弄清楚兩者之間的通信協(xié)議。 明白之后就很簡單。 整理下測(cè)試程序和大家分享下,歡迎指導(dǎo),學(xué)習(xí),分享。 (1)下圖是西門子200PLC編程軟件的通信端口設(shè)置:和組態(tài)王里面設(shè)置要一致; (2)下圖是PLC編程,需要下載亞控的一個(gè)初始化程序。 測(cè)試程序如下: 測(cè)試地址如下: (3)下圖是組態(tài)王操作: 和PLC中的一致: 數(shù)據(jù)詞典的操作 定義變量: 測(cè)試畫面制作: (4)下圖是兩者通信的截圖: (5)總結(jié) 組態(tài)王和200PLC之間協(xié)議 選取其中一點(diǎn),這個(gè)沒怎么看懂,歡迎大家指導(dǎo)。 上位機(jī)發(fā)送讀指令: BYTE1: PLC地址 (1~255) BYTE2: 0x00 (讀指令代碼) BYTE3: 寄存器類型(0-V, 1-Q, 2-I) BYTE4-5: 起始偏移地址(0-9999) BYTE6: 數(shù)據(jù)個(gè)數(shù)(1~32 n) BYTE7: 數(shù)據(jù)類型(1,2,4 m) BYTE8-11: 保留 BYTE12: 校驗(yàn)字節(jié) PLC應(yīng)答: 讀成功時(shí): BYTE1: PLC地址 (1~255) BYTE2: 0x00 (讀指令代碼) BYTE3: 寄存器類型(0-V, 1-Q, 2-I) BYTE4-5: 起始偏移地址(0-9999) BYTE6: 數(shù)據(jù)個(gè)數(shù)(1~32 n) BYTE7: 數(shù)據(jù)類型(1,2,4 m) BYTE8-n*m+8: 數(shù)據(jù) BYTEn*m+9: 校驗(yàn)字節(jié) MAIN LD SM0.1 CALL SBR_0:SBR0 //初始化子程序 LD SM0.7 = SM30.0
SBR_0:初始化子程序SUBROUTINE COMMENTS Press F1 for help and example program LD SM0.0 MOVW +2, VW8 //PLC自由口地址,此處每臺(tái)機(jī)器需設(shè)不同的地址 LD SM0.0 MOVB 9, SMB30 //通訊參數(shù),波特率9600,自由口通訊 MOVD &VB100, VD40// VB100:接收緩沖區(qū)的首字節(jié) MOVW +10, VW54// VW54:存放發(fā)送數(shù)據(jù)按字節(jié)異或校驗(yàn)的次數(shù),10次校驗(yàn)完已//接收了11個(gè)字節(jié)了,最后一個(gè)12號(hào)字節(jié)是校驗(yàn)。 MOVB 12, VB150 MOVB VB9, VB151// VB151賦以本機(jī)地址 MOVD &VB151, VD60// 發(fā)送首地址VD60賦以地址 MOVB 6, SMB34 ATCH INT_0:INT0, 10 ATCH INT_1:INT1, 8 ENI
INT_0://用作初始化幾個(gè)參數(shù)。每次接受新一幀數(shù)據(jù)前調(diào)用,完了就進(jìn)入INT_2(接受地址,//并判斷,) LD SM0.0 DTCH 10 MOVD VD40, VD46//初始化 VD46為VD40 MOVW +10, VW44//初始化異或校驗(yàn)的次數(shù) MOVW +10, VW54//初始化異或校驗(yàn)的次數(shù) ATCH INT_2:INT2, 8 //接受中斷起用服務(wù)程序INT2 INT_1://延時(shí)轉(zhuǎn)向INT0//網(wǎng)絡(luò)正常時(shí)這里應(yīng)該很少調(diào)用 LD SM0.0 MOVB 5, SMB34 ATCH INT_0:INT0, 10 INT_2:接受地址,并判斷 LDB= SMB2, VB9 //地址和本機(jī)相符 MOVW VW8, AC0// AC0這時(shí)存入的是本機(jī)地址 MOVB 255, SMB34//255MS的長延時(shí)監(jiān)控,如超過將做異常處理回到初始化重新再來接//收,要知道傳送一個(gè)字節(jié)是毫秒級(jí)的。就是200字節(jié)左右看做異常 ATCH INT_3:INT3, 8 //起用中斷服務(wù)INT3,接受包 ATCH INT_5:INT5, 10 //起用延時(shí)監(jiān)控服務(wù)INT5 CRETI LDB= SMB2, VB9 //地址和本機(jī)不符 NOT ATCH INT_0:INT0, 10 //返回中斷入口 ATCH INT_1:INT1, 8 INT_3://主接受服務(wù)程序,同時(shí)做異或校驗(yàn) LD SM0.0 XORW SMW1, AC0// AC0上次已存入本機(jī)地址,這次做第一次異或,記住異或的次數(shù) MOVB SMB2, *VD46// 指針VD46這時(shí)指向VB100,即將讀寫代碼存入VB100 INCD VD46//指針VD46指向VB101 DECW VW44//異或的次數(shù)VW44-1=10-1=9 LD SM1.0 //完成預(yù)定的接受字節(jié)數(shù)//10次異或完就接收11 //個(gè)字節(jié),一楨是12個(gè)字節(jié),第12字節(jié)是校驗(yàn)位, ATCH INT_4:INT4, 8 //起用通訊數(shù)據(jù)處理主程序//第12字節(jié)交INT4比較//處理 INT4://通訊數(shù)據(jù)處理主服務(wù)程序 LD SM0.0 BMB VB100, VB152, 6//接受報(bào)頭拷貝到發(fā)送報(bào)頭// VB100存讀寫代碼,VB151賦以本 //機(jī)地址,VB152存讀寫代碼 LD SM0.0 DTCH 8 //暫停響應(yīng)接受中斷 INCD VD46// VD46這時(shí)指向VB111, MOVB SMB2, *VD46//校驗(yàn)位存入*VD46即VB111 XORW SMW1, AC0// AC0是前11個(gè)字節(jié)的異或 ANDW 16#FF, AC0 //檢查異或校驗(yàn) LDN SM1.0 //異或校驗(yàn)錯(cuò)誤 MOVB VB100, AC0// VB100存讀寫代碼 MOVB 16#80, AC1 ORW AC0, AC1//這步運(yùn)算,如讀AC1=0X80,如寫AC1=0X81 MOVB AC1, VB152// VB152存入發(fā)送幀的BYTE2,VB151是BYTE1:本機(jī)地址 MOVB 16#1, VB158// VB158:BYTE8: 0x01(校驗(yàn)錯(cuò)代碼) MOVW +10, VW54//10次異或的次數(shù) JMP 3 //校驗(yàn)錯(cuò)誤,向PC返回錯(cuò)誤碼 LD SM1.0 //異或正確//兩數(shù)相同異或結(jié)果=0,很好理解 MOVW +4, VW34 ATCH INT_8:INT8, 8 //起用服務(wù)程序INT8響應(yīng)接受中斷,接受包尾 LD SM0.0 //數(shù)據(jù)處理 |
|
|