画面弹窗弹出“确认对1号主变102开关执行遥控分闸”我点下确定键两秒后断路器位置变位后台跳出一条SOE事件电压曲线出现轻微波动。很多人觉得这一步操作很平常但背后其实是IEC104规约里一整套控制机制在运转。我写这个系列的前两篇时把链路建立、遥信遥测的上行机制都聊透了这篇终于轮到控制方向——遥控和遥调。变电站自动化里讲“四遥”遥信、遥测、遥控、遥调。如果说前两者是远动的眼睛负责把现场状态和测量值传上来那遥控遥调就是远动的手要由主站反向把控制指令送下去。手不能乱伸所以IEC104在这套控制机制上加了大量约束选择执行、返送校核、超时终止、闭锁校验、设定值限值……整套流程设计得有来有回是为了在一条不太可靠的通信链路上仍然能保证断路器不会因为一个误码就误动。这篇文章对三类人最有用一是做变电站/配网自动化现场调试的工程师二是写电力监控后台或者通信管理机的研发人员三是刚接触104规约、想把遥控遥调彻底弄明白的学生。我会把报文结构、状态机、常见坑一次讲透。1. 从“看”到“操”遥控遥调在远动体系里的准确定位1.1 四遥的分工与数据流方向搞104规约先要把四遥的分工和报文方向在大脑里画清楚。名称数据类型方向典型例子遥信离散状态量子站→主站开关位置、告警信号、刀闸状态遥测连续模拟量子站→主站电压、电流、有功、无功、频率遥控离散状态控制主站→子站断路器分闸/合闸、刀闸操作遥调设定值/档位控制主站→子站变压器分接头档位、无功补偿投入量这是一个经常被忽略的关键点遥信遥测是子站向主站方向而遥控遥调是主站向子站方向。方向一变整个ASDU的设计思路就完全不一样了。上行方向的数据子站什么时候变了就什么时候发主站被动接收压力在数据组织的实时性上。下行方向的控制命令则不同主站必须主动发起一次“请求”并且等待子站确认。如果链路不稳定命令在半路丢了谁来负责重发如果子站执行了一半主站掉线了后续怎么处理这些都是在遥控遥调里必须解决的问题。1.2 遥控和遥调到底有什么区别很多初学者容易把遥控和遥调混在一起实际上它们在IEC104里属于不同种类的ASDU信息体结构也不一样。遥控控制的对象是离散状态量。比如断路器只有“分”和“合”两个稳态中间不允许有连续过渡。我下发一个“分闸”命令子站收到后驱动操动机构让断路器从合位变到分位。这个过程的本质是“状态切换”结果只有两种要么分到位要么没分。对应到ASDU就是单点命令、双点命令、步进命令这几种类型。遥调控制的对象是设定值。变压器有载分接开关有十几个档位我下发“目标档位5”子站就驱动电机把分接头从当前档位调到5档或者我下发一个“目标无功10Mvar”子站按这个设定值去投切电容器。它的本质是“数值调节”目标值本身是一个连续量或有限个离散档位可以反复调整、微调不需要像断路器那样追求一次性到位。从工程实现上看遥控命令关心的是“分/合”这个双态遥调命令关心的是“值是多少”。所以遥控用的SCO命令状态和限定词很短只有一个字节遥调用的设定值信息体则是两字节或四字节的数值后面跟着品质描述和时标。理解了这一层再看ASDU类型号就不会晕。1.3 控制不是单向的主站必须形成闭环遥控遥调虽然是下行命令但整个控制过程从来不是“发出去就完事”。我最常对新人强调的一句话是遥控事件的结束不是子站回“执行确认”的时刻而是主站收到对应的遥信变位并且核对无误的时刻。也就是说一个完整的遥控闭环一定包括“主站下发命令→子站确认→子站执行→状态变位→主站收到变位遥信”这个完整链条。有一次在现场我做开关遥控试验执行确认明明返回了“成功”可后台画面上开关位置纹丝不动。当时觉得奇怪查了半天发现是开关机构的防跳继电器把合闸回路闭锁了机构根本没动。子站侧的控制输出是发了但被机构层面的闭锁条件拦住了。从规约角度看子站确实“执行”了控制输出但从系统角度看开关状态没有改变。所以成熟的主站系统都会把“遥控命令是否成功”的判断交给状态变位来确认而不是只看执行确认。2. 为什么遥控必须“选择-执行-终止”这套机制的设计逻辑2.1 选择-执行-终止一套防止误动的安全协议IEC104里遥控命令最常见的机制叫SBO即Select Before Operate操作前先选择。我第一次给刚入行的同事解释这个概念用的类比是你想远程把家里门锁打开安全起见不是直接一发指令就开锁而是先发一条“我要操作门锁”等待门锁回复“好的请操作”再发真正“开锁”的那条指令。这样一来哪怕中间某条指令被干扰或者点错了对象门锁都不会贸然动作。具体到104规约里整个过程分三个状态选择主站下发命令SCO里的选择/执行标志位置“选择”子站收到后校验对象地址合法、权限满足、闭锁条件允许然后返回“选择确认”。注意此时断路器的操动机构并未动作只是“被选中”。执行主站收到选择确认后再下发一条同对象、同命令值的“执行”指令。子站收到后这时才真正驱动继电器给断路器分闸或合闸回路输出脉冲然后返回“执行确认”。终止如果选择完成但执行条件不满足、或者执行过程中出现问题子站可以返回“激活终止”命令流程结束。另一种终止情形是选择后主站超时没有发执行子站自动撤销选择这也是一种隐性终止。2.2 为什么不能一步到位安全性优先于速度有人会问远程操作本来就要及时为什么非要拆成两步、来回两条报文答案是电力系统里最怕的就是“误控”。如果只有一步主站画面误操作、鼠标双击、网络中一个误码、或者调试软件里误发了一条命令都可能直接导致断路器误跳大面积停电就来了。拆成“选择-执行”两步后即便某条报文出错断路器也不可能在一次命令里动作因为两条指令必须严格配对、对象地址必须一致、动作值必须相同。更进一步104规约还允许主站在“选择”之后、执行之前下发“取消”命令限定词QU11把选择撤销。也就是说从选择到执行之间留出了一个人工确认窗口。主站后台在收到子站的选择确认后很多系统会在界面上再弹一次确认框“是否执行分闸请再次确认”。这一层人机交互恰好对应了SBO机制里的执行步骤。2.3 超时与自动撤销给选择加一个“有效期”我在实际调试中经常遇到一个现象主站对某个开关下发选择命令子站返回了选择确认但主站因为网络抖动迟迟没有把执行命令发下去过了一段时间子站自己把这次选择撤销了后续再发执行命令时子站直接拒绝返回“没有选中的对象”之类的错误。这就是SBO机制里的超时保护。子站侧通常会对“选择后等待执行”设一个时间窗常见配置是10秒或30秒。超过这个时间窗口子站认为这次选择已经失效自动释放被选中的控制对象。这个设计背后的逻辑很朴素时间窗口越长中间被其他进程误触发的概率越高。一个被选中的断路器等在那儿万一主站因为程序故障或者网络中断一直执行不了它就在那挂一辈子显然不行。所以每次遥控前我都会习惯性地确认一下主站和子站两侧超时参数的匹配性比如主站设置的重发周期是5秒、子站超时是10秒这意味着最多重发两次就必须能完成执行否则流程就会被终止。2.4 直控模式关掉SBO的轻量方案不是所有场景都走SBO。不少配网终端、分布式电源并网开关为了追求遥控响应速度会把返送校核关掉采用“直控模式”。也就是主站一条执行命令直接给到子站子站收到就动作然后返回确认。直控模式节省了一次往返时间对通信状况良好、控制对象风险较低的场合是可行的。但代价是失去了选择的保护一旦命令字在传输中被干扰、或者主站软件把对象地址发错设备就可能误动。所以我个人的观点是高压等级、主网侧设备必须保留SBO配网末端的简单负荷开关可以按需配置成直控但要有可靠的防抖和误码校验。3. 遥控命令的报文解剖从字节看一次遥控请求3.1 一次遥控请求的APDU基本轮廓先复习一下APDU的结构。IEC104的报文由APCI和ASDU两部分组成APCI固定6个字节前两个字节是起始符0x68和长度后四个字节是控制域用来区分I帧、S帧、U帧并承载发送/接收序号。从第七个字节开始就是ASDU。ASDU从类型标识开始然后是可变结构限定词、传送原因、公共地址最后是信息体。对于遥控命令信息体就是信息对象地址IOA加上控制命令的状态和限定词SCO。典型的遥控报文长这样十六进制68 0E 02 00 06 00 2D 01 06 00 01 00 01 00 90逐字节拆开看68 0EAPDU长度是14个字节02 00 06 00I帧控制域发送序号是1接收序号是32D类型标识45即C_SC_NA_1单点遥控命令01可变结构限定词SQ0信息对象数量106 00传送原因6激活Activation01 00公共地址1低字节在前01 00信息对象地址1也就是我们要控制的开关90SCO命令状态和限定词3.2 类型标识与控制命令的对应关系IEC104里与控制相关的ASDU类型远不止上面这一个。我把常用的列在下面调试时对照着看就不会发懵类型号十六进制名称用途450x2DC_SC_NA_1单点遥控命令460x2EC_DC_NA_1双点遥控命令470x2FC_RC_NA_1双点步进命令480x30C_SE_NB_1设点命令归一化值490x31C_SE_NC_1设点命令标度化值500x32C_SE_NE_1设点命令短浮点值510x33C_SE_NF_1设点命令字节串遥控主要用45和46遥调用48/49/50。47是步进命令一般用于升降控制比如调压器的升档/降档有些老设备还在用。单点和双点的区别值得多说一句。单点命令的信息体里只有一个命令状态位0代表分、1代表合报文最精简。双点命令的信息体里则用两位来表示位置00代表分、01代表合、10代表分带短暂脉冲、11代表合带短暂脉冲。双点命令的好处是能带“短暂脉冲”的语义驱动那些需要脉冲触发的操动机构时更好用。3.3 SCO字段一字节里的三个信息SCO是单点命令的信息体只有一个字节。这一字节里同时装了三个信息命令值、命令限定词、选择/执行标志。按逻辑拆开来说命令值SCS0表示分1表示合命令限定词QU00表示无附加定义01表示短脉冲10表示长脉冲11表示持续输出选择/执行标志SE0表示执行1表示选择我在调试现场见过最多的几个取值基本可以背下来0x90选择分闸0x10执行分闸0x81选择合闸0x01执行合闸注意不同厂家的位定义可能有细微出入上述取值是我调试过的多数主站/子站里最常见的默认值拿到一套新设备时还是要先查对方的规约说明或者做一次回环试验验证一下不要想当然。3.4 短脉冲、长脉冲和持续输出的工程意义QU字段里的“短脉冲”“长脉冲”“持续输出”看起来是报文层面的参数实际上直接关系到一次回路里继电器怎么动作。断路器操动机构里分闸线圈和合闸线圈通常需要一个持续的电压信号来驱动脱扣器但电压持续施加的时间不能太长否则线圈会过热甚至烧毁。控制输出信号短则几十毫秒长则一两秒。不同机构对脉冲宽度要求不一样电磁操作机构用短脉冲弹簧操作机构有些需要长一些的脉冲宽度。所以SCO里设一个QU就是让主站告诉子站请按多长时间的脉冲输出。我在调试断路器时踩过一次坑当时按惯例设了短脉冲结果有个型号老旧的断路器合闸线圈端子没有保持回路短脉冲一结束机构又弹回去了连续三次合闸都失败。后来把QU改成“长脉冲”线圈持续得电足够时间机构完全扣住后再失电问题就解决了。不同厂家、不同机构对脉冲时长的要求差异很大这恰恰是现场最容易忽视的一个细节。4. 实战一次带返送校核的遥控分闸全流程4.1 完整报文交互时序这里以最常见的选择-执行分闸流程为例把一次完整交互列出来。假设公共地址是1被控开关IOA是1I帧序号从1开始阶段方向ASDU类型传送原因关键信息说明1主站→子站45单点命令6激活IOA1SCO0x90选择分闸2子站→主站45单点命令7激活确认IOA1SCO0x90选择确认机构未动作3主站→子站45单点命令6激活IOA1SCO0x10执行分闸4子站→主站45单点命令7激活确认IOA1SCO0x10执行确认开始驱动机构5子站→主站1单点遥信3突发IOA1状态0开关位置变位上送把报文写出来就是这样第一步选择 主站→子站: 68 0E 02 00 06 00 2D 01 06 00 01 00 01 00 90 子站→主站: 68 0E 12 00 08 00 2D 01 07 00 01 00 01 00 90 第二步执行 主站→子站: 68 0E 04 00 0A 00 2D 01 06 00 01 00 01 00 10 子站→主站: 68 0E 14 00 0C 00 2D 01 07 00 01 00 01 00 10 第三步状态上送 子站→主站: 68 0E 16 00 0E 00 01 01 03 00 01 00 01 00 00第三步的单点遥信报文里类型标识01是单点遥信传送原因03是突发变位上送信息体最后一个字节00表示开关已到分位。4.2 为什么选择确认和执行确认看起来报文一样细心的人会发现第2步和第4步的子站回文ASDU部分几乎一模一样只是SCO从0x90变成了0x10也就是SE位从“选择”翻到“执行”。这里的本质是子站把主站发来的SCO做了“原样返回”作为对命令的确认。你让我选择分闸我确实收到了并且你的选择标志是1那么我把这整条信息体原样送回去告诉你“我确认了选择分闸”。等到执行阶段SCO里的SE位变成0子站又把它原样返回表示“执行分闸也确认了”。所以判断一个回声是“选择确认”还是“执行确认”不能光看传送原因得看SCO里的SE位。传送原因都是7激活确认区别就在SE位的值上。这一点在写主站解析代码时尤其重要我见过有同事把两条确认都当成“执行确认”导致状态记录错乱界面上一会儿显示选择成功一会儿显示执行成功。4.3 必须以遥信变位判定最终结果我在前面说过执行确认只能代表“子站已经收到了执行命令并且开始驱动控制输出”它不代表“断路器一定分开了”。最后一步遥感变位才是整个控制闭环的证据。子站侧的分闸位置继电器动作、辅助接点翻位才能触发遥信变位上送。我在现场做传动试验时判断一个遥控命令是否真正成功标准只有一个后台画面上开关位置从红变绿并且SOE事件里出现对应时刻的变位记录。执行确认返回了但位置没变那就要怀疑机构拒动、闭锁、电压不足或者辅助接点没到位。4.4 异常路径激活终止和取消IEC104里还有一个传送原因10叫“激活终止”专门用来表示一个激活过程被终止。基于原因10最常见的两种场景执行失败。子站收到执行命令但分闸机构因为闭锁条件不满足比如机构气压低、弹簧未储能、就地/远方把手在就地位置无法动作子站会返回一个“激活终止”报文告诉主站这次激活的控制流程结束了原因是执行不成功。总召结束。子站在响应总召唤时把所有数据上送完毕后也会发一个类型100、原因10的报文表示“总召过程终止”。还有一种主动取消的场景。如果主站下发选择命令后操作员改变主意不执行了可以下发一条SCO带取消限定词QU11的命令子站收到后清除当前的选择状态。这种取消一般不会让机构动作只是把“选中”标记释放掉。4.5 遥控前先把总召跑通很多人调试时忽视前置步骤直接上来就发遥控命令结果子站状态机还没初始化命令要么被丢弃要么因为链路状态不对被拒绝。IEC104里有个站召唤总召机制类型标识100C_IC_NA_1。主站在链路建立并启动数据传输STARTDT之后可以发一条总召请求子站收到后把所有遥信、遥测的当前值整体上送一遍最后发一个原因10的报文表示总召结束。总召发起条件并不复杂链路处于数据传输状态即可QOI召唤限定词通常填20总召唤。但我的经验是总召必须等上一次总召结束之后再发起不能连续砸多条否则子站会频繁刷新数据反而容易把遥控命令挤在队列里。在遥控调试之前先做一次总召有两个直接好处一是确认链路双向通信正常二是让主站拿到全部状态的基准值。后续遥控产生的遥信变位才能在正确的基础上被比较和记录。要是主站里开关位置还是初始值遥控后变位数据来了也对不上号容易造成误判。5. 遥调设点命令在变压器分接头调节中的应用5.1 遥调对应的ASDU结构遥调在IEC104里对应的是设点命令Set Point Command类型号48、49、50分别表示归一化值、标度化值和短浮点值。三种值的区别主要在数值表示方式归一化值NVA16位有符号整数-1.0到1.0之间按比例映射适合表示电压、功率这种需要比例变换的工程值。标度化值SCA16位有符号整数直接表示一个整数档位或者一个工程值乘以比例因子之后的整数变压器分接头档位用这种最方便。短浮点值IEEE 754浮点数4字节直接用浮点数表示工程值主站和子站之间不需要约定比例因子。实际工程里变压器档位调节大多数用标度化值49因为档位本身就是整数。比如当前档位是3我要调到5主站下发类型49、IOA指向调压机构、值5。一个典型的变压器档位遥调请求报文结构68 0E 00 00 00 00 31 01 06 00 01 00 01 00 05 00类型标识0x31是49传送原因06是激活IOA1信息体最后两个字节05 00表示目标档位5。5.2 变压器有载调压的遥控遥调配合变压器有载分接开关OLTC是遥调最经典的应用场景。它的目标是在不断电的情况下通过切换分接头位置来改变变比从而调节低压侧电压。但要注意OLTC的档位调节过程是个机械动作过程需要电机驱动切换开关动作每一步切换都要几十毫秒到上百毫秒。所以在做遥调时主站不能像遥控断路器那样连续快速发命令要按分接开关的切换时间设定最小间隔否则可能出现电机还没完成当前动作下一条指令又进来了轻则档位错乱重则损坏机构。我在调试AVC自动电压控制系统时主站根据母线电压偏差和当前档位自动计算目标档位通过104规约下发遥调命令。逻辑本身不复杂真正让人头疼的是约束条件目标档位不能超过分接开关的上下限、相邻两次调节必须留足间隔、调节过程中如果电压异常突变必须立即停止。这些约束如果只在主站做一旦主站和子站的通信中断后重新连接子站侧自己也要有档位闭锁逻辑不能无条件执行任何目标档位。5.3 遥调的反馈回路档位怎么回来遥调发出去之后怎么知道调到位了这时候又回到遥信和遥测。分接开关的档位通常会通过多路遥信上送BCD编码的档位位表或者用一个综合遥测上送档位的数值。子站执行完遥调后档位变位会以变位遥信的形式上送主站再根据实际档位和期望档位做比较。有一次调试中我下发遥调目标档位7子站执行确认回来了结果档位遥信显示从3档跳到了2档——方向反了。查了子站的接线图才发现分接开关的“升档”和“降档”继电器接线被接反了子站收到“升档”指令驱动的是降档继电器。这种问题纯靠报文是查不出来的最终要回到现场二次回路去核对也是调试工作里最耗时间的一块。5.4 安全限值不能什么值都往下发遥调的值本质上是一个设定数如果不做校验主站误发一个离谱的目标值可能直接导致电压越限甚至设备损坏。因此在实际系统里主站和子站两侧都要做限值拦截。主站侧在界面上配置每个遥调对象的上下限比如变压器档位1到17超过这个范围的输入直接在界面就被拦掉。子站侧在自己的控制逻辑里也要做同样的限位校验目标档位如果超出允许范围返回执行失败或者激活终止。这里的工程细节是限值配置往往不是固定的。夏天负荷高峰时电压偏低可能允许往高档位调负荷低谷时电压偏高档位不能随便往下调太多。所以限值要能根据运行方式动态修改主站侧还要留一个“遥调闭锁”的总开关防止AVC自动模式下连续误调。6. 现场调试这些年踩过的坑遥控遥调实战细节6.1 SCO取值不是绝对的务必先做回环验证我前面提到0x90/0x10/0x81/0x01是常见值但这里必须再强调一遍这个取值在不同厂商实现里有差异千万不要以为全网通用。有一次我把某品牌主站的项目参数直接复制到另一个项目里结果发现全部遥控都做不成功。抓包看了半天主站下发的选择分闸SCO是0x80而不是0x90判断是厂商把“分”的状态位定义放到了bit0而“选择”标志位定义不同。子站严格按照自己的位定义校验发现命令值不合法直接拒绝。所以拿到一套新设备第一件事不是马上接真实断路器而是在遥控出口断开的情况下做一次回环测试或者用模拟子站去验证主站发出来的SCO语义。等两边对齐了再接入真实控制回路。6.2 选择超时执行命令被拒前文提过的超时问题在实际调试中触发频率非常高。子站SBO超时时间往往出厂默认30秒但主站遥控操作流程如果包含了太多中间步骤——比如弹窗确认、操作员权限验证、二次复核——耗时超过30秒也是可能的。一旦超时主站再发执行命令子站会返回一个激活终止或者干脆不回复。很多主站此时会提示“执行超时”或者“无确认”第一次遇到的人容易误判为链路故障。我的习惯是调试初期先把子站SBO超时改成120秒等流程全部验证通过后再改回运营值常见10秒或30秒。同时让主站侧在选择确认后立即进入等待执行状态减少中间人工环节的时间消耗。6.3 执行确认不是成功还是要等遥信这个坑前面已经强调过但在现场曾经直接导致一次严重的试验误判我再细致说一次。当时陪厂家做断路器传动试验操作员看到后台弹窗“执行确认成功”就认为断路器已经分闸了接着就要做另一项安全措施。结果物理位置上断路器压根没分因为机构闭锁。幸好当时有人多看了一眼柜面指示灯及时喊停。所以我现在带人做调试定了一条死规矩遥控命令是否成功必须以遥信变位和后台画面变位共同判定。执行确认只是中间结果不能作为终端依据。如果执行确认返回但没有变位下一步不是接着做试验而是顺着控制回路往下查子站出口继电器有没有励磁、操动机构有没有得电、闭锁回路有没有打开。6.4 链路重启后I帧序号复位才能发命令IEC104的I帧带有发送序号和接收序号用于报文的确认、排序和重发。链路如果断过重新建立连接之后必须重新执行STARTDT启动数据传输然后序号从0开始继续。有一些调试软件或者老版本主站在链路断开重连后没有正确复位序号直接继续使用旧序号发遥控命令子站会认为这是重复包而丢弃。表现在现象上就是链路显示正常、数据能收但遥控命令发出去石沉大海。排查这个问题的方法很简单抓包看I帧控制域的前两个字节确认序号是否按预期递增。如果发现序号跳变或者重复重新启动传输一次就好。6.5 防抖和重复激活命令不要狂点有些操作员在界面上发现遥控无响应会下意识地连续点击遥控按钮导致主站连续下发多条相同的激活命令。IEC104本身不禁止同一对象的多个激活但子站侧通常在一个激活进行中时会拒绝新的激活请求或者把旧的激活终止掉。结果就是后面那几条命令可能把前面正在执行的流程打断本来能成功的遥控反而失败了。工程上我建议在主站侧加一个“遥控防抖”机制对同一对象、同一动作的遥控命令在设定的时间窗口内只允许第一条生效后续重复命令直接拦截。这个窗口一般设1到2秒足够既能防止误触发的连点又不会影响正常操作。6.6 调试工具与验证手段做104遥控遥调调试抓包工具和模拟工具是少不了的。我常用的方案是主站侧用协议调试软件模拟从站先验证主站发出去的报文是否符合预期子站侧则用模拟主站软件来发送遥控命令验证子站的返回和输出。两边都验证通过后再合在一起做真实传动。另外控制回路侧要预留一个断开点或者试验端子。很多断路器控制柜里都有“远方/就地”切换把手和试验按钮调试时先把切换把手打到“就地”用试验按钮验证机构本身能用再切回“远方”做完整的规约遥控试验。这个顺序能帮你快速区分是机构问题还是规约问题节省大量排查时间。最后分享一个个人习惯每次遥控试验前我都会在后台录一段抓包日志把时间戳、报文原文、返回结果全部存下来。等到出了问题这份日志就是最直接的排查依据。通信这东西很多问题就是在特定时序下才会出现没有日志空口去猜效率太低了。