大家好,又见面了,我是你们的朋友全栈君。
最近被调到电力物联网的项目组,之前一直在做移动终端的我现在在这个项目中得要重新学起了。。~_~!
1.电力系统常见概念
首先介绍一份ppt:https://wenku.baidu.com/view/557ceb87be23482fb5da4c84.html
看着挺好。。。
这边文章主要是解释一些电力系统开发中比较常见的概念,也是给自己做个笔记~~~~~~
电力系统远动(power system telemechanics):为电力系统调度服务的远距离监测、控制技术,即管理和监控分布甚广的众多厂、所、站和设备、元器件的运行工况的一种技术手段。
一般来说,电力系统远动终端RTU(Remote Terminal Unit)具有”四遥”等功能。”四遥”主要指的是 遥测、遥控、遥调、遥信四种。其实从”遥”字面意思上我们也可以看到这注定是一个远程远距离的操控了。
遥测:远程测量。采集并传送运行参数,包括各种电气量(线路上的电压、电流、功率等量值) 和负荷潮流等。
遥控:远程控制。接受并执行遥控命令,主要是分合闸,对远程的一些开关控制设备进行远程控制。
遥信:远程信号。采集并传送各种保护告警和开关量信息。
遥调:远程调节。接受并执行遥调命令,对远程的控制量设备进行远程调试,如调节发电机输出功率。
一摇:遥信
二遥:遥信和遥测
三遥:遥信、遥测和遥控
2.104规约使用场景
电力系统中常见的设备分为 调度端(控制站、主站、客户机) , 服务端(被控站、子站,典型设备包含TTU、RTU等),两者之间通过104规约来进行数据通信与传输。其传输层实际上使用的是TCP协议进行数据的传输。固定端口号为2404。
服务端不主动发起请求,一直处于侦听状态,当侦听到来自客户机的连接请求后,则接受此请求,由此建立一个TCP链接。控制站(即调度系统)作为客户机,被控站(即站端RTU)作为服务器。
即实际的代码操作为:
主站按照 Socket()->Connect()的顺序进行
RTU(服务器)端按Socket()->Bind()->Listen()->Accept()的顺序进行。
这里我找到一份代码工程,该代码中包含服务端和客户端的VC6.0的源码工程,可以在VC6.0上打开这两个工程,编译两份工程生成主站和子站的带界面的exe文件,可以调试代码,非常方便,可以尝试着边看代码边调试边梳理104的具体流程。
链接:https://pan.baidu.com/s/1Q00O3vfeNKueGri7Bqp0OA 提取码:kj4m
3.帧报文
这里首先提出一个可用于解析104报文的软件,我们可以直接将一条完整的报文贴到该软件中,就可以看到该帧报文所表示的内容含义了。可以直接在搜索引擎上搜索 IEC8705(报文翻译工具).exe 即可。
104规约帧报文分为三大类( I帧、S帧、U帧)
I帧是信息帧,作用是用于传输具体的通信数据的,长度必大于6个字节。
S帧是用于确认接收的I帧,即当接收到I帧后需要返回一个S帧,长度等于6个字节。
U帧是控制帧,用于控制启动/停止子站进行数据传输,或测试TCP链路连接,长度等于6个字节。
帧报文的格式如下所示:
帧报文实际例子:
1.遥信信息(I格式)
序列号信息连续的单点信息(单点信息包含一个字节)
serversend:
68 | 1c | 00 | 00 | 00 | 00 | 01 | 8f | 14 | 00 | 33 | 00 | 01 | 02 | 00 | 01 | 00 | 01 | 00 | 01 | 00 | 01 | 00 | 01 | 00 | 01 | 00 | 01 | 00 | 01 |
1c表示长度为28个字节,从 00000000~~~010001,ASDU长度一共28个字节
报文类型为01,表示该帧报文为单点信息(遥信)
结构限定词为8f(1000 1111),表示数据为连续数值,数量为15,最后面的灰色部分010001~~~010001,共15个字节
原因为 1400==>0014===>20,该帧报文原因为响应站召唤
ASDU公共地址为3300==>0033==>51,站址为51
010200(信息体起始地址)==> 0201H.
第一个数据:index = 0201H value=01H&0x01 = 1 一与01H对应
第二个数据:index = 0202H value=00H&0x01 = 0 二与00H对应
第三个数据:index = 0203H value=01H&0x01 = 1 三与01H对应
………..
第十五个数据:index = 020fH value=01H&0x01 = 1 十五与01H对应
0x01表示为单点遥信,如果是双点遥信,则是数据与0x11做与操作。
2.遥测信息(I格式)
遥测信息采用短整型或短浮点型数据进行传送。短整型数据会占据两个字节。
帧报文类型标识为
0x09:带品质描述(品质描述会占一个字节)的测量值,所以每一个测量值总共占三个字节
0x0a:上述0x09类型另加3个字节时标,一共占6个字节
0x0d:由四个字节的数据值和一个字节的质量位组成,共 五个字节
序列号不连续:
serversend:
68 | 1c | 00 | 00 | 00 | 00 | 09 | 03 | 03 | 00 | 33 | 00 | 08 | 07 | 00 | 14 | 00 | 01 | 0f | 07 | 00 | 5a | 00 | 00 | 13 | 07 | 00 | 82 | 00 | 00 |
09表示带品质描述的测量值
03表示数值不连续,数量为3,不连续的话则说明后面DATA部分都会自带一个数据的地址(地址占三个字节)
0300==>0003==>3 原因为突发
3300==>0033==>51 ,ASDU公共地址为51
3个遥测数据:
addr: 080700==>0708H value:14 00 ==>0014H==>20 quality = 01
addr: 0f0700==>070fH value:5a 00 ==>005aH==>90 quality = 00
addr: 130700==>0713H value:82 00 ==>0082H==>130 quality = 00
3.报文中的时标信息
.. | .. | 0f | 07 | 00 | 5a | 00 | 00 | 13 | 07 | 00 | 82 | 00 | 16 | 23 | 32 | 10 | 13 | 05 | 08 |
报文前面的部分这里就不关注,主要看后面的时标部分,一般帧报文中时标信息都是放在报文最后面,且时标一般占7个字节,每一个字节里面的排序为bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0,一般来说bit7都是备用位,值为0。
时标部分每一个字节按照上面的排序表示的含义
毫秒低八位 毫秒高八位 分 时 日 月 年
年:备用(bit7),年(bit6~bit0)
月:备用(bit7~bit4),月(bit3~bit0)
日:星期(bit7~bit5),日(bit4~bit0)
时:夏时制位(bit7),备用(bit6~bit5),小时(bit4~bit0)
分:无效位(bit7),备用(bit6),分钟(bit5~bit0)
毫秒: 低八位 高八位==>高八位 低八位 ==> 组合成毫秒===> xx.xxx秒
根据上面的规则,前面报文的时标表示的时间为:08年5月19日16时50分8秒982毫秒
4.超时时间
t0:连接建立的超时 =30s
规定了主站端和子站RTU端建立一次TCP连接的最大允许时间
t1:发送或测试APDU的超时 =15s
规定发送方发送一个I格式报文或U格式报文后,必须在t1的时间内得到接收方的认可
t2:无数据报文t2<t1时确认的超时 =10s
规定接收方在接收到I格式报文后,若经过t2时间未再收到新的I格式报文,必须向接收方发送S格式帧对已经接收到的I格式帧进行认可
t3:长期空闲t3>t1状态下发送测试帧的超时 =20s
规定调度端或子站RTU端每接收一帧I帧、S帧或者U帧将重新触发计时器t3,若在t3内未接收到任何报文,将向对方发送测试链路帧TESTFR
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151399.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...