用于多通道计量的装置和方法

文档序号:6570196阅读:905来源:国知局

专利名称::用于多通道计量的装置和方法相关申请的交叉引用本申请要求以下专利申请的优先权2005年11月15日提交的第60/737,580号美国临时专利申请、2005年11月23日提交的第60/739,375号美国临时专利申请和2006年6月15日提交的第60/813,901号美国临时专利申请。本申请是2006年5月9日提交的第11/431,849号美国专利申请的部分延续。第11/431,849号美国专利申请是2005年1月6日提交的第11/030,417号美国专利申请(现在是第7,054,770号美国专利)的分案申请。第11/030,417号美国专利申请又是2001年2月28日提交的第09/795,838美国专利申请(现在是第6,947,854号美国专利)的分案申请。上述每个申请的全部内容都通过引用并入本文。
背景技术
:和
发明内容本发明的一个实施方式包括与基于QuadlogicASIC(阔德逻辑专用集成电路)的计量表族相关的计量装置(参见第6,947,854号美国专利和公开号为20060036388的美国专利申请,这两个专利的全部内容都通过引用并入本文)。特别地,该实施方式(在这里,为了方便,将其称作“能量防卫装置(EnergyGuard)”是多通道计量表,其优选地能够提供前述计量表族的大多数功能,并进一步提供以下改进、特征和组件。在至少一个实施方式中,微型橱(MiniCloset)是24通道的计量装置,其可测量高达24个单相客户、12个双相客户、或者8个三相的客户的电力使用。优选地,下文将讨论的一个或多个LCM(负荷控制模块)与微型橱相连。能量防卫装置优选地包括微型橱计量表探头模块和安装在钢盒的两个LCM。供远程电用户断开和再连接的继电器以及当前的变压器也安装在该钢盒内,如图1所示。安装好之后,电用户的供电线路从主馈电线分接出,穿过能量防卫装置,并直接到达用户家中。通过以下说明和相关附图,对于本领域技术人员而言,能量防卫装置的结构和使用将显而易见。源代码提供在所附的附录中。能量防卫装置计量表优选地可操作以提供(A)远程断开/重连该计量表支持通过PLC(电力线通信)的全双工(双向的)通信,并且可配备有远程操作的继电器(60安培、100安培或200安培),该继电器用于实现远程电力用户的断开和重连。(B)防盗该系统设计具有三个具体特征来防盗。第一,能量防卫装置优选地安装在中压以上的电线杆上,从而使得顾客很难对其接触和篡改(tamper)。第二,因为该系统没有额外的信号线(即,所有的通信都是通过电力线),因此任何切断的通信线都能被立即检测到。也就是说,如果通信线断了,那么就服务断了,这是很容易发现的。第三个防盗特征是该计量表可用于测量变压器能量,以确认测得的各客户的总量。差值就是盗用的能量。(C)篡改检测该能量防卫装置优选地提供了2种光学篡改检测模式。每个单元都包含从镜似的小粘附物反射的光。如果没有这种反射光,则说明盒子被打开了。这种检测将使由能量防卫装置单元测量的所有客户都自动断开。另外,如果能量防卫装置的外壳被打开并且有环境光进入,那么也将会使由能量防卫装置单元测量的所有客户自动断开。这两种篡改检测模式持续使用并在每秒钟内改变多次,以最大化地保障安全。(D)反向电压检测在某些情况下,电力公司能够断开个别用户的供电,而该用户能够通过替代的馈电获得电力。如果该电力公司在这些情况下重新供给电力,那么计量装置和/或分配系统可能发生毁坏。能量防卫装置优选地能检测出这种故障状态。该能量防卫装置能通过连接到用户住所的线路检测反馈到断开处的任何电压。如果检测到了电压,那么能量防卫装置固件将自动地阻止重连。(E)预付款能量的预付款可通过电话、电子交易或者亲自办理等方式进行。将购买的度数传送到计量表并存储在其存储器中。计量表采用倒计数的方式,显示出在到达0而断开连接之前还有多少能量可使用。只要用户持续购买电能,服务就不会中断,并且电力公司将具有每天的活动报告。(F)负荷限制作为由于未付款而断开连接的一个选择或者或作为预付款系统的一部分,能量防卫装置计量表能允许电力公司远程地将输出电能限制为固定标准,当负荷超出了该标准时则断开连接。如果用户超出了负荷并且断开了连接,那么该用户可将可选的远程显示器上的按钮复位来恢复负荷,只要连接上的负荷小于预设的限制。作为一种选择,客户能通过电话呼叫电业服务线以使服务恢复。这种特征允许电力公司为重要系统提供电能,即使是在例如顾客未付款的情况下。(G)每月的耗能限制某些客户得益于补贴价率并获得最大的每月总消耗。当达到某个消耗线时,能量防卫装置固件能够断开供电。然而,当提供了提前通知客户的服务时,这种程序才能最好地执行。这能够通过将消息送到客户家里来通知客户其月耗能费用快达到计划的月耗能量了。作为一种选择(或结合),可编程设置定时的供电中断,从而使得当快达到限量的时候,将电能断开一段时间,以越来越长的中断时间来通知住户。服务中这些有计划的中断是用来作为给用户的警告,告诉他们已经接近限量了,从而使其有时间来改变耗电方式。(H)计量表验证系统的集成模块优选地为可移除的。这就允许在发生客户计费纠纷的情况下容易地在实验室重新验证计量表精度。(I)电力公司的运行效益能量防卫装置具有详尽的机载事件日志和诊断功能,为现场技术人员提供了大量数据,用于电力和通信系统的试运行及故障检修。非计费参数包括电流,电压,温度,总谐波失真,频率,瞬时的瓦特、乏和伏安值,V2小时,I2小时,功率因数,以及相角。在查看了所附说明书、软件代码和图表之后,对于本领域技术人员而言,这些和其它特征将显而易见。一方面,本发明包括用于计量电力使用的装置,包括用于通过电力线通信进行远程断开的装置;用于探测窃电的装置;用于窜改检测的装置;以及反向电压检测的装置。另一方面,本发明包括用于进行多通道电力计量的装置,包括(a)计量表头,其能够操作以对多个电力用户线路的电力使用进行测量;(b)与所述计量表头通信的转发器,其能够操作以将通过电力线通信从所述计量表头接收到的数据传输到远程设置的计算机,并将通过电力线通信接收到的数据从所述远程设置的计算机传输到所述计量表头,以及(c)与所述计量表头通信的负荷控制模块,其能够操作以启动对多个继电器中的每个继电器的连接和断开,所述多个继电器中的每个继电器都对应所述多个电力用户线路中之一。在不同的实施方式中(1)计量装置进一步包括与所述计量表头通信的篡改检测器;(2)所述篡改检测器包括光源和反射面,其中,如果所述篡改检测器提供通知,告知未检测到从所述反射面反射的光线,那么所述计量表头则能够操作以指示所述负荷控制模块断开全部所述用户线路;(3)所述计量装置进一步包括包含所述计量表头、所述负荷控制模块和所述继电器的盒,其中,所述篡改检测器包括对进入所述盒中的环境光进行检测的检测器;(4)所述计量装置进一步包括包含所述计量表头、所述负荷控制模块和所述继电器的盒,其中,所述盒安装在电线杆上;(5)所述计量装置进一步包括用于将变压器能量与所述用户线路使用的总能量进行比较的装置;(6)所述计量装置进一步包括,用于检测通过所述用户线路的反向电压流的装置;(7)所述计量装置进一步包括,与所述计量表头通信的计算机可读的存储器以及与所述计量表头通信的计数器,所述计数器对应用户线路并且能够操作以对存储在所述存储器中的能量的量进行倒数,当所述计数器数到0时,所述计量表头能够操作以向所述负荷控制模块发送断开信号,以断开所述用户线路;(8)所述计量装置进一步包括与所述计量表头通信的计算机可读的存储器,所述存储器能够操作以存储用于用户线路的负荷限度,当超出所述负荷限度时,所述计量表头能够操作以向所述负荷控制模块发送断开信号,以断开所述用户线路;(9)所述计量装置进一步包括与所述计量表头通信的计算机可读的存储器,所述存储器能够操作以存储用于用户线路的使用限度,当超出所述使用限度时,所述计量表头能够操作以向所述负荷控制模块发送断开信号,以断开所述用户线路;(10)所述转发器能够操作以通过中压电力线与所述远程设置的计算机通信;(11)所述计量装置进一步包括与所述计量表头通信的显示单元,所述显示单元能够操作以显示从所述计量表头接收到的数据;(12)所述显示单元能够操作以显示与用户的能耗有关的信息;(13)所述显示单元能够操作以显示与用户的能量使用或能量的可疑窃取有关的警告;(14)所述显示单元能够操作以将用户输入的信息传送给所述计量表头。图1示出了优选实施方式的连接的方块图/接线图;图2示出了优选实施方式的物理配置的方块图;图3A-3B是检测转发器和微型橱的优选CPU板的原理图;图4是优选的检测转发器电源的原理图;图5是优选的微型橱电源的原理图;图6是用于将当前的变压器信息返回到微型橱表头的优选电路板的原理图;图7A-7C是优选的负荷控制模块电路板的原理图;图8A-8D是用于光学篡改检测的优选的电源板的原理图;图9A-9C是优选的能量防卫装置连接板的原理图;图10是用于可操作以提供继电控制的控制电路板的原理图;图11是优选的能量防卫装置的基座装配的示图;图12和13分别是优选的相相母线及其构造的示图;图14示出了优选的中性线的框架构造和装配的示图;图15示出了优选的过渡线;图16描述了优选的过渡线的布置;图17和18描述了优选的接收器模块构造;图19示出了优选的集成的电流传感和继电模块;图20示出了优选的集成的电流传感和继电模块的分解图;图21示出了优选的计量模块的分解图;图22示出了放置在EG框架装配和接受器模块中的计量模块;图23示出了能量防卫装置的优选实施方式的分解图;图24示出了优选的EG装配和基座装配的分解图;图25示出了优选的EG布局;图26和27示出了优选的计量模块示意图;图28示出了优选的后板示意图;图29是电源板的优选示图;图30是I/O扩展板的优选示图;图31是CPU板的优选示图;图32是优选的控制模板的图;图33是用于用户显示模块的计量和供电电路的优选示图;图34是用于CDM的显示板的优选示图;图35是用于计量的优选模拟前端的框图;图36和37示出了优选的DSP实现;图38示出了优选的同相滤波器频率和冲击响应曲线;图39示出了为60Hz的半奇次谐波的注入PLC信号;图40示出了计量表接收到的FFT帧与扫描转发的FFT帧可为异相的12种方式;图41示出了优选的FIR滤波器技术要求;以及图42示出了由优选的FFT得到的电压和电流。具体实施例方式在一个实施方式中,能量防卫装置计量装置包括微型橱(也就是,可操作以对多个用户线路进行计量的计量装置);扫描转发器;一个或多个可操作以将所选用户的服务断开的继电器;负荷控制模块;以及光学篡改检测装置。本文所述的微型橱和扫描转发器与第6,947,854号美国专利所述的微型橱和扫描转发器大体相同。也就是说,尽管其在这些年都有了改进,但是与本说明书相关的功能和结构都可认为与该专利所描述的是相同的。本发明的一个方面包括利用微型橱中现有的多通道计量功能,并增加了通过PLC的远程连接和断开。需要增加新的硬件和软件才能提供这样的附加功能。增加的硬件包括LCM(负荷控制模块)和连接/断开继电器。还增加了支持电路,以将信号轨迹路由至主计量表处理机-微型橱5计量表头,并对来自主计量表处理机-微型橱5计量表头的信号进行路由。增加的软件包括如下文中的表格所述的、与增加的硬件进行通信的编码模块。图1是优选实施方式的连接的结构图。中压电力线A、B、C和N(中性的)都插入配电变压器110。低压电力线(通过变流器120)将配电变压器110连接至能量防卫装置单元140。能量防卫装置单元140监控变流器120,并为单相用户线1-24供电。图2是能量防卫装置单元140的优选结构框图。扫描转发器210是单元140的优选数据采集器,其可位于微型橱的外部或内部,并可为同时用于一个以上微型橱的主数据采集器。优选地,扫描转发器210执行以下功能(a)检验数据(每次通信优选地从时钟和计量表身份认证开始,以确保数据完整);(b)采集数据(周期地从每个计量表单元采集数据块,每个数据库都包含先前采集的计量表读数、间隔读书以及日志);(c)储存数据(优选地,将数据在非易失存储器中存储指定的时间(例如40天);以及(d)报告数据(通过PLC、电话调制器、RS-232线路或者其它装置)滑板280包括微型橱表头和提供激活继电器的控制信号的负荷控制模块240。所有电子设备都由电源250供电。后板装配270包括多个(例如24个)CT(变流器)和继电器,在本实施例中,分为3组每组8个CT和继电器。用户电缆通过CT连接并连接到用户住所290的电路上。位于远端的扫描转发器210通过电力线载波通信接入能量防卫装置表头并进行双向通信。图1和2示出的信号流优选地是通过执行不同的软件代码模块来完成的,这些代码模块同时工作的以允许微型橱具有远程连接/断开的能力。下面附录里提供的软件模块是图3-10是优选组件的示图,如下所述。优选的连接/断开继电器是K850KG系列继电器,但是本领域技术人员将认识到,也可使用其它继电器,而不偏离本发明的范围。在另一个实施方式中,能量防卫装置的实现利用了传统断路器面板架构的相似性。在断路器面板中,将电能馈送到面板上,然后通过电路断路器将电能分布到各个用户电路上,所述电流断路器提供了连接或端口用户线路的能力。在微型橱/能量防卫装置中,多个变流器测量用户电路中的电流并把数据传回到计算计量量的中央处理器。然而,微型橱/能量防卫装置与断路器面板具有几个显著的差别。例如,尽管断路器位于用户住所附近,但是能量防卫装置通常安装配电变压器附近。这种可选择的实施方式的优点对本领域技术人员是显而易见的。例如,本实施方式相对于前面讨论的实施方式而言提供了改善的尺寸和总体大小。当在现有的电力装置中增加设备中时,空间总是受限的。当空间受限时,具有28″×22″×11″的优选尺寸的EG(能量防卫装置)版本具有极大优势。下面的描述包括了优选的构造细节、详细示图以及软件描述。与上文讨论的实施方式一样,本该实施例可操作以提供远程断开/连接操作、防止窃电、窜改检测、反向电压检测、执行预付款和限制载荷、以及执行计量表验证。优选的EG构造细节在本实施方式中,EG的主要组件为1.能量防卫装置基座装配2.能量防卫装置装配a.相(phase)母线和中性线b.过渡线c.接受器模块3.能量防卫装置计量模块a.计量模块i.集成的电流传感和继电模块4.能量防卫装置电子设备a.PCB203b.PCB204c.PCB234d.PCB235e.PCB202f.PCB210g-PCB230h.PCB206EG基座装配EG基座装配包括外壳底座,其上具有螺钉和保持垫圈作为用于EG顶盖的锁定机构,该外壳底座的一个侧面上具有铰链连接。如图11所示。该外壳底座提供了用于用户电缆的布线。EG装配-相母线三条铝制的相母线朝向EG装配的中心错列地放置。如图12和13所示。这样,通过使用过渡线提供到用户计量模块的连接。错列排布的母线布局如图13所示。母线用黑色示出。中性线EG优选地包括四条中性线,这四条中性线形成EG装配的框架,从而为中性线电流提供路径。如图14所示。横杆上的接线片提供来自电力分配变压器的中性线馈电。同时,还有2个母板中性线将中性线电流传送到控制模块。过渡线过渡线实现用户计量模块和相母线之间的机械连接和电连接。如图15所示。用于相A和C的过渡线如图15A所示;用于相B的过渡线如图15B所示。图16用黑色示出了过渡线。接受器模块接受器模块优选地由塑料制成,并且在机械上接受可容易地安装到EG装配中的计量模块。每个EG都具有4个堆叠在一起的接受器模块并且能够容纳12个2相的或者8个3相的计量模块。如图17所示。接受器模块还提供用于连接于控制模块的母版中性线的机械路线,如图18所示。用户计量模块优选的计量模块提供了单相、双相或三相用户的耗电量测量所需的计量法。单个模块用作完全独立计量表,其可作为分离的计量单元来被测试和评估。每个模块优选地包括集成的电流传感和继电模块以及计量电子设备,并在用户电路和相母线之间提供连接。图19示出了优选的集成的电流传感和继电模块。图20示出了集成的电流传感和继电模块的分解图。图21示出了优选计量模块的分解图。图22示出了放置在EG框架装配和接受器模块中的计量模块(用黑色示出)。图23示出了能量防卫装置的分解图,图24示出了优选的EG装配和EG基座装配的分解图。电子设备控制模块箱优选地包括各种PCB,这些PCB同时从各计量模块收集计量数据,并通过电力线将这些数据传送给例如ST(扫描转发器)的主要设备。图25示出了本实施方式的优选能量防卫装置布局。每条用户线都具有相应的计量模块(下面将讨论的PCB203和PCB204)(如图26和27所示)图25示出的后板2510(PCB234;结构示意图如图28所示)是在EG中传送信号的公共母线。后板2510上有两种类型的通信选择来允许将数据从控制模块2520传送到单个计量模块PCB203。这可通过2线I2C选项或者通过1线串行选项来完成。控制模块2520包含电源板(PCB210;示意图如图29所示),它是还具有PLC传送和接收电路的电源板。该电源板为CPU板和203板上的电子设备供电。控制模块2520还包含I/O扩展板(PCB230;示意图如图30所示),它是具有能实现计量模块和CPU板之间的通信的多个I/O扩展选项的板。控制模块2520还包含CPU板(PCB202;示意图如图31所示),该板上具有DSP(数字信号处理)器。最后,控制模块2520包含布线板(PCB235;示意图如图32所示),该板具有迹线和没有电子组件的表头。每个CDM(用户显示模块)2530都安装在用户住所处,并且能与安装在服务于用户的配电变压器上的EG进行双向通信。双向PLC允许通过低压电力线实现电力公司和用户之间的通信,并允许电力公司向用户发送常规信息、警告、关于断电的专门信息等。每个CDM2530包括计量和电源的选定组合以及在同一个板上的PLC电路(PCB240;示意图如图33所示)。每个CDM优选地还具有9-位的显示器板(PCB220;示意图如图34所示)。该显示器与EG通信,并显示关于消耗、警告、预告和其它电力公司消息的信息。硬件实现在一个实施方式中,能量防卫装置对ST和计量表上的PLC通信信号进行FFT(快速傅立叶变换),同时为了计量目的而进行详细的谐波分析。这部分将讨论计量模型的实施框架、与控制模块之间的通信、以及控制模块和远程设置的扫描转发器之间的PLC通信。控制模块2520包括电源和PLC电路(PCB210;如图25和29所示);I/O扩展(PCB230;如图30所示)以及称为D计量表的CPU板(PCB202;如图31所示)。电源向D计量表和I/O扩展供电,并且包含PLC发送器和接收器电路。PCB235提供了轨迹布线和各板之间的表头连接。计量模型可具有两个版本2相或者3相。2相版本能够通过软件编程以作为单一的2相计量表或者2个1相计量表使用。2相版本包含B2计量表(PCB203,示意图如图26所示),而3相版本则包括B3计量表(PCB204,示意图如图27所示)。在控制模块2520中,B计量表作为D计量表的从计量表。D计量表和B计量表可能够通过串行ASCII协议来通信。各个B计量表可通过BPB2510到2520相互连接,BPB2510到2520向D计量表供电并提供1Hz参考以及串行通信。用于B计量表的优选DSP引擎是Freescale56F8014VFAE芯片。用于在D计量表上实现CPU的优选的微处理器是ColdFire集成微处理器族中的MCF5207。具体处理器的使用是由计量表版本规定的RAM和Flash需求决定的。单独的电源及LCD板将D计量表的电子部分实现为产品。D计量表除了作为B计量表的主计量表外,还是3相计量表并测量安装有EG的变压器上的总输出。因为具有防盗特性,因此将这个总输出与各B计量表报告的总消耗进行比较。信号流的全部选项如下所示B22个电压,2个电流,无PLC(电力线载波)通道。B33个电压,3个电流,无PLC通道。D3个电压,3个电流,一个PLC通道。每个流都具有相关的电路来实现模拟放大和抗混叠。D计量表具有以下优选的实现·PLL(锁相环),其将信号流的采样锁定到多个输入A/C线(对电力线的同步采样)。·VCO(压控振荡器),其工作在90-100MHz并由DSP处理器通过两个PWM模块控制,其直接驱动系统时钟,从而使DSP与PLL相干。·同步相检测器,其仅对输入线路频率(linefrequency)的基波做出响应,而对该频率的谐波不做出响应。·执行FSK和PSK调制方案的选择。每个计量和通信通道都优选地包括前端模拟电路,其后是信号处理。仅模拟电路才具有的是固定增益的抗混叠滤波器,其提供了一阶温度跟踪,从而在遇到温度漂移时不必再次校准计量表。这一点将在下面讨论,然后还将讨论优选的信号处理实现方法。电压和电流模拟信号链用于电压(电流)通路的模拟前端包括电压(电流)传感元件和可编程的衰减器,之后是抗混叠滤波器。衰减器降低输入信号电平以使信号经过抗混叠滤波器之后不会发生削波。恒定增益的抗混叠滤波器在ADC(模数转换器)入口处将信号恢复为全值。为了进行计量,抗混叠滤波器将高于5kHz的频率去除。然后将输入信号馈送到为DSP的一部分的ADC中。如图35所示,其为用于计量的优选模拟前端的框图。尽管典型的实施方式将包括跟随有低增益抗混叠滤波器的PGA(可编程增益放大器),但是,在本实施方式中,本发明实现了跟随有恒定大增益滤波器的可编程衰减器。另外,通过利用相同的QuadOpAmp以及25ppm电阻器和NPO/COG电容器,单一芯片上的两个抗混叠滤波器的实现是相同的。通过将抗混叠滤波器配对的这种独特的实现方法能够确保电压和电流通道中遇到的相漂移完全一致,并且因此不会影响功率计算(由V和I的乘积得到)的精确性。这就提供了一种用于V通道和I通道的装置,其对高达一阶的温度漂移进行跟踪,而不需要重新校准该计量表。相反地,使用PGA和低增益滤波器则不能对由于温度而在V和I的信号中引入的相漂移进行跟踪。这是由于PGA引入的相漂移是增益的函数。电压,电流和PLC数字信号链图36是PCB202板的方框图;每个方框的功能对于本领域技术人员而言都是显而易见的。图36示出了优选的DSP实现。本实施方式优选地使用PLL将信号流的采样锁定到多个输入A/C频率。如前所述,在本实施方式中,采样是以与电力线同步的速率进行的。在计量表D中,具有工作在90-100MHz的VCO,该VCO由DSP引擎通过2个PWM模块来控制。VCO直接驱动DSP芯片的系统时钟(停止内部的PLL),从而使DSP成为PLL的主要部分。将DSP的系统时钟锁定于电力线有利于将采样与电力线的波形对准。相检测器应该只对输入的60Hz波的基波做出响应,而对其谐波不做出响应。图37该优选DSP实现的方框图。DSPBIOS或者主动的上下文开关代码提供了3个堆栈,分别用于后台操作、PLC通信以及串行通信。小的微处理器使用I2C驱动器与DSP通信。MSP430F2002集成电路对电力供应、篡改端口、温度和电池电压进行测量。MSP430F2002的任务包括i.维持RTC;ii.测量电池电压;iii.测量温度;iv.测量+U电源;v.在部分停止供电时将DSP复位;vi.提供附加的看门狗电路;以及vii.提供1秒的参考时间到DSP,以相对于VCO的系统时钟对这1秒的参考时间进行测量。计量表D的PLC通信信号链典型的装置包括通过电力线通信的多个EG和ST。计量表D通过配电变压器与远程设置的扫描转发器进行双向通信。为了实现此功能,本实施方式中使用10-25kHz的频带进行PLC通信。与线路电压同步,对PLC信号以大约240kHz(212*60)的采样率采样,在采样之后应用FIR(有限脉冲响应)滤波器来抽取数据。优选的FIR规格如下10-25kHz频段如图38,其示出了优选的同相滤波器频率响应和脉冲响应特征曲线。在完成对60kHz(211*30)的抽取之后,对抽取后的数据进行2048点FFT。因此,根据FIR滤波器的选择,将数据速率确定为30波特。当在10-25kHz的频带内使用FIR时,每个FFT在大约每66msec产生2比特,以通过配电变压器进行通信。为了避免在存在线路噪声的情况下进行通信的问题,本实施方式优选地执行独特的技术以稳定并可靠的通信。这是通过注入PLC信号而实现的,注入的PLC信号的频率等于线路频率(60Hz)的半奇次谐波(half-oddharmonics)的频率。这一点将通过AC线路上发现的范围在12-12.2kHz的典型的噪声频谱在下文中的实施方式中讨论。图39示出了频率为60Hz的半奇次谐波的频率的注入PLC信号。因为FFT每30Hz完成一次,并且谐波间隔为60Hz,因此在图39中,数据位位于对应于60Hz的第201.5次和第202.5次谐波的频段(bin)中。这种算法考虑这两个频点并比较其中的信号幅度以决定取1或者0。这种FSK方案使用2段频率,并产生30波特的数据速率。可选地,能实现使用4个频率的QFSK以产生60波特的数据速率。当穿过变压器时,ST计量表和D计量表都优选地在PLC上进行FFT变换,并且在10-25kHz范围内,数据每30Hz发一次信号。因为ST计量表和D计量表中的PLL(锁相环)都锁定在线路上,因此数据帧和线路频率(60Hz)也是同步的。然而,数据帧可由于以下原因而在相上漂移1.存在于ST和计量表(delta-Wye等)之间的路径上的不同的变压器配置;以及2.由于ST被锁定在特定的相、而单相或者多相计量表可通过其它相上电而导致的相漂移。当计量表数据帧和ST数据帧接近完美的对准时,SNR(信噪比)达到最佳值。从计量表的角度来看,这需要从全部可能“听到”的ST处接收PLC信号,将信号解码,通过对准数据帧来检查SNR,以及对产生最大SNR的ST做出响应。图40示出了12个可能的方式,在这些方式中,由计量表接收到的FFT帧可以与STFFT帧异相。虚线对应于说明ST和计量表之间的信号路径中的差量变压器(deltatransformer)的30度旋转。另外,因为在60Hz线路上每隔30Hz的数据帧就是可利用的,因此,具有两种可能性,对应于通过将60Hz除以2得到的2个可能的相。因此,计量表数据帧可能存在24种与ST数据帧未对准的方式。在ST的每个帧中,具有奇数个载频周期。由于优选的调制方式是FSK(频移键控),因此,如果第n周期用于传送位1,那么,位0则由载频的第n+2周期传送。对于计量表而言,辨识其60Hz的两个周期以能够对每1/30秒可用的数据位进行解码是很重要的。如果D计量表对具有未对准的数据帧的信号进行解码,那么就会有能量溢出到邻近的(距离半个基波频率)频率。如果落入“邻近”频率点的信号电平比噪声基底小,那么该信号能够正确地被解码。然而,如果溢出大于噪声基底,那么在1和0之间进行区分的能力就会减小,并因此整体SNR就会降低,从而导致解码错误。总之a.如果帧未对准,那么就会发生数据位的拖尾效应,并且SNR降低。b.在频率改变且具有未对准的数据帧的情况下,会具有大量能量溢出到邻近的FFT频点上,从而干扰系统中使用这些具体频点内的频率进行通信的其它ST。一旦确定了对应于最大SNR的时钟位移,计量表就锁定了,直到计量表遇到了很大的SNR比率变化。在这种情况下,处理将重复。使用FFT实现D计量表和B计量表中的计量尽管使用B计量表和D计量表完成计量,但是D计量表还负责通过PCB234收集来自B计量表的计量信息。这些计量表中的每个数据流都具有实现模拟放大和抗混叠的相关电路。每个模拟前端部分都具有由更高级代码控制的可编程衰减器。数据流以60kHz(210*60)采样,并且使用FIR滤波器将数据流抽取至~15kHz(28*60)。优选的滤波器的规格如下表和图41所示因为仅对高达3kHz的数据感兴趣,因此,优选地,抽取FIR上3-12kHz滚降与~15KHZ的采样率一起使用。将0-3kHz或者12-15kHz的频率映射到0-3kHZ。执行实FFT来产生2个数据流,这2个数据流能够被进一步分解成4个数据流实部和虚部电压以及实部和虚部电流。这一点通过分别在实部和虚部增加或减去正负镜像频率来实现。因为12-15kHz范围内的混叠信号降到80dB以下,因此通过前面讨论的FIR滤波器将能够达到精度要求。可选择地,可在抽样数据流的每个相上执行256点复FFT。这将产生2对数据流表示电压的实部和表示电流的虚部。这个方法需要每16.667毫秒进行一次256点复FFT。执行任一种FFT的结果为图42所示的电压或电流,其中,符号Vm,n表示第n个周期的第m次谐波。例如,V11和I11对应于第一个周期的基波,而V21和I21对应于第一个周期的第一个谐波,等等,如图42所示,其示出了指示谐波的电压的FFT帧。第k个周期的谐波的实部和虚部由下式给出Vmk=Re(Vmk)+i*Im(Vmk);m=1...MImk=Re(Imk)+i*Im(Imk);k=1...n电压的虚部是PLL和线路频率之间的不同步的测量。为了计算计量量,该计算是在时域完成的。在时域中,通过仅基波或者包含谐波,FFT功能性为计算计量量提供了灵活性。使用从FFT得到的电压或者电流的复形式,计量量可通过下式计算W=Re(P)=Re(Vmk)*Re(Imk)+Im(Imk)*Im(Vmk)Var=Im(P)=Re(Imk)*Im(Vmk)-Re(Vmk)*Im(Imk)PowerFactor=W/P然而,在上面的公式中,当包含谐波时(Vmk和Imk;m=1...M,k=1...n),所有的计量量都包括谐波的作用。换句话说,当仅使用基波时(V1k和I1k),所有的计算量都只表示60Hz的贡献。例如,我们示出了只使用基波进行计算时的计算。仅使用来自于所有FFT数据帧的V1和I1。对于给定的一组N个帧和fline的线路频率,计算以下量Δt=1/fline置换功率因子由下式给出其中,W和VA只包含基波,并且VA1=V1RMS*I1RMS,其中对于N次循环,&计算计量量时包含或者排除谐波灵活性转化为对前述实施方式的性能的极大改进。本实施方式提供的另一个性质是计算THD(总谐波失真)。THD是对谐波失真存在的度量,并定义为所有谐波分量的总能量与基波能量的比值。对于第n个周期,该值为&Vmn(Imn)是由FFT得到的第n个周期的第m次谐波,其中&用户显示模块用户显示模块安装在用户住所处,与变压器附近的能量防卫装置通信,并且包括PCB240、电源和PLC电路(如图33所示);以及PCB220、LCD显示器(如图34所示)。在一个实施方式中,安装在用户住所的用户显示单元是与EG通信的双向PLC单元。例如,不仅电力公司可发送消息,用户也可要求安装在电线杆上的EG进行耗电检测。尽管本文示例性地描述了本发明的某些具体实施方式,但是本发明并不局限与这些具体细节、典型设备以及本文描述和示出的示例性的实施例。在不偏离权利要求及其等同所定义的本发明的精神和范围的前提下,可做出各种调整。附录LCM.DEF;QLCLCM(LoadControlModule)programforPIC16C63A;;include′C:\pictools\16c63a.inc′;include′C:\pictools\16c63.inc′;;ConfigurationbitsFUSES_BODEN_OFF;Brown-outresetdisabledFUSES_CP_OFF;NocodeprotectFUSES_PWRTE_OFF;Disablepower-uptimerFUSES_WDT_ON;WatchdogTimerEnabledFUSES_RC_OSC;Oscillator=RC;ProgramParameterEquatesSoftware_typeequ7;WhichPICprogramisthis?;7=LCMprogramSoftware_versionequ2;Version#LCM_base_addrequ16;AddressoffirstLCMRam_startequ020h;BeginningofavailableRAMRESET_VECTORequ0;LocationofresetvectorROM_startequ008h;firstavailableprogramlocationNum_start_bitsequ12;Numberofstartbits;;Portdefinitions;comm_portequPORTAdata_outequ3data_inequ4clock_inequ5ctI_portequPORTAdriver_enableequ0;outputbittoturnonthedriversDriver_enable_maskequ1<<driver_enable;InitializationvaluesforI/Oportsinit_TRISAequ00110000b;DatadirectionforportAinit_TRISBequ000h;Bportdatadirection-allportsoutputinit_TRISCequ000h;Cportdatadirection-alloutread_TRISCequ01fh;Cportdatadirectionforjumperread-0-4inInit_comm_port_valueequ1<<data_out+Driver_enable_maskoption_reg_valequ10001111b;Optionregisterinitvalue;bit7=1:PortBpullupsdisabled;bit6=0:Intonfallingedge;bit5=0:Timer0usesinstclock;bit4=0:Timer0countsonrisingedge;bit3=1:PrescalerusedbyWDT;bit2,1,0=111:Prescalerdivideby128;NOTE-interruptsandtimer0arenotusedbythisprogramms_presetequ700;Timesetformilliseconddelay;;RAMlocationsORGRam_startStatus_regds4;statusregisterORGStatus_regStatus_MSBds1Clk_timeout_flagequ7;Timeoutwaitingforcommclockedgebad_reset_flagequ6;Non-POR,non-WDTresetencounteredPOR_flagequ5;Power-onresetdetectedWDT_reset_flagequ4;WDTreset,notfromsleepStatus_LSBds1CPU_reset_flagequ7Need_param_refresh_flagequ6Parity_err_flagequ5Global_cmd_timerds1Jumper_stateds1;currentstateofinputjumpersParameter_regds4;CommunicationparametersorgParameter_regds1;ds2;ds1;;;Fastcommunicationvariables;Comm_stateds1;StoredstateoffastcommuartWstateds1;StoredstateoffastcommwordhandlerComm_bit_countds1;BitcounterforfastcommComm_bufferds1;fastcommwordbufferWork_addrds1;AddressreadfromjumpersTempds1;temporaryregisterTpards1;TransverseparityWord_countds1;Counterforsendingandreceiving5-bitwordsCommandds1;CommandreceivedovercommlinkRegister_IDds1;RegisterspecifiedincommcommandPIC_addrds1;AddressofthisPICchipComm_bufds5;CommunicationbufferInput_holdds1;HoldregisterforcommrcvvalueOutput_bit_regds4;HoldregisterforoutputbitmaskFlagsds1;ProgramcontrolflagsClk_wait_flagequ7;indicateswhichclockedgewearewaitingforGlobal_cmd_flagequ6;Processingglobalcommandscratchds1;WorkregisterTimeout_ctrds2;CounterforpulsedurationMillisecsds1;CounterforpulsedurationmillisecondsClk_timeout_ctrds2;counterforclocktimeoutNPR_timerds2;counterforneedparameterrefresh;ORG0a0h;Bank1RAMlocationsIF$-1and0100herror-RAMoverflowENDIF;ORGRESET_VECTORjmpstart;Jumptofirstprogramlocation;;Startofprogramspace;ORGROM_start;;Initialization;StartsetbRP0;pointtoupperregisterbankjnbNOT_POR,got_POR;Poweronreset,setflagsclrbRP0;pointtoRAMbank0JnbNOT_TO,WDT_reset;Watchdogresetsetbstatus_MSB.bad_reset_flag;IndicateunknownresetconditionjmpDo_initializeWDT_resetsetbStatus_MSB.WDT_reset_flagjmpdo_initializegot_PORclrbRP0;pointtoRAMbank0movStatus_MSB,#1<<POR_flag;SetPORflagclrStatus_LSBDo_initializemovFSR,#Ram_start+2;Pointpaststatusflags:clr_loop.clrINDF;ClearRAMlocationincFSR;IncrementpointerjzInit_state;Ifzero,donemovW,FSR;getpointerandW,#7fH;lookat7LSB′sjnz:clr_loop;Notendofsegment,continueaddFSR,#20h;Pointtonextsegmentjmp:clr_loop;Notlastsegment,continueInit_statesetbStatus_LSB.CPU_reset_flag;IndicateCPUresetsetbStatus_LSB.Need_param_refresh_flag;Indicateparameterrefreshneededmovcomm_port,#Init_comm_port_value;initializecommportstatemovComm_state,#Edge_waitmovComm_bit_count,#Num_start_bits;InitializefastcommstatemachineclrPORTBclrPORTCjmpMain_loop;startrunningmainprogram;;CommReceiveroutines;Edge_wait;InitializeWatchdogtimermov!OPTION,#option_reg_val;Setoptionregsetbcomm_port.data_out;senda1decComm_bit_count;decrementbitcountjzSee_edge_one;ifzero,lookingfora1jbInput_hold.data_in,Set_edge_wait;Lookingfor0,resetbitcountif1jmpComm_ret;doneSee_edge_onejnbInput_hold.data_in,Set_edge_wait;lookingfor1,resetif0movWstate,#Rcv_addr;FirstwordisaddressmovTpar,#01fh;InitparityjmpRcv_next_wordRcv_stopmovComm_state,#Edge_waitmovComm_bit_count,#Num_start_bits;PresetstatetowaitforedgejnbInput_hold.data_in,Parity_error;stopbitmustbe1jmpCmd_exec;Done,processreceivedbufferRcv_bitsclc;copy...snbInput_hold.data_in;...inputbit...setc;...tocarryrlComm_buffer;shiftbufferjmpRcv_word_handler;Checkforcompleteword;;CommTransmitroutines;Send_edgedecComm_bit_count;decrementbitcountjz:One;ifzero,senda1clrbcomm_port.data_out;senda0jmpComm_ret:Onesetbcomm_port.data_out;senda1jmpDo_xmit_wordSend_bitsrlComm_buffer;putxmitbitintocarryjc:oneclrbcomm_port.data_out;senda′0′jmp:check:onesetbcomm_port.data_out;senda′1′:checkjmpXmit_word_handler;;Commreceivewordhandlerroutines;Rcv_word_handlerdjnzComm_bit_count,Comm_ret;Ifwordnotcomplete,continueandComm_buffer,#03fh;only6bitsclcmovW,>>Comm_buffer;get5MSBsofreceivedwordcallparity_lookupxorW,Comm_buffer;comparewithreceivedwordjnzParity_errorrrComm_bufferandComm_buffer,#01fh;extract5-bitvaluexorTpar,Comm_buffer;calculatetotalparitymovPCLATH,#Rcv_addr<movW,WstatejmpW;ExecutewordhandlerroutineRcv_addrclrbFlags.Global_cmd_flag;ClearglobalcommandflagmovW,Comm_buffer;GetreceivedaddressmovPIC_addr,W;saveitxorW,#1fh;isitglobalcommandjnzSee_if_us;No,checkforaddressmatchsetbFlags.Global_cmd_flag;SetglobalcommandflagjmpIts_us;processrestofcommandSee_if_usmov!PORTC,#read_TRISC;SwitchCportbit0-4toinputclrbctl_port.driver_enable;Disableoutputdrivers,enablejumperreadmovtemp,#9:loopdjnztemp,:loop;Waitatleast20uSecmovW,/PORTC;GetinverseofjumpersinWmovWork_addr,W;Savejumpervaluesetbctl_port.driver_enable;Enableoutputdriversmov!PORTC,#init_TRISC;RestoreCportstatusmovJumper_state,Work_addr;SavejumperstateandWork_addr,#03h;Ignoreallbut2LSBsaddWork_addr,#LCM_base_addr;AddbaseoffsetcjneWork_addr,PIC_addr,Set_edge_waitIts_usmovWstate,#Rcv_cmd;pointtonextroutinejmpRcv_next_wordRcv_cmdmovCommand,Comm_buffer;savecommandjnbCommand.4,Comm_get_fast;Fastreadcommand,skipRegIDmovWstate,#Rcv_reg_ID;pointtonextroutinejmpRcv_next_wordComm_get_fastmovWstate,#Rcv_tpar;pointtonextroutinejmpRcv_next_wordRcv_reg_IDmovregister_ID,Comm_buffer;saveregisternumbermovWstate,#Rcv_tpar;pointtonextroutinejnbCommand.3,Rcv_next_word;Ifnovalue,donemovword_count,#7;InitwordcountmovWstate,#Rcv_value;pointtonextroutinejmpRcv_next_wordRcv_valuerlComm_bufferrlComm_bufferrlComm_buffer;ShiftrcvdbitstoMSBsmovComm_bit_count,#5;shift5bits:shift_looprlComm_bufferrlComm_buf+4rlComm_buf+3rlComm_buf+2rlComm_buf+1rlComm_buf;ShiftabitfromComm_buftocomm_bufdjnzComm_bit_count,:shift_loopdjnzword_count,Rcv_next_word;anymorewords?movWstate,#Rcv_tpar;pointtonextroutinejmpRcv_next_wordRcv_tparmovW,Tpar;GetresultofparitycalculationsjnzParity_error;Ifnot0,parityerrorjmpSet_rcv_stop;setuptoreceivestopbit;;Commtransmitwordhandlerroutines;Xmit_word_handlerdjnzComm_bit_count,Comm_ret;Ifwordnotcomplete,continueDo_xmit_wordmovPCLATH,#$<movW,WstatejmpW;ExecutewordhandlerroutineSend_addrmovWstate,#Send_cmd>;pointtonextwordroutinemovW,PIC_addr;getaddressjmpSend_next_wordSend_cmdmovWstate,#Send_value>;pointtosendvaluejnbCommand.4,Value_is_next;Isitfastreadcommand?movWstate,#Send_reg_ID>;pointtonextwordroutineValue_is_nextmovW,Command;getcommandjmpSend_next_wordSend_reg_IDmovWstate,#Send_value>;pointtonextwordroutinemovW,Register_ID;getRegisterIDjmpSend_next_wordSend_valuemovWstate,#Next_value>;pointtonextwordroutinemovWord_count,#7;valueis7wordslongNext_valuemovComm_bit_count,#5:looprlcomm_buf+4rlcomm_buf+3rlComm_buf+2rlComm_buf+1rlComm_bufrlComm_bufferdjnzComm_bit_count,:loopmovW,Comm_buffer;Get5-bitworddjnzword_count,Send_next_word;ifnotlastword,allsetmovWstate,#Send_Tpar>;sendparitynextmovW,Comm_bufferjmpSend_next_wordSend_TparmovWstate,#Send_stop;pointtonextwordroutinemovW,Tpar;gettransverseparityjmpSend_next_wordSend_stopjmpSet_edge_wait;Gobacktoreceivemode;;;Processreceivedbuffer;org100hCmd_execProcess_cmdcjbeCommand,#7h,Fast_register_read;isitfastread?cjeCommand,#10h,read_register;isitreadregistercommand?cjeCommand,#18h,write_register;isitwriteregister?cjeCommand,#19h,reset_status_bits;isitresetstatus?jmpCmd_process_doneFast_register_readmovregister_ID,command;RegisternumberissameascommandcodeRead_registermovW,#27movW,register_ID-W;GetindexofregistertoreadjncCmd_process_done;ifnegative,notavalidregistermovTemp,W;saveindexmovPCLATH,#$<;setupHigh-orderPCbitsmovW,Temp;getindexjmpPC+Wjmpcpy_output_regjmpcpy_reg_28jmpcpy_reg_29jmpcpy_reg_30Cpy_reg_31;Reg31=StatusregistermovComm_buf,Status_regmovComm_buf+1,Status_reg+1movComm_buf+2,Status_reg+2movComm_buf+3,Status_reg+3jmpSetup_replyCpy_reg_30;Reg30=Serialnumbercallsernomovcomm_buf+3,Wcallserno+1movcomm_buf+2,Wcallserno+2movcomm_buf+1,Wcallserno+3movcomm_buf,WjmpSetup_replyCpy_reg_29;Reg29=SoftwaretypeandversionmovComm_buf,#Software_typemovComm_buf+1,#Software_versionmovComm_buf+2,#0movComm_buf+3,#0;SendSoftwaretypeandversionjmpSetup_replyCpy_reg_28;Reg28=ParameterregmovComm_buf,Parameter_regmovComm_buf+1,Parameter_reg+1movComm_buf+2,Parameter_reg+2movComm_buf+3,Parameter_reg+3jmpSetup_replyCpy_output_reg;Reg27=OutputstatemovComm_buf,Output_bit_regmovComm_buf+1,Output_bit_reg+1movComm_buf+2,Output_bit_reg+2movComm_buf+3,Output_bit_reg+3jmpSetup_replyWrite_registermovComm_bit_count,#5;needtoshiftbufferby5bits:looprlcomm_buf+4rlcomm_buf+3rlcomm_buf+2rlcomm_buf+1rlcomm_bufdjnzComm_bit_count,:loopcjneRegister_ID,#28,See_write_output_reg;Notreg28,seeifoutputregmovParameter_reg,Comm_bufmovParameter_reg+1,Comm_buf+1movParameter_reg+2,Comm_buf+2movParameter_reg+3,Comm_buf+3;CopyreceiveddatatoregclrbStatus_LSB.Need_param_refresh_flag;ResetneedparameterrefreshflagjmpCpy_reg_28;sendcontentsbackinreplySee_write_output_regcjneRegister_ID,#27,Cmd_process_done;ifnotoutputreg,ignoremovOutput_bit_reg,Comm_bufmovOutput_bit_reg+1,Comm_buf+1movOutput_bit_reg+2,Comm_buf+2movOutput_bit_reg+3,Comm_buf+3;CopyreceiveddatatoregcallUpdate_outputsjmpCpy_output_reg;sendcontentsbackinreplyReset_status_bitsmovComm_bit_count,#5;needtoshiftbufferby5bits:looprlcomm_buf+4rlcomm_buf+3rlcomm_buf+2rlcomm_buf+1rlcomm_bufdjnzComm_bit_count,:loopmovW,/Comm_buf+1;getbyteandStatus_reg+1,W;ClearbitsmovW,/Comm_buf;getMSBandStatus_reg,W;ClearbitsmovRegister_ID,#31;indicatestatusreginreplyjmpCpy_reg_31Setup_replyjbFlags.Global_cmd_flag,Set_edge_wait;Ifitwasglobal,don′treplymovW,Status_LSB;GetstatusLSBmovComm_buf+4,W;presetstoredflagsandW,#01fh;Turnoff3MSBsorW,Status_MSB;Combine5LSbswithStatus_MSBszsetbComm_buf+4.7;Ifanyotherflagbitsset,indicateinMSBmovTpar,#1fh;InitializeparitywordmovComm_state,#Send_edge;Gotosend_edgestatemovWstate,#Send_addr;PointtonextroutinemovComm_bit_count,#Num_start_bits;InitnumberofbitsjmpComm_retCmd_process_donejmpSet_edge_wait;Noreplyneeded,done;;Exitroutinesforcomm;Parity_errorsetbstatus_LSB.Parity_err_flag;IndicateparityerrorSet_edge_waitmovComm_state,#Edge_wait;GotoedgewaitstatemovComm_bit_count,#Num_start_bits;InitnumberofbitsjmpComm_retSet_send_replymovComm_state,#Send_edge;GotosendedgestatemovComm_bit_count,#Num_start_bitsjmpComm_retRcv_next_wordmovComm_state,#Rcv_bits;setuptoreceive6-bitwordmovComm_bit_count,#6jmpComm_retSend_next_wordandW,#01fh;only5bitsxorTpar,W;updateparitycalculationcallparity_lookupmovComm_buffer,W;Savewordwithparity(6bits)rlComm_bufferrlComm_buffer;movetoMSbsmovComm_state,#Send_bits;setuptosend6-bitwordmovComm_bit_count,#6jmpComm_retSet_rcv_stopmovComm_state,#Rcv_stop;pointtonextroutinejmpComm_retORG200hSerno;retw05ah,092h,05fh,000h;retw0ffh,0ffh,0ffh,0ffhds4ret;;;Returns6-bitvaluecorrespondingtopassed5-bitvaluewithoddparity;parity_lookupmovTemp,W;SaveindexmovPCLATH,#:table<;Setuphigh-orderbitsmovW,Temp;getindexjmppc+w:tableretw1,2,4,7,8,11,13,14,16,19,21,22,25,26,28,31,32,35,37,38,41,42,44,47,49,50,52,55,56,59,61,62;;Setsoutputbitsaccordingtoreceiveddata;Comm_buf=Pulsedurationinmilliseconds;0:Continuousoutput(infiniteduration);1-255:Setoutputstateforspecifiedduration;Afterdurationisover,turnalloutputsoff;;Comm_buf+1[3]=Bitmapofoutputstates-MSBfirst;bits23-18:Unused;bits17-0:Outputs18-1;Update_outputsmovW,Comm_buf+3;getlsbsandW,#03h;onlyneed2bitsmovTemp,WaddTemp,W;Shiftintobits1and2(X1andX2)movW,PORTA;GetpresentstatusofportApinsandW,#0f9h;clearoutputcontrolbitsorW,Temp;SetdesiredoutputstatemovPORTA,W;outputnewvaluerrcomm_buf+1rrcomm_buf+2rrcomm_buf+3rrcomm_buf+1rrcomm_buf+2rrcomm_buf+3;shiftbufferleft2bitsmovPORTB,comm_buf+2movPORTC,comm_buf+3mov!PORTA,#init_TRISAmov!PORTB,#init_TRISBmov!PORTC,#init_TRISCmovMillisecs,Comm_buf;firstbyteispulsedurationjzdone_output_setms_loopmovTimeout_ctr,#ms_preset<movTimeout_ctr+1,#ms_preset>:loopdjnzTimeout_ctr+1,:loopdjnzTimeout_ctr,:loopdjnzMillisecs,ms_loop;delayforpulsedurationandPORTA,#0f9h;turnoffX1andX2clrPORTBclrPORTC;turnoffotheroutputsdone_output_setret;;MainProgramstart;Main_loopmov!PORTA,#Init_TRISA;InitializeportAdirectionmov!PORTB,#Init_TRISB;InitializeportBdirectionmov!PORTC,#Init_TRISC;InitportCdirectionmovClk_timeout_ctr,#12;preset...clrClk_timeout_ctr+1;...clocktimeoutcounterclrbFlags.Clk_wait_flag;IndicatewaitingforclocklowClkwait_loopdjnzscratch,Clk_contclrWDT;ResetwatchdogdjnzClk_timeout_ctr+1,Clk_contdjnzClk_timeout_ctr,Clk_contjbStatus_MSB.POR_flag,got_POR;IgnoreclocktimeoutuntilPORflagclearedsetbStatus_MSB.Clk_timeout_flag;Indicatetimeoutoncommclockjmpdo_initializeClk_contjbComm_port.clock_in,:high;clockhigh:lowjbFlags.Clk_wait_flag,Clkwait_loopmovInput_hold,Comm_port;SaveDataportvaluesetbFlags.Clk_wait_flag;IndicatewaitingforclockhighjmpClkwait_loop:highjnbFlags.Clk_wait_flag,Clkwait_loopdjnzNPR_timer+1,:cont;DecLSBofneedparmtimerdjnzNPR_timer,:cont;DecMSBsetbStatus_LSB.Need_param_refresh_flag;setflagevery64kclocks:contmovPCLATH,#0;Setuphigh-orderbitsforroutinesinpage0movW,Comm_state;getvectorjmpW;ExecutecommstatemachineComm_retjmpMain_loopPIC.DEF/*includefileforserialcommunicationwithPICchips*/#pragmaswitch(ALL,FREQ)switch(PIC_serial_status){casesending_bits:casesending_st5_bits:#ifdefVATESTout_bit_value=(PICxmitBuf.bits.bufLongand0x80000000)!=0;/*outbitvalue=MSB*/PICxmitBuf.bits.bufLong=PICxmitBuf.bits.bufLong<<1;if(PICxmitBuf.bits.bufLong[1]and0x80000000)PICxmitBuf.bits.bufLong++;PICxmitBuf.bits.bufLong[1]=PICxmitBuf.bits.bufLong[1]<<1;if(PICxmitBuf.bits.bufLong[2]and0x80000000)PICxmitBuf.bits.bufLong[1]++;PICxmitBuf.bits.bufLong[2]=PICxmitBuf.bits.bufLong[2]<<1;/*Shift96-bitbuffer*/#elseout_bit_value=0;shift_LSB_ptr=andPICxmitBuf.bits.bufByte[12];/*pointpastleastsignificantwordof96-bitregister*/asm(″MOVE.L_shift_LSB_ptr,A0″,/*Getpointertobuffer,clearcarry*/″ROXL.W-(A0)″,/*rotateleftanddecrementpointer*/″ROXL.W-(A0)″,/*rotateleftanddecrementpointer*/″ROXL.W-(A0)″,/*rotateleftanddecrementpointer*/″ROXL.W-(A0)″,/*rotateleftanddecrementpointer*/″ROXL.W-(A0)″,/*rotateleftanddecrementpointer*/″ROXL.W-(A0)″,/*96bitshavebeenshifted,MSBisincarry*/″ROXL.W_out_bit_value″/*PutMSBinout_bit_value*/);#endifbreak;casedo_send_cmd:bit_count=NUM_START_BITS-1;PIC_serial_status=sending_start;out_bit_value=0;break;casedo_PIC_start:bit_count=3*BITS_PER_SEC;out_bit_value=1;PIC_serial_status=sending_PIC_start;break;casesending_start:out_bit_value=0;break;casesending_stop:casesending_start_1:out_bit_value=1;break;default:out_bit_value=1;}if(out_bit_value)fs1004.io.pulseOut2Off=1;elsefs1004.io.pulseOut2Off=0;/*Sendbitout*/in_bit_value=fs1004.io.pulseIn1State;/*Getrcvdbitvalue*/fs1004.io.pulseOut1Off=1;/*Sendclockrisingedge*/switch(PIC_serial_status){casewaiting_for_start:if(in_bit_value==0)zero_count++;else{if(zero_count==(NUM_START_BITS-1)){PIC_serial_status=rcving_bits;bit_count=PICrcvBuf.bitCount+1;}elsezero_count=0;}break;casercving_bits:#ifdefVATESTPICrcvBuf.bits.bufLong=PICrcvBuf.bits.bufLong<<1;if(PICrcvBuf.bits.bufLong[1]and0x80000000)PICrcvBuf.bits.bufLong++;PICrcvBuf.bits.bufLong[1]=PICrcvBuf.bits.bufLong[1]<<1;if(PICrcvBuf.bits.bufLong[2]and0x80000000)PICrcvBuf.bits.bufLong[1]++;PICrcvBuf.bits.bufLong[2]=(PICrcvBuf.bits.bufLong[2]<<1)+in_bit_value;#elseshift_LSB_ptr=andPICrcvBuf.bits.bufByte[12];/*pointpastleastsignificantwordof96-bitregister*/asm(″MOVE.L_shift_LSB_ptr,A0″,/*Getpointertobuffer,clearcarry*/″ROXL.W-(A0)″,/*rotateleftanddecrementpointer*/″ROXL.W-(A0)″,/*rotateleftanddecrementpointer*/″ROXL.W-(A0)″,/*rotateleftanddecrementpointer*/″ROXL.W-(A0)″,/*rotateleftanddecrementpointer*/″ROXL.W-(A0)″,/*rotateleftanddecrementpointer*/″ROXL.W-(A0)″/*96bitshavebeenshifted,LSbisunknown*/);PICrcvBuf.bits.bufByte[11]=(PICrcvBuf.bits.bufByte[11]and0xfe)|in_bit_value;/*addinreceivedbit*/#endifbreak;default:{}}if(-bit_count<=0){switch(PIC_serial_status){casercving_bits:PIC_serial_status==rcving_stop;bit_count=1;break;casesending_bits:PIC_serial_status=sending_stop;bit_count=1;break;casesending_stop:if(PICxmitBuf.PIC_addr==GLOBAL_PIC_ADDR)PIC_serial_status=idle;else{PIC_serial_status=waiting_for_start;bit_count=PIC_wait_limit;zero_count=0;}break;casesending_PIC_start:PIC_serial_status=idle;break;casesending_start:PIC_serial_status=sending_start_1;bit_count=1;break;casesending_start_1:PIC_serial_status=sending_bits;bit_count=PICxmitBuf.bitCount;break;casewaiting_for_start:PICrcvBuf.flags|=rcv_timeout_flag|rcv_data_ready_flag;PIC_serial_status=idle;break;casercving_stop:if(in_bit_value==0)PICrcvBuf.flags|=rcv_bad_length_flag;PIC_serial_status=idle;PICrcvBuf.flags|=rcv_data_ready_flag;bit_count=1;break;default:PIC_serial_status=idle;}}#pragmaswitch(ALL,NOFREQ)PULSE.C#include″mtrlink.def″/*#include″flash.def″*/#definePSTRU_DEFINED#include″pulselink.def″#include″pulse.h″#include″ufloat.h″#include″log.h″#include″alarm.h″#include″copymem.h″#include″plcctrl.h″#include<stdio.h>#ifdeffakeMC5#undefNUMPH#defincNUMPH24#endif/*defincWDTflagsforthePICcommunicationroutine*/#pragmaregion(″ram=WDTFIags″)shortihtWDTpulseSec;#pragmaregion(″ram=ram″)#pragmaregion(″data=secondBack″)void(*pulseSecondp)(void)=pulseSecond;#ptagmaregion(″data=data″)#ifndefIS_MC5#pragmaregion(″data=everySubsecond″)#ifdefIS_RSMvoid(*pulseSubsecp)(void)=pulseSubsecond;#elsevoid(*pulseSubsecp)(void)=pulseService;#endif#pragmaregion(″data=data″)#endif#pragmaregion(″data=powerUp″)void(*pulseStartupp)(void)=pulseStartup;#pragmaregion(″data=data″)#pragmaregion(″data=dayBack″)void(*pulseDayp)(void)=pulseDay;#pragmaregion(″data=data″)/*clearoutPIC*/voidpulseColdstart(){inti;for(i=0;i<num_PICs;i++)if(PIC_status[i].software_type==3){PIC_status[i].clear_pulse_regs=TRUE;PIC_status[i].get_status=TRUE;}clear_state=SEND_GLOBAL_CLR;}voidpulseStartup(void){inti;#ifndefIS_RSMintwork_PIC_addr;#endif#ifdefIS_MC5intwork_num_pulses;#endif#ifdefVATEST!*test!!!!!*/temp_command=SYSTEM_CONTROL;temp_reg_ID=0;temp_command_data=READ_ENCODER_ID;temp_flags=rcv_data_ready_flag;#endiffor(i=0;(!dont_clear_PIC_stats)andand(i<(2*NUMPH));i++){pulseData[i].error_cnt=0;pulseData[i].ID_field=0;pulscData[i].reading=0;}for(i=0;i<MAX_PICS;i++)PIC_status[i].PIC_addr=0;hold_num_pulse_ctrs=releaseCodep->option.numPulseCounters;if(hold_num_pulse_ctrs>NUMPH)num_pulse_ctrs=NUMPH;elsenum_pulse_ctrs=hold_num_pulse_ctrs;num_PICs=1;#ifdefIS_MC5PIC_status.PIC_addr=MC5_MUX_PIC_ADDR;/*IfMC5,addPDMPIC(s)toPICtable*/if(int_configltmessg.configLTM[PULSE1].accum){work_num_pulses=num_pulse_ctrs;work_PIC_addr=0;while(work_num_pulses>0){PIC_status[num_PICs++].PIC_addr=work_PIC_addr++;/*PulsecountersforQ13*/work_num_pulses-=4;}}if(int_configltmessg.configLTM[PULSE2].accum){work_num_pulses=num_pulse_ctrs;work_PIC_addr=6;while(work_num_pulses>0){PIC_status[num_PICs++].PIC_addr=work_PIC_addr++;/*PulsecountersforQ14*/work_num_pulses-=4;}}num_LCMs=releaseCodep->option.LCM_flagsand0x03;work_PIC_addr=LCM_BASE_ADDR;for(i=0;i<num_LCMs;i++){PIC_status[num_PICs++].PIC_addr=work_PIC_addr++;/*LCM′s*/}#else#ifdefIS_ST5PIC_staatus.PIC_addr=ST5_MUX_PIC_ADDR;/*IfST5,addmuxtoPICtable*/ATM_work=releaseCodep->option.couplers_mask;work_PIC_addr=ATM_BASE_ADDR;for(i=0;i<4;i++){if((ATM_workand0x08)!=0){/*Bitissetinmask,addATMPICtotable*/PIC_status[num_PICs++].PIC_addr=work_PIC_addr;}work_PIC_addr++;ATM_work=ATM_work<<1;}#elseif(num_pulse_ctrs==0)num_PICs=0;#endif#endiffor(i=0;i<MAX_PICS;i++){/*BuildPICtable*/PIC_status[i].get_serno=TRUE;PIC_status[i].get_version=TRUE;PIC_status[i].get_status=FALSE;PIC_status[i].reset_xtatus=FALSE;PIC_status[i].update_parameter=FALSE;if(!dont_clear_PIC_stats){PIC_status[i].PIC_reset_count=0;PIC_status[i].comm_error_count=0;PIC_status[i].PIC_data_err_count=0;PIC_status[i].software_type=0;PIC_status[i].software_version=0;PIC_status[i].serial_number=0;}PIC_status[i].curr_pulse_reg=0;#ifdefIS_MC5if(PIC_status[i].PIC_addr>=ST5_MUX_PIC_ADDR)PIC_status[i].reply_wait_limit=DIRECT_PIC_WAIT_LIMIT;elsePIC_status[i].reply_wait_limit=BUFFERED_PIC_WAIT_LIMIT;#elsePIC_status[i].reply_wait_limit=DIRECT_PIC_WAIT_LIMIT;#endifif(PIC_status[i].PIC_addr<=MAX_PULSE_PIC_ADDR)PIC_status[i].num_pulse_regs=PULSES_PER_PIC;elsePIC_status[i].num_pulse_regs=0;}current_PIC_index=0;rcv_PIC_index=0;if(dont_clear_PIC_stats)dont_clear_PIC_stats=FALSE;/*Clearflag*/else{PIC_bad_addr_count=0;PICrcvBuf.flags=0;PIC_serial_status=do_PIC_start;PIC_clk_state=clk_low;/*Initializeserialcommvariables*/}clear_state=NO_GLOBAL_SEND;pulseOutMode=releaseCode.option.picMode;/*forcompatibilitywitholdcode*/if(startup.coldStart){pulseColdstart();}}constunsignedcharparity6[32]={1,2,4,7,8,11,13,14,16,19,21,22,25,26,28,31,32,35,37,38,41,42,44,47,49,50,52,55,56,59,61,62};voidpulseDay(){dont_clear_PIC_stats=TRUE;/*TellpulseStartupnottoclearerrorcounts*/rebuild_timer=REBUILD_DELAY;/*Setupfordelayedtablerebuild*/}voidpulseSecond(){#ifndefIS_ST5pulseService();#endifif(Comm_background_flags.do_rebuild){pulseStartup();Comm_background_flags.do_rebuild=FALSE;}if(Comm_background_flags.do_alarm){putAlarm(andPIC_alarm,4);Comm_background_flags.do_alarm=FALSE;}}/*set_PLC_relaysfunction*//*CalledfromPLCroutinestorequestupdateof*//*PLCportmultiplexerPICchiponST5powerboard*/#ifdefIS_ST5voidset_PLC_relays(intxmitRelay,intrcvRelay){while(MUX_control.active_flag||MUX_control.request_flag){ccwait();}MUX_control.xmit_mask=xmitRelay;MUX_control.rcv_mask=rcvRelay;MUX_control.done_flag=FALSE;MUX_control.request_flag=TRUE;if((MUX_control.xmit_mask!=MUX_control.last_xmit_mask)||(MUX_control.rcv_mask!=MUX_control.last_rcv_mask)){while(!MUX_control.done_flagandand!(MUX_control.active_flagandand(PIC_serial_status==rcving_bits))){ccwait();}}}#endifvoidpulseService(void){BOOLEANneed_pulse_read,copy_rcvd_data,rcv_buf_err;#ifdefIS_MC5BOOLEANgot_ver_3,got_ver_3_3;intj;unsignedchar*work_char_ptr;unsignedlongwork_bit_mask;#endifintwork_pulse_index;phaccumaccumXfer;inti;if(num_PICs==0)PIC_serial_status=idle;if(PIC_serial_status==idle){if(!WDTpulseSec)WDTpulseSec=1;/*TellWDTcontrollerthatweareOK*/}if(hold_numpulse_ctrs!=releaseCodep->option.numPulseCounters){/*hdwr-nhaschanged*/dont_clear_PIC_stats=FALSE;rebuild_timer=1;/*Forceimmediatetablerebuild*/}if((PIC_serial_status==idle)andand(rebuild_timer!=0)andand(--rebuild_timer==0)){Comm_background_flags.do_rebuild=TRUE;}elseif((PIC_serial_status==idle)andand(num_PICs!=0)andand(pulseOutMode!=PIC_MC_SERIAL)andand(!Comm_background_flags.do_rebuild))/*Serialprocessingenabled?*/{if(PICrcvBuf.flagsandrcv_data_ready_flag){/*Processreceivedmessage*/PICrcvBuf.flagsand=~rcv_data_ready_flag;rcv_buf_err=!decode_rcv_buffer();if((PIC_comm_mon.control_flagsandRCV_DATA_RDY)==0){PIC_comm_mon.rcv_buf=PICrcvBuf;PIC_comm_mon.control_flags|=RCV_DATA_RDY;}if((ext_comm.control_flagsandCPY_RCV_DATA)!=0){ext_comm.rcv_buf=PICrcvBuf;ext_comm.control_flagsand=~CPY_RCV_DATA;ext_comm.control_flags|=RCV_DATA_RDY;}#ifdefIS_ST5if(ATM_control.active_flag){ATM_control.result_flags=PICrcvBuf.flags;if(rcv_buf_err){if(ATM_control.state!=WAIT_ALIGN){ATM_control.error_flag=TRUE;ATM_control.active_flag=FALSE;ATM_control.done_flag=TRUE;}}else{switch(ATM_control.state){caseDO_PRESET:{ATM_control.xmit_level=PICrcvBuf.command_data>>24;ATM_control.coupler_level=(PICrcvBuf.command_data>>16)and0x0ff;ATM_control.active_flag=FALSE;}break;caseSET_ALIGN:{ATM_control.state=WAIT_ALIGN;}break;caseWAIT_ALIGN:{ATM_control.optimum_cap_code=PICrcvBuf.command_dataandATM_RC_CAP_MASK;ATM_control.optimum_reading=PICrcvBuf.command_data>>16;ATM_control.result_flags|=(PICrcvBuf.command_dataand0xe000);/*Copyflagsfromreply*/if((ATM_control.result_flagsand0xc000)!=0){/*Analoglevelsoutofrange*/ATM_control.error_flag=TRUE;}if(ATM_control.optimum_reading<ATM_MIN_READING){ATM_control.result_flags|=0x1000;/*Indicatereadingtoolow*/ATM_control.error_flag=TRUE;}ATM_control.active_flag=FALSE;}break;caseDO_PLC_SET:caseDO_ATM_DISCONNECT:{ATM_control.active_flag=FALSE;}break;default:{ATM_control.active_flag=FALSE;ATM_control.error_flag=TRUE;}break;}}if(!ATM_control.active_flag)ATM_control.done_flag=TRUE;}if(MUX_control.active_flag){MUX_control.result_flags=PICrcvBuf.flags;if(rcv_buf_err){MUX_control.error_flag=TRUE;MUX_control.last_xmit_mask=0;MUX_control.last_rcv_mask=0;}else{MUX_control.last_xmit_mask=PICrcvBuf.command_dataand0xff;MUX_control.last_rcv_mask=(PICrcvBuf.command_data>>8)and0xff;}MUX_control.active_flag=FALSE;MUX_control.done_flag=TRUE;}#endifif(rcv_buf_err){#ifdefIS_ST5if(!ATM_control.active_flag||(ATM_control.state!=WAIT_ALIGN))#endif{last_comm_err_flag=PICrcvBuf.flags;copymem(sizeof(PICbitBuf),(char*)(andHoldrcvBuf),(char*)(andPICrcvBuf));if((PICrcvBufflagsandrcv_bad_addr_flag)!=0){/*pastendofvalidPICs,addresserror*/PIC_bad_addr_count++;set_PIC_alarm(PIC_adderr_0,PICrcvBuf.PIC_addr,(PICxmitBuf.PIC_addr<<8)+PICxmitBuf.command);}else{/*PICaddresswasvalid,butcommfailed*/PIC_status[rcv_PIC_index].comm_error_count++;if(PIC_status[rcv_PIC_index].comm_error_count>2){set_PIC_alarm(PIC_comerr_0,PIC_status[rcv_PIC_index].PIC_addr,PICrcvBuf.flags);}/*LostcontactwithPIC,readserialnumberandsoftwareversion*/PIC_status[rcv_PIC_index].get_serno=TRUE;PIC_status[rcv_PIC_index].get_version=TRUE;}}}else{/*Validmessagereceived*/if((PICrcvBuf.command==READ_REGISTER)andand(PICrcvBuf.reg_ID==STATUS_REG)){process_status_bits();}elseif(PICrcvBuf.command==SYSTEM_CONTROL){if(PICrcvBuf.reg_ID==STATUS_REG){/*Responsefromeresetstatusbitscmd*/PIC_status[rcv_PIC_index].reset_status=FALSE;process_status_bits();}#ifdefIS_MC5elseif((PIC_status[rcv_PIC_index].software_type==4)andand((PIC_status[rcv_PIC_index].last_cmd_dataand0xffff0000)==READ_ENCODER_ID)){/*responsefromencoderreadIDcomd*/work_pulse_index=(PICrcvBuf.PIC_addr*PULSES_PER_PIC)+PICrcvBuf.reg_ID;i=(PIC_status[rcv_PIC_index].last_cmd_dataand0x0000ff00)>>8;work_char_ptr=(unsignedchar*)andPICrcvBuf.command_data;for(j=0;j<4;j++){if((*work_char_ptr==0)||(i>=ID_FIELD_LENGTH)){j=10;/*indicateendofmessagefound*/}else{pulseData[work_pulse_index].ID_buffer[i]=*work_char_ptr;i++;work_char_ptr++;}}if(j>5){/*foundendofIDfieldfromremoteencoder*/for(i=0;i<ID_FIELD_LENGTH;i++){pulseData[work_pulse_index].ID_field[i]=pulseData[work_pulse_index].ID_buffer[i];pulseData[work_pulse_index].ID_buffer[i]=0;}}}}elseif((PICrcvBuf.command==READ_REGISTER)andand(PICrcvBuf.reg_ID==ERROR_REG)){if(PIC_status[rcv_PIC_index].software_type==4){/*Remoteencoderinterfacemodule*/work_pulse_index=(PICrcvBuf.PIC_addr*PULSES_PER_PIC)+(PICrcvBuf.command_data>>24);if(work_pulse_index<(2*NUMPH)){pulseData[work_pulse_index].error_cnt++;for(i=0;i<ID_FIELD_LENGTH;pulseData[work_pulse_index].ID_buffer[i++]=0);}}#endif}elseif((PICrcvBuf.command==WRITE_REGISTER)andand(PICrcvBuf.reg_ID==PARM_REG)){PIC_status[rcv_PIC_index].update_parameter=FALSE;}elseif((PICrcvBuf.command==READ_REGISTER)andand(PICrcvBuf.reg_ID==VERS_REG)){PIC_status[rcv_PIC_index].get_version=FALSE;PIC_status[rcv_PIC_index].software_type=(PICrcvBuf.command_dataand0xff000000)>>24;PIC_status[rcv_PIC_index].software_version=(PICrcvBuf.command_dataand0x00ff0000)>>16;PIC_status[rcv_PIC_index].loop_rate=(PICrcvBuf.command_dataand0x0000ff00)>>8;}elseif((PICrcvBuf.command==READ_REGISTER)andand(PICrcvBuf.reg_ID==SERNO_REG)){PIC_status[rcv_PIC_index].get_serno=FALSE;PIC_status[rcv_PIC_index].serial_number=PICrcvBuf.command_data;}elseif(((PICrcvBuf.command==READ_REGISTER)||(PICrcvBuf.command<=MAX_FAST_READ))andand(PICrcvBuf.reg_ID<=MAX_PULSE_REG)){/*Pulsereading*/work_pulse_index=(PICrcvBuf.PIC_addr*PULSES_PER_PIC)+PICrcvBuf.reg_ID;if(work_pulse_index<(NUMPH*2)){pulseData[work_pulse_index].reading=PICrcvBuf.command_data;copy_rcvd_data=FALSE;if(PIC_status[rcv_PIC_index].get_version){}elseif(PIC_status[rcv_PIC_index].software_type==4){/*Remoteencoderinterfacemodule*/copy_rcvd_data=TRUE;accumXfer.low=pulseData[work_pulse_index].reading;}elseif(PIC_status[rcv_PIC_index].software_type==3){/*Remotepulsecountermodule*/copy_rcvd_data=TRUE;if(!PIC_status[rcv_PIC_index].get_serno){sprintf((char*)pulseData[work_pulse_index].ID_field,″S%08ldP%d″,PIC_status[rcv_PIC_index].serial_number,PICrcvBuf.reg_ID);}if(releaseCode.option.countEveryEdge){accumXfer.low=pulseData[work_pulse_index].reading;}else{accumXfer.low=pulseData[work_pulse_index].reading>>1;}}accumXfer.high=0L;#ifndefVATESTif(copy_rcvd_data){#ifndefIS_MC5/*ItisanRSMorST5,somappingforpulse1thru4isM1Q13,M1Q14,M2Q13,M2Q14*/ph[work_pulse_index/2][(work_pulse_indexand0x01)?PULSE2:PULSE1].accum=ph[1][work_pulse_index/2][(work_pulse_indexand0x01)?PULSE2:PULSE1].accum=accumXfer;#else/*ItisanMC5,somappingforpulse1thru48isM1Q13..M24Q13,M1Q14..M24Q14*/ph[work_pulse_index%NUMPH][(work_pulse_index/NUMPH)?PULSE2:PULSE1].accum=ph[1][work_pulse_index%NUMPH][(work_pulse_index/NUMPH)?PULSE2:PULSE1].accum=accumXfer;#endif}#endif}}if((PICrcvBuf.flagsand(PIC_error_flag|PIC_invalid_data_flag))!=0)PIC_status[rcv_PIC_index].get_status=TRUE;if((PICrcvBuf.flagsandPIC_need_refresh_flag)!=0)PIC_status[rcv_PIC_index].update_parameter=TRUE;/*checkstatusflags*/}}/*Decidewhatcommandtosend*/PICxmitBuf.flags=0;#ifndefIS_ST5/*MC5orRSM,checkforcold-startprocessingtoclearpulseregisters*/if(clear_state==SEND_GLOBAL_CLR){/*Coldstart,sendglobalclr*/PICxmitBuf.PIC_addr=GLOBAL_PIC_ADDR;PICxmitBuf.command=CLEAR_PULSE_REGISTERS;format_xmit_buffer();clear_state=SENDING_GLOBAL_CLR;PIC_serial_status=do_send_cmd;/*StartUART*/}elseif(clear_state==SENDING_GLOBAL_CLR).{clear_state=GLOBAL_CLR_SENT;}#else/*ST5,checkforATM(AutomaticTuningModule)operations*/if(ATM_control.request_flag){ATM_control.request_flag=FALSE;ATM_control.error_flag=FALSE;ATM_control.active_flag=TRUE;ATM_control.state=ATM_DONE;PICxmitBuf.PIC_addr=ATM_control.ATM_number+ATM_BASE_ADDR;switch(ATM_control.operation){caseSET_PRE_ALIGN:PICxmitBuf.command=WRITE_REGISTER;PICxmitBuf.reg_ID=OUTPUT_REG;PICxmitBuf.command_data=ATM_control.start_cap_codeandATM_RC_CAP_MASK;PICxmitBuf.command_data|=ATM_PRESET_CODE;ATM_control.state=DO_PRESET;break;caseDO_ALIGN:PICxmitBuf.command=WRITE_REGISTER;PICxmitBuf.reg_ID=CONTROL_REG;if(ATM_control.start_cap_code>ATM_control.end_cap_code)ATM_control.end_cap_code=ATM_control.start_cap_code;PICxmitBuf.command_data=ATM_control.start_cap_codeandATM_RC_CAP_MASK;PICxmitBuf.command_data=(PICxmitBuf.command_data<<12)|(ATM_control.end_cap_codeandATM_RC_CAP_MASK)|(ATM_MEAS_TIME<<24);ATM_control.state=SET_ALIGN;ATM_control.align_timer=ATM_control.end_cap_code-ATM_control.start_cap_code;ATM_control.align_timer*=((ATM_DISC_TIME+ATM_MEAS_TIME+4)*(1.25/62.5));ATM_control.align_timer+=13;/*Timein1/64sectowaitbeforecheckingresult*//*Numberofsteps*timeperstep+25%+2second*/break;caseSET_NORMAL_PLC:PICxmitBuf.command=WRITE_REGISTER;PICxmitBuf.reg_ID=OUTPUT_REG;PICxmitBuf.command_data=ATM_control.optimum_cap_codeandATM_RC_CAP_MASK;PICxmitBuf.command_data|=ATM_PLC_CODE;ATM_control.state=DO_PLC_SET;break;caseDISCONNECT_COUPLER:PICxmitBuf.command=WRITE_REGISTER;PICxmitBuf.reg_ID=OUTPUT_REG;PICxmitBuf.command_data=ATM_control.optimum_cap_codeandATM_RC_CAP_MASK;PICxmitBuf.command_data|=ATM_DISC_CODE;ATM_control.state=DO_ATM_DISCONNECT;break;default:caseREAD_XMIT_LEVEL:ATM_control.error_flag=TRUE;ATM_control.done_flag=TRUE;ATM_control.active_flag=FALSE;break;}if(ATM_control.active_flag){format_xmit_buffer();PIC_wait_limit=DIRECT_PIC_WAIT_LIMIT;PIC_serial_status=do_send_cmd;/*StartUART*/}}elseif(ATM_control.active_flag){if((ATM_control.state!=WAIT_ALIGN)||(--ATM_control.align_timer<=0)){ATM_control.error_flag=TRUE;ATM_control.done_flag=TRUE;ATM_control.active_flag=FALSE;}else{/*pollATMforauto-tuneend*/PICxmitBuf.command=0;format_xmit_buffer();PIC_wait_limit=DIRECT_PIC_WAIT_LIMIT;PIC_serial_status=do_send_cmd;/*StartUART*/}}elseif(MUX_control.request_flag){MUX_control.request_flag=FALSE;MUX_control.error_flag=FALSE;if((pulseOutMode==PIC_ST_SERIAL)){PICxmitBuf.bits.bufByte=((MUX_control.rcv_maskand0x03)<<5)|((MUX_control.xmit_maskand0x7f)>>2);PICxmitBuf.bits.bufByte[1]=((MUX_control.xmit_maskand0x03)<<6);bit_count=11;PIC_serial_status=sending_st5_bits;/*StartUART*/MUX_coutrol.last_xmit_mask=MUX_control.xmit_mask;MUX_control.last_rcv_mask=MUX_control.rcv_mask;MUX_control.done_flag=TRUE;}else{MUX_control.active_flag=TRUE;PICxmitBuf.PIC_addr=ST5_MUX_PIC_ADDR;PICxmitBuf.command=WRITE_REGISTER;PICxmitBuf.reg_ID=OUTPUT_REG;PICxmitBuf.command_data=(MUX_control.rcv_mask<<8)+MUX_control.xmit_mask;format_xmit_buffer();PIC_wait_limit=DIRECT_PIC_WAIT_LIMIT;PIC_serial_status=do_send_cmd;/*StartUART*/}}#endifelseif((ext_comm.control_flagsand(XMIT_DATA_RDY|XMIT_REQUEST))==(XMIT_DATA_RDY|XMIT_REQUEST)){/*Sendcommandforexternalroutine*/PICxmitBuf=ext_comm.xmit_buf;ext_comm.control_flagsand=~XMIT_REQUEST;ext_comm.control_flags|=CPY_RCV_DATA;/*LookupcorrectPIC_statusindexforreuestedPIC*/for(i=0;((i<MAX_PICS)andand(PIC_status[i].PIC_addr!=PICxmitBuf.PIC_addr));i++);if(i<num_PICs){PIC_status[i].last_cmd_data=PICxmitBuf.command_data;PIC_status[i].last_command=PICxmitBuf.command;}#ifdefIS_MC5if(ext_comm.xmit_buf.PIC_addr<ST5_MUX_PIC_ADDR)PIC_wait_limit=BUFFERED_PIC_WAIT_LIMIT;else#endifPIC_wait_limit=DIRECT_PIC_WAIT_LIMIT;format_xmit_buffer();PIC_serial_status=do_send_cmd;/*StartUART*/}elseif(((ext_comm.control_flagsandSUPPRESS_NORMAL_COMM)==0)#ifdefIS_ST5andand(--ST5_PIC_delay_ctr<=0)){ST5_PIC_delay_ctr=ST5_PIC_DELAY;/*SlowdownroutinecommunicationsintheST5*/#else){#endifPICxmitBuf.PIC_addr=PIC_status[current_PIC_index].PIC_addr;need_pulse_read=TRUE;/*Setdefaults*/#ifdefIS_ST5if((pulseOutMode==PIC_ST_SERIAL)andand(PICxmitBuf.PIC_addr==ST5_MUX_PIC_ADDR)){}else#endifif(PIC_status[current_PIC_index].force_pulse_readandand(!PIC_status[current_PIC_index].get_version)andand(PIC_status[current_PIC_index].PIC_addr<ST5_MUX_PIC_ADDR)){PIC_status[current_PIC_index].force_pulse_read=FALSE;}else{PIC_status[current_PIC_index].force_pulse_read=TRUE;#ifndefIS_ST5if(PIC_status[current_PIC_index].clear_pulse_regsandand(clear_state==GLOBAL_CLR_SENT)){/*Globalclearsent,getstatus*/need_pulse_read=FALSE;PICxmitBuf.command=READ_REGISTER;PICxmitBuf.reg_ID=STATUS_REG;format_xmit_buffer();}else#endifif(PIC_status[current_PIC_index].get_version){need_pulse_read=FALSE;PICxmitBuf.command=READ_REGISTER;PICxmitBuf.reg_ID=VERS_REG;format_xmit_buffer();}elseif(PIC_status[current_PIC_index].get_serno){need_pulse_read=FALSE;PICxmitBuf.command=READ_REGISTER;PICxmitBuf.reg_ID=SERNO_REG;format_xmit_buffer();}elseif(PIC_status[current_PIC_index].update_parameter){PICxmitBuf.command=WRITE_REGISTER;if(PIC_status[current_PIC_index].software_type==3){/*Pulsectr*//*Pulsectrparameters:*//*Power-Onsamplerate:42/sec*//*Power-offsamplerate:1/sec*//*Daystocountifrcvingpulses:*//*RSM:5days*//*PDM:35days*//*Daystocountifnopulsesrcvd:*//*RSM:1day*//*PDM:3days*//*onRSM,the2lsbsof*//*load_shed_maskaresentto*//*thePICoutputbits*/#ifdefIS_RSMPICxmitBuf.command_data=0x01150507and(load_shed_state|0xfffffffc);#elsePICxmitBuf.command_data=0x0115230d;#endif}#ifdefIS_MC5elseif(PIC_status[current_PIC_index].software_type==4){/*Remoteencoderreader*/PICxmitBuf.command_data=READ_ENCODER_PARM;if((releaseCodep->option.couplers_maskand0x01)==0){/*Ifmaskbit0is0,notouch-padcompatibility*/PICxmitBuf.command_dataand=0xff00ffff;}}elseif(PIC_status[current_PIC_index].software_type==5){/*MC5mux*/got_ver_3=got_ver_3_3=FALSE;for(i=0;i<num_PICs;i++){if(PIC_status[i].get_version){got_ver_3=TRUE;got_ver_3_3=TRUE;}elseif(PIC_status[i].software_type==3){got_ver_3=TRUE;if(PIC_status[i].software_version==3)got_ver_3_3=TRUE;}}if(got_ver_3){if(got_ver_3_3andand((releaseCodep->option.couplers_maskand0x02)!=0)){PICxmitBuf.command_data=0x0c007000;/*32bps,periodicwake-up*/}else{PICxmitBuf.command_data=0x0c007080;/*32bps,nowake-up*/}}elsePICxmitBuf.command_data=0x02030080;/*205bps,nowake-up*/}#endif#ifdcfIS_ST5elseif(PIC_status[current_PIC_index].software_type==8){/*Autotunemodule*/PICxmitBuf.command_data=0x02030000|(ATM_DISC_TIME<<8)|(ATM_RC_XMIT_ON>>8)|ATM_NUM_CAP_BITS;/*xmitoffset=2,cplroffset=3,*//*relaydelay=ATM_DISC_TIME,Xmitmask=ATM_RC_XMIT_ON,*//*numberofcapacitorrelays=ATM_NUM_CAP_BITS*/}elseif(PIC_status[current_PIC_index].software_type==6){/*ST5mux*/PICxmitBuf.command_data=0x00000000;}#endifelseif(PIC_status[current_PIC_index].software_type==7){/*LoadControlModule*/PICxmitBuf.command_data=0x00000000;}else{PIC_status[current_PIC_index].update_parameter=FALSE;/*unknownsoftwaretype,cancelcommand*/}if(PIC_status[current_PIC_index].update_parameter){need_pulse_read=FALSE;PICxmitBuf.reg_ID=PARM_REG;format_xmit_buffer();}}elseif(PIC_status[current_PIC_index].reset_status){need_pulse_read=FALSE;PICxmitBuf.command=SYSTEM_CONTROL;PICxmitBuf.command_data=(PIC_status[current_PIC_index].status_reg_valueand0xffbf);PICxmitBuf.command_data=PICxmitBuf.command_data<<16;/*MovestatusbitstoMSb′s*/PICxmitBuf.reg_ID=STATUS_REG;format_xmit_buffer();}elseif(PIC_status[current_PIC_index].get_status){need_pulse_read=FALSE;PICxmitBuf.command=READ_REGISTER;PICxmitBuf.reg_ID=STATUS_REG;format_xmit_buffer();}#ifdefIS_MC5if(need_pulse_readandand(PIC_status[current_PIC_index].software_type==4)){need_pulse_read=FALSE;PICxmitBuf.command=SYSTEM_CONTROL;if(++PIC_status[current_PIC_index].curr_ID_reg>=PULSES_PER_PIC)PIC_status[current_PIC_index].curr_ID_reg=0;if((((PIC_status[current_PIC_index].PIC_addr*PULSES_PER_PIC)+PIC_status[current_PIC_index].curr_ID_reg)%24)>=num_pulse_ctrs)PIC_status[current_PIC_index].curr_ID_reg=0;PICxmitBuf.reg_ID=PIC_status[current_PIC_index].curr_ID_reg;work_pulse_index=(PIC_status[current_PIC_index].PIC_addr*PULSES_PER_PIC)+PICxmitBuf.reg_ID;for(i=0;i<ID_FIELD_LENGTH;i++){if(pulseData[work_pulse_index].ID_buffer[i]==0){j=i-1;i=ID_FIELD_LENGTH;}}if(j<0){j=0;}elseif(j>(ID_FIELD_LENGTH-4)){j=ID_FIELD_LENGTH-4;}PICxmitBuf.command_data=READ_ENCODER_ID|(j<<8);;format_xmit_buffer();}#endif}if(need_pulse_read){#ifdefIS_MC5if(PIC_status[current_PIC_index].software_type==7){i=PIC_status[current_PIC_index].PIC_addr-LCM_BASE_ADDR;/*getLCM#*/work_bit_mask=(load_shed_state>>(9*i))and0x000001ff;PICxmitBuf.command_data=0;for(i=0;i<9;i++){if((work_bit_maskand0x100)!=0)PICxmitBuf.command_data=(PICxmitBuf.command_data<<2)+1;/*lsbturnsrelayon*/elsePICxmitBuf.command_data=(PICxmitBuf.command_data<<2)+2;/*msbturnsrelayon*/work_bit_mask=work_bit_mask<<1;}PICxmitBuf.command_data|=0x32000000;/*Setpulsetime=50mS*/PICxmitBuf.command=WRITE_REGISTER;PICxmitBuf.reg_ID=OUTPUT_REG;format_xmit_buffer();need_pulse_read=FALSE;}else#endifif(PIC_status[current_PIC_index].num_pulse_regs==0){#ifndefIS_ST5PICxmitBuf.command=READ_REGISTER;PICxmitBuf.reg_ID=VERS_REG;format_xmit_buffer();need_pulse_read=FALSE;#endif}else{#ifdefIS_MC5if((((PIC_status[current_PIC_index].PIC_addr*PULSES_PER_PIC)+PIC_status[current_PIC_index].curr_pulse_reg)%24)>=num_pulse_ctrs)PIC_status[current_PIC_index].curr_pulse_reg=0;#endifif(PIC_status[current_PIC_index].curr_pulse_reg<=MAX_FAST_READ)PICxmitBuf.command=PIC_status[current_PIC_index].curr_pulse_reg;elsePICxmitBuf.command=READ_REGISTER;PICxmitBuf.reg_ID=PIC_status[current_PIC_index].curr_pulse_reg;format_xmit_buffer();need_pulse_read=FALSE;if(++PIC_status[current_PIC_index].curr_pulse_reg>=PIC_status[current_PIC_index].num_pulse_regs){PIC_status[current_PIC_index].curr_pulse_reg=0;#ifdefIS_RSMPIC_status[current_PIC_index].update_parameter=TRUE;#endif}}}PIC_status[current_PIC_index].last_cmd_data=PICxmitBuf.command_data;PIC_status[current_PIC_index].last_command=PICxmitBuf.command;PIC_wait_limit=PIC_status[current_PIC_index].reply_wait_limit;rcv_PIC_index=current_PIC_index;if(++current_PIC_index==num_PICs)current_PIC_index=0;if(!need_pulse_read)PIC_serial_status=do_send_cmd;/*StartUART*/}}}#ifdefIS_RSM/*InRSM,generateserialstreamfromsubseconds*/voidpulseSubsecond(void){if(num_PICs!=0){if(PIC_clk_state==clk_high){/*Fallingedge,justsetclocklow*/fs1004.io.pulseOut1Off=0;PIC_clk_state=clk_low;}else{PIC_clk_statc=clk_high;#include″pic.def″/*DoPICserialcommonclockrisingedge*/}}}#endifvoidprocess_status_bits(void){unsignedintwork_pulse_index,work_status_bits;PIC_status[rcv_PIC_index].get_status=FALSE;PIC_status[rcv_PIC_index].status_reg_value=PICrcvBuf.command_data>>16;PIC_status[rcv_PIC_index].time_since_global=(PICrcvBuf.command_data>>8)and0xff;if(PIC_status[rcv_PIC_index].status_reg_value!=0){PIC_status[rcv_PIC_index].reset_status=TRUE;if((PIC_status[rcv_PIC_index].status_reg_valueand0x8f10)!=0){PIC_status[rcv_PIC_index].PIC_data_err_count++;/*PICdetectedbaddata*/set_PIC_alarm(PIC_flags_0,PIC_status[rcv_PIC_index].PIC_addr,PIC_status[rcv_PIC_index].status_reg_value);work_status_bits=(PIC_status[rcv_PIC_index].status_reg_value>>8)and0x0f;work_pulse_index=PIC_status[rcv_PIC_index].PIC_addr*PULSES_PER_PIC;while(work_status_bits>0){if(work_status_bitsand0x01)pulseData[work_pulse_index].error_cnt++;work_status_bits=work_status_bits>>1;work_pulse_index++;}}if(((PIC_status[rcv_PIC_index].status_reg_valueand0x20)!=0)andand!PIC_status[rcv_PIC_index].clear_pulse_regs){PIC_status[rcv_PIC_index].comm_error_count++;/*PICdetectedcommparityerr*/if(PIC_status[rcv_PIC_index].comm_error_count>2){set_PIC_alarm(PIC_comerr_0,PIC_status[rcv_PIC_index].PIC_addr,PICrcvBuf.flags|0x0800);}}if((PIC_status[rcv_PIC_index].status_reg_valueand0x3080)!=0){PIC_status[rcv_PIC_index].PIC_reset_count++;/*PICwasreset*/if(PIC_status[rcv_PIC_index].PIC_reset_count>1){set_PIC_alarm(PIC_reset_0,PIC_status[rcv_PIC_index].PIC_addr,PIC_status[rcv_PIC_index].status_reg_value);}}}if(PIC_status[rcv_PIC_index].clear_pulse_regsandand(clear_state==GLOBAL_CLR_SENT)){PIC_status[rcv_PIC_index].clear_pulse_regs=FALSE;if(((PIC_status[rcv_PIC_index].status_reg_valueand0x0f)!=0x0f)andand(PIC_status[rcv_PIC_index].software_type==3)){PIC_status[rcv_PIC_index].PIC_data_err_count++;/*Clearcmdfailed*/set_PIC_alarm(PIC_flags_0,PIC_status[rcv_PIC_index].PIC_addr,PIC_status[rcv_PIC_index].status_reg_value);}}elseif(((PIC_status[rcv_PIC_index].status_reg_valueand0x0f)!=0)andand((PIC_status[rcv_PIC_index].status_reg_valueand0xf10)==0)){PIC_status[rcv_PIC_index].PIC_data_err_count+=1000;/*Spuriousclrcmd*/set_PIC_alarm(PIC_flags_0,PIC_status[rcv_PIC_index].PIC_addr,PIC_status[rcv_PIC_index].status_reg_value);}}voidset_PIC_alarm(alarmcodespass_alarm_codes,intpass_PIC_addr,unsignedintpass_alarm_data){if(!Comm_background_flags.do_alarm){PIC_alarm.alarm_codes=pass_alarm_codes+pass_PIC_addr;PIC_alarm.ack=pass_alarm_data;Comm_background_flags.do_alarm=TRUE;}}unsignedcharworkTpar;BOOLEANdecode_rcv_buffer(void){inti;unsignedintworkInt;workTpar=0x1f;if(PICrcvBuf.flags==0){work_PIC_addr=Get5();if(PICrcvBuf.flags==0)PICrcvBuf.PIC_addr=work_PIC_addr;/*Validaddressreceived*/PICrcvBuf.command=Get5();if(PICrcvBuf.command>0x0f)PICrcvBuf.reg_ID=Get5();elsePICrcvBuf.reg_ID=PICrcvBuf.command;PICrcvBuf.command_data=0;for(i=0;i<6;i++)PICrcvBuf.command_data=(PICrcvBuf.command_data<<5)+Get5();workInt=Get5();PICrcvBuf.command_data=(PICrcvBuf.command_data<<2)+(workInt>>3);PICrcvBuf.flags|=workIntand0x07;workInt=Get5();if(workTpar!=0)PICrcvBuf.flags|=rcv_tpar_error_flag;}/*LookupcorrectPIC_statusindexfordatainrovbuffer*/for(i=0;((i<MAX_PICS)andand(PIC_status[i].PIC_addr!=PICrcvBuf.PIC_addr));i++);if(i>=num_PICs)PICrcvBuf.flags|=rcv_bad_addr_flag;/*pastendofvalidPICs,addresserror*/if(i==MAX_PICS)rcv_PIC_index=0;elsercv_PIC_index=i;#ifdefVATEST#ifVATEST==1PICrcvBuf.commaud=temp_command;PICrcvBuf.reg_ID=temp_reg_ID;PICrcvBuf.command_data=temp_command_data;PICrcvBuf.flags=temp_flags;#endif#endifreturn((PICrcvBuf.flagsand~(PIC_error_flag|PIC_need_refresh_flag|PIC_invalid_data_flag))==0);}voidformat_xmit_buffer(void){inti,j,ShiftCount;unsignedintWorkInt;unsignedlongWorkData;PICxmitBuf.bitCount=0;PICxmitBuf.bits.bufLong=0;PICxmitBuf.bits.bufLong[1]=0;PICxmitBuf.bits.bufLong[2]=0;/*Clearxmitbitbuffer*/workTpar=0x1f;/*InitializaTpar*/Stuff6(PICxmitBuf.PIC_addr);Stuff6(PICxmitBuf.command);if(PICxmitBuf.command>0x0f){Stuff6(PICxmitBuf.reg_ID);if(PICxmitBuf.command>0x17){WorkData=PICxmitBuf.command_data;ShiftCount=32;for(i=0,i<7;i++){WorkInt=0;for(j=0;j<5;j++){WorkInt=WorkInt<<1;if(WorkDataand0x80000000)WorkInt+=1;WorkData=WorkData<<1;if(--ShiftCount==0)(WorkInt=(WorkInt<<3)+(PICxmitBuf.flagsand0x07);j=5;}}Stuff6(WorkInt);}}}Stuff6(workTpar);/*Bufferset,setupUARTcontrol*/PICrcvBuf.bitCount=66;if((PIC_comm_mon.control_flagsandXMIT_DATA_RDY)==0){PIC_comm_mon.xmit_buf=PICxmitBuf;PIC_comm_mon.control_flags|=XMIT_DATA_RDY;}PICrcvBuf.flags=0;PICrcvBuf.PIC_addr=PICxmitBuf.PIC_addr;/*presetaddressofremotePIC*/}unsignedintGet5(void){intbyte_index,bit_index;unsignedintwork_result;work_result=0;if((PICrcvBuf.flagsand~(PIC_error_flag|PIC_need_refresh_flag|PIC_invalid_data_flag))==0){byte_index=96-PICrcvBuf.bitCount;bit_index=byte_indexand0x07;byte_index=byte_index>>3;work_result=(PICrcvBuf.bits.bufByte[byte_index]<<8)+PICrcvBuf.bits.bufByte[byte_index+1];work_result=work_result>>(10-bit_index);work_resultand=0x3f;if(parity6[work_result>>1]!=work_result){work_result=0;PICrcvBuf.flags|=rcv_parity_err_flag;}else{work_result=work_result>>1;workTpar^=work_result;PICrcvBuf.bitCount-=6;if(PICrcvBuf.bitCount<0)PICrcvBuf.flags|=rcv_bad_length_flag;}}return(work_result);}voidStuff6(intpass_data){intbyte_index,bit_index;workTpar^=pass_data;byte_index=PICxmitBuf.bitCount>>3;bit_index=PICxmitBuf.bitCountand0x07;pass_data=parity6[pass_data]<<(10-bit_index);PICxmitBuf.bits.bufByte[byte_index]|=pass_data>>8;PICxmitBuf.bits.bufByte[byte_index+1]|=pass_dataand0xff;PICxmitBuf.bitCount+=6;}PULSE.H/**/#ifndefBOOLEAN_DEFINED#defineBOOLEAN_DEFINEDtypedefintBOOLEAN;#endif/*subsecondprocessingforpulsecounters*/voidpulseSubsecond(void);/*DailyPICtablerebuild*/voidpulseDay(void);/*MainPICcommunicationroutine*/voidpulseService(void);/*PICcommroutine-once-per-secondcode*/voidpulseSecond(void);/*SubroutinesforPICcommunication*/voidStuff6(intpass_data);voidformat_xmit_buffer(void);BOOLEANdecode_rcv_buffer(void);voidprocess_status_bits(void);unsignedintGet5(void);voidset_PIC_alarm(alarmcodespass_alarm_type,intpass_PIC_addr,unsignedintpass_alarm_data);/*StartupcodeforPICcommunication*/voidpulseStartup(void);/*Routinetoclearpulseregistersaftercoldstart*/voidpulseColdstart(void);/*definedinpt.c*/#defineRELAY_A0#defineRELAY_B1voidpulseOut(intpicNbr,intrelayNbr,intONoff);voidptEveryMinute(void);voidptEverySecond(void);voidset_PLC_relays(intxmitRelay,intrcvRelay);PICEND.DEF/*includefileatendofmtrsamptocontrolMCandSTpicchipsfrommtrsampinterrupt*/#ifdefIS_MC5if(pulseOutMode==PIC_MC_SERIAL){asm(″MOVE.L#0x80400E,A0″);asm(″AND.W#0xFCFF,(A0)″);/*Clearclockanddataports*/}#endif#ifdefIS_ST5asm(″MOVE.L#0x80400E,A0″);asm(″AND.W#0xFEFF,(A0)″);/*Insertclockfallingedge*/if(PIC_serial_status==sending_st5_bits){asm(″NOP″);asm(″NOP″);asm(″NOP″);asm(″NOP″);asm(″NOP″);asm(″NOP″);asm(″NOP″);asm(″NOP″);asm(″NOP″);asm(″NOP″);asm(″NOP″);asm(″NOP″);asm(″NOP″);asm(″MOVE.L#0x80400E,A0″);asm(″OR.W#0x0100,(A0)″);/*Ifsendingbits,activateclock*/}#endifPICVARS.DEF/*localvariablestocontrolMCandSTpicchipsfrommtrsampinterruptmeter/c/lib/picvars.def*/unsignedlongbitOneFlag;PULSELINK.DEF/*determineifvariablesareexternalordefinedhere*/#undefref#ifdefPSTRU_DEFINED#defineref#else#definerefextern#endif#if(NUMPH>6)#defineIS_MC5#else#ifdefMAX_SCAN_METERS#defineIS_ST5#else#defineIS_RSM#endif#endif/*Valuesforhdwr-p(pulseOutMode)*/#defineSTANDARD_PIC_COMM0#if0/*removetheseequatesfrommtrlink.def*/#definePIC_PULSE_SERIAL1#definePIC_MC_SERIAL2#definePIC_ST_SERIAL3#endif/*thenuncommentthemhere*//*#defineVATEST1*/#ifdefVATEST#undefIS_MC5#undefIS_RSM#undefIS_ST5#defineIS_RSM#undefNUMPH#defineNUMPH3#undefMAX_SCAN_METERS#endif/*Uncommentforwatermeters(OakvilleHydro)*/#defineREAD_ENCODER_ID0x49ff0000#defineREAD_ENCODER_PARM0x0312500c/*Uncommentforgasmeters(Sonix)#defineREAD_ENCODER_ID0x49fe0389#defineREAD_ENCODER_PARM0x0300500c*/#defineID_FIELD_LENGTH13#definePULSES_PER_PIC4#ifdefIS_MC5#defineBITS_PER_SEC822#defineMAX_PICS16#else#ifdefIS_ST5#defineBITS_PER_SEC942#defineMAX_PICS5#else#defineBITS_PER_SEC32#defineMAX_PIC1#endif#endif#defineDIRECT_PIC_WAIT_LIMIT24#defineBUFFERED_PIC_WAIT_LIMIT10*BITS_PER_SEC#defineNUM_START_BITS12#ifdefIS_ST5#defineREBUILD_DELAY30000#else#defineREBUILD_DELAY1000#endiftypedefstruct{unsignedlongserial_number;unsignedlonglast_cmd_data;unsignedcharPIC_addr;unsignedcharsoftware_type;unsignedcharsoftware_version;unsignedcharloop_rate;unsignedintstatus_reg_value;unsignedchartime_since_global;unsignedcharnum_pulse_regs;unsignedcharcurr_pulse_reg;unsignedcharcurr_ID_reg;unsignedcharlast_command;unsignedintreply_wait_limit;unsignedintPIC_data_err_count;unsignedintPIC_reset_count;unsignedintcomm_error_count;unsignedforce_pulse_read:1;unsignedget_serno:1;unsignedget_version:1;unsignedget_status:1;unsignedreset_status:1;unsignedupdate_parameter:1;unsignedclear_pulse_regs:1;}PIC_status_t;typedefenum{sending_bits,sending_st5_bits,rcving_bits,do_PIC_start,sending_PIC_start,do_send_cmd,sending_start,sending_start_1,sending_stop,waiting_for_start,rcving_stop,idle}PIC_s_stat_t;typedefenum{SET_PRE_ALIGN,DO_ALIGN,SET_NORMAL_PLC,DISCONNECT_COUPLER,READ_XMIT_LEVEL}ATM_op_t;typedefenum{DO_PRESET,DO_PLC_SET,SET_ALIGN,WAIT_ALIGN,DO_ATM_DISCONNECT,ATM_DONE}ATM_state_t;typedefstruct{unsignedcharPIC_addr;unsignedcharcommand;unsignedcharreg_ID;unsignedlongcommand_data;unsignedintflags;intbitCount;union{unsignedlongbufLong[3];unsignedcharbufByte[12];}bits;}PICbitBuf;#ifndefBOOLEAN_DEFINED#defineBOOLEAN_DEFINEDtypedefintBOOLEAN;#endif/*DefinitionofbitsinFlagsfieldofPICcommbuffers*//*NOTE-Top4bits(0xf000)reservedforusebyATMcode*/#definercv_bad_addr_flag0x0100#definercv_tpar_error_flag0x0080#definercv_data_ready_flag0x0040#definercv_bad_length_flag0x0020#definercv_timeout_flag0x0010#definercv_parity_err_flag0x0008#definePIC_error_flag0x0004#definePIC_need_refresh_flag0x0002#definePIC_invalid_data_flag0x0001/*CommandcodesforPICcommunication*/#defineMAX_FAST_READ0x07#defineCLEAR_PULSE_REGISTERS0x08#defineREAD_REGISTER0x10#defineWRITE_REGISTER0x18#defineSYSTEM_CONTROL0x19/*RegisterIDcodesforPICcommunication*/#defineMAX_PULSE_REG15#defineCONTROL_REG16#defineERROR_REG26#defineOUTPUT_REG27#definePARM_REG28#defineVERS_REG29#defineSERNO_REG30#defineSTATUS_REG31/*Special-purposePICaddresses*/#defineGLOBAL_PIC_ADDR31#defineMC5_MUX_PIC_ADDR30#defineST5_MUX_PIC_ADDR29#defineLCM_BASE_ADDR16/*FirstLCMisataddress16*/#defineATM_BASE_ADDR20/*FirstATMisataddress20*/#defineMAX_PULSE_PIC_ADDR15/*pulsecoutersarefrom0to15*//*BitusageintheATMrelaycontrolword*/#defineATM_RC_XMIT_ON0x00008000#defineATM_RC_MEAS_XMIT0x00004000#defineATM_RC_MEAS_CPLR0x00002000#defineATM_RC_RES_SHORTED0x00001000#defineATM_RC_CAP_MASK0x000003ff#defineATM_NUM_CAP_BITS10#defineATM_PRESET_CODEATM_RC_XMIT_ON|ATM_RC_MEAS_XMIT|ATM_RC_MEAS_CPLR#defineATM_PLC_CODEATM_RC_XMIT_ON|ATM_RC_RES_SHORTED#defineATM_DISC_CODE0/*OtherATMcontrolequates*/#defineATM_MEAS_TIME20L/*mSectowaitbetweencapchangeandADCreading*/#defineATM_DISC_TIME20L/*mSectowaitbeforeswitchingcaprelays*/#defineATM_MIN_READING0x0038/*Ifreadingatendofautotunelessthanthis,fail*//*EquatesforST5comm*/#defineST5_PIC_DELAY66#pragmaregion(″Cram=ram″)refunsignedshortcurrent_PIC_index,rev_PIC_index;refPIC_status_tPIC_status[MAX_PICS];struct{unsignedlongreading;interror_cnt;unsignedcharID_field[ID_FIELD_LENGTH];unsignedcharID_buffer[ID_FIELD_LENGTH];}refpulseData[2*NUMPH];struct{PICbitBufxmit_buf;PICbitBufrcv_buf;intcontrol_flags;}refext_comm,PIC_comm_mon;struct{ATM_op_toperation;unsignedintATM_number;ATM_state_tstate;unsignedrequest_flag:1;unsigneddone_flag:1;unsignederror_flag:1;unsignedactive_flag:1;unsignedintstart_cap_code;unsignedintend_cap_code;unsignedintoptimum_cap_code;unsignedintoptimum_reading;unsignedintxmit_level;unsignedintcoupler_level;unsignedintresult_flags;longintalign_timer;}refATM_control;struct{unsignedrequest_flag:1;unsigneddone_flag:1;unsignederror_flag:1;unsignedactive_flag:1;unsignedintxmit_mask;unsignedintrcv_mask;unsignedintresult_flags;unsignedintlast_xmit_mask;unsignedintlast_rcv_mask;}refMUX_control;struct{unsigneddo_rebuild:1;unsigneddo_alarm:1;}refComm_background_flags;/*Bitdefinitionsinext_buf.control_flags*/#defineSUPPRESS_NORMAL_COMM0x0001#defineXMIT_REQUEST0x0002/*Externalroutinerequestssendofxmit_buf*/#defineCPY_RCV_DATA0x0004/*Externalcmdwassent,copyrcvdbuffertorcv_buf*/#defineRCV_DATA_RDY0x0008/*Gotreplyfromexternalcmd,replyisinrcv_buf*/#defineXMIT_DATA_RDY0x0010/*xmit_bufhascopyoflastcmdsent*/refPICbitBufPICxmitBuf,PICrcvBuf,HoldrcvBuf;refPIC_s_stat_tPIC_serial_status;refunsignedintnum_PICs;refunsignedintnum_LCMs;refunsignedintrebuild_timer;refunsignedintATM_work;refunsignedintwork_PIC_addr;refunsignedintnum_pulse_ctrs;refunsignedinthold_num_pulse_ctrs;refunsignedintbit_count;refunsignedintout_bit_value;refunsignedchar*shift_LSB_ptr;refunsignedcharin_bit_value;refunsignedintPIC_wait_limit;refunsignedintzero_count;refunsignedintlast_comm_err_flag;refBOOLEANdont_clear_PIC_stats;refintST5_PIC_delay_ctr;refunsignedintPIC_bad_addr_count;refalarmstruPIC_alarm;#ifdefVATEST/*test!!!!*/refinttemp_command;refinttemp_reg_ID;reflongtemp_command_data;refinttemp_flags;/*test!!!!*/#endifrefenum{clk_high,clk_low}PIC_clk_state;refenum{NO_GLOBAL_SEND,SEND_GLOBAL_CLR,SENDING_GLOBAL_CLR,GLOBAL_CLR_SENT}clear_state;/*Oldequatesmaintainedforcompatibility*/#if0#defineRELAY_A_BIT1#defineRELAY_B_BIT2#defineIDLE0#defineTX1#defineRX2#defineDATA_READY3#defineWAKE4#definePIC_RESET5#defineWAKE_COUNT_RELOAD(64*4)/*FourSeconds*/#defineRESET_COUNT_RELOAD10/*1/4Seconds*/#defineRELAY_A_OFF_CMD5/*activelowtrigger*/#defineRELAY_A_ON_CMD4#defineRELAY_B_OFF_CMD7#defineRELAY_B_ON_CMD6#defineCLEAR_ACC_CMD8#defineSUBACC_CMD12#defineECHO_CMD14#defineSLEEP_CMD15#definePULSE_SERIAL_COM_MAX15#defineWAKE_CMD16#defineRESET_CMD17#definePULSE_COM_NUM18#defineNO_PULSE_BIT_DATA0xFFFFFFFF#defineRELAY_CMD_MTN4#defineRELAY_CMD_MAX7#endifPULSEOUTM.DEF#include″clklink.def″#include″mtrlink.def″#include″plc.def″#include″serlink.def″#include″pulselink.def″#ifndefNO_PULSES#include″scan.h″#include″pulse.h″#include″log.h″voidpulseout_second_back(void);voidpulseout_ram_init1(void);ADDRFNpulseoutaddrfn;#pragmaregion(″data=ramInit1″)void(*pulseout_ram_init1p)(void)=pulseout_ram_init1;#pragmaregion(″data=data″)#pragmaregion(″data=secondBack″)void(*pulseout_second_backp)(void)=pulseout_second_back;#pragmaregion(″data=data″)ADDRFN_RETpulseoutaddrfn(reg8strureg8){/*writetheloadshedeventtoflash*/putEvent(LOAD_SHED_EVENT,1,andreg8.ulong);return(0);}voidpulseout_ram_init1(){addrfn_tbl[GET_FROM_SLAVE][PULSEOUT_STATE]=pulseoutaddrfn;}voidpulseout_second_back(){}#endif权利要求1.一种用于多通道电力计量的装置,包括计量表头,其能够操作以对多个电力用户线路的电力使用进行测量;与所述计量表头通信的转发器,其能够操作以将通过电力线通信从所述计量表头接收到的数据传输到远程设置的计算机,并将通过电力线通信接收到的数据从所述远程设置的计算机传输到所述计量表头,以及与所述计量表头通信的负荷控制模块,其能够操作以启动多个继电器中的每个继电器的连接和断开,所述多个继电器中的每个继电器都对应所述多个电力用户线路中之一。2.如权利要求1所述的装置,进一步包括与所述计量表头通信的篡改检测器。3.如权利要求2所述的装置,其中所述篡改检测器包括光源和反射面,并且如果所述篡改检测器提供告知未检测到从所述反射面反射的光线的通知,那么所述计量表头则能够操作以指示所述负荷控制模块断开全部所述用户线路。4.如权利要求2所述的装置,进一步包括包含所述计量表头、所述负荷控制模块和所述继电器的盒,其中,所述篡改检测器包括对进入所述盒中的环境光进行检测的检测器。5.如权利要求1所述的装置,进一步包括包含所述计量表头、所述负荷控制模块和所述继电器的盒,其中,所述盒安装在电线杆上。6.如权利要求1所述的装置,进一步包括,用于将变压器能量与所述用户线路使用的总能量进行比较的装置。7.如权利要求1所述的装置,进一步包括,用于检测通过所述用户线路的反向电压流的装置。8.如权利要求1所述的装置,进一步包括与所述计量表头通信的计算机可读的存储器以及与所述计量表头通信的计数器,所述计数器对应于用户线路并且能够操作以对存储在所述存储器中的能量的量进行倒计数,当所述计数器数到0时,所述计量表头能够操作以向所述负荷控制模块发送断开信号,以断开所述用户线路。9.如权利要求1所述的装置,进一步包括与所述计量表头通信的计算机可读的存储器,所述存储器能够操作以存储用于用户线路的负荷限度,当超出所述负荷限度时,所述计量表头能够操作以向所述负荷控制模块发送断开信号,以断开所述用户线路。10.如权利要求1所述的装置,进一步包括与所述计量表头通信的计算机可读的存储器,所述存储器能够操作以存储用于用户线路的使用限度,当超出所述使用限度时,所述计量表头能够操作以向所述负荷控制模块发送断开信号,以断开所述用户线路。11.如权利要求1所述的装置,其中所述转发器能够操作以通过中压电力线与所述远程设置的计算机通信。12.如权利要求1所述的装置,进一步包括与所述计量表头通信的显示单元,所述显示单元能够操作以显示从所述计量表头接收到的数据。13.如权利要求12所述的装置,其中所述显示单元能够操作以显示与用户的能耗有关的信息。14.如权利要求12所述的装置,其中所述显示单元能够操作以显示与用户的能量使用或能量的可疑窃取有关的警告。15.如权利要求12所述的装置,其中所述显示单元能够操作以将用户输入的信息传送给所述计量表头。全文摘要一方面,本发明包括用于测量用电量的装置,包括用于通过电力线通信进行远程断开的装置;用于探测窃电的装置;用于窜改检测的装置;以及用于反向电压检测的装置。另一方面,本发明包括用于进行多通道电力计量的装置,包括(a)计量表头,其可操作以对多个电用户线路的用电量进行计量;(b)转发器,其可操作以将通过电力线通信从计量表头接收到的数据传送到远程计算机,并将通过电力线通信接收到的数据从远程计算机传送到计量表头,以及(c)负荷控制模块,其可操作以启动对多个继电器中每个继电器的连接和断开,多个继电器中的每个继电器都对应于多个电力用户线路之一。文档编号G06F19/00GK101351803SQ200680049289公开日2009年1月21日申请日期2006年11月15日优先权日2005年11月15日发明者塞尔·A·斯瓦茨特劳贝,多龙·沙夫瑞尔,西达尔塔·马利克,罗伯特·海沃德申请人:阔德逻辑控制公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1