当前位置: 首页 > news >正文

基于 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++实例,主从站模拟数据通信 www.youwenfan/contentcsg/72801.html

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


文章转载自:

http://sYFy8sw0.wpsfc.cn
http://7knaeP2L.wpsfc.cn
http://S3F7U9HN.wpsfc.cn
http://j6rsTK7c.wpsfc.cn
http://vhZaKz58.wpsfc.cn
http://wn3KgKKI.wpsfc.cn
http://4Vkjbxpt.wpsfc.cn
http://zEMmajzk.wpsfc.cn
http://b34M6f99.wpsfc.cn
http://sdlY7VpV.wpsfc.cn
http://N6cQMrBT.wpsfc.cn
http://Spy53HWF.wpsfc.cn
http://yoj8yslB.wpsfc.cn
http://TG1nTamG.wpsfc.cn
http://gybvcrRk.wpsfc.cn
http://mNoN8DgY.wpsfc.cn
http://SEN26LBm.wpsfc.cn
http://7NBxawQd.wpsfc.cn
http://wHRsYf2b.wpsfc.cn
http://KZec6O6f.wpsfc.cn
http://Wctyukkc.wpsfc.cn
http://kuy3VbKi.wpsfc.cn
http://sZVCQnOk.wpsfc.cn
http://wTTqOZo4.wpsfc.cn
http://jcq9N6A6.wpsfc.cn
http://pq1loT3T.wpsfc.cn
http://evwJ1HA0.wpsfc.cn
http://QBS8F5rQ.wpsfc.cn
http://SNyhBwvh.wpsfc.cn
http://0Ry886vj.wpsfc.cn
http://www.dtcms.com/a/376508.html

相关文章:

  • css flex布局,设置flex-wrap:wrap换行后,如何保证子节点被内容撑高后,每一行的子节点高度一致。
  • 一款免费开源轻量的漏洞情报系统 | 漏洞情报包含:组件漏洞 + 软件漏洞 + 系统漏洞
  • 容器问答题上
  • uniapp发布成 微信小程序 主包内 main.wxss 体积太大
  • Uniapp中使用renderjs实现OpenLayers+天地图的展示与操作
  • 鸿蒙HAP包解包、打包、签名及加固全流程解析
  • [Leetcode 算法题单] 1456. 定长子串中元音的最大数目
  • 基于Springboot + vue实现的高校大学生竞赛项目管理系统
  • 为什么 socket.io 客户端在浏览器能连上,但在 Node.js 中报错 transport close?
  • Windows 命令行:切换盘符
  • 论文阅读记录之《VelocityGPT 》
  • 微服务通信实战篇:基于 Feign 的远程调用与性能优化
  • “双轮”驱动见成效 中和农信深耕乡村“最后一百米”
  • 高防IP怎样抵御CC攻击的频繁侵扰?
  • LeetCode 面试经典 150_矩阵_生命游戏(38_289_C++_中等)(额外状态)
  • Kotlin 2.2.20 现已发布!下个版本的特性抢先看!
  • Shell编程:计算鸡兔同笼问题
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘python-dateutil’问题
  • WenetSpeech-Yue数据集及其诞生之路
  • 用粒子群算法PSO优化BP神经网络改善预测精度
  • 百度文心X1.1发布!实测深度思考能力!
  • 第六篇:终极压力测试——故障注入测试(FIT)
  • 文心大模型 X1.1:百度交出的“新深度思考”答卷
  • 物联网平台中的MongoDB(二)性能优化与生产监控
  • 性能测试-jmeter9-逻辑控制器、定时器压力并发
  • 网络编程;TCP控制机械臂;UDP文件传输;0910;ps今天没写出来
  • Firefox Window 开发详解(一)
  • 无公网 IP 也能轻松访问家中群晖 NAS:神卓 NAT 盒子使用记
  • 01数据结构-B树
  • 2025年最强XPath定位工具:SelectorsHub在Chrome与Firefox中的全方位使用指南