大家好,又见面了,我是你们的朋友全栈君。
说明:文章大部分内容参考自网络,填写原创是因为转载只能填写一个连接
主要参考文章:
https://www.cnblogs.com/meandme/p/10112380.html
https://blog.csdn.net/chenyitao736866376/article/details/99120024
http://www.myexception.cn/c-sharp/1801406.html
http://www.doc88.com/p-096107619768.html
(参考的较多,就不一一列举了)
摘要
本文主要介绍软件从业人员或者对104协议感兴趣的相关人员如何从零入手IEC104规约,文章包括对104规约的定义、结构、类型、读取、解析等内容,内容分为以下几个方面。(作者也是刚接触104规约,有哪里写的不对的请留言指正,有些图片内容参考自网络,如有侵权请留言联系我)
1. 怎么使用编程语言采集104规约数据
2. 什么是104规约
3. 104规约结构分析
4. 104规约报文类型
5. 发送和接收序号维护
6. 遥信报文解析
7. 遥测报文解析
8. 电度报文解析
-
前言扩展:
方便理解,这里先说一下字节和位的关系
1字节(byte) = 8位(bit)
1kb = 1024byte
位是计算机内部数据存储的最小单位,而字节是计算机中数据处理的基本单位。
扩展 {
咱们的计算机有32位和64位,这里的位是指计算机的字长,字长决定了CPU一次操作能够处理的实际位数,也是衡量计算机性能的一个重要指标,32位的系统CPU可寻址范围是2^32也就是4G内存,64位就是2^64具体多少内存自己算吧
32位操作系统,1字=4字节=32位
}
-
1. 怎么使用编程语言采集104规约数据
1. 不管用什么语言,首先根据从站Slave端的IP和端口(默认2404)建立TCP链接(需要编码实现的是主站Master,被采集的是从站Slave)。
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. 从站收到主站的总召唤命令,给主站发送总召唤确认,报文内容:68 0E 00 00 02 00 64 01 07 00 01 00 00 00 00 14
6. 从站上传遥信,遥测,电度等I帧信息帧(一般主站接收8帧I帧,回复一帧S帧),发送完毕从站发送总召唤结束帧。
7. 主站收到从站发送的结束帧,会回复一个S帧的确认帧。
8. 然后进入下一个周期。
-
2. 什么是104规约
IEC 104(IEC 60870-5-104)协议主要用于电力系统控制和信息采集。
百度百科给出的定义是:IEC104规约由国际电工委员会制定。IEC104规约把IEC101的应用服务数据单元(ASDU)用网络规约TCP/IP进行传输的标准,该标准为远动信息的网络传输提供了通信规约依据。采用104规约组合101规约的ASDU的方式后,可很好的保证规约的标准化和通信的可靠性。
104规约是在101规约的基础上演化而来的,104规约主要运用于变电站远动数据传输,对于像电厂这样的电力生产企业,104规约很少使用,更多的是OPC和Modbus,笔者对OPC和Modbus比较熟悉,接触104较晚的原因主要是业务限制,还有就是104规约相对于OPC和Modbus更加繁琐,不易上手。
(延伸:这里引用宋老师的一句话“技术问题是无法回避的,要尽快解决”,早在08年的时候因为公司业务需要,要求从远动设备采集数据,当时对Modbus更加熟悉,就没有研究104的使用,后来因为乙方的通讯软件不支持Modbus浮点数据传输,被迫重整数采接口,才开始使用104规约。对OPC和Modbus感兴趣的朋友可以参考我的另外两篇文章)
-
3. 104规约结构分析
-
APDU:
应用规约数据单元
-
APCI:
应用规约控制单元
-
ASDU:
应用服务数据单元
104规约分为长帧报文和短帧报文两种,长帧报文(APDU)分为APCI和ASDU两个部分,而短帧报文只有APCI部分。
APDU构成如下图:
(图片来自网络)
1. 启动字符
默认固定为 68H,意思就是只要是IEC104协议就是以68H开头。
2. APDU长度
104规约规定一个APDU报文最长为255个字节(包括启动字符和长度标识),所以APDU的最大长度为253,APDU长度包括APCI的4个控制域8位位组和ASDU,因此ASDU的最大长度为249,这一规定限制了一个APDU报文最多能发送121个不带品质描述的归一化测量值或243个不带时标的单点遥信信息,如果子站RTU或监控系统采集的信息量超过此数目,则须分成多个APDU进行发送。
3. 控制域
控制域主要是区分报文类型,以及记录收发报文个数。APDU控制域定义了保护报文不至丢失和重复传送的控制信息、报文传送启停、传输连接的监视等,包括4个8位位组,根据其定义,将APDU分为3种报文格式,即I帧格式(编号的信息传输)、S帧格式(编号的监视功能)、U帧格式(未编号的控制功能),对于如何区分这三种格式,下面一节会讲解。
4. 类型标识
一个apdu中信息体中的所有数据的类型都是一致的,类型标识就是对数据类型的解释。常用的类型标识如下:
-
遥测:
09———带品质描述的测量值,每个遥测值占3个字节
0a———带3个字节时标的且具有品质描述的测量值,每个遥测值占6个字节
0b———不带时标的标度化值,每个遥测值占3个字节
0c———带3个时标的标度化值,每个遥测值占6个字节
0d———带品质描述的浮点值,每个遥测值占5个字节
0e———带3个字节时标且具有品质描述的浮点值,每个遥测值占8个字节
15———不带品质描述的遥测值,每个遥测值占2个字节
-
遥信:
01———不带时标的单点遥信,每个遥信占1个字节
03———不带时标的双点遥信,每个遥信占1个字节
14———具有状态变位检出的成组单点遥信,每个字节8个遥信
-
SOE:
02———带3个字节短时标的单点遥信
04———带3个字节短时标的双点遥信
1e———带7个字节时标的单点遥信
1f———带7个字节时标的双点遥信
-
电度:
0f———不带时标的电能量,每个电能量占5个字节
10———带3个字节短时标的电能量,每个电能量占8个字节
25———带7个字节短时标的电能量,每个电能量占12个字节
5. 可变结构限定词
高位的值SQ标志着地址是否连续,SQ为0表示信息对象的地址不连续(意思就是每个信息对象都会一个对象地址);SQ为1表示信息对象的地址连续 (只有第一个信息对象有地址,其他对象的地址就是累加1),如下表所示:
第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 | 第0位 |
SQ |
6. 传输原因
占2个字节
-
T = 0 未试验 ;T = 1 试验 (一般 T= 0)
-
P/N = 0 肯定 ;P/N = 1 否定 (正常为P/N = 0;P/N = 1说明该报文无效)
-
源发地址:用来记录来时哪个主站的响应数据,一般写 0;
-
传送原因:(下面提到的上行:[从站发送给主站]、下行:[主站发送给从站])
红色标记的是一些常用的;其中【6,7,8,9,10】在一些遥控,设定值时用的比较多
例如:从站发送一个 传送原因为 突发 的报文 ,则传送原因这个2个字节的情况如下:
突发 = 3
7. 应用服务数据单元公共地址
也是RTU地址,占两个字节,高位字节位0x00; 1-254 为RTU站地址,255为全局地址。
8. 信息体
规定最长位243个字节,下面以遥测的不带绝对时标和带绝对时标来讲解:
带绝对时标(遥测)
-
Tips:时标有三种,但是例外两种基本不用,暂不去说明
-
其中只有类型为【21】的【归一化测量值】不带品质描述词
说明:连续、带时标的 ASDU数据部分结构如上表分为:
-
地址编号:第一个信息体数据的地址(只会出现一次)
-
重复信息体数据+品质描述词 (地址=第一个地址按顺序+1推算出来)
-
最后以绝对时标结束
不带绝对时标(遥测)
-
说明:
连续、不带时标的 ASDU数据部分结构如上表分为:
-
地址编号:第一个信息体数据的地址(只会出现一次)
-
重复信息体数据+品质描述词 (地址=第一个地址按顺序+1推算出来)
-
4. 104规约报文类型
104规约的报文帧分为三类:I帧、S帧和U帧。
-
I帧称为信息帧,长度一定大于6个字节,被称作长帧,用于传输数据;
-
S帧称为确认帧,长度只有6个字节,被称作短帧,用于确认接收的I帧;
-
U帧称为控制帧,长度只有6个字节,也被称作短帧,用于控制启动、停止、测试。
4.1 I帧报文
I帧的4字节控制域位组规定为:字节1和字节2为发送序号,字节3和字节4为接收序号。需注意两点:
-
由于字节1和字节3的最低位固定为0,不用于构成序号,所以在计算序号时,要先转换为十进制数值,再除以2(也就是说发送序号和接收序号一直是偶数)。
-
由于低位字节在前、高位字节在后,所以计算时要先做颠倒。
4.2 S帧报文
-
S帧报文格式规定控制域1的第0位为1,第1位为0和控制域第0位为0。
-
S帧报文的发送序列号都为0。
-
S帧只用于APCI中(意思就是S帧的apdu报文只会有apci不会存在asdu),不能用于传输信息,只用给对方信息的确认,比如子站发送8条报文,结束后主站就会给子站发送一个确认帧(S帧),告诉子站我收到了8条报文。
4.3 U帧报文
-
U帧只用于控制,并且只存在APCI中(意思就是U帧的apdu报文只会有apci不会存在asdu);
-
测试、停止和开启在一个U帧报文中只可能存在其中的一种;
-
如果用于【启动】则:
激活第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
-
5. 发送和接收序号维护
IEC 60870-5-104采用TCP/IP协议。IP协议负责将数据从一处传往另一处,TCP负责控制数据流量,并保证传输的正确性。由于在最底层的计算机通信网络提供的服务是不可靠的分组传送,所以当传送过程中出现错误以及在网络硬件失效或网络负荷太重时,数据包有可能丢失、延迟、重复和乱序,因此应用层协议必须使用超时和重传机制。为了防止I格式帧报文在传送过程中丢失或重复传送,IEC 60870-5-104的I格式帧报文的控制域定义了发送序号N(S)和接收序号R(S), 发送方每发送一个I格式帧报文,其发送序号应加1,接收方每接收到一个与其接收序号相等的I格式帧报文后,其接收序号也应加1。需要注意的是,每次重新建立TCP连接后,调度主站和子站RTU的接收序号和发送序号都应清零,因此在双方开始数据传送后,接收方若收到一个I格式报文,应判断此I格式报文的发送序号是否等于自己的接收序号。若相等则应将自己接收序号加1,若此I格式帧报文的发送序号大于自己的接收序号,这说明发送方发送的一些报文出现了丢失;若此I格式帧报文的发送序号小于自己的接收序号,这意味着发送方出现了重复传送。此外,I格式帧和S格式帧报文的接收序号表明了发送该报文的一方对已接收到的I格式帧报文的确认,若发送方发送的某一I格式帧报文后长时间无法在对方的接收序号中得到确认,这就意味着发生了报文丢失。当出现上述这些报文丢失、错序的情况时,通常意味着TCP连接出现了问题,发送方或接收方应关闭现在的TCP连接然后再重新建立新的TCP连接,并在新的TCP连接上重新开始会话过程。
在主站端和子站RTU端进行通信时,接收方可以使用S格式帧报文(当有应用服务单元需要发送给对方时,可使用I格式帧报文)对已接收到的I格式帧报文进行确认,以免发送方超时收不到确认信息而重新建立TCP连接。这就存在一个接收方收到多少个I格式帧报文进行一次确认的问题,以及发送方应在多少个I格式帧报文未得到确认时停止发送数据。IEC 60870-5-104规定了两个参数k和w,其取值范围为1到32767(注:当溢出时重新计数),其中k表示发送方在有k个I格式帧报文未得到对方的确认时,将停止数据传送,w表示接收方最迟在接收了w个I格式帧报文后应发出认可;IEC 60870-5-104规定k和w的默认值分别为12个APDU和8个APDU。在实际中,k和w的具体取值可以根据TCP连接双方的数据通信量来加以确定,对于子站RTU端来说,每收到一个调度端的I格式帧报文都应立即进行响应,其w的取值实际上为1,由于RTU端可以循环向调度端发送遥信、遥测等信息,因此k的取值与其循环发送的定时周期有关,通常12到20个APDU就足够了;对于主站端,由于不停接收到RTU的数据,因此应及时地给以确认,通常w取小于8个APDU的值。
在我们实际使用的时候,也要看从站对发送序号的支持,有些从站在链接断开以后,并不能把序号清零,如果只是数据采集,并不影响;不管从站是否支持,在主站接收到一定数量(8或1)帧后,一定要发送一个S帧确认帧,让它知道你收到了。
-
6. 遥信报文解析
68 34 04 00 02 00 01 A7 14 01 01 00 01 00 00 00 01 01 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
我们以01类型的遥信为例(01是不带时标的单点遥信,每个遥信占1个字节)
-
拿到报文先检查开头是否为68H,不是的话就是脏数据
-
然后看第二个字节,34H=52,如果和后面的字节数量对不起来,也是脏数据
-
发送序号04 00,4/2=2,发送序号为2
-
接收序号02 00,2/2=1,接收序号为1
-
第八个字节A7,可变限定结构,A7转换为2进制=10100111,根据上面对可变限定结构的说明,高位=1说明地址是连续的,然后将0100111转换成10进制=39,就是说一共有39个地址数据
-
14 01传输原因,就不多做介绍了(公共地址、传输原因、信息体地址,这三个参数默认的字节数分别是2、2、3,可配置)
-
01 00是RTU地址(有些Slave端可配置多个地址,有些只支持01)
-
紧接着是开始地址,01 00 00
-
地址后面就是遥信数值,每个字节都要先转换成二进制,高位补零,然后根据如下规则解析:
-
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:遥信状态值(1=确定状态的开;2=确定状态的合;)【0和3不确定是什么,占2个bit为必然有4个值】
-
7. 遥测报文解析
68 AD 06 00 02 00 0D A0 14 01 01 00 01 40 00 00 90 C3 45 00 00 00 5F 44 0000 90 C3 45 00 00 C0 60 44 00 00 C0 C1 45 00 00 00 5D 44 00 00 C0 C1 45 0000 C0 63 44 00 00 70 C1 45 00 00 00 63 44 00 00 70 C1 45 00 00 40 61 44 0000 A0 C4 45 00 00 C0 5E 44 00 00 A0 C4 45 00 00 C0 61 44 00 00 C8 C6 45 0000 00 60 44 00 00 C8 C6 45 00 00 80 5F 44 00 00 70 C1 45 00 00 40 64 44 0000 70 C1 45 00 00 80 64 44 00 00 88 D1 45 00 00 00 9C 45 00 00 C8 9B 45 0000 08 9B 45 00 00 00 33 45 00 00 20 34 45 00 00 E0 33 45 00 00 C0 EE 45 00
我们以0D类型的遥测报文为例(带品质描述的浮点值,每个遥测值占5个字节)
-
前面的判断就不说了,可参考上面遥信
-
第7个字节A0可变限定结构,A0=10100000,地址连续,并且有32个寄存器数值
-
从第13个字节开始,01 40 00,转换成十进制4001=16385,地址从16385开始
-
地址后的每5个字节是一个遥测浮点值和品质描述,00 90 C3 45 00,首先将前四个字节转换成浮点数,高位在后低位在前,计算的时候应该是45C3和9000,将这两个16进制转换成浮点值就是6258.0,最后一个字节00就是品质描述,品质描述的解析如下:
-
BL : 封锁标志;BL=0 未被封锁;BL=1 封锁;
-
SB: 取代标志;SB=0 未被取代;SB = 1 被取代;
-
NT:刷新标志;NT=0 刷新成功;NT=1 刷新未成功;
-
IV:有效标志;IV = 0 状态有效;IV = 1 状态无效;(如果无效说明该遥测数据无效)
-
RES:保留位;
-
OV:溢出标志;OV=0 未溢出;OV=1 遥测超出量程,发生溢出
-
8. 电度报文解析
68 BA 02 00 06 00 10 10 25 01 01 00 01 64 00 C9 01 00 00 00 EA E0 1A 02 64 00 9E 5C 01 00 01 EA E0 1A 03 64 00 76 0B 00 00 02 EA E0 1A 04 64 00 91 01 00 00 03 EA E0 1A 05 64 00 72 01 00 00 04 EA E0 1A 06 64 00 9D 5D 01 00 05 EA E0 1A 07 64 00 E4 01 00 00 06 EA E0 1A 08 64 00 0F 0B 00 00 07 EA E0 1A09 64 00 E8 01 00 00 08 EA E0 1A 0A 64 00 9C D5 01 00 09 EA E0 1A 0B 64 00 8B 10 00 00 0A EA E0 1A 0C 64 00 83 01 00 00 0B EA E0 1A 0D 64 00 F3 01 00 00 0C EA E0 1A 0E 64 00 4B D4 01 00 0D EA E0 1A 0F 64 00 17 11 00 00 0E EA E0 1A 10 64 00 BA 00 00 00 0F EA E0 1A
我们以10类型的电度报文为例(带3个字节短时标的电能量,每个电能量占8个字节)
-
上面橙色标出来的是带3个字节短时标和8个字节电能数值的字节组,以第一条为例(01 64 00 C9 01 00 00 00 EA E0 1A),前三个字节是地址(6401=25601),最后三个字节是短时标,分别是毫秒低位、毫秒高位、分钟(E0EA=57578/1000=57.578,1A=26)也就是26分57秒578毫秒,中间五个字节就是电度值和描述信息。
在解析有7个字节的时标报文时,可参考如下图片
如:2f(毫秒低位)40(毫秒高位)1c(分钟)10(时)7a(日与星期)0b(月)05(年)
最后附上在博客园看到的优秀解析文章:
以公共地址字节数=2,传输原因字节数=2,信息体地址字节数=3为例对一些基本的报文分析
第一步:首次握手(U帧)
发送→激活传输启动 :68(启动符)04(长度)07(控制域)00 00 00
接收→确认激活传输启动 :68(启动符)04(长度)0B(控制域)00 00 00
第二步:总召唤(I帧)
召唤YC、YX(可变长I帧)初始化后定时发送总召唤,每次总召唤的间隔时间一般设为15分钟召唤一次,不同的主站系统设置不同。
发送→总召唤 :
68(启动符)0E(长度)00 00(发送序号)00 00(接收序号)64(类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址即RTU地址)00 00 00(信息体地址)14(区分是总召唤还是分组召唤,02年修改后的规约中没有分组召唤)
接收→S帧 :
68 04 01 00 02 00
注意:记录接收到的长帧,双方可以按频率发送,比如接收8帧I帧回答一帧S帧,也可以要求接收1帧I帧就应答1帧S帧。
接收→总召唤确认(发送帧的镜像,除传送原因不同) :
68(启动符)0E(长度)00 00(发送序号)00 00(接收序号)64(类型标示)01(可变结构限定词)07 00(传输原因)01 00(公共地址即RTU地址)00 00 00(信息体地址)14(同上)
发送→S帧 :
68 04 01 00 02 00
注意:记录接收到的长帧,双方可以按频率发送,比如接收8帧I帧回答一帧S帧,也可以要求接收1帧I帧就应答1帧S帧。
接收→YX帧(以类型标识1为例) :
68(启动符)1A(长度)02 00(发送序号)02 00(接收序号)01(类型标示,单点遥信)04(可变结构限定词,有4个遥信上送)14 00(传输原因,响应总召唤)01 00(公共地址即RTU地址)03 00 00(信息体地址,第3号遥信)00(遥信分)
发送→S帧 :
68 04 01 00 04 00
接收→YX帧(以类型标识3为例) :
68(启动符)1E(长度)04 00(发送序号)02 00(接收序号)03(类型标示,双点遥信)05(可变结构限定词,有5个遥信上送)14 00(传输原因,响应总召唤) 01 00(公共地址)01 00 00(信息体地址,第1号遥信)02(遥信合)06 00 00(信息体地址,第6号遥信)02(遥信合)0A 00 00(信息体地址,第10号遥信)01(遥信分)0B 00 00(信息体地址,第11号遥信)02(遥信合)0C 00 00(信息体地址,第12号遥信)01(遥信分)
发送→S帧 :
68 04 01 00 06 00
接收→YC帧(以类型标识9为例) :
68(启动符)13(长度)06 00(发送序号)02 00(接收序号)09(类型标示,带品质描述的遥测)82(可变结构限定词,有2个连续遥测上送)14 00(传输原因,响应总召唤)01 00(公共地址)01 07 00(信息体地址,从0X0701开始第0号遥测)A1 10(遥测值10A1)00(品质描述)89 15(遥测值1589)00(品质描述)
发送→S帧 :
68 04 01 00 08 00
接收→结束总召唤帧 :
68(启动符)0E(长度)08 00(发送序号)02 00(接收序号)64(类型标示)01(可变结构限定词)0A 00(传输原因)01 00(公共地址)00 00 00(信息体地址)14(区分是总召唤还是分组召唤,02年修改后的规约中没有分组召唤)
发送→S帧 :
68 04 01 00 0A 00
第三步:发送对时报文(通过设置RTU参数表中的”对间间隔”,单位是分钟,一般是20分钟)
发送→对时命令 :
68(启动符)14(长度)02 00(发送序号)0A 00(接收序号)67(类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址)00 00 00(信息体地址)01(毫秒低位)02(毫秒高位)03(分钟)04(时)81(日与星期)09(月)05(年)
接收→对时确认 :
68(启动符)14(长度)0C 00(发送序号)02 00(接收序号)67(类型标示)01(可变结构限定词)07 00(传输原因)01 00(公共地址)00 00 00(信息体地址)**(毫秒低位)**(毫秒高位)**(分钟)04(时)81(日与星期)09(月)05(年)
发送→S帧 :
68 04 01 00 0E 00
第四步:电度总召唤(如果没有电度此步骤可以省略且可以在对时之前以送.通过设置参数中”全数据扫描间隔”,单位是分钟一般是15分钟召唤一交,如果不需要召唤电度一定要将参数中的电度个数设为0)
发送→召唤电度 :
68(启动符)0E(长度)04 00(发送序号)0E 00(接收序号)65(类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址)00 00 00(信息体地址)45(QCC)
接收→召唤确认(发送帧的镜像,除传送原因不同) :
68(启动符)0E(长度)10 00(发送序号)06 00(接收序号)65(类型标示)01(可变结构限定词)07 00(传输原因)01 00(公共地址)00 00 00(信息体地址)45(QCC)
发送→S帧 :
68 04 01 00 12 00
接收→电度数据 :
68(启动符)1A(长度)12 00(发送序号)06 00(接收序号)0F(类型标示)02(可变结构限定词,有两个电度量上送)05 00(传输原因)01 00(公共地址)01 0C 00(信息体地址,从0X0C01开始第0号电度)00 00 00 00(电度值)00(描述信息)02 0C 00(信息体地址,从0X0C01开始第1号电度)00 00 00 00(电度值)01(描述信息)
发送→S帧 :
68 04 01 00 14 00
接收→结束总召唤帧 :
68(启动符)0E(长度)14 00(发送序号)06 00(接收序号)65(类型标示)01(可变结构限定词)0A 00(传输原因)01 00(公共地址)00 00 00(信息体地址)45(QCC)
发送→S帧 :
68 04 01 00 16 00
第五步:如果RTU有变化数据主动上送,主动上送变位遥信,类型标识为1或3
接收→变位遥信 :
68(启动符)0E(长度)16 00(发送序号)06 00(接收序号)01(类型标示,单点遥信)01(可变结构限定词,有1个变位遥信上送)03 00(传输原因,表突发事件)01 00(公共地址即RTU地址)03 00 00(信息体地址,第3号遥信)00(遥信分)
发送→S帧 :
68 04 01 00 18 00
接收→变位遥信 :
68(启动符)0E(长度)18 00(发送序号)06 00(接收序号)03(类型标示,双点遥信)01(可变结构限定词,有1个变位遥信上送)03 00(传输原因,表突发事件)01 00(公共地址即RTU地址)06 00 00(信息体地址,第6号遥信)01(遥信分)
发送→S帧 :
68 04 01 00 1a 00
主动上送SOE,类型标识为0x1e或0x1f
接收→SOE :
68(启动符)15(长度)1a 00(发送序号)06 00(接收序号)1e(类型标示,单点遥信)01(可变结构限定词,有1个SOE)03 00(传输原因,表突发事件)01 00(公共地址即RTU地址)08 00 00(信息体地址,第8号遥信)00(遥信分)ad(毫秒低位)39(毫秒高位)1c(分钟)10(时)7a(日与星期)0b(月)05(年)
发送→S帧 :
68 04 01 00 1c 00
接收→SOE :
68(启动符)15(长度)1c 00(发送序号)06 00(接收序号)1f(类型标示,双点遥信)01(可变结构限定词,有1个SOE)03 00(传输原因,表突发事件)01 00(公共地址即RTU地址)0a 00 00(信息体地址,第10遥信)01(遥信分)2f(毫秒低位)40(毫秒高位)1c(分钟)10(时)7a(日与星期)0b(月)05(年)
第六步:如果主站超过一定时间没有下发报文或RTU也没有上送任何报文则双方都可以按频率发送U帧,测试帧
发送→U帧 :
68 04 43 00 00 00
接收→应答 :
68 04 83 00 00 00
第七步:遥控
发送→遥控预置 :
68(启动符)0e(长度)20 00(发送序号)06 00(接收序号)2e(类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)82(控合)
接收→遥控返校 :
68(启动符)0e(长度)0e 00(发送序号)06 00(接收序号)2e(类型标示)01(可变结构限定词)07 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)82(控合)
发送→遥控执行 :
68(启动符)0e(长度)04 00(发送序号)18 00(接收序号)2e(类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)02(控合)
接收→执行确认 :
68(启动符)0e(长度)12 00(发送序号)08 00(接收序号)2e(类型标示)01(可变结构限定词)07 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)02(控合)
发送→遥控撤消 :
68(启动符)0e(长度)04 00(发送序号)18 00(接收序号)2e(类型标示)01(可变结构限定词)08 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)02(控合)
接收→撤消确认 :
68(启动符)0e(长度)12 00(发送序号)08 00(接收序号)2e(类型标示)01(可变结构限定词)09 00(传输原因)01 00(公共地址即RTU地址)05 0b 00(信息体地址,遥控号=0xb05-0xb01=4)02(控合)
{
关注公众号获取源码
或点击下载
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151369.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...