IEC104协议

news2024/11/17 17:47:42

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. 主站从站通信过程

  1. 建立tcp连接;
  2. 主站给从站发送启动帧;报文:68 04 07 00 00 00
  3. 从站收到启动帧,给主站发送启动确认帧;报文:68 04 0B 00 00 00
  4. 主站给从站发送总召唤;报文:68 0E 00 00 00 00 64 01 06 00 01 00 00 00 00 14
  5. 从站收到主站的总召唤命令,给主站发送总召唤确认;
  6. 报文:68 0E 00 00 02 00 64 01 07 00 01 00 00 00 00 14
  7. 从站上传遥信,遥测,电度等I帧信息帧,发送完毕从站发送总召唤结束帧;
  8. 主站收到从站发送的结束帧,会回复一个S帧的确认帧;
  9. 进入下一个周期(其中如何数据有变化,从站需要主动上报)

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字节详解
  1. 开启

激活第2位为1 第3位0,如下表所示

激活确认第2为0 第3位1,如下表所示

U帧启动主要是用于 主站连接子站时,主站给子站发送一个U帧启动报文,如下:

主站发送:68 04 07 00 00 00

子站回复:68 04 0B 00 00 00

  1. 停止

激活 第4位为1 第5位0,如下表所示

激活确认 第4为0 第5位1,如下表所示

U帧停止如下:

主站发送:68 04 13 00 00 00

子站回复:68 04 23 00 00 00

  1. 测试

激活 第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    //目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1615071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日本二次元团建国内院线:一周一部,占据36.2%票房

从《你想活出怎样的人生》开始,到《哈尔的移动城堡》结束,日本动画正在占据国内院线的整个4月份档期。 包括《数码宝贝02:最初的召唤》、《间谍过家家 代号:白》多部作品在内,整个国内四月份院线日本动画平均一周上映…

分布式锁(Redis)

一、序言 本文和大家聊聊分布式锁以及常见的解决方案。 二、什么是分布式锁 假设一个场景:一个库存服务部署在上面三台机器上,数据库里有 100 件库存,现有 300 个客户同时下单。并且这 300 个客户均摊到上面的三台机器上(即三台…

4套java智慧型管理系统源码-智慧校园-智慧工地-智慧城管-智慧3D导诊

第一套:Java智慧校园系统源码 智慧学校源码 微信小程序电子班牌 智慧校园系统简介: 智慧校园的建设逐渐被师生、家长认可接受,智慧校园通过对在校师生、教务等所有人员的信息以及各种信息搜集与储存,进行数据优化与管理&#xf…

信息系统项目管理师0057:运维管理(4信息系统管理—4.2管理要点—4.2.2运维管理)

点击查看专栏目录 文章目录 4.2.2运维管理1.能力模型2.智能运维4.2.2运维管理 IT运维是组织IT服务中关键的一种类型。随着组织IT建设的不断深入和完善,信息系统运维已经成为了各行各业各组织管理者和IT团队普遍关注的问题。IT运维是指采用IT手段及方法,依据服务对象提出的服务…

代码学习记录49---单调栈

随想录日记part49 t i m e : time: time: 2024.04.20 主要内容:今天开始要学习单调栈的相关知识了,今天的内容主要涉及:柱状图中最大的矩形 84.柱状图中最大的矩形 Topic184.柱状图中最大的矩形 题目&…

一线实战:国产数据库Mogdb双网卡同步最佳实践

前言 大家都知道Oracle数据库无论是单机还是RAC集群在进行生产部署实施时,我们都会对网卡做冗余考虑,使用双网卡,比如public、心跳网络。这样的目的主要是为了安全,避免单点故障。当然双网卡Bond不仅是可以做主备还可以支持负载均…

问题总结笔记

1.向量旋转 问题: 将一个向量旋转90 方法:旋转矩阵 FVector FrontDir EndMousePoint - Point; FrontDir.Normalize(); FVector Left FVector(-FrontDir.Y, FrontDir.X, 0); Verties.Add(Point Left * (WallWedith / 2)); Verties.Add(FVector(Vertie…

告别数据丢失,轻松掌握文件自动备份秘籍

在这个数字化高速发展的时代,我们的工作和生活都离不开电脑,而电脑中存储的文件和数据更是至关重要。然而,数据丢失的风险无处不在,可能因为硬件故障、软件崩溃、病毒攻击等原因而导致重要文件丢失。因此,文件自动备份…

漫谈HAMR硬盘的可靠性-2

很显然,HAMR已经成为业内用于提升HDD硬盘容量硬盘的技术手段。三家机械硬盘HDD厂商,希捷、西数、东芝都已对HAMR硬盘进行了十多年的研究,但只有希捷大胆押注HAMR。相反,东芝和西部数据在采用HAMR之前选择了能量辅助垂直磁记录&…

iOS 在OC旧项目中使用Swift进行混编

iOS 在OC旧项目中使用Swift进行混编 1、创建桥接文件 ​ 第一次在Swift创建OC文件,或者第一次OC创建Swift时,xcode会提示桥接,Creat Bridging Header即可,这个文件用于Swift调用OC文件,与OC调用Swift无关。 2、在TARGETS中设置D…

机器学习(三)之监督学习2

前言: 本专栏一直在更新机器学习的内容,欢迎点赞收藏哦! 笔者水平有限,文中掺杂着自己的理解和感悟,如果有错误之处还请指出,可以在评论区一起探讨! 1.支持向量机(Support Vector Ma…

第22天:安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用

第二十二天 一、PHP留言板前后端功能实现 开发环境: DW PHPStorm PhpStudy Navicat Premium DW : HTML&JS&CSS开发 PHPStorm : 专业PHP开发IDE PhpStudy :Apache MYSQL环境 Navicat Premium: 全能数据库管理工具 二、数据库创建&架…

【Flutter】One or more plugins require a higher Android SDK version.

问题描述 项目里多个组件需要更高版本的Android SDK One or more plugins require a higher Android SDK version.解决方案: 报错提示requires Android SDK version 34 按提示修改android项目app里build.gradle的compileSdkVersion 为34 android {compileSdkVe…

线程池 ThreadPoolExecutor 参数详解

一、引言 提到 Java 线程池,就不得不说 ThreadPoolExecutor,它是 Java 并发包 java.util.concurrent 中的一个类,提供一个高效、稳定、灵活的线程池实现,用于实现多线程并发执行任务,提高应用程序的执行效率。 在《任…

JVM与GC原理

JVM运行流程 Java 虚拟机(Java Virtual Machine,JVM)是 Java 平台的核心组件之一,它是一个在实际硬件和操作系统上模拟运行 Java 字节码的虚拟计算机 Java 程序被执行的顺序通常包括以下几个步骤: 编辑(E…

Midjourney 中文文档

快速使用 学习如何在Discord上使用Midjourney Bot从简单的文本提示中创建自定义图像。 行为准则 不要表现出不良行为。不要使用我们的工具制作可能引起煽动,不安或引起争议的图像。这包括血腥和成人内容。尊重其他人和团队。 1:加入Discord 访问Midj…

如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 - 第507篇

历史文章 AI音乐,8大变现方式——Suno:音乐版的ChatGPT - 第505篇 日赚800,利用淘宝/闲鱼进行AI音乐售卖实操 - 第506篇 导读 在使用AI生成音乐(AI写歌)的时候,你是不是有这样的困惑: &…

Docker 部署网页版 vscode (code-server)

什么是 code-server code-server 是一个基于 Visual Studio Code 的开源项目,它允许你通过 Web 浏览器来使用 Visual Studio Code 的编辑功能。这意味着你可以在任何设备上,只要有浏览器和网络连接,就可以访问和使用 Visual Studio Code&…

如果备份了oradata文件,该如何还原Oracle数据呢?

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

(mac)性能监控平台搭建JMeter+Grafana+Influxdb

【实现原理】 通过influxdb数据库存储jmeter的结果,再通过grafana采集influxdb数据库数据,完成监控平台展示 一、时间序列数据InfluxDB 1.InfluxDB下载安装 官网下载 https://portal.influxdata.com/downloads/ 官网最新版: &#xff0…