标签:add 生效 激活 下载 链路 asd png 丢失 图片
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
IEC 104公约 解析 c#使用通过104公约同步时间
标签:add 生效 激活 下载 链路 asd png 丢失 图片
原文地址:https://www.cnblogs.com/chlm/p/12781909.html