
BnlAiCtrl 这一系列写到第七篇前面已经陆续聊过机器视觉模块怎么配置、运动控制轴组怎么规划、上位机画面怎么做基本上覆盖了非标自动化设备开发的主干流程。但很多朋友在评论区问同一个问题平台已经把视觉、运动、上位机拖拽化之后最花时间的反而是那些“经验型”的工作比如视觉标定异常怎么分析、旋转角度补偿怎么算、运动轴参数怎么调、上位机脚本怎么写。这些内容翻手册能查但效率太低而且非常依赖个人经验。于是这一篇我们把 AI 助手集成到 BnlAiCtrl 无代码平台里让大模型直接参与设备调试、参数建议和代码生成。本文围绕 AI 助手的接入架构、提示词设计、工具调用、视觉/运动/上位机三个真实场景展开给出完整可落地的实现思路和代码框架。如果你正在做非标自动化设备平台或者想给自己的无代码平台加一个“懂视觉、懂运动、懂上位机”的智能助手这篇文章会很适合你。1. BnlAiCtrl 与 AI 助手为什么要把大模型接进无代码平台1.1 从机器视觉、运动控制到上位机的集成痛点非标自动化项目和普通软件开发差别很大。一套设备往往同时涉及三个域机器视觉负责定位、检测、测量、识别需要处理相机标定、手眼标定、旋转中心补偿、打光方案、算法参数调优。运动控制负责轴运动、插补、点位规划、速度规划、IO 联动需要理解脉冲输出、伺服参数、原点回零、限位逻辑。上位机负责和 PLC、运动控制卡、视觉系统交互需要编写通信协议、状态机、操作界面、数据报表。这三个域本来就已经让调试工程师头大了BnlAiCtrl 这样的无代码平台把它们的“开发过程”简化成了拖拽和配置但调试过程中的“知识判断”依然没有被替代。比如视觉检测发现来料角度偏了软件不会自动告诉你应该补偿多少运动轴走位偏差大软件不会直接给出“调大加速度还是调小速度环增益”的结论上位机需要新增一个通信协议仍然要查 SDK 文档、翻历史项目。这就是 AI 助手存在的价值把平台沉淀的工程知识、设备手册、调试经验集中起来通过自然语言问答的形式给工程师提供实时辅助。1.2 什么是 BnlAiCtrl 下的 AI 助手AI 助手不是简单地在平台上嵌一个聊天框。在 BnlAiCtrl 这种无代码平台里AI 助手应该具备三个层次的能力问答层回答“什么是手眼标定”“旋转中心怎么求”“脉冲当量怎么算”这一类基础概念问题。建议层根据当前工程配置、设备参数、视觉检测结果给出具体的调节建议。这层需要绑定平台内部的数据不能只靠大模型编。执行层生成配置项、生成脚本、生成上位机代码片段甚至可以一键写入平台配置。这是最高级的一层也是需要重点做好权限控制的一层。换句话说AI 助手对外是一个聊天界面对内是一套连接大模型、知识库、平台配置、外部工具的插件系统。1.3 本文与系列前篇的衔接、适合读者前面几篇我们已经掌握了 BnlAiCtrl 的视觉流程配置、运动控制轴组管理、上位机画面组态。本篇默认你已经能搭建一个简单的非标自动化流程了解平台的基础操作。本文会重点拆解 AI 助手的实现思路并结合视觉定位、运动控制、上位机脚本三个场景给出示例。适合读者已经在用或准备用 BnlAiCtrl 做非标自动化项目的工程师。想给自研设备平台增加 AI 能力的开发者。对大模型落地到工业控制场景感兴趣的技术人员。2. 环境准备与功能架构2.1 平台与运行环境说明由于 BnlAiCtrl 在不同项目中的部署方式不完全一样本文以一个比较通用的部署环境为例重点演示集成思路。你可以根据自己的实际环境调整版本和路径。操作系统Windows 10/11 或 Windows Server 2019工业现场多数是 Windows。平台版本BnlAiCtrl 2024.x / 2025.x 均可本文以“平台提供外部服务注册接口”为前提。大模型服务支持 OpenAI 规范接口的大模型服务企业内网优先推荐私有化部署避免把设备数据传到外部。后端服务Python 3.10使用 FastAPI 搭建 AI 助手网关。前端接入BnlAiCtrl 平台支持自定义面板或 WebView 页面用于内嵌 AI 助手对话框。版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。2.2 AI 助手模块的总体架构把 AI 助手接入 BnlAiCtrl架构上可以拆成五层层级作用技术载体交互层工程师在平台内直接对话BnlAiCtrl 自定义面板 / WebView网关层接收请求、鉴权、限流、路由FastAPI / Nginx智能层提示词编排、工具调用、上下文管理LangChain / 自研 Agent 框架工具层查询视觉结果、读取轴配置、生成代码平台插件接口 / REST API知识层设备手册、历史调试记录、算法文档向量数据库 / 本地文件索引这个架构的核心点是AI 不能只靠大模型“脑补”必须能调用平台内部的数据和工具。比如用户问“当前视觉的旋转中心标定结果可信吗”AI 需要能读取平台里的标定记录而不是给一段泛泛的回答。2.3 文件与目录规划为方便后续开发建议把 AI 助手服务做成独立目录和 BnlAiCtrl 平台目录分开ai-helper/ ├── app/ │ ├── main.py # FastAPI 入口 │ ├── config.py # 配置文件 │ ├── agent.py # 智能体编排逻辑 │ ├── prompts/ # 提示词模板 │ │ ├── vision.py │ │ ├── motion.py │ │ └── upper.py │ ├── tools/ # 工具调用 │ │ ├── vision_tools.py │ │ ├── motion_tools.py │ │ └── code_tools.py │ └── knowledge/ # 知识库索引 ├── web/ # 前端聊天面板 │ └── index.html └── requirements.txt这样模块边界清晰后面替换模型、扩展工具都不会影响到主流程。3. 核心原理提示词工程与工具调用3.1 给大模型设计“无代码平台助手”角色AI 助手在 BnlAiCtrl 里的角色不是通用聊天机器人而是“设备调试助手”。好的角色设定能让大模型的回答更聚焦。下面是一段基础的系统提示词你是一名非标自动化设备调试助手熟悉 BnlAiCtrl 无代码平台。 你的用户通常是设备调试工程师他们可能问到以下类型的问题 1. 机器视觉相机标定、手眼标定、旋转中心、基准点、角度补偿、打光建议。 2. 运动控制脉冲当量、轴参数、回零方式、插补配置、速度规划。 3. 上位机通信协议、界面逻辑、脚本生成、数据采集。 回答要求 - 优先给出可落地、可操作的步骤不要泛泛而谈。 - 如果涉及计算公式先列出公式再代入示例数值。 - 如果涉及平台配置项说明配置路径和推荐值范围。 - 如果不确定明确告诉用户需要补充哪些信息不要编造。注意角色里包含了“平台配置路径”这样大模型在回答时会尽量贴近 BnlAiCtrl 的操作习惯而不是给出一个通用但无法落地的答案。3.2 工具调用让大模型能读视觉、控运动、写脚本大模型本身没有实时读取设备状态的能力所以需要给它定义工具。工具的本质是函数。下面以 Python 为例定义三个最常用的工具# 文件路径app/tools/vision_tools.py def get_calibration_result(project_id: str) - dict: 读取当前视觉项目的标定结果。 在实际项目中这里应该调用 BnlAiCtrl 的 REST API 或数据库。 return { project_id: project_id, calibrated: True, resolution_x: 0.045, # mm/pixel resolution_y: 0.045, rotation_center: {x: 640, y: 512}, calibration_date: 2025-06-10 } def calc_rotation_compensation(benchmark_point: dict, current_point: dict, rotation_center: dict) - dict: 已知旋转中心和取料基准点计算物料旋转后的取料补偿。 import math # 将基准点与当前点围绕旋转中心换算角度 angle_bench math.atan2(benchmark_point[y] - rotation_center[y], benchmark_point[x] - rotation_center[x]) angle_curr math.atan2(current_point[y] - rotation_center[y], current_point[x] - rotation_center[x]) delta_angle math.degrees(angle_curr - angle_bench) return {delta_angle_deg: round(delta_angle, 3)}# 文件路径app/tools/motion_tools.py def get_axis_config(axis_id: int) - dict: 读取运动控制轴参数。这里返回的是示例结构。 return { axis_id: axis_id, pulse_per_rev: 10000, gear_ratio: 1.0, screw_pitch: 10.0, # mm max_speed: 200.0, # mm/s acceleration: 500.0 # mm/s^2 } def suggest_acceleration(current_acc: float, position_error: float) - str: 根据定位误差给出加速度调节建议。 if position_error 0.1: return f当前加速度 {current_acc} 偏大建议降低 20%~30%并配合速度规划曲线调整。 return f当前加速度 {current_acc} 在合理范围可以先观察连续生产数据。# 文件路径app/tools/code_tools.py def generate_modbus_read_snippet(device_ip: str, start_addr: int, length: int) - str: 生成上位机读取 Modbus 寄存器数据的 C# 代码片段。 return f using System; using HslCommunication; using HslCommunication.ModBus; public class ModbusHelper {{ public static void ReadRegisters() {{ var modbus new ModbusTcpClient({device_ip}); modbus.ConnectServer(); var result modbus.ReadInt16({start_addr}, (ushort){length}); if (result.IsSuccess) {{ Console.WriteLine(读取成功: string.Join(,, result.Content)); }} else {{ Console.WriteLine(读取失败: result.Message); }} modbus.ConnectClose(); }} }} 在 Agent 的调度逻辑里大模型会根据用户问题判断调用哪个工具然后把工具返回结果作为上下文继续生成回答。这样AI 助手给出的建议就是基于设备实时状态或平台实际配置的而不是空想。3.3 知识库与上下文管理另一个关键点是知识库。BnlAiCtrl 平台涉及的知识面很广光视觉算法就有定位、测量、读码、缺陷检测等运动控制又有多种控制卡和脉冲模式。把这些知识全部塞进提示词是不现实的通常的做法是把设备手册、算法说明、历史调试记录转成文本切片。用向量化模型把切片写入向量数据库。用户提问时先做相似度检索把最相关的知识片段拼进提示词再交给大模型回答。这样既控制了输入长度也提升了回答准确率。上下文管理上可以记录最近几轮对话避免设备调试问题时前后矛盾。3.4 权限与安全边界这一点必须单独强调。AI 助手如果只是回答问题风险相对可控但一旦涉及运动控制参数写入、上位机脚本生成甚至平台配置更新就必须有严格的权限控制。我的建议是问答和建议类操作普通工程师可用不做敏感操作。配置写入和脚本部署需要管理员权限且 AI 只能生成“建议内容”由人工确认后再写入。所有 AI 生成动作都要写审计日志记录提问时间、用户、生成内容、是否执行。工业自动化里设备动作是很严肃的AI 助手可以当参谋但不能直接操盘。4. 完整实战在 BnlAiCtrl 中集成 AI 助手4.1 搭建 AI 助手服务端我们先从服务端开始。用 FastAPI 搭建一个轻量级网关负责统一接收前端请求、调用大模型、执行工具函数。pip install fastapi uvicorn openai langchain# 文件路径app/main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from agent import chat_with_agent app FastAPI(titleBnlAiCtrl AI Helper) class ChatRequest(BaseModel): message: str project_id: str user_role: str engineer class ChatResponse(BaseModel): answer: str trace: list [] app.post(/api/chat, response_modelChatResponse) async def chat(req: ChatRequest): try: answer, trace await chat_with_agent( messagereq.message, project_idreq.project_id, user_rolereq.user_role ) return ChatResponse(answeranswer, tracetrace) except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.get(/health) async def health(): return {status: ok}这里把chat_with_agent放在agent.py里实现大模型调度和工具调用。4.2 实现 Agent 编排逻辑Agent 编排是 AI 助手的核心。下面给一个简单的实现内部按“意图识别 → 工具调用 → 结果生成”三步走。# 文件路径app/agent.py import json from tools.vision_tools import get_calibration_result, calc_rotation_compensation from tools.motion_tools import get_axis_config, suggest_acceleration from tools.code_tools import generate_modbus_read_snippet # 这里用简单的规则做工具路由生产环境建议让大模型做函数调用 def route_tool(message: str, project_id: str): if 旋转 in message and (补偿 in message or 角度 in message): # 模拟读取当前视觉结果和基准点 calib get_calibration_result(project_id) benchmark {x: 520, y: 460} current {x: 610, y: 530} result calc_rotation_compensation(benchmark, current, calib[rotation_center]) return { tool_name: calc_rotation_compensation, tool_result: result, message: f基准点与当前点的旋转角度偏差约为 {result[delta_angle_deg]}°。 } elif 加速 in message or 轴参数 in message: axis_config get_axis_config(1) result suggest_acceleration(axis_config[acceleration], position_error0.25) return { tool_name: suggest_acceleration, tool_result: result, message: result } elif modbus in message.lower() or 读寄存器 in message: code generate_modbus_read_snippet(192.168.1.10, 0, 10) return { tool_name: generate_modbus_read_snippet, tool_result: code, message: 已生成 Modbus 读取示例代码。 } return None async def chat_with_agent(message: str, project_id: str, user_role: str): tool_info route_tool(message, project_id) if tool_info: # 如果命中了本地工具直接返回工具结果同时可以追加解释 answer tool_info[message] if tool_info[tool_name] generate_modbus_read_snippet: answer \n\ncsharp\n tool_info[tool_result] \n return answer, [tool_info] else: # 未命中工具时调用大模型 # 这里省略了大模型调用细节实际项目接入 OpenAISDK 兼容接口即可 return 暂未匹配到本地工具这里将调用大模型回答。实际集成时请接入大模型服务。, []这段代码展示了工具调用的骨架核心价值在于把“本地知识”和“大模型生成”结合起来。生产环境中你可以把路由换成大模型的 Function Calling让模型自己决定调哪个工具效果会更灵活。4.3 在 BnlAiCtrl 平台侧嵌入 AI 助手入口平台侧接入 AI 助手最简单的方式是“自定义 Web 面板”。BnlAiCtrl 通常支持在工程中加一个自定义页面我们可以把聊天面板的 HTML 放进去。!-- 文件路径web/index.html -- !DOCTYPE html html langzh-CN head meta charsetUTF-8 titleAI 助手/title style body { font-family: Microsoft YaHei, sans-serif; margin: 0; padding: 16px; } .chat-box { height: 60vh; border: 1px solid #ccc; border-radius: 8px; padding: 12px; overflow-y: auto; } .msg { margin-bottom: 12px; } .msg.user { text-align: right; color: #1a73e8; } .msg.ai { text-align: left; color: #333; } textarea { width: 100%; height: 60px; margin-top: 12px; } button { background: #1a73e8; color: #fff; border: none; padding: 8px 20px; border-radius: 4px; cursor: pointer; } /style /head body div classchat-box idchatBox/div textarea idinput placeholder请输入问题例如帮我计算当前视觉的旋转补偿角度/textarea button onclicksendMessage()发送/button script async function sendMessage() { const input document.getElementById(input); const box document.getElementById(chatBox); const message input.value.trim(); if (!message) return; box.innerHTML div classmsg user message /div; input.value ; const resp await fetch(/api/chat, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ message: message, project_id: demo_project }) }); const data await resp.json(); box.innerHTML div classmsg ai data.answer /div; box.scrollTop box.scrollHeight; } /script /body /html实际部署时你可以把这个页面挂到 BnlAiCtrl 的自定义面板里或者用 iframe 嵌入。用户不需要打开浏览器去单独访问一个 AI 网站直接在平台界面里就能对话体验会自然很多。4.4 场景一视觉定位与旋转角度补偿机器视觉是网友问得最多的场景。尤其是“已知旋转中心且已经知道取料基准点如果物料与基准点发生旋转怎么补偿”这类型问题几乎每隔一段时间就有人问。在 BnlAiCtrl 视觉配置中通常会有两个核心数据旋转中心机构旋转轴在图像坐标系中的位置。取料基准点物料在标准姿态下的抓取位置。当物料发生旋转后不能直接把基准点坐标写入运动控制需要先补偿。补偿的核心公式是围绕旋转中心做旋转变化x xc (x - xc) * cos(θ) - (y - yc) * sin(θ) y yc (x - xc) * sin(θ) (y - yc) * cos(θ)其中(xc, yc)是旋转中心(x, y)是原基准点(x, y)是旋转后的实际取料点。我们用 AI 助手来计算时可以这样问已知旋转中心是 (640, 512)取料基准点是 (520, 460) 当前物料实际定位点是 (610, 530)请计算旋转补偿角度和补偿后的取料点。AI 助手通过工具calc_rotation_compensation得到角度再套用上面的公式生成补偿坐标。这样既省去了手工查公式的麻烦也能把计算结果直接复制到 BnlAiCtrl 的视觉流程里。4.5 场景二运动控制参数咨询与脚本生成运动控制方面非标项目里经常做多轴插补和高速脉冲输出。比如有些场景通过双 DMA 实现脉冲输出8 轴插补达到 500K3 轴达到 1M 输出。工程师遇到这类需求时最关心的是两个问题控制卡的脉冲输出能力能不能满足。轴的加减速、脉冲当量、电子齿轮比怎么配置。以脉冲当量为例常见计算公式脉冲当量 丝杠导程 / 电机每转脉冲数 / 减速比示例丝杠导程 10mm电机每转 10000 脉冲减速比 1:2也就是电机转 2 圈丝杠转 1 圈那么脉冲当量 10 / 10000 / 0.5 0.002 mm/pulse当用户在 AI 助手中输入“我的是导程10的丝杠减速比1比2电机每转10000脉冲帮我算脉冲当量”助手应该直接给出公式和结果并且提示在 BnlAiCtrl 轴配置中要填写的参数位置。这类计算如果靠手算容易出错交给 AI 助手可以快速校验。4.6 场景三上位机代码生成辅助上位机开发是另一个高频场景。很多工程师用的是 C#常用框架有 WinForms、WPF也有一部分用 Qt。AI 助手在代码生成上的价值很明显。比如用户需要读取某台设备的状态寄存器可以这样问用 C# 写一个 Modbus TCP 客户端读取 192.168.1.10 的保持寄存器从地址 0 开始读 10 个。AI 助手调用generate_modbus_read_snippet工具直接生成可参考的代码。同时因为这是“上位机辅助代码”不是平台核心控制逻辑风险较低可以让用户复制到 BnlAiCtrl 的脚本节点中使用。4.7 运行与验证启动服务cd ai-helper uvicorn app.main:app --host 0.0.0.0 --port 8000在浏览器打开http://localhost:8000或者直接把 HTML 面板放到 BnlAiCtrl 自定义页面中。验证时可以依次输入三类问题输入问题预期行为帮我计算当前视觉的旋转补偿角度调用视觉工具返回角度偏差轴定位误差偏大怎么调调用运动控制建议工具用 C# 写一个 Modbus TCP 读寄存器示例调用代码生成工具返回 C# 片段什么是手眼标定未命中本地工具转大模型回答这里给出的工具路由比较简单实际项目中可以使用大模型的 Function Calling 能力让模型更智能地决定是否需要调用工具、调用哪个工具、传什么参数。5. 常见问题与排查思路5.1 高频问题速查表问题现象常见原因解决思路AI 不回答问题一直转圈后端服务不可用或网络超时检查 FastAPI 状态、模型服务连通性回答内容很泛不贴合平台缺少工具调用大模型只在“编”为高频问题绑定工具让模型基于实时数据回答旋转角度算反了坐标轴方向、旋转中心坐标系不一致确认图像坐标是 X 右 Y 下还是 X 右 Y 上工具调用报错平台接口地址或鉴权 token 失效检查平台侧注册的工具接口是否配置正确生成了不安全的代码提示词里没有强调安全边界在系统提示词中增加“禁止生成直接控制设备动作的代码”上下文过长导致费用高每次请求都拼接全部历史只保留最近几轮对话并做知识库检索裁剪脱机环境无法使用大模型服务在外网使用私有化模型或本地小模型5.2 典型问题详解第一个典型问题是“工具调用和模型幻觉之间的平衡”。很多团队最开始做 AI 助手时喜欢直接问大模型所有问题结果发现不可控。正确做法是凡是平台内部有明确数据和公式的场景优先走工具调用只有开放性问题才交给大模型。这样既快又准。第二个典型问题是“坐标系理解不一致”。视觉领域里像素坐标系、图像坐标系、机械坐标系的旋转方向可能不同旋转角度正负号容易搞反。建议把坐标系的转换规则写进知识库并在提示词里明确要求 AI 回答前先确认坐标系定义。第三个典型问题是“前端嵌入跨域”。BnlAiCtrl 平台页面和 AI 服务要不是同域时需要配置 CORS。FastAPI 里可以这样处理from fastapi.middleware.cors import CORSMiddleware app.add_middleware( CORSMiddleware, allow_origins[*], # 生产环境按实际域名收紧 allow_methods[*], allow_headers[*], )6. 工程最佳实践与注意事项6.1 提示词模板集中管理不要把提示词硬编码在业务逻辑里。把系统提示词、工具描述、安全限制拆成独立模板文件方便调试和更新。每次修改模板后最好做一次回归测试确保核心场景不受影响。6.2 工具调用的最小权限原则建议为不同用户角色设置不同的工具权限。普通调试工程师只能用“读取类”工具比如查看轴参数、查看视觉标定结果管理员才能用“生成类”工具比如生成代码、更新配置。在工具函数内部也要做二次校验不能只依赖前端隐藏按钮。6.3 知识库更新与数据质量设备调试经验是逐步积累的AI 助手的回答质量会越来越依赖知识库。建议每周把现场解决的典型问题沉淀成问答对导入知识库。需要注意旧参数、已废弃的配置路径要及时删除。多条知识冲突时以最新版本为准。涉及具体设备型号时标注适用条件。6.4 日志审计与成本控制AI 助手在生产环境中会面临连续调用大模型带来的成本问题。建议做三件事对相同或相似问题进行缓存比如相同关键词在短时间内直接返回缓存结果。记录每次调用的 token 消耗按项目和用户维度统计。对话历史做长度裁剪避免把超长会话全部发给大模型。同时所有 AI 交互行为都要有日志。这里补充一个重要安全说明在非标自动化这类涉及设备动作的场景中任何 AI 生成的控制参数建议都只能作为参考必须经过工程师审核、并在测试环境验证后方可应用到生产设备涉及平台配置变更时请先在备份环境中验证遵循最小权限原则不要给 AI 助手开放直接写入运动控制参数的权限。7. 下一步学习方向AI 助手集成进来之后整个 BnlAiCtrl 平台就有了“问、查、算、写”的能力。你可以继续往这几个方向深入。第一把工具调用升级成大模型 Function Calling让 AI 自主判断什么时候调用视觉标定工具、什么时候读取运动轴状态问答体验会从“规则路由”变成“自然跳转”。第二引入多模态能力。视觉领域经常要判断打光效果、检测图像缺陷AI 如果能直接看图就能结合图像给出更有针对性的建议。第三把 AI 助手的本地工具扩展到 BnlAiCtrl 的核心引擎比如让 AI 根据对话直接生成一小段视觉流程或运动控制序列和平台形成双向联动。第四探索离线小模型方案。工业现场网络环境可能有限制本地部署 7B 或 13B 模型再配合精简知识库也能覆盖大部分常见问答。非标自动化设备的调试难点从来不在某一个点上而在于跨领域的知识整合。BnlAiCtrl 帮你把操作层无代码化了AI 助手帮你把经验层知识化了两者配合整个设备开发的效率会明显提升。下一篇规划里我们会重点拆解 AI 助手如何结合视觉图像进行缺陷特征检索如果你正在做视觉检测类项目可以先关注我们下一篇见。