基于QtPy (PySide6) 的PLC-HMI工程项目(三)PLC上行数据的准备
本次的通信对象是西门子S7-1500。一、新建数据类型打开博途新建1500项目CPU选1513-1PN新建数据类型命名为AreaVar这个命名为AreaVar的数据类型包含了数据分区I/QM/DB)、DB编号、数据起点、数据字节长度等信息可用来进行各种以字节为单位的块间操作。二、新建FC块命名为create_up_msg用来组态上行报文接口定义Input 数据类型 备注frameHeader1 Byte 帧头字节1frameHeader2 Byte 帧头字节2srcAreaVar AreaVar 区域变量该区域变量所指区域内的字节就是上行数据的有效字节frameEnd1 Byte 帧尾字节1frameEnd2 Byte 帧尾字节2DB_CRC_TABLE Array[0..255] of Word CRC查表运算的表格InOutdestArea AreaVar 目标区域变量组态好的字节存放在这里用以发送TempTemp_1 AreaVarwCRC Wordi DIntbTemp BytewTemp WordnIndex DIntscl////////////////////////////组态帧头/////////////////////////// POKE(area : #destArea.Area, dbNumber : #destArea.DBNum, byteOffset : 0, value : #frameHeader1); //帧头1 POKE(area : #destArea.Area, dbNumber : #destArea.DBNum, byteOffset : 1, value : #frameHeader2); //帧头2 ////////组态区域变量的信息本帧数据的区域和起点、长度////// POKE(area : #destArea.Area, //本帧数据的区域 dbNumber : #destArea.DBNum, byteOffset : 2, value : #srcAreaVar.Area); POKE(area : #destArea.Area, //字节占位 dbNumber : #destArea.DBNum, byteOffset : 3, value : #srcAreaVar.Area); tmp_MDint : #srcAreaVar.DBNum; //tmp_MDintMD1000 POKE_BLK(area_src : 16#83, //DB编号 dbNumber_src : 0, byteOffset_src : 1000, area_dest : #destArea.Area, dbNumber_dest : #destArea.DBNum, byteOffset_dest : 4, count : 4); tmp_MDint : #srcAreaVar.Offset; //tmp_MDintMD1000 POKE_BLK(area_src : 16#83, //地址偏移 dbNumber_src : 0, byteOffset_src : 1000, area_dest : #destArea.Area, dbNumber_dest : #destArea.DBNum, byteOffset_dest : 8, count : 4); tmp_MDint : #srcAreaVar.byteCount; //tmp_MDintMD1000 POKE_BLK(area_src : 16#83, //变量字节数 dbNumber_src : 0, byteOffset_src : 1000, area_dest : #destArea.Area, dbNumber_dest : #destArea.DBNum, byteOffset_dest : 12, count : 4); ///////////////////////////////组态帧数据内容///////////////////////// POKE_BLK(area_src : #srcAreaVar.Area, dbNumber_src : #srcAreaVar.DBNum, byteOffset_src : #srcAreaVar.Offset, area_dest : #destArea.Area, dbNumber_dest : #destArea.DBNum, byteOffset_dest : 16, count : #srcAreaVar.byteCount); ///////////////////////////////组态帧尾//////////////////////////// POKE(area : #destArea.Area, dbNumber : #destArea.DBNum, byteOffset : 16 #srcAreaVar.byteCount, value : #frameEnd1); //帧尾1 POKE(area : #destArea.Area, dbNumber : #destArea.DBNum, byteOffset : 17 #srcAreaVar.byteCount, value : #frameEnd2); //帧尾2 /////////////////////////////////CRC16校验和////////////////////////////// #destArea.byteCount : 18 #srcAreaVar.byteCount; #wCRC : 16#FFFF; FOR #i : 0 TO #destArea.byteCount-1 DO #bTemp : PEEK(area : #destArea.Area, byteOffset : #i, dbNumber : #destArea.DBNum); #wTemp : #wCRC XOR BYTE_TO_WORD(IN : #bTemp); #wTemp : #wTemp AND 16#00FF; #nIndex : WORD_TO_INT(IN : #wTemp); #wCRC : SHR(IN : #wCRC, N : 8) XOR #DB_CRC_TABLE[#nIndex]; END_FOR; //写入CRC字 POKE(area : #destArea.Area, dbNumber : #destArea.DBNum, byteOffset : 18 #srcAreaVar.byteCount, value : #wCRC); #destArea.byteCount : 20 #destArea.byteCount;完整的上行报文帧结构帧头1 帧头2 本次数据的区域参数分区、DB号、字节偏移、字节长度 数据字节块 帧尾1 帧尾2 CRC字三、CRC的查表表格新建全局DB块命名为DB_CRC_TABLE数据类型为Array[0..255] of WordArray的内容为这个是CRC16的查表运算映射表[ 16#0000,16#C0C1,16#C181,16#0140,16#C301,16#03C0,16#0280,16#C241, 16#C601,16#06C0,16#0780,16#C741,16#0500,16#C5C1,16#C481,16#0440, 16#CC01,16#0CC0,16#0D80,16#CD41,16#0F00,16#CFC1,16#CE81,16#0E40, 16#0A00,16#CAC1,16#CB81,16#0B40,16#C901,16#09C0,16#0880,16#C841, 16#D801,16#18C0,16#1980,16#D941,16#1B00,16#DBC1,16#DA81,16#1A40, 16#1E00,16#DEC1,16#DF81,16#1F40,16#DD01,16#1DC0,16#1C80,16#DC41, 16#1400,16#D4C1,16#D581,16#1540,16#D701,16#17C0,16#1680,16#D641, 16#D201,16#12C0,16#1380,16#D341,16#1100,16#D1C1,16#D081,16#1040, 16#F001,16#30C0,16#3180,16#F141,16#3300,16#F3C1,16#F281,16#3240, 16#3600,16#F6C1,16#F781,16#3740,16#F501,16#35C0,16#3480,16#F441, 16#3C00,16#FCC1,16#FD81,16#3D40,16#FF01,16#3FC0,16#3E80,16#FE41, 16#FA01,16#3AC0,16#3B80,16#FB41,16#3900,16#F9C1,16#F881,16#3840, 16#2800,16#E8C1,16#E981,16#2940,16#EB01,16#2BC0,16#2A80,16#EA41, 16#EE01,16#2EC0,16#2F80,16#EF41,16#2D00,16#EDC1,16#EC81,16#2C40, 16#E401,16#24C0,16#2580,16#E541,16#2700,16#E7C1,16#E681,16#2640, 16#2200,16#E2C1,16#E381,16#2340,16#E101,16#21C0,16#2080,16#E041, 16#A001,16#60C0,16#6180,16#A141,16#6300,16#A3C1,16#A281,16#6240, 16#6600,16#A6C1,16#A781,16#6740,16#A501,16#65C0,16#6480,16#A441, 16#6C00,16#ACC1,16#AD81,16#6D40,16#AF01,16#6FC0,16#6E80,16#AE41, 16#AA01,16#6AC0,16#6B80,16#AB41,16#6900,16#A9C1,16#A881,16#6840, 16#7800,16#B8C1,16#B981,16#7940,16#BB01,16#7BC0,16#7A80,16#BA41, 16#BE01,16#7EC0,16#7F80,16#BF41,16#7D00,16#BDC1,16#BC81,16#7C40, 16#B401,16#74C0,16#7580,16#B541,16#7700,16#B7C1,16#B681,16#7640, 16#7200,16#B2C1,16#B381,16#7340,16#B101,16#71C0,16#7080,16#B041, 16#5000,16#90C1,16#9181,16#5140,16#9301,16#53C0,16#5280,16#9241, 16#9601,16#56C0,16#5780,16#9741,16#5500,16#95C1,16#9481,16#5440, 16#9C01,16#5CC0,16#5D80,16#9D41,16#5F00,16#9FC1,16#9E81,16#5E40, 16#5A00,16#9AC1,16#9B81,16#5B40,16#9901,16#59C0,16#5880,16#9841, 16#8801,16#48C0,16#4980,16#8941,16#4B00,16#8BC1,16#8A81,16#4A40, 16#4E00,16#8EC1,16#8F81,16#4F40,16#8D01,16#4DC0,16#4C80,16#8C41, 16#4400,16#84C1,16#8581,16#4540,16#8701,16#47C0,16#4680,16#8641, 16#8201,16#42C0,16#4380,16#8341,16#4100,16#81C1,16#8081,16#4040 ]四、简单验证一下CRC的准确性创建源数据块src_DBDB1DB内为混合类型的数据内容如下创建一个数据类型为Array[0..100] of Byte的DB块DB5命名为bytes_DB用来存放上行报文PLC程序的OB11、定义两个tmp区域变量TMP_AreaVar1、TMP_AreaVar2先组态5个字节数据测试一下编程OB1:程序段1scl#TMP_AreaVar1.Area : 16#84; //DB区 #TMP_AreaVar1.DBNum : 1; //DB号 #TMP_AreaVar1.Offset : 0; //字节偏移 #TMP_AreaVar1.byteCount : 5; //长度 #TMP_AreaVar2.Area : 16#84; #TMP_AreaVar2.DBNum : 5; #TMP_AreaVar2.Offset : 0; #TMP_AreaVar2.byteCount : 5;程序段2下载并运行程序监控DB5的数据组态好的上行报文数据解析pythonimport crcmod crc16 crcmod.predefined.Crc(modbus) # 测试数据和 PLC 一样 data bytes([0x41,0x41,0x84,0x84,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x11,0x22,0x33,0x44,0x55,0x42,0x42]) # 计算 CRC crc16.update(data) result crc16.crcValue # 16 位结果 print(fPython CRC: {result:04X})运行截图PLC内和python的CRC运算结果相符。

相关新闻

全新夸父资源社复活,让大家都能找到想要的资源

全新夸父资源社复活,让大家都能找到想要的资源

夸克网盘已成为当前流行的网盘云存储服务之一,其功能全面,使用体验出色,支持在线解压和阅读,以及快速磁力离线下载,尤其适合IT从业者、学习者存储和检索技术资料、办公素材等内容。接下来,我将介绍几款适配…

2026/9/21 3:28:32 阅读更多 →
AI Agent 面试题 569:多Agent系统中的协作效率评估指标

AI Agent 面试题 569:多Agent系统中的协作效率评估指标

🔥 AI Agent 面试题 569:多Agent系统中的协作效率评估指标摘要:本文深入解析了「多Agent系统中的协作效率评估指标」这一 AI Agent 领域的核心面试题。文章从 群体智能 的基本概念出发,系统性地剖析了 协作效率、评估指标 等关键技…

2026/9/21 3:28:32 阅读更多 →
AI Agent 面试题 567:多Agent系统中的任务依赖图管理和调度

AI Agent 面试题 567:多Agent系统中的任务依赖图管理和调度

🔥 AI Agent 面试题 567:多Agent系统中的任务依赖图管理和调度摘要:本文深入解析了「多Agent系统中的任务依赖图管理和调度」这一 AI Agent 领域的核心面试题。文章从 任务分配与调度 的基本概念出发,系统性地剖析了 依赖图、调度…

2026/9/19 5:18:44 阅读更多 →

最新新闻

react-admin 实时订阅实战:深入掌握 `useSubscribeToRecord` 单记录事件订阅 Hook

react-admin 实时订阅实战:深入掌握 `useSubscribeToRecord` 单记录事件订阅 Hook

react-admin 实时订阅实战:深入掌握 useSubscribeToRecord 单记录事件订阅 Hook 【免费下载链接】react-admin A frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design 项目地址: https:/…

2026/9/21 3:27:56 阅读更多 →
在 Vue 3 应用中接入 json-render DevTools:@json-render/devtools-vue 完整接入与源码解析

在 Vue 3 应用中接入 json-render DevTools:@json-render/devtools-vue 完整接入与源码解析

在 Vue 3 应用中接入 json-render DevTools:json-render/devtools-vue 完整接入与源码解析 【免费下载链接】json-render The Generative UI framework 项目地址: https://gitcode.com/GitHub_Trending/js/json-render json-render/devtools-vue 是 json-ren…

2026/9/21 3:27:56 阅读更多 →
Etherpad 自更新子系统 Tier 3 深度解析:带宽限窗口的自动升级(Auto-Update with Grace Window)

Etherpad 自更新子系统 Tier 3 深度解析:带宽限窗口的自动升级(Auto-Update with Grace Window)

后端协同办公WebSocket前端富文本 【免费下载链接】etherpad Etherpad: A modern really-real-time collaborative document editor. 项目地址: https://gitcode.com/gh_mirrors/et/etherpad 点击查看 免费下载 Etherpad 内置的"自更新子系统"&#xff0…

2026/9/21 3:27:55 阅读更多 →
lark-cli apps +plugin-list 命令完全指南:妙搭应用插件声明与安装状态核验

lark-cli apps +plugin-list 命令完全指南:妙搭应用插件声明与安装状态核验

CLIAI 技能 【免费下载链接】cli The official Lark/飞书 CLI tool, maintained by the larksuite team — built for humans and AI Agents. Covers core business domains including Messenger, Docs, Base, Sheets, Calendar, Mail, Tasks, Meetings, and more, with 200 co…

2026/9/21 3:27:55 阅读更多 →
Gradle 属性命名规范 ADR-0010:org.gradle 前缀体系下的 public/internal 与特性稳定性契约

Gradle 属性命名规范 ADR-0010:org.gradle 前缀体系下的 public/internal 与特性稳定性契约

构建工具开发工具 【免费下载链接】gradle Adaptable, fast automation for all 项目地址: https://gitcode.com/gh_mirrors/gr/gradle 点击查看 免费下载 本文是 Gradle 仓库 architecture/standards/0010-gradle-properties-naming.md 这份架构决策记录&#xff…

2026/9/21 3:27:55 阅读更多 →
V8 字符串表示体系详解:从 SeqString 到 ConsString 的内部表示、internalization 与 String Table

V8 字符串表示体系详解:从 SeqString 到 ConsString 的内部表示、internalization 与 String Table

语言运行时编译器JIT编译解释器内存管理 【免费下载链接】v8 The official mirror of the V8 Git repository 项目地址: https://gitcode.com/gh_mirrors/v81/v8 点击查看 免费下载 导读 JavaScript 中的字符串是最基础的数据类型,V8 并没有使用单一的…

2026/9/21 3:26:55 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →