PLC通信交互系统技术分享
目录
0、前言
1、模块划分
2、状态机
3、通信层增强
4、异常处理机制
5、核心代码
关键状态处理示例
6、部署与测试方案
1. 环境要求
2. 性能测试指标
0、前言
这是一个C++程序,用于与西门子PLC进行通信,处理SN码、拍照信号、检测结果等流程。代码中使用了状态机,通过不同的状态来管理交互步骤。
1、模块划分
class PLCManager { // PLC连接管理 TS7Client* client; // 通信客户端 ConnectionStatus status; // 连接状态机
public:bool reconnect(int max_retry);void safeDisconnect();
};class StateProcessor { // 状态处理器 enum class WorkflowState : uint8_t {WAIT_SN = 0, // 状态枚举 PROCESS_IMAGE = 50,DEFECT_DETECTION =70 };
public:void transitionState(WorkflowState new_state);
};class DataConverter { // 数据转换工具
public:static std::string vectorToPLCFormat(const std::vector<int>& data);static std::vector<int> parsePLCSignal(byte* raw_data);
};
2、状态机
状态转换表
| 当前状态 | 触发条件 | 下一状态 | 超时时间 |
|---|---|---|---|
| WAIT_SN | 收到DB16.1=1 | READ_SN | 30s |
| READ_SN | 成功读取SN字符串 | ACK_SN | 10s |
| ACK_SN | 收到PLC确认信号 | WAIT_CAPTURE | 60s |
3、通信层增强
连接管理
// 指数退避重连算法
bool PLCManager::reconnect(int max_retry) {constexpr int base_delay = 1; // 秒 int current_delay = base_delay;for (int i=0; i<max_retry; ++i){if(connect()) return true;std::this_thread::sleep_for(std::chrono::seconds(current_delay));current_delay *= 2; // 退避策略 }return false;
}
数据读写
- 使用内存映射替代离散读写
#pragma pack(push, 1)
struct PLCDB16 { // 映射DB16数据结构 byte reserve1[16];uint16_t send_signal; // 偏移16 uint16_t ack_signal; // 偏移18 uint16_t result_flag; // 偏移20 uint16_t subzone[12]; // 偏移22-44 char sn_code[32]; // 偏移46
};
#pragma pack(pop)// 批量读写示例
PLCDB16 db_data;
client->DBRead(16, 0, sizeof(PLCDB16), &db_data);
4、异常处理机制
分层错误码设计
@startuml
enum ErrorCode {NETWORK_FAILURE = 0x1000,PROTOCOL_ERROR = 0x2000,DATA_INVALID = 0x3000
}class RetryStrategy {+ MAX_RETRY_TIMES = 5 + BACKOFF_BASE = 1s
}PLCManager --> ErrorCode
PLCManager --> RetryStrategy
@enduml
结构化日志输出
class PLCLogger {enum class LogLevel {TRACE,DEBUG,INFO,WARN,ERROR };void log(LogLevel level, const std::string& tag,const std::string& msg) {auto now = std::chrono::system_clock::now();std::cout << fmt::format("[{:%Y-%m-%d %H:%M:%S}] [{}] [{}] {}",now, levelToString(level),tag,msg ) << std::endl;}
};
5、核心代码
PLCManager plc(PLC_IP);
StateProcessor processor;
DefectDetector detector;plc.connectWithRetry(3); // 3次重试 while(running) {auto current_state = processor.currentState(); switch(current_state) {case State::WAIT_SN:handleWaitSN(plc, processor);break;case State::IMAGE_CAPTURE:handleImageCapture(plc, detector);break;case State::DEFECT_ANALYSIS:handleDefectAnalysis(plc, detector);break;default:logError("Invalid state");}checkTimeout(processor); // 状态超时检测
}
关键状态处理示例
SN码处理流程
void handleSNProcessing(PLCManager& plc, StateProcessor& sp) {PLCDB16 db;plc.readDB16(db); // 读取完整DB块 if(db.send_signal == 1) {std::string sn = db.sn_code; if(validateSN(sn)) {sp.transition(State::ACK_SN); plc.writeAckSignal(1); // 写入确认信号 logInfo(fmt::format("Valid SN: {}", sn));} else {plc.writeErrorCode(0x3001); // 数据无效错误 logError("Invalid SN format");}}
}
性能监控实现
class PerformanceMonitor {std::map<State, std::chrono::milliseconds> state_durations;std::chrono::time_point<Clock> state_start;public:void onStateChanged(State new_state) {auto duration = Clock::now() - state_start;state_durations[current_state] += duration;state_start = Clock::now();}void printReport() {for(auto& [state, dur] : state_durations) {std::cout << stateToString(state) << ": " << dur.count() << "ms\n";}}
};
6、部署与测试方案
1. 环境要求
- 硬件:
- 西门子S7-1200/1500系列PLC
- 工业级网卡(支持Profinet)
- 软件:
- Snap7 1.4+ 通信库
- C++17编译环境
2. 性能测试指标
| 指标 | 优化前 | 优化后 | 提升率 |
|---|---|---|---|
| 单次通信耗时 | 45ms | 28ms | 38% |
| 状态切换延迟 | 120ms | 65ms | 46% |
| 断线恢复时间 | 15s | 3.2s | 78% |
相关文章:
PLC通信交互系统技术分享
目录 0、前言 1、模块划分 2、状态机 3、通信层增强 4、异常处理机制 5、核心代码 关键状态处理示例 6、部署与测试方案 1. 环境要求 2. 性能测试指标 0、前言 这是一个C程序,用于与西门子PLC进行通信,处理SN码、拍照信号、检测结果等流程。代码…...
ceph HEALTH_WARN clock skew detected on mon.f, mon.o, mon.p, mon.q
问题 ceph health detail[WRN] MON_CLOCK_SKEW: clock skew detected on mon.f, mon.o, mon.p, mon.qmon.f clock skew 0.243128s > max 0.05s (latency 0.000836159s)mon.o clock skew 16.249s > max 0.05s (latency 0<...
Git命令行入门
诸神缄默不语-个人CSDN博文目录 之前写过一篇VSCode Git的博文:VSCode上的Git使用手记(持续更新ing…) 现在随着开发经历增加,感觉用到命令行之类复杂功能的机会越来越多了,所以我专门再写一篇Git命令行的文章。 G…...
pdf-extract-kit paddle paddleocr pdf2markdown.py(效果不佳)
GitHub - opendatalab/PDF-Extract-Kit: A Comprehensive Toolkit for High-Quality PDF Content Extraction https://github.com/opendatalab/PDF-Extract-Kit pdf2markdown.py 运行遇到的问题: 错误: -------------------------------------- C Tra…...
Android 10.0 移除wifi功能及相关菜单
介绍 客户的机器没有wifi功能,所以需要删除wifi相关的菜单,主要有设置-网络和互联网-WLAN,长按桌面设置弹出的WALN快捷方式,长按桌面-微件-设置-WLAN。 修改 Android10 上直接将config_show_wifi_settings改为false,这样wifi菜单的入口就隐…...
什么是Dubbo?Dubbo框架知识点,面试题总结
本篇包含什么是Dubbo,Dubbo的实现原理,节点角色说明,调用关系说明,在实际开发的场景中应该如何选择RPC框架,Dubbo的核心架构,Dubbo的整体架构设计及分层。 主页还有其他的面试资料,有需要的可以…...
Django+Vue3全栈开发实战:从零搭建博客系统
文章目录 1. 开发环境准备2. 创建Django项目与配置3. 设计数据模型与API4. 使用DRF创建RESTful API5. 创建Vue3项目与配置6. 前端页面开发与组件设计7. 前后端交互与Axios集成8. 项目优化与调试9. 部署上线10. 总结与扩展10.1 项目总结10.1.1 技术栈回顾10.1.2 项目亮点 10.2 扩…...
双重差分学习笔记
双重差分适用的研究场景: 研究某项政策或者冲击造成的影响 例如,某某小学在2024.12.12日颁布了小红花激励措施,我们要研究这项措施对学生成绩的影响,此时,就可以使用双重差分模型。 双重差分适用的数据类型…...
python组备赛笔记(基础篇)
小数输出 1、代码示例: print(jc,%.3f%fc) 输出格式: 890 86075.959 2、代码示例: print(f%.3f%b) 输出格式: 1.000 金字塔输出 1、代码示例: n 5 t * for i in range(1,n1):print(f{t*(2*i-1):^{2*n-1}}) fo…...
从零开始构建一个小型字符级语言模型的完整详细教程(基于Transformer架构)
最近特别火的DeepSeek,是一个大语言模型,那一个模型是如何构建起来的呢?DeepSeek基于Transformer架构,接下来我们也从零开始构建一个基于Transformer架构的小型语言模型,并说明构建的详细步骤及内部组件说明。我们以构建一个字符级语言模型(Char-Level LM)为例,目标是通…...
XUnity.AutoTranslator-Gemini——调用Google的Gemini API, 实现Unity游戏中日文文本的自动翻译
XunityAutoTranslator-Gemini-API 本项目是一个使用 Flask 框架和 Google Gemini GenAI 模型构建的 Web API 服务,用于将日文unity游戏文本翻译成简体中文。 日文游戏文本AI翻译API (基于Google Gemini) 本项目是一个使用 Flask 框架和 Google Gemini GenAI 模型…...
中文Build a Large Language Model (From Scratch) 免费获取全文
中文pdf下载地址:https://pan.baidu.com/s/1aq2aBcWt9vYagT2-HuxdWA?pwdlshj 提取码:lshj 原文、代码、视频项目地址:https://github.com/rasbt/LLMs-from-scratch 翻译工具:沉浸式翻译(https://app.immersivetrans…...
DeepSeek 助力 Vue 开发:打造丝滑的瀑布流布局(Masonry Layout)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
C++:从拷贝构造函数到深浅拷贝
拷贝构造函数 当实例化一个新对象并使用同类型对其进行初始化时,会显式调用类的拷贝构造函数,拷贝构造函数写法:形参为const修饰的同类型类引用。拷贝构造函数有个需要注意的点,形参为何是只允许传递引用呢?原因在于若…...
Openssl之SM2加解密命令
### 1. 生成 SM2 私钥openssl genpkey -algorithm EC \-pkeyopt ec_paramgen_curve:sm2 \-out sm2_private_key.pem### 2. 从私钥导出 SM2 公钥openssl pkey -in sm2_private_key.pem \-pubout \-out sm2_public_key.pem### 3. 使用 SM2 公钥加密openssl pkeyutl -encrypt \-pu…...
Java集合框架之List接口详解
目录 一、List接口概述 二、List接口常见实现类 三、List接口特有方法: 1.元素操作 2. 查找元素位置 3. 子列表与不可变列表 四、List特有迭代器:ListIterator 1.特有的迭代方式 2.ListIterator接口中的常用方法: ⑴.void add(E e):在光标位置插入元素。(会移动…...
oracle apex post接口
日常记录 使用到了apex_json方式接收 、、、1 首先,接口通过body传递过来,成功接收到, 数据格式为 JSON_OBJECT_T l_json : JSON_OBJECT_T.parse(:body); 这里我用参数接收到 然后 里面是包含了 "data" 我用 继续接收到这个 l…...
【数据挖掘】--算法
【数据挖掘】--算法 目录:1. 缺失值和数值属性处理1缺失值处理: 2. 用于文档分类的朴素贝叶斯3. 分治法:建立决策树4. 覆盖算法建立规则5. 挖掘关联规则6. 线性模型有效寻找最近邻暴力搜索(Brute-Force Search)kd树&am…...
halcon机器视觉深度学习对象检测,物体检测
目录 效果图操作步骤软件版本halcon参考代码本地函数 get_distinct_colors()本地函数 make_neighboring_colors_distinguishable() 效果图 操作步骤 首先要在Deep Learning Tool工具里面把图片打上标注文本, 然后训练模型,导出模型文件 这个是模型 mod…...
英文字体:极简现代浓缩未来派科技海报标题排版无衬线字体 PODIUM Sharp Font
PODIUM Sharp 是 2012 年设计的 DUDU 字体的扩展版本。多年后,我决定通过添加新的母版和粗细来重建和开发这种字体。最后,PODIUM Sharp 由 234 种款式组成:从超压缩发际线到超扩展重度。 这个项目的主要目的是在我在旧波兰标本中发现的不同模…...
如何快速部署开源实验室管理系统:面向中小型实验室的完整指南
如何快速部署开源实验室管理系统:面向中小型实验室的完整指南 【免费下载链接】senaite.lims SENAITE Meta Package 项目地址: https://gitcode.com/gh_mirrors/se/senaite.lims 在当今数字化时代,实验室管理面临着前所未有的挑战:如何…...
NHSE:3步掌握《动物森友会》存档编辑,打造你的完美岛屿
NHSE:3步掌握《动物森友会》存档编辑,打造你的完美岛屿 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE 你是否厌倦了在《集合啦!动物森友会》中花费数周时间收集…...
Cursor + Claude Code 接入 API 实战:国内稳定使用 Claude 4.7 配置全攻略
官方 API 国内直连必败,本文给出 Cursor 和 Claude Code 两套完整配置方案, 图文步骤可直接照做,配置完成后无需代理,延迟稳定在 200ms 以内。为什么官方地址不能用? Anthropic 官方 API 地址 api.anthropic.com 在国内…...
词级神经语言模型开发实战:从原理到应用
1. 词级神经语言模型开发指南在自然语言处理领域,词级神经语言模型是构建智能文本系统的基石。这类模型通过分析大量文本数据,学习词语之间的概率分布关系,不仅能预测下一个可能出现的单词,还能生成连贯的新文本。我在实际项目中多…...
5分钟快速上手:炉石传说自动化脚本终极完整指南
5分钟快速上手:炉石传说自动化脚本终极完整指南 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 厌倦了重复的炉石传说对战操作?…...
GetQzonehistory:5分钟永久保存QQ空间说说的终极解决方案
GetQzonehistory:5分钟永久保存QQ空间说说的终极解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字记忆时代,QQ空间承载了无数人的青春回忆…...
【国家智能制造专项组内部参考】MCP 2026工业适配黄金窗口期(2025.3–2026.6)倒计时:错过将无法接入2026新版工业互联网标识解析体系
更多请点击: https://intelliparadigm.com 第一章:MCP 2026工业适配的战略意义与政策边界 MCP(Manufacturing Control Protocol)2026 是面向新一代智能制造基础设施设计的轻量级实时通信协议,其核心目标是在边缘设备层…...
Cadence allegro 全家桶 以及相关文件说明
0. cadence allegro 系列文件说明 版图编辑器会自动为你输入的主文件名添加对应后缀,不同后缀代表不同文件类型,说明如下: 表格 后缀 文件类型说明 .art(默认) 光绘文件。可在「设置 – 用户偏好设置」(命令:enved)中配置环境变量 ext_artwork,自定义光绘文件默认后…...
2026 AI搜索优化必看:这5款工具亲测有效
GEO(Generative Engine Optimization,生成式引擎优化)已经成为2026年数字营销领域最重要的技术方向之一。本文从功能完整性、AI模型支持、易用性和性价比四个技术维度,对当前国内外主流的GEO优化工具进行了深度评测和对比分析。1.…...
模型量化实战:从零实现PyTorch训练后量化(PTQ)全流程
1. 什么是训练后量化(PTQ)? 训练后量化(Post-Training Quantization,简称PTQ)是一种常见的模型压缩技术,它能在不重新训练模型的情况下,将浮点模型转换为低精度整型模型。简单来说&a…...
