news 2026/10/2 6:07:21

Claude Code 100个真实案例 - 用AI做工控SCADA监控界面(仪表盘+实时数据+告警)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Claude Code 100个真实案例 - 用AI做工控SCADA监控界面(仪表盘+实时数据+告警)

1. 工控 SCADA 监控界面为什么值得用 Claude Code 做一遍

SCADA 监控界面,说白了就是把车间里的温度、压力、流量、液位这些传感器数据,变成仪表盘指针、趋势曲线和告警灯。它属于典型的"数据密度高、交互不复杂、但视觉要求专业"的前端场景。传统做法是组态软件拖控件,改一个样式要翻半天属性面板;而用 Claude Code 这类 AI 编程助手,你可以直接用自然语言描述"我要一个深色工业风的圆形仪表盘,指针式,超限变红",它会给你可运行的 Canvas 代码。

我这次要交付的是一个能本地跑起来的监控原型:Flask 后端模拟工业传感器数据,SQLite 存历史与告警,前端用原生 Canvas 画仪表盘和趋势图,每 5 秒自动刷新。整套东西不依赖任何重型框架,uv装两个包就能启动。适合谁?适合想快速验证 SCADA 交互逻辑的工控开发者、想拿 AI 练手全栈的初学者,以及需要给客户演示监控原型但不想买组态授权的人。

核心检索词先摆出来:Claude Code 生成 SCADA 监控界面、Canvas 仪表盘实时数据绑定、工控告警规则配置。这三个词贯穿全文,你照着做就能得到一个可演示的监控大屏。

为什么选 Claude Code 而不是纯手写?因为 Canvas 画仪表盘的弧线角度、指针旋转、刻度映射这些数学细节,手写容易错且调试烦。Claude Code 能一次性把startAngle = Math.PI * 0.75到endAngle = Math.PI * 2.25的映射逻辑写对,你只需要微调颜色和尺寸。实测下来,一个 160x160 的仪表盘从描述到出图,大概两轮对话就能定稿。

下面按"后端数据 → 前端大屏 → 联调验证 → 排障"的顺序走,每一步都给可复制的命令和代码。你不需要工控背景,只要会复制粘贴和看浏览器控制台。

2. TaoToken 前置:统一 Key 与 API 通道怎么配

在开始写代码之前,先把 AI 编程助手的通道配好。Claude Code 本身是命令行工具,它需要一个大模型 API 来驱动。TaoToken 提供统一的 Key 和 API 通道,官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (这个地址不加 UTM 参数,直接用于配置)。

配置分三件套:Base URL、Key、Model ID。这三样缺一不可,很多人报 401 就是因为 Key 没带上,或者 Base URL 写成了带路径的完整地址。

先拿 Key。打开 https://taotoken.net/api-keys ,登录后创建一个新 Key,复制出来。注意 Key 只在创建时显示一次,丢了就重新建一个。拿到后建议先存到环境变量里,别硬编码进代码:

export TAOTOKEN_API_KEY="sk-你的key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"

如果你用的是 Claude Code 命令行,它的配置文件通常在~/.claude/settings.json或项目根目录的.claude/settings.json。写入下面这段 JSON,路径和字段名保持原样:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的key", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }

注意ANTHROPIC_BASE_URL后面不要加/v1,TaoToken 的通道会自动处理版本路径。Model ID 按你实际可用的填,上面这个只是示例。配完后在终端跑claude命令,如果能看到交互提示符而不是报错,说明通道通了。

如果你用的是 Cline 或 CC Switch 这类带 MCP 的客户端,配置逻辑一样:Base URL 填https://taotoken.net/api,Key 填你创建的,Model ID 填对应模型。Cline 的 MCP 配置在cline_mcp_settings.json,Codex 的 auth 在auth.json,字段名不同但三件套不变。

这里有个坑要提前说:有些人把 Base URL 写成https://taotoken.net/api/v1,结果请求 404。TaoToken 的 API 基址就是https://taotoken.net/api,后面的路径由客户端自己拼。还有,Key 如果泄露了,去 https://taotoken.net/api-keys 删掉重建,别想着改。

配好通道后,你就可以让 Claude Code 帮你生成 SCADA 代码了。下面进入正题。

3. 可复制配置:项目结构与关键代码片段

先建项目骨架。用uv管理依赖,比 pip 快且干净:

mkdir scada-system && cd scada-system uv init uv add flask flask-cors mkdir -p templates data

目录结构最终长这样:

scada-system/ ├── app.py # Flask 后端 + 数据模拟 + 告警逻辑 ├── templates/ │ └── index.html # SCADA 大屏(Canvas 仪表盘 + 趋势图) ├── data/ │ └── scada.db # SQLite 自动生成 └── pyproject.toml

后端app.py的核心是四张表:设备表、传感器表、采集数据表、告警表。传感器表里要存上下限和预警上下限,这是告警规则的基础。下面这段是建表和模拟数据生成的关键部分,你可以直接复制:

# app.py 片段 - 传感器表结构 db.execute(''' CREATE TABLE IF NOT EXISTS sensors ( id INTEGER PRIMARY KEY AUTOINCREMENT, sensor_code TEXT NOT NULL UNIQUE, device_id INTEGER NOT NULL, sensor_type TEXT NOT NULL, unit TEXT DEFAULT '', current_value REAL DEFAULT 0, upper_limit REAL DEFAULT 100, lower_limit REAL DEFAULT 0, warning_upper REAL DEFAULT 80, warning_lower REAL DEFAULT 20, status TEXT DEFAULT '正常', is_deleted INTEGER DEFAULT 0 ) ''')

数据模拟用正弦波加高斯噪声,再以 2% 概率产生异常值,这样趋势图看起来才像真实工业数据:

class SensorSimulator: PROFILES = { '温度': {'base': 65, 'amplitude': 15, 'noise': 3, 'unit': '℃'}, '压力': {'base': 2.5, 'amplitude': 0.8, 'noise': 0.2, 'unit': 'MPa'}, '流量': {'base': 120, 'amplitude': 30, 'noise': 5, 'unit': 'm³/h'}, '液位': {'base': 60, 'amplitude': 20, 'noise': 2, 'unit': '%'}, } @classmethod def generate_value(cls, sensor_type, t=None): if t is None: t = time.time() profile = cls.PROFILES.get(sensor_type, {'base': 50, 'amplitude': 10, 'noise': 2}) value = (profile['base'] + profile['amplitude'] * math.sin(t / 60) + random.gauss(0, profile['noise'])) if random.random() < 0.02: value *= random.choice([1.3, 1.5, 0.5, 0.7]) return round(value, 2)

告警规则配置在/api/simulate接口里,四级判断:超上限、接近上限、超下限、接近下限。超限记"严重",接近记"警告":

if value >= sensor['upper_limit']: alarm_type, alarm_level, threshold = '超上限', '严重', sensor['upper_limit'] elif value >= sensor['warning_upper']: alarm_type, alarm_level, threshold = '接近上限', '警告', sensor['warning_upper'] elif value <= sensor['lower_limit']: alarm_type, alarm_level, threshold = '超下限', '严重', sensor['lower_limit'] elif value <= sensor['warning_lower']: alarm_type, alarm_level, threshold = '接近下限', '警告', sensor['warning_lower']

前端index.html的仪表盘用 Canvas 画。核心是角度映射:把[min, max]映射到[0.75π, 2.25π],指针旋转用ctx.rotate。这段代码 Claude Code 生成得很准,你只需要改颜色:

function drawGauge(canvas, value, min, max, unit, label, warnUpper, color) { const ctx = canvas.getContext('2d'); const w = canvas.width, h = canvas.height; const cx = w / 2, cy = h / 2 + 5; const radius = Math.min(w, h) / 2 - 15; const startAngle = Math.PI * 0.75; const endAngle = Math.PI * 2.25; const range = endAngle - startAngle; const valueAngle = startAngle + Math.min(Math.max(value - min, 0), max - min) / (max - min) * range; // 值弧 ctx.beginPath(); ctx.arc(cx, cy, radius, startAngle, valueAngle); ctx.strokeStyle = value >= warnUpper ? '#ff1744' : color; ctx.lineWidth = 12; ctx.lineCap = 'round'; ctx.stroke(); // 指针 ctx.save(); ctx.translate(cx, cy); ctx.rotate(valueAngle - Math.PI / 2); ctx.beginPath(); ctx.moveTo(0, -(radius - 20)); ctx.lineTo(-3, 10); ctx.lineTo(3, 10); ctx.closePath(); ctx.fillStyle = '#e0e0e0'; ctx.fill(); ctx.restore(); }

趋势图用折线加渐变填充,时间轴取首、中、尾三个点标时间。自动刷新用setInterval每 5 秒调一次/api/simulate再重新拉数据。这些片段拼起来就是一个完整的监控大屏。

4. 验证请求与成功结果:本地跑起来看效果

代码写完后,启动后端:

uv run python app.py

看到Running on http://127.0.0.1:5000就说明起来了。浏览器打开这个地址,你会看到一个深色工业风的大屏。第一次打开数据是空的,点右上角"初始化数据"按钮,它会调/api/demo/scada创建 5 台设备和 10 个传感器,并生成过去 60 分钟的历史数据。

初始化后你应该看到:顶部统计栏显示设备总数、运行中、传感器数、告警传感器、未处理告警;左侧四个圆形仪表盘显示温度、压力、流量、液位,指针指向当前值;右侧设备状态列表带绿/红/灰圆点;下方趋势曲线随下拉框切换传感器;告警列表显示超限记录,带"处理"按钮。

验证接口是否正常,可以用 curl 直接打:

curl http://127.0.0.1:5000/api/stats/overview

返回类似:

{"code":0,"data":{"total_devices":5,"running_devices":5,"total_sensors":10,"alarm_sensors":0,"unhandled_alarms":0}}

再手动触发一次采集:

curl -X POST http://127.0.0.1:5000/api/simulate

返回每个传感器的模拟值和是否告警。多打几次,你会在告警列表里看到记录,因为模拟器有 2% 概率产生异常值。点"处理"按钮,告警会从未处理列表消失。

趋势图验证:选一个温度传感器,等 5 秒自动刷新一次,曲线会向右滚动。如果你手动点"模拟采集"按钮,曲线会立即更新。仪表盘指针在超限时会变红,设备状态圆点会闪烁。

成功标志就三个:仪表盘指针动、趋势曲线滚、告警列表有记录且能处理。三个都满足,说明前后端联调通了。

5. 本篇常见错排查:401、local proxy failed、reading choices

第一个高频错误是 401。报错长这样:

Error: 401 Unauthorized - invalid api key

原因通常是 Key 没配、Key 过期、或者 Base URL 写错。排查顺序:先确认ANTHROPIC_API_KEY环境变量存在且以sk-开头;再确认ANTHROPIC_BASE_URL是https://taotoken.net/api而不是带/v1的地址;最后去 https://taotoken.net/api-keys 看 Key 是否被删。三件套(Base URL + Key + Model ID)任何一个错都会 401。

第二个错误是local proxy failed。这个通常出现在客户端配置了本地代理但代理没启动,或者 Base URL 指向了不存在的本地端口。检查你的客户端配置里有没有http://127.0.0.1:xxxx这类地址,有的话删掉,直接用https://taotoken.net/api。如果你在 Cline 的 MCP 配置里写了本地转发,也要改成直连。

第三个错误是reading choices相关,报错类似:

TypeError: Cannot read properties of undefined (reading 'choices')

这是响应结构解析失败。原因一般是 Model ID 填错,或者客户端期望 OpenAI 格式但服务端返回了别的格式。解决:确认 Model ID 是 TaoToken 支持的模型名,别自己编。如果你在 Codex 的auth.json里配,字段名要对齐,Base URL 和 Key 的位置别写反。

第四个是 OAuth 相关报错。Claude Code 有时会尝试 OAuth 登录,如果你已经用 API Key 配置了,它会冲突。解决办法是在 settings.json 里显式设置ANTHROPIC_API_KEY,并且不要同时保留 OAuth token。删掉~/.claude/下的 token 缓存文件再重启。

第五个是前端报Failed to fetch。这通常是 Flask 没启动,或者端口被占。检查app.py是否在跑,5000 端口是否被其他程序占用。换端口的话改app.run(port=5001),前端 fetch 地址也要同步改。

第六个是仪表盘不显示。打开浏览器控制台看有没有Cannot read properties of null。多半是gaugeGrid里 canvas 还没创建就去 draw 了。确保loadRealtimeData先创建 DOM 再画图,或者加个setTimeout延迟。

6. 语义一致 CTA:把通道和文档用起来

整套 SCADA 原型跑通后,你会发现真正的瓶颈不在前端画图,而在数据通道和模型调用。TaoToken 的统一 Key 和 API 通道在这里的作用是:你不需要为每个 AI 编程客户端单独配一套凭证,一个 Key 走通 Claude Code、Cline、Codex 这些工具。

如果你在排障或接入阶段卡住了,直接看接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有各客户端的配置示例。Key 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,创建和删除都在这里。

想先验证模型对话效果,不写代码,可以用模型对话页面:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,直接发一句"帮我写一个 Canvas 仪表盘函数"看返回质量。

如果你打算长期用 AI 做编码和 Agent 任务,Coding Plan 更划算:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,适合高频调用场景。

控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,可以看调用量和余额。

Claude Code 专用接入页:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有 settings.json 的完整模板。

最后给个实用技巧:SCADA 原型的告警阈值别写死在代码里,放到数据库的warning_upper和warning_lower字段,前端通过接口读。这样你改阈值不用重启服务,演示时也灵活。我试过把温度预警上限从 85 改成 80,刷新页面就生效,客户看着很直观。

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

Claude Code 上下文窗口全景解析:从 CLAUDE.md 到 Hooks 的配置实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

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

漫剧台词字体字号的3档参数基准与5种风格匹配对照

漫剧台词的字体字号如何选择&#xff1f;核心答案是&#xff1a;气泡对白24-30pt、底部字幕34-38pt、标题强调44-50pt&#xff0c;三档基准覆盖绝大多数9:16竖屏漫剧场景。特种猫的成片中心在合成音画时内置字幕渲染管线&#xff0c;导出720P/1080P/4K三档分辨率时自动适配对应…

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

Codex 开源 harness 全面了解:从 auth.json 到 Base URL 的接入配置拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

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

襄阳电器渠道商关注松下新风全热交换器价格与产品选型信息

襄阳电器渠道商为何关注松下新风全热交换器近年来&#xff0c;随着居民对室内空气环境关注度的持续提升&#xff0c;住宅新风设备正从单一通风功能向通风换气、空气过滤、热湿交换与空气清洁相结合的方向发展。特别是在冬夏季室内外温差较大的湖北地区&#xff0c;普通换气设备…

作者头像 李华