104规约笔记「建议收藏」

104规约笔记「建议收藏」电力系统中常见的设备分为调度端(控制站、主站、客户机),服务端(被控站、子站,典型设备包含TTU、RTU等),两者之间通过104规约来进行数据通信与传输。其传输层实际上使用的是TCP协议进行数据的传输。固定端口号为2404。《电力系统104规约帧报文解析》注意这里的调度端和服务端,调度端往往安装在PC电脑上,用网线连接(可靠的网络),服务端是工业设备:TTU(distributionTransformersupervisoryTerminalUnit,配电变压器监测终端)。RTU(远程终

大家好,又见面了,我是你们的朋友全栈君。

电力系统中常见的设备分为 调度端(控制站、主站、客户机) , 服务端(被控站、子站,典型设备包含TTU、RTU等),两者之间通过104规约来进行数据通信与传输。其传输层实际上使用的是TCP协议进行数据的传输。固定端口号为2404。《电力系统104规约帧报文解析》
注意这里的调度端和服务端,调度端往往安装在PC电脑上,用网线连接(可靠的网络),服务端是工业设备:
TTU(distribution Transformer supervisory Terminal Unit,配电变压器监测终端)。
RTU(远程终端单元),英文全称RemoteTerminalUnit,中2113文全称为远程终端控制系统,负责对现场信号、工业设备的监测和控制。

104规约报文格式
来自《104规约ASDU结构解析》
在这里插入图片描述
第一个字节:启动字符固定16进制数68H,十进制为104(正好代表104规约吧),二进制为:0110 1000。
第二个字节:APDU长度,注意APDU长度并不包括1字节的启动字符和1字节的APDU长度本身,而由于只有1字节代表数据长度,其最大值为255(2^8 – 1),所以最大值为255 – 2 = 253,又由于APCI除了这两个字节外还包括了4个字节的控制域(1~4),那么剩下的ASDU(可选的应用服务数据单元)长度为253 – 4 = 249字节。

报文有三种类型:
1、U格式,未编号的控制功能帧,如果第3字节不等于十六进制01H并且,第2字节长度为04,就一定是功能帧。
只有三种命令,每种命令有“命令”和“确认”两个步骤。
在这里插入图片描述
比如TCP连接后马上要做的“握手”操作,就是STARTDT命令(来自《IEC104协议规约解析》):

第一步:首次握手(U帧)
发送→激活传输启动:68(启动符)04(长度)07(控制域)00 00 00
接收→确认激活传输启动: 68(启动符)04(长度)0B(控制域)00 00 00

STARTDT用于启动传输,只有发送了这条命令,对方才会将数据发送过来,也只有发送了这条命令,才代表本方程序会解析发送过来的数据。
STOPDT用于停止传输,发送了这条命令,代表不必发送数据过来了,并且本方也不会再解析任何收到的数据。
TESTFR用于双方都空闲,无话可说的时候定时问候一下,代表对方还处于正常的服务状态。

2、S格式,编号的监视帧,当接收到I帧后需要返回一个S帧,如果第3字节为十六进制01H,就一定是S格式帧。
在这里插入图片描述
发送STARTDT启用传输后,发送方第一次发送I格式报文,其发送序列号一定是0,此时接收方的接收序列号也是0,接收报文后,接收序列号+1,但注意接收序列号在控制域3的低1bit位为0,并非序列号数据,所以第一次应答的S帧如下:

接收→S帧 :
注意:记录接收到的长帧,双方可以按频率发送,比如接收8帧I帧回答一帧S帧,也可以要求接收1帧I帧就应答1帧S帧。 68 04 01 00 02 00

接收序列号因为是2字节表示,注意第一个8bit是低字节,第二个8比特是高字节,又第一个8bit的最低位是无效数据,所以这里的无符号短整形数据(2字节)0002H / 2 = 0001H,代表的序列号的十进制数字是1。下次再发送S帧就可能是0004H,代表十进制数字2。第三次是0006H,代表十进制数据3,看二进制代码最直观:
0010 0000,取有效的二进制组合起来就是0000 001;
0100 0000,取有效的二进制组合起来就是0000 010;
0110 0000,取有效的二进制组合起来就是0000 011;
有效的二进制组合就是将后4位二进制作为高位,前4位二进制抛弃最后那个0作为低位,二进制数据仍然是从1,10,11,100,101,110这样的进位来的。

3、I格式,信息传输帧,用于信息交互。只要第2字节数不等于04,就一定是信息传输帧。
在这里插入图片描述
发送序列号N是指本设备往外发送了N帧I格式帧,接收序列号是指接收到对方N帧I格式帧。应用程序发送数据的同时,也会检查对方发过来的S帧,比如发送数据的程序已经发送了12帧了,就可以接收数据,看看S帧是否已经到了至少第8帧的序号(接收8帧至少要回答一次),如果没收到,就发送STOPDT,然后断开这个连接了(认为该连接出故障,可能对方已经断网并重启了,这是一个无效的连接了)。

I格式的帧又随着携带信息不同而不同,比如主站发送总召唤(要求传递所有遥测、遥信数据),报文如下:

总召唤(I帧)

召唤YC、YX(可变长I帧)初始化后定时发送总召唤,每次总召唤的间隔时间一般设为15分钟召唤一次,不同的主站系统设置不同。

发送→总召唤 : 68(启动符)0E(长度)00 00(发送序号)00 00(接收序号)64(类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址即RTU地址)00 00 00(信息体地址)14(区分是总召唤还是分组召唤,02年修改后的规约中没有分组召唤)
这里每一个字节的内容都可以从协议里查到。解析如下:
68是启动字符,0E代表本次数据长度为14个字节,从0E往后数14个字节就结束了(数一数是否刚刚好?)。
发送序号是00 00,前两个00是低位,后两个00是高位(注意这里高位在后),且前两个00的最后一个二进制是无效的,所以要除以2(或右移1位,右移1位就等效于除以2),所以发送序号是十进制数0。接收序号相同算法,也是0.
64H是类型标示,十进制数是100,在手册里能查到是“站总召唤”:
在这里插入图片描述
可变结构限定词01,这里代表单个信息元素(总召唤),这个数据代表的规则很复杂,需要仔细阅读手册《配电自动化系统应用DLT634.5104-2009实施细则(试行)》
传输原因为2个字节,同理高位在后,数字为16进制0006H,就是十进制的6。查询手册,得知代表激活:
在这里插入图片描述
公共地址为0001H,一般用来代表站址(主站系统将连接上来的设备分为多个虚拟的站,可能按照连接过来的TTU,RTU进行区别对待)。
信息体地址是0,因为总召唤不是具体的信息,如果要发送遥测数据,就会带有遥测号了。
14H是十进制的20,是召唤限定词,手册里有描述:
在这里插入图片描述

再看一个发送遥信信息的帧:

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(遥信分)

这一帧数据带了5个遥信,每一个遥信都带有一个信息体地址,公共地址则是5个遥信公用的。而且这里双点遥信用2个二进制位标示,二进制01(01H)代表分,二进制10(02H)代表合,二进制11(03H)代表状态未知。

104规约在掌握规则以后,就是根据手册查询具体的I帧含义和ASDU(信息体)的具体规定了。所以不再具体介绍了。以后如果有新情况,我再补充这个笔记。

补充:
手册里的7 应用报文与数据结构可看出来主站和DTU,RTU之间的交互类型。
列举类型如下:
第一类:主站的系统命令
总召唤:获取所有遥测、遥信数据。
电能量召唤:召唤所有电量数据。
时钟读取:核对时间。
复位进程:
初始化结束:

第二类:DTU,RTU发送给主站
遥信报文
遥测报文
电能量报文
故障事件信息

第三类:双方交互
遥控命令报文

第四类:文件传输
召唤目录
读文件服务
写文件服务
写文件数据

第五类:远程参数读写
切换定值区
读取当前定制区
读多个/全部参数和定值
写多个参数和定值
故障录波采用文件服务传输。
历史数据文件也采用文件服务传输。
软件升级

参考资料《电力系统104规约帧报文解析》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151348.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 多少行代码可以申请软件著作权_python申请软件著作权

    多少行代码可以申请软件著作权_python申请软件著作权在申请软件专利或著作权时,如何快速统计源码行数。其实我们可以利用vs2010的文件搜索功能结合正则表达式,来遍历所有文件得出总行数.

    2022年9月22日
    2
  • python贪吃蛇代码「建议收藏」

    python贪吃蛇代码「建议收藏」语言:python外置组建:pygamepython是一款十分简单的语言,功能也十分巨大它也能实现贪吃蛇。游戏过程:废话不多说我们来看代码:#0.imortxxxximportpygame#pygame游戏库,sys操控python运行的环境importpygame,sys,random#这个模块包含所有pygame所使用的常亮frompygame.localsimport*#1,定义颜色变量#0-2550黑色255白色red

    2022年8月11日
    10
  • js页面的弹框怎么关闭啊

    js页面的弹框怎么关闭啊

    2021年10月31日
    42
  • hypervisor kvm_docker vmware

    hypervisor kvm_docker vmwareLinuxhypervisor介绍荣涛2021年10月14日1.引言管理程序对操作系统所做的事情就像操作系统对进程所做的大致相同。它们为执行提供隔离的虚拟硬件平台,从而提供对底层机器的完全访问的错觉。但并非所有的虚拟机管理程序都是一样的,这是一件好事,因为Linux是关于灵活性和选择的。本文首先简要介绍虚拟化和管理程序,然后探讨几个基于Linux的管理程序。2.平台设备模拟平台虚拟化是关于在两个或多个操作系统之间共享一个平台,以便更有效地利用资源。但平台不仅仅意味着处理

    2022年9月22日
    2
  • 如何是HTML页面中的表单居中显示[通俗易懂]

    如何是HTML页面中的表单居中显示[通俗易懂]在进行前端页面设置的时候,发现写完的form表单始终无法居中显示,详细如图1所示:图1:问题图示代码如下:分析原因:form本来就只是一个表单而已,对页面根本就没有布局上的作用.,因此无论怎么设

    2022年8月3日
    4
  • char转int的方法_char 转 int

    char转int的方法_char 转 int这是我的第一篇博客,也是我学习的一种方法,我会将学习中总结出的方法问题通过博客记录下来,希望能帮到同样在努力学习的朋友,也希望有什么不足得到大家的补充帮助回归正文,在编程中我们常常会涉及到类型转换的问题,类型转换最重视的装箱与拆箱带来的性能损耗。char类型与int类型同属于值类型,因此在char转换成int的时候就想不造成装箱拆箱的性能损耗的同时完成转换就可以这样做,首先大家要明

    2022年10月2日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号