news 2026/10/27 19:36:07

Intouch 2014 R2写SQL Server 2012与Excel日报实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Intouch 2014 R2写SQL Server 2012与Excel日报实战

简介:这份文档面向使用 WonderWare Intouch 2014 R2 构建 SCADA 数据存储与报表的工程人员,聚焦 Intouch 连接 SQL Server 2012、写入数据并由 Excel 报表系统读取展示的实施流程,适合有一定 HMI 与数据库基础、需要配置对照和排错参考的读者。压缩包共 1 个 doc 文件,约 2.48MB,以图文操作说明为主,涵盖数据库身份验证与权限、建库建表、标记名字典、SQL 访问管理器绑定、SQLConnect/SQLDisconnect/SQLInsert 脚本、Excel VBA 报表模板引用及数据库文件附加恢复等内容。已有 531 人学习,文档把变量与字段对应、定时写入条件和报表取数思路串联起来,可作为现场实施时的步骤手册与问题排查清单。

1. 从一台 HMI 到报表:Intouch 2014 R2 写 SQL Server 2012 到底卡在哪

Intouch 2014 R2 接 SQL Server 2012,再用 Excel 做日报,这套组合在现场不算新,但真正落地时,卡人的往往不是脚本会不会写,而是连接、绑定、时间格式三处没有对齐。这份操作文档拆的是 Intouch 2014 R2 IDE 环境下的数据库写入与 Excel 报表链路:先在 SQL Server 2012 里把库表、登录名和时间格式定死,再在 Intouch 里用标记、绑定列表和 SQLConnect/SQLInsert 把实时数据送进表,最后用 Excel 模板把数据拉出来形成日报。

它适合正在做 SCADA 数据归档、HMI 报表改造、历史库迁移的现场工程师,也适合刚接手 Intouch 项目、需要按步骤复现一套最小闭环的人。文档里的截图和脚本片段不能代替现场参数,但能让你少在“连上了却没数据”“报表日期错一天”这类问题上反复翻车。下面按数据库、Intouch、Excel、排查、恢复五段推进,每一步都落到可抄的参数和脚本。

2. 先把数据库链路搭稳:SQL Server 2012 登录、库表与时间格式

2.1 身份验证模式与登录名:别在 sa 上省事

Intouch 通过 SQL 访问管理器往 SQL Server 2012 写数据,第一步不是打开 Intouch,而是把数据库这边的入口留对。常见做法是进 SQL Server Management Studio,在对象资源管理器里右键服务器节点,打开“属性”,左侧选“安全性”,把服务器身份验证改成“SQL Server 和 Windows 身份验证模式”,确定后重启 SQL Server 服务。这个动作不重启不生效,现场经常有人改完直接去 Intouch 里连,结果一直报登录失败。

登录名不要图省事直接给 sa。新建一个只用于 SCADA 写入的登录名,比如scada_user,在“常规”页设密码,在“服务器角色”里只给public和必要的db_datareader、db_datawriter,在“用户映射”里勾选目标数据库,默认架构用dbo。如果只是写入一张日报表,不需要给sysadmin。我踩过一次坑:测试时用 sa 连得好好的,交付后现场安全策略把 sa 禁用,脚本整段失效,最后只能临时改连接串。血泪经验是,连接串里的用户名从一开始就按最小权限建,后面换库、换机都不用返工。

配置项建议值说明
身份验证模式SQL Server 和 Windows 身份验证模式改完重启服务
登录名scada_user专用账号,不用 sa
服务器角色public不给 sysadmin
数据库角色db_datareader、db_datawriter只读写目标库
默认数据库SCADA_DB与连接串 Initial Catalog 一致

提示:登录名属性里的“用户映射”要勾选目标库,否则连接串能连上服务器,但一执行 SQLInsert 就提示对象不存在或权限不足。

2.2 建库建表:列名和数据类型先对齐

库名和表名在 Intouch 绑定列表里会直接出现,所以建表时就要把列名定成后面不会改的样子。下面是一个最小日报表结构,表名TDays,字段包括记录时间、计算机名、班次、温度、压力、状态。数据类型要跟 Intouch 标记类型对得上:时间用datetime,计算机名和班次用nvarchar(50),模拟量用float,状态用int。如果 Intouch 里的内存消息是字符串,数据库列却建成了float,绑定列表保存时不一定报错,但写入时会出现空值或类型转换失败。

-- 建库与日报表,库名、表名、列名都要和 Intouch 绑定列表逐字对应 CREATE DATABASE SCADA_DB; GO USE SCADA_DB; GO CREATE TABLE TDays ( RecordTime datetime NOT NULL, -- 记录时间,对应 Intouch 时间标记 NodeName nvarchar(50) NOT NULL, -- 计算机名,对应 NodeName ShiftName nvarchar(20) NULL, -- 班次 Temperature float NULL, -- 温度模拟量 Pressure float NULL, -- 压力模拟量 RunState int NULL -- 运行状态 ); GO

这段 SQL 的重点不在语法,而在列名和类型。RecordTime不要写成Time,因为Time在部分查询工具里容易和保留字冲突;NodeName要和 Intouch 标记名一致,后面绑定列表才能按列名匹配。float对应 Intouch 的实型或整型都可以,但整型写入float会有小数位显示差异,报表里要统一格式化。表建完后先手动插一条测试数据,确认SELECT * FROM TDays能查出来,再去 Intouch 里配连接,别把数据库问题和 HMI 问题混在一起查。

2.3 日期时间格式:Intouch 与 SQL 的隐形接口

Intouch 里的时间标记常见是内存消息,存的是格式化字符串,比如GetDateTimeS。如果操作系统短日期是yyyy/M/d,而 SQL Server 的datetime按yyyy-MM-dd HH:mm:ss解析,中间就可能出现月份和日期颠倒。文档里专门提到在操作系统“日期和时间”里改格式,这一步不是玄学,而是让 Intouch 写出的字符串和数据库能认的格式一致。我一般会把短日期改成yyyy-MM-dd,长时间改成HH:mm:ss,并在 Intouch 脚本里拼成yyyy-MM-dd HH:mm:ss再写入。

-- 写入前统一转换,避免依赖客户端区域格式 INSERT INTO TDays (RecordTime, NodeName, ShiftName, Temperature, Pressure, RunState) VALUES (CONVERT(datetime, '2024-06-18 14:05:00', 120), N'HMI01', N'A', 26.5, 0.82, 1);

CONVERT(..., 120)是 ODBC 标准格式yyyy-mm-dd hh:mi:ss,比依赖默认区域设置稳。Intouch 侧如果直接用SQLInsert走绑定列表,时间列的值来自绑定变量,那个变量就要在脚本里先格式化成同样样式。不要一边用2024/6/18,一边指望 SQL Server 自动猜。报表按日汇总时,日期错一天会让整张日报对不上,这种问题在 Excel 里看是“公式错了”,根子其实在写入端。

3. Intouch 侧连接与写入:标记、绑定列表和 SQLConnect 脚本

3.1 标记名字典:Connid1、NodeName、WSQLS 各管什么

Intouch 的标记名字典是整条链路的账本。文档里建了三个关键标记:Connid1是内存整型,用来保存 SQLConnect 返回的连接号;NodeName是内存消息,用来存本机计算机名;WSQLS是内存离散,用来标记“这一轮是否已经写过数据库”。这三个标记不要随手起名,因为后面脚本里会反复引用,改一次名要全篇替换。GetDateTimeS如果也要用,同样建内存消息,专门存格式化后的时间字符串。

标记名类型用途注意
Connid1内存整型保存数据库连接号SQLConnect 的第一个参数
NodeName内存消息保存本机计算机名用 GetNodeName 获取
GetDateTimeS内存消息保存格式化时间与 SQL datetime 对齐
WSQLS内存离散标记是否已写入不能在同一轮立即复位

Connid1的值不是数据库名,也不是表名,而是 SQLConnect 执行后拿到的连接句柄。后面 SQLInsert 第一个参数就传它。NodeName用来做多机判断,比如只允许HMI01写库,避免两台 HMI 同时插同一条日报。WSQLS是防重复写入的闸门:插入前查它是不是 0,插入后置 1,换日或确认后再复位。这个标记如果复位太早,后面会反复插入,报表行数直接翻倍。

3.2 绑定列表:变量与表列的逐项映射

Intouch 左侧工具视图里有 SQL 访问管理器,里面的绑定列表负责把 Intouch 变量映射到数据库表列。新建绑定列表时,名称要和 SQLInsert 的第三个参数一致,比如都叫TDays。列表里逐行添加变量,左列是 Intouch 标记名,右列是数据库列名,类型要对应。文档里强调“变量名与表单列名对应、数据类型与表单列数据类型对应”,这句话要拆开看:变量名不一定要和列名同名,但绑定列表里的列名必须和数据库表列逐字一致;类型必须能互转,不能把字符串硬塞进float。

绑定列表名称:TDays Intouch 变量 数据库列名 类型 GetDateTimeS RecordTime datetime NodeName NodeName nvarchar(50) ShiftName ShiftName nvarchar(20) Temperature Temperature float Pressure Pressure float RunState RunState int

绑定列表保存后,不要急着写脚本。先手动在 Intouch 里改一个模拟量,用 SQL 访问管理器的测试功能或者直接跑一次 SQLInsert,看数据库里有没有新行。如果行数增加但列值是空,优先查列名大小写和类型;如果一行都没有,优先查连接号和绑定列表名。绑定列表名和表名相同容易混,脚本里第一个"TDays"是表名,第二个"TDays"是绑定列表名,少一个引号就报参数错误。

3.3 应用程序脚本:连接、插入、断开的三段式

应用程序脚本分“启动时”“运行时”“关闭时”。连接放在启动时或条件脚本里,插入放在条件脚本里,断开放在关闭时。文档里的连接脚本是SQLConnect(Connid1,"provider=sqloledb;Data Source=HMI01;Initial Catalog=SCADA_DB;UserID=scada_user;Password=ChangeMe_2024");,五个部分用分号隔开,每部分前加等号。Provider用sqloledb,Data Source写计算机名或实例名,Initial Catalog写库名,User ID和Password写专用账号。现场换机时,这五处要一起改,不能只改 Data Source。

' 应用程序脚本:启动时建立连接,并取本机名 SQLConnect(Connid1, "provider=sqloledb;Data Source=HMI01;Initial Catalog=SCADA_DB;UserID=scada_user;Password=ChangeMe_2024"); GetNodeName(NodeName, 131);

这段脚本的逻辑是:先用Connid1接住连接号,再用GetNodeName把本机名放进NodeName。131是节点名类型参数,现场按 Intouch 函数说明确认,不要照抄到别的版本。连接失败时,Connid1通常不会是有效连接号,后面 SQLInsert 会连续报错,所以启动脚本执行完要在诊断窗口看一眼返回值。

' 条件脚本:$Second==5 表示每分钟第 5 秒执行一次,不是每 5 秒 IF $Second == 5 THEN IF NodeName == "HMI01" THEN IF $Minute >= 58 THEN IF WSQLS == 0 THEN SQLInsert(Connid1, "TDays", "TDays"); WSQLS = 1; ENDIF; ENDIF; ENDIF; ENDIF;

这里要纠正一个常见误解:$Second==5是每分钟的第 5 秒触发一次,不是每 5 秒触发一次。原文注释写“每 5 秒钟执行一次”,现场如果按这个理解去算报表频率,会以为一小时写 720 次,实际只写 60 次。要每 5 秒执行,常见写法是($Second MOD 5) == 0,但还要配合WSQLS或边沿标记,避免同一秒内重复触发。$Minute >= 58表示临近整点才写,适合小时日报;如果要做分钟级,条件要改成按分钟窗口判断,不能只靠$Second。

' 关闭时脚本:退出应用前断开连接,避免连接号泄漏 SQLDisconnect(Connid1);

SQLDisconnect放在“关闭时”脚本里,参数就是连接号。不要放在运行时脚本里反复执行,否则下一次 SQLInsert 会拿一个已断开的连接号。插入脚本里WSQLS = 1之后不要立即写WSQLS = 0,否则这一轮刚置位就被复位,下一轮条件再满足时会重复插入。复位应该放在换日逻辑或人工确认后的脚本里,比如IF $Hour == 0 AND $Minute == 0 THEN WSQLS = 0; ENDIF;,并且要确认当天第一条数据已经写好。

4. Excel 报表模板:从 VBA 引用到参数日报页

4.1 Excel 侧准备:引用、宏权限与模板结构

Excel 报表模板不是打开就能连数据库,先要在 VBA 编辑器里加引用。常见做法是打开“开发工具”里的 Visual Basic,进“工具”菜单的“引用”,至少勾选 Visual Basic for Applications、Excel 对象库、ActiveX Data Objects 6.1 Library。前两个通常默认有,第三个决定你能不能声明ADODB.Connection。如果列表里没有 ADO 6.1,找对应版本的 ActiveX Data Objects 库,不要随便勾一个不存在的名称。勾完后在代码里写Dim conn As ADODB.Connection,能编译通过才算引用生效。

宏权限也要提前处理。模板放在受信任位置,或者在打开时允许宏运行。现场常见问题是报表在工程师电脑上能刷新,到了操作员站提示“宏已被禁用”,不是代码错,是安全策略拦了。模板结构建议分三页:控制面板放开始日期、结束日期、刷新按钮;参数日报放查询结果和汇总公式;说明页放连接参数和修改记录。控制面板的日期单元格用yyyy-mm-dd格式,避免 VBA 取到文本后拼 SQL 出错。

工作表用途关键内容
控制面板输入查询条件开始日期、结束日期、刷新按钮
参数日报展示查询结果表头、数据区、班次汇总
说明页交接说明连接串字段、修改记录

4.2 控制面板与参数日报:把查询参数收口

控制面板不要放太多自由文本。开始日期和结束日期用日期格式单元格,刷新按钮绑定一个宏,宏里先校验两个日期都不为空、开始不大于结束,再把日期转成yyyy-mm-dd字符串传进 SQL。参数日报页的表头固定,数据区从A6开始,查询前先清空旧数据,避免上一次结果残留造成“看起来刷新了其实没变”。如果报表要按班次汇总,汇总公式放在数据区右侧,用SUMIF按班次列统计,不要用整列引用拖慢刷新。

' 控制面板参数校验:日期为空或顺序错误时直接退出 Dim dStart As Date, dEnd As Date dStart = Sheets("控制面板").Range("B3").Value dEnd = Sheets("控制面板").Range("B4").Value If dStart = 0 Or dEnd = 0 Then MsgBox "请先填写开始日期和结束日期" Exit Sub End If If dStart > dEnd Then MsgBox "开始日期不能大于结束日期" Exit Sub End If

这段校验的逻辑是先取单元格值,再判断是否为 0。Excel 日期为空时取出来是 0,不是空字符串。B3、B4是示例单元格,实际模板按你的布局改。校验通过后再进数据库查询,失败时直接退出,不执行清空和粘贴,避免把原有报表数据抹掉。

4.3 用 ADO 读 SQL Server:连接串与查询落点

VBA 里读 SQL Server 2012 可以用 ADO 的SQLOLEDB提供程序。连接串和 Intouch 侧保持同一套库名、用户名,但密码不要硬编码在模板里长期留存。常见做法是放在说明页的隐藏单元格,或者每次刷新时弹窗输入。下面这段代码演示从TDays按时间范围取数并粘贴到参数日报页,查询列要和报表表头顺序一致。

' 按日期范围查询并粘贴到参数日报,连接串中的库名、用户名按现场替换 Dim conn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim sqlText As String Set conn = New ADODB.Connection conn.ConnectionString = "Provider=SQLOLEDB;Data Source=HMI01;Initial Catalog=SCADA_DB;User ID=scada_user;Password=ChangeMe_2024;" conn.Open sqlText = "SELECT RecordTime, NodeName, ShiftName, Temperature, Pressure, RunState " & _ "FROM TDays WHERE RecordTime BETWEEN ? AND ? ORDER BY RecordTime" Set cmd = New ADODB.Command Set cmd.ActiveConnection = conn cmd.CommandText = sqlText cmd.Parameters.Append cmd.CreateParameter("pStart", adDBTimeStamp, adParamInput, , dStart) cmd.Parameters.Append cmd.CreateParameter("pEnd", adDBTimeStamp, adParamInput, , dEnd) Set rs = cmd.Execute Sheets("参数日报").Range("A6").CurrentRegion.ClearContents Sheets("参数日报").Range("A6").CopyFromRecordset rs rs.Close conn.Close Set rs = Nothing Set cmd = Nothing Set conn = Nothing

ConnectionString里Data Source是计算机名或实例名,Initial Catalog是库名,User ID和Password是数据库登录名。cmd.Parameters.Append用两个时间参数替代字符串拼接,能避开日期格式和单引号问题。CopyFromRecordset从A6开始粘贴,表头要提前写在A5:F5,否则数据会顶掉表头。查询结束后关闭记录集和连接,避免 Excel 进程残留。刷新后先看行数,再看时间范围,最后看汇总公式有没有覆盖到新数据区。

5. 避坑与排查:连接、写入、报表刷新中的 5 个翻车点

5.1 连接串写错一个分号,SQLConnect 直接返回失败

现象是 Intouch 启动后诊断窗口没有有效连接号,SQLInsert 连续报错,Excel 报表也查不到新数据。原因通常不是数据库没开,而是连接串五段里某一段写错:Data Source写成了库名,Initial Catalog写成了表名,或者User ID和Password之间少了分号。现场换机后只改了Data Source,忘了改Initial Catalog,连接能建立,但插入时提示表不存在。解决方法是把连接串拆成五段逐项核对:Provider 是否为sqloledb,Data Source 是否为计算机名或实例名,Initial Catalog 是否为库名,User ID 是否为专用账号,Password 是否与登录名一致。改完先在 SSMS 里用同一账号登录,再回 Intouch 跑启动脚本。

5.2 绑定列表列名对不上,SQLInsert 静默丢数

现象是数据库表行数在增加,但某些列一直是空值,或者整行只有时间列有值。原因多数是绑定列表里的列名和数据库表列名大小写、下划线不一致,或者类型不匹配。Intouch 的绑定列表不一定会把所有不匹配都拦下来,尤其是字符串写进数值列时,可能写入空值。解决方法是先把绑定列表导出或截图,和TDays表结构逐列对照,列名逐字一致,类型按datetime、nvarchar、float、int对齐。改完绑定列表后删掉旧测试行,重新跑一次 SQLInsert,用SELECT TOP 10 * FROM TDays ORDER BY RecordTime DESC看最新一行每一列是否都有值。

5.3 把$Second==5当成每 5 秒,写入频率算错

现象是报表按小时汇总时行数明显偏少,或者现场以为每分钟写 12 次,实际只写 1 次。原因是$Second的范围是 0 到 59,$Second==5只在每分钟第 5 秒成立一次,不是每 5 秒成立一次。要每 5 秒执行,常见写法是($Second MOD 5) == 0,但同一秒内可能被多次扫描,所以还要配合WSQLS或边沿标记。解决方法是先明确报表粒度:小时日报用$Minute>=58 AND $Second==5就够;分钟级报表用($Second MOD 5)==0加防重复标记。改完在诊断窗口打印时间戳,连续观察 10 分钟,确认触发次数和预期一致。

5.4 WSQLS 置位后立即复位,重复插入或漏插

现象是同一分钟出现多条相同记录,或者该写的时候没写。原因是插入脚本里WSQLS = 1后面紧跟着WSQLS = 0,标记刚置位就被复位,下一轮条件满足时又插一次。另一种情况是复位放在换日脚本里,但换日时没有确认当天数据已经写入,导致漏插。解决方法是把置位和复位分开:插入前判断WSQLS == 0,插入后只置 1,不复位;复位放在换日或人工确认后的独立条件里,并且加IF $Hour == 0 AND $Minute == 0 THEN WSQLS = 0; ENDIF;。改完用数据库行数和时间戳核对,同一分钟只能有一条。

5.5 Excel 位数与驱动不匹配,VBA 报“未找到提供程序”

现象是 Intouch 写库正常,Excel 刷新时弹“未找到提供程序”或“连接失败”。原因常见于 Excel 位数和数据库驱动位数不一致:32 位 Excel 调不到 64 位提供程序,或者反过来。解决方法是先看 Excel 的“关于”里是 32 位还是 64 位,再确认机器上装的SQLOLEDB或对应提供程序是否匹配。临时排查可以把连接串换成 Intouch 里已经验证可用的同一段,排除库名和账号问题。长期做法是统一现场 Office 位数,或者在模板说明页写清楚依赖的提供程序名称,交接时一起交付。

6. 数据库恢复与报表验证:把 .mdf/.ldf 附加回历史库后怎么核对

数据库恢复这一段经常被当成“拷文件”,实际最容易出问题的是路径和权限。把SCADA_DB.mdf和SCADA_DB_log.ldf整个目录拷贝到历史库服务器的D:\SCADA_DB\下,打开 SSMS,右键“数据库”选“附加”,在“要附加的数据库”里点“添加”,定位到SCADA_DB.mdf,确定后看“数据库详细信息”里两个文件路径是否都指向新目录。如果只带 mdf 不带 ldf,SQL Server 会尝试重建日志,可能失败;如果目录权限不够,附加会报操作系统错误 5。常见做法是让 SQL Server 服务账户对D:\SCADA_DB\有读写权限,附加前先备份原库,避免高版本附加到低版本后无法回退。

附加完成后别急着打开 Excel,先跑三条核对。第一条看行数和时间范围,第二条看关键列空值,第三条看重复记录。下面 SQL 可以直接在 SSMS 里执行,表名按实际替换。

-- 核对 1:行数与时间范围 SELECT COUNT(*) AS RowCnt, MIN(RecordTime) AS MinTime, MAX(RecordTime) AS MaxTime FROM TDays; -- 核对 2:关键列空值 SELECT COUNT(*) AS NullCnt FROM TDays WHERE RecordTime IS NULL OR NodeName IS NULL OR Temperature IS NULL; -- 核对 3:同一分钟重复记录 SELECT RecordTime, NodeName, COUNT(*) AS Cnt FROM TDays GROUP BY RecordTime, NodeName HAVING COUNT(*) > 1;
核对项通过标准不通过先查
行数与时间范围覆盖报表周期,无断档写入条件、WSQLS 复位
关键列空值时间、计算机名、模拟量非空绑定列表列名与类型
重复记录同一分钟同一机台只有一条置位复位顺序、触发频率

最后做端到端复现:在 Intouch 里触发一次写入,记下时间戳;在 SSMS 里查最新一行;打开 Excel 控制面板,把开始和结束日期覆盖到该时间,点刷新,看参数日报是否出现同一条记录。三处时间一致、列值一致,链路才算通。从那以后我每次换计算机名或库名,都先把连接串、绑定列表、报表查询三处一起改,再走一遍附加库核对,不给后面留后悔药。希望帮到你。

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

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

Linux内核启动核心:start_kernel()函数详解

1. start_kernel() 函数概述start_kernel() 是 Linux 内核启动过程中最核心的函数之一,它位于 init/main.c 文件中。当内核完成早期的汇编语言初始化后,控制权就会交给这个用 C 语言编写的函数。可以说,start_kernel() 是内核从"原始状态…

作者头像 李华
网站建设 2026/10/27 19:35:04

Unity事件中心设计:发布订阅解耦、类型安全与调试实践

Unity 项目做到第三个功能模块的时候,几乎一定会撞上同一类问题:UI 脚本里直接攥着玩家对象的引用,战斗脚本里又反过来调用 UI 的刷新方法,改一个数值要顺藤摸瓜改五六个文件,改完还不敢确定有没有漏。我接手过的中后期…

作者头像 李华
网站建设 2026/10/27 19:31:57

AI视觉模型PixelMentor在影视后期制作中的应用

1. 项目概述:PixelMentor如何用AI重塑影视后期流程在影视后期制作中,修图师常常需要花费数小时反复调整同一帧画面——从色彩平衡到构图细节,每个环节都依赖经验判断。PixelMentor的出现改变了这一现状。这个开源项目通过调用多模态AI视觉模型…

作者头像 李华
网站建设 2026/10/27 19:27:36

PyTorch张量与GPU加速:设备迁移、显存管理与计时实战

张量(Tensor)是 PyTorch 里所有计算的载体,GPU 加速(GPU Acceleration)则是让这个载体真正跑起来的那套机制。很多人学完 CPU 上的张量创建、切片、广播、矩阵乘,觉得挺顺,一到真机就懵了&#…

作者头像 李华
网站建设 2026/10/27 19:25:12

SRS不是文档而是需求包:结构化需求规约与可验证性工程实践

简介:这份DOC文档面向软件需求分析人员、项目经理及测试与QA团队,提供IBM软件需求规约的格式模板要求与案例参考,用于解决SRS结构不清、需求收集与组织不规范等问题。文档共1个DOC文件,约150KB,篇幅紧凑,便…

作者头像 李华
网站建设 2026/10/27 19:23:54

数字图像处理中的光圈模糊技术详解

1. 光圈模糊的数字图像处理实现在摄影和图像处理领域,光圈模糊是一种模拟真实相机光圈特性的重要技术。它能够为数字图像添加自然的景深效果,让主体突出而背景柔和,这种效果在专业摄影和影视后期中应用广泛。不同于简单的高斯模糊&#xff0c…

作者头像 李华