简介:《电力需求响应信息模型 第1部分:集中式空调系统》为T/CEC 239.1—2019标准PDF,面向集中式空调系统自动需求响应终端、接口设计与开发人员,也适合电力公司、设备制造商及科研人员了解负荷侧互动建模与设备接入要求。包内共1个PDF文件,约396KB,单文件结构便于检索和随查随用。内容围绕建模原则、数据类型、通用包与专用包展开,并附需求响应能力计算方法资料性附录,可用于梳理空调负荷可调潜力、统一数据交换口径及指导终端接口落地。已有306人学习,表明该方向具备一定参考需求。读者可据此理解集中式空调参与电网需求响应的信息结构,为后续协议对接、终端开发和节能策略设计提供标准依据。
1. 需求响应信息模型:为什么集中式空调的“可调能力”需要一套共享词汇
电网调度下发一条指令,希望某栋写字楼把空调负荷降下来 300 千瓦,持续两小时。物理上完全可行——主机降频、水泵减档、冷冻水温度上调,建筑内短时间并不会明显不适。但真正卡住联调的往往不是控制算法,而是“降多少、降多久、现在能不能降”这三个问题,主站、网关、终端各说各话:有的把功率当成裸浮点数、有的用瓦有的用千瓦、有的用本地时间有的用 UTC。需求响应信息模型要解决的就是这件事:把集中式空调系统在需求响应业务中涉及的对象、属性和关系,用一套能被终端、网关、主站共同理解的结构描述出来。它的价值不在于模型本身多优雅,而在于让“可调能力”从一句口头承诺,变成一个可以被查询、被校验、被结算的数据事实。
2. 点表为何撑不住需求响应:通用包与专用包的分层决策
2.1 点表模型在需求响应场景下失效的三个原因
在楼宇自控里,最常见的数据组织方式是点表:一个寄存器地址对应一个值,比如“1 号机组的冷冻水出水温度 = 7.2℃”。这种组织方式对现场监控足够用,但一旦把它平移到需求响应业务,问题立刻暴露。第一个问题是语义缺失——点表只知道“这里有一个 7.2”,却不知道这个 7.2 是温度、是设定值还是告警阈值;第二个问题是缺少关系——点表描述不了“这台主机属于哪栋楼、由哪个用户签约、能参与哪几类需求响应项目”;第三个问题是单位随便——同一个温度,有的点用摄氏度、有的用 0.1℃ 整数、有的干脆用华氏度,主站拿到数据后还得反查厂家手册才能解释。
这份规范的做法是分层:先把所有设备都可能用到的“通用语义”抽出来做成通用包,再把集中式空调特有的“专业语义”放到专用包,两者拼起来才构成一个完整的设备画像。这个分层的背后是一个很朴素的工程判断——通用包和专用包各自独立演进,但二者通过引用关系绑定,避免每次新增一种设备类型就要重做整套模型。常见的实现思路是:通用包负责“这台设备是谁、归谁、能干什么”,专用包负责“这台设备具体怎么跑、能调多少”。
一个容易忽略的细节是,分层不是为了好看,而是为了让主站可以只依赖通用包就完成一次粗筛。主站不需要理解“离心式冷水机组”和“风冷螺杆机”在物理上的区别,它只要打开设备的自动化能力信息,就能判断该设备是否具备通信能力、是否支持柔性调节、走的是什么协议。粗筛通过之后,再进入专用包看具体参数。这种“先粗后细”的两段式读取,是需求响应业务在规模化的前提下还能保持主站逻辑简单的关键。
2.2 通用包:四类信息撑起设备的“身份与合约”
通用包里定义了四个信息类,每一个都对应需求响应业务里的一个实际环节。设备出厂信息类描述设备的身份——名称、ID、厂商、品牌、型号、出厂编号、出厂日期,这一类信息基本是静态的,随设备安装一次录入。设备所属用户信息类描述设备的归属关系——用户名称、用户类型、所处行业、用户编号、关口电表号、地址、经纬度、启用日期,其中用户编号要求与该用户被分配的用电客户编号保持一致,这一点决定了设备能不能和电费结算、合同管理对得上。
设备自动化能力信息类描述设备的上限能力——是否支持通信、通信方式、需求响应协议、底层协议、是否支持刚性控制、是否支持柔性调节、是否已有第三方平台接入。这一类是整个通用包里信息密度最高的,它几乎决定了调度侧对这个设备的“能力预期”。用户需求响应合约信息类描述合同约束——年度最大参与次数、已参与次数,以及通过关联端指向的设备可支持的响应项目类型,一个合约可以对应多个响应项目类型(比如同时支持分时电价和可中断响应),但每个设备只承载一个合约实例。
提示:用户需求响应合约里“年度最大参与次数”与“已参与次数”是一对容易用错的字段。前者是合同上限,后者是进度计数器,两者不应当由同一方随意改写,典型的做法是由主站侧统一维护进度,终端只读。
有一个设计选择值得单独说:合约信息类采用关联而不是内嵌的方式挂到设备上。这样一来,一台设备更换合同只需要改关联,不需要重建整个设备实例;反过来,一个合同如果要覆盖多台设备(比如整栋楼的机组统一签约),也不需要重复写多份合同数据。关联端的基数写成[1..1]到[0..n],意思是每个设备实例必须有一个合约,而合约可以关联零到多个响应项目类型——注意这里是零到多,不是一到多,允许“签了合约但暂时没指定具体项目”的中间状态。
2.3 专用包:从整机到部件,为什么要拆到部件级
专用包是这份规范的真正价值所在,它把集中式空调系统拆到了部件级。整机类型只有水冷、风冷、多联机三种枚举,但组成部件枚举明确列出了主机机组、冷(热)水泵、冷却水泵,并预留了用户自定义扩展。这个拆法的动因不是学术洁癖,而是负荷调节的物理路径就是沿部件进行的:要削减功率,最直接的手段是主机降载,其次是水泵降频、冷却塔风机降档。如果模型只描述整机总功率,那么调度侧下发的“降 30%”就只是一个抽象比例,落到设备上到底动哪个部件、动多少,完全靠终端自己猜;而拆到部件级之后,模型能明确表达“主机降 20%、冷却水泵降 30%”这样的组合动作,可执行性大大提高。
部件级建模的代价是信息量膨胀。所以规范在部件额定参数里做了一个取舍:只保留设备类型、数量、额定电流、额定电压、额定功率、额定频率、负荷率限定值七个字段,不再细分到更细的机械参数。这个取舍背后的判断是——需求响应的调度精度到千瓦级就够,再细的机械参数对调节能力评估没有实质帮助,强行建模只会增加录入负担。
同时,整机层面保留了额定参数类,包括空调类型、制冷采暖面积、平均层高、制热能效比、制冷能效比、建筑物能量损失系数。面积和层高是为后面计算热容服务的,两个能效比是为把热功率换算成电功率服务的,能量损失系数则是为估算建筑热惰性留的接口。把这些参数放在整机级而不是部件级,是因为它们描述的是“建筑 + 系统”的联合特性,并不属于任何一个单独部件。
还有一个细节:运行模式类里同时有“是否支持变频”“控制方式”“运行状态”“故障状态”“可支持的工作模式数量”“工作模式”六个属性。前四个是状态位,后两个是能力位。把状态和能力放在同一个类里,表面上看有点混,实际是为了让终端在一次上报中同时说明“我现在怎么样”和“我能怎么样”,减少主站的往返查询。这个合并是典型的工程折衷——牺牲一点类职责的纯粹性,换一次通信里的信息密度。
3. 类型系统:为什么每个物理量都必须带单位三元组
3.1 value / unit / multiplier 三件套解决的是什么问题
这份规范对物理量的处理方式很统一:不直接用裸浮点数,而是定义一个复合类型,里面固定包含 value、unit、multiplier 三个属性。value 是浮点值,unit 是一个单位符号枚举,multiplier 是一个乘数枚举。以有功功率为例,一个“300 千瓦”的值会被表达成 value=300、unit=W、multiplier=k 的组合;一个“0.3 兆瓦”的值则是 value=0.3、unit=W、multiplier=M。两者在物理上是同一个量,但在模型里保留为两种写法。
这个设计看起来有点啰嗦,但它解决的是一个真实世界里极其常见的坑:上下位系统对单位的约定不一致。点表时代,厂家手册写“功率单位 kW”,主站却按 W 解析,300 kW 就变成了 300 W,一次需求响应下来削减量差了三个数量级。把单位写进数据结构、让单位随数值一起传输,接收方就不需要依赖外部约定,读到什么单位就按什么单位解释。multiplier 单独拆出来,是为了在不改变 unit 枚举的前提下表达量级——瓦、千瓦、兆瓦都能用同一个 unit=W 加不同 multiplier 表达,避免了单位枚举的爆炸。
注意:multiplier 的枚举值只到千、兆、吉这一档,没有更细的分档。这意味着如果现场遇到微瓦级的数据,要么换算到毫瓦、要么改用别的单位,模型本身不打算覆盖所有量级。
单位枚举里列了伏安、瓦特、乏、瓦时、伏特、安培、摄氏度、帕、赫兹、摄氏度每瓦、焦耳每千克每开尔文、立方米每秒、立方米、千克每立方米、转每分钟、米每秒、勒克斯、焦耳每千克,一共十八个。这十八个基本覆盖了集中式空调系统在需求响应中可能出现的全部物理量——电学的、热学的、流体力学的、光学的都齐了。枚举不是随便列的,它是先盘点了业务里会出现哪些量、再倒推需要哪些单位,最后才定下来的。
3.2 基础类型与 ISO 8601:时间为什么必须带时区
基础类型只有六种:整型、字符串、浮点、布尔、日期时间、持续时间。前四种没什么可说的,关键是后两种。日期时间采用 ISO 8601 格式,形如yyyy-mm-ddThh:mm:ss.sss;如果要表达 UTC 时区,就在末尾追加 Z;如果要表达本地时区相对 UTC 的偏移,就写成yyyy-mm-ddThh:mm:ss.sssZ±hh:mm的形式。持续时间同样采用 ISO 8601 的PnYnMnDTnHnMnS形式,年、月、日、时、分都是整数,只有秒可以是小数。
把这个规则写进标准的动因很明确——需求响应是一个跨时区、跨系统、跨结算周期协作的业务。同一条“今晚 20:00 开始削峰”的指令,如果主站和终端对“今晚”的理解差了一个时区,整个响应窗口就会整体偏移一小时,结算数据直接作废。统一要求带时区偏移,等于在数据层面把“这是哪个时刻”这件事说死,不再依赖任何一方的本地时钟约定。
持续时间用 ISO 8601 而不是简单的秒数,也是同样的考虑。秒数无法区分“2 小时”和“7200 秒”在语义上的差异——前者可能隐含“以小时为调度粒度”的业务约定,后者则只是一个绝对时长。用结构化表示,业务侧就能在解析时保留这层语义。
提示:日期时间末尾的 Z 不是装饰。如果只写
2024-07-01T20:00:00,接收方无法判断这是本地时间还是 UTC,跨系统对接时这类数据几乎一定会被误读。
在实现上,字符串编码统一是 UTF-8,长度不设限;整型和浮点的范围也不设限。这个“三不设限”看起来很不严谨,实际是有意为之——需求响应业务里字符串基本只承载名称、编号、地址,长度天然不会失控;数值范围不设限,则是为了给未来更大容量的设备留出空间,避免模型因为“最大只能表示 65535”之类的问题被卡住。
3.3 枚举扩展机制:x-{User-defined} 的用意
规范里几乎每一个枚举类型都留了一个x-{User-defined}的扩展位。用户类型枚举只有工业、商业、居民三类加一个扩展位;通信方式枚举只有本地人机界面、本地通信端口、本地无线、本地有线、远程无线五种加一个扩展位;需求响应协议枚举只有行业标准协议加两个国际协议版本加扩展位;底层通信协议、需求响应项目类型、控制方式、故障状态都遵循同样的模式。
这个扩展位的设计意图需要说清楚。封闭枚举的问题是:一旦现场遇到枚举里没列到的情况,要么数据被丢弃,要么被迫映射到一个不准确的已有值,两种做法都会让下游拿到错的信息。开放一个字符串前缀x-的扩展位,等于给现场留了一条“表达新情况”的通道,同时通过前缀明确标记“这是一个非标准值”,下游遇到不认识的值时可以选择忽略而不是报错。
扩展机制也不是没有代价。它把兼容性责任部分转移给了实现方——主站必须能优雅处理不认识的x-值,终端也必须保证自己扩展的值不会和未来的标准值撞车。所以规范同时规定了扩展位只在“现有枚举都不适用”时使用,能映射到已有值的尽量映射,不要滥用扩展。
4. 从出厂信息到可削减功率:一张空调设备的完整能力声明链路
4.1 四个通用类与六个专用类如何拼成一个实例
把通用包和专用包放在一起看,一个集中式空调设备在需求响应里的完整描述大致是这样一条链路:先通过出厂信息确定设备身份,再通过用户信息确定归属和结算对象,再通过自动化能力确定通信与控制的边界,再通过合约确定参与的响应项目类型和次数上限,然后进入专用包,用整机额定参数和部件额定参数描述物理能力,用运行模式和实时信息描述当前状态,用温湿度参数描述环境边界,最后用需求响应能力类给出“能增加多少功率、能削减多少功率、能持续多久”的结论。整条链路里,前四类是跨设备通用的,后六类是集中式空调专属的。
这个链路里有一个容易被忽略的顺序问题:需求响应能力不是独立算出来的,它依赖前面的参数。整机的制冷采暖面积、平均层高、能效比决定了热容换算的基础,部件的额定功率和数量决定了物理上限,温湿度参数里的设定温度和允许温度区间决定了可调空间。把这些依赖关系显式建模,好处是能力值可以被追溯——主站拿到一个 300 kW 的削减能力,可以顺着链路查到它是基于多大面积、多大温差、多长时间算出来的,而不是一个没有出处的数字。
下面是一段用 JSON 表达的片段,只截取设备身份和自动化能力两块,用来说明通用包在实例化之后大概长什么样:
{ "EQProductInfo": { "EqName": "离心式冷水机组", "EqID": "CH-01", "SupplierName": "某设备厂商", "BrandName": "某品牌", "DeviceModel": "LS-500", "ProductNum": "20240101-001", "ProductDate": "2024-01-01T09:00:00+08:00" }, "EQAutoAbilityInfo": { "ComAbility": true, "ComMode": "LocalCommport", "DRProtocol": "OpenADR-b", "UnderlyingProtocol": "BACnet", "On-OffAbility": true, "Flexability": true, "ThirdPartyPlatform": false } }这段片段里值得注意的字段有三个。ComMode取LocalCommport,表示设备通过本地通信端口(比如 RS485)接入,而不是直接走远程无线,这对现场布线有直接含义。DRProtocol取OpenADR-b,表示设备自身能直接和远程主站对话,不需要经过中间网关做协议转换。Flexability为 true,表示设备支持柔性调节,而不只是开关式的刚性控制——这一位决定了后续能不能下发“降 30%”这种连续量指令,还是只能下发“开/关”。三个字段合起来,实际上已经把“这台设备能怎么被调”说清楚了。
4.2 温度与流量参数:可调空间的物理边界在哪里
温湿度参数类是整个专用包里字段最多的类之一,包括室内设定温度、室内平均温度、室内平均相对湿度、室外平均温度、室外平均相对湿度、冷凝器进出口温度、蒸发器进出口温度、采暖水送水与回水温度。这些字段不是凑数的,它们共同划定了可调空间的物理边界。
以制冷工况为例,室内设定温度和室内平均温度之间的差,反映的是当前空调系统偏离目标的程度;室内平均温度和用户允许的最高温度之间的差,才是需求响应真正能动用的“温度缓冲”。缓冲越大,同样的持续时间下能削减的功率越多;缓冲越小,削峰动作就必须更短、更温和,否则室内温度会突破舒适边界。冷凝器和蒸发器的进出口温度则描述了冷源侧的运行状态,主机负荷率、冷冻水流量这些量都可以从这几个温度间接推断出来,它们决定了降载动作会不会触发主机自身的保护逻辑。
流量、风速、压力这几类参数在模型里也有对应,但它们更多是作为诊断和校验用的辅助信息,不直接进入需求响应能力计算。这种“主计算只依赖少数关键参数、其余作为校验”的做法,在工程上很常见——它保证了计算逻辑足够简单,同时保留了现场排查时需要的上下文。
4.3 需求响应能力计算:从温差到千瓦的换算过程
规范附录里给出了可削减功率和可增加功率的计算方法。以制热工况为例,假设响应前建筑物内空调已经处于平稳运行状态,即制热量与建筑物热量消耗相匹配,基于采暖面积、平均层高、空气密度、定压比热容、设定温度、允许最低温度、制热能效比和持续时间,可以算出可削减的有功功率。制冷的公式结构完全对称,只是把制热能效比换成制冷能效比、把“设定温度减允许最低温度”换成“允许最高温度减设定温度”。
下面这段 Python 按附录里的公式结构做一次数值演算,参数是虚构的,只用来展示公式各因子如何影响结果:
# 采暖工况可削减有功功率估算(对应附录 A.1 的公式结构) rho = 1.177 # 空气密度,kg/m3,约 300K 干空气 c = 1.005 # 定压比热容,kJ/(kg*K),约 300K S = 12000.0 # 采暖面积,m2 H = 4.0 # 平均层高,m T_set = 24.0 # 用户设定采暖温度,摄氏度 T_limit = 18.0 # 允许最低室内温度,摄氏度 COP = 3.4 # 制热能效比 t_dr = 2 * 3600.0 # 需求响应持续时间,秒 # P_DR,decreased = rho * c * S * H * (T_set - T_limit) / (t_dr * COP) P_decreased = (rho * c * S * H * (T_set - T_limit)) / (t_dr * COP) print(round(P_decreased, 2), "kW")这段代码里,S * H把面积换成了体积,rho * c * 体积 * 温差得到的是建筑物内空气从设定温度降到允许最低温度所能释放的热量,除以持续时间就得到平均热功率,再除以制热能效比就换算成电功率。跑出来的结果大约在 13 到 14 kW 这个量级。这个数字对于一万多平米的建筑来说偏小,原因不在计算错误,而在公式本身只把空气的热容算进去了,没有算墙体、家具、楼板的热惰性。这也正是规范把它放在资料性附录而不是规范性条文里的原因——它是估算的起点,不是结算的依据。
注意:公式里的温差项是“设定温度减允许最低温度”,方向不能反。如果写成“允许最低温度减设定温度”,结果会是负数,功率就变成了“可增加”而不是“可削减”。
从工程视角看,这个公式的价值不在于精确,而在于它把“可调能力”拆成了几个可解释的因子:面积越大、层高越高、温差越大、持续时间越短、能效比越高,可削减功率就越大。主站拿到一个能力值,可以顺着这几个因子判断它是否合理;如果一台两万平米的机组报上来的削减能力只有 1 kW,那大概率是某个参数填错了,而不是设备真的这么弱。
5. 现场联调常见问题:单位错位、时区漂移与枚举扩展的踩坑记录
5.1 现象:功率数值对了三个数量级,原因:unit 和 multiplier 被拆开处理
联调时最典型的一类翻车是数值看起来“差不多”,但差了整整三个数量级。主站看到 300,以为是 300 W,实际上终端发的是 value=300、unit=W、multiplier=k,合起来是 300 kW。问题的根源往往不在模型定义,而在实现——有些终端在序列化时把 multiplier 当作可选项丢掉,只发 value 和 unit;有些主站在反序列化时只读 value,把 unit 和 multiplier 当作展示用的元数据。
解决这件事的办法不是靠约定,而是靠校验。主站侧应当在接收数据时强制检查:凡是物理量类型,unit 和 multiplier 必须同时存在,缺一就拒收并记录原始报文;终端侧应当在发送前做一次回读,把 value、unit、multiplier 三者重新拼成物理量再和源数据比对,不一致就阻断发送。这两道校验加进去之后,数量级错位基本不会漏到结算环节。
5.2 现象:响应窗口整体偏移一小时,原因:DateTime 缺了时区偏移
某次跨区域联调,主站下发的“20:00 开始”在某片区的终端上变成了“21:00 开始”,导致响应窗口和其他片区对不齐。查下来的原因是终端在解析日期时间时用了本地时区,而主站发的是带 Z 的 UTC 时间,两边差了一个时区的偏移。规范里其实已经写明了带时区的格式,问题出在实现没有严格执行。
解决思路是把时区处理收敛到解析入口一处:所有 DateTime 在读入时统一转换成 UTC 再进入业务逻辑,输出时再按需转回本地时区;序列化时必须带 Z 或带 ±hh:mm,不允许出现裸的本地时间字符串。另外,持续时间和时刻要分开处理——持续时间用 ISO 8601 的 PnYnMnDTnHnMnS 形式,不要和时刻混用同一个解析函数,否则很容易把“2 小时”解析成一个绝对时间点。
5.3 现象:设备上报被拒,原因:把可选项当成了必选项
规范里不少属性明确标了“可选项”,比如品牌、出厂编号、出厂日期、经纬度、启用日期、负荷率限定值、工作模式数量等。现场实现时经常出现两个方向的错误:一是终端把所有可选项都填上,遇到没有的数据就填 0 或空串,反而让主站误判;二是主站把可选项当成必选项校验,缺一个就整条报文拒收。
正确的做法是区分“字段缺失”和“字段为空”两种语义。可选项没有值时,应当整个字段不出现,而不是出现一个空值;主站校验时只对必选项做存在性检查,对可选项做“出现则校验格式、不出现则跳过”的处理。这个区别在跨厂商对接时尤其重要,因为不同厂商对“空值”的表示方式差异很大。
5.4 现象:扩展枚举值被对端丢弃,原因:没有提前协商扩展字面量
枚举扩展位x-{User-defined}在规范里是允许的,但实际联调时经常出现扩展值传到对端后被静默丢弃的情况。原因是对端实现只认枚举里列出的标准字面量,遇到x-开头的值直接当作非法值处理。
解决这件事不能靠单方面改代码,而要在对接前做一次扩展字面量协商:双方把各自会用到的扩展值列出来,确认对端能够识别或至少能够透传。主站侧最稳妥的做法是把不认识的扩展值原样记录并透传给下游,而不是在入口处丢弃;终端侧则要保证扩展值只在确实没有标准值可用时才使用,能映射到标准值的尽量映射。
5.5 现象:合约关联端基数理解错,原因:把一对多当成了一对一
通用包里的合约信息类通过关联端指向响应项目类型,基数写的是[1..1]到[0..n]。有些实现把这个关联当成一对一处理,导致一个用户如果同时签约了分时电价和可中断响应两个项目,第二个项目就挂不上去。
这个问题的根源是对关联端基数的理解偏差。起始端[1..1]表示每个合约实例必须存在,目标端[0..n]表示一个合约可以关联零到多个响应项目类型。实现时应当把关联建模成一对多,数据结构上用数组而不是单值;同时注意[0..n]里的零是允许的,也就是合约可以先建立、后指定项目类型,不要在校验时强制要求至少一个。
6. 建模取舍与验证:为什么“可计算”比“可传输”更值得优先保证
把这份规范从头到尾读一遍,会发现它在很多地方做了同一个方向的取舍:宁可牺牲一点传输效率,也要保证数据到了对端之后能被正确解释和正确计算。单位三元组比裸浮点数占空间,带时区的日期时间比本地时间字符串长,把设备拆到部件级比只报总功率字段多,这些选择在传输层面都是“不划算”的。但它们换来的是另一件事——主站拿到数据后不需要再翻厂家手册、不需要再和终端对时区、不需要再猜削减量是怎么算出来的。
这个取舍背后有一个现实约束:需求响应业务的参与方太多,设备厂商、集成商、电网侧、用户侧各自有自己的系统和约定,任何依赖“双方事先说好”的设计在规模上去之后都会崩。把约定写进数据结构,让数据自带解释,是唯一能扛住参与方数量增长的做法。代价是模型变重,但对一个以结算为终点的业务来说,可解释性比传输效率重要得多。
这套建模思路也有明确的边界。它擅长描述“设备能做什么”和“设备现在是什么状态”,不擅长描述“设备在下一秒会怎么变”。需求响应能力类给出的是一个静态的、基于参数的估算值,不是实时预测值。如果业务需要更精细的滚动预测,就需要在这套模型之上再叠一层时序数据通道,而不是指望把预测逻辑塞进信息模型里。理解这个边界,比记住模型里有多少个类更重要。
验证一套实现是否符合这份规范,我一般会走三步。第一步是构造一个最小实例:只填必选项,跑一遍序列化和反序列化,确认往返之后所有字段的值、单位、乘数都不变。第二步是构造一个边界实例:把 multiplier 设成 M、把 DateTime 设成带负时区偏移、把扩展枚举用上,看对端能不能正确处理。第三步是构造一个错误实例:故意漏掉 unit、故意把温差写反、故意让合约关联端为空,确认系统会报错而不是静默接受。三步都过,才算真正把模型用起来了。
从那以后我每次接入新的设备类型,都会先把这几步验证脚本跑一遍,哪怕对接方拍胸脯说“我们的实现肯定没问题”。希望帮到你。
本文还有配套的精品资源,点击获取