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

 

posted @ 2020-04-26 20:01  灰主流  阅读(4104)  评论(0编辑  收藏  举报