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