|
自由口模式允許應用程序控制S7-200 CPU的通訊端口,使用PC/PPI電纜和自由口功能,可以將S7-200連接到帶有RS-232兼容接口的多種設備,比如調(diào)制解調(diào)器。這里我們將介紹如何用S7-200連接GSM調(diào)制解調(diào)器發(fā)送短消息,并通過這個例子來介紹應用S7-200自由口編程的一般原則時及應注意的問題。 在下面的例子中我們將用到: 1. PC/PPI電纜(10位;9 600波特;DIP開關設置:01 0 1 1) 2. 西門子S7-200 CPU22X 3. TC35 Terminal GSM調(diào)制解調(diào)器 4. 一個9直通針轉(zhuǎn)接頭(用來連結(jié)PC/PPI電纜與TC35 Terminal調(diào)制解調(diào)器) 5. 一根九針直通電纜(用來連結(jié)計算機與TC35Terminal調(diào)制解調(diào)器) 6. STEP 7-Micro/Win V3.2或更高版本軟件 一、 TC35 調(diào)制解調(diào)器AT指令簡介 要使用TC35發(fā)送短消息需要使用TC35的AT指令,我們首先介紹如何用Windows自帶的超級終端連接TC35發(fā)送短消息。 1. 用九針直通的電纜將TC35連接到計算機的串口上 2. 打開超級終端(開始à程序à附件à通訊à超級終端) 3.為連接取名Connect to TC35T 4. 選擇TC35連接的串口COM1 5.按照下圖的參數(shù)設置端口。19 200 bps為TC35默認的端口波特率,如 果該波特率已被更改,請選擇正確的波特率 6.在窗口中鍵入AT回車測試與TC35的連接,如果連接正確,TC35將返回OK 7.TC35可以發(fā)送兩種格式的短消息,普通文本格式和PDU格式。應用普通 文本格式時,短消息內(nèi)容以ASCII碼格式直接輸入,操作比較簡單,缺 點是只能發(fā)送英文短消息;應用PDU格式時,短消息內(nèi)容以Unicode格 式輸入,可以發(fā)送任何文字,缺點是短消息內(nèi)容需要轉(zhuǎn)換成Unicode 碼,并且要把短消息按PDU格式打包,操作比較復雜(編程復雜)通 過指令 AT+CMGF=0設置TC35以PDU格式發(fā)送短消息(默 認),AT+CMGF=1設置TC35以普通文本格式發(fā)送短消息。 8. 如何以普通文本格式發(fā)送短消息可以在S7-200的網(wǎng)站上找到http://www.ad./applic/s7-200/modem.asp,這里我們將介紹如何發(fā)送中文短消息。要發(fā)送中文短消息必須把短消息內(nèi)容轉(zhuǎn)換成Unicode碼,并按照PDU格式打包發(fā)送給TC35。PDU數(shù)據(jù)格式涉及手機開發(fā)的相關知識,我們不作詳細介紹,這里指給出一個標準格式供大家使用。以下就是一個PDU格式的數(shù)據(jù)包: 0001000D91683108214365F700080459296C14 其中,紅色的數(shù)字(3108214365F7)代表對方的手機號碼,在PDU格 式中,手機號碼每兩位需要對調(diào)。比如在上面這個例子里,對方的手機號碼為13801234567,F用來補充7后面的空位。藍色的數(shù)字(59296C14)是短消息內(nèi)容的Unicode碼,這里5929代表“天” 6C14代表“氣”。Unicode碼同樣可以用來表示中一般英文字母和數(shù)字,方法是在英 文或數(shù)字的ASCII碼前加00。紫色的數(shù)字(04)代表短消息的長度,它等于其后所有 字符個數(shù)除以2。黑色的數(shù)字每次發(fā)送短消息時都是相同的,使用時可以照抄,但 前提是所使用的SIM卡在使用前要用手機設置好短消息服務中心號碼 (+8613800100500)。漢字的Unicode碼可以通過編碼轉(zhuǎn)換軟件得到,我們使用 的是Megaton Technology公司的一個編碼轉(zhuǎn)換軟件 9.在使用PDU格式發(fā)送短消息時,還必須計算整個PDU數(shù)據(jù)包的長度,PDU數(shù)據(jù)包的長度等于(PDU數(shù)據(jù)包字符數(shù)-2)/2,在上面的例子里:(38-2)/2=18。發(fā)送短消息時,我們先向TC35發(fā)送AT+CMGS= 如果短消息被成功的發(fā)送,TC35會返回+CMGS: x,其中“x”代表該模塊以及發(fā)送的短消息個數(shù),同時返回OK。 二、 設置TC35 在將TC35連接到S7-200之前我們先要對TC35作一些設置,使其適合與PLC通訊。 1.通過指令AT+IPR=9600設置TC35的端口波特率為9 600 bps 2.重新建立一個波特率為9 600 bps的連接,用指令ATE0禁止回波功能。回波功能使調(diào)制解調(diào)器將收到的指令回發(fā)給發(fā)送方,這項功能會給PLC編程來來不便,當禁止回波功能后,TC35只返回指令執(zhí)行的結(jié)果,比如OK等等 3. 鍵入AT&W0回車將當前設置存為用戶配置文件(掉電保持),再鍵 入ATZ0以用戶配置文件重新啟動。此后TC35重新上電時將按照前面所 作的設置啟動 三、 PLC編程 現(xiàn)在,我們已經(jīng)知道如何用AT指令發(fā)送短消息,剩下的工作是用PLC程序來發(fā)送這些AT指令。S7-200的通訊端口為RS-485接口,RS-485接口為半雙工接口,因此,編寫PLC程序的關鍵是避免在通訊端口上同時發(fā)送和接收。我們下面將介紹一種標準的編程模式,按照這種模式編寫自由口通訊程序可以有效的避免因同時發(fā)送和接收造成的通訊沖突,從而保證程序的正常運行。 1.初始化 Network 1LD SM0.1 MOVB 9, SMB30 MOVB 2#11000100,SMB87 MOVB '>', SMB88 MOVW +5, SMW92 MOVB 255, SMB94 ATCH INT_0, 23 ATCH INT_1, 9 ENI 將上面這段程序添加到主程序中,對PLC的端口0進行初始化。這段程序以SM0.1為觸發(fā)條件,每當PLC進入RUN狀態(tài)時執(zhí)行一次。
2. 接收TC35的信息 Network 2LD SM0.0 RCV VB100, 0 在初始化程序中,端口0以被允許接收來自TC35的信息,在主程序中添加上面的程序?qū)⒍丝?/span>0置于接收狀態(tài)。這時端口0將檢測收到的字符,當收到”>”時即開始接收,并把收到的信息保存到VB101開始的存儲器中(VB100中將保存每次收到的字符的個數(shù),當接收結(jié)束時,該位置被清零)。 3. 發(fā)AT指令 PLC要向TC35發(fā)送兩部分內(nèi)容來發(fā)送一條短消息,首先是AT指令(AT+CMGS=18),當收到”>”后,發(fā)送PDU數(shù)據(jù)包。這里,我們用M0.0的上升沿來觸發(fā)PLC發(fā)送AT指令。在主程序中添加下面指令 Network 3LD M0.0 EU R SM87.7, 1 RCV VB100, 0 XMT VB0, 0
這里需要特別注意的是,在初始化程序中,端口0已被置為接收狀態(tài),此時如果直接發(fā)送AT指令,將會導致端口0發(fā)生通訊沖突,而導致其不能正常工作。因此,我們在發(fā)送指令前必須先禁止接收(將SM87.7復0)然后執(zhí)行RCV指令,RCV指令執(zhí)行時將會檢測SM87.7的狀態(tài),當發(fā)現(xiàn)SM87.7=0時,即停止端口0的接收。這里我們建議,在使用XMT指令前,首先執(zhí)行R SM87.7, 1、RCV VB100, 0兩條指令(VB100可以換成其他地址)。 XMT指令指向VB0,我們將AT指令寫在VB0開始的數(shù)據(jù)塊中 4. 發(fā)送PDU數(shù)據(jù)包 當AT指令發(fā)送完成時,PLC會產(chǎn)生一個中斷,在初始化程序中,我們已經(jīng)將這個中斷連接到INT_1(ATCH INT_1, 9),在這個中斷中,我們重新把端口0置于接收狀態(tài),用來接收TC35返回的“>“,同時我們將M0.0復位以便檢測下一次發(fā)送請求并清空RCV指令的接收緩沖區(qū)。將下面指令添加到INT_1中: Network 1LD M0.0 S SM87.7, 1 RCV VB100, 0R M0.0, 1 Network 2LD SM0.0 FILL +0, VW100, 10 TC35接收到AT+CMGS=18后,返回”>”,PLC接收到”>”后開始將接收到的字符保存到VB101開始的存儲區(qū),并且每接收一個字符即啟動定時器,超過5 ms仍接收不到下一個字符時,就認為本次接收已經(jīng)完成,產(chǎn)生接收完成中斷。在初始化程序中我們已經(jīng)將該中斷連接到INT_0(ATCH INT_0, 23)。將下面指令添加到INT_0中: Network 1LDB= VB101, '>' S M0.1, 1 在中斷程序中不易執(zhí)行過多程序,因此我們在這里判斷VB101是否為”>”,如果是則表示TC35等待接收PDU數(shù)據(jù),我們通過M0.1在主程序中觸發(fā)發(fā)送PDU數(shù)據(jù)。將下面這段程序添加到主程序中: Network 4LD M0.1 EUR SM87.7, 1 RCV VB100, 0XMT VB20, 0 與發(fā)送AT指令一樣,我們首先要停止端口0的接收,然后發(fā)送PDU數(shù)據(jù)包,PDU數(shù)據(jù)包保存在VB21開始的數(shù)據(jù)塊中,VB20中保存XMT指令要發(fā)送的字節(jié)數(shù)目。
5. 判斷發(fā)送狀態(tài) 在發(fā)送完成中斷中,我們要重新置端口0為接收狀態(tài),同時復位M0.1,并將RCV指令判斷的起始字符由原來的”>”改為”+”,因為TC35接收到PDU數(shù)舉包后會返回”+CMGS: x”表示發(fā)送成功,或者” +CMS ERROR: 500”表示發(fā)送失敗,將下面的指令添加到INT_1中 Network 3LD M0.1 S SM87.7, 1 MOVB '+', SMB88 RCV VB100, 0 R M0.1, 1
在接收完成中斷中(INT_0)我們可以通過判斷VB104的狀態(tài)來判斷發(fā)送是否成功,如果發(fā)送成功,VB104=”G”,如果不成功VB104=”S”。將下面的指令添加到INT_0中 Network 2LDB= VB104, 'G' MOVB '>', SMB88Network 3LDB= VB104, 'S' MOVB '>', SMB88 S M0.0, 1 如果成功則將RCV指令的起始字符恢復為”>”,如果不成功則將RCV指令的起始字符恢復為”>”同時置位M0.0重新發(fā)送短消息。 將整個程序下載到PLC中,每次置位M0.0即可以向13801234567發(fā)送一條短消息,短消息內(nèi)容為“天氣”。只要更改數(shù)據(jù)塊中的內(nèi)容,即可向不同的手機號碼發(fā)送不同內(nèi)容的短消息。整個程序如下: MAINNetwork 1LD SM0.1 MOVB 9, SMB30 MOVB 2#11000100, SMB87 MOVB '>', SMB88 MOVW +5, SMW92 MOVB 255, SMB94 ATCH INT_0, 23 ATCH INT_1, 9 ENI Network 2LD SM0.0 RCV VB100, 0 Network 3LD M0.0 EU R SM87.7, 1 RCV VB100, 0 XMT VB0, 0 Network 4LD M0.1 EU R SM87.7, 1 RCV VB100, 0 XMT VB20, 0
INT_0Network 1LDB= VB101, '>' S M0.1, 1 Network 2LDB= VB104, 'G' MOVB '>', SMB88 Network 3LDB= VB104, 'S' MOVB '>', SMB88 S M0.0, 1
INT_1Network 1LD M0.0 S SM87.7, 1 RCV VB100, 0 R M0.0, 1 Network 2LD SM0.0 FILL +0, VW100, 10 Network3 LD M0.1 S SM87.7, 1 MOVB '+', SMB88 RCV VB100, 0 R M0.1, 1
四、 總結(jié) 這里我們總結(jié)以下自由口編程的一般原則: 1. SM0.1觸發(fā)端口初始化,連接發(fā)送完成和接收完成中斷(中斷事件9和23) 2. SM0.0觸發(fā)RCV指令 3. XMT指令用上升沿觸發(fā),并在指令運行前先停止端口0的接收(復位SM87.7,執(zhí)行RCV指令) 4. 在發(fā)送完成中斷中,重新置端口0為接收狀態(tài)(置位SM87.7,執(zhí)行RCV指令),清空RCV指令的接收緩沖區(qū) 5. 盡量減少在中斷程序中編程,如果時間允許僅在中斷程序中置標志位,然后在主程序中掃描該位執(zhí)行具體的程序 根據(jù)將要接收信息的不同,合理設置SMB87~SMB94
|
|
|