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

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=1READ_SN30s
READ_SN成功读取SN字符串ACK_SN10s
ACK_SN收到PLC确认信号WAIT_CAPTURE60s

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. 性能测试指标

指标优化前优化后提升率
单次通信耗时45ms28ms38%
状态切换延迟120ms65ms46%
断线恢复时间15s3.2s78%

相关文章:

PLC通信交互系统技术分享

目录 0、前言 1、模块划分 2、状态机 3、通信层增强 4、异常处理机制 5、核心代码 关键状态处理示例 6、部署与测试方案 1. 环境要求 2. 性能测试指标 0、前言 这是一个C程序&#xff0c;用于与西门子PLC进行通信&#xff0c;处理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的博文&#xff1a;VSCode上的Git使用手记&#xff08;持续更新ing…&#xff09; 现在随着开发经历增加&#xff0c;感觉用到命令行之类复杂功能的机会越来越多了&#xff0c;所以我专门再写一篇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 运行遇到的问题&#xff1a; 错误&#xff1a; -------------------------------------- C Tra…...

Android 10.0 移除wifi功能及相关菜单

介绍 客户的机器没有wifi功能&#xff0c;所以需要删除wifi相关的菜单&#xff0c;主要有设置-网络和互联网-WLAN,长按桌面设置弹出的WALN快捷方式&#xff0c;长按桌面-微件-设置-WLAN。 修改 Android10 上直接将config_show_wifi_settings改为false,这样wifi菜单的入口就隐…...

什么是Dubbo?Dubbo框架知识点,面试题总结

本篇包含什么是Dubbo&#xff0c;Dubbo的实现原理&#xff0c;节点角色说明&#xff0c;调用关系说明&#xff0c;在实际开发的场景中应该如何选择RPC框架&#xff0c;Dubbo的核心架构&#xff0c;Dubbo的整体架构设计及分层。 主页还有其他的面试资料&#xff0c;有需要的可以…...

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 扩…...

双重差分学习笔记

双重差分适用的研究场景&#xff1a; 研究某项政策或者冲击造成的影响 例如&#xff0c;某某小学在2024.12.12日颁布了小红花激励措施&#xff0c;我们要研究这项措施对学生成绩的影响&#xff0c;此时&#xff0c;就可以使用双重差分模型。 双重差分适用的数据类型&#xf…...

python组备赛笔记(基础篇)

小数输出 1、代码示例&#xff1a; print(jc,%.3f%fc) 输出格式&#xff1a; 890 86075.959 2、代码示例&#xff1a; print(f%.3f%b) 输出格式&#xff1a; 1.000 金字塔输出 1、代码示例&#xff1a; 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 服务&#xff0c;用于将日文unity游戏文本翻译成简体中文。 日文游戏文本AI翻译API (基于Google Gemini) 本项目是一个使用 Flask 框架和 Google Gemini GenAI 模型…...

中文Build a Large Language Model (From Scratch) 免费获取全文

中文pdf下载地址&#xff1a;https://pan.baidu.com/s/1aq2aBcWt9vYagT2-HuxdWA?pwdlshj 提取码&#xff1a;lshj 原文、代码、视频项目地址&#xff1a;https://github.com/rasbt/LLMs-from-scratch 翻译工具&#xff1a;沉浸式翻译&#xff08;https://app.immersivetrans…...

DeepSeek 助力 Vue 开发:打造丝滑的瀑布流布局(Masonry Layout)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

C++:从拷贝构造函数到深浅拷贝

拷贝构造函数 当实例化一个新对象并使用同类型对其进行初始化时&#xff0c;会显式调用类的拷贝构造函数&#xff0c;拷贝构造函数写法&#xff1a;形参为const修饰的同类型类引用。拷贝构造函数有个需要注意的点&#xff0c;形参为何是只允许传递引用呢&#xff1f;原因在于若…...

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 首先&#xff0c;接口通过body传递过来&#xff0c;成功接收到&#xff0c; 数据格式为 JSON_OBJECT_T l_json : JSON_OBJECT_T.parse(:body); 这里我用参数接收到 然后 里面是包含了 "data" 我用 继续接收到这个 l…...

【数据挖掘】--算法

【数据挖掘】--算法 目录&#xff1a;1. 缺失值和数值属性处理1缺失值处理&#xff1a; 2. 用于文档分类的朴素贝叶斯3. 分治法&#xff1a;建立决策树4. 覆盖算法建立规则5. 挖掘关联规则6. 线性模型有效寻找最近邻暴力搜索&#xff08;Brute-Force Search&#xff09;kd树&am…...

halcon机器视觉深度学习对象检测,物体检测

目录 效果图操作步骤软件版本halcon参考代码本地函数 get_distinct_colors()本地函数 make_neighboring_colors_distinguishable() 效果图 操作步骤 首先要在Deep Learning Tool工具里面把图片打上标注文本&#xff0c; 然后训练模型&#xff0c;导出模型文件 这个是模型 mod…...

英文字体:极简现代浓缩未来派科技海报标题排版无衬线字体 PODIUM Sharp Font

PODIUM Sharp 是 2012 年设计的 DUDU 字体的扩展版本。多年后&#xff0c;我决定通过添加新的母版和粗细来重建和开发这种字体。最后&#xff0c;PODIUM Sharp 由 234 种款式组成&#xff1a;从超压缩发际线到超扩展重度。 这个项目的主要目的是在我在旧波兰标本中发现的不同模…...

检测三位随机数中重复数字的Python实现方法

...

可控硅(晶闸管)基础知识及应用电路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

博主介绍&#xff1a;✌全网粉丝3W,csdn特邀作者、CSDN新星计划导师、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、…...

基于环境传感器的房间占用预测模型全流程解析

1. 环境因素预测房间占用率&#xff1a;从数据到模型的全流程解析在智能建筑和节能管理领域&#xff0c;准确预测房间占用状态是一个具有实际应用价值的问题。通过监测温度、湿度、光照等环境参数&#xff0c;我们可以建立预测模型来判断房间是否被占用&#xff0c;而无需使用摄…...

语法检查实时运行会卡吗_按需启用提升低配机流畅度【方法】

...

zmq源码分析之PUSH/PULL 模式的负载均衡分析

文章目录核心实现PUSH 端的负载均衡PULL 端的处理负载均衡机制详解1. 轮询分发2. 动态调整3. 无状态设计负载均衡效果示例场景代码实现分析PUSH 模式的管道管理PULL 模式的公平队列适用场景优势与限制优势限制代码优化建议总结PUSH/PULL 模式的负载均衡是指PUSH 端会将消息均匀…...

【限时公开】某头部交易所MCP网关核心模块源码(含TLS1.3卸载、动态路由热加载、熔断指标埋点)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;MCP网关架构设计与高性能通信模型概览 MCP&#xff08;Microservice Communication Protocol&#xff09;网关是面向云原生微服务生态构建的统一通信中枢&#xff0c;其核心目标是在异构协议、多语言服…...

5分钟快速上手:Jable视频下载工具完整指南

5分钟快速上手&#xff1a;Jable视频下载工具完整指南 【免费下载链接】jable-download 方便下载jable的小工具 项目地址: https://gitcode.com/gh_mirrors/ja/jable-download 还在为无法保存喜欢的Jable视频而烦恼吗&#xff1f;想要随时随地离线观看高清内容却找不到简…...

DeepSeek-V4实测:能读3本《三体》的开源大模型,短板也很真实

一次性读完3本《三体》&#xff0c;开源模型终于站起来&#xff1f;实测揭露真相——有人欢呼&#xff0c;有人沉默2026年4月24日&#xff0c;AI圈又炸了。 DeepSeek 发布 DeepSeek-V4 预览版&#xff0c;一上来就扔出王炸&#xff1a;100万字上下文窗口。 这什么概念&#xff…...

全网最大、最全的开源社区——『具身智能之心-开源知识库社区』。

“具身智能之心”近期上线了全网最大、最全的开源社区——『具身智能之心-开源知识库社区』。 里面汇总了具身智能方向的主流技术、产业应用、学术研究、具身企业&#xff0c;还有大家比较关注的行业政策和投融资信息&#xff0c;希望为具身智能行业的朋友提供一个体系化的行业…...