You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TwinCAT中获取完整图像帧数据并存储至磁盘?

TwinCAT中完整图像帧的高效获取与存储方案

以下是针对从持续运行的相机中高效获取完整帧并存储至磁盘的可行方案:

1. 直接访问FB_VisionImage的完整内存块

TwinCAT Vision的FB_VisionImage对象提供了指向图像数据起始地址的指针pImageData,无需逐行读取。结合ImageInfo属性中的参数可计算完整帧的字节长度,直接访问整个内存区域:

VAR
    fbVisionImage : FB_VisionImage;
    pFrameStart : POINTER TO BYTE;
    totalFrameBytes : UDINT;
END_VAR

// 绑定相机输出并获取图像后
pFrameStart := fbVisionImage.pImageData;
totalFrameBytes := fbVisionImage.ImageInfo.Width * fbVisionImage.ImageInfo.Height * (fbVisionImage.ImageInfo.BitsPerPixel / 8);

需确保相机处于连续采集模式,且FB_VisionImage已正确关联相机的输出缓冲区,避免数据访问冲突。

2. 配置相机的直接内存传输模式

多数兼容TwinCAT的工业相机支持DMA(直接内存访问)模式,可跳过逐行拷贝步骤:

  • 在TwinCAT Vision相机配置界面,进入Acquisition > Buffer Management选项
  • 启用Continuous Buffer Mode,并根据图像分辨率、像素格式预分配足够的PLC内存区域,让相机直接将完整帧写入该区域

3. 批量写入磁盘优化存储效率

获取完整帧内存指针后,使用TwinCAT的文件功能块进行批量写入,避免逐行IO的低效:

VAR
    fbFileWrite : FB_FileWrite;
    fileHandle : RTS_IEC_HANDLE;
    writeStatus : INT;
END_VAR

// 以二进制模式打开存储文件
fbFileWrite.Open(sFileName := 'D:\VisionFrames\current_frame.raw', nMode := FILE_MODE_WRITE_BINARY, hFile => fileHandle);

// 一次性写入完整帧数据
IF fileHandle <> 0 THEN
    writeStatus := fbFileWrite.Write(hFile := fileHandle, pData := pFrameStart, cbWrite := totalFrameBytes);
    fbFileWrite.Close(hFile := fileHandle);
END_IF

若需存储为标准图像格式(如BMP、PNG),可直接使用FB_ImageSave功能块,传入FB_VisionImage对象即可完成格式转换与存储,无需手动处理像素数据。

4. 高帧率场景的优化建议

  • 使用__NEW或TwinCAT持久化内存分配缓冲区,避免动态内存分配带来的延迟
  • 采用双缓冲区机制:一个缓冲区用于相机实时写入,另一个用于磁盘存储,并行处理采集与存储流程
  • 匹配PLC任务周期与相机帧率,确保帧数据能被及时处理,避免缓冲区溢出

内容的提问来源于stack exchange,提问作者Rainer Bärs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:07:31