精通RS485通訊系列教程_資料接收

3.5、利用時間間隔判斷報文的接收測試

【利用時間間隔判斷報文來判斷報文】

問:為什麼要使用時間的方式來對報文進行判斷呢?

答:可以設想這樣一種情況,當使用起始字元和結束字元的方式來判斷一段報文的開始與結束時,如果在報文中間出現了起始字元或者結束字元,將會發生什麼情況能?相信如果你認真看過以上介紹肯定可以發現其中的缺點。解決這些缺點的方法就是透過時間來判斷報文的起始與停止。

首先要明確報文一般分為

固定長度

不固定長度

兩種形式。

報文長度固定

有些通訊協議中報文長度固定時PLC接收每段報文所需的時間都是一樣的,這樣就可以根據報文的長度計算出接收報文所需的時間,然後PLC就可以從接收到第一個字元開始計時,計時達到設定時間就算一段報文接收完成。

舉例:如果是通訊速率是9600bps,每個字元10個位(1個起始位、1個停止位、8個數據位、無效驗位),那麼接收一個字元就需要(1000/9600)*10≈1。04ms。如果每個報文6個字元,那麼PLC接收這段報文就需要6*1。04= 6。24ms。這時就可以在PLC中設定從開始接收報文起6。24ms後停止接收報文,然後從新進入等待接收報文的狀態。

報文長度不固定

在有的協議中報文的長度是不固定的,這種情況下應該如何判斷一段報文起始和停止呢?其實這個也是比較簡單的,當報文中字元的數量是不固定的時候,可以透過字元與字元之間的時間間隔來進行判斷,通常情況是3。5個字元時間。在9600bps的通訊速率,每個字元10個位的情況下就是3。5*1。04 = 3。64ms,如果在這段時間PLC沒有接收到資料,就認為一段報文已經接收完成,再次接收到的資料就算一段新報文的開始。

問:如果兩段報文的間隔小於3。5個字元時長那不就出問題了麼?

答:有這種擔心的朋友主要是對485通訊收發資料的方式不夠了解。因為485通訊是半雙工通訊方式,所以一般都是A站點接收一個B站點發送的報文,然後A站點在給B站點發送一個報文,B站點接收到A站點發送的資料後再返給A站點一個報文,ABABABAB。如下圖

當PLC接收到一個報文後不是立刻接收下一個報文,而是先發送一個報文出去,因為傳送一組報文的時間肯定大於3。5個字元時長,所以不會存在被接收的兩個報文之間的時長小於3。5個字元長度的情況。

3.6、對固定長度報文方式程式設計

、暫存器設定

編寫程式之前我們先看看對應的特殊位暫存器應該如何設定。

1)、自由口模式。第0、1位。SM30。0=1、SM30。1=0

2)、通訊速率9600bps。第2、3、4位。SM30。2=0、SM30。3=1、SM30。4=0

3)、每個字元的資料位是8位。第5位。SM30。5=0

4)、不選用奇偶效驗。第6、7位。SM30。6=0、SM30。7=0

1)、不使用中斷條件作為檢測資訊的開始。第1位。SM87。1=0

2)、當SMW92中的定時時間超出時終止接收。第2、位。SM87。2=1

3)、定時器是資訊定時器。第3位。SM87。3=1

4)、使用SMW90的值檢測空閒狀態。第4位。SM87。4=1

5)、不檢測結束字元。第5位。SM87。5=0

6)、不檢測起始字元。第6位。SM87。6=0

7)、 允許資訊接收功能。第7位。SM87。7=1

注意:第0位為無效位不使用,永久為0。

【SMW90】

= 4

將SMW90設定成4表示報文間空閒時間大於4ms後,接收的第一個字元是新資訊的開始。

【SMW92】

= 6

由於我們設定SM87。3為1確定使用固定報文長度方式,如果報文長度為6個字元,那麼在9600bps通訊速率下1個字元(10個位)的接收需要1。04ms,6個字元的接收就需要6。24ms,因此將SMW92設定成6表示從接收到第一個字元開始後6ms停止接收資訊,同時空閒4ms後(SMW90 = 4)接收到的第一個字元是新資訊的開始。

【SMB94 】

= 255

SMB94定義接收緩衝區大小,定義為最大255位元組。

注意:接收緩衝區是用來存放接收到的資料的區域,最大255位元組,大家可以根據通訊情況自由定義。

3.7、程式編寫

精通RS485通訊系列教程_資料接收

精通RS485通訊系列教程_資料接收

以上就是固定報文長度方式下接收資料的程式,此處設定的報文長度是6個字元,下面透過串列埠除錯軟體給PLC傳送7個字元長度的一個報文看看會發生什麼情況。傳送報文資料:AA 11 22 BB 23 45 C1。

精通RS485通訊系列教程_資料接收

程式設計軟體端透過狀態表監控資料。如下圖

精通RS485通訊系列教程_資料接收

從上圖狀態表監控結果可以發現只能接收到6個字元,第7個字元C1並沒有接收到

3.8、對不固定長度報文方式程式設計

透過時間方式判斷進行資料的接收的兩種方式,已經詳細介紹了固定長度報文情況下PLC如何接收資料,當報文長度不固定的情況下該如何控制PLC接收資訊呢?

當協議中報文的長度不固定的情況下,透過判斷字元間的空閒時間的方式來判斷一段報文的起始,通常是字元與字元之間空閒時間超過3。5個字元傳輸時間,就認為一段報文接收完畢,之後接收到的報文就是一段新的報文。下面來看看這個程式如何寫。

1)、自由口模式。第0、1位。SM30。0=1、SM30。1=0

2)、通訊速率9600bps。第2、3、4位。SM30。2=0、SM30。3=1、SM30。4=0

3)、每個字元的資料位是8位。第5位。SM30。5=0

4)、不選用奇偶效驗。第6、7位。SM30。6=0、SM30。7=0

1)、不使用中斷條件作為檢測資訊的開始。第1位。SM87。1=0

2)、當SMW92中的定時時間超出時終止接收。第2、位。SM87。2=1

3)、定時器是內部字元定時器。第3位。SM87。3=0

4)、使用SMW90的值檢測空閒狀態。第4位。SM87。4=1

5)、不檢測結束字元。第5位。SM87。5=0

6)、不檢測起始字元。第6位。SM87。6=0

7)、允許資訊接收功能。第7位。SM87。7=1

注意:第0位為無效位不使用,永久為0。

【SMW90】 = 4

將SMW90設定成4表示報文間空閒時間大於4ms後接收的第一個字元是新資訊的開始。

【SMW92】 = 4

由於設定SM87。3= 0確定使用報文長度不固定方式,在9600bps通訊速率下1個字元(10個位)的接收需要1。04ms,3。5個字元的時間需要3。64ms,因此將SMW92設定成4表示當字元與字元之間的空閒時間超過4ms時停止接收資訊(注:SMW92不支援小數),同時空閒4ms後(SMW90 =4)接收到的第一個字元是新資訊的開始。

【SMB94 】= 255

SMB94定義接收緩衝區大小,此處定義為最大255位元組。

注意:接收緩衝區是用來存放接收到的資料的區域,最大255位元組,可以根據通訊情況自由定義。

3.9

、程式編寫

精通RS485通訊系列教程_資料接收

精通RS485通訊系列教程_資料接收

以上就是報文長度不固定方式下,接收資料的程式。下面從電腦向PLC傳送兩組長度不同的報文 AA 11 22 BB 23 45 C1和AA11 22 BB23 45 C1 54看看效果。

精通RS485通訊系列教程_資料接收

程式設計軟體端透過狀態表監控資料。如下圖

精通RS485通訊系列教程_資料接收

精通RS485通訊系列教程_資料接收

程式設計軟體端透過狀態表監控資料。如下圖

精通RS485通訊系列教程_資料接收

由上面兩次操作我們可以看到當報文長度不固定的時候電腦向PLC傳送幾個字元PLC就會接收幾個字元。