1. 简介
IEC104规约是一个广泛应用于电力、城市轨道交通等行业的国际标准。
2. 术语解释
遥脉 (电度量):
是指对现场某装置所发出的脉冲信号进行周期累计的一种远程计数操作。
其实,遥脉也可以看成是被具体规定了采用脉冲计数作为测量方法的一种遥测手段,它是遥测中的一种。而传统意义上的四遥中是没有提及遥脉一词的。
四遥:
指的是遥信、遥测、遥控和遥调(设点);分别对应数字输入DI、模拟输入AI、数字输出DO和模拟输出AO。
单点与双点的区别:
以遥信为例,单点就是用一位标识一个遥信量,比如开关位置,只采集一个常开的辅助接点,值为1表示合位,0表示分位;而双点需要采集常开合常闭两个辅助接点位置,,当常开点值为1并且常闭点值为0,即10,则认为开关在合位;当常开点值=0并且常闭点值为1,即01,认为开关在分位;当两个位置值都为1,或两个值都为0,则认为开关位置不能确定。遥控也是一样的道理,SPI为遥信状态值。单点遥信,0分1合;双点遥信,1开2合,0和3为中间状态。
遥测的上送方式:
主要有定时主动上送(01H),响应总召唤上送(14H),越限上送(03H),而遥测值又分为归一化值、标度化值、短浮点数。
归一化值(NVA):
值的范围为[-1,1]。归一化,即是将大于1的数映射到1以内的空间,通常就是用实际值除以额定值,即得到归一化的小数。具体表示法可以有F13或F16位的。占2个字节。
标度化值(SVA):
值的范围为[-32768,~32767],即带符号整数。占2个字节。它的真实值就是标度值*小数点的位数,量程和小数点位置是固定的参数。(相当于16位有符号整数)
3. 主站从站通信过程
- 建立tcp连接;
- 主站给从站发送启动帧;报文:68 04 07 00 00 00
- 从站收到启动帧,给主站发送启动确认帧;报文:68 04 0B 00 00 00
- 主站给从站发送总召唤;报文:68 0E 00 00 00 00 64 01 06 00 01 00 00 00 00 14
- 从站收到主站的总召唤命令,给主站发送总召唤确认;
- 报文:68 0E 00 00 02 00 64 01 07 00 01 00 00 00 00 14
- 从站上传遥信,遥测,电度等I帧信息帧,发送完毕从站发送总召唤结束帧;
- 主站收到从站发送的结束帧,会回复一个S帧的确认帧;
- 进入下一个周期(其中如何数据有变化,从站需要主动上报)
4. ICE104协议结构
APDU:应用规约数据单元
APCI: 应用规约控制单元
ASDU:应用服务数据单元
4.1 APDU 整体结构图
4.2 APCI控制单元
APCI报文说明:
第一个字节:默认固定 0x68 (表示启动字符)
第二个字节:表示APDU总长度(该长度不包含,启动字符和本身长度), 不超过255字节
4.2.1 I帧报文
第3和4个字节: 发送序号 (每发送一个数据包就加1)
第5和6个字节: 接收序号
实际抓包分析:
4.2.2 S帧报文
第3和4个字节:0x01
第5和6个字节: 接收序号
实际抓包分析:
4.2.3 U帧报文
U帧只用于控制,并且只存在APCI中(意思就是U帧的apdu报文只会有apci不会存在asdu);
第3个字节:详情继续查看 U帧3字节详解
第4~6字节: 固定为0
4.2.3.1 U帧3字节详解
- 开启
激活第2位为1 第3位0,如下表所示
激活确认第2为0 第3位1,如下表所示
U帧启动主要是用于 主站连接子站时,主站给子站发送一个U帧启动报文,如下:
主站发送:68 04 07 00 00 00
子站回复:68 04 0B 00 00 00
- 停止
激活 第4位为1 第5位0,如下表所示
激活确认 第4为0 第5位1,如下表所示
U帧停止如下:
主站发送:68 04 13 00 00 00
子站回复:68 04 23 00 00 00
- 测试
激活 第6位为1 第7位0,如下表所示
激活确认 第6为0 第7位1,如下表所示
比如:子站发送U帧测试(激活),主站收到测试U帧就会回复一个U帧(确认)
子站发送:68 04 43 00 00 00
主站发送:68 04 83 00 00 00
实际抓包分析:
4.3 ASDU服务数据单元
4.3.1 类型标识
本数据单元的第一个字节就是类型标识。
4.3.1.1 从站 -> 主站
4.3.1.2 主站 -> 从站
4.3.1.3 监视方向的系统类型
4.3.1.4 控制方向的系统类型
实际抓包分析:
4.3.2 可变结构限定词
SQ = 0 :信息对象的地址不连续(意思就是每个信息对象都会一个对象地址)
SQ = 1 : 信息对象的地址连续 (只有第一个信息对象有地址,其他对象的地址就是累加1)
Tips:总召唤时,为了压缩信息传输时间SQ=1;而在从站主动上传变化数据时,因为地址不连续,采用SQ=0;
实际抓包分析:
4.3.3 传送原因
占2个字节
T = 0 未试验 ; T = 1 试验 (一般 T= 0)
P/N = 0 肯定 ; P/N = 1 否定 (正常为P/N = 0;P/N = 1说明该报文无效)
源发地址:用来记录来时哪个主站的响应数据,一般写 0;
传送原因:
实际抓包分析:
4.3.4 应用服务数据单元公共地址
- 占2个字节
- 规定高位字节 0x00
- 站地址: 1-254 为站地址;255为全局地址;
实际抓包分析:
4.3.5 信息体
4.3.5.1 连续信息传输型
带绝对时标(遥测)
- 说明:连续、带时标的 ASDU数据部分结构如上表分为:
-
- 地址编号:第一个信息体数据的地址(只会出现一次)
- 重复信息体数据+品质描述词 (地址=第一个地址按顺序+1推算出来)
- 最后以绝对时标结束
不带绝对时标(遥测)
- 说明:连续、不带时标的 ASDU数据部分结构如上表分为:
-
- 地址编号:第一个信息体数据的地址(只会出现一次)
- 重复信息体数据+品质描述词 (地址=第一个地址按顺序+1推算出来)
带绝对时标(遥信)
对于遥信,状态量和品质描述词 合在了一个字节中
不带绝对时标(遥信)
对于遥信,状态量和品质描述词 合在了一个字节中
4.3.5.2 非连续信息传输型
带绝对时标(遥测)
- 说明: 不连续、带时标的 ASDU数据部分结构如上表分为:
-
- 每一个信息体数据都会有一个地址编号
- 绝对时标结尾
不带绝对时标(遥测)
- 说明: 不连续、带时标的 ASDU数据部分结构如上表分为:
-
- 每一个信息体数据都会有一个地址编号
带绝对时标(遥信)
不带绝对时标(遥信)
4.3.5.3 品质描述词
单点信息品质描述词
BL : 封锁标志;BL=0 未被封锁;BL=1 封锁;
SB: 取代标志;SB=0 未被取代;SB = 1 被取代;
NT:刷新标志;NT=0 刷新成功;NT=1 刷新未成功;
IV:有效标志;IV = 0 状态有效;IV = 1 状态无效;
RES: 保留位
SPI:遥信状态值(0=开;1=合) 【具体的值,占一个bit位】
双点信息品质描述词
BL : 封锁标志;BL=0 未被封锁;BL=1 封锁;
SB: 取代标志;SB=0 未被取代;SB = 1 被取代;
NT:刷新标志;NT=0 刷新成功;NT=1 刷新未成功;
IV:有效标志;IV = 0 状态有效;IV = 1 状态无效;
RES: 保留位
SPI:遥信状态值(0=不确定状态或中间装填;
1=确定状态的开;
2=确定状态的合;
3=不确定状态或中间装填)【具体的值,占2个bit为必然有4个值】
遥测品质描述词
BL : 封锁标志;BL=0 未被封锁;BL=1 封锁;
SB: 取代标志;SB=0 未被取代;SB = 1 被取代;
NT:刷新标志;NT=0 刷新成功;NT=1 刷新未成功;
IV:有效标志;IV = 0 状态有效;IV = 1 状态无效; (tips:如何无效说明该遥测数据无效)
RES: 保留位;
OV:溢出标志;OV=0 未溢出;OV=1 遥测超出量程,发生溢出
4.3.5.4 绝对时标
实际抓包分析:
4.3.5.5 遥控和设定值
单点遥控信息
- S/E = 0 遥控执行命令;S/E=1 遥控选择命令;
- QU = 0 被控占内部确定遥控输出方式,不有控制站选择;
1 短脉冲方式输出
2 长脉冲方式输出
3 持续脉冲方式输出
其他值没有定义
- RES :保留位
- SCS : 设置值; 0 = 控开 ;1 = 控合
双点遥控信息
设定值(遥测)
除了类型编号: 136 存在多点设定外,其他都是单个信息体设置值
QOS:设定命令限定词
- S/E : 0 设定执行;1 设定选择;
- 设定命令限定词: 基本就是 0 ,因为其他并没有定义;
实际抓包分析:
5. 协议代码
5.1 协议报文结构体
typedef struct _apci_ {
unsigned char head;
unsigned char len; //不包含头和自身,最大253B
union {
unsigned int ctrl; //控制域
struct {
unsigned char ctrl1;
unsigned char ctrl2;
unsigned char ctrl3;
unsigned char ctrl4;
} ctrl_st;
};
} IECAPCI, *PIECAPCI;
//此结构仅适合标准的主站(即reason,station和point长度定义为2,2,3)
typedef struct _asdue_ {
unsigned char idtype; //类型标识
union {
unsigned char qualifier; //限定词
struct {
unsigned char qf_num: 7;
unsigned char qf_sq: 1; //0离散信息报告,1顺序信息报告
} qualifier_st;
};
union {
unsigned short reason; //传输原因
struct {
unsigned char rs_cause: 6;
unsigned char rs_pn: 1; //0未试验,1试验
unsigned char rs_t: 1; //0肯定确认,1否定确认
unsigned char rs_src; //源发地址
} reason_st;
};
unsigned short station; //公共地址
unsigned char point[3]; //信息体地址
} IECASDU_E, *PIECASDU_E;
5.2 协议ASDU标识
/*******************************************************************************************
*
* ASDU类型标识定义
*
*******************************************************************************************/
//1--1 监视方向的过程信息, RTU向主站上传的报文类型
#define M_SP_NA_1 0x01 //单点信息 (总召唤遥信、变位遥信)
#define M_SP_TA_1 0x02 //带时标单点信息 (SOE事项)
#define M_DP_NA_1 0x03 //双点信息
#define M_DP_TA_1 0x04 //带时标双点信息 ??标准里的定义重复, 根据PMA修订
#define M_ST_NA_1 0x05 //步位置信息
#define M_ST_TA_1 0x06 //带时标步位置信息
#define M_BO_NA_1 0x07 //32比特串
#define M_BO_TA_1 0x08 //带时标32比特串
#define M_ME_NA_1 0x09 //测量值,规一化值 (越限遥测)
#define M_ME_TA_1 0x0A //测量值,带时标规一化值
#define M_ME_NB_1 0x0B //测量值,标度化值
#define M_ME_TB_1 0x0C //测量值,带时标标度化值
#define M_ME_NC_1 0x0D //测量值,短浮点数
#define M_ME_TC_1 0x0E //测量值,带时标短浮点数
#define M_IT_NA_1 0x0F //累计量 (电度量)
#define M_IT_TA_1 0x10 //带时标累计量
#define M_EP_TA_1 0x11 //带时标继电保护装置事件
#define M_EP_TB_1 0x12 //带时标继电保护装置成组启动事件
#define M_EP_TC_1 0x13 //带时标继电保护装置成组输出电路信息
#define M_PS_NA_1 0x14 //具有状态变位检出的成组单点信息 ??标准里的定义重复, 根据PMA修订
#define M_ME_ND_1 0x15 //测量值,不带品质描述的规一化值 (总召唤遥测量)
#define M_SP_TB_1 0x1E //带时标CP56TimE2A的单点信息
#define M_DP_TB_1 0x1F //带时标CP56TimE2A的双点信息
#define M_ST_TB_1 0x20 //带时标CP56TimE2A的步位信息
#define M_BO_TB_1 0x21 //带时标CP56TimE2A的32位串
#define M_ME_TD_1 0x22 //带时标CP56TimE2A的规一化测量值
#define M_ME_TE_1 0x23 //测量值,带时标CP56TimE2A的标度化值
#define M_ME_TF_1 0x24 //测量值,带时标CP56TimE2A的短浮点数
#define M_IT_TB_1 0x25 //带时标CP56TimE2A的累计值
#define M_EP_TD_1 0x26 //带时标CP56TimE2A的继电保护装置事件
#define M_EP_TE_1 0x27 //带时标CP56TimE2A的成组继电保护装置成组启动事件
#define M_EP_TF_1 0x28 //带时标CP56TimE2A的继电保护装置成组输出电路信息
//1--2 在监视方向的系统信息, RTU向主站上传的报文类型
#define M_EI_NA_1 0x46 //初始化结束
//2--1 在控制方向的过程信息, RTU须逐条对命令用相同报文确认
#define C_SC_NA_1 0x2D //单命令 (遥控)
#define C_DC_NA_1 0x2E //双命令 (遥控)
#define C_RC_NA_1 0x2F //升降命令
#define C_SE_NA_1 0x30 //设定值命令,规一化值 (遥调)
#define C_SE_NB_1 0x31 //设定值命令,标度化值
#define C_SE_NC_1 0x32 //设定值命令,短浮点数
#define C_BO_NA_1 0x33 //32比特串
#define C_SC_TA_1 0x3A //带时标CP56TimE2A的单命令
#define C_DC_TA_1 0x3B //带时标CP56TimE2A的双命令
#define C_RC_TA_1 0x3C //带时标CP56TimE2A的升降命令
#define C_SE_TA_1 0x3D //带时标CP56TimE2A的设定值命令,规一化值
#define C_SE_TB_1 0x3E //带时标CP56TimE2A的设定值命令,标度化值
#define C_SE_TC_1 0x3F //带时标CP56TimE2A的设定值命令,短浮点数
#define C_BO_TA_1 0x40 //带时标CP56TimE2A的32比特串
//2--2 在控制方向的系统信息, RTU须逐条形成镜像报文
#define C_IC_NA_1 0x64 //总召唤命令 (总召唤)
#define C_CI_NA_1 0x65 //电能脉冲召唤命令 (召唤电度量)
#define C_RD_NA_1 0x66 //读命令
#define C_CS_NA_1 0x67 //时钟同步命令 (校时)
#define C_TS_NA_1 0x68 //测试命令
#define C_RP_NA_1 0x69 //复位进程命令
#define C_CD_NA_1 0x6A //延时传输命令
#define C_TS_TA_1 0x6B //带时标CP56TimE2A的测试命令
//2--3 在控制方向的参数命令
#define P_ME_NA_1 0x6E //测量值参数,规一化值
#define P_ME_NB_1 0x6F //测量值参数,标度化值
#define P_ME_NC_1 0x70 //测量值参数,短浮点数
#define P_AC_NA_1 0x71 //参数激活
//3--1 文件传输
#define F_FR_NA_1 0x78 //文件准备好
#define F_SR_NA_1 0x79 //节已准备好
#define F_SC_NA_1 0x7A //召唤目录,选择文件,召唤文件,召唤节
#define F_LS_NA_1 0x7B //最后的节,最后的度
#define F_AF_NA_1 0x7C //确认文件,确认节
#define F_SG_NA_1 0x7D //段
#define F_DR_TA_1 0x7E //目录