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幀
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