S7-200 自由口通信
S7-200自由口通信簡(jiǎn)介
S7-200 CPU的通信口可以設置為自由口模式。選擇自由口模式后,用戶(hù)程序就可以完全控制通信端口的操作,通信協(xié)議也完全受用戶(hù)程序控制。一般用于和第三方串行通信設備進(jìn)行通信。
自由口模式可以靈活應用。Micro/WIN的兩個(gè)指令庫(USS和Modbus RTU)就是使用自由口模式編程實(shí)現的。
在進(jìn)行自由口通信程序調試時(shí),可以使用PC/PPI電纜(設置到自由口通信模式)連接PC和CPU,在PC上運行串口調試軟件(或者Windows的Hyper Terminal-超級終端)調試自由口程序。
1自由口通信基本概念
S7-200PLC的通訊口支持RS485接口標準。采用正負兩根信號線(xiàn)作為傳輸線(xiàn)路。
工作模式采用串行半雙工形式,在任意時(shí)刻只允許由一方發(fā)送數據,另一方接收數據。
數據傳輸采用異步方式,傳輸的單位是字符,收發(fā)雙方以預先約定的傳輸速率,在時(shí)鐘的作用下,傳送這個(gè)字符中的每一位。
傳輸速率可以設置為1200、2400、4800、9600、19200、38400、57600、115200。
字符幀格式為一個(gè)起始位、7或8個(gè)數據位、一個(gè)奇/偶校驗位或者無(wú)校驗位、一個(gè)停止位。
字符傳輸從最低位開(kāi)始,空閑線(xiàn)高電平、起始位低電平、停止位高電平。字符傳輸時(shí)間取決于波特率。
數據發(fā)送可以是連續的也可以是斷續的。所謂連續的數據發(fā)送,是指在一個(gè)字符格式的停止位之后,立即發(fā)送下一個(gè)字符的起始位,之間沒(méi)有空閑線(xiàn)時(shí)間。而斷續的數據發(fā)送,是指當一個(gè)字符幀發(fā)送后,總線(xiàn)維持空閑的狀態(tài),新字符起始位可以在任意時(shí)刻開(kāi)始發(fā)送,即上一個(gè)字符的停止位和下一個(gè)字符的起始位之間有空閑線(xiàn)狀態(tài)。
示例:用PLC連續的發(fā)送兩個(gè)字符(16#55和16#EE)(程序如圖3和圖4),通過(guò)示波器測量CPU通訊端口管腳3/8之間的電壓,波形如下圖1.:
圖1.兩個(gè)字符(16#55和16#EE)的波形圖
示例說(shuō)明:
16進(jìn)制的16#55換算成2進(jìn)制等于2#01010101,16進(jìn)制的16#EE換算成2進(jìn)制等于2#11101110。如圖所示,當數據線(xiàn)上沒(méi)有字符發(fā)送時(shí)總線(xiàn)處于空閑狀態(tài)(高電平),當PLC發(fā)送第一個(gè)字符16#55時(shí),先發(fā)送該字符幀的起始位(低電平),再發(fā)送它的8個(gè)數據位,依次從數據位的最低位開(kāi)始發(fā)送(分別為1、0、1、0、1、0、1、0),接著(zhù)發(fā)送校驗位(高電平或低電平或無(wú))和停止位(高電平)。因為本例中PLC連續的發(fā)送兩個(gè)字符,所以第一個(gè)字符幀的停止位結束后便立即發(fā)送下一個(gè)字符幀的起始位,之間數據線(xiàn)沒(méi)有空閑狀態(tài)。假如PLC斷續的發(fā)送這兩個(gè)字符,那么當PLC發(fā)送完第一個(gè)字符幀的停止位后,數據線(xiàn)將維持一段時(shí)間空閑狀態(tài),再發(fā)送下一個(gè)字符幀。
字符傳輸的時(shí)間取決于波特率,如果設置波特率為9.6k,那么傳輸一個(gè)字符幀中的一位用時(shí)等于1/9600*1000000=104us,如果這個(gè)字符幀有11位,那么這個(gè)字符幀的傳輸時(shí)間等于11/9600*1000=1.145ms.
自由口通信協(xié)議是什么?
顧名思義,沒(méi)有什么標準的自由口協(xié)議。用戶(hù)可以自己規定協(xié)議。
已知一個(gè)通信對象需要字符(字節)傳送格式有兩個(gè)停止位,S7-200是否支持?
字符格式是由最基礎的硬件(芯片)決定的;S7-200使用的芯片不支持上述格式。
S7-200是否支持《S7-200系統手冊》上列明的通信波特率以外的其他特殊通信速率?
通信速率是由最基礎的硬件(芯片)決定的;S7-200使用的芯片不支持沒(méi)有列明在手冊上的通信速率。
應用自由口通信首先要把通信口定義為自由口模式,同時(shí)設置相應的通信波特率和上述通信格式。用戶(hù)程序通過(guò)特殊存儲器SMB30(對端口0)、SMB130(對端口1)控制通信口的工作模式。
CPU通信口工作在自由口模式時(shí),通信口就不支持其他通信協(xié)議(比如PPI),此通信口不能再與編程軟件Micro/WIN通信。CPU停止時(shí),自由口不能工作,Micro/WIN就可以與CPU通信。
通信口的工作模式,是可以在運行過(guò)程中由用戶(hù)程序重復定義的。
如果調試時(shí)需要在自由口模式與PPI模式之間切換,可以使用SM0.7的狀態(tài)決定通信口的模式;而SM0.7的狀態(tài)反映的是CPU運行狀態(tài)開(kāi)關(guān)的位置(在RUN時(shí)SM0.7="1",在STOP時(shí)SM0.7="0") 自由口通信的核心指令是發(fā)送(XMT)和接收(RCV)指令。在自由口通信常用的中斷有"接收指令結束中斷"、"發(fā)送指令結束中斷",以及通信端口緩沖區接收中斷。 與網(wǎng)絡(luò )讀寫(xiě)指令(NetR/NetW)類(lèi)似,用戶(hù)程序不能直接控制通信芯片而必須通過(guò)操作系統。用戶(hù)程序使用通信數據緩沖區和特殊存儲器與操作系統交換相關(guān)的信息。 XMT和RCV指令的數據緩沖區類(lèi)似,起始字節為需要發(fā)送的或接收的字符個(gè)數,隨后是數據字節本身。如果接收的消息中包括了起始或結束字符,則它們也算數據字節。 調用XMT和RCV指令時(shí)只需要指定通信口和數據緩沖區的起始字節地址。
XMT和RCV指令與NetW/NetR指令不同的是,它們與網(wǎng)絡(luò )上通信對象的"地址"無(wú)關(guān),而僅對本地的通信端口操作。如果網(wǎng)絡(luò )上有多個(gè)設備,消息中必然包含地址信息;這些包含地址信息的消息才是XMT和RCV指令的處理對象。
由于S7-200的通信端口是半雙工RS-485芯片,XMT指令和RCV指令不能同時(shí)有效。
XMT(發(fā)送)指令的使用比較簡(jiǎn)單。RCV(接收)指令所需要的控制稍多一些。
所以,RCV指令啟動(dòng)后并不一定就接收消息,如果沒(méi)有讓它開(kāi)始消息接收的條件,就一直處于等待接收的狀態(tài);如果消息始終沒(méi)有開(kāi)始或者結束,通信口就一直處于接收狀態(tài)。這時(shí)如果嘗試執行XMT指令,就不會(huì )發(fā)送任何消息。
所以確保不同時(shí)執行XMT和RCV非常重要,可以使用發(fā)送完成中斷和接收完成中斷功能,在中斷程序中啟動(dòng)另一個(gè)指令。
在《S7-200系統手冊》中關(guān)于XMT和RCV指令的使用有一個(gè)例子。這個(gè)例子非常經(jīng)典,強烈建議學(xué)習自由口通信時(shí)先做通這個(gè)例子。
S7-200 CPU提供了通信口字符接收中斷功能,通信口接收到字符時(shí)會(huì )產(chǎn)生一個(gè)中斷,接收到的字符暫存在特殊存儲器SMB2中。通信口Port0和Port1共用SMB2,但兩個(gè)口的字符接收中斷號不同。 每接收到一個(gè)字符,就會(huì )產(chǎn)生一次中斷。對于連續發(fā)送消息,需要在中斷服務(wù)程序中將單個(gè)的字符排列到用戶(hù)規定的消息保存區域中。實(shí)現這個(gè)功能可能使用間接尋址比較好。
對于高通信速率來(lái)說(shuō),字符中斷接受方式需要中斷程序的執行速度足夠快。
一般情況下,使用結束字符作為RCV指令的結束條件比較可靠。如果通信對象的消息幀中以一個(gè)不定的字符(字節)結束(如校驗碼等),就應當規定消息或字符超時(shí)作為結束RCV指令的條件。但是往往通信對象未必具有嚴格的協(xié)議規定、工作也未必可靠,這就可能造成RCV指令不能正常結束。這種情況下可以使用字符接收中斷功能。
S7-200 CPU提供了通信口字符接收中斷功能,通信口接收到字符時(shí)會(huì )產(chǎn)生一個(gè)中斷,接收到的字符暫存在特殊存儲器SMB2中。通信口Port0和Port1共用SMB2,但兩個(gè)口的字符接收中斷號不同。
對于高通信速率來(lái)說(shuō),字符中斷接受方式需要中斷程序的執行速度足夠快。
一般情況下,使用結束字符作為RCV指令的結束條件比較可靠。如果通信對象的消息幀中以一個(gè)不定的字符(字節)結束(如校驗碼等),就應當規定消息或字符超時(shí)作為結束RCV指令的條件。但是往往通信對象未必具有嚴格的協(xié)議規定、工作也未必可靠,這就可能造成RCV指令不能正常結束。這種情況下可以使用字符接收中斷功能。
2自由口通信使用指南
SMB30(對于端口0)和SMB130(對于端口1)被用于選擇波特率和校驗類(lèi)型。SMB30和SMB130可讀可寫(xiě)。見(jiàn)表1.
表1.特殊存儲器字節SMB30/SMB130
示例:定義端口0為自由口模式,9600波特率,8位數據位,偶校驗,程序如下圖2.:
圖2.通訊口初始化程序
發(fā)送指令XMT能夠發(fā)送一個(gè)字節或多個(gè)字節的緩沖區,最多為255個(gè)。使用邊沿觸發(fā)。
發(fā)送緩沖區格式:第一個(gè)字節為字符個(gè)數,其后為發(fā)送的信息字符。
示例:如果PLC連續發(fā)送2個(gè)字符16#55和16#EE,程序如下圖3.:
圖3.發(fā)送指令程序
示例說(shuō)明:PLC通過(guò)數據塊寫(xiě)入數據。XMT指令中TBL緩沖區首地址VB200寫(xiě)入發(fā)送字符的個(gè)數,VB201和VB202分別寫(xiě)入發(fā)送字符。通訊口波形圖如圖1.
判斷發(fā)送完成的方法
方法一:發(fā)送完成中斷。通過(guò)連接中斷服務(wù)程序到發(fā)送結束事件上,在發(fā)送完緩沖區中的最后一個(gè)字符時(shí),則會(huì )產(chǎn)生一個(gè)中斷。對通訊口0為中斷事件9,對通訊口1為中斷事件26。連接中斷程序到中斷事件示例如下圖4.:
圖4.建立發(fā)送完成中斷的程序
方法二:發(fā)送空閑位。當port0發(fā)送空閑時(shí),SM4.5=1。當port1發(fā)送空閑時(shí),SM4.6=1.
示例:如果PLC斷續的發(fā)送2個(gè)字符16#55和16#EE.
方法一:利用發(fā)送完成中斷,在主程序中建立中斷事件,執行XMT發(fā)送16#55,發(fā)送完成后,進(jìn)入發(fā)送完成中斷程序中,執行XMT發(fā)送16#EE。波形圖如圖5.
圖5.字符波形圖
方法二:利用發(fā)送空閑位。當執行XMT發(fā)送完16#55后,利用SM4.5/4.6的上升沿(確保發(fā)送的字符幀發(fā)送完成),往XMT的TBL緩沖區寫(xiě)入新字符16#EE,并再次觸發(fā)發(fā)送。波形圖如圖6.
圖6.字符波形圖
兩種方法均斷續發(fā)送字符,即兩個(gè)字符之間有空閑狀態(tài)。注意:由于SM4.5/4.6的使用受程序掃描周期的影響,編程中推薦使用發(fā)送完成中斷。
Break斷點(diǎn)
Break狀態(tài):持續以當前波特率傳輸16位數據,且一直維持"0"狀態(tài)。
產(chǎn)生方式:把字符數設置為0并執行XMT指令,可以產(chǎn)生一個(gè)Break狀態(tài)。
Break用途:可以作為接收的起始條件。
示例:通過(guò)XMT指令發(fā)送一個(gè)Break斷點(diǎn)。偶校驗,8個(gè)數據位,9.6K。程序如下圖7.:
圖7.發(fā)送一個(gè)斷點(diǎn)的程序
Break狀態(tài)的波形圖如下圖8.
圖8.一個(gè)斷點(diǎn)波形圖
如果通過(guò)接收方為上位機或者S7-200PLC,那么它們接收到的字符為16#00.
那么通過(guò)發(fā)送一個(gè)Break斷點(diǎn)接收到的16#00與發(fā)送一個(gè)字符幀16#00有什么不同呢?Break狀態(tài)是傳輸16位數據一直為0。而發(fā)送一個(gè)字符16#00(幀格式為1個(gè)起始位,8個(gè)數據位,偶校驗和停止位)則傳輸11位該字符幀。如下圖9.
圖9.一個(gè)斷點(diǎn)和字符0的波形圖
接收指令RCV能夠接收一個(gè)字節或多個(gè)字節的緩沖區,最多為255個(gè)。使用邊沿觸發(fā)或第一個(gè)掃描周期觸發(fā)。
接收緩沖區格式:第一個(gè)字節表示接收的字符個(gè)數,其后為接收的信息字符。
RCV使能會(huì )將TBL緩沖區中的字符個(gè)數清零。
示例:如果發(fā)送方給PLC發(fā)送2個(gè)字符16#55和16#EE,PLC的接收程序如下圖10.:
圖10.接收指令程序
示例說(shuō)明:RCV指令TBL緩沖區的首地址VB200保存的是接收字符個(gè)數,其后是信息字符。
判斷接收完成的方法:
方法一:接收完成中斷。通過(guò)連接中斷服務(wù)程序到接收信息完成事件上,在接收完緩沖區中的最后一個(gè)字符時(shí),則會(huì )產(chǎn)生一個(gè)中斷。對端口0為中斷事件23,對端口1為中斷事件24。連接中斷程序到中斷事件示例如下圖11.:
圖11.建立接收完成中斷的程序
方法二:接收狀態(tài)字節。SMB86(port0),SMB186(port1)。
當接收狀態(tài)字節為0,表示接收正在進(jìn)行。
當接收狀態(tài)字節不為0,表示接收指令未被激活或者已經(jīng)被中止。見(jiàn)下表2.
表2.接收狀態(tài)字節SMB86(port0)/SMB186(port1)
接收指令起始和結束條件
接收指令使用接收信息控制字節(SMB87或SMB187)中的位來(lái)定義信息起始和結束條件。必須為接收信息功能操作定義一個(gè)起始條件和一個(gè)結束條件(最大字符數)。如下圖12.
圖12.接收控制字節SMB87(port0)/SMB187(port1)
接收指令支持幾種起始條件:
1.空閑線(xiàn)檢測
定義:在傳輸線(xiàn)上一段安靜或空閑的時(shí)間。
當接收指令執行時(shí),接收信息對空閑線(xiàn)時(shí)間進(jìn)行檢測。在空閑線(xiàn)時(shí)間到之前接收的字符,被忽略且按照SMW90/190給定的時(shí)間重新啟動(dòng)空閑線(xiàn)定時(shí)器。在空閑線(xiàn)時(shí)間到之后,接收的字符存入信息緩沖區。
空閑時(shí)間的典型值為在指定波特率下傳輸3個(gè)字符的時(shí)間。
示例:PLC接收的起始條件定義為空閑線(xiàn)檢測(設置SMB87中的il=1,sc=0,bk=0,空閑線(xiàn)超時(shí)時(shí)間SMW90=10ms);接收的結束條件定義為最大字符個(gè)數SMB94=10。程序如下圖13.
圖13.空閑線(xiàn)檢測程序
示例說(shuō)明:
(紫色部分:)當啟動(dòng)接收指令后,PLC對空閑線(xiàn)時(shí)間進(jìn)行檢測,如果在SMW90中設定的空閑線(xiàn)時(shí)間到之前,已經(jīng)接收到了字符1,則字符1被忽略,并且按照SMW90中設定的時(shí)間重新啟動(dòng)空閑定時(shí)器。
(橙色部分:)同樣的,如果在SMW90中設定的空閑線(xiàn)時(shí)間到之前,已經(jīng)接收到了字符2,則字符2也被忽略且空閑線(xiàn)定時(shí)器重新啟動(dòng)。
(綠色部分:)如果在SMW90中設定的空閑線(xiàn)時(shí)間到之后,接收到字符3,則字符3作為第一個(gè)信息字符存入接收緩沖區。見(jiàn)下圖14.
圖14.用空閑時(shí)間檢測來(lái)啟動(dòng)接收指令
2.起始字符檢測
當接收到SMB88/188指定起始字符后,接收信息功能將起始字符作為信息的第一個(gè)字符存入接收緩沖區。
起始字符之前的字符被忽略,起始字符和其后的所有字符存入接收緩沖區。
示例:PLC接收的起始條件定義為起始字符檢測(設置SMB87中的il=0,sc=1,bk=0,起始字符SMB88=16#55);接收的結束條件定義為最大字符個(gè)數SMB94=4。程序如下圖15.
圖15.起始字符檢測程序
示例說(shuō)明:PLC接收總線(xiàn)上傳來(lái)的一串字符,16#01、16#02、16#03、16#55、16#AA、16#BB、16#CC,當PLC檢測到起始字符16#55后,開(kāi)始接收并將16#55作為第一個(gè)信息字符存入接收緩沖區,起始字符之前的3個(gè)字符被忽略。如下圖16.
圖16.用起始字符檢測來(lái)啟動(dòng)接收指令
3.空閑線(xiàn)和起始字符
接收指令執行時(shí),先檢測空閑線(xiàn)條件,在空閑線(xiàn)條件滿(mǎn)足后,檢測起始字符。如果接收的字符不是起始字符,則重新檢測空閑線(xiàn)條件。
在空閑線(xiàn)條件滿(mǎn)足和接收到起始字符之前接收的字符被忽略。起始字符和字符串一起存入緩沖區。
適用于通訊連接線(xiàn)上有多個(gè)設備的情況。
示例:PLC接收的起始條件定義為空閑線(xiàn)和起始字符(設置SMB87中的il=1,sc=1,bk=0,空閑線(xiàn)檢測時(shí)間SMW90=10ms,起始字符SMB88=16#55),結束條件為最大字符個(gè)數2.
示例說(shuō)明:PLC接收總線(xiàn)上傳來(lái)的數據,分幾種情況:
當空閑線(xiàn)條件不滿(mǎn)足,即使空閑后出現起始字符,PLC也不開(kāi)始接收。如圖17.
圖17.
當PLC先檢測到起始字符,再檢測到空閑線(xiàn)條件滿(mǎn)足,PLC不啟動(dòng)接收?;蛘弋擯LC檢測到空閑線(xiàn)條件滿(mǎn)足后,接收到除起始字符之外的任意字符,PLC也不啟動(dòng)接收。如圖18.
圖18.
只有當PLC檢測空閑線(xiàn)條件滿(mǎn)足后,接收到起始字符,PLC才啟動(dòng)接收,在空閑線(xiàn)條件滿(mǎn)足和接收到起始字符之前接收的字符被忽略。起始字符和字符串一起存入緩沖區,緩沖區首地址VB200。如圖19.
圖19.用空閑線(xiàn)和起始字符來(lái)啟動(dòng)接收指令
4.斷點(diǎn)檢測
大于一個(gè)完整字符傳輸時(shí)間的一段時(shí)間內,接收數據一直為0.
在斷點(diǎn)之前接收的字符被忽略,在斷點(diǎn)之后接收的字符存入信息緩沖區。
示例:PLC接收的起始條件定義為斷點(diǎn)檢測(設置SMB87中的il=0,sc=0,bk=1),結束條件為最大字符個(gè)數8。
示例說(shuō)明:PLC接收總線(xiàn)上傳來(lái)的一串字符和斷點(diǎn),依次為16#0016#00(連續的兩個(gè)字符間沒(méi)有空閑)、16#0016#00(斷續的兩個(gè)字符間有空閑)、第一個(gè)Break斷點(diǎn)、16#55、第二個(gè)Break斷點(diǎn)、16#EE。當PLC檢測到第一個(gè)斷點(diǎn)狀態(tài)后,啟動(dòng)接收,接收的字符存入信息緩沖區(第二個(gè)斷點(diǎn)),第一個(gè)斷點(diǎn)之前的字符被忽略。接收緩沖區起始地址為VB200。如下圖20.
圖20.用斷點(diǎn)檢測來(lái)啟動(dòng)接收指令
5.斷點(diǎn)和起始字符
在斷點(diǎn)條件滿(mǎn)足后,檢測起始字符。
在斷點(diǎn)條件滿(mǎn)足后,如果收到除起始字符外的任意字符,重新檢測新的斷點(diǎn)。
在滿(mǎn)足斷點(diǎn)和起始字符之前接收的字符將被忽略,起始字符和字符串一起存入信息緩沖區。
示例:PLC接收的起始條件定義為斷點(diǎn)和起始字符(設置il=0,sc=1,bk=1,起始字符SMB88=16#55)。結束條件為最大字符個(gè)數8.
示例說(shuō)明:PLC接收總線(xiàn)上傳來(lái)的一串字符和斷點(diǎn),依次為16#55、break、16#AA、16#55、break、16#55、16#EE、16#FF. 分幾種情況理解:
當PLC先檢測到起始字符再檢測到斷點(diǎn),PLC不啟動(dòng)接收。(SC+BK)
當PLC檢測到斷點(diǎn)后,接收到除起始字符外的任意字符,PLC不啟動(dòng)接收。(BK+Char+SC)
只有當PLC檢測到斷電后,緊接著(zhù)檢測到起始字符,才啟動(dòng)接收并且將起始字符和字符串一同存入信息緩沖區,斷點(diǎn)和起始字符之前接收的字符將被忽略。(BK+SC)如圖21.
圖21.用斷點(diǎn)和起始字符檢測來(lái)啟動(dòng)接收指令
6.任意字符。
任意字符接收是空閑線(xiàn)檢測的特例。
設置方式:il=1,sc=0,bk=0,空閑線(xiàn)時(shí)間SMW90/190=0。
接收指令一執行,立即接收任意字符,并把所有接收字符存入信息緩沖區。
允許使用信息定時(shí)器監控接收是否超時(shí)。當接收指令執行時(shí),信息定時(shí)器啟動(dòng),如果沒(méi)有其他終止條件滿(mǎn)足,信息定時(shí)器超時(shí)會(huì )接收接收功能。
接收指令結束條件
接收指令支持以下一種或幾種組合的結束條件:
1.結束字符檢測
在起始條件之后,接收指令檢查接收的所有字符,如果檢測到結束字符,則將其存入緩沖區,結束接收。
示例:PLC接收的結束條件定義為結束字符檢測(設置SMB87中的ec=1,定義結束字符SMB89=16#55),接收起始條件定義為起始字符檢測(起始字符16#AA)。
示例說(shuō)明:PLC接收總線(xiàn)上傳來(lái)的一串字符,依次為16#AA、16#BB、16#CC、16#55、16#EE、16#FF。當PLC檢測到起始字符16#AA后,啟動(dòng)接收,當檢測到結束字符16#55后,結束接收并將接收的所有字符存入信息緩沖區。如下圖22.
圖22.用結束字符檢測來(lái)結束接收指令
2.字符間隔定時(shí)器
字符間隔時(shí)間定義:從一個(gè)字符的結尾(停止位)到下一個(gè)字符的結尾(停止位)之間的時(shí)間。
接收到字符后,字符間隔定時(shí)器重新啟動(dòng)。
兩個(gè)字符之間的間隔時(shí)間超過(guò)SMW92/192則結束接收。
示例:PLC接收的結束條件定義為字符間隔定時(shí)器(設置SMB87中的c/m=0,tmr=1,信息超時(shí)時(shí)間SMW92),接收起始條件定義為起始字符檢測。
示例說(shuō)明:PLC接收總線(xiàn)上傳來(lái)的一串字符,當PLC滿(mǎn)足接收條件后啟動(dòng)接收,接收完一個(gè)字符的停止位后,重新啟動(dòng)字符間隔定時(shí)器,如果檢測到下一個(gè)字符幀停止位時(shí)SMW92時(shí)間未到,則重新啟動(dòng)字符間隔定時(shí)器,如果當SMW92時(shí)間到時(shí)還未檢測到下一個(gè)字符幀的停止位,則結束接收。如下圖23.
圖23.用字符間隔定時(shí)器來(lái)結束接收指令
3.信息定時(shí)器
當接收啟動(dòng)條件一滿(mǎn)足,信息定時(shí)器就啟動(dòng),當時(shí)間超過(guò)SMW92/192指定的時(shí)間,信息定時(shí)器時(shí)間到結束接收。
示例:PLC接收的結束條件定義為信息定時(shí)器(設置SMB87中的c/m=1,tmr=1,信息超時(shí)時(shí)間SMW92),接收起始條件定義為起始字符檢測。
示例說(shuō)明:PLC接收總線(xiàn)上傳來(lái)的一串字符,當PLC滿(mǎn)足接收條件后啟動(dòng)接收,信息定時(shí)器啟動(dòng),當SMW92時(shí)間到時(shí),結束接收。如圖24.
圖24.用信息定時(shí)器來(lái)結束接收指令
4.最大字符計數
當接收字符個(gè)數達到或超過(guò)最大字符個(gè)數(SMB94/SMB194),接收功能結束。
由于接收指令需要知道接收信息的最大長(cháng)度,以保證信息緩沖區之后的數據不被覆蓋,所以即使不被用作接收結束條件,也必須指定最大字符個(gè)數。
如果沒(méi)有指定最大字符個(gè)數,則SM86.6/186.6=1(輸入參數錯誤或丟失啟動(dòng)或結束條件)
5.校驗結束
當接收字符的同時(shí)出現硬件信號校驗錯誤時(shí),接收指令會(huì )自動(dòng)結束。
只有在SMB30/130中使能校驗位,才有可能出現校驗錯誤。沒(méi)有辦法禁止此功能。
6.用戶(hù)結束。
通過(guò)程序結束接收功能:將SM87.7或SM187.7置為0,且需邊沿觸發(fā)RCV接收指令。
以上內容是通過(guò)發(fā)送和接收指令實(shí)現S7-200PLC的自由口通訊。另外,S7-200PLC還提供了通訊口字符接收中斷功能。見(jiàn)下文。
如何人為結束RCV接收狀態(tài)?
接收指令控制字節(SMB87/SMB187)的en位可以用來(lái)允許/禁止接收狀態(tài)??梢栽O置SM87.7/SM187.7為"0",然后對此端口執行RCV指令,即可結束RCV指令。
字符中斷
使用字符中斷方式接收數據,接收每個(gè)字符時(shí)都會(huì )產(chǎn)生中斷。在執行與接收字符事件相連的中斷程序前,接收的字符存入SMB2寄存器中,校驗狀態(tài)存入SM3.0。 SMB2、SM3.0都是只讀的。
Port0/Port1共用SMB2/SMB3。Port0對應于中斷事件8。Port1對應于中斷事件25。
SMB2使用條件:RCV指令不使能,通訊端口為自由口模式,且建立中斷事件8/25。
字符中斷使用方法:
以端口0接收字符為例:如圖25.
圖25.字符中斷程序
注意:對于這段程序,如果在中斷程序中不作任何編程,那么當CPU接收n個(gè)字符時(shí),中斷程序將被執行n次,SMB2寄存器存儲接收到的最后一個(gè)字符。
如上位機通過(guò)串口調試軟件給CPU發(fā)送3個(gè)字符16#AA、16#BB和16#CC,如下圖26.
圖26.通過(guò)串口調試軟件發(fā)送字符
圖27.狀態(tài)表監控SMB2
用SMB接收多個(gè)字符,如何編程?
由于SMB2只能存儲一個(gè)字符(一個(gè)字節),如果要想接受多個(gè)字符,則應當在CPU接收下一個(gè)字符之前,在中斷程序中通過(guò)指針編程將SMB2中存儲的字符移出來(lái),以便下一次接收字符。以一個(gè)例程說(shuō)明:如圖28.
圖28.接收多個(gè)字符的程序
VD0作為地址指針指向VB100,當端口0接收到第一個(gè)字符,將第一個(gè)字符存入SMB2,進(jìn)入接收中斷,將SMB2中的字符復制到指針VD0指向的地址字節VB100中,指針地址加1,VD0指向下一個(gè)字節VB101。當接收第二
個(gè)字符,將字符存入SMB2,進(jìn)入接收中斷,將SMB2中的第二個(gè)字符復制到指針VD0指向的地址字節VB101中,指針地址加1,VD0指向下一個(gè)字節VB102。當接收第三個(gè)字符時(shí)以此類(lèi)推。
另外,如果需要接收n個(gè)字符就結束接收,或者需要接收n個(gè)字符后循環(huán)接收,可以在中斷程序中設置一個(gè)標志位,下面我們試舉例說(shuō)明:
圖29.程序
圖30.程序
簡(jiǎn)單地說(shuō),當RCV指令使能時(shí),接收字符不進(jìn)入SMB緩沖區。
分析實(shí)驗如下:
在主程序中我們既定義PLC執行RCV接收指令的起始結束條件(起始條件為起始字符16#AA,結束條件為結束字符16#BB),又建立字符中斷事件8,上升沿條件觸發(fā)RCV指令。
上位機通過(guò)串口調試軟件給CPU發(fā)送字符。如圖31.。
圖31.通過(guò)串口調試軟件發(fā)送字符
程序如下圖32.:
圖32.測試程序
狀態(tài)表監控結果:如下圖33.
圖33.狀態(tài)表監控結果
結論:
當RCV指令不觸發(fā)的話(huà),接收字符只進(jìn)入SMB2緩沖區,不進(jìn)入RCV指令的接收緩沖區。
當RCV指令觸發(fā)后,滿(mǎn)足CPU接收的起始和結束條件的字符存入RCV指令對應的TBL緩沖區。起始條件之前的字符既不存入RCV緩沖區,也不存入SMB2緩沖區。結束條件之后接收到的字符,存入SMB2緩沖區。
為了更好的理解自由口的編程,可參考下面的例程。
該例程涉及到兩臺S7-200PLC,其中發(fā)送方向接收方發(fā)送數據,接收方接收到數據后再給發(fā)送方發(fā)送數據,如此往復。
自由口發(fā)送方程序:先發(fā)送3個(gè)字符'a'、'b'、'c' 到接收方,然后轉為接收狀態(tài),接收到對方的3個(gè)字符'1'、'2'、'3' 后重新啟動(dòng)發(fā)送指令,將'd'、'e'、'f' 發(fā)送到接收方后再啟動(dòng)接收,隨后收到3個(gè)字符'4'、'5'、'6'。然后重復上述過(guò)程。
自由口接收方程序:先接收3個(gè)字符'a'、'b'、'c' ,然后轉為發(fā)送,給對方發(fā)出3個(gè)字符'1'、'2'、'3' 后重新啟動(dòng)接收指令,待收到'd'、'e'、'f' 后重新啟動(dòng)發(fā)送指令,發(fā)出3個(gè)字符'4'、'5'、'6'后再次轉為接收狀態(tài)。然后重復上述過(guò)程。
注意:此指令庫/程序的作者和擁有者對于該軟件的功能性和兼容性不負任何責任。使用該軟件的風(fēng)險完全由用戶(hù)自行承擔。由于它是免費的,所以不提供任何擔保,錯誤糾正和熱線(xiàn)支持,用戶(hù)不必為此聯(lián)系西門(mén)子技術(shù)支持與服務(wù)部門(mén)。
需要定時(shí)向通信對象發(fā)送消息并等待回復的消息,如果因故消息沒(méi)有正常接收,下次無(wú)法發(fā)送消息怎么辦?
可以在開(kāi)始發(fā)送消息時(shí)加上人為中止RCV指令的程序。
自由口通信中,主站向從站發(fā)送數據,為何收到多個(gè)從站的混亂響應?
這說(shuō)明從站沒(méi)有根據主站的要求發(fā)送消息。有多個(gè)從站的通信網(wǎng)絡(luò )中,從站必須能夠判斷主站的消息是不是給自己的,這需要從站的通信程序中有必要的判斷功能。
3RS485網(wǎng)絡(luò )
RS-485串行通信標準采用平衡信號傳輸方式,或者稱(chēng)為差動(dòng)模式。平衡傳輸方式可以有效地抑制傳輸過(guò)程中干擾。
平衡方式采用一對導線(xiàn),利用兩根導線(xiàn)間的電壓差傳輸傳輸信號。這兩根導線(xiàn)被命名為A(TxD/RxD-)和B(TxD/RxD+)。當B的電壓比A高時(shí),認為傳輸的是邏輯"高"電平;當B的電壓比A低時(shí),認為傳輸的是邏輯"低"電平信號。能夠有效工作的差動(dòng)電壓范圍十分寬廣,可以從零點(diǎn)幾伏到接近十伏。
RS-485通信端口可以做到很高的通信速率,較長(cháng)的通信距離,以及并聯(lián)連接多個(gè)端口。
平衡通信方式能否有效工作受到共模電壓差的影響。RS-485接口的兩根導線(xiàn)相對于通信對象信號地的電壓差就是共模電壓。非電氣隔離的RS-485接口能在一定的范圍內抵抗共模電壓對通信的干擾。
S7-200 CPU通信口的共模抑制電壓是12V。所以對于這類(lèi)非隔離型的RS-485端口,保證通信口之間的信號地等電位非常重要,最好將它們連接在一起(并不是說(shuō)一定要接地)。
S7-200系統中的RS-485端口是半雙工的,不能同時(shí)發(fā)送和接收信號。
在S7-200系統中,選擇合適的通信設備,可以做到波特率從1200到12M,單段距離1000m,單段站點(diǎn)32個(gè)的通信網(wǎng)絡(luò )。通過(guò)中繼器,RS-485電氣網(wǎng)絡(luò )還可以擴展通信距離,增加通信站點(diǎn)。詳情請參考《S7-200系統手冊》關(guān)于通信的專(zhuān)門(mén)一章。
雖然常見(jiàn)的RS-485通信器件在電氣性能上基本一致,但物理接口卻五花八門(mén),沒(méi)有統一的規定。
表3. S7-200 CPU通信口引腳定義:
上表中,3和8為RS-485信號,它們的背景顏色與PROFIBUS電纜、PROFIBUS網(wǎng)絡(luò )插頭上的顏色標記一致。通信端口可以從2和7向外供24V直流電源。
注意:
在S7-200系統中,無(wú)論是組成PPI、MPI還是RPOFIBUS-DP網(wǎng)絡(luò ),用到的主要部件都是一樣的:
連接網(wǎng)絡(luò )連接器
A. 電纜和剝線(xiàn)器。使用FC技術(shù)不用剝出裸露的銅線(xiàn)。
B. 打開(kāi)PROFIBUS網(wǎng)絡(luò )連接器。首先打開(kāi)電纜張力釋放壓塊,然后掀開(kāi)芯線(xiàn)鎖。
C. 去除PROFIBUS電纜芯線(xiàn)外的保護層,將芯線(xiàn)按照相應的顏色標記插入芯線(xiàn)鎖,再把鎖塊用力壓下,使內部導體接觸。應注意使電纜剝出的屏蔽層與屏蔽連接壓片接觸。
由于通信頻率比較高,因此通信電纜采用雙端接地。電纜兩頭都要連接屏蔽層。
D. 復位電纜壓塊,擰緊螺絲,消除外部拉力對內部連接的影響。
網(wǎng)絡(luò )連接器
網(wǎng)絡(luò )連接器主要分為兩種類(lèi)型:帶和不帶編程口的。不帶編程口的插頭用于一般聯(lián)網(wǎng),帶編程口的插頭可以在聯(lián)網(wǎng)的同時(shí)仍然提供一個(gè)編程連接端口,用于編程或者連接HMI等。
線(xiàn)型網(wǎng)絡(luò )結構
通過(guò)PROFIBUS電纜連接網(wǎng)絡(luò )插頭,構成總線(xiàn)型網(wǎng)絡(luò )結構。
在上圖中,網(wǎng)絡(luò )連接器A、B、C分別插到三個(gè)通信站點(diǎn)的通信口上;電纜a把插頭A和B連接起來(lái),電纜b連接插頭B和C。線(xiàn)型結構可以照此擴展。
注意圓圈內的"終端電阻"開(kāi)關(guān)設置。網(wǎng)絡(luò )終端的插頭,其終端電阻開(kāi)關(guān)必須放在"ON"的位置;中間站點(diǎn)的插頭其終端電阻開(kāi)關(guān)應放在"OFF"位置。
終端電阻和偏置電阻
一個(gè)正規的RS-485網(wǎng)絡(luò )使用終端電阻和偏置電阻。在網(wǎng)絡(luò )連接線(xiàn)非常短、臨時(shí)或實(shí)驗室測試時(shí)也可以不使用終端和偏置電阻。
西門(mén)子的PROFIBUS網(wǎng)絡(luò )連接器已經(jīng)內置了終端和偏置電阻,通過(guò)一個(gè)開(kāi)關(guān)方便地接通或斷開(kāi)。終端和偏置電阻的值完全符合西門(mén)子通信端口和PROFIBUS電纜的要求。
與其他設備通信時(shí)(采用PROFIBUS電纜),對方的通信端口可能不是D-SUB9針型的,或者引腳定義完全不同。如西門(mén)子的MM4x0變頻器,RS-485通信口采用端子接線(xiàn)形式,這種情況下需要另外連接終端電阻,西門(mén)子可以提供一個(gè)比較規整的外接電阻。對于其他設備,可以參照《S7-200系統手冊》上的技術(shù)數據制作。
西門(mén)子網(wǎng)絡(luò )插頭中的終端電阻、偏置電阻的大小與西門(mén)子PROFIBUS電纜的特性阻抗相匹配,強烈建議用戶(hù)配套使用西門(mén)子的PROFIBUS電纜和網(wǎng)絡(luò )插頭??梢员苊庠S多麻煩。
記住聯(lián)網(wǎng)的格言:你糊弄它,它就糊弄你!
硬件對能否正常通信有決定性的影響,如果硬件條件不能滿(mǎn)足,采取其他措施往往不能從根本上改善通信中的問(wèn)題。
記住聯(lián)網(wǎng)的格言:你糊弄它,它就糊弄你!
應當注意:
新的PC/PPI電纜能否支持自由口通信?
新的RS-232/PPI電纜(6ES7 901-3CB30-0XA0)可以支持自由口通信;但需要將DIP開(kāi)關(guān)5設置為"0",并且設置相應的通信速率。
新的USB/PPI電纜(6ES7 901-3DB30-0XA0)不能支持自由口通信。
已經(jīng)用于自由口的通信口,是否可以連接操作面板(HMI)?
不能。
可以使用具有兩個(gè)通信口的CPU,或者使用EM277擴展HMI連接口。如果是其他廠(chǎng)商的HMI,須咨詢(xún)他們。
通過(guò)工作在自由口模式下的通信口如何給PLC下載程序?
需要先通過(guò)CPU本體的模式開(kāi)關(guān)將CPU設置為STOP模式后,再通過(guò)該通信口進(jìn)行下載。
4擴展閱讀
5相關(guān)詞匯
USB/PPI電纜和CP卡不支持自由口調試。
1.1 自由口通信概述
1.2 自由口通信要點(diǎn)
1.3 發(fā)送和接收指令
RCV指令的基本工作過(guò)程為:
1.4 字符接收中斷
每接收到一個(gè)字符,就會(huì )產(chǎn)生一次中斷。對于連續發(fā)送消息,需要在中斷服務(wù)程序中將單個(gè)的字符排列到用戶(hù)規定的消息保存區域中。實(shí)現這個(gè)功能可能使用間接尋址比較好。
2.1 通訊口初始化
2.2 發(fā)送數據:
2.3 接收數據
當CPU通過(guò)端口0接收到一個(gè)字符后,會(huì )將該字符存入接收字符緩沖區SMB2,然后進(jìn)入相連接的中斷程序中。
那么與接收字符事件相連的中斷程序將被執行3次,SMB2中只能保存最后一個(gè)接收到的字符16#CC。如下圖27.
例程1,接收到5個(gè)字符就結束接收的程序:如圖29.
例程2,接收到5個(gè)字符后循環(huán)接收的程序:如圖30.
注意,程序中的的指針不要選擇累加器AC,因為累加器不能在主程序和中斷程序中傳遞參數。
2.4 自由口通信例程
3.1 通信口引腳定義
CPU插座(9針母頭)
引腳號
PROFIBUS名稱(chēng)
Port0/Port1(端口0/端口1)引腳定義
1
屏蔽
機殼接地(與端子PE相同)/屏蔽
2
24V返回
邏輯地(24V公共端)
3
RS-485信號 B
RS-485信號 B 或 TxD/RxD +
4
發(fā)送請求
RTS(TTL)
5
5V返回
邏輯地(5V公共端)
6
+5V
+5V,通過(guò)100 Ohm電阻
7
+24V
+24V
8
RS-485信號 A
RS-485信號 A 或 TxD/RxD -
9
不用
10位協(xié)議選擇(輸入)
金屬殼
屏蔽
機殼接地(與端子PE相同)/與電纜屏蔽層連通
3.2 RS-485網(wǎng)絡(luò )的硬件組成
圖34. 剝好一端的PROFIBUS電纜與快速剝線(xiàn)器(FCS,訂貨號6GK1905-6AA00)。
圖35. 打開(kāi)的PROFIBUS連接器
圖36. 插入電纜
圖37. 左側為不帶編程口的網(wǎng)絡(luò )連接器(訂貨號:6ES7 972-0BA52-0XA0)
右側的是帶編程口的網(wǎng)絡(luò )連接器(訂貨號:6ES7 972-0BB52-0XA0)
圖38. 總線(xiàn)型網(wǎng)絡(luò )連接
合上網(wǎng)絡(luò )中網(wǎng)絡(luò )插頭的終端電阻開(kāi)關(guān),可以非常方便地切斷插頭后面的部分網(wǎng)絡(luò )的信號傳輸。
3.3 通信有關(guān)注意事項(硬件)
S7-200系統中用到的電纜、插頭等都有特定的要求,強烈建議使用西門(mén)子的電纜和附件。
參看通信硬件
對于非隔離的通信口(如CPU上的通信口),保證它們之間等電位非常重要。在S7-200 CPU聯(lián)網(wǎng)時(shí),可以將所有CPU模塊的傳感器電源輸出的L+/M中的M端子,用導線(xiàn)串接起來(lái)。在S7-200 CPU與變頻器通信時(shí),要將所有變頻器通信端口的M(在西門(mén)子MM4x0系列是二號端子)連接起來(lái),并與CPU上的傳感器電源M連接。
電磁環(huán)境的好壞及采取的應對措施,對于通信的可靠性非常重要。例如,通信電纜不應與動(dòng)力電纜平行放置,距離過(guò)近;變頻器輸出動(dòng)力電纜,如果沒(méi)有選用屏蔽電纜,對通信的干擾就非常大;220V供電的CPU,如果電源與變頻器輸入側電源共用,高頻干擾的影響也非常大……
屏蔽(PE)端的連接。注意所有CPU或者EM277模塊上PE(保護接地)端子必須連接到大地、或者柜殼上。否則電纜的屏蔽層等于沒(méi)有用。
西門(mén)子有一本《西門(mén)子自動(dòng)化與驅動(dòng)產(chǎn)品符合電磁兼容規則的安裝規范手冊》,很有價(jià)值,如果需要可致電西門(mén)子技術(shù)支持熱線(xiàn)索取其電子版本,或者直接到以下網(wǎng)址下載:
http://www.ad.siemens.com.cn/service/e-training/micro
電話(huà):13818569113 15721373211
郵箱:fushidianji@139.com
網(wǎng)址:http://m.xiangtai88.cn
地址:上海青浦區北青公路7171號111-112室