大家好,又见面了,我是你们的朋友全栈君。
内容包括IEC101/104规约术语及释义(嵌入实际工程C代码),IEC101/104规约标准与遥测量类型转换介绍,IEC101规约遥信、遥测与遥控及加密。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易!
目录:
一、IEC101/104规约标准介绍
1、引言
2、方法
1)归一化值 2)标度化值 3)短浮点数(浮点数基础知识)
3、参考
4、IEC101/104规约一般说明
1)101规约说明书一 2)101规约说明书二 3)101规约说明书三 4)101规约需要完成的功能
二、IEC101/104规约遥测量类型转换
三、IEC101/104规约术语及释义
1、术语摘要
2、术语释义
1)链路功能码释义 2)TI类型标识的释义 3)COT传送原因的释义 4)信息体地址说明
5)品质描述词释义 6)可变帧长帧释义 7)CP56time2a时间格式释义
3、一级数据、二级数据
四、IEC101规约遥信、遥测与遥控及加密
1、概述
1)遥测 2)遥信 3)遥控
——————————————————
总结:
1、IEC101用于串口通调度,属于远动规约;IEC104是IEC101的网络版,属于远动规约。
2、IEC101/104规约有两种传输方式:平衡式和非平衡式传输。
1)在点对点和多个点对点的全双工通道结构中采用平衡式传输方式,在其它通道结构中只采用非平衡式传输方式。
2)平衡式传输方式中IEC101规约是一种“问答 循环”式规约(Polling),即主站端和子站端都可以作为启动站;而当其用于非平衡式传输方式时IEC101规约是问答式规约,只有主站端可以作为启动站。
3、IEC103有串口以太网之分,通保护装置属于继电保护规约,可见“电力103规约主站端实现”;Modbus用于RS485(也有串口)通保护装置,属于继电保护规约。
—————————————————————————————————-—————-
一、IEC101/104规约标准介绍
IEC101与IEC104是国际标准,DL634是中国电力行业标准,从IEC101翻译过来并增加具有中国特色的补充规定。
DLT 634.5101-2002 远动设备及系统 第5-101部分 传输规约基本远动任务配套标准;
GBT 18657.2-2002 远动设备及系统 第5部分传输规约 第2篇链路传输规约;
DLT 634.5104-2009 远动设备及系统 第5-104部分:传输规约 采用标准传输规约集的IEC 60870-5-104网络访问。
基本架构与OSI模型对比如下图:
三层
五层
———————————————————————————————————————
二、IEC101/104规约遥测量类型转换
1、引言
DL/T634.5101-2002和DL/T634.5104-2009标准中遥测量的标识类型有归一化值NVA,标度化值SVA,短浮点数R32-IEEE
STD 754,本文介绍利用union数据类型完成字节数组向这三种类型转换的方法。
在IEC60870-5-101、103、104中,指出遥测值上送支持三种标准:归一化、标度化、短浮点数。其中归一化的处理比较繁琐,尤其是将真实值与归一化值做相互转换的时候,假如按照规约的处理方式会变得十分麻烦,这儿给出一个极其简单的转换公式,以供大家参考:
f(归一) = f(真实) * 32767 / 满码值 公式1
f(真实) = f(归一) * 满码值 / 32767 公式2
注:在对负数做归一化处理时,有将32767变为32768来处理的情况。
其中,满码值是通信双方约定的一个值,这个值一般是真实值的上限,也就是说真实的值应该小于该值。假如真实值大于满码值,将会发生溢出的情况。但满码值不宜取的过大。因为在归一化转换和还原的时候,必然会出现数值的误差情况,具体误差跟满码值有直接的关系,可以自行验证。
——————————————-
2、方法
定义union数据类型,该union类型定义了多种不同数据类型的内部变量,但各个内部变量共享一段内存,在不同时间里保存不同的数据类型和长度的变量,此处共只占用4个字节。
typedef unsigned char BYTE;
typedef unsigned long DWORD;
typedef union // 4 bytes
{
bool bBool; // int value
BYTE byBuf[4]; // Buffer
short int nInt; // 16 bits integer
unsigned short int snInt; // 16 bits unsigned integer
long l; // 32位有符号 2,147,483,648 to 2,147,483,647
DWORD dw; // 32位无符号整数 0 to 4,294,967,295
float f; // 32位 3.4E /- 38 (7 digits)
} EXC_DataType;
———————
1)归一化值
NVA:=F16[1…16]<−1… 1−2^−15>
归一化值由两个字节组成。1位符号位,0表示正数,1表示负数。15位数据位,正数是原码,负数是补码。
float Bytes2Float_NVA( const QByteArray &bytes )
{
float fVal;
EXC_DataType unDataType;
unDataType.dw = 0; //初始化清零
unDataType.byBuf[0] = bytes[0]; //低位
unDataType.byBuf[1] = bytes[1]; //高位
if (unDataType.snInt<0) //负数
{//负数:补码转换,取反加一
unDataType.byBuf[1] = unDataType.byBuf[1] & 0x7F; //除符号位外按位异或,取反
unDataType.usnInt ^=0xffff;
unDataType.usnInt ;
unDataType.byBuf[1] = unDataType.byBuf[1] & 0xFF;
fVal = (float)unDataType.snInt; //-32768–0
}
else //正数:原码
fVal = (float)unDataType.snInt; // 0–32767
return fVal/32768;//2^15=32768
}
———————
2)标度化值
标度化值也由两个字节组成。1位符号位,0表示正数,1表示负数。15位数据位,正数是原码,负数是补码。
float Bytes2Float_SVA( const QByteArray &bytes )
{
float fVal;
EXC_DataType unDataType;
unDataType.dw = 0; //初始化清零
unDataType.byBuf[0] = bytes[0]; //低位
unDataType.byBuf[1] = bytes[1]; //高位
if (unDataType.snInt<0) //负数
{//负数:补码转换,取反加一
unDataType.byBuf[1] = unDataType.byBuf[1] & 0x7F; //除符号位外按位异或,取反
unDataType.usnInt ^=0xffff;
unDataType.usnInt ;
unDataType.byBuf[1] = unDataType.byBuf[1] & 0xFF;
fVal = (float)unDataType.snInt; //-32768–0
}
else //正数:原码
fVal = (float)unDataType.snInt; // 0–32767
return fVal;
}
———————
3)短浮点数(浮点数基础知识)
R32-IEEE STD 754:=R32.23{Fraction,Exponent,Sign}
小数Fraction:=U32,23[1…23]<0…1−2−23>
指数Exponent:=U32,8[24…31]<0…255>
符号Sign:=BS1[1]
短浮点数由四个字节组成。1位符号位,0表示正数,1表示负数。 由于C语言中浮点数本身就是采用IEEE格式来存储的,可巧妙利用union数据类型实现两者之间的转换,如下:
float Bytes2Float_IEEE754( const QByteArray &bytes )
{
EXC_DataType unDataType;
unDataType.dw = 0; //初始化清零
unDataType.byBuf[0] = bytes[0]; //低位
unDataType.byBuf[1] = bytes[1];
unDataType.byBuf[2] = bytes[2];
unDataType.byBuf[3] = bytes[3]; //高位
return unDataType.f; //直接返回float类型即为IEEE格式
}
关于短浮点数更为详细的描述参看:“(*(volatile unsigned long *)) 的理解”。
———————
规约里短浮点数(带品质参数)7B D4 44 40 00 十六进制 为什么代表的是3.07547(十进制)?
去掉品质位,实际值为40 44 D4 7B,转化为二进制:0100 0000 0100 0100 1101 0100 0111 1011
其中,把上面的二进制数划分如下:
符号位 | 指数位(阶码表示,8位) | 有效位(尾码)
0 100 0000 0 100 1101 0100 0111 1011
其中把阶码提取:(100 0000 0)10-127=128-127=1(小数点位置)
尾码加一位1变成:1100 1101 0100 0111 1011
实际值为(11.001101010001111011)2=(11.001101)2=3.07547
——————————————-
3、参考
1)电力101/104规约中遥测数据归一化问题
2)C程序中用union实现浮点数与IEEE格式转换
——————————————-
4、IEC101/104规约一般说明
1)101规约说明书一 2)101规约说明书二 3) 101规约说明书三 4)101规约需要完成的功能
应用数据封装,发送到物理层或相反
提供链路状态指示
报文重传
FCB、DFC位的处理(见下)
控制物理层
防止数据碰撞
响应有效报文
—————————————————————————————————–—————-
三、IEC101/104规约术语及释义
摘自“DLT 634.5101-2002 远动设备及系统 第5-101部分 传输规约基本远动任务配套标准”。
1、术语摘要
A | 地址域 |
---|---|
ACD | 请求访问位,ACD=1:表示终端有1级用户数据,希望向主站传输 |
ASDU | 应用服务数据单元是(Application Server Data Unit) |
BCR | 二进制计数器读数 |
C | 控制域 |
COI | 初始化原因 |
CON | 控制命令 |
COS | 状态量变化(事件变位记录) |
COT | 传送原因(CAUSE OF TRANSMISSION) |
CP56Time2a | 七个字节二进制时间 |
CS | 帧校验和 |
DIQ | 带品质描述词的双点信息 |
DIR | 传输方向位 0:主站->终端 |
DTU | 站所终端 |
EPA | 增强性能体系结构 |
FBP | 固定测试图像 |
FC | 链路功能码(Function Code) |
FCB | 帧计数位 |
FCV | 帧计数有效位 1:帧计数位FCB变化有效 |
FTU | 馈线终端 |
QRP | 复位进程命令限定词 |
L | 报文长度(Length) |
NVA | 归一化值 |
PI | 参数特征标识 |
QCC | 电能量命令限定词 |
QDS | 品质描述词 |
QOC | 命令限定词 |
QOI | 召唤限定词 |
QRP | 复位进程命令限定词 |
S/E | 选择/执行(Select/Execute) |
SCO | 单点命令(Single Command) |
SIQ | 带品质描述词的单点信息 |
SOE | 事件顺序记录(Sequence Of Event) |
SQ | 单个或者顺序(Single or Sequence) |
SVA | 标度化值 |
TI | 类型标识(TYPE IDENTIFICATION) |
VSQ | 可变结构限定词(VARIABLE STRUCTURE QUALIFIER) |
SRQ | 节准备就绪限定词 |
SCQ | 选择和召唤文件限定词 |
LSQ | 最后的节和段限定词 |
AFQ | 文件或节认可限定词 |
NOF | 文件名称 |
NOS | 节名称 |
SOF | 文件状态 |
QOS | 设定命令限定词 |
COA | 公共地址 |
———————
主站 –> 子站
传输方向位DIR DIR=0,表示报文是由主站向子站传输。
启动报文位PRM PRM=1,表示主站向子站传输,主站为启动站。
帧计数位FCB 主站向同一个子站传输新一轮的发送/确认(SEND/CONFIRM)或请求/响应(REQUEST/RESPOND)传输服务时,将FCB 位取相反值,主站为每一个子站保留一个帧计数位的拷贝,若超时没有从子站收到所期望的报文,或接收出现差错,则主站不改变帧计数位(FCB)的状态,重复传送原报文,重复次数为3 次。子站应在接收报文后分析判断FCB位,如子站接收报文的FCB位未改变,则子站重发原来的帧,否则通信不正确。若主站正确收到子站报文,则该一轮的发送/确认(SEND/CONFIRM)或请求/响应(REQUEST/RESPOND)传输服务结束。复位命令的帧计数位常为0,帧计数有效位FCV=0。
帧计数有效位FCV FCV=0 表示帧计数位(FCB)的变化无效。FCV=1 表示帧计数位(FCB)的变化有效。 发送/无回答服务、重传次数为0的报文、广播报文时不需考虑报文丢失和重复传输,无需改变帧计数位(FCB)的状态,因此这些帧的计数有效位常为0。
子站 –> 主站
传输方向位DIR DIR=1 表示报文是由子站向主站传输。
启动报文位PRM PRM=0 表示子站向主站传输,子站为从动站。
要求访问位ACD ACD=1 表示子站希望向主站传输1 级数据。
数据流控制(DFC) DFC=0 表示子站可以继续接收数据。DFC=1 表示子站数据区已满,无法接收新数据。
——————————————-
2、术语释义
1)链路功能码释义
包含链路复位、链路测试发送/确认、用户数据发送/确认、请求链路状态。
———————
2)TI类型标识的释义
———————
3)COT传送原因的释义
———————
4)信息体地址释义
信息体地址(点号=信息体地址-起始地址)
———————
5)品质描述词释义
SIQ: CP8{ SPI, RES, BL, SB, NT, IV}带品质描述词单点信息释义
SPI: BS1[1]<0..1> 0 分开,1合闭
IV: BS1[8]<0..1>,0有效,1溢出(被闭锁/被取代/非当前值/无效)
QDS: CP8{ OV,RES,BL,SB,NT,IV} 释义
OV: BS1[1] <0..1> ,0未溢出,1 溢出
RES: BS2~4[0]<0> ,保留
BL: BS1[5]<0..1>,0未被闭锁,1被闭锁
SB: BS1[6]<0..1>,0未被取代,1被取代
NT: BS1[7]<0..1>,0当前值,1非当前值
IV: BS1[8]<0..1>,0有效,1溢出(被闭锁/被取代/非当前值/无效)
———————
6)可变帧长帧释义
以总召帧为例,报文解析详见“平衡式101规约报文解析之二、配置说明”
u8 send_U0data[150];
void U0_messure() //总召时的模拟量
{ …………………………………………………………………
send_U0data[len ]=0x68; //可变帧长帧
send_U0data[len ]=0; //数据长度
send_U0data[len ]=0; //数据长度
send_U0data[len ]=0x68; //可变帧长帧
FCB的处理(略),作用见本文“4、IEC101/104规约一般说明”。
send_U0data[len ]=ComInformation.address&0XFF; //应用服务单元公共地址高位(链路地址高位)
send_U0data[len ]=(ComInformation.address>>8)&0XFF; //应用服务单元公共地址低位(链路地址低位)
send_U0data[len ]=0x09; //类型标识9 (测量值,归一化值)
另见本节1)TI类型标识的释义图片
send_U0data[len ]=0x84; //可变结构限定词
//关于SQ见“电力101/104规约基础二之1.3 应用服务数据单元ASDU”
Bit7=SQ=1连续单点信息,0x84表示连续4个单点信息(信息体数目为4)
send_U0data[len ]=0x14; //传送原因低位,0x14=20D响应站召唤,见本节2)COT传送原因的释义图片
send_U0data[len ]=0; //传送原因高位
另见本节2)COT传送原因的释义图片
BIT7: T: 0未实验,1实验;
BIT6: P/N: 0肯定认可,1否定认可;
BIT5~BIT0传送原因
send_U0data[len ]=ComInformation.address&0XFF; //应用服务单元公共地址高位(链路地址高位)
send_U0data[len ]=(ComInformation.address>>8)&0XFF; //应用服务单元公共地址低位(链路地址低位)
send_U0data[len ]=0x01; //信息体地址高位
send_U0data[len ]=0x40; //信息体地址低位
…………………………………………………………………
send_U0data[1]=len-4;
send_U0data[2]=len-4;
send_U0data[len ]=tempdata; //保存数据长度到帧
send_U0data[len ]=0x16; //结束帧
sendU0data_length=len; //备份长度,用于重发
U0lengthbak=sendU0data_length;
UART_Write(send_U0data,sendU0data_length); //串口发送
}
void U0_resend (void) //重发数据
{
sendU0data_length=U0lengthbak; //将先前备份的数据长度送入sendU0data_length等待发送
U0_FuncTab[0].status=0x5555; //重发一次
UART_Write(send_U0data,sendU0data_length); //将本地数组的内容重发
}
———————
7)CP56time2a时间格式释义
CP56time2a是101/104规约中定义的时间格式,101和104是电力通信规约的一种,2000年左右进行了修订,现在使用的104规约应该就是2000年的版本。 根据以前下载的一个文档的说明,104规约应该是默认的20xx年了,所以xx是从00-99年,所以7bit能表示00-99就可以了。毕竟一种规约能用一百年,已经了不起了。
——————————————-
3、一级数据、二级数据
一级数据主要包括SOE、动作事件等;二级数据主要是遥测。
———————————————————————————————————————
四、IEC101遥信、遥测与遥控及加密
1、概述
遥测和遥信是配电终端向调度中心传送信息,遥控是调度中心向配电终端下达的操作命令,直接干预电网的运行。
1)遥测
———————
2)遥信
单点遥信和双点遥信在地址上不区分,都是遥信量。无论单点还是双点,存储单位都是字节或字。单点双点跟存储单元无关,跟地址无关。
单点遥信是用一位表示一个遥信量,比如开关位置,只采集一个常开的辅助接点,值为1表示合位,0表示分位;
68 0C 0C 68 F3 64 00 01 01 03 00 64 00 17 00 00 D7 16
68 13 13 68 D3 64 00 1E 01 03 00 64 00 17 00 00 F8 6C 31 0C 0B 0C 15 A1 16
双点遥信需要采集常开和常闭两个辅助接点位置:当常开点值=1并且常闭点值=0,则认为开关在合位(0x10);当常开点值=0并且常闭点值=1,认为开关在分位(0x01);当两个位置值都为1,或者两个值都为0,则认为开关位置不能确定。
68 0C 0C 68 F3 64 00 03 01 03 00 64 00 01 00 01 C4 16 分位
68 13 13 68 D3 64 00 1F 01 03 00 64 00 01 00 01 31 2A 1F 0C 0B 0C 15 72 16
68 0C 0C 68 F3 64 00 03 01 03 00 64 00 01 00 10 D3 16 合位
68 13 13 68 D3 64 00 1F 01 03 00 64 00 01 00 10 79 3C 1F 0C 0B 0C 15 DB 16
———————
3)遥控
(1)返送校核
要求有很高的可靠性。在遥控过程中,采用“返送校核”的方法,实现遥控命令的传送。所谓“返送校核”是指配电终端接收到调度中心的命令后,为了保证接收到的命令能正确地执行,对命令进行校核,并返送给调度中心的过程。
配电终端向调度中心运送的校核信息,用以指明配电终端所收到命令与主站原发的命令是否相符以及配电终端能否执行遥控选择命令的操作。为此,配电终端校核包括三个方面:
校核遥控选择命令的正确性,即检查性质码是否正确,检查遥控对象号是否属于本配电终端;
检查配电终端遥控输出对象继电器和性质继电器是否能正确动作。下图给出了遥控过程中调度中心和配电终端的命令和信息的传送顺序;
遥控命令,包括返校信息均连送三遍。
遥控选择 → 返校 → 执行
校核内容可能包含有位处、远方/就地状态、配电终端地址等。比如处于合位发出合闸指令无效、处于就地发出合闸/分闸指令无效、地址错误等。
(2)单点遥控与双点遥控
遥控命令限定词(DCO)可见: 101规约说明书三 。
———————————————————————————————————————
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151382.html原文链接:https://javaforall.cn