增加拍照扭曲,光源控制

联合利华-拍照
LAPTOP-S9HJSOEB\昊天 2 months ago
parent 09524cb0a9
commit 62b2b2b7d4

@ -253,3 +253,291 @@
2026-04-28 15:22:45.984 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-28/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2810-58-39-BATCH-ABC123-down.png
2026-04-28 15:22:45.989 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[17] 宽[3072] 高[2048]
2026-04-28 15:22:46.015 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-28/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2810-58-39-BATCH-ABC123-down.png
2026-04-29 14:13:52.766 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:13:52.951 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:13:52.953 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:13:52.954 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:13:53.530 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:13:53.530 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:13:53.982 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:13:53.983 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:13:53.983 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:13:55.497 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2810-58-39-BATCH-ABC123-up.png
2026-04-29 14:13:55.512 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[1067] 宽[3072] 高[2048]
2026-04-29 14:13:55.583 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2810-58-39-BATCH-ABC123-up.png
2026-04-29 14:13:55.870 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2810-58-39-BATCH-ABC123-down.png
2026-04-29 14:13:55.879 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[1073] 宽[3072] 高[2048]
2026-04-29 14:13:55.925 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2810-58-39-BATCH-ABC123-down.png
2026-04-29 14:15:27.105 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:15:27.111 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[2428] 宽[3072] 高[2048]
2026-04-29 14:15:27.147 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:15:27.246 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:15:27.251 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[2430] 宽[3072] 高[2048]
2026-04-29 14:15:27.285 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:17:52.453 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:17:52.500 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:17:52.643 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:18:00.263 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:18:00.297 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:18:00.298 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:18:00.299 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:18:00.839 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:18:00.839 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:18:01.103 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:18:01.104 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:18:01.104 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:18:01.985 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:18:01.992 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[12] 宽[3072] 高[2048]
2026-04-29 14:18:02.031 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:18:02.031 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:18:02.046 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[13] 宽[3072] 高[2048]
2026-04-29 14:18:02.075 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:20:38.089 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:20:38.116 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:20:38.275 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:20:44.603 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:20:44.638 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:20:44.639 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:20:44.639 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:20:45.183 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:20:45.183 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:20:45.483 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:20:45.483 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:20:45.483 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:20:46.289 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:20:46.297 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[11] 宽[3072] 高[2048]
2026-04-29 14:20:46.338 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:20:47.099 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:20:47.105 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[23] 宽[3072] 高[2048]
2026-04-29 14:20:47.129 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:22:04.925 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:22:04.965 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:22:05.154 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:22:12.367 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:22:12.404 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:22:12.405 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:22:12.405 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:22:12.957 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:22:12.957 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:22:13.222 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:22:13.223 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:22:13.223 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:22:14.093 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:22:14.101 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[12] 宽[3072] 高[2048]
2026-04-29 14:22:14.143 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:22:14.862 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:22:14.869 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[23] 宽[3072] 高[2048]
2026-04-29 14:22:14.899 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:23:09.447 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:23:09.485 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:23:09.663 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:23:15.918 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:23:15.949 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:23:15.950 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:23:15.950 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:23:16.498 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:23:16.498 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:23:16.774 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:23:16.774 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:23:16.774 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:23:17.589 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:23:17.598 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[11] 宽[3072] 高[2048]
2026-04-29 14:23:17.646 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:23:17.647 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:23:17.652 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[12] 宽[3072] 高[2048]
2026-04-29 14:23:17.684 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:25:19.146 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:25:19.181 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:25:19.357 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:25:27.924 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:25:27.960 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:25:27.961 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:25:27.961 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:25:28.503 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:25:28.504 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:25:28.755 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:25:28.755 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:25:28.755 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:25:29.639 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:25:29.645 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[12] 宽[3072] 高[2048]
2026-04-29 14:25:29.685 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:28:43.219 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:28:43.228 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[2888] 宽[3072] 高[2048]
2026-04-29 14:28:43.257 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:35:58.379 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:35:58.426 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:35:58.599 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:36:11.456 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:36:11.502 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:36:11.504 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:36:11.504 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:36:12.050 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:36:12.050 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:36:12.340 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:36:12.340 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:36:12.341 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:36:13.267 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:36:13.278 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[12] 宽[3072] 高[2048]
2026-04-29 14:36:13.333 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:36:13.486 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:36:13.491 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[16] 宽[3072] 高[2048]
2026-04-29 14:36:13.526 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:38:15.304 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:38:15.353 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:38:15.527 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:38:24.973 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:38:25.008 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:38:25.010 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:38:25.010 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:38:25.556 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:38:25.556 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:38:25.800 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:38:25.800 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:38:25.800 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:38:26.623 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:38:26.630 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[11] 宽[3072] 高[2048]
2026-04-29 14:38:26.669 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:38:26.867 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:38:26.872 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[14] 宽[3072] 高[2048]
2026-04-29 14:38:26.904 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:40:47.848 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:40:47.890 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:40:48.034 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:49:15.132 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:49:15.186 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:49:15.187 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:49:15.187 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:49:15.743 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:49:15.744 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:49:16.018 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:49:16.018 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:49:16.018 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:49:16.898 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:49:16.905 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[12] 宽[3072] 高[2048]
2026-04-29 14:49:16.955 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:49:17.464 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:49:17.471 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[20] 宽[3072] 高[2048]
2026-04-29 14:49:17.502 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:51:07.736 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:51:07.771 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:51:07.869 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:51:17.253 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:51:17.285 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:51:17.286 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:51:17.286 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:51:17.833 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:51:17.833 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:51:18.091 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:51:18.091 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:51:18.091 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:51:18.893 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:51:18.900 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[11] 宽[3072] 高[2048]
2026-04-29 14:51:18.939 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:51:19.506 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:51:19.515 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[19] 宽[3072] 高[2048]
2026-04-29 14:51:19.548 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:51:47.454 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:51:47.494 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:51:47.685 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:51:54.715 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:51:54.752 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:51:54.754 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:51:54.754 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:51:55.293 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:51:55.293 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:51:55.555 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:51:55.555 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:51:55.555 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:51:56.413 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:51:56.422 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[11] 宽[3072] 高[2048]
2026-04-29 14:51:56.468 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:51:56.967 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:51:56.976 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[20] 宽[3072] 高[2048]
2026-04-29 14:51:57.008 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:53:40.208 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:53:40.250 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:53:40.393 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:53:49.245 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:53:49.277 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:53:49.279 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:53:49.279 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:53:49.825 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:53:49.825 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:53:50.092 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:53:50.093 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:53:50.093 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:53:50.943 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:53:50.951 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[11] 宽[3072] 高[2048]
2026-04-29 14:53:50.991 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:53:51.643 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:53:51.653 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[21] 宽[3072] 高[2048]
2026-04-29 14:53:51.685 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:54:09.724 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 14:54:09.765 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 14:54:09.942 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 14:54:16.957 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 14:54:16.995 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 14:54:16.996 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 14:54:16.996 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 14:54:17.541 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 14:54:17.541 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 14:54:17.810 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 14:54:17.810 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 14:54:17.810 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 14:54:18.672 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:54:18.684 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[11] 宽[3072] 高[2048]
2026-04-29 14:54:18.738 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 14:54:19.384 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 14:54:19.395 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[21] 宽[3072] 高[2048]
2026-04-29 14:54:19.431 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 15:02:49.644 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 15:02:49.691 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 15:02:49.835 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 15:02:59.077 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 15:02:59.116 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 15:02:59.117 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 15:02:59.117 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 15:02:59.673 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 15:02:59.673 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 15:02:59.952 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 15:02:59.952 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 15:02:59.952 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 15:03:00.819 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 15:03:00.828 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[12] 宽[3072] 高[2048]
2026-04-29 15:03:00.874 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 15:03:01.351 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 15:03:01.361 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[19] 宽[3072] 高[2048]
2026-04-29 15:03:01.391 [pool-3-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 16:27:29.637 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 16:27:29.718 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 16:27:29.914 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 16:48:20.722 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 16:48:20.819 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 16:48:20.821 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 16:48:20.821 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 16:48:21.372 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 16:48:21.372 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 16:48:21.643 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 16:48:21.643 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 16:48:21.643 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 16:48:27.893 [pool-2-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 16:48:27.900 [pool-2-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[91] 宽[3072] 高[2048]
2026-04-29 16:48:27.953 [pool-2-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-up.png
2026-04-29 16:48:28.406 [pool-2-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始拍照,相机: 192.168.100.89, 保存路径: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 16:48:28.412 [pool-2-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 获取图像成功: 帧[99] 宽[3072] 高[2048]
2026-04-29 16:48:28.441 [pool-2-thread-1] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 图像保存成功: D:/data/media/2026-04-29/PLC1/2026-04-2710-30-00-TRAY-20260427-2026-04-2914-15-26-BATCH-ABC123-down.png
2026-04-29 16:49:26.592 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 16:49:26.634 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 16:49:26.807 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功
2026-04-29 17:42:30.470 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 初始化海康相机SDK...
2026-04-29 17:42:30.553 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK Version: 4.7.1.1
2026-04-29 17:42:30.555 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK初始化成功
2026-04-29 17:42:30.555 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始批量初始化 1 个相机...
2026-04-29 17:42:31.111 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 枚举到 3 个设备
2026-04-29 17:42:31.111 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始初始化相机: 192.168.100.89
2026-04-29 17:42:31.412 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 设备信息 - IP: 192.168.100.89, 型号: MV-CU060-10GC, 序列号: DA1455105
2026-04-29 17:42:31.412 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 初始化成功
2026-04-29 17:42:31.412 [main] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 批量初始化完成,成功: 1/1
2026-04-29 17:45:34.625 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 开始清理相机资源...
2026-04-29 17:45:34.662 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - 相机 192.168.100.89 资源已清理
2026-04-29 17:45:34.856 [SpringApplicationShutdownHook] INFO [c.e.l.s.I.camera.hik.ImageCaptureService] - SDK反初始化成功

@ -318,3 +318,34 @@ Action:
Consider defining a bean of type 'com.example.lxcameraapi.conf.AppConfig$LightConfig' in your configuration.
2026-04-29 14:36:13.482 [pool-3-thread-1] ERROR [c.example.lxcameraapi.service.s7.S7MultiPlcService] - 透视变换异常
java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 8
at com.example.lxcameraapi.service.s7.S7MultiPlcService.solveLinearSystem(S7MultiPlcService.java:526)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.computeHomography(S7MultiPlcService.java:494)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.perspectiveTransform(S7MultiPlcService.java:428)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.cropImage(S7MultiPlcService.java:378)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.capturePhotos(S7MultiPlcService.java:632)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.readPlcData(S7MultiPlcService.java:290)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.lambda$scheduledReadAllPlc$1(S7MultiPlcService.java:738)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
2026-04-29 14:36:13.615 [pool-3-thread-1] ERROR [c.example.lxcameraapi.service.s7.S7MultiPlcService] - 透视变换异常
java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 8
at com.example.lxcameraapi.service.s7.S7MultiPlcService.solveLinearSystem(S7MultiPlcService.java:526)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.computeHomography(S7MultiPlcService.java:494)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.perspectiveTransform(S7MultiPlcService.java:428)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.cropImage(S7MultiPlcService.java:378)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.capturePhotos(S7MultiPlcService.java:647)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.readPlcData(S7MultiPlcService.java:290)
at com.example.lxcameraapi.service.s7.S7MultiPlcService.lambda$scheduledReadAllPlc$1(S7MultiPlcService.java:738)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
2026-04-29 16:48:27.890 [pool-2-thread-1] ERROR [c.example.lxcameraapi.service.light.LightService] - TCP通信失败: Read timed out

File diff suppressed because it is too large Load Diff

@ -109,6 +109,13 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- Gson JSON -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
</dependencies>
<build>

@ -11,7 +11,7 @@ import java.time.LocalDateTime;
public class S7WriteTest {
// PLC连接参数
private static final String IP = "127.0.0.1";
private static final String IP = "192.168.100.59";
private static final int RACK = 0;
private static final int SLOT = 2;
private static final int DB_NUMBER = 1;

@ -40,6 +40,9 @@ public class AppConfig {
public static class Camera{
String ip;
Integer id;
List<List<Integer>> crop;
List<Integer> cropSize;
float compress =0.7f;
String streetId;
Integer direction;
// 图片保存地址

@ -2,6 +2,7 @@ package com.example.lxcameraapi.conf;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@ -17,9 +18,19 @@ public class StaticResourceConfig implements WebMvcConfigurer {
String picUrl = picPath + "pic/";
registry.addResourceHandler("/pic/**")
.addResourceLocations("file:" + picUrl);
// 保留 static 目录的访问
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}

@ -1,5 +1,6 @@
package com.example.lxcameraapi.controller;
import com.example.lxcameraapi.conf.AppConfig;
import com.example.lxcameraapi.service.light.LightService;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
@ -14,36 +15,61 @@ import org.springframework.web.bind.annotation.*;
public class LightController {
private final LightService lightService;
private final AppConfig appConfig;
/**
*
*/
@GetMapping("/trigger")
@Operation(summary = "触发灯源", description = "触发指定地址的灯源导通")
public boolean trigger(
@RequestParam(defaultValue = "1") int address,
@RequestParam(required = false) Integer duration) {
if (duration != null) {
return lightService.trigger(address, duration);
}
return lightService.trigger(address);
}
/**
*
*/
@GetMapping("/triggerD")
@Operation(summary = "触发灯源", description = "触发指定地址的灯源导通")
public boolean triggerD() {
return lightService.defaultTrigger(1);
}
/**
*
*/
@GetMapping("/off")
@Operation(summary = "断开灯源", description = "断开指定地址的灯源")
public boolean off(@RequestParam(defaultValue = "1") int address) {
return lightService.off(address);
}
}
@Operation(summary = "发送控制命令")
@PostMapping("/send")
public String sendCommand(@RequestBody String jsonStr) {
return lightService.sendCommand(jsonStr, appConfig.getLightConfig().getIp(), appConfig.getLightConfig().getPort());
}
@Operation(summary = "发送控制命令(指定IP和端口)")
@PostMapping("/send/custom")
public String sendCommandCustom(@RequestBody String jsonStr,
@RequestParam String ip,
@RequestParam int port) {
return lightService.sendCommand(jsonStr, ip, port);
}
@Operation(summary = "控制继电器导通")
@GetMapping("/on/{address}")
public String turnOn(@PathVariable int address,
@RequestParam(defaultValue = "123") String res) {
return lightService.turnOn(address, res, appConfig.getLightConfig().getIp(), appConfig.getLightConfig().getPort());
}
@Operation(summary = "控制继电器断开")
@GetMapping("/off/{address}")
public String turnOff(@PathVariable int address,
@RequestParam(defaultValue = "123") String res) {
return lightService.turnOff(address, res, appConfig.getLightConfig().getIp(), appConfig.getLightConfig().getPort());
}
@Operation(summary = "控制继电器点动输出")
@GetMapping("/pulse/{address}")
public String pulse(@PathVariable int address,
@RequestParam int seconds,
@RequestParam(defaultValue = "123") String res) {
return lightService.pulse(address, seconds, res, appConfig.getLightConfig().getIp(), appConfig.getLightConfig().getPort());
}
@Operation(summary = "控制继电器延时导通")
@GetMapping("/delay/{address}")
public String delayOn(@PathVariable int address,
@RequestParam int seconds,
@RequestParam(defaultValue = "123") String res) {
return lightService.delayOn(address, seconds, res, appConfig.getLightConfig().getIp(), appConfig.getLightConfig().getPort());
}
@Operation(summary = "读取所有继电器状态")
@GetMapping("/status")
public String readStatus(@RequestParam(defaultValue = "12345") String res) {
return lightService.readStatus(res, appConfig.getLightConfig().getIp(), appConfig.getLightConfig().getPort());
}
@Operation(summary = "发送批量控制命令")
@PostMapping("/batch")
public String batchControl(@RequestBody String jsonStr) {
return lightService.sendCommand(jsonStr, appConfig.getLightConfig().getIp(), appConfig.getLightConfig().getPort());
}
}

@ -21,6 +21,7 @@ public class LightConfig {
* ()
*/
private Integer duration = 10;
private String res = "265";
/**
*

@ -1,136 +1,134 @@
package com.example.lxcameraapi.service.light;
import com.example.lxcameraapi.conf.AppConfig;
import com.example.lxcameraapi.entity.LightConfig;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import java.net.InetSocketAddress;
import java.io.*;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Map;
import java.util.concurrent.*;
import java.nio.charset.StandardCharsets;
/**
*
* - TCP
*/
@Service
@Slf4j
public class LightService {
private final Map<Integer, ScheduledFuture<?>> timers = new ConcurrentHashMap<>();
private ScheduledExecutorService scheduler;
private static final Gson GSON = new Gson();
@Resource
private AppConfig appConfig;
/**
*
* @param jsonStr JSON
* @param ip IP
* @param port
* @return : 4{"A01":0,"A02":0,...}
*/
public String sendCommand(String jsonStr, String ip, int port) {
try (Socket socket = new Socket(ip, port)) {
socket.setSoTimeout(5000);
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8), true);
out.println(jsonStr);
log.info("发送: {}", jsonStr);
// 读取到 } 结束
StringBuilder response = new StringBuilder();
Reader reader = new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8);
int ch;
while ((ch = reader.read()) != -1) {
response.append((char) ch);
if (ch == '}') {
break;
}
}
String result = response.toString();
log.info("接收: {}", result);
@PostConstruct
public void init() {
scheduler = Executors.newScheduledThreadPool(2);
}
return result;
} catch (Exception e) {
log.error("TCP通信失败: {}", e.getMessage());
return null;
}
}
// ==================== 便捷方法 (int address) ====================
/**
*
* @param address (1-8)
* @return
*
* @param address 1-8 A01-A08
*/
public boolean trigger(int address) {
return sendCommand(address, true);
public String turnOn(int address, String res, String ip, int port) {
return sendCommand(String.format("{\"A%02d\":110000,\"res\":\"%s\"}", address, res), ip, port);
}
/**
*
* @param address (1-8)
* @return
*
* @param address 1-8
*/
public boolean defaultTrigger(int address) {
int duration = appConfig.getLightConfig().getDuration();
cancelTimer(address);
boolean success = sendCommand(address, true);
if (success) {
setTimer(address, duration);
}
return success;
public String turnOff(int address, String res, String ip, int port) {
return sendCommand(String.format("{\"A%02d\":100000,\"res\":\"%s\"}", address, res), ip, port);
}
/**
*
* @param address (1-8)
* @param duration ()
* @return
*
* @param address 1-8
* @param seconds
*/
public boolean trigger(int address, int duration) {
cancelTimer(address);
boolean success = sendCommand(address, true);
if (success) {
setTimer(address, duration);
}
return success;
public String pulse(int address, int seconds, String res, String ip, int port) {
String value = String.format("21%04d", seconds);
return sendCommand(String.format("{\"A%02d\":%s,\"res\":\"%s\"}", address, value, res), ip, port);
}
/**
*
* @param address (1-8)
* @return
*
* @param address 1-8
* @param seconds
*/
public boolean off(int address) {
cancelTimer(address);
return sendCommand(address, false);
public String delayOn(int address, int seconds, String res, String ip, int port) {
String value = String.format("31%04d", seconds);
return sendCommand(String.format("{\"A%02d\":%s,\"res\":\"%s\"}", address, value, res), ip, port);
}
public static void main(String[] args) {
String value = String.format("31%04d", 2);
System.out.println(String.format("{\"A%02d\":%s,\"res\":\"%s\"}", 1, value, "1263"));
}
/**
* Modbus TCP
* : 000000(6) + 01 + 05 + (2) + (2)
*
*/
private boolean sendCommand(int address, boolean isOn) {
Socket socket = null;
try {
socket = new Socket();
socket.connect(new InetSocketAddress(appConfig.getLightConfig().getIp(), appConfig.getLightConfig().getPort()), 3000);
socket.setSoTimeout(3000);
ByteBuffer buffer = ByteBuffer.allocate(12);
buffer.order(ByteOrder.BIG_ENDIAN);
// 000000 + 01 + 05 + 0000(地址) + FF00/0000(数据)
buffer.putShort((short) 0); // 事务标识符 00 00
buffer.putShort((short) 0); // 协议标识符 00 00
buffer.putShort((short) 6); // 后续字节数 00 06
buffer.put((byte) 1); // 单元标识符 01
buffer.put((byte) 0x05); // 功能码 05
buffer.putShort((short) (address - 1)); // 寄存器地址 (第1路=0, 第2路=1...)
buffer.putShort(isOn ? (short) 0xFF00 : (short) 0x0000); // 数据
socket.getOutputStream().write(buffer.array());
socket.getOutputStream().flush();
log.info("灯源第{}路 {}", address, isOn ? "开" : "关");
return true;
} catch (Exception e) {
log.error("灯源第{}路命令发送失败: {}", address, e.getMessage());
return false;
} finally {
if (socket != null) {
try { socket.close(); } catch (Exception ignored) {}
}
}
public String readStatus(String res, String ip, int port) {
return sendCommand(String.format("{\"readall\",\"res\":\"%s\"}", res), ip, port);
}
private void setTimer(int address, int seconds) {
timers.put(address, scheduler.schedule(() -> {
log.info("灯源地址 {} 自动断开", address);
off(address);
}, seconds, TimeUnit.SECONDS));
/**
*
* @param response : 4{"A01":0,"A02":1,...}
* @param address 1-8
* @return
*/
public Object getStatus(String response, int address) {
return getStatus(response, String.format("A%02d", address));
}
private void cancelTimer(int address) {
ScheduledFuture<?> f = timers.remove(address);
if (f != null) f.cancel(false);
/**
*
*/
public Object getStatus(String response, String address) {
if (response == null || response.length() < 2) {
return null;
}
try {
String jsonStr = response.substring(1);
JsonObject json = GSON.fromJson(jsonStr, JsonObject.class);
return json.get(address);
} catch (Exception e) {
log.error("解析状态响应失败: {}", response, e);
return null;
}
}
}

@ -1,8 +1,11 @@
package com.example.lxcameraapi.service.s7;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.example.lxcameraapi.conf.AppConfig;
import com.example.lxcameraapi.conf.PlcData;
import com.example.lxcameraapi.entity.CameraUrl;
import com.example.lxcameraapi.entity.LightConfig;
import com.example.lxcameraapi.service.CameraUrlService;
import com.example.lxcameraapi.service.IndustrialCamera.camera.hik.ImageCaptureService;
import com.example.lxcameraapi.service.light.LightService;
@ -17,12 +20,24 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import jakarta.annotation.Resource;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.List;
import java.util.concurrent.*;
/**
@ -229,6 +244,7 @@ public class S7MultiPlcService {
* PLC
*/
public PlcReadData readPlcData(String plcNumber) {
LightConfig lightConfig = appConfig.getLightConfig();
PlcData config = getPlcConfig(plcNumber);
if (config == null) {
log.error("未找到PLC配置: {}", plcNumber);
@ -270,22 +286,42 @@ public class S7MultiPlcService {
log.info("PLC {} 读取成功: 托盘码={}, 批次号={}, 日期={}, 拍照标志={}",
plcNumber, data.getPalletNo(), data.getBatchNo(), data.getDate(), data.getSnapFlag());
// 检查托盘号是否变化
// 检查托盘号是否需要处理
String lastPallet = lastPalletCache.get(plcNumber);
if (lastPallet == null || !lastPallet.equals(data.getPalletNo())) {
if (config.getLightChannel()!=null){
lightService.trigger(config.getLightChannel());
boolean needProcess = false;
if (lastPallet == null) {
// 首次启动,查数据库比对
CameraUrl lastRecord = cameraUrlService.getOne(new QueryWrapper<CameraUrl>()
.orderByDesc("create_time").last("limit 1"));
if (lastRecord != null && !data.getPalletNo().equals(lastRecord.getPallet())) {
needProcess = true;
}else{
lastPalletCache.put(plcNumber, data.getPalletNo());
}
} else if (!lastPallet.equals(data.getPalletNo())) {
// 托盘号变化
needProcess = true;
}
if (needProcess) {
// 触发灯
if (config.getLightChannel() != null) {
lightService.pulse(config.getLightChannel(), lightConfig.getDuration(),
lightConfig.getRes(), lightConfig.getIp(), lightConfig.getPort());
}
log.info("PLC {} 托盘号变化: {} -> {}", plcNumber, lastPallet, data.getPalletNo());
lastPalletCache.put(plcNumber, data.getPalletNo());
Map<String, String> photos =capturePhotos(config, data);
// 更新缓存
// 拍照
Map<String, String> photos = capturePhotos(config, data);
readDataCache.put(plcNumber, data);
// 保存记录
CameraUrl cameraUrl = new CameraUrl();
cameraUrl.setPallet(data.getPalletNo());
cameraUrl.setBatch(data.getBatchNo());
if (data.getDate()!=null && !data.getDate().isEmpty()) {
if (data.getDate() != null && !data.getDate().isEmpty()) {
cameraUrl.setDate(LocalDateTime.parse(data.getDate(), FULL_DATE_FORMATTER));
}
cameraUrl.setId(UUID.randomUUID().toString());
@ -293,7 +329,8 @@ public class S7MultiPlcService {
cameraUrl.setUpPath(photos.get("upPath"));
cameraUrl.setDownPath(photos.get("downPath"));
cameraUrlService.saveOrUpdate(cameraUrl);
// 标记以及读取
// 标记拍照完成
writePhotoResult(plcNumber, (byte) 1);
}
@ -308,6 +345,9 @@ public class S7MultiPlcService {
}
}
/**
*
*/
@ -327,22 +367,37 @@ public class S7MultiPlcService {
// 上相机拍照
if (config.getCameraUp() != null && !config.getCameraUp().isEmpty()) {
String upPath = basePath + fileNamePrefix.replace(" ", "").replace(":", "-") + "-up.png";
String upPath = basePath + fileNamePrefix.replace(" ", "").replace(":", "-") + "-up.jpg";
result.put("upPath", upPath.replace(appConfig.getPicPath(), appConfig.getPicUrl()));
String upIp = getCameraIp(config.getCameraUp());
if (upIp != null) {
boolean success = imageCaptureService.captureImage(upIp, upPath);
// 将原图片根据点crop取下来扭曲后根据大小cropSize生成新图片压缩一下后覆盖原图片
if (success) {
AppConfig.Camera cameraConfig = getCameraConfig(upIp);
if (cameraConfig != null && cameraConfig.getCrop() != null && cameraConfig.getCropSize() != null) {
cropAndCompressImage(upPath, cameraConfig);
}
}
log.info("PLC {} 上相机拍照: {}, 结果: {}", config.getPlcNumber(), upPath, success);
}
}
// 下相机拍照
if (config.getCameraDown() != null && !config.getCameraDown().isEmpty()) {
String downPath = basePath + fileNamePrefix.replace(" ", "").replace(":", "-") + "-down.png";
String downPath = basePath + fileNamePrefix.replace(" ", "").replace(":", "-") + "-down.jpg";
result.put("downPath", downPath.replace(appConfig.getPicPath(), appConfig.getPicUrl()));
String downIp = getCameraIp(config.getCameraDown());
if (downIp != null) {
boolean success = imageCaptureService.captureImage(downIp, downPath);
// 将原图片根据点crop取下来扭曲后根据大小cropSize生成新图片压缩一下后覆盖原图片
if (success) {
AppConfig.Camera cameraConfig = getCameraConfig(downIp);
if (cameraConfig != null && cameraConfig.getCrop() != null && cameraConfig.getCropSize() != null) {
cropAndCompressImage(downPath, cameraConfig);
}
}
log.info("PLC {} 下相机拍照: {}, 结果: {}", config.getPlcNumber(), downPath, success);
}
}
@ -367,6 +422,142 @@ public class S7MultiPlcService {
return null;
}
/**
* IP
*/
private AppConfig.Camera getCameraConfig(String cameraIp) {
if (appConfig.getHikCamera() != null) {
for (AppConfig.Camera camera : appConfig.getHikCamera()) {
if (cameraIp.equals(camera.getIp())) {
return camera;
}
}
}
return null;
}
/**
*
* @param imagePath
*/
private void cropAndCompressImage(String imagePath,AppConfig.Camera config) {
try {
File imageFile = new File(imagePath);
if (!imageFile.exists()) {
log.warn("图片文件不存在: {}", imagePath);
return;
}
BufferedImage originalImage = ImageIO.read(imageFile);
if (originalImage == null) {
log.warn("无法读取图片: {}", imagePath);
return;
}
List<List<Integer>> crop = config.getCrop();
List<Integer> cropSize = config.getCropSize();
int targetWidth = cropSize.get(0);
int targetHeight = cropSize.get(1);
// 源四边形四个顶点 (顺时针: 左上, 右上, 右下, 左下)
double x0 = crop.get(0).get(0), y0 = crop.get(0).get(1);
double x1 = crop.get(1).get(0), y1 = crop.get(1).get(1);
double x2 = crop.get(2).get(0), y2 = crop.get(2).get(1);
double x3 = crop.get(3).get(0), y3 = crop.get(3).get(1);
// 目标矩形四个顶点 (左上, 右上, 右下, 左下)
double u0 = 0, v0 = 0;
double u1 = targetWidth, v1 = 0;
double u2 = targetWidth, v2 = targetHeight;
double u3 = 0, v3 = targetHeight;
// 创建目标图像
BufferedImage croppedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
int[] srcPixels = originalImage.getRGB(0, 0, originalImage.getWidth(), originalImage.getHeight(), null, 0, originalImage.getWidth());
int srcWidth = originalImage.getWidth();
int srcHeight = originalImage.getHeight();
// 计算透视变换的逆变换系数 (从目标坐标映射到源坐标)
// 使用双线性插值的透视变换
for (int y = 0; y < targetHeight; y++) {
for (int x = 0; x < targetWidth; x++) {
// 计算相对于目标矩形的归一化坐标
double mu = (double) x / targetWidth;
double mv = (double) y / targetHeight;
// 计算透视变换后的源坐标 (使用双线性插值)
double srcX = bilinearInterpolate(
bilinearInterpolate(x0, x1, mu),
bilinearInterpolate(x3, x2, mu),
mv
);
double srcY = bilinearInterpolate(
bilinearInterpolate(y0, y1, mu),
bilinearInterpolate(y3, y2, mu),
mv
);
// 从源图像采样像素
int srcXInt = (int) Math.round(srcX);
int srcYInt = (int) Math.round(srcY);
if (srcXInt >= 0 && srcXInt < srcWidth && srcYInt >= 0 && srcYInt < srcHeight) {
int pixel = srcPixels[srcYInt * srcWidth + srcXInt];
croppedImage.setRGB(x, y, pixel);
} else {
croppedImage.setRGB(x, y, 0xFFFFFF); // 白色填充
}
}
}
// 压缩并保存
compressAndSaveImage(croppedImage, imageFile, config.getCompress());
log.info("图片透视裁剪完成: {}, 尺寸: {}x{}", imagePath, targetWidth, targetHeight);
} catch (IOException e) {
log.error("图片透视裁剪失败: {}", imagePath, e);
}
}
/**
* 线
*/
private double bilinearInterpolate(double v0, double v1, double t) {
return v0 + (v1 - v0) * t;
}
/**
* JPEG
*/
private void compressAndSaveImage(BufferedImage image, File outputFile, float compress) throws IOException {
// 确保扩展名为 .jpg
String jpgPath = outputFile.getAbsolutePath().replaceAll("\\.(png|jpg|jpeg)$", ".jpg");
File jpgFile = new File(jpgPath);
FileOutputStream fos = new FileOutputStream(jpgFile);
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
writer.setOutput(ios);
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(compress);
writer.write(null, new IIOImage(image, null, null), param);
ios.close();
fos.close();
writer.dispose();
// 删除原文件
if (!outputFile.equals(jpgFile) && outputFile.exists()) {
outputFile.delete();
}
log.info("图片已保存为JPEG: {} ({} KB)", jpgFile.getName(), jpgFile.length() / 1024);
}
/**
* PLC
*/

@ -5,7 +5,7 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/camera?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
url: jdbc:mysql://localhost:3306/camera?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: root
druid:
@ -41,6 +41,12 @@ server:
hikCamera:
- id: 1
ip: 192.168.100.89
# 图片扭曲
crop: [[483,900],[2830,40],[2830,2000],[483,1000]]
# 图片大小
cropSize: [480,640]
# 压缩
compress: 0.5
# PLC配置
plcData:
@ -71,11 +77,13 @@ plcData:
# 灯通道
lightChannel: 1
# 灯源配置
# 灯源继电器配置
lightConfig:
ip: 127.0.0.1
port: 502
ip: 192.168.100.18
port: 50000
# 开启时间默认10s最多9999秒
duration: 10
swagger:
enabled: true

@ -216,7 +216,6 @@
<table>
<thead>
<tr>
<th>ID</th>
<th>托盘号</th>
<th>批次号</th>
<th>生产日期</th>

Loading…
Cancel
Save