1. 程式人生 > WINDOWS開發 >IEC 104公約 解析 c#使用通過104公約同步時間

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