大家好,又见面了,我是你们的朋友全栈君。
电力系统中常见的设备分为 调度端(控制站、主站、客户机) , 服务端(被控站、子站,典型设备包含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.cn/151348.html原文链接:https://javaforall.cn