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 种款式组成:从超压缩发际线到超扩展重度。 这个项目的主要目的是在我在旧波兰标本中发现的不同模…...
可控硅(晶闸管)基础知识及应用电路Multisim电路仿真
目录 一、可控硅基础知识 1.1 概述 1.2 晶闸管主要类型 1.2.1 单向可控硅(SCR) 1.2.1.1 单向晶闸管基本结构与符号 1.2.2 双向可控硅(TRIAC) 1.2.2.1 双向晶闸管基本结构与符号 1.2.3 特殊类型 1.3 单向晶闸管工作原理 1.3.1 单向晶闸管等效模型 1.3.2 单向晶闸…...
【计算机毕业设计】基于Springboot的城镇保障性住房管理系统+LW
博主介绍:✌全网粉丝3W,csdn特邀作者、CSDN新星计划导师、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、…...
基于环境传感器的房间占用预测模型全流程解析
1. 环境因素预测房间占用率:从数据到模型的全流程解析在智能建筑和节能管理领域,准确预测房间占用状态是一个具有实际应用价值的问题。通过监测温度、湿度、光照等环境参数,我们可以建立预测模型来判断房间是否被占用,而无需使用摄…...
zmq源码分析之PUSH/PULL 模式的负载均衡分析
文章目录核心实现PUSH 端的负载均衡PULL 端的处理负载均衡机制详解1. 轮询分发2. 动态调整3. 无状态设计负载均衡效果示例场景代码实现分析PUSH 模式的管道管理PULL 模式的公平队列适用场景优势与限制优势限制代码优化建议总结PUSH/PULL 模式的负载均衡是指PUSH 端会将消息均匀…...
【限时公开】某头部交易所MCP网关核心模块源码(含TLS1.3卸载、动态路由热加载、熔断指标埋点)
更多请点击: https://intelliparadigm.com 第一章:MCP网关架构设计与高性能通信模型概览 MCP(Microservice Communication Protocol)网关是面向云原生微服务生态构建的统一通信中枢,其核心目标是在异构协议、多语言服…...
5分钟快速上手:Jable视频下载工具完整指南
5分钟快速上手:Jable视频下载工具完整指南 【免费下载链接】jable-download 方便下载jable的小工具 项目地址: https://gitcode.com/gh_mirrors/ja/jable-download 还在为无法保存喜欢的Jable视频而烦恼吗?想要随时随地离线观看高清内容却找不到简…...
DeepSeek-V4实测:能读3本《三体》的开源大模型,短板也很真实
一次性读完3本《三体》,开源模型终于站起来?实测揭露真相——有人欢呼,有人沉默2026年4月24日,AI圈又炸了。 DeepSeek 发布 DeepSeek-V4 预览版,一上来就扔出王炸:100万字上下文窗口。 这什么概念ÿ…...
全网最大、最全的开源社区——『具身智能之心-开源知识库社区』。
“具身智能之心”近期上线了全网最大、最全的开源社区——『具身智能之心-开源知识库社区』。 里面汇总了具身智能方向的主流技术、产业应用、学术研究、具身企业,还有大家比较关注的行业政策和投融资信息,希望为具身智能行业的朋友提供一个体系化的行业…...
