基于 C++ 的 IEC60870-5-104 规约的主从站模拟数据通信

简介: 基于 C++ 的 IEC60870-5-104 规约的主从站模拟数据通信

基于 C++ 的 IEC60870-5-104 规约的主从站模拟数据通信。包括了报文的组织和解析,以及主从站之间的通信流程。

1. 报文组织与解析

IEC60870-5-104 规约定义了多种类型的帧,包括 U 帧、S 帧和 I 帧。以下是一些关键的报文组织和解析函数。

1.1 U 帧组织

U 帧用于控制链路状态,例如启动和停止数据传输。

void buildUFrame(uint8_t* buffer, uint8_t controlByte) {
   
    buffer[0] = 0x68; // 启动字节
    buffer[1] = 0x04; // 长度
    buffer[2] = controlByte; // 控制字节
    buffer[3] = 0x00; // 保留字节
    buffer[4] = 0x00; // 发送序号
    buffer[5] = 0x00; // 接收序号
}

1.2 S 帧组织

S 帧用于确认接收到的 I 帧。

void buildSFrame(uint8_t* buffer, uint16_t sendSeq, uint16_t recvSeq) {
   
    buffer[0] = 0x68; // 启动字节
    buffer[1] = 0x04; // 长度
    buffer[2] = 0x01; // 控制字节
    buffer[3] = 0x00; // 保留字节
    buffer[4] = sendSeq & 0xFF; // 发送序号
    buffer[5] = recvSeq & 0xFF; // 接收序号
}

1.3 I 帧组织

I 帧用于传输应用层数据。

void buildIFrame(uint8_t* buffer, uint16_t sendSeq, uint16_t recvSeq, uint8_t* data, uint16_t dataLen) {
   
    buffer[0] = 0x68; // 启动字节
    buffer[1] = dataLen + 6; // 长度
    buffer[2] = (sendSeq >> 8) & 0xFF; // 发送序号
    buffer[3] = sendSeq & 0xFF;
    buffer[4] = (recvSeq >> 8) & 0xFF; // 接收序号
    buffer[5] = recvSeq & 0xFF;
    memcpy(buffer + 6, data, dataLen); // 数据
}

2. 主从站通信流程

主站和从站之间的通信流程包括启动链路、数据传输和停止链路。

2.1 主站启动链路

主站发送 STARTDT 帧,从站响应 STARTDT 帧。

void masterStartLink(uint8_t* buffer) {
   
    buildUFrame(buffer, 0x07); // STARTDT
}

void slaveRespondStartLink(uint8_t* buffer) {
   
    buildUFrame(buffer, 0x0B); // STARTDT 确认
}

2.2 主站发送总召唤命令

主站发送总召唤命令,从站响应总召唤命令。

void masterSendTotalCall(uint8_t* buffer) {
   
    uint8_t data[] = {
   0x65, 0x01, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x45};
    buildIFrame(buffer, 1, 0, data, sizeof(data));
}

void slaveRespondTotalCall(uint8_t* buffer) {
   
    uint8_t data[] = {
   0x65, 0x01, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x45};
    buildIFrame(buffer, 1, 1, data, sizeof(data));
}

2.3 主站停止链路

主站发送 STOPDT 帧,从站响应 STOPDT 帧。

void masterStopLink(uint8_t* buffer) {
   
    buildUFrame(buffer, 0x13); // STOPDT
}

void slaveRespondStopLink(uint8_t* buffer) {
   
    buildUFrame(buffer, 0x23); // STOPDT 确认
}

3. 报文解析

解析从站发送的报文,提取数据。

void parseUFrame(uint8_t* buffer) {
   
    uint8_t controlByte = buffer[2];
    if (controlByte == 0x0B) {
   
        // 从站确认启动链路
    } else if (controlByte == 0x23) {
   
        // 从站确认停止链路
    }
}

void parseSFrame(uint8_t* buffer) {
   
    uint16_t recvSeq = (buffer[4] << 8) | buffer[5];
    // 处理接收序号
}

void parseIFrame(uint8_t* buffer) {
   
    uint16_t sendSeq = (buffer[2] << 8) | buffer[3];
    uint16_t recvSeq = (buffer[4] << 8) | buffer[5];
    uint16_t dataLen = buffer[1] - 6;
    uint8_t* data = buffer + 6;
    // 处理数据
}

4. 主从站模拟

模拟主站和从站之间的通信。

int main() {
   
    uint8_t masterBuffer[1024];
    uint8_t slaveBuffer[1024];

    // 主站启动链路
    masterStartLink(masterBuffer);
    // 从站响应启动链路
    slaveRespondStartLink(slaveBuffer);

    // 主站发送总召唤命令
    masterSendTotalCall(masterBuffer);
    // 从站响应总召唤命令
    slaveRespondTotalCall(slaveBuffer);

    // 主站停止链路
    masterStopLink(masterBuffer);
    // 从站响应停止链路
    slaveRespondStopLink(slaveBuffer);

    return 0;
}

参考代码 104规约C++实例,主从站模拟数据通信 youwenfan.com/contentalc/72801.html

通过以上代码,可以实现基于 IEC60870-5-104 规约的主从站模拟数据通信。

相关文章
|
BI Windows
Qt 报表实现简述(一)
Qt 报表实现简述(一)
580 1
|
7月前
|
移动开发 JavaScript 前端开发
【开源】告别“拍脑袋”管理:基于原生 Web 的轻量级项目管理计算器实战
本文介绍开源项目“豫唐工具集·项目管理计算器”:一款零依赖、纯静态的Web工具,专注解决EVM挣值分析、NPV投资评估与FPIF合同结算三大痛点。开箱即用,支持本地运行与二次开发,助你快速量化决策。
618 3
|
8月前
|
机器学习/深度学习 边缘计算 安全
C#实现OPC客户端
C#实现OPC客户端,结合OPC DA与OPC UA两种协议
IEC104初学者教程,第四章:IEC 104 开发环境搭建
搭建IEC104开发环境涉及两款模拟器:[主站模拟器](https://www.redisant.cn/iec104client) 和 [从站模拟器](https://www.redisant.cn/iec104server)。从站模拟器中,创建连接后添加从站,配置信息对象;主站模拟器同样新建连接并开启,向从站发送总召唤以获取数据。每个步骤配有图示指导操作。
2895 14
IEC104初学者教程,第四章:IEC 104 开发环境搭建
|
弹性计算 监控 JavaScript
云效Flow:打造高效、稳定的CI/CD流程实战指南
【10月更文挑战第7天】本文介绍了“云效Flow”这一CI/CD工具,通过实际案例展示了其在Node.js项目中的应用,包括自动化构建、测试及部署流程。云效Flow支持多种开发语言与框架,集成第三方服务,提供详尽的新手引导,简化了CI/CD流程的搭建,提升了开发效率与软件质量,特别适合初创团队和大型企业使用。
1001 4
|
人工智能 Java API
阿里云 0 元领取 100 万 Tokens,零门槛体验 DeepSeek-R1 满血版
阿里云开放DeepSeek-R1满血版体验,0门槛领取100万Tokens,参数规模6710亿,性能强劲且完全免费。用户可轻松写代码、做表格、写故事、逻辑推理等。重点是无需任何编程基础,学生党、职场新人皆可使用。通过注册阿里云账号、生成API Key并使用HiFox客户端,即可快速上手体验顶级AI助手的强大功能。限时福利,赶快行动!
1882 65
|
Ubuntu Linux Shell
Linux Crontab 定时任务 及 Ubuntu 中cron指令使用
本文是博主学习linux定时任务的记录,希望对大家有所帮助
1482 0
Linux Crontab 定时任务 及 Ubuntu 中cron指令使用
|
Arthas 缓存 监控
Watch 命令的参数介绍 | 学习笔记
快速学习 Watch 命令的参数介绍
1602 119
Watch 命令的参数介绍 | 学习笔记

热门文章

最新文章