IEC104规约服务器端源代码

合集下载

IEC104客户端源代码

IEC104客户端源代码

int i;
for (i = 0; i < CS101_ASDU_getNumberOfElements(asdu); i++) {
SinglePointInformation io =
(SinglePointInformation) CS101_ASDU_getElement(asdu, i);
CS104_Connection_sendProcessCommand(con, C_SC_NA_1, CS101_COT_ACTIVATION, 1, sc);
InformationObject_destroy(sc);
/* Send clock synchronization command */
);
SinglePointInformation_destroy(io);
}
}
return true;
}
int
main(int argc, char** argv)
{
const char* ip = "localhost (i = 0; i < CS101_ASDU_getNumberOfElements(asdu); i++) {
MeasuredValueScaledWithCP56Time2a io =
(MeasuredValueScaledWithCP56Time2a) CS101_ASDU_getElement(asdu, i);
printf(" IOA: %i value: %i\n",
InformationObject_getObjectAddress((InformationObject) io),
SinglePointInformation_getValue((SinglePointInformation) io)

IEC104规约说明

IEC104规约说明

IEC104规约由IEC101规约演化而来,一般采用网络TCP 通道,标准的端口号为2404,由IANA —互联网数字分配授权定义和确认,也可根据需要自行确定,其报文格式为:启动字符68H 定义了数据流中的起点,APDU 长度 = ASDU 的字节长度 + 4个控制字节,根据4个控制字节的内容分为三类报文:用于编号的信息传输(I 格式)、编号的监视功能(S 格式)、未编号的控制功能(U 格式)。

如下所示:高位 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1I 格式 S 格式高位U 格式S 格式和U 格式的报文均无ASDU 部分。

发送序列号N (S )和接收序列号N (R )的使用与ITU —T X .25定义的方法一致,发送方增加发送序列号而接收方增加接收序列号。

有些厂家对这两个序列号的递增没有考虑。

控制站利用STARTDT (启动数据传输)和STOPDT (停止数据传输)来控制被控站的数据传输。

当连接建立后,连接上的用户数据传输不会从被控站自动激活,控制站需要发送STARTDT 指令来激活这个连接中的用户数据传输,被控站用STARTDT 响应,随后,被控站可利用IEC101中的有关ASDU 将变化数据主动上送给控制站,控制站可以在收到一个或几个被控站的报文后发送一个S 格式的报文给被控站,控制站也可以利用有关的ASDU 报文向被控站请求全数据或全电度,或向被控站下发遥控命令,或对时。

ASDU部分的格式如下:类型标识为一个字节,可变结构限定词为一个字节,传输原因可以为一个或两个字节,公共地址可以为一个或两个字节,信息体地址可以为一个或两个或三个字节,具体采用几个字节表示需要遵照通信双方的约定。

ASDU的详细内容请参考有关的IEC60870—5—101规约由于采用面向连接的TCP网络通道,在应用层可以认为报文是可靠的,因此,规约中没有对报文设置校验,基于同样的原因,规约中也不再采用IEC101的分组召唤。

基IEC104 规约的配电终端测试软件设计

基IEC104 规约的配电终端测试软件设计

SCIENCE &TECHNOLOGY INFORMATION科技资讯基IEC104规约的配电终端测试软件设计王莉(南京信息职业技术学院江苏南京210049)摘要:从最初的电力网发展到今天,伴随着计算机技术、网络技术和通信技术的发展,这些技术被广泛地应用到电力网络中。

随着电力物联网的提出,配电设备向着物联化、智能化方向转变,此次终端测试软件的设计目标就是一套基于IEC104协议的实时数据库的电力远程测试平台,以第三方视角对系统、设备、通信等多方面进行模型比对和数据分析,把被动的维护工作向主动的量化管理推进,以更好地保障电网的安全稳定运行。

关键词:以太数据网电力物联网IEC104协议远程测试中图分类号:V242.4;3文献标识码:A文章编号:1672-3791(2022)07(b)-0034-03Design of Electricity Terminal Test Software Based on IEC104ProtocolWANG Li(Nanjing Vocational College of Information Technology,Nanjing,Jiangsu Province,210049China)Abstract:From the initial development of power network to today,with the development of computer technol‐ogy,network technology and communication technology,they are widely used in power network.With the pro‐posal of the power Internet of things,the distribution equipment is changing towards the direction of IOT and in‐telligence.The design goal of the terminal test software is a set of power remote test platform based on the real-time database of IEC104protocol,which can carry out model comparison and data analysis on the system,equipment,communication and other aspects from the perspective of a third party,promote the passive maintenance work to the active quantitative management,and better ensure the safe and stable operation of the power grid.Key Words:Ethernet data network;Power Internet of things;IEC104protocol;Remote test由于地缘辽阔,地形复杂,使得电力网络显得非常的复杂而难以维护,各种网络的交织,还有可能使用着不同的通信协议,因此数据的准确传输就成了一大难题,通常需要大量的人力去巡查和记录,这无疑为维护电力网络增加了很大的成本,而且有些设备自身还存在着一定的缺陷、一系列的问题,大大增加了电网出现故障的风险。

IEC104规约详细讲解

IEC104规约详细讲解
• k表示在某一特定的时间内未被DTE确认(即不被承认) 的连续编号的I格式APDU的最大数目。每一I格式帧都按 顺序编好号,从0到模数n-1,这里的“模数”是指序列 号对参数n的模数。以n为模的操作中k值永远不会超过n1。(见 ITU-T X.25推荐的2.3.2.2.1和2.4.8.6)。 • 当未确认I格式APDU达到k个时,发送方停止传送。 • 接收方收到w个I格式APDU后确认。 • k值的最大范围:1到32767(2的十五次方-1)APDU,精 确到一个 APDU. • w值的最大范围:1到32767 APDU,精确到一个APDU。 (推荐:w不应超过三分之二的k)。 。规约推荐:k值为12,w值为8
内部计数器 V 状态
Ack 0 V(S) 0 1 2 3 V(R) 0
I(2,0) 主动关闭
顺序 错误
IEC 27 95/2000
编号 I 格式 APDU 受干扰的过程
通讯特点(4)防止报文丢失和 报文重复传送
A站
APDU 发送或接收后的内部 计数器 V 状态
Ack 0 V(S) 0 V(R) 0
V(S) 0 1 2 3 V(R) 0 Ack 0
S(b) b=接收序 号
S(3)
3
S 格式 APDU 认可编号 I 格式 APDU 的未受干扰过程
通讯特点(3)防止报文丢失和 报文重复传送
A站
APDU 发送或接收后的
B站
APDU 发送或接收后的 内部计数器 V 状态
I(0,0) V(S) 0 V(R) 0 1 Ack 0
工程实现要点
平衡传输方式典型报文序列
规约结构(1)- 模型
应用层 (101) 表示层
会话层 传输层(TCP)
app

iec104通讯规约转发 java

iec104通讯规约转发 java

iec104通讯规约转发 java你可以使用Java编写一个IEC104通讯规约转发程序。

下面是一个简单的例子:首先,你需要使用Java的Socket库来建立TCP连接,并监听指定的端口:```javaServerSocket serverSocket = new ServerSocket(2404);Socket clientSocket;while (true) {clientSocket = serverSocket.accept();// 创建新的线程来处理每个客户端请求new Thread(new IEC104Forwarder(clientSocket)).start();}```然后,你需要编写IEC104Forwarder类来处理每个客户端请求:```javaimport java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .Socket;public class IEC104Forwarder implements Runnable {private Socket clientSocket;private Socket targetSocket;public IEC104Forwarder(Socket clientSocket) {this.clientSocket = clientSocket;}@Overridepublic void run() {try {// 建立与目标服务器的连接targetSocket = new Socket("<target_server_ip>", <target_server_port>);// 启动两个线程来进行转发new Thread(newForwardThread(clientSocket.getInputStream(), targetSocket.getOutputStream())).start();new Thread(newForwardThread(targetSocket.getInputStream(), clientSocket.getOutputStream())).start();} catch (IOException e) {e.printStackTrace();}}private class ForwardThread implements Runnable { private InputStream inputStream;private OutputStream outputStream;public ForwardThread(InputStream inputStream,OutputStream outputStream) {this.inputStream = inputStream;this.outputStream = outputStream;}@Overridepublic void run() {try {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);outputStream.flush();}} catch (IOException e) {e.printStackTrace();}}}}```其中,`<target_server_ip>`和`<target_server_port>`是你要转发的目标服务器的IP地址和端口号。

iec104遥控遥调代码

iec104遥控遥调代码

iec104遥控遥调代码IEC 104是国际电工委员会制定的一种通信规约,用于远程监控和控制电力系统。

IEC 104遥控遥调代码用于实现对远程设备进行遥控和遥调操作。

以下是一个简单的IEC 104遥控遥调代码示例:```pythonfrom pyIEC60870 import ASDU, IEC60870Client# 创建一个IEC 104客户端client = IEC60870Client("127.0.0.1" 2404)# 建立连接client.connect()# 创建一个遥控操作的ASDU对象asdu = ASDU(type_id=45, iec_address=1, cause=7)# 设置遥控命令的信息元素asdu.add_information_object(object_address=1, value=1) # 发送遥控命令client.send(asdu)# 等待遥控命令的响应response = client.receive()# 打印遥控命令的响应信息print(response)# 断开连接client.disconnect()```上述代码中,首先创建一个IEC 104客户端对象,并通过`connect()`方法与远程设备建立连接。

然后创建一个遥控操作的ASDU对象,并设置遥控命令的信息元素。

通过`send()`方法发送遥控命令,然后使用`receive()`方法等待遥控命令的响应。

最后打印遥控命令的响应信息,并通过`disconnect()`方法断开与远程设备的连接。

请注意,以上代码仅用于示例和参考目的,具体的IEC 104遥控遥调代码实现可能会依赖于具体的编程语言和通信库。

在实际应用中,需要根据具体的需求和设备厂商提供的文档进行相应的代码实现。

IEC104规约调试例程

IEC104规约调试例程

电力系统通讯管理机给调度上送数据时,主要以IEC104规约为主。

但104对大部分人来说还是不容易搞清楚。

主要是IEC104里面功能比较全,所以涉及方面太多。

本文只在通讯帧格式方面举例说明一下。

帮助大家了解IEC104的通讯方式。

IEC104处理遥测一般是整型数据,有的调度要求浮点上送,可以参考文章“浮点型IEEE-754转成整型数据方法”。

一、四遥信息体基地址范围“可设置104调度规约”有1997年和2002年两个版本,在流程上没有什么变化,02版只是在97版上扩展了遥测、遥信等信息体基体址,区别如下:类别1997版基地址2002版基地址遥信1H------400H1H------4000H遥测701H------900H4001H------5000H遥控B01H------B80H6001H------6100H设点B81H------COOH6201H------6400H电度C01H------C80H6401H------6600H二、一些报文字节数的设置类别配置方式公共地址字节数2传输原因字节数2信息体地址字节数3此配置要根据主站来定,有的主站可能设为1,1,2,我们要改与主站一致。

三、以公共地址字节数=2,传输原因字节数=2,信息体地址字节数=3为例对一些基本的报文分析第一步:首次握手(U帧)U格式是用来激活/终止链路发送→激活传输启动: 68(启动符)04(长度)07(控制域)00 00 00接收→确认激活传输启动:68(启动符)04(长度)0B(控制域)00 00 00第二步:总召唤(I帧)I格式是用来控制站与被控站的信息传输的。

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

发送→总召唤:68(启动符)0E(长度)00 00(发送序号)00 00(接收序号)64(类型标示)01(可变结构限定词)06 00(传输原因)01 00(公共地址即RTU地址)00 00 00(信息体地址)14(区分是总召唤还是分组召唤,02年修改后的规约中没有分组召唤)接收→S帧:S帧用于监视。

通用版IEC104使用说明

通用版IEC104使用说明

通用版IEC104使用说明一、基本介绍通用版IEC104规约是根据IEC104通用标准而实现的,在运用配置软件DataEditor工具进行工程配置时,对每台基于通用版104通信规约的远动装置都会自动生成一个预先配置好的配置文件,配置文件名为node n.ini,文件名中的n表示该远动装置所属的节点号。

通用版IEC104规约程序是通过读取配置信息来决定数据传输的报文格式,因此通用版104通信规约是可配置的,通过更改配置可以进行不同数据类型或报文格式的数据通信。

另外,程序对数据的处理方面实行模块化设计,具有较强的通用性和可移植性。

二、使用说明1.工程配置工程配置同以往其它规约配置一样,如下图:图1 工程配置图2.配置文件配置文件(node n.ini)标准格式如下:[IEC104-CONFIG]YX_START_ADD=1;遥信起始位地址YC_START_ADD=16385;遥测量起始位地址YM_START_ADD=25601;电能量起始位地址SOE_START_ADD=4079;继电保护起始地址PARAMETER_START_ADD=20481;参数量起始位地址YK_START_ADD=24577;遥控起始位地址V ALUE_START_ADD=25089;设定值起始位地址FJT_START_ADD=26113;变压器分接头起始位地址INFO_START_ADD=26369;向子站传送二进制信息起始位地址STATE_START_ADD=26881;子站远动终端状态起始位地址COT_BYTE_NUM=2;传输原因字节数(1,2)COMMON_ADD_BYTE_NUM=2;应用服务数据单元公共地址字节数(1,2)INFO_OBJECT_ADD_BYTE_NUM=3;信息体地址字节数(1,2,3)YX_ASDU_TYPE=1;遥信标识类型BWYX_ASDU_TYPE=1;变位遥信标识类型SOE_ASDU_TYPE=30;事件标识类型YC_ASDU_TYPE=9;遥测量标识类型BHYC_ASDU_TYPE=21;变化遥测量标识类型YM_ASDU_TYPE=15;电能量标识类型,没有做带时标的YK_ASDU_TYPE=45;遥控标识类型SETV ALUE_ASDU_TYPE=48;定值设定标识类型,只要不是50(4个字节)其他都一样SETV ALUE_AUTO=1;0表示设定定值时需要有选择、执行的过程,1表示自动执行,可以不需要选择CONNECT_TIMEOUT=30;建立连接的超时(单位: s)TEST_TIMEOUT=15;应用规约数据单元的发送或者测试的超时时间(单位: s)DA TA_TIMEOUT=10;无数据报文情况下认可的超时时间(单位: s)TESTDATA_TIMEOUT=30;在长时间静止状态情况下发送测试帧的超时时间(单位: s) WSetK=12;K定值WSetW=1;W定值以上为通用版IEC104规约的标准配置,也是默认配置,每个参数附有详细注释,用户可以更需需要更改某个参数,选择需要传输的报文类型。

IEC 101(104)规约 介绍

IEC 101(104)规约 介绍

40
1级数据-变位遥信
68 L L 68 L.C L.A A.D CS 16
01 02 14 01 04 00 01 01 00 00 不带时标的单点信息 SQ:1 元素序列;2个信息对象 传输原因:总召唤 应用层公共地址01 信息体地址:0x0004 值:合 信息体地址:0x0001 值:分
48 100 101 103
遥调 总召唤 召唤电度量 校时
0x30 0x64 0x65 0x67
20
可变结构限定词
D7 D6 D5 D4 D3 D2 D1 D0
SQ
Num
说明:
SQ<0>:由信息对象地址寻址的单个信息元素或元素集合。
SQ<1>:单个信息元素或信息元素同类集合的序列。 SQ<0>:每个信息体分别带有信息体地址 SQ<1>:所有信息体共用信息体地址,后续信息体地址依 次加1。
17
链路层控制域功能码(平衡模式)
启动方向 功能码和服务
<0> 复位远方链路 <1>复位用户进程 <3>发送/确认用户数据 <9>请求链路状态
从动方向 功能码和服务
<0>确认:肯定认可 <1>确认:否定认可
<4>发送/无应答用户数据 无应答 <11>响应:链路状态
18
规约应用层
0x68 Len Len 0x68 Link Control Link Address Application Data Check Code 0x16
信息体地址:0x0704 遥测值:0x640a 品质描述:00
信息对象地址:0x0705 遥测值:0x730b 品质描述:00 信息对象地址:0x0706 遥测值:0x0273 品质描述:00

IEC104规约详细讲解

IEC104规约详细讲解

A站
APDU 发送或接收后的 内部计数器 V 状态
Ack V(S) V(R)
00
0
I(0,0)
1
I(1,0)
2
S(2)
B站
APDU 发 送 或 接 收 后 的 内部计数器 V 状态
V(S) V(R) Ack
0
0
0
1
2
超时 t3 2
U (TESTFR 激活)
超时 t1
主动关闭
未确认的测试过程
通讯特点(7)防止报文丢失和报 文重复传送
Ack V(S) V(R)
0
0
0
I(0,0) 1
A站
APDU 发送或接收后的内 部计数器 V 状态
V(S) V(R) Ack
0
00
1 2
超时
S(1)
t1
1
主动关闭
IEC 2796/2000
未确认的最后的 I 格式 APDU 情况下的超时
通讯特点(5)防止报文丢失和 报文重复传送
`
A站
APDU 发送或接收后的 内部计数器 V 状态
远动设备及系统 第5-104部分:传输规约
采用标准传输文件集的IEC60870-5-101 的网络访问
Telecontrol equipment and systems Part 5-104:Transmission protocolsNetwork access for IEC 60870-5-101 using standard transport profiles
规约结构(1)- 模型
应用层 (101) 表示层 会话层
传输层(TCP) 网络层(IP)
链路层 物理层

IEC104规约报文说明(104报文解释的比较好的文本)

IEC104规约报文说明(104报文解释的比较好的文本)

IEC104规约调试小结调试广西中调IEC-104规约时对报文作了如下的分析,不对地方请指正。

一、四遥信息体基地址范围“可设置104调度规约”有1997年和2002年两个版本,在流程上没有什么变化,02此配置要根据主站来定,有的主站可能设为1,1,2,我们要改与主站一致。

三、以公共地址字节数=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帧:注意:记录接收到的长帧,双方可以按频率发送,比如接收8帧I帧回答一帧S帧,也可以要求接收1帧I帧就应答1帧S帧。

6804 01 00 02 00接收→总召唤确认(发送帧的镜像,除传送原因不同):68(启动符)0E(长度)00 00(发送序号)00 00(接收序号)64(类型标示)01(可变结构限定词)07 00(传输原因)01 00(公共地址即RTU地址)00 00 00(信息体地址)14(同上)发送→S帧:注意:记录接收到的长帧,双方可以按频率发送,比如接收8帧I帧回答一帧S帧,也可以要求接收1帧I帧就应答1帧S帧。

68 04 01 00 02 00接收→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帧:6804 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帧:6804 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(控合)补充说明:1、报文中的长度指的是除启动字符与长度字节的所有字节。

iec104规约 c源码

iec104规约 c源码

iec104规约 c源码IEC 104是一种通信协议,用于远程监控和控制系统中的设备之间的数据交换。

这是一种基于客户端/服务器架构的协议,使用TCP/IP 协议栈进行通信。

以下是一个简单的IEC 104协议的C源码示例,用于建立一个IEC 104客户端:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <arpa/inet.h>#include <unistd.h>#define SERVER_IP "127.0.0.1" // 服务器IP地址#define SERVER_PORT 2404 // 服务器端口号int main() {int sock = 0, valread;struct sockaddr_in server_addr;char buffer[1024] = {0};char *hello = "Hello from client" // 创建套接字if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {printf("n Socket creation error ""n" return -1;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);// 将IP地址从字符串转换为网络字节顺序if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr)<= 0) {printf("nInvalid address/ Address not supported ""n" return -1;}// 连接到服务器if (connect(sock, (struct sockaddr *)&server_addr,sizeof(server_addr)) < 0) {printf("nConnection Failed ""n" return -1;}// 向服务器发送数据send(sock, hello, strlen(hello), 0);printf("Hello message sent"" // 从服务器接收数据valread = read(sock, buffer, 1024);printf("s"" buffer);return 0;```这段代码将创建一个套接字并连接到指定的服务器IP地址和端口号。

iec104规约编程

iec104规约编程

iec104规约编程
IEC 104规约是一种用于电力系统自动化的通信规约,主要用于远动设备之间的数据交换。

以下是一些IEC 104规约编程的示例:
1. 建立通信连接:使用IEC 104规约建立通信连接,需要设置串口参数,如波特率、数据位、停止位、校验位等,并使用特定的连接字符串或IP地址进行连接。

2. 数据帧结构:IEC 104规约使用变长数据帧进行通信,每个数据帧由帧头、地址域、控制域、信息域、帧尾等部分组成。

其中,地址域和帧尾是固定的,控制域和信息域是可变的。

3. 数据传输:IEC 104规约支持多种传输模式,如查询/应答模式和主从模式。

在查询/应答模式下,主站发送请求数据帧,从站响应相应的数据帧;在主从模式下,主站发送命令数据帧,从站根据命令执行相应的操作并返回响应数据帧。

4. 数据校验:IEC 104规约使用CRC校验算法对数据帧进行校验,以确保数据的正确传输。

发送方在发送数据帧之前需要计算出CRC
校验码,并将其附加在数据帧末尾;接收方收到数据帧后也需要重新计算CRC校验码,并将其与附加在数据帧末尾的CRC校验码进行比较,以判断数据帧是否正确传输。

5. 异常处理:IEC 104规约提供了异常处理机制,当出现通信错误或数据传输异常时,发送方和接收方需要进行相应的处理,例如重新连接、重发数据帧或丢弃错误数据帧等。

以上是一些常见的IEC 104规约编程的示例,实际编程过程中还
需要根据具体的设备和应用场景进行相应的调整和优化。

104规约简介

104规约简介

104规约简介根据IEC 60870-5-104规约上所讲,104(简称)规约是规范了IEC 60870-5-101的应用层与TCP/IP 提供的传输功能的结合。

在本讲义中要用到以下一些术语: APCI :应用协议控制信息 ASDU :应用服务数据单元 APDU :应用协议数据单元 一、104规约的基本帧格式 IEC 60870-5-104规约的APDU 定义控制域格式Bit ASDU 格式说明:1. 类型标识:是唯一标识该帧类型的 常用的类型标识:1 (01H ) :遥信2 (02H ) :SOE7 (07H):子站远动终端状态15 (0FH):电能脉冲计数量21 (15H):遥测46 (2EH):遥控100 (64H):召唤命令101 (65H):电能脉冲召唤命令103 (67H):对时2.可变结构限定词SQ为0,数据的信息体地址是非连续的(注:全数据召唤的遥信、遥测的数据的信息体地址是连续的,SQ = 1;遥信变位、SOE的数据的信息体地址是非连续的,SQ = 0)数目:传送数据的个数3.传送原因:表示突发传送、总召唤及确认等常用的传送原因:3 (03H):突发5 (05H):请求或被请求6 (06H):激活7 (07H):激活确认10 (0aH):激活结束20 (14H):响应总召唤37 (25H):响应计数量总召唤(电能)4.应用服务数据单元公共地址:厂站号5.信息体地址0:无关的信息体地址1H ~ 400H :遥信的信息体地址范围701H ~ 900H :遥测信息体地址范围B01H ~ B80H :遥控信息体地址范围C01H ~ C80H :电能脉冲计数量信息体地址范围二、数据帧举例(以新桥站同桃村站为例,以常用帧为主)全数据召唤帧:(以下数据均为16进制)遥信帧:说明:若所发送数据的信息体地址是连续的,则在每一帧只标识本帧的第一路遥信的信息体地址,下面只需连发数据即可。

在此,信息体地址同时也表明遥信的路数。

iec104规约 c源码

iec104规约 c源码

iec104规约 c源码以下是一个简单的IEC 104规约C源码示例:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_BUFFER_SIZE 1024typedef struct {unsigned char start;unsigned char length;unsigned char control;unsigned char address[2];unsigned char apci;unsigned char asdu[MAX_BUFFER_SIZE];unsigned char crc[2];unsigned char end;} IEC104Frame;void encodeIEC104Frame(IEC104Frame* frame, unsigned char* buffer, int* length) {int i;int index = 0;buffer[index++] = frame->start;buffer[index++] = frame->length;buffer[index++] = frame->control;buffer[index++] = frame->address[0];buffer[index++] = frame->address[1];buffer[index++] = frame->apci;for(i = 0; i < frame->length - 6; i++) {buffer[index++] = frame->asdu[i];}buffer[index++] = frame->crc[0];buffer[index++] = frame->crc[1];buffer[index++] = frame->end;*length = index;}void decodeIEC104Frame(unsigned char* buffer, int length, IEC104Frame* frame) {int i;int index = 0;frame->start = buffer[index++];frame->length = buffer[index++];frame->control = buffer[index++];frame->address[0] = buffer[index++];frame->address[1] = buffer[index++];frame->apci = buffer[index++];for(i = 0; i < frame->length - 6; i++) { frame->asdu[i] = buffer[index++];}frame->crc[0] = buffer[index++];frame->crc[1] = buffer[index++];frame->end = buffer[index++];}int main() {IEC104Frame frame;unsigned char buffer[MAX_BUFFER_SIZE]; int length;frame.start = 0x68;frame.length = 10;frame.control = 0x00;frame.address[0] = 0x01;frame.address[1] = 0x00;frame.apci = 0x08;frame.asdu[0] = 0x01;frame.asdu[1] = 0x02;frame.asdu[2] = 0x03;frame.crc[0] = 0x00;frame.crc[1] = 0x00;frame.end = 0x16;encodeIEC104Frame(&frame, buffer, &length);printf("Encoded fra " for(int i = 0; i < length; i++) {printf("02X " buffer[i]);}printf("n"IEC104Frame decodedFrame;decodeIEC104Frame(buffer, length, &decodedFrame);printf("Decoded fra start=%02X, length=%02X, control=%02X,address=%02X%02X, apci=%02X, asdu=%02X%02X%02X, crc=%02X%02X, end=%02X"" decodedFrame.start, decodedFrame.length, decodedFrame.control, decodedFrame.address[0], decodedFrame.address[1],decodedFrame.apci, decodedFrame.asdu[0], decodedFrame.asdu[1], decodedFrame.asdu[2],decodedFrame.crc[0], decodedFrame.crc[1], decodedFrame.end);return 0;}```这个示例演示了如何编码和解码IEC 104规约帧。

iec104通讯规约转发 java

iec104通讯规约转发 java

IEC 104通讯规约转发JavaIEC 104通讯规约是一种常见的工业控制系统通讯协议,被广泛应用于电力系统、水利系统、智能楼宇等领域。

在实际的工程应用中,需要对IEC 104通讯规约进行转发和处理。

本文将介绍如何使用Java语言实现IEC 104通讯规约的转发功能,为相关工程人员提供参考。

一、IEC 104通讯规约概述IEC 104通讯规约是一种面向对象的通讯规约,主要用于远程监控和数据采集。

它采用请求-应答的方式进行通讯,具有高效、可靠的特点。

IEC 104通讯规约主要包括以下几个方面的内容:1. 帧结构:IEC 104通讯规约的帧结构包括报文头、公共位置区域、信息对象位置区域、传输原因、应用服务数据单元等部分,其中报文头包括起始字符、长度、类型、控制域等字段。

2. 功能码:IEC 104通讯规约定义了多种功能码,包括链路测试、时钟同步、总召唤等功能,用于实现对远程设备的监控和控制。

3. 传输机制:IEC 104通讯规约采用基于传输层的可靠传输机制,支持窗口确认、自动重发等功能,保证通讯的可靠性和实时性。

二、IEC 104通讯规约转发的需求分析在实际工程中,由于系统之间的层次结构和通讯协议的不同,常常需要对IEC 104通讯规约进行转发和处理。

转发的需求主要包括以下几个方面:1. 多协议适配:不同设备和系统采用的通讯协议可能不同,需要进行协议适配,将IEC 104通讯规约转发为其他协议。

2. 数据处理:对于不同的业务需求,需要对IEC 104通讯规约的数据进行处理和转换,包括数据解析、加工、过滤等操作。

3. 安全性处理:在实际的工程应用中,需要对通讯数据进行加密、认证、权限控制等安全性处理。

三、IEC 104通讯规约转发的实现思路针对上述需求,可以采用Java语言实现IEC 104通讯规约的转发功能,具体的实现思路包括以下几个步骤:1. 通讯接口封装:使用Java的网络编程API,封装IEC 104通讯规约的通讯接口,包括建立连接、发送数据、接收数据等操作。

104规约说明

104规约说明

引言 (2)1 应用规约控制信息 (APCI) (3)1.1 应用规约控制信息 (APCI) 的定义 (3)1.2 防止报文丢失和报文重复传送 (6)1.3 测试过程 (7)1.4 用启/停进行传输控制 (7)1.5 未被确认的 I 格式 APDU (k)最大数目 (7)1.6 关于TCP连接 (8)2 报文结构 (10)2.1 104规约调试工具截图 (11)2.2 101规约信息地址: (12)2.3 类型标识 (13)2.4传送原因 (16)3 基本应用功能 (18)3.1站初始化 (18)3.2启动数据传输 (18)3.3停止数据传输 (18)3.4时钟同步 (18)3.5站总召唤 (20)3.6循环数据传送 (23)3.7读过程 (23)3.8突发传送 (23)3.9控制命令传送 (28)3.10累计量传送 (35)3.11参数装载 (35)3.12参数激活 (35)3.13测试过程 (35)3.14文件传输 (36)3.15背景扫描 (36)附A 问题解答 (37)附B (38)IEC60870-5-101为两个具有永久连接电路的主站与子站间传输基本远动信息提供了一套通信协议集。

在某些应用中,可能需要在通过数据网络连接的远动站之间传输相同类型的信息,这个数据网络上含有中继站,可以存储与转发信息,并在远动站之间提供虚电路。

这种网络的传输延时取决于网络负载。

一般而言,不确定的延时意味着在远动站之间没办法采用定义在IEC60870-5-101中的数据链路层。

但是,在某些情况下,还是可以使具有IEC60870-5-101全部3层的远动站,通过打包解包设备连接,从而适应数据网络,实现平衡通信。

对于其他所有情况,本标准不采用IEC60870-5-101的链路功能,但通过一套合适的传输文件集,可用来提供平衡式存取。

1 应用规约控制信息(APCI)1.1 应用规约控制信息(APCI) 的定义传输接口(TCP到用户)是一个定向流接口,它没有为IEC 60870-5-101中的ASDU定义任何启动或者停止机制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CS101_ASDU_addInformationObject(newAsdu, io);
CS101_ASDU_addInformationObject(newAsdu, (InformationObject)
MeasuredValueScaled_create((MeasuredValueScaled) io, 101, 23, IEC60870_QUALITY_GOOD));
static bool running = true;
void
sigint_handler(int signalId)
{
running = false;
}
void
printCP56Time2a(CP56Time2a time)
{
printf("%02i:%02i:%02i %02i/%02i/%04i", CP56Time2a_getHour(time),
CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 305, false, IEC60870_QUALITY_GOOD));
CS101_ASDU_addInformationObject(newAsdu, (InformationObject)
SinglePointInformation_create((SinglePointInformation) io, 105, false, IEC60870_QUALITY_GOOD));
CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 303, false, IEC60870_QUALITY_GOOD));
0, 1, false, false);
io = (InformationObject) SinglePointInformation_create(NULL, 104, true, IEC60870_QUALITY_GOOD);
CS101_ASDU_addInformationObject(newAsdu, io);
CP56Time2a_getMinute(time),
CP56Time2a_getSecond(time),
CP56Time2a_getDayOfMonth(time),
CS101_ASDU_addInformationObject(newAsdu, (InformationObject)
MeasuredValueScaled_create((MeasuredValueScaled) io, 102, 2300, IEC60870_QUALITY_GOOD));
printf("IOA: %i switch to %i\n", InformationObject_getObjectAddress(io),
SingleCommand_getState(sc));
CS101_ASDU_setCOT(asdu, CS101_COT_ACTIVATION_CON);
CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 307, false, IEC60870_QUALITY_GOOD));
}
else {
IMasterConnection_sendACT_CON(connection, asdu, true);
}
return true;
}
static bool
asduHandler(void* parameter, IMasterConnection connection, CS101_ASDU asdu)
CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 304, true, IEC60870_QUALITY_GOOD));
CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 306, true, IEC60870_QUALITY_GOOD));
{
if (CS101_ASDU_getTypeID(asdu) == C_SC_NA_1) {
printf("received single command\n");
if (CS101_ASDU_getCOT(asdu) == CS101_COT_ACTIVATION) {
{
printf("Process time sync command with time "); printCP56Time2a(newTime); printf("\n");
return true;
}
static bool
interrogationHandler(void* parameter, IMasterConnection connection, CS101_ASDU asdu, uint8_t qoi)
InformationObject_destroy(io);
IMasterConnection_sendASDU(connection, newAsdu);
CS101_ASDU_destroy(newAsdu);
newAsdu = CS101_ASDU_create(alParams, true, CS101_COT_INTERROGATED_BY_STATION,
CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_INTERROGATED_BY_STATION,
0, 1, false, false);
InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 100, -1, IEC60870_QUALITY_GOOD);
InformationObject_destroy(io);
IMasterConnection_sendASDU(connection, newAsdu);
CS101_ASDU_destroy(newAsdu);
newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_INTERROGATED_BY_STATION,
{
printf("Received interrogation for group %i\n", qoi);
if (qoi == 20) { /* only handle station interrogation */
CS101_AppLayerParameters alParams = IMasterConnection_getApplicationLayerParameters(connection);
CS101_ASDU_addInformationObject(newAsdu, (InformationObjeห้องสมุดไป่ตู้t) SinglePointInformation_create((SinglePointInformation) io, 302, true, IEC60870_QUALITY_GOOD));
InformationObject_destroy(io);
IMasterConnection_sendASDU(connection, newAsdu);
CS101_ASDU_destroy(newAsdu);
IMasterConnection_sendACT_TERM(connection, asdu);
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include "cs104_slave.h"
#include "hal_thread.h"
#include "hal_time.h"
CS101_ASDU_addInformationObject(newAsdu, (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 301, false, IEC60870_QUALITY_GOOD));
0, 1, false, false);
CS101_ASDU_addInformationObject(newAsdu, io = (InformationObject) SinglePointInformation_create(NULL, 300, true, IEC60870_QUALITY_GOOD));
IMasterConnection_sendACT_CON(connection, asdu, false);
相关文档
最新文档