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