IEC 104公約 解析 c#使用通過104公約同步時間


1. 104公約概況

使用tcp協議通信,標准tcp端口號是2404。服務端模擬軟件可以使用gitbub上一個模擬器(IEC60870-5-104ServerSimulator.exe)。

 

2. 104公約數據結構

 

APCI------------------ Application Protocol Control Information   控制信息

ASDU -----------------------Application Service Data Unit  服務數據單元

APDU -----------------Application Protocol Data Unit  規約數據單元

 

  說明   字節長度  
APCI 起始字 68H 1字節 APDU
APDU長度

最大253

長度=報文總長度-2

1字節
控制域1

控制域,保護報文不丟失、不重復。

控制報文開始與停止、連接監視

1字節
控制域2 1字節
控制域3 1字節
控制域4 1字節
ASDU 類型標識    1字節
可變結構限定詞    1字節
傳輸原因   2字節
公共地址   2字節
信息體 ...... ......

 

I幀:編號的信息傳輸幀,包含APCI和ASDU。控制域1的    bit1=0    表示I幀

S幀:編號監視幀。               控制域1的   bit1=1 ,bit2=0表示S幀,只包含APCI

U幀:未編號的控制幀。            控制域1的    bit1=1, bit2=1表示U幀,只包含APCI

3. U幀、控制功能幀

U幀包括啟動、停止、測試幀。控制域1的第一個bit=1,第二個bit=1定義了U幀。

啟動幀:用於啟動應用層傳輸

停止幀:用於停止應用層傳輸

測試幀:元數據傳輸時候,用於維持鏈路活動狀態。

U幀只跟【控制域1】有關,不需要記表格,用的時候查就行了。

控制域1: 字節位7 字節位6 字節位5 字節位4 字節位3 字節位2 字節位1 字節位0 說明 對應控制域1的字節值 固定命令
  表示是測試幀Test 表示是停止幀 表示是開始幀          
  C V C V C V 1 1 V生效、C確認    
  0 0 0 0 0 1 1 1 啟動生效 0x07 68 04 07 00 00 00
  0 0 0 0 1 0 1 1 啟動確認 0x0B 68 04 0B 00 00 00
  0 0 0 1 0 0 1 1 終止生效 0x13 68 04 13 00 00 00
  0 0 1 0 0 0 1 1 終止確認 0x23 68 04 23 00 00 00
  0 1 0 0 0 0 1 1 測試生效 0x43 68 04 43 00 00 00
  1 0 0 0 0 0 1 1 測試確認 0x83 68 04 83 00 00 00

 

4. I幀、信息傳輸幀

控制域1的比特1=0定義了I格式。I格式的APDU包含ASDU。

  比特7 比特6 比特5 比特4 比特3 比特2 比特1 比特0
控制域1 發送序號S(低位) 0
控制域2 發送序號S(高位)
控制域3 接收序號R(低位) 0
控制域4 接收序號(高位)

其中,高位有8bit,低位有7bit。比如發送序列號1000,轉換成2進制是 0000 0011   1110   1000 ,因為序列號是由7+8bit組成的,所以高位就是0000 0011,低位就是110 1000

發送一個I幀報文,發送序列號+1,

接收一個I報文,接收序列號+1.

TCP重連后,調度主站和子站的接收序號和發送序號都要清零。

5.S幀、確認幀

控制域1的第一個bit1=1,第二個bit2=0定義了S幀。

  比特7 比特6 比特5 比特4 比特3 比特2 比特1 比特0
控制域1 0 0 1
控制域2 0
控制域3 接收序列號R(低位) 0
控制域4 接收序列號R(高位)

6.ASDU類型標識

 

 

 

 

 

 7.報文分析舉例

拿時鍾同步報文舉例:

字節序號: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
值(16進制): 68 14 8e 00 6c f9 67 01 06 00 00 00 00 00 00 d8 02 00 0c 4a 01 0c
      控制域 類型標識 結構限定詞 傳送原因 公共地址 對象地址 毫秒 分鍾 小時 星期|日期
說明:

十進制104

表示是104公約

長度=20

1000 1110

最后bit=0是I幀

      時鍾同步 1指有序 06=激活 0 0 2*0xff+d8 0 12 2|10 1

(20)12

 

8.發送接收的步驟

 

 服務端,【收到的發送號】<【自己的接收號】------------報文重復

 服務端,【收到的發送號】>【自己的接受號】----------------報文丟失

不管丟失還是重復,服務端需要斷開連接重連。

k---默認值12,未被確認的I格式的最大數,適用於服務端,達到k指停止發文

w---默認值8,最遲收到w個I格式后必須確認。

t0 ----------默認30s--------建立連接超時---------客戶端

t1-----------默認15秒-------發送或測試報文超時-----------服務端

t2-----------默認10秒------無報文時候,確認超時------客戶端

t3--------默認20秒----------長期空閑,發測試幀超時----------雙方

9.調試工具的使用

第一步:打開程序

 

 第二步、點擊addServer:

 

 

第三步,加載配置:

 

 

 第四步,啟動服務:

 

 

這時候就可以通過客戶端連接了。

10.c#代碼下載

此代碼實現了,從104公約報文里獲取時間的功能。其中有了【發送序列號、接收序列號的計數功能】、模擬了發送U幀、S幀、I幀的功能。模擬了解析數據並以友好中文顯示功能。

效果如下:

 

 

 

源碼地址:

https://files.cnblogs.com/files/chlm/2020-4-26-104%E5%85%AC%E7%BA%A6%E8%A7%A3%E6%9E%90%E6%B5%8B%E8%AF%95.rar

調試工具可以從github上下載,也可以:

https://files.cnblogs.com/files/chlm/IEC60870-5-104ServerSimulator.rar

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM