最近几天整理自己手头还残留的一些测试文档发现有个关于 Ouster 激光雷达 v3.2.0 固件的区域监控功能Zone Monitoring配合 PLC 测试的截图和PLC程序还在。幸好当初是在自己的Windows 7老电脑上安装 PLC 软件做了这个测试。这些测试数据对我而言用处不大。但想来写成博文发布到网上对通过 PLC 接收和处理 Ouster 区域监控数据的小伙伴们应该会有一定的帮助。否则的话不久之后的某月某日这些测试记录可能会因为占用我电脑或U盘的存储空间而不得不彻底清除掉仿佛曾经完全没有存在过一般。从事工控行业的小伙伴对 PLC 想必是得心应手、运用自如、游刃有余。一提到区域监控可能脑海中已经浮现出了清晰的轮廓不就是针对实际应用场景画几个区域然后每个区域对应一路开关量信号发送 PLC 处理信号的电平高低对应区域是否被触发。仅此而已这有何难但 Ouster 激光雷达的区域监控功能配合 PLC 使用实际情况可能比我们预想的要复杂一些。首先一个因素就是硬件条件的限制。使用过 Ouster 激光雷达的小伙伴应该很熟悉Ouster 激光雷达的线缆接头只有 12 芯。除去电源正负极的两芯和千兆以太网的 8 芯就仅剩了两芯。且不说这两芯中还有个仅作时钟同步脉冲 PPS 输入的 SYNC_PULSE_IN最后剩下的一个可配置的多功能输入输出线芯 Multipurpose-IO用来对应一个监控区域的状态在实际应用中是完全不够看的。此外就是以往单线激光雷达通过开关量输出区域状态的方式提供的信息量是非常有限的。PLC 只能通过开关信号的电平高低判断划定的区域是否被触发。而对于多线激光雷达而言对闯入监控区域的人或物体检测到的点云数据也是更加丰富的。Ouster 激光雷达的区域监控功能除了可以给出监控区域的状态信息还可以给出进入到 3D 监控区域中的目标物的总点数、点的最大距离、最小距离、平均距离等。这些信息不光在实际应用中有现实意义而且在划定监控区域以及设置区域触发条件时也能起到参考作用。鉴于这些因素Ouster 研发部门考虑的因素可能会更多但肯定无法忽视上边提到的两个因素Ouster 只能在激光雷达本身的网络接口上做文章。最终给出的方案就是再新增一个 UDP 端口号通过 UDP 数据报文的方式输出监控区域的状态信息。Ouster 激光雷达区域监控功能介绍● Ouster 激光雷达 v3.2.0 固件提供的区域监控功能最多可以上载 128 个 3D 区域仅设置一个区域也可以● 每次投入运行时最多可以设置 16 个 Active 的 3D 区域进行监控仅设置一个 Active 区域也可以● 已上载但未投入使用的 3D 区域处于 Staged 的状态。可以根据实际应用随时通过指令将 Staged 的区域切换为 Active 的监控区域● 区域切换时可以只切换一个也可以一次切换多个。但切换为 Active 的区域数目一次最多不能超过 16 个● 区域监控数据的 UDP 报文长度是固定的v3.2.0 固件发布时的 Zone Monitoring UDP 数据包长度是 688 Byte● 每个 UDP 报文中包含 16 个区域的字段。每个字段中包含监控区域的触发状态处于监控区域的目标物的总点数、点的最大距离、最小距离、平均距离等信息● 如果设置的 Active 区域数目不足 16 个那么区域监控 UDP 数据包中仅设置了 Active 区域的字段中有数据剩余字段由 0 填充● Ouster 激光雷达区域监控功能的更新频率和 lidar_mode 设置有关。比如一个 OS 激光雷达工作在 1024x10 的模式即1秒钟旋转10圈得到10个完整的点云 Frame那么区域监控功能的数据输出频率最高也是 10 Hz● 每个监控区域的更新频率还可以单独设置可以各不相同。对 Ouster 激光雷达 v3.2.0 固件的区域监控功能有了以上的初步了解后接下来我们看一下如何使用这个区域监控功能。如上所述Ouster 激光雷达的区域监控数据是通过 UDP 通讯协议输出的。对于从事点云数据处理和算法的攻城狮而言若个毫秒之间超过 1M Byte 长度的点云数据也能轻松处理完毕。在工控机或者高性能边缘计算设备中接收和处理这 688 Byte 长度的区域监控 UDP 数据简直是易如反掌不费吹灰之力。但在实际应用中一个需要 3D 区域监控功能的工业现场控制柜中可能只有 PLC 作为所有传感器和执行器的数据采集和处理的控制器也可能之前现场已经部署了单线开关量输出的区域监控激光雷达且连接到了 PLC。现在只是想丝滑地切换到 3D 区域监控的激光雷达不可能为了增加一个 3D 区域监控功能就要为激光雷达单独增加一个上位机处理器。直接将支持 3D 区域监控功能的激光雷达数据接入到 PLC 肯定是用户无可辩驳的首选方案。我自己呢在2025年初时就有多次通过Python程序和C语言程序接收和处理 Ouster 激光雷达 Zone Monitoring 区域监控数据的测试经历。想到多年前自己也曾频繁调试各种 PLC 和单线激光雷达以及多种工业传感器的数据交互到2025年底时也就狠下心来购置了一台PLC用于 Ouster 多线激光雷达3D区域监控功能的测试。做工控的小伙伴们目前手上在用的基本上都是各个厂家最新的主流的 PLC 了吧再不济用的也是次新品或是两三年前的 PLC 型号吧我是自己花钱搞测试验证功能肯定无法像工控企业或自动化系统集成商那样采购最新版的性能最强大的 PLC 了只是淘一个老掉牙的西门子小型 PLCS7-200 PLC ST20 CPU。这款 PLC 是西门子在 2012年发布的只有12个 DI 输入点和8个 DO 输出点。虽然不足以输出Ouster 激光雷达 Zone Monitoring 功能支持的最多16个 Active 区域的监控状态但在一般应用中能同时输出8个区域的监控状态也已经戳戳有余了。此外如果我能用这个低配的老 PLC 正常解析和处理 Ouster 激光雷达通过 UDP 包发送的 Zone Monitoring 区域监控数据那么使用不同厂家最新PLC的小伙伴们如果要处理Ouster激光雷达的Zone Monitoring 区域监控数据就更不再话下了。PLC 硬件准备好了那么接下来就要准备编程软件了。我在自己的一台 Win7 老电脑中安装了 STEP 7-Micro/WIN SMART Version V2.8 软件用来编写梯形图程序。接下来我详细列举一下我通过这款西门子 PLC 接收和处理 Zone Monitoring 区域监控数据的思路以及梯形图程序。其他品牌的 PLC只要支持 UDP 通讯即使编程语言或功能块千差万别但程序设计思路都是一致的。0. IP 地址设置PLC 和激光雷达进行 UDP 网络数据通讯将二者设置为同一个子网内的IP地址是最基本的前提。我在测试中需要频繁使用激光雷达只是因为测试偶尔用到 PLC。因此我将 PLC 的 IP 地址修改到了和激光雷达同网段。在实际应用中现场电控柜中的PLC可是连接着很多个以太网接口的仪器、仪表或其他控制器不可能为了加入一台有区域监控功能的激光雷达就要修改PLC的IP地址。通常需要将激光雷达的IP地址修改到和PLC同网段。修改Ouster激光雷达IP地址的方法可以参考之前分享的博文Ouster激光雷达IP地址获取与设置_ouster雷达初始ip-CSDN博客1. 建立PLC和Ouster激光雷达的UDP连接高级语言编程中如CCC#PythonVisual Basic可以很容易的建立一个 UDP Socket来接收UDP数据。我测试所用的这款西门子PLC虽然已经发布有年头了但其提供的UDP连接功能块还是为我建立PLC和Ouster激光雷达的UDP连接提供了极大的便利。可以通过选择“Libraries”下方“Open User Communication”中的“UDP_CONNECT”来添加这个功能块。因为这个功能块只需要在 PLC 进入 RUNNING 状态后执行一次因此这个功能块的 EN 端和 Req端我都用了PLC提供的 First_Scan_On 脉冲。ConnID 的设置必须于后续使用该UDP通讯的功能块的 ConnID 设置保持一致。LocalPort 的设置必须与 Ouster 激光 Web 浏览器连接后Configuration 界面的 Zone Monitoring UDP 端口号的设置保持一致。2. 接收 Zone Monitoring 区域监控 UDP 数据同样的我通过选择 “Libraries” 下方 “Open User Communication” 中的 “UDP_RECV”添加了数据接收这个功能块。一旦 PLC 和 Ouster 激光雷达进入工作运行状态后PLC 就需要持续的接收激光雷达发来的 Zone Monitoring UDP 数据了。因此这个 UDP 数据接收的功能块需要一直工作功能块的使能端En就需要使用 Always_On 的高电平了。ConnID 的设置需要与上方 UDP_CONNECT 功能块 ConnID 的设置保持一致。MaxLen 需要输入 Zone Monitoring UDP 数据包的最大长度这里我输入的是 680 Bytes。有些小伙伴可能要问了我使用的 PLC 因功能限制最大能接收的 UDP 数据包长度不支持那么大的值还能继续和 Ouster 激光雷达的区域监控功能配合使用吗答案当然是肯定的但也要分具体情况。如果你查看 Ouster 激光雷达 Zone Monitoring 的 UDP 数据包的结构你会看到它由三部分组成分别是报头、数据区、报尾。报尾就有近百个字节收不到报尾的所有字节并不会影响 UDP 数据包中包含的16个监控区域的状态数据。如果只需要监控三个区域的状态那么接收区域的长度满足150 Byte 的长度就已经足够了。接收数据的地址指针 DataPtr 指向你为接收 UDP 数据指定的存储区的首地址。这里我指向为接收Zone Monitoring 区域监控UDP数据定义的缓存器起始位 VB1000。下图是我的测试中PLC接收到的部分UDP数据的截屏。3. 解析 UDP 数据并输出监控区域状态解析 UDP 数据就需要知道 Ouster 激光雷达 Zone Monitoring 区域监控 UDP 数据包的结构了。这个数据结构可以从 Ouster 官网上 v3.2.0 固件的 Firmware User Manual 中看到。了解了 Zone Monitoring UDP 包的数据结构后我们就能知道哪个 Byte 中包含哪个区域的触发状态了。区域的触发状态其实只是用这个 Byte 中一个 Bit 位表示。我们可以单独取这个区域触发状态的Bit 位来控制 PLC 的某个 DO 数字量输出也可以用整个 Byte 的值来控制 PLC 的某个 DO 数字量输出。我在测试中采用整个 Byte 值来判断该 Byte 对应的区域是否被触发。如上图所示当我用 VB1000 起始的存储区接收 Zone Monitoring UDP 数据时第一个监控区域 Zone0 对应的触发状态 Byte VB1075 为 132 (1000 0100) 时数字量输出 DO0 被置为高电平第二个监控区域 Zone1 对应的触发状态 Byte VB1111为 132 (1000 0100) 时数字量输出 DO1 被置为高电平第三个监控区域 Zone2 对应的触发状态 Byte VB1147 为 132 (1000 0100) 时数字量输出 DO2 被置为高电平。如果某个区域没有被触发那么这个区域对应的触发状态 Byte 值则为 4 (0000 0100)。我的测试中每次只监控三个区域因此只需判断3个区域对应的状态 Byte 值即可。Ouster 激光雷达的 Zone Monitoring UDP 包中包含16个监控区域的详细状态数据。如果你的应用需要同时监控16个区域你所用的 PLC 也有16个数字量输出 DO 点那么你绘制了16个3D监控区域并上传到激光雷达后就可以在 PLC 程序中通过判断每个区域对应的触发状态 Byte 值获知该区域是否有被触发了也就是有人或物体进入这个区域且这个区域中检测到的总点数超过了设置的触发条件的点数值。到此为止通过 PLC 接收和解析 Ouster 激光雷达 Zone Monitoring 区域监控 UDP 数据的方法就已经介绍完毕了。不同厂家的 PLC数据接收和处理程序会略有差异但编程的思路总体上是毫无二致的。这些数据接收和处理的操作对于从事 PLC 程序开发和调试的自动化工程师而言也是易如反掌不费吹灰之力。深谙现场应用和生产工艺的小伙伴可能又发现问题了最多16个可同时监控的3D区域是够多但是我的实际应用防护需求可能是动态的。我不需要激光雷达一直一成不变的监控固定的防护区域我需要它根据实际生产工艺的需求能在不同的时间切换到不同的防护区域。这就涉及到基于具体应用的区域切换功能了。很多单线激光雷达的区域监控都是有这个功能的。Ouster 激光雷达的 Zone Monitoring 3D 区域监控也是支持区域切换功能的。但 Ouster REV-07硬件版本能支持区域切换功能的激光雷达自从 2024 年发布 v3.1.0 的固件时已经弃用 TCP API 了转而全面拥抱 HTTP API。也就是说REV-07 硬件版本的 OS 激光雷达使用 v3.2.0 固件提供的区域监控功能要切换区域或区域组只能使用 HTTP API。那如果我所使用的 PLC不支持 HTTP 协议但实际应用中又要用到区域切换功能该咋办莫慌HTTP 协议也不是凭空产生的。在 OSI 开放系统互连的七层模型中HTTP 是应用层的协议在模型下方的传输层上它仍然是靠 TCP 协议在传输数据。我们将 Ouster 激光雷达支持的HTTP/1.1 的区域切换 API通过 TCP 协议发送到端口号 80不就解决问题了吗事实也是如此我所用的西门子 S7-200 SMART PLC ST20 CPU 也不支持 HTTP 协议我就是通过 PLC 提供的 TCP 数据通讯的功能块发送区域切换的 API 来实现区域组切换的功能的。首先我需要添加 “TCP_CONNECT” 的功能块建立 PLC 与激光雷达的连接。通过选择 “Libraries” 下方 “Open User Communication” 中的 “TCP_CONNECT” 即可添加这个功能块。功能块的引脚中ConnID 可以设置任意的有效值但必须要与后续使用该 TCP 连接的功能块的ConnID 设置保持一致。IPaddr1 ~ IPaddr4 分别依次输入激光雷达 IPv4 地址的每个字段。RemPort 输入80。LocPort 可随意输入了一个 TCP 端口号允许的有效值我在这里输入了 3000。建立连接后就可以通过“TCP_SEND”功能块发送区域切换的指令了。“TCP_SEND” 功能块可以通过选择 “Libraries” 下方 “Open User Communication” 中的“TCP_SEND” 添加。我自己在测试中绘制了三个区域组每个区域组中包含三个区域。通过按钮在不同的区域组之间做切换。TCP_SEND 功能块的 Req 请求端用三个区域组切换按钮触点做了互锁的操作避免误操作的情况下多个区域组的区域同时有效。ConnID 的值需要与上方 TCP_CONNECT 功能块 ConnID 的设置保持一致。DataLen 需要输入区域切换指令的字节长度。发送数据的地址指针 DataPtr 指向你存放区域切换指令的存储区的首地址。这里我将区域切换指令存储到了 VB200 开头的字节存储区中。考虑到我们使用 TCP协议发送HTTP API因此发送的指令的格式是非常关键的。以我测试中的区域组切换为例我预先绘制了7个3D监控区域并上传到了激光雷达。区域编号Zone0Zone1和Zone2作为一个区域组用于小车直行时的区域监控区域编号Zone0Zone3和Zone4作为一个区域组用于小车左转时的区域监控区域编号Zone0Zone5和Zone6作为一个区域组用于小车右转时的区域监控。通过 TCP 协议发送切换到左转监控区域组的指令时也就是将当前的 Active 区域设置为 Zone0Zone3 和 Zone4 时需要严格按照下方的格式输入指令POST /api/v1/zone_monitor/live_ids HTTP/1.1 Host:192.168.1.200 Connection:keep-alive Content-Type:application/json Content-Length:9 [0,3,4]其中Host 后边是 OS 激光雷达的 IPv4 地址Content-Length 不是整个指令的长度而是发送的切换区域的总长度切换区域间隔一行后添加到指令的末尾在方括号中用逗号分隔。当然如果有小伙伴想在测试中用 PLC 接收和处理区域监控的 UDP 数据但是偶尔需要切换一下区域且区域切换并不会用在实际生产中那么可以直接通过发送 HTTP API 进行区域切换。通过 HTTP API 与 Ouster 激光雷达交互的方法可以参考这个文档中的介绍Ouster 激光雷达 HTTP API 交互操作_ouster lidar 地址设置-CSDN博客我当时用西门子 S7-200 PLC 测试 Ouster 激光雷达 Zone Monitoring 区域监控功能时有录制一个视频并上传到了网上。如果有兴趣也可以通过点击下方的链接查看Ouster LiDAR v3.2.0 固件区域监控功能测试_PLC 控制器交互测试_哔哩哔哩_bilibili