news 2026/10/6 14:39:57

组态王V6.5源码解析:从SCADA架构到设备驱动二次开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
组态王V6.5源码解析:从SCADA架构到设备驱动二次开发

简介:组态王V6.5完整版源码是工业自动化领域经典组态软件的原始工程,面向工控软件开发者、自动化专业学生及二次开发团队,提供从图形界面到设备通信的落地参考。该版本无需深入底层语言即可通过拖拽控件、脚本编程完成过程控制与数据采集,源码公开能帮助读者理解组态软件的核心机制。压缩包共211个文件,包括38个cpp实现代码、43个头文件、52个bmp图形资源、9个ico图标,以及文本、帮助文档和工程配置信息,整体仅142KB,代码结构与依赖关系清晰。目前已有479人学习下载。深入研读可掌握图形组件渲染与交互、MODBUS/OPC等协议封装、C/C++脚本引擎嵌入、历史数据存储与数据库接口设计,为二次开发或自主构建监控系统提供宝贵参考。

1. 工业组态软件源码:组态王 V6.5 完整版到底能拿来干什么

做自动化项目的人,对组态王这三个字应该都不陌生。它是国内工控圈使用率极高的一套 HMI/SCADA 组态软件,从早期的 KingView 6.0 到后来的 6.5、6.55、6.60,一直到现在的 6.60 SP4,几乎每个做上位机监控、数据采集、设备联动项目的人都碰过它。但大多数同行手里拿到的只是安装包,能看到的只是封装好的组态环境,真正见过这套软件内部源码的人极少。这份「组态王 V6.5 完整版源码.7z」的价值就在这里——它不是给你装好一个能跑的组态王,而是把组态王核心工程摊开在你面前,让你能看清一个工业组态软件从变量管理、画面组态、动画连接、实时数据库到设备通讯驱动这一整套链路是如何实现的。

它的适用人群很明确:做工业上位机二次开发的工程师、需要把组态能力嵌进自己产品里的软件开发者、以及想深入研究 SCADA 系统架构的从业者。源码这种东西,不是拿来跑一下就完事的,而是拿来读、拿来改、拿来拆的。V6.5 虽然版本不算新,但组态软件的框架在 6.x 系列里是高度稳定的,读懂这一版,再去接触新版本会轻松很多,中间若干章节里我会把源码目录结构、编译配置、通讯协议封装、变量绑定机制和常见编译坑逐一拆开讲,尽量让你拿到手后能少走弯路。这份资源对熟悉 C/C++ 和 Windows 平台开发的人收益最大,纯新手建议先补一点 Win32 和 MFC 基础再看源码。

2. 拿到源码先别急着编译:目录结构与工程骨架要读懂

源码包解开之后,第一眼看到一堆文件夹和 .dsp/.dsw 工程文件,很多人会直接双击去编译,然后被一堆报错吓退。这里必须先花半小时把目录骨架过一遍,搞清楚每个目录对应的是什么模块,否则后面任何一步排查都无从下手。

我这边拿到的包解开后,顶层目录大致是这样的结构(以实际解压为准,不同打包者对目录命名可能略有调整)。

目录/文件对应模块说明
KingView主程序工程组态王运行环境核心,含画面、动画、变量绑定
Draw画面组态编辑器负责图形绘制、图元管理、图库加载
DB实时数据库模块变量管理、数据归档、历史数据存储
Comm通讯层串口/网络设备驱动框架与协议解析
Net网络通讯模块分布式站点通讯、远程数据交换
Tool工具集配方、报表、报警等附属功能
Include公共头文件跨模块使用的数据结构与接口声明
ReadMe.txt说明文档编译顺序和依赖关系的提示

第一步先把Include目录下的公共头文件翻一遍,这里面定义的是整个系统的数据结构核心。比如变量结构体、设备结构体、图元结构体,这些类型是跨模块共享的,任何模块改动这部分都要同步。我一般会先看变量相关的结构体定义,因为组态软件里所有操作最终都归结为「对变量的读和写」。

接下来看DB目录下的工程。实时数据库是组态王的中枢,所有画面上的动画连接、所有通讯采集的数据、所有报表和报警,最终都汇到这一层。V6.5 的数据库核心是一个内存数据表加哈希索引的结构,变量按名称哈希到对应的槽位,每个槽位保存变量的当前值、质量戳、时间戳和上下限属性。编译DB工程时,建议用 Debug 版先跑通一次,观察它初始化时读配置文件的过程,能对这个模块的启动流程有非常直观的认识。

// 变量结构体示例,定义在 Include 目录的 var_def.h 中(路径以实际为准) typedef struct tagVarItem { char szName[32]; // 变量名,组态时用户定义的名称 WORD wType; // 变量类型:0-离散 1-整型 2-实型 4-字符串 float fValue; // 当前值(实型/整型统一按 float 保存) int nState; // 质量戳:0-正常 1-通讯故障 2-超限 DWORD dwTimeStamp; // 最后一次写入的时间戳 float fHiLimit; // 上限报警值 float fLoLimit; // 下限报警值 struct tagVarItem* pNext; // 哈希冲突时链式指针 } VAR_ITEM;

这段代码是变量管理的核心结构。注意fValue统一用float保存整型和实型,这种设计在组态软件里很常见——画面显示的浮点、历史存储的数值不需要完美区分精度,统一成 float 后转换逻辑大幅简化。nState质量戳则对应组态王运行画面里变量颜色的变化,通讯断了之后这个字段会置成非零值,画面上就能立刻变色提示。pNext是链式指针,说明哈希冲突没有用开放寻址而是链地址法,这在实时性要求较高的场景是合理选择。

DB模块初始化时做的事典型流程是:读配置文件 → 创建共享内存区 → 初始化哈希表 → 注册全局回调函数。这些逻辑从DB工程里db_init()入口追踪,大概两百行左右就能理清整条链路。

Draw工程则是页面表现层的核心。组态王画面上的矩形、管道、阀门、仪表盘,本质上都是图元对象,每个图元有自己的坐标、画笔、画刷和动画连接属性。V6.5 里图元对象用了一个类似 COM 的接口设计,每种图元实现统一接口,比如Draw、HitTest、Serialize,这样主程序遍历图元链表时不用区分具体类型,统一调用接口即可。

编译顺序上,先DB再Draw再KingView是常见做法,因为KingView主程序依赖前两者的链接库。Comm和Net可以独立编译,不影响主框架运行。

3. 设备通讯驱动框架:串口采集模块的协议封装与变量映射

组态软件和 PLC、仪表、变频器打交道,靠的是设备驱动。V6.5 的驱动框架设计得比较有代表性,它把「设备」抽象成统一接口,每种设备协议(比如 Modbus RTU、西门子 PPI、三菱 FX 系列)都实现这个接口。这套框架放在Comm目录下,是读源码时最有价值的部分之一,因为它能直接指导你自己写驱动接入非标设备。

核心接口大致包含如下几个函数,每个驱动都必须实现:

// 设备驱动接口,位于 Comm 目录的 dev_if.h typedef struct tagDevOps { int (*Open)(void* pDev, const char* szCfg); // 打开设备,解析串口参数/网络参数 int (*Read)(void* pDev, int nRegType, int nStartAddr, int nCount, void* pBuf); int (*Write)(void* pDev, int nRegType, int nStartAddr, int nCount, const void* pBuf); int (*Close)(void* pDev); // 关闭设备,释放句柄 } DEV_OPS;

Open负责和物理设备建立连接。串口场景下,这里要设置波特率、数据位、停止位、校验位;网络场景下则是连接 IP 和端口。Read是采集的入口,参数里的nRegType表示寄存器类型,比如 Modbus 协议里区分线圈、离散输入、保持寄存器、输入寄存器,这个参数直接决定报文中功能码的组装方式。nStartAddr和nCount对应读取的起始地址和数量,返回后数据写入pBuf。Write是反向下发控制指令用的,参数语义和Read一致。

组态王画面上的一个变量是怎么和这个驱动挂上钩的?这是读源码时必须看懂的一条主线。变量配置表里有三个关键字段:设备名、寄存器类型、寄存器地址。运行时,组态王根据设备名找到对应的驱动实例,然后发起一次Read请求,把返回的数据写进变量结构体里。

// 变量轮询过程中的关键代码逻辑,伪码提炼自 Comm 模块 void PollDevice(void* pDev, VAR_BIND* pBind, int nCount) { for (int i = 0; i < nCount; i++) { VAR_BIND* pB = &pBind[i]; if (pB->bDirty) { // 如果下发位被置位,走写操作 pDev->ops->Write(pDev, pB->nRegType, pB->nStartAddr, 1, &pB->fWriteVal); pB->bDirty = 0; } else { // 否则走读操作 pDev->ops->Read(pDev, pB->nRegType, pB->nStartAddr, 1, &pB->fReadBuf); } } }

这里可以看到组态软件的轮询机制:每个变量绑定一条采集通道,主循环定期扫描,根据标志位决定是下发还是采集。这个模型很直观,自己写驱动时也按这个思路扩展:注册DEV_OPS,定义好寄存器类型枚举,把数据回填到变量绑定的缓冲里就行。

串口驱动的具体实现里,有一个细节值得关注:V6.5 的串口收发用了重叠 IO(Overlapped I/O),也就是异步读写。不少二次开发者在仿写时习惯用简单的同步ReadFile,结果发现一个设备通讯超时会导致整个采集线程卡住,这就是没采用异步模型的问题。读Comm里串口实现的源码,会把CreateFile带FILE_FLAG_OVERLAPPED的打开方式和WaitForSingleObject等待事件的配合看明白,这个设计能保证多个设备同时采集互不阻塞。

通讯帧的解析也是重点。以 Modbus RTU 为例,源码里CRC16校验函数是单独实现的,读报文时先收完整帧再算 CRC,比对后决定是否丢弃。组态王把这种协议解析逻辑封装在Comm内部,外层不需要关心报文细节——对二次开发来说,你只需要在配置里指定设备协议类型和串口参数即可。但要自己接非标设备,这个报文解析层就得自己写了。

我一般建议读完Comm框架后,先拿一个虚拟串口工具做联调试验,把自己写的最小驱动跑通一遍,再回来对比 V6.5 的实现,收获会比单纯读源码大很多。

4. 编译与配置实战:从源码生成可运行组态环境的完整流程

源码拿到手,最重要的验证方式就是编译通过、能跑起来。V6.5 是 VC6 时代的工程,用新版 Visual Studio 直接打开大概率报错,但处理得当的话,转成 VS2010 以上工程也就十几分钟的事。

先确认依赖环境。V6.5 源码依赖的第三方库主要是加密狗 SDK(Sentinel 加密狗运行时)、SQL Server 的客户端接口库,以及 VC6 的运行库。如果缺少加密狗相关的头文件和导入库,编译主程序KingView时会报找不到HASP相关的函数定义。源码包里如果没有附带这些依赖,可以先把加密狗相关代码用宏屏蔽掉,或者保留动态加载方式但运行时忽略授权逻辑。

常见的迁移步骤如下,以 VS2010 为例:

  1. 用 VS2010 打开KingView.dsw,向导会自动提示转换工程格式,确认转换。
  2. 在项目属性里把字符集改为「使用多字节字符集」,否则TCHAR相关的字符串处理会大量报错。
  3. 把_WIN32_WINNT宏设为0x0501,避免调用了只在老系统上存在的 API 导致链接错误。
  4. 若报缺少winsock.h或afxsock.h,在预编译头文件里补充#include <winsock2.h>和#pragma comment(lib,"ws2_32.lib")。
  5. 编译DB和Draw成功后,生成静态库或 DLL,再编译KingView主程序。
# 编译顺序参考(以命令行编译为例,实际开发可用 IDE 操作) # 1. 编译数据库模块 nmake /f DB.mak # 2. 编译画面组态模块 nmake /f Draw.mak # 3. 编译通讯模块 nmake /f Comm.mak # 4. 链接主程序 nmake /f KingView.mak

注意命令里的nmake是 VC6 自带的 Make 工具,VS2010 环境需要打开「VS2010 命令行提示符」工具才能正确设置环境变量。如果提示找不到cl.exe,说明环境变量没加载,直接到vcvarsall.bat的目录下执行一次再编译即可。

工程转换过程中,有几个容易翻车的点。VC6 的dsw工程文件在 VS 高版本下转换后,默认会生成新的项目格式,但某些老的mak文件不会被自动处理,这时需要在项目属性里手动指定附加包含目录和附加库目录。另一个高频问题是源文件编码,VC6 时代的中文注释默认是 GB2312 编码,VS2010 以上版本默认按 UTF-8 解析,会出现乱码甚至编译错误。我在处理时一般用 Visual Studio 的「文件 → 高级保存选项」把编码统一改成「简体中文(GB2312)- 代码页 936」,然后关闭「检测 UTF-8 文件签名」选项。

编译通过后,下一步就是配置运行环境。V6.5 源码编出来的程序和正版安装包生成的运行环境不太一样,它需要手动创建工程的配置文件。组态王的工程文件本质是一个目录,里面有*.pic(画面文件)、*.dbs(数据库文件)、*.dev(设备配置),运行时读取这些文件来构建画面和数据采集链路。源码包里如果能找到示例工程,直接用它来加载最快;找不到的话,按下面方式创建一个最小工程:

# 新建组态王项目目录,存放配置和数据 mkdir D:\MyKingViewProject # 从源码目录复制默认配置文件模板 copy D:\KingView_Dev\Template\*.tpl D:\MyKingViewProject\ # 启动主程序并指定项目路径 KingView.exe D:\MyKingViewProject

运行阶段如果画面能加载出来、能拖入图元、变量能注册,那说明核心链路已经通。此时点击运行按钮,画面进入运行时状态,串口驱动的配置参数在运行时读的是项目目录下的设备配置文件。要验证通讯是否正常,可以用串口调试助手配合虚拟串口工具模拟一个从站设备,然后在组态王里绑定一个变量到这个设备上,观察数值变化。

这里还要重点提醒:V6.5 年代的组态王运行时对实时性要求较高,运行时系统的定时器优先级、串口轮询周期、画面刷新频率这些参数都写死在配置中心。源码里可以找到这些参数的默认值,调大或调小会影响画面流畅度和通讯占用率,具体调参会在下一章展开。

5. 避坑与排查:源码编译、运行和二次开发中的高频问题

这一章整理的都是实际拆解和编译过程中踩过的坑,每条都是「现象 → 原因 → 解决」的结构,希望你遇到时能直接对症下药。

坑 1:编译KingView主程序时大量 LNK2001 未解析外部符号。现象:链接阶段报几十个LNK2001 unresolved external symbol,函数名大多和数据库模块、画面模块相关。 原因:VC6 的工程依赖顺序没有被正确转换,DB/Draw 模块没有先编译,或者编译产物没放到主程序能找到的目录。 解决:先确认DB、Draw、Comm三个工程都编译成功,然后在主工程属性里的「链接器 → 附加依赖项」中手动添加三个模块生成的.lib文件路径。如果源码里这些模块是以 DLL 形式提供导入库的,也要确保.lib文件和对应.dll在同一个目录或系统 PATH 中。

坑 2:编译时中文注释变成乱码,甚至引发诡异语法错误。现象:某些//注释行的中文内容报错,比如error C2001: 常量中有换行符,但代码本身看起来完全没有问题。 原因:源码文件是 GB2312 编码,编译器按 UTF-8 解析时把中文注释里的字符误判成了字符串终止符或非法字符。 解决:把所有.cpp、.h文件统一转码为 GB2312,或者关闭 IDE 的自动 UTF-8 检测。工程级处理最稳妥,在.vcxproj文件的<ItemDefinitionGroup>里额外指定编译选项/source-charset:.936,让编译器强制按 GB2312 读取源文件。

坑 3:程序启动后画面加载空白,变量列表一个都看不到。现象:运行时画面是一片灰色,变量管理窗口显示无变量,数据库模块没有初始化成功。 原因:多半是程序启动时没有找到项目目录。组态王主程序读取项目路径通常来自初始化配置文件或注册表项,直接从源码首次启动时没有设置过路径,导致数据库模块建表失败。 解决:手动设置注册表项,把工程路径指到你的项目目录。注意 32 位程序在 64 位 Windows 下运行时,注册表会被重定向到Wow6432Node,路径要找对。更简单的方式是在源码里找到读取配置的入口,改成相对路径或默认路径,从InitializeProjectPath()这类函数下手。

坑 4:串口通讯一次都没成功,变量全部是故障状态。现象:设备管理器里能看到串口设备,VSPD 虚拟串口也建好了,但组态王运行画面上变量全部显示故障色,数据完全不刷新。 原因:最可能是通讯参数没对上,波特率、数据位、停止位、校验位任何一个不一致都会导致报文无法被解析。另一个常见原因是在 V6.5 源码的驱动配置里没有正确指定串口号,导致Open失败。 解决:先用串口调试助手工具直接监听两个虚拟串口的收发数据。如果组态王发出了请求但从站没有应答,说明从站配置有问题;如果请求发出后完全看不到数据,说明串口参数或Open逻辑有误,回Comm模块里检查Open的实现,确认CreateFile的串口名是否和系统设备名一致。

坑 5:画面上的动画连接没有反应,拖进去的变量不会动。现象:组态画面是画出来了,运行时管道颜色不变、仪表指针不动,但变量列表显示数值是实时变化的。 原因:画面对象和变量之间的绑定关系没有正确建立。V6.5 中图元的动画连接是在组态时通过对话框配置的,但这些配置最终序列化到了画面文件里。如果画面文件的序列化格式和运行时解析格式不一致,绑定关系就会失效。 解决:检查画面文件的保存版本和运行时读取版本是否一致。如果源码里Draw模块的序列化代码被改动过,要用旧版画面文件重新做一次组态,或者在Unserialize函数里打印调试日志看绑定关系是否解析成功。另一种办法是直接在源码里写死一个测试图元,初始化时强制绑定一个变量,跑通后再恢复。

坑 6:历史数据存储到 SQL Server 失败。现象:历史曲线能实时画出来,但数据库里查不到任何记录,或者写入时报连接错误。 原因:V6.5 的DB模块对 SQL Server 的连接串是写死在配置文件里的,默认指向(local)实例,而现在机器上装的 SQL Server 可能是命名实例或本机没有安装。 解决:在源码里找到连接串配置的位置,改成实际运行的 SQL Server 实例名,关闭 SQL Server 的远程连接限制,保证目标数据库允许 TCP/IP 连接。如果是测试用途,也可以把历史存储模式切换成文件存储,省掉数据库依赖。

这些坑覆盖了源码从编译到运行的完整链路,实际项目里遇到报错时,先按「现象 → 原因 → 解决」的思路排查,基本上能定位到问题源头。

6. 二次开发的三种进阶方向:自定义驱动、协议扩展与画面组件增强

源码的价值最终体现在能改出适合自己的东西。组态王 V6.5 的源码框架至少支持三个方向的自定义开发,这里逐个说明实现路径和需要注意的技术边界。

第一个方向是自定义设备驱动。工业现场总有非标设备,厂商协议不公开或者格式怪异,组态王自带的驱动列表里没有对应的处理方案。在这种场景下,基于Comm模块的驱动接口框架写一个私有驱动是最常见的选择。参考第 3 章的DEV_OPS接口,实现Open、Read、Write三个函数,再注册到驱动工厂就行了。关键点是寄存器类型的枚举要定义清楚,比如设备内部的参数区要映射成四个寄存器类型还是扩展出第五个类型,直接决定变量绑定时的配置格式。还有一点要注意,读报文的超时设置要足够稳妥,组态王的轮询机制是串行扫描的,一个驱动的读超时会影响整个采集线程的周期。

第二个方向是通讯协议扩展。如果设备本身用的协议是 Modbus,但需要在相邻功能码上做扩展,不需要动驱动框架,只需在协议解析层里增加功能码分支。比如自定义一个功能码0x50用于批量读写浮点数组,在报文解析函数里加一个case 0x50分支即可。这个改动比写整个驱动轻得多,风险也小,但要注意组态王的通用变量保存格式是 4 字节 float,批量读写时字节序要写对,否则数值解析出来是乱的。我一般会先拿模拟器验证字节序处理逻辑,再上真实设备测试。

第三个方向是增强画面组件。V6.5 的Draw模块自带图元库,但不同类型的项目需要专属图元。比如做水处理项目的人需要水箱、水泵、阀门、管道流向动画,V6.5 自带图库里虽然有基础形状,但形态不够贴切。基于图元接口实现一个新图元类,覆盖Draw虚函数、命中测试和序列化逻辑,就能得到项目专用的图元。这个方向的难点在于运行时动画连接的属性要和图元状态变量绑定好,否则画面静态显示没问题,一进入运行状态就各种异常。

实操时我建议这样验证自己的改动是否稳定:先编译一个 Debug 版本,把运行时的画面刷新周期调大,方便肉眼观察动画行为;再跑一轮设备模拟器联调,把通讯异常、变量越界、画面切换这些场景逐个触发一遍,确认没有内存访问越界和句柄泄漏。组态软件的运行时是常驻进程,内存问题如果不及时处理,跑几小时后就容易出现画面卡死或者数据中断的情况。

另外要提一下不同 V6.5 版本间的差异。V6.5 和 V6.5 SP1 之类的补丁版本在内部接口上可能有微小差别,如果源码包的打包版本偏老,在较新的系统上运行时,某些界面库和字体渲染表现会出现兼容问题。遇到这种情形,优先在源码里查版本资源里的VERSION信息,再决定是否需要打补丁。

用这套源码做二次开发,最终产出的东西可以把组态王的能力嵌进自己的上位机软件里,也可以在原框架基础上做行业定制。从那以后,我每次做非标设备接入项目,都会先把Comm模块的驱动框架重读一遍,确认自己的新驱动完全遵循这套接口规范再动手,这个习惯帮我避开过很多协议对接上的暗坑。希望这些源码层面的细节和分析能帮到你,让你在拿到这份资源后少走几个弯路。

本文还有配套的精品资源,点击获取

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

Agent-Reach实战:让多Agent工具触达稳定、可观测、可控制

接手这个项目之前&#xff0c;我正被一套三不像的多Agent系统折腾得焦头烂额。业务方要求“让智能体自己去找人、找工具、找数据”&#xff0c;实际跑起来却是另一回事&#xff1a;A智能体明明绑定了查询订单的权限&#xff0c;却死活调不到那个接口&#xff1b;B智能体在对话里…

作者头像 李华
网站建设 2026/10/6 14:39:19

自适应斜坡补偿:解决峰值电流模式次谐波振荡的关键技术

做电源的同行应该都有这种体会&#xff1a;明明是闭环控制&#xff0c;占空比却在某个工作点突然开始高频抖动&#xff0c;电感电流波形出现一高一低的“大小波”&#xff0c;开关管和电感还跟着发出吱吱声。这个问题十有八九和峰值电流模式控制中的次谐波振荡有关&#xff0c;…

作者头像 李华
网站建设 2026/10/6 14:37:28

开发工具选型避坑指南:从生命周期到Hermes与鸿蒙调试

1. 为什么"选工具"这件事值得单独写一篇 做开发这些年&#xff0c;我见过太多项目死在工具选型这一关上。有的团队辛辛苦苦码了半年&#xff0c;结果打包环节天天报错&#xff0c;一查是当初图省事选了个没人维护的构建工具&#xff1b;有的项目功能写得挺好&#xf…

作者头像 李华
网站建设 2026/10/6 14:36:12

mac版Navicat Premium 15安装包全指南:从下载到授权排错

简介&#xff1a;mac版Navicat Premium 15安装包面向需要在macOS上统一管理多种数据库的开发者、DBA与运维人员&#xff0c;解决MySQL、MariaDB、Oracle、SQL Server等异构数据库的连接、同步、迁移与备份难题。安装包内含2000个文件&#xff0c;压缩后约154.31MB&#xff0c;常…

作者头像 李华
网站建设 2026/10/6 14:35:13

信息学奥赛一本通1196踩台阶:递推算法入门与常见踩坑全解析

听到“一本通1196”这个名字&#xff0c;很多搞信息学竞赛的同学应该会心一笑。这是《信息学奥赛一本通》递推算法章节里非常经典的一道入门题——“踩台阶”&#xff0c;题号1196。别看它题目短、背景简单&#xff0c;很多新手在这道题上栽的跟头其实不少。有的同学背下了代码…

作者头像 李华
网站建设 2026/10/6 14:33:53

Cadence AMS数模混合仿真核心原理与实战避坑指南

1. 为什么数模混合仿真不是“把模拟和数字放一起跑”那么简单&#xff1f; 很多人第一次接触Cadence AMS时&#xff0c;看到“数模混合”四个字&#xff0c;下意识就以为是&#xff1a;在Virtuoso里画个模拟电路&#xff08;比如一个运放&#xff09;&#xff0c;再连上一个Ver…

作者头像 李华