news 2026/10/6 2:49:17

通信数据与视觉结果的映射,核心是**在 PLC 内存模型和视觉结果之间建立一张精确的“地址表”**,让双方对每一个字节的含义达成一致

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
通信数据与视觉结果的映射,核心是**在 PLC 内存模型和视觉结果之间建立一张精确的“地址表”**,让双方对每一个字节的含义达成一致

通信数据与视觉结果的映射,核心是在 PLC 内存模型和视觉结果之间建立一张精确的“地址表”,让双方对每一个字节的含义达成一致。映射做错了,PLC 收到的是错位的数字,产线会做出错误动作。

映射的三个层次

第一层:数据类型映射。视觉结果在 C# 中是bool、short、float、string,在 PLC 中是BOOL、INT、REAL、STRING。映射时必须逐类型对齐——bool在 S7 中占 1 位,short占 2 字节,float占 4 字节。用S7.NetPlus的WriteStruct可以自动处理类型对齐,但前提是 C# 结构体的字段顺序和 PLC 的 DB 块布局完全一致。

第二层:字节序映射。PLC 用大端序(高字节在前),C# 用小端序(低字节在前)。一个short值 253,在 C# 内存中是FD 00,在 PLC 中是00 FD。S7.NetPlus 内部已处理字节序,但手动解析原始字节时必须转换。

第三层:语义映射。PLC 需要的是“OK/NG 信号 + 坐标 + 角度”,视觉系统输出的是“匹配分数 + 轮廓 + 拟合结果”。语义映射决定哪些视觉结果需要写、写到哪、什么格式。例如角度通常乘以 100 转成short,避免浮点传输的不确定性。

案例一:视觉引导定位的坐标映射

一个典型的视觉引导项目,PLC 需要视觉系统输出零件的 X、Y 坐标和旋转角度,用于机械手抓取。

DB 块布局:

地址类型含义
DB100.DBX0.0BOOLResultsValid(视觉→PLC)
DB100.DBX0.1BOOLInspectionAck(PLC→视觉)
DB100.DBX0.2BOOLIsOk
DB100.DBW2INTX 坐标(×100)
DB100.DBW4INTY 坐标(×100)
DB100.DBW6INT角度(×100)

C# 侧写入:

// 坐标放大 100 倍转 short,避免浮点shortx=(short)(result.X*100);shorty=(short)(result.Y*100);shortangle=(short)(result.Angle*100);plc.Write("DB100.2",x);plc.Write("DB100.4",y);plc.Write("DB100.6",angle);plc.Write("DB100.0",true);// 最后置握手位

关键约束:先写数据,最后写握手位。PLC 看到ResultsValid=1时,数据已经全部就位。

案例二:多结果批量映射

当视觉系统需要输出多个检测项(如多个孔的坐标、多个尺寸值)时,逐条写入效率极低。正确做法是把结果打包成连续内存块,一次性写入。

C# 结构体映射:

[StructLayout(LayoutKind.Sequential,Pack=1)]publicstructVisionResultStruct{publicboolIsOk;// DB100.DBX0.0publicshortHole1X;// DB100.DBW2publicshortHole1Y;// DB100.DBW4publicshortHole2X;// DB100.DBW6publicshortHole2Y;// DB100.DBW8publicshortDiameter;// DB100.DBW10}

用S7.NetPlus的WriteStruct一次性写入整个结构体,PLC 侧只需解析这个连续内存块,逻辑更清晰,网络往返从 6 次降为 1 次。

案例三:握手信号的状态机映射

握手信号是映射中最容易出错的部分。一个经典的设计采用四步状态机:

  1. 视觉检测完成 → 写入结果数据 → 置ResultsValid = 1
  2. PLC 扫描到ResultsValid = 1→ 拷贝数据到自己的缓存 → 置InspectionAck = 1
  3. 视觉检测到Ack = 1→ 清零ResultsValid
  4. PLC 检测到ResultsValid = 0→ 清零Ack,准备下一轮

这个状态机的价值:无论哪一方重启或卡顿,状态都不会乱。如果视觉系统在步骤 2 之后崩溃,PLC 的Ack保持为 1,视觉重启后检测到Ack=1但ResultsValid=0,就知道上一轮已经完成,可以安全开始新检测。

映射的工程要点

地址表必须文档化。每一个字节的含义、数据类型、缩放因子、单位,都要在文档中明确。PLC 工程师和视觉工程师各持一份,作为对接的依据。

缩放因子要统一。角度用 ×100 转short,坐标用 ×1000 转int,取决于精度要求。关键是双方约定一致,不能一边用 ×100 一边用 ×1000。

握手位永远最后写。数据全部就位后,再置握手位。PLC 看到握手位时,数据一定完整。

调试时先读后写。上线前先用 PLC 编程软件监控 DB 块,确认视觉系统写入的每个字节都在正确的位置。这一步能避免 90% 的映射错误。

一句话总结

通信数据与视觉结果的映射,本质是建立一张双方都认可的“地址-语义”对照表。数据类型要对齐,字节序要处理,语义要明确,握手要可靠。先写数据、最后写握手位,是映射的铁律。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 2:49:16

47.LangfuseOpenTelemetry与Prometheus分别监控什么

Langfuse、OpenTelemetry 与 Prometheus:分别监控什么? 码海寻道 大模型、智能体与 RAG 工程组件系列第 47 篇 三者都能出现在 AI 应用的监控架构里,但职责不同:Langfuse 更关注 LLM 调用和评估,OpenTelemetry 负责统…

作者头像 李华
网站建设 2026/10/6 2:48:11

怎么让 AI 引擎引用你的内容?抓取、理解、引用三阶段讲清楚

AI 引擎引用你的内容,本质上要过三道关:爬虫抓得到、模型读得懂、答案愿意引;三关缺一,内容就只是躺在服务器上的文本。本文把这三阶段拆开讲清楚,每一步给出可落地的配置位置和自查方法。 第一阶段:抓取—…

作者头像 李华
网站建设 2026/10/6 2:48:10

学Simulink——基于滑模变结构控制(SMC)的双向DC-AC逆变器鲁棒控制仿真

目录 手把手教你学Simulink——基于滑模变结构控制(SMC)的双向DC-AC逆变器鲁棒控制仿真 一、 引言:当“参数漂移”遇上“模式切换”——滑模控制如何化身双向变流器的“金刚不坏之身”? 二、 问题本质:双向DC-AC的“核心挑战”与“SMC协同逻辑” 1. 核心挑战 2. 协同逻…

作者头像 李华
网站建设 2026/10/6 2:46:42

SpringMvc——注意事项

在实际开发中 spring 会扫描包 springmvc也会去扫描controller的包,所以在写扫描路径的时候,需要将springmvc扫描路径写成 com.xxx.controller 然后spring也去写具体的路径,或者将springmvc扫描的controller排除如果是按照上面的方法&#x…

作者头像 李华