104报文较为繁琐。
共有S帧、I帧、U帧。
简单的说I帧是用来传输数据、S帧是用来信息确认、U帧用来控制。
104规约的报文帧分为三类,I帧,S帧,U帧;
I帧为信息帧,用于传输数据,长度大于6个字节,为长帧;
S帧为确认帧,用于确认接收的I帧,长度为6个字节,为短帧;
U帧为控制帧,用于控制启动/停止/测试,长度为6个字节,为短帧;
长帧报文分为APCI和ASDU两个部分,统称为APDU
短帧报文只有APCI部分
1 U帧
U帧具有不计数的控制功能,长度为6个字节的固定帧长。
用于控制报文。
其中,C表示确认,V表示生效。
U 格式帧使用到以下三种命令
- 启动 U 帧,用于启动应用层 传输控制命令
主站发送:680407000000 从站返回:68040B000000
07 0B为控制域
- 停止 U 帧,用于停止应用层 *传输控制命令 *
主站发送:680413000000 从站返回:680423000000
13 23为控制域
- 测试 U 帧,双方均无发送时,维持链路活动状态控制命令:
主站发送:680443000000 从站返回:680483000000
43 83为控制域
1、U帧只用于控制,并且只存在APCI中(意思就是U帧的apdu报文只会有apci不会存在asdu);
2、测试、停止和开启在一个U帧报文中只可能存在其中的一种。
2 S帧
S 格式具有计数的监视功能, S 格式帧为短帧,长度 6 个字节。
接收方接收到 I 帧数据,但本身没有信息要发送的情况下, S 帧用于确认接收到对方的帧
主站发送 68 04 01 00 0e 00
从站回复 68 04 01 00 1a 00
1、S帧报文格式规定控制域1的第0位为1,第1位为0和控制域第0位为0;
2、S帧报文的发送序列号都为0
3、S帧只用于APCI中(意思就是S帧的apdu报文只会有apci不会存在asdu)。
不能用于传输信息,只用给对方信息的确认,比如子站发送8条报文,结束后主站就会给子站发送一个确认帧(S帧),告诉子站我收到了8条报文。
比如:接收计数为RxCounter
控制域1 = 0x01
控制域2 = 0x00
控制域3 = RxCounter & 0xFE
控制域4 = (RxCounter >> 8) & 0xFF
3 I帧
I帧报文格式规定控制域1和控制域3的最低位为0;
其他部分用于发送序列号和接收序列号的计数;
比如:发送计数为 TxCounter 接收计数为RxCounter
控制域1 = TxCounter & 0xFE
控制域2 = (TxCounter >> 8) & 0xFF
控制域3 = RxCounter & 0xFE
控制域4 = (RxCounter >> 8) & 0xFF
1、I 帧的控制域包含发送序列号和接收序列号两个参数
2、两个序列号在每个 APDU 和每个方向上都应按顺序加一
3、发送序列号和接受序列号在 0~32767 之间循环,发送方增加发送序列号,而接受方增加接收序列号
4、接收站认可连续正确 接收的一个 APDU 或者多个 APDU,将最后一个正确接收的 APDU 的发送序列号作为接收序列号返回
这个接收序列号是对所有发送序列号小于或等于该号的 APDU 的有效确认
如只在一个方向进行较长的数据传输,就得在另一个方向发送 S 格式认可这些 APDU
4 IEC104 协议结构
APDU:应用规约数据单元
APCI:应用规约控制单元
ASDU:应用服务数据单元
ASDU格式如下图
4.1 启动字符
默认固定为 68H,意思就是只要是IEC104协议就是以68H开头
4.2 控制域
控制域主要是有两个功能
1、报文的类型(I帧报文、U帧报文或者S帧报文)
2、记录收发报文的个数
4.3 类型标识
占一个字节,标识出后面的信息体的数据类型
一个 APDU 中信息体中的所有数据的类型都是一致的,在类型标识这个位置标识
4.3.1 监视方向的用户类型
一般从 主站发到从站
4.3.2 控制方向的用户类型
一般从 主站发往从站
4.3.3 监视方向的用户类型
从站发给主站
当厂站(从站)短重新上电、初始化参数、重新分配缓存区等情况下,厂站需要给主站发送该类型,而主站收到该类型的APDU包,主站一般会做一次总召唤;
4.3.4 控制方向的系统类型
主站发往从站
5 举例
5.1 单点遥控
5.1.1 发包
I帧共有两层、第一层为控制域与序列计数
Byte[0] 68 只要是IEC104规约那么开头规定的即为是68
Byte[1] 0e 为长度 自此往后的长度
Byte[3][4] 1c 00 发送序号,计数
Byte[3][4] 1c 00 接收序号,计数
下一层
Byte[0] 2d 为控制符 即为功能码
Byte[1] 01 可变结构限定词、若信息对象的地址不连续则为0、若信息对象的地址连续则为1
Byte[2] 06 传输的原因
Byte[3] 00 公共地址 即RTU站址
Byte[4] 01 00 信息体地址
接下来看IOA这个结构体内的
Byte[0][2] IOA 00 00 00 信息体地址,数据点在数据库中的序号,低位在前高位在后
Byte[0][2] SCO 80 代表单点遥控的分合状态
5.1.2 回包
跟发包都是一样 I帧发送了数据 那么会有S或U帧确认或控制这个信息 所以I帧的回应包与发包一致