switch.c 109 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: switch.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2013-04-15
  7. 功能说明: DTU核心处理程序以开关为单位,循环处理。
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. #ifdef CPU_FUXI
  15. #include "rt_clib.h"
  16. #include "fourier.h"
  17. #endif
  18. /*------------------------------- 宏定义 --------------------------------------
  19. */
  20. #ifdef CPU_FUXI
  21. #define AUTO_ADJUST_NUM 1 // 自动校准时平均的次数
  22. #else
  23. #define AUTO_ADJUST_NUM 50 // 自动校准时平均的次数
  24. #endif
  25. #define MEA_CAL_NUMBER 5 // 实际测量时平均的次数
  26. //#define MEA_CAL_HARMONIC 14 //(CFG_ADC_DOTS_PER_PERIOD/2) // 谐波计算的次数
  27. /*------------------------------ 全局变量 -------------------------------------
  28. */
  29. int g_sw_init; // SW是否初始化
  30. struct ui g_ui[UI_NUM]; // 电压电流模拟量计算的综合结构
  31. struct ui_jy g_ui_jy[3]; // 方向判断中的记忆电压
  32. struct ui120 Us1_120,Us2_120;
  33. struct ui_p0 g_ui_p0[SWITCH_NUM_MAX]; //零序功率
  34. int g_ui_angle0; // 角度计算时,作为参考电压通道在g_ui中的索引
  35. int g_prot_index; // 保护计算时,采样通道中采样点的索引
  36. struct sw g_sw[SWITCH_NUM_EXT]; // 开关综合结构
  37. struct sw_t g_sw_temp[SWITCH_NUM_EXT]; // 临时数据结构
  38. struct sw_public g_sw_pub; // 开关公共部分综合结构
  39. int g_mea_cnt = 0; // 测量计数
  40. int g_harmonic_num = 13; // 默认计算13次谐波
  41. // 谐波系数修正
  42. float g_harmonic_factor[CFG_ADC_DOTS_PER_PERIOD/2] =
  43. {
  44. 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
  45. 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
  46. };
  47. // 开关开入名称
  48. const s8 * g_sw_di_name[SW_DI_NUM] =
  49. {
  50. "合位开入", // 1
  51. "分位开入",// 2
  52. "隔离刀闸", // 3
  53. "接地刀闸", // 4
  54. #ifdef DISP_DOUBLE_CN
  55. "弹簧未储能", // 5
  56. "弹簧已储能", // 5
  57. #else
  58. "弹簧未储能", // 5
  59. #endif
  60. "气压低", // 6
  61. #ifndef GW_AREA_MAIN_2021
  62. "HQ开入", // 7
  63. "TQ开入", // 8
  64. #endif
  65. "电源侧瞬压", // 9
  66. "负荷侧瞬压", // 10
  67. "手动合闸", // 11
  68. "手动分闸", // 12
  69. #ifdef GW_AREA_MAIN_2021
  70. "开关远方",
  71. "保护压板",
  72. "重合闸压板",
  73. "就地FA压板",
  74. "控制回路报警",
  75. "板卡在线监测",
  76. #else
  77. //#ifdef GD_AREA_ECZD_2020//2020指导意见使用停用FA及保护
  78. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020//2020指导意见使用停用FA及保护
  79. "停用FA及保护",
  80. #else
  81. "保护总功能投入",
  82. #endif
  83. #ifdef GD_AREA_MAIN_2020
  84. "常规保护压板", //13
  85. "重合闸投入压板", // 14
  86. "馈线自动化压板", // 15
  87. "智能分布式压板", // 16
  88. #elif defined GD_AREA_ECZD_2020 && !defined GD_AREA_ZHONGSHAN_2020
  89. "常规保护压板", //13
  90. "重合闸投入压板", // 14
  91. "常规FA压板", // 15
  92. "智能分布式FA压板", // 16
  93. #else
  94. "常规保护压板", //13
  95. "重合闸投入压板", // 14
  96. "就地FA压板", // 15
  97. "智能FA压板", // 16
  98. #endif
  99. "联络/分段模式", // 17
  100. "开关远方", // 18
  101. "闭锁重合闸", // 19
  102. //#ifdef GD_AREA_ECZD_2020
  103. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020//2020指导意见使用停用FA及保护
  104. "停用同期压板", // 20
  105. #else
  106. "同期压板", // 20
  107. #endif
  108. "控制回路断线", // 21
  109. "脉冲计数1", // 22
  110. "脉冲计数2", // 23
  111. "就地FA闭锁压板",//"开入8",// 31
  112. #ifdef GD_AREA_ECZD_2020//2020指导意见使用停用解列压板
  113. "停用自动解列功能压板",
  114. #elif defined GD_AREA_MAIN_2020
  115. "停用解列功能压板",
  116. #else
  117. "频率电压解列压板",
  118. #endif
  119. #endif
  120. #ifdef TYTQ_DI_YB
  121. "停用检同期压板", // 24
  122. #else
  123. "开入1", // 24
  124. #endif
  125. #ifdef JZS_FUNCTION
  126. "集中式投退压板", //
  127. #else
  128. "开入2", // 25
  129. #endif
  130. #ifdef DO_KOUT_CHECK
  131. "开出自检",
  132. #else
  133. "开入3",// 26
  134. #endif
  135. //#ifdef GD_AREA_ZHUHAI_V2
  136. #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_JIEYANG || defined GD_AREA_LIAONING_2021
  137. "对侧开关位置",
  138. #else
  139. "开入4",// 27
  140. #endif
  141. #ifndef GW_AREA_MAIN_2021
  142. "安全自动控制压板",
  143. #endif
  144. #ifdef BS_FAL_DI_YB
  145. "闭锁FA联络压板",
  146. #endif
  147. #ifdef CUSTOMIZE_BZT //备自投
  148. "备自投开入",
  149. "#1进线合位开入",
  150. "#1进线分位开入",
  151. "#2进线合位开入",
  152. "#2进线分位开入",
  153. "备自投-合位开入",
  154. "备自投-分位开入",
  155. "闭锁备自投",
  156. "备自投-失压分闸"
  157. #endif
  158. #ifdef GD_AREA_ECZD_QINGYUAN_2022
  159. "保护合闸出口",
  160. "保护跳闸出口",
  161. "遥控/电动合闸",
  162. "遥控/电动分闸",
  163. #endif
  164. };
  165. // 开关开出名称
  166. const s8 * g_sw_do_name[SW_DO_NUM] =
  167. {
  168. "合闸",
  169. "跳闸",
  170. "保护合闸",
  171. "保护分闸",
  172. "遥控合闸",
  173. "遥控分闸",
  174. "瞬压复归",
  175. "瞬压复归1",
  176. "瞬压闭锁",
  177. "储能信号",//"开出11",
  178. "保护动作开出",
  179. #ifdef GD_AREA_CHAOZHOU_CHAOAN_FUYANG
  180. "同期合闸开出-常闭",
  181. "同期合闸开出-常开",
  182. #else
  183. "同期合闸开出",
  184. #endif
  185. #ifdef CUSTOMIZE_BZT //备自投
  186. "备自投-#1进线合闸",
  187. "备自投-#1进线分闸",
  188. "备自投-#2进线合闸",
  189. "备自投-#2进线分闸",
  190. "备自投-分段合闸",
  191. "备自投-分段分闸",
  192. "备自投-进线1失压分闸",
  193. "备自投-进线2失压分闸",
  194. #endif
  195. #if defined GD_AREA_MAIN_2020 || defined SW_FAIL_SINGLE_OUT
  196. "开关失灵",
  197. #endif
  198. #ifdef GD_AREA_YUNAN_LP
  199. "电源消失开出",
  200. #else
  201. "开出14",
  202. #endif
  203. #ifdef GD_AREA_PROTECTOR
  204. "装置异常告警动作",
  205. #endif
  206. };
  207. const s8 * g_sw_led_name[SW_LED_NUM]=
  208. {
  209. "综合合位灯",
  210. "综合分位灯",
  211. "合位灯",
  212. "分位灯",
  213. "过流灯",
  214. "接地灯",
  215. "重合闸灯",
  216. "充电灯",
  217. "闭锁灯",
  218. "XT灯",
  219. "YT灯",
  220. "动作灯",
  221. "重合闭锁灯",
  222. #ifdef DISP_DOUBLE_CN
  223. "未储能灯",
  224. "已储能灯",
  225. #else
  226. "储能灯",
  227. #endif
  228. "联络灯",
  229. "分段灯",
  230. "重合+FA闭锁灯",
  231. #ifdef GD_AREA_MAIN_2020
  232. "常规保护模式灯",
  233. #else
  234. "保护模式灯",
  235. #endif
  236. "就地FA模式灯",
  237. "分布式模式灯",
  238. "X+Y灯",
  239. #ifdef QYD_STATE_LED
  240. "气压低灯",
  241. #endif
  242. #ifdef CHZ_QUIT_LED
  243. "重合闸退出灯",//(硬件压板或软件压板退出灯亮)
  244. #endif
  245. #if defined GD_AREA_GUANGZHOU_FTU || defined GD_AREA_TEST_2020
  246. "故障告警灯",
  247. #elif defined GD_AREA_ZHUHAI_V2
  248. "告警灯",
  249. #endif
  250. #ifdef GD_AREA_ZHUHAI_V2
  251. "通讯异常灯" //珠海局针对的是智能分布式通信异常
  252. #endif
  253. //#ifdef GD_AREA_ECZD_2020
  254. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  255. "自动解列功能灯",
  256. "同期合闸功能灯",
  257. "停用保护及FA灯",
  258. "停用自动解列灯",
  259. "停用同期合闸灯",
  260. #endif
  261. #ifdef TZ_STATE_LED
  262. "跳闸灯",
  263. #endif
  264. #ifdef CHZ_CD_LED
  265. "重合闸充电灯",
  266. #endif
  267. #ifdef EQU_RUN_LED
  268. "装置工作指示灯",
  269. #endif
  270. #ifdef SWITCH_GLJD_LED
  271. "隔离刀闸灯",
  272. "接地刀闸灯",
  273. #endif
  274. #ifdef FUNC_DRIVE
  275. "开关传动灯",
  276. #endif
  277. #ifdef GW_AREA_MAIN_2021
  278. "线路故障灯",
  279. #endif
  280. };
  281. // 开关模拟量名称
  282. //!!!更改模拟量名称可能会对以下宏有影响,请注意
  283. //#define MEA_I_OFFSET 4 //用于判断英文‘I’起始位置
  284. //#define MEA_U_OFFSET 6 //用于判断英文‘U’起始位置
  285. const struct mea_desc g_sw_ac_desc[SW_AC_NUM_ALL] =
  286. {
  287. #ifdef DISP_MEA_CN
  288. {"保护IA",UNIT_A5,UNIT_ANG},
  289. {"保护IB",UNIT_A5,UNIT_ANG},
  290. {"保护IC",UNIT_A5,UNIT_ANG},
  291. {"保护I0",UNIT_A5,UNIT_ANG},
  292. #ifdef SW_AC_I0S_SAMPLE
  293. {"保护I0s",UNIT_A5,UNIT_ANG},
  294. #endif
  295. {"测量IA",UNIT_A5,UNIT_ANG},
  296. {"测量IB",UNIT_A5,UNIT_ANG},
  297. {"测量IC",UNIT_A5,UNIT_ANG},
  298. {"总有功",UNIT_W,UNIT_NULL},
  299. {"A相有功",UNIT_W,UNIT_NULL},
  300. {"B相有功",UNIT_W,UNIT_NULL},
  301. {"C相有功",UNIT_W,UNIT_NULL},
  302. {"总无功",UNIT_Var,UNIT_NULL},
  303. {"A相无功",UNIT_Var,UNIT_NULL},
  304. {"B相无功",UNIT_Var,UNIT_NULL},
  305. {"C相无功",UNIT_Var,UNIT_NULL},
  306. {"功率因素",UNIT_COS,UNIT_NULL},
  307. #else
  308. {"BIA",UNIT_A5,UNIT_ANG},
  309. {"BIB",UNIT_A5,UNIT_ANG},
  310. {"BIC",UNIT_A5,UNIT_ANG},
  311. #ifdef GD_TEST_2021
  312. {"I0",UNIT_I0A,UNIT_ANG},
  313. #else
  314. {"I0",UNIT_A5,UNIT_ANG},
  315. #endif
  316. #ifdef SW_AC_I0S_SAMPLE
  317. {"I0s",UNIT_A5,UNIT_ANG},
  318. #endif
  319. {"CIA",UNIT_A5,UNIT_ANG},
  320. {"CIB",UNIT_A5,UNIT_ANG},
  321. {"CIC",UNIT_A5,UNIT_ANG},
  322. {"P",UNIT_W,UNIT_NULL},
  323. {"Pa",UNIT_W,UNIT_NULL},
  324. {"Pb",UNIT_W,UNIT_NULL},
  325. {"Pc",UNIT_W,UNIT_NULL},
  326. {"Q",UNIT_Var,UNIT_NULL},
  327. {"Qa",UNIT_Var,UNIT_NULL},
  328. {"Qb",UNIT_Var,UNIT_NULL},
  329. {"Qc",UNIT_Var,UNIT_NULL},
  330. #ifdef FUN_YC_POWER_S
  331. {"S",UNIT_Var,UNIT_NULL},
  332. #endif
  333. {"COS",UNIT_COS,UNIT_NULL},
  334. #endif
  335. {"BI_UNB",UNIT_Per,UNIT_NULL},
  336. {"CI_UNB",UNIT_Per,UNIT_NULL},
  337. {"脉冲计数1",UNIT_GE,UNIT_NULL},
  338. {"脉冲计数2",UNIT_GE,UNIT_NULL},
  339. #ifndef GW_AREA_MAIN_2021
  340. {"速断电流定值",UNIT_NULL,UNIT_NULL},
  341. {"速断保护时间",UNIT_NULL,UNIT_NULL},
  342. {"过流电流定值",UNIT_NULL,UNIT_NULL},
  343. {"过流保护时间",UNIT_NULL,UNIT_NULL},
  344. {"零序电流定值",UNIT_NULL,UNIT_NULL},
  345. {"零序保护时间",UNIT_NULL,UNIT_NULL},
  346. {"零序保护模式",UNIT_NULL,UNIT_NULL},
  347. {"一次重合闸时间",UNIT_NULL,UNIT_NULL},
  348. {"二次重合闸时间",UNIT_NULL,UNIT_NULL},
  349. {"得电闭合时间",UNIT_NULL,UNIT_NULL},
  350. {"无压分闸闭锁时间",UNIT_NULL,UNIT_NULL},
  351. {"工作模式",UNIT_NULL,UNIT_NULL},
  352. #endif
  353. #ifdef METERING_ENERGY
  354. {"计量UAB",UNIT_V220,UNIT_NULL}, // yc 17
  355. {"计量UBC",UNIT_V220,UNIT_NULL},
  356. {"计量UCA",UNIT_V220,UNIT_NULL},
  357. {"计量UA",UNIT_V220,UNIT_NULL},
  358. {"计量UB",UNIT_V220,UNIT_NULL},
  359. {"计量UC",UNIT_V220,UNIT_NULL},
  360. {"计量IA",UNIT_A5,UNIT_NULL},
  361. {"计量IB",UNIT_A5,UNIT_NULL},
  362. {"计量IC",UNIT_A5,UNIT_NULL},
  363. {"计量I0",UNIT_A5,UNIT_NULL},
  364. {"计量有功功率",UNIT_W,UNIT_NULL},
  365. {"计量A相有功功率",UNIT_W,UNIT_NULL},
  366. {"计量B相有功功率",UNIT_W,UNIT_NULL},
  367. {"计量C相有功功率",UNIT_W,UNIT_NULL},
  368. {"计量无功功率",UNIT_Var,UNIT_NULL},
  369. {"计量A相无功功率",UNIT_Var,UNIT_NULL},
  370. {"计量B相无功功率",UNIT_Var,UNIT_NULL},
  371. {"计量C相无功功率",UNIT_Var,UNIT_NULL},
  372. {"计量视在功率",UNIT_Var,UNIT_NULL},
  373. {"计量A相视在功率",UNIT_Var,UNIT_NULL},
  374. {"计量B相视在功率",UNIT_Var,UNIT_NULL},
  375. {"计量C相视在功率",UNIT_Var,UNIT_NULL},
  376. {"计量功率因数",UNIT_COS,UNIT_NULL},
  377. {"计量A相功率因数",UNIT_COS,UNIT_NULL},
  378. {"计量B相功率因数",UNIT_COS,UNIT_NULL},
  379. {"计量C相功率因数",UNIT_COS,UNIT_NULL},
  380. {"计量频率",UNIT_Hz,UNIT_NULL},
  381. #else
  382. {"YC1",UNIT_NULL,UNIT_NULL}, // yc 17
  383. {"YC2",UNIT_NULL,UNIT_NULL},
  384. {"YC3",UNIT_NULL,UNIT_NULL},
  385. {"YC4",UNIT_NULL,UNIT_NULL},
  386. {"YC5",UNIT_NULL,UNIT_NULL},
  387. {"YC6",UNIT_NULL,UNIT_NULL},
  388. {"YC7",UNIT_NULL,UNIT_NULL},
  389. {"YC8",UNIT_NULL,UNIT_NULL},
  390. {"YC9",UNIT_NULL,UNIT_NULL},
  391. {"YC10",UNIT_NULL,UNIT_NULL},
  392. {"YC11",UNIT_NULL,UNIT_NULL},
  393. {"YC12",UNIT_NULL,UNIT_NULL},
  394. #endif
  395. };
  396. // 计量模块电度值
  397. const struct mea_desc g_dd_desc[SW_DD_NUM_ALL]=
  398. {
  399. {"当前正向有功", UNIT_kWh,UNIT_NULL}, //6401
  400. {"当前正向无功", UNIT_kVarh,UNIT_NULL}, //6402
  401. {"当前一象限无功", UNIT_kVarh,UNIT_NULL}, //6403
  402. {"当前四象限无功", UNIT_kVarh,UNIT_NULL}, //6404
  403. {"当前反向有功", UNIT_kWh,UNIT_NULL}, //6405
  404. {"当前反向无功", UNIT_kVarh,UNIT_NULL}, //6406
  405. {"当前二象限无功", UNIT_kVarh,UNIT_NULL}, //6407
  406. {"当前三象限无功", UNIT_kVarh,UNIT_NULL}, //6408
  407. {"15分冻结正向有功", UNIT_kWh,UNIT_NULL}, //6409
  408. {"15分冻结正向无功", UNIT_kVarh,UNIT_NULL}, //640A
  409. {"15分冻结一象限无功", UNIT_kVarh,UNIT_NULL}, //640B
  410. {"15分冻结四象限无功", UNIT_kVarh,UNIT_NULL}, //640C
  411. {"15分冻结反向有功", UNIT_kWh,UNIT_NULL}, //640D
  412. {"15分冻结反向无功", UNIT_kVarh,UNIT_NULL}, //640E
  413. {"15分冻结二象限无功", UNIT_kVarh,UNIT_NULL}, //640F
  414. {"15分冻结三象限无功", UNIT_kVarh,UNIT_NULL}, //6410
  415. {"日冻结正向有功", UNIT_kWh,UNIT_NULL}, //6411
  416. {"日冻结冻结正向无功", UNIT_kVarh,UNIT_NULL}, //6412
  417. {"日冻结一象限无功", UNIT_kVarh,UNIT_NULL}, //6413
  418. {"日冻结四象限无功", UNIT_kVarh,UNIT_NULL}, //6414
  419. {"日冻结反向有功", UNIT_kWh,UNIT_NULL}, //6415
  420. {"日冻结反向无功", UNIT_kVarh,UNIT_NULL}, //6416
  421. {"日冻结二象限无功", UNIT_kVarh,UNIT_NULL}, //6417
  422. {"日冻结三象限无功", UNIT_kVarh,UNIT_NULL}, //6418
  423. {"潮变冻结正向有功", UNIT_kWh,UNIT_NULL}, //6419
  424. {"潮变冻结正向无功", UNIT_kVarh,UNIT_NULL}, //641A
  425. {"潮变冻结一象限无功", UNIT_kVarh,UNIT_NULL}, //641B
  426. {"潮变冻结四象限无功", UNIT_kVarh,UNIT_NULL}, //641C
  427. {"潮变冻结反向有功", UNIT_kWh,UNIT_NULL}, //641D
  428. {"潮变冻结反向无功", UNIT_kVarh,UNIT_NULL}, //641E
  429. {"潮变冻结二象限无功", UNIT_kVarh,UNIT_NULL}, //641F
  430. {"潮变冻结三象限无功", UNIT_kVarh,UNIT_NULL}, //6420
  431. #ifdef METERING_ENERGY
  432. {"当前A相有功", UNIT_kWh, UNIT_NULL},
  433. {"当前B相有功", UNIT_kWh, UNIT_NULL},
  434. {"当前C相有功", UNIT_kWh, UNIT_NULL},
  435. {"当前A相正向有功", UNIT_kWh, UNIT_NULL},
  436. {"当前B相正向有功", UNIT_kWh, UNIT_NULL},
  437. {"当前C相正向有功", UNIT_kWh, UNIT_NULL},
  438. {"当前A相反向有功", UNIT_kWh, UNIT_NULL},
  439. {"当前B相反向有功", UNIT_kWh, UNIT_NULL},
  440. {"当前C相反向有功", UNIT_kWh, UNIT_NULL},
  441. {"当前总有功", UNIT_kWh, UNIT_NULL},
  442. {"当前总无功", UNIT_kWh, UNIT_NULL},
  443. #endif
  444. };
  445. // 开关公共开入名称
  446. const s8 * g_pub_di_name[PUB_DI_NUM] =
  447. {
  448. "远方", // 1
  449. "就地", // 2
  450. "柜门位置", // 3
  451. "信号复归", // 4
  452. "交流失电告警", // 5
  453. "电池电源故障", // 6
  454. "电池欠压", // 7
  455. "电池活化状态", // 8
  456. "电容器动作", // 9
  457. "FA解锁", // 10
  458. "装置复位", // 11
  459. "功能总压板", // 12
  460. //#ifdef GD_AREA_ECZD_2020
  461. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  462. "检修状态压板", // 13
  463. #else
  464. "遥信屏蔽压板", // 13
  465. #endif
  466. #ifndef GW_AREA_MAIN_2021
  467. "非电量1开入", // 14
  468. "非电量2开入", // 15
  469. "非电量3开入", // 16
  470. "非电量4开入", // 17
  471. "非电量5开入", // 18
  472. "非电量6开入", // 19
  473. "非电量7开入", // 20
  474. "非电量8开入", // 21
  475. #endif
  476. "开入1", // 22
  477. "开入2", // 23
  478. "开入3", // 24
  479. "开入4", // 25
  480. "开入5", // 26
  481. "开入6", // 27
  482. #ifdef YX_DI_ERROR
  483. "遥信自检",
  484. #else
  485. "开入7", // 28
  486. #endif
  487. #ifdef KZ_OUT_TT
  488. "控制出口压板",
  489. #else
  490. "开入8", // 29
  491. #endif
  492. "信号复归+FA解锁", // 30
  493. };
  494. // 开关公共开出名称
  495. const s8 * g_pub_do_name[PUB_DO_NUM] =
  496. {
  497. "电池活化",
  498. "活化退出",
  499. "开出03",
  500. "开出04",
  501. "开出05",
  502. "开出06",
  503. "开出07",
  504. "开出08",
  505. "开出09",
  506. #ifdef YK_ZZDY_KC
  507. "装置电源开出",
  508. #endif
  509. "电压合格率清零",
  510. "预控开出",
  511. "解除闭锁",
  512. "远方重启",
  513. "远方复归",
  514. #ifdef YK_FG_FAJS
  515. "远方复归&FA解锁", // 远方复归+FA解锁
  516. #endif
  517. #ifndef GW_AREA_MAIN_2021
  518. "重合软压板合",
  519. "重合软压板分",
  520. #endif
  521. #if defined BHFA_YB_YK || defined BHFAGS_YB_YK
  522. //#ifdef GD_AREA_ECZD_2020
  523. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  524. "停用保护总软压板合",
  525. "停用保护总软压板分",
  526. #else
  527. "功能总投入软压板合",
  528. "功能总投入软压板分",
  529. #endif
  530. "保护出口软压板合",
  531. "保护出口软压板分",
  532. #ifndef BH_FA_INONE_SW
  533. "常规保护软压板合",
  534. "常规保护软压板分",
  535. "馈线自动化软压板合",
  536. "馈线自动化软压板分",
  537. #ifdef BHFAGS_YB_YK
  538. "智能分布式软压板合",
  539. "智能分布式软压板分",
  540. #endif
  541. #endif
  542. #else
  543. #ifndef GW_AREA_MAIN_2021
  544. //#ifdef GD_AREA_ECZD_2020
  545. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  546. "停用保护总软压板合",
  547. "停用保护总软压板分",
  548. #else
  549. "自动功能软压板合",
  550. "自动功能软压板分",
  551. #endif
  552. "保护投入软压板合",
  553. "保护投入软压板分",
  554. #endif
  555. #endif
  556. #ifdef TQ_SOFT_YB
  557. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  558. "停用同期软压板合",
  559. "停用同期软压板分",
  560. #else
  561. "检同期软压板合",
  562. "检同期软压板分",
  563. #endif
  564. #endif
  565. #ifdef JZS_FUNCTION
  566. "集中式软压板-合",
  567. "集中式软压板-分",
  568. #endif
  569. #ifdef YK_SOFT_YB
  570. "遥控软压板-合",
  571. "遥控软压板-分",
  572. #endif
  573. #ifdef YK_FA_ENBLE
  574. "FA遥控闭锁-合",
  575. "FA遥控闭锁-分",
  576. #endif
  577. #ifdef YK_FA_S_L_ENBLE
  578. "分段/联络-合",
  579. "分段/联络-分",
  580. #endif
  581. #ifdef JL_SOFT_YB
  582. "停用解列软压板合",
  583. "停用解列软压板分",
  584. #endif
  585. #ifdef METERING_ENERGY
  586. "遥控电度清零",
  587. "遥控线损事件清零",
  588. #endif
  589. #ifdef FUNC_DRIVE
  590. "传动接收软压板合",
  591. "传动接收软压板分",
  592. "传动指令",
  593. #endif
  594. #ifdef FUNC_DRIVE_JY
  595. "不停电传动功能",
  596. #endif
  597. #ifdef FUNC_RESET_EQU
  598. "重启装置",
  599. #endif
  600. };
  601. const s8 * g_pub_led_name[PUB_LED_NUM]=
  602. {
  603. "电源灯",
  604. "运行灯",
  605. #ifdef COMM_STATUS_LED
  606. "通信数据灯",
  607. "通信状态灯",
  608. #else
  609. "通信灯",
  610. #endif
  611. "电池灯",
  612. "异常灯",
  613. //#ifdef GD_AREA_ECZD_2020
  614. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  615. "运行告警灯",
  616. #endif
  617. "动作灯",
  618. "远方灯",
  619. "就地灯",
  620. "232T1",
  621. "232R1",
  622. "232T2",
  623. "232R2",
  624. "232T3",
  625. "232R3",
  626. "485T1",
  627. "485R1",
  628. "485T2",
  629. "485R2",
  630. "485T3",
  631. "485R3",
  632. "网口1",
  633. "网口2",
  634. #if defined __GOOSE_USING_DOUBLE_ETH__ || defined NET3_IP5
  635. "网口3",
  636. #endif
  637. #ifdef BAT_STATE_LED
  638. "电池欠压灯",
  639. "电池活化灯",
  640. #endif
  641. #ifdef KZ_OUT_TT
  642. "控制闭锁灯",
  643. #endif
  644. #ifdef IEC_ERR_LED
  645. "规约通信异常灯",
  646. #endif
  647. #ifdef LINK_ERR_LED
  648. "级联异常灯",
  649. #endif
  650. #ifdef GW_AREA_MAIN_2021
  651. "A相指示灯",
  652. "B相指示灯",
  653. "C相指示灯",
  654. #endif
  655. };
  656. // 开关公共模拟量名称
  657. const struct mea_desc g_pub_ac_desc[PUB_AC_NUM_ALL] =
  658. {
  659. #ifdef DISP_MEA_CN
  660. #ifdef GD_AREA_ZHUHAI_V2
  661. {"电缆UA1",UNIT_V100,UNIT_ANG},
  662. {"电缆UB1",UNIT_V100,UNIT_ANG},
  663. {"电缆UC1",UNIT_V100,UNIT_ANG},
  664. {"电缆UAB1",UNIT_V100,UNIT_ANG},
  665. {"电缆UBC1",UNIT_V100,UNIT_ANG},
  666. {"电缆UCA1",UNIT_V100,UNIT_ANG},
  667. {"母线U0 ",UNIT_V100,UNIT_ANG},
  668. {"电缆US1",UNIT_V220,UNIT_ANG},
  669. {"母线UA2",UNIT_V100,UNIT_ANG},
  670. {"母线UB2",UNIT_V100,UNIT_ANG},
  671. {"母线UC2",UNIT_V100,UNIT_ANG},
  672. {"母线UAB2",UNIT_V100,UNIT_ANG},
  673. {"母线UBC2",UNIT_V100,UNIT_ANG},
  674. {"母线UCA2",UNIT_V100,UNIT_ANG},
  675. {"电缆U0 ",UNIT_V100,UNIT_ANG},
  676. {"母线US2",UNIT_V220,UNIT_ANG},
  677. #else
  678. {"母线UA1",UNIT_V100,UNIT_ANG},
  679. {"母线UB1",UNIT_V100,UNIT_ANG},
  680. {"母线UC1",UNIT_V100,UNIT_ANG},
  681. {"母线UAB1",UNIT_V100,UNIT_ANG},
  682. {"母线UBC1",UNIT_V100,UNIT_ANG},
  683. {"母线UCA1",UNIT_V100,UNIT_ANG},
  684. {"母线U01",UNIT_V100,UNIT_ANG},
  685. #ifdef GD_AREA_HUIZHOU_HUIDONG
  686. {"母线AB3",UNIT_V220,UNIT_ANG},
  687. #else
  688. {"母线US1",UNIT_V220,UNIT_ANG},
  689. #endif
  690. {"线路UA2",UNIT_V100,UNIT_ANG},
  691. {"线路UB2",UNIT_V100,UNIT_ANG},
  692. {"线路UC2",UNIT_V100,UNIT_ANG},
  693. {"线路UAB2",UNIT_V100,UNIT_ANG},
  694. {"线路UBC2",UNIT_V100,UNIT_ANG},
  695. {"线路UCA2",UNIT_V100,UNIT_ANG},
  696. {"线路U02",UNIT_V100,UNIT_ANG},
  697. #ifdef GD_AREA_HUIZHOU_HUIDONG
  698. {"母线BC3",UNIT_V220,UNIT_ANG},
  699. #else
  700. {"线路US2",UNIT_V220,UNIT_ANG},
  701. #endif
  702. #endif
  703. {"V_UNB1",UNIT_Per,UNIT_NULL},
  704. {"V_UNB2",UNIT_Per,UNIT_NULL},
  705. {"工频1",UNIT_Hz,UNIT_NULL},
  706. {"工频2",UNIT_Hz,UNIT_NULL},
  707. #else
  708. {"UA1",UNIT_V100,UNIT_ANG},
  709. {"UB1",UNIT_V100,UNIT_ANG},
  710. {"UC1",UNIT_V100,UNIT_ANG},
  711. {"UAB1",UNIT_V100,UNIT_ANG},
  712. {"UBC1",UNIT_V100,UNIT_ANG},
  713. {"UCA1",UNIT_V100,UNIT_ANG},
  714. {"U01",UNIT_V100,UNIT_ANG},
  715. {"US1",UNIT_V220,UNIT_ANG},
  716. {"UA2",UNIT_V100,UNIT_ANG},
  717. {"UB2",UNIT_V100,UNIT_ANG},
  718. {"UC2",UNIT_V100,UNIT_ANG},
  719. {"UAB2",UNIT_V100,UNIT_ANG},
  720. {"UBC2",UNIT_V100,UNIT_ANG},
  721. {"UCA2",UNIT_V100,UNIT_ANG},
  722. {"U02",UNIT_V100,UNIT_ANG},
  723. {"US2",UNIT_V220,UNIT_ANG},
  724. {"V_UNB1",UNIT_Per,UNIT_NULL},
  725. {"V_UNB2",UNIT_Per,UNIT_NULL},
  726. {"UF1",UNIT_Hz,UNIT_NULL},
  727. {"UF2",UNIT_Hz,UNIT_NULL},
  728. #endif
  729. {"直流电压1",UNIT_V050,UNIT_NULL},
  730. {"直流电压2",UNIT_V050,UNIT_NULL},
  731. #ifdef GD_AREA_YUNAN_LP // 云南涞浦
  732. {"DltUab",UNIT_V100,UNIT_NULL},
  733. {"DltUbc",UNIT_V100,UNIT_NULL},
  734. {"DltUca",UNIT_V100,UNIT_NULL},
  735. {"ArgUab",UNIT_ANG,UNIT_NULL},
  736. {"ArgUbc",UNIT_ANG,UNIT_NULL},
  737. {"ArgUca",UNIT_ANG,UNIT_NULL},
  738. #endif
  739. {"温度",UNIT_TEMP,UNIT_NULL},
  740. #ifdef TMP_CHIP_AHT20
  741. {"湿度",UNIT_HUMI,UNIT_NULL},
  742. #endif
  743. {"Ver",UNIT_NULL,UNIT_NULL},
  744. #ifdef BATTERY_WITH_COMM
  745. {"活化放电时长",UINT_Hour,UNIT_NULL},
  746. {"当前放电时长",UINT_Hour,UNIT_NULL},
  747. #endif
  748. #ifdef DEV_GPS_ATGM332D
  749. #ifndef GPS_JWD_SPLIT
  750. {"经度",UNIT_ANG,UNIT_NULL},
  751. {"纬度",UNIT_ANG,UNIT_NULL},
  752. #else
  753. {"经度-度",UNIT_ANG,UNIT_NULL},
  754. {"纬度-分",UNIT_ANG,UNIT_NULL},
  755. {"经度-秒",UNIT_ANG,UNIT_NULL},
  756. {"纬度-度",UNIT_ANG,UNIT_NULL},
  757. {"纬度-分",UNIT_ANG,UNIT_NULL},
  758. {"纬度-秒",UNIT_ANG,UNIT_NULL},
  759. #endif
  760. {"卫星个数",UNIT_GE,UNIT_NULL},
  761. #endif
  762. {"YC1",UNIT_NULL,UNIT_NULL},
  763. {"YC2",UNIT_NULL,UNIT_NULL},
  764. {"YC3",UNIT_NULL,UNIT_NULL},
  765. {"YC4",UNIT_NULL,UNIT_NULL},
  766. {"YC5",UNIT_NULL,UNIT_NULL},
  767. {"YC6",UNIT_NULL,UNIT_NULL},
  768. {"YC7",UNIT_NULL,UNIT_NULL},
  769. {"YC8",UNIT_NULL,UNIT_NULL},
  770. #ifdef FUNC_SEND_FAULT_CURRENT
  771. {"A相故障电流",UNIT_A5,UNIT_ANG},
  772. {"B相故障电流",UNIT_A5,UNIT_ANG},
  773. {"C相故障电流",UNIT_A5,UNIT_ANG},
  774. {"零序电流",UNIT_A5,UNIT_ANG},
  775. #else
  776. {"YC9",UNIT_NULL,UNIT_NULL},
  777. {"YC10",UNIT_NULL,UNIT_NULL},
  778. {"YC11",UNIT_NULL,UNIT_NULL},
  779. {"YC12",UNIT_NULL,UNIT_NULL},
  780. #endif
  781. #ifdef BATTERY_BP_L500
  782. {"电池内阻",UINT_mVperA,UNIT_NULL},
  783. {"电池温度",UNIT_TEMP,UNIT_NULL},
  784. {"电池实时电量",UNIT_Per,UNIT_NULL},
  785. {"电池放电电流",UINT_mA,UNIT_NULL},
  786. {"电池充电电流",UINT_mA,UNIT_NULL},
  787. #endif
  788. };
  789. /*------------------------------ 函数声明 -------------------------------------
  790. */
  791. int _sw_cal_mea(void);
  792. void _sw_cal_average(int cal_num);
  793. float _sw_ui_e_k(int index);
  794. void _sw_auto_adjust_pq(void);
  795. void _sw_get_dots(void);
  796. void _sw_cal_fft(void);
  797. void _sw_cal_effect(void);
  798. void _sw_cal_angle(void);
  799. void _sw_cal_ri_correct(void);
  800. void _sw_min_max(int ui_index,u32 *p_min,u32*p_max);
  801. void _fz_min_max(int ui_index1,int ui_index2,u32 *p_min,u32*p_max);
  802. float _sw_base_angle(int ui_index);
  803. int _sw_save_dc_factor(float dc1_H, float dc1_L,float dc2_H, float dc2_L);
  804. void _sw_temp_factor(void);
  805. /*------------------------------ 外部函数 -------------------------------------
  806. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  807. */
  808. /******************************************************************************
  809. 函数名称: sw_init
  810. 函数版本: 01.01
  811. 创建作者: sunxi
  812. 创建日期: 2013-08-07
  813. 函数说明: 线路开关初始化
  814. 参数说明:
  815. 返回值:
  816. 0: 成功
  817. 其它: 失败
  818. 修改记录:
  819. */
  820. int sw_init(void)
  821. {
  822. int sw,i,type,ui;
  823. float f;
  824. // 初始化为固定默认值,只有上电初始化才运行一次
  825. if(g_sw_init == 0)
  826. {
  827. memset(&g_ui,0,sizeof(g_ui));
  828. memset(&g_sw_pub,0,sizeof(g_sw_pub));
  829. memset(&g_sw_pub.di,SW_DI_TYPE_OFF,sizeof(g_sw_pub.di));
  830. memset(&g_sw_pub.di_cfg_index,INDEX_INVALLID,sizeof(g_sw_pub.di_cfg_index));
  831. memset(&g_sw_pub.do_cfg_index,INDEX_INVALLID,sizeof(g_sw_pub.do_cfg_index));
  832. memset(&g_sw_pub.ac_cfg_index,INDEX_INVALLID,sizeof(g_sw_pub.ac_cfg_index));
  833. memset(&g_sw_pub.led_cfg_index,INDEX_INVALLID,sizeof(g_sw_pub.led_cfg_index));
  834. for(i=0; i< UI_NUM; i++)
  835. {
  836. g_ui[i].chn_index = CFG_ADC_CHANNEL_ZERO;
  837. g_ui[i].ui_base_make = -1;
  838. g_ui[i].e_factor0 = 1.0 ;
  839. // 使用理论默认值初始化m2_factor_k,防止初始化时使用此值的定值出错,
  840. // 导致保护逻辑出错(例如,跳位有流告警)
  841. if(i<PUB_AC_NUM)
  842. {
  843. g_ui[i].m2_factor_k = rt_round(factor_e_k(EQU_SCALE_PT_DEFAULT)*Q08_BASE);
  844. }
  845. else
  846. {
  847. g_ui[i].m2_factor_k = rt_round(factor_e_k(EQU_SCALE_CT_DEFAULT)*Q08_BASE);
  848. }
  849. g_ui[i].m2_factor_c = rt_round(1.0*Q16_BASE);
  850. }
  851. for(sw=0; sw<SWITCH_NUM_MAX; sw++)
  852. {
  853. memset(&g_sw[sw],0,sizeof(g_sw[i]));
  854. memset(&g_sw[sw].di,SW_DI_TYPE_OFF,sizeof(g_sw[sw].di));
  855. memset(&g_sw[sw].di_cfg_index,INDEX_INVALLID,sizeof(g_sw[sw].di_cfg_index));
  856. memset(&g_sw[sw].do_cfg_index,INDEX_INVALLID,sizeof(g_sw[sw].do_cfg_index));
  857. memset(&g_sw[sw].ac_cfg_index,INDEX_INVALLID,sizeof(g_sw[sw].ac_cfg_index));
  858. memset(&g_sw[sw].led_cfg_index,INDEX_INVALLID,sizeof(g_sw[sw].led_cfg_index));
  859. }
  860. }
  861. g_sw_init = 0;
  862. // 检查装置配置
  863. if(equ_config_null())
  864. {
  865. return -1;
  866. }
  867. // DI通道
  868. for(i=0; i< g_equ_config->di_num; i++)
  869. {
  870. if(g_equ_config_di[i].owner > SWITCH_NUM_MAX)
  871. {
  872. rt_printf("switch_init(own):i=%d,owner=%d,SWITCH_NUM_MAX=%d.\r\n",i, g_equ_config_di[i].owner,SWITCH_NUM_MAX);
  873. continue;
  874. }
  875. // 如果是其它类型(type == 0),不处理
  876. type = g_equ_config_di[i].type;
  877. if(type == 0)
  878. {
  879. continue;
  880. }
  881. type--;
  882. if(g_equ_config_di[i].owner == 0)
  883. {
  884. if(type < PUB_DI_NUM)
  885. {
  886. g_sw_pub.di_cfg_index[type] = i;
  887. }
  888. else
  889. {
  890. rt_printf("switch_init(di):i=%d,type=%d,DI_NUM=%d.\r\n",i, type,PUB_DI_NUM);
  891. }
  892. }
  893. else
  894. {
  895. sw = g_equ_config_di[i].owner - 1;
  896. if(type < SW_DI_NUM)
  897. {
  898. g_sw[sw].di_cfg_index[type] = i;
  899. }
  900. else
  901. {
  902. rt_printf("switch_init(di):i=%d,type=%d,DI_NUM=%d,sw=%d.\r\n",i, type,SW_DI_NUM,sw);
  903. }
  904. }
  905. }
  906. // DO通道
  907. for(i=0; i< g_equ_config->do_num; i++)
  908. {
  909. if(g_equ_config_do[i].owner > SWITCH_NUM_MAX)
  910. {
  911. rt_printf("switch_init(own):i=%d,owner=%d,SWITCH_NUM_MAX=%d.\r\n",i, g_equ_config_do[i].owner,SWITCH_NUM_MAX);
  912. continue;
  913. }
  914. // 如果是其它类型(type == 0),不处理
  915. type = g_equ_config_do[i].type;
  916. if(type == 0)
  917. {
  918. continue;
  919. }
  920. type--;
  921. if(g_equ_config_do[i].owner == 0)
  922. {
  923. if(type < PUB_DO_NUM)
  924. {
  925. g_sw_pub.do_cfg_index[type] = i;
  926. }
  927. else if(type < PUB_DO_NUM + PUB_LED_NUM)
  928. {
  929. s16 slot,index;
  930. g_sw_pub.led_cfg_index[type-PUB_DO_NUM] = i;
  931. slot = g_equ_config_do[i].slot;
  932. index = g_equ_config_do[i].index;
  933. g_led_slot[slot].sn[index].sw = 0;
  934. g_led_slot[slot].sn[index].no = type-PUB_DO_NUM;
  935. index++;
  936. if(index > g_led_slot[slot].num)
  937. {
  938. g_led_slot[slot].num = index;
  939. }
  940. }
  941. else
  942. {
  943. rt_printf("switch_init(do):i=%d,type=%d,PUB_DO_NUM + PUB_LED_NUM=%d.\r\n",i, type,PUB_DO_NUM + PUB_LED_NUM);
  944. }
  945. }
  946. else
  947. {
  948. sw = g_equ_config_do[i].owner - 1;
  949. if(type < SW_DO_NUM)
  950. {
  951. g_sw[sw].do_cfg_index[type] = i;
  952. }
  953. else if(type < SW_DO_LED_NUM)
  954. {
  955. s16 slot,index;
  956. g_sw[sw].led_cfg_index[type-SW_DO_NUM] = i;
  957. slot = g_equ_config_do[i].slot;
  958. index = g_equ_config_do[i].index;
  959. g_led_slot[slot].sn[index].sw = sw+1;
  960. g_led_slot[slot].sn[index].no = type-SW_DO_NUM;
  961. index++;
  962. if(index > g_led_slot[slot].num)
  963. {
  964. g_led_slot[slot].num = index;
  965. }
  966. }
  967. else
  968. {
  969. rt_printf("switch_init(do):i=%d,type=%d,SW_DO_LED_NUM=%d,sw=%d.\r\n",i, type,SW_DO_LED_NUM,sw);
  970. }
  971. }
  972. }
  973. // AC通道
  974. for(i=0; i< g_equ_config->ac_num; i++)
  975. {
  976. if(g_equ_config_ac[i].owner > SWITCH_NUM_MAX)
  977. {
  978. rt_printf("switch_init(own):i=%d,owner=%d,SWITCH_NUM_MAX=%d.\r\n",i, g_equ_config_ac[i].owner,SWITCH_NUM_MAX);
  979. continue;
  980. }
  981. // 如果是其它类型(type == 0),不处理
  982. type = g_equ_config_ac[i].type;
  983. if(type == 0)
  984. {
  985. continue;
  986. }
  987. type--;
  988. if(g_equ_config_ac[i].owner == 0)
  989. {
  990. if(type < PUB_AC_NUM)
  991. {
  992. // 索引
  993. ui = type;
  994. g_sw_pub.ac_cfg_index[type] = i;
  995. }
  996. else
  997. {
  998. rt_printf("switch_init(ac):i=%d,type=%d,AC_NUM=%d.\r\n",i, g_equ_config_ac[i].type,PUB_AC_NUM);
  999. continue;
  1000. }
  1001. }
  1002. else
  1003. {
  1004. sw = g_equ_config_ac[i].owner - 1;
  1005. if(type < SW_AC_NUM)
  1006. {
  1007. ui = UI_SW_INDEX(sw,type);
  1008. // 索引
  1009. g_sw[sw].ac_cfg_index[type] = i;
  1010. }
  1011. else
  1012. {
  1013. rt_printf("switch_init(ac):i=%d,type=%d,AC_NUM=%d,sw=%d.\r\n",i, type,SW_AC_NUM,sw);
  1014. continue;
  1015. }
  1016. }
  1017. // 通道索引
  1018. g_ui[ui].chn_index = equ_get_ac_channel(g_equ_config_ac[i].slot,g_equ_config_ac[i].index);
  1019. // 系数
  1020. factor_e_c_get(g_equ_config_ac[i].slot,g_equ_config_ac[i].index,&f);
  1021. g_ui[ui].e_factor0 = f /factor_e_k(g_equ_config_ac[i].scale);
  1022. g_ui[ui].m2_factor_k = rt_round(factor_e_k(g_equ_config_ac[i].scale)*Q08_BASE);
  1023. #ifdef PROTECT_AC_ADJUST
  1024. factor_p_e_c_get(g_equ_config_ac[i].slot,g_equ_config_ac[i].index,&f); //保护校准系数
  1025. #endif
  1026. g_ui[ui].m2_factor_c = rt_round(f*Q16_BASE);
  1027. factor_p_c_get(g_equ_config_ac[i].slot,g_equ_config_ac[i].index,&f);
  1028. g_ui[ui].p_factor = f;
  1029. //一二变比
  1030. g_ui[ui].e_ps = factor_e_ps(equ_get_ac_scale(g_equ_config_ac[i].slot, g_equ_config_ac[i].index));
  1031. // 暂时屏蔽,看看不使用PQ校准的效果
  1032. //factor_pq_get(g_equ_config_ac[i].slot,g_equ_config_ac[i].index,g_ui[ui].pq_factor);
  1033. }
  1034. // 计算角度时的基准通道
  1035. if(g_ui[PUB_AC_UA1].chn_index != CFG_ADC_CHANNEL_ZERO)
  1036. {
  1037. g_ui_angle0 = PUB_AC_UA1;
  1038. }
  1039. else if(g_ui[PUB_AC_UAB1].chn_index != CFG_ADC_CHANNEL_ZERO)
  1040. {
  1041. g_ui_angle0 = PUB_AC_UAB1;
  1042. }
  1043. else if(g_ui[PUB_AC_UAB2].chn_index != CFG_ADC_CHANNEL_ZERO)
  1044. {
  1045. g_ui_angle0 = PUB_AC_UAB2;
  1046. }
  1047. else
  1048. {
  1049. g_ui_angle0 = -1;
  1050. }
  1051. // 相电压合成线电压标志
  1052. if( g_ui[PUB_AC_UA1].chn_index != CFG_ADC_CHANNEL_ZERO
  1053. && g_ui[PUB_AC_UB1].chn_index != CFG_ADC_CHANNEL_ZERO
  1054. && g_ui[PUB_AC_UC1].chn_index != CFG_ADC_CHANNEL_ZERO
  1055. && g_ui[PUB_AC_UAB1].chn_index == CFG_ADC_CHANNEL_ZERO
  1056. && g_ui[PUB_AC_UBC1].chn_index == CFG_ADC_CHANNEL_ZERO
  1057. && g_ui[PUB_AC_UCA1].chn_index == CFG_ADC_CHANNEL_ZERO)
  1058. {
  1059. g_sw_pub.ui_flags |= UI_FLAGS_MAKE_LV1;
  1060. memcpy(&g_ui[PUB_AC_UAB1],&g_ui[PUB_AC_UA1],sizeof(g_ui[0]));
  1061. g_ui[PUB_AC_UAB1].chn_index = CFG_ADC_CHANNEL_ZERO;
  1062. g_ui[PUB_AC_UAB1].ui_base_make = PUB_AC_UA1;
  1063. g_ui[PUB_AC_UAB1].e_factor0 = (g_ui[PUB_AC_UA1].e_factor0 + g_ui[PUB_AC_UB1].e_factor0)/2;
  1064. memcpy(&g_ui[PUB_AC_UBC1],&g_ui[PUB_AC_UA1],sizeof(g_ui[0]));
  1065. g_ui[PUB_AC_UBC1].chn_index = CFG_ADC_CHANNEL_ZERO;
  1066. g_ui[PUB_AC_UBC1].ui_base_make = PUB_AC_UA1;
  1067. g_ui[PUB_AC_UBC1].e_factor0 = (g_ui[PUB_AC_UB1].e_factor0 + g_ui[PUB_AC_UC1].e_factor0)/2;
  1068. memcpy(&g_ui[PUB_AC_UCA1],&g_ui[PUB_AC_UA1],sizeof(g_ui[0]));
  1069. g_ui[PUB_AC_UCA1].chn_index = CFG_ADC_CHANNEL_ZERO;
  1070. g_ui[PUB_AC_UCA1].ui_base_make = PUB_AC_UA1;
  1071. g_ui[PUB_AC_UCA1].e_factor0 = (g_ui[PUB_AC_UC1].e_factor0 + g_ui[PUB_AC_UA1].e_factor0)/2;
  1072. }
  1073. if(g_ui[PUB_AC_UA2].chn_index != CFG_ADC_CHANNEL_ZERO
  1074. && g_ui[PUB_AC_UB2].chn_index != CFG_ADC_CHANNEL_ZERO
  1075. && g_ui[PUB_AC_UC2].chn_index != CFG_ADC_CHANNEL_ZERO
  1076. && g_ui[PUB_AC_UAB2].chn_index == CFG_ADC_CHANNEL_ZERO
  1077. && g_ui[PUB_AC_UBC2].chn_index == CFG_ADC_CHANNEL_ZERO
  1078. && g_ui[PUB_AC_UCA2].chn_index == CFG_ADC_CHANNEL_ZERO)
  1079. {
  1080. g_sw_pub.ui_flags |= UI_FLAGS_MAKE_LV2;
  1081. memcpy(&g_ui[PUB_AC_UAB2],&g_ui[PUB_AC_UA2],sizeof(g_ui[0]));
  1082. g_ui[PUB_AC_UAB2].chn_index = CFG_ADC_CHANNEL_ZERO;
  1083. g_ui[PUB_AC_UAB2].ui_base_make = PUB_AC_UA2;
  1084. g_ui[PUB_AC_UAB2].e_factor0 = (g_ui[PUB_AC_UA2].e_factor0 + g_ui[PUB_AC_UB2].e_factor0)/2;
  1085. memcpy(&g_ui[PUB_AC_UBC2],&g_ui[PUB_AC_UA2],sizeof(g_ui[0]));
  1086. g_ui[PUB_AC_UBC2].chn_index = CFG_ADC_CHANNEL_ZERO;
  1087. g_ui[PUB_AC_UBC2].ui_base_make = PUB_AC_UA2;
  1088. g_ui[PUB_AC_UBC2].e_factor0 = (g_ui[PUB_AC_UB2].e_factor0 + g_ui[PUB_AC_UC2].e_factor0)/2;
  1089. memcpy(&g_ui[PUB_AC_UCA2],&g_ui[PUB_AC_UA2],sizeof(g_ui[0]));
  1090. g_ui[PUB_AC_UCA2].chn_index = CFG_ADC_CHANNEL_ZERO;
  1091. g_ui[PUB_AC_UCA2].ui_base_make = PUB_AC_UA2;
  1092. g_ui[PUB_AC_UCA2].e_factor0 = (g_ui[PUB_AC_UC2].e_factor0 + g_ui[PUB_AC_UA2].e_factor0)/2;
  1093. }
  1094. // 合成UCA标志
  1095. if( g_ui[PUB_AC_UAB1].chn_index != CFG_ADC_CHANNEL_ZERO
  1096. && g_ui[PUB_AC_UBC1].chn_index != CFG_ADC_CHANNEL_ZERO
  1097. && g_ui[PUB_AC_UCA1].chn_index == CFG_ADC_CHANNEL_ZERO)
  1098. {
  1099. g_sw_pub.ui_flags |= UI_FLAGS_MAKE_UCA1;
  1100. memcpy(&g_ui[PUB_AC_UCA1],&g_ui[PUB_AC_UAB1],sizeof(g_ui[0]));
  1101. g_ui[PUB_AC_UCA1].chn_index = CFG_ADC_CHANNEL_ZERO;
  1102. g_ui[PUB_AC_UCA1].ui_base_make = PUB_AC_UAB1;
  1103. g_ui[PUB_AC_UCA1].e_factor0 = (g_ui[PUB_AC_UAB1].e_factor0 + g_ui[PUB_AC_UBC1].e_factor0)/2;
  1104. }
  1105. if( g_ui[PUB_AC_UAB2].chn_index != CFG_ADC_CHANNEL_ZERO
  1106. && g_ui[PUB_AC_UBC2].chn_index != CFG_ADC_CHANNEL_ZERO
  1107. && g_ui[PUB_AC_UCA2].chn_index == CFG_ADC_CHANNEL_ZERO)
  1108. {
  1109. g_sw_pub.ui_flags |= UI_FLAGS_MAKE_UCA2;
  1110. memcpy(&g_ui[PUB_AC_UCA2],&g_ui[PUB_AC_UAB2],sizeof(g_ui[0]));
  1111. g_ui[PUB_AC_UCA2].chn_index = CFG_ADC_CHANNEL_ZERO;
  1112. g_ui[PUB_AC_UCA2].ui_base_make = PUB_AC_UAB2;
  1113. g_ui[PUB_AC_UCA2].e_factor0 = (g_ui[PUB_AC_UAB2].e_factor0 + g_ui[PUB_AC_UBC2].e_factor0)/2;
  1114. }
  1115. // U01 零序电压自产
  1116. if( g_ui[PUB_AC_UA1].chn_index != CFG_ADC_CHANNEL_ZERO
  1117. && g_ui[PUB_AC_UB1].chn_index != CFG_ADC_CHANNEL_ZERO
  1118. && g_ui[PUB_AC_UC1].chn_index != CFG_ADC_CHANNEL_ZERO
  1119. && g_ui[PUB_AC_U01].chn_index == CFG_ADC_CHANNEL_ZERO
  1120. &&pRunSet->bTT_U0ZC)
  1121. {
  1122. g_sw_pub.ui_flags |= UI_FLAGS_MAKE_U01;
  1123. memcpy(&g_ui[PUB_AC_U01],&g_ui[PUB_AC_UA1],sizeof(g_ui[0]));
  1124. g_ui[PUB_AC_U01].chn_index = CFG_ADC_CHANNEL_ZERO;
  1125. g_ui[PUB_AC_U01].ui_base_make = PUB_AC_UA1;
  1126. g_ui[PUB_AC_U01].e_factor0 = (g_ui[PUB_AC_UA1].e_factor0 + g_ui[PUB_AC_UB1].e_factor0+g_ui[PUB_AC_UC1].e_factor0)/3;
  1127. }
  1128. // U02 零序电压自产
  1129. if( g_ui[PUB_AC_UA2].chn_index != CFG_ADC_CHANNEL_ZERO
  1130. && g_ui[PUB_AC_UB2].chn_index != CFG_ADC_CHANNEL_ZERO
  1131. && g_ui[PUB_AC_UC2].chn_index != CFG_ADC_CHANNEL_ZERO
  1132. && g_ui[PUB_AC_U02].chn_index == CFG_ADC_CHANNEL_ZERO
  1133. &&pRunSet->bTT_U0ZC)
  1134. {
  1135. g_sw_pub.ui_flags |= UI_FLAGS_MAKE_U02;
  1136. memcpy(&g_ui[PUB_AC_U02],&g_ui[PUB_AC_UA2],sizeof(g_ui[0]));
  1137. g_ui[PUB_AC_U02].chn_index = CFG_ADC_CHANNEL_ZERO;
  1138. g_ui[PUB_AC_U02].ui_base_make = PUB_AC_UA2;
  1139. g_ui[PUB_AC_U02].e_factor0 = (g_ui[PUB_AC_UA2].e_factor0 + g_ui[PUB_AC_UB2].e_factor0+g_ui[PUB_AC_UC2].e_factor0)/3;
  1140. }
  1141. // 合成IB、I0标志
  1142. for(sw=0; sw<SWITCH_NUM_MAX; sw++)
  1143. {
  1144. if( g_ui[UI_SW_INDEX(sw,SW_AC_IA)].chn_index != CFG_ADC_CHANNEL_ZERO
  1145. && g_ui[UI_SW_INDEX(sw,SW_AC_IC)].chn_index != CFG_ADC_CHANNEL_ZERO
  1146. && g_ui[UI_SW_INDEX(sw,SW_AC_IB)].chn_index == CFG_ADC_CHANNEL_ZERO)
  1147. {
  1148. g_sw[sw].ui_flags |= UI_FLAGS_MAKE_IB;
  1149. memcpy(&g_ui[UI_SW_INDEX(sw,SW_AC_IB)],&g_ui[UI_SW_INDEX(sw,SW_AC_IA)],sizeof(g_ui[0]));
  1150. g_ui[UI_SW_INDEX(sw,SW_AC_IB)].chn_index = CFG_ADC_CHANNEL_ZERO;
  1151. g_ui[UI_SW_INDEX(sw,SW_AC_IB)].ui_base_make = UI_SW_INDEX(sw,SW_AC_IA);
  1152. g_ui[UI_SW_INDEX(sw,SW_AC_IB)].e_factor0 = (g_ui[UI_SW_INDEX(sw,SW_AC_IA)].e_factor0 + g_ui[UI_SW_INDEX(sw,SW_AC_IC)].e_factor0)/2;
  1153. }
  1154. if( g_ui[UI_SW_INDEX(sw,SW_AC_CIA)].chn_index != CFG_ADC_CHANNEL_ZERO
  1155. && g_ui[UI_SW_INDEX(sw,SW_AC_CIC)].chn_index != CFG_ADC_CHANNEL_ZERO
  1156. && g_ui[UI_SW_INDEX(sw,SW_AC_CIB)].chn_index == CFG_ADC_CHANNEL_ZERO)
  1157. {
  1158. g_sw[sw].ui_flags |= UI_FLAGS_MAKE_CIB;
  1159. memcpy(&g_ui[UI_SW_INDEX(sw,SW_AC_CIB)],&g_ui[UI_SW_INDEX(sw,SW_AC_CIA)],sizeof(g_ui[0]));
  1160. g_ui[UI_SW_INDEX(sw,SW_AC_CIB)].chn_index = CFG_ADC_CHANNEL_ZERO;
  1161. g_ui[UI_SW_INDEX(sw,SW_AC_CIB)].ui_base_make = UI_SW_INDEX(sw,SW_AC_CIA);
  1162. g_ui[UI_SW_INDEX(sw,SW_AC_CIB)].e_factor0 = (g_ui[UI_SW_INDEX(sw,SW_AC_CIA)].e_factor0 + g_ui[UI_SW_INDEX(sw,SW_AC_CIC)].e_factor0)/2;
  1163. }
  1164. if( g_ui[UI_SW_INDEX(sw,SW_AC_IA)].chn_index != CFG_ADC_CHANNEL_ZERO
  1165. && g_ui[UI_SW_INDEX(sw,SW_AC_IB)].chn_index != CFG_ADC_CHANNEL_ZERO
  1166. && g_ui[UI_SW_INDEX(sw,SW_AC_IC)].chn_index != CFG_ADC_CHANNEL_ZERO
  1167. && g_ui[UI_SW_INDEX(sw,SW_AC_I0)].chn_index == CFG_ADC_CHANNEL_ZERO)
  1168. {
  1169. g_sw[sw].ui_flags |= UI_FLAGS_MAKE_I0;
  1170. memcpy(&g_ui[UI_SW_INDEX(sw,SW_AC_I0)],&g_ui[UI_SW_INDEX(sw,SW_AC_IA)],sizeof(g_ui[0]));
  1171. g_ui[UI_SW_INDEX(sw,SW_AC_I0)].chn_index = CFG_ADC_CHANNEL_ZERO;
  1172. g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ui_base_make = UI_SW_INDEX(sw,SW_AC_IA);
  1173. g_ui[UI_SW_INDEX(sw,SW_AC_I0)].e_factor0 = (g_ui[UI_SW_INDEX(sw,SW_AC_IA)].e_factor0
  1174. + g_ui[UI_SW_INDEX(sw,SW_AC_IB)].e_factor0
  1175. + g_ui[UI_SW_INDEX(sw,SW_AC_IC)].e_factor0)/3;
  1176. }
  1177. }
  1178. #if 0 // 支持功率电压选择,计算方法等计算时再确定
  1179. // 确认是3表法还是2表法
  1180. for(sw=0; sw<SWITCH_NUM_MAX; sw++)
  1181. {
  1182. if(g_ui[PUB_AC_UA1].chn_index != CFG_ADC_CHANNEL_ZERO
  1183. && g_ui[PUB_AC_UB1].chn_index != CFG_ADC_CHANNEL_ZERO
  1184. && g_ui[PUB_AC_UC1].chn_index != CFG_ADC_CHANNEL_ZERO)
  1185. {
  1186. if( g_ui[UI_SW_INDEX(sw,SW_AC_IA)].chn_index != CFG_ADC_CHANNEL_ZERO
  1187. && g_ui[UI_SW_INDEX(sw,SW_AC_IB)].chn_index != CFG_ADC_CHANNEL_ZERO
  1188. && g_ui[UI_SW_INDEX(sw,SW_AC_IC)].chn_index != CFG_ADC_CHANNEL_ZERO)
  1189. {
  1190. g_sw[sw].ui_flags |= UI_FLAGS_3M;
  1191. }
  1192. }
  1193. }
  1194. #endif
  1195. //通道名称
  1196. for(i=0; i< UI_NUM; i++)
  1197. {
  1198. if(i< PUB_AC_NUM)
  1199. {
  1200. if(strlen(g_pub_ac_desc[i].name) < CFG_NAME_LEN)
  1201. strcpy(g_ui[i].name, g_pub_ac_desc[i].name);
  1202. else
  1203. strncpy(g_ui[i].name, g_pub_ac_desc[i].name,CFG_NAME_LEN);
  1204. }
  1205. else
  1206. {
  1207. sw = (i-PUB_AC_NUM)/SW_AC_NUM;
  1208. sprintf(g_ui[i].name,"%02d%s",sw+1,g_sw_ac_desc[(i-PUB_AC_NUM)%SW_AC_NUM].name);
  1209. }
  1210. }
  1211. // 复位统计数据
  1212. sw_stat_reset();
  1213. g_sw_init = 1;
  1214. return 0;
  1215. }
  1216. int sw_ext_init(void)
  1217. {
  1218. // U01 零序电压自产
  1219. if( g_ui[PUB_AC_UA1].chn_index != CFG_ADC_CHANNEL_ZERO
  1220. && g_ui[PUB_AC_UB1].chn_index != CFG_ADC_CHANNEL_ZERO
  1221. && g_ui[PUB_AC_UC1].chn_index != CFG_ADC_CHANNEL_ZERO
  1222. && g_ui[PUB_AC_U01].chn_index == CFG_ADC_CHANNEL_ZERO
  1223. &&pRunSet->bTT_U0ZC)
  1224. {
  1225. g_sw_pub.ui_flags |= UI_FLAGS_MAKE_U01;
  1226. memcpy(&g_ui[PUB_AC_U01],&g_ui[PUB_AC_UA1],sizeof(g_ui[0]));
  1227. g_ui[PUB_AC_U01].chn_index = CFG_ADC_CHANNEL_ZERO;
  1228. g_ui[PUB_AC_U01].ui_base_make = PUB_AC_UA1;
  1229. g_ui[PUB_AC_U01].e_factor0 = (g_ui[PUB_AC_UA1].e_factor0 + g_ui[PUB_AC_UB1].e_factor0+g_ui[PUB_AC_UC1].e_factor0)/3;
  1230. }
  1231. // U02 零序电压自产
  1232. if( g_ui[PUB_AC_UA2].chn_index != CFG_ADC_CHANNEL_ZERO
  1233. && g_ui[PUB_AC_UB2].chn_index != CFG_ADC_CHANNEL_ZERO
  1234. && g_ui[PUB_AC_UC2].chn_index != CFG_ADC_CHANNEL_ZERO
  1235. && g_ui[PUB_AC_U02].chn_index == CFG_ADC_CHANNEL_ZERO
  1236. &&pRunSet->bTT_U0ZC)
  1237. {
  1238. g_sw_pub.ui_flags |= UI_FLAGS_MAKE_U02;
  1239. memcpy(&g_ui[PUB_AC_U02],&g_ui[PUB_AC_UA2],sizeof(g_ui[0]));
  1240. g_ui[PUB_AC_U02].chn_index = CFG_ADC_CHANNEL_ZERO;
  1241. g_ui[PUB_AC_U02].ui_base_make = PUB_AC_UA2;
  1242. g_ui[PUB_AC_U02].e_factor0 = (g_ui[PUB_AC_UA2].e_factor0 + g_ui[PUB_AC_UB2].e_factor0+g_ui[PUB_AC_UC2].e_factor0)/3;
  1243. }
  1244. return 0;
  1245. }
  1246. /******************************************************************************
  1247. 函数名称: sw_exit
  1248. 函数版本: 01.01
  1249. 创建作者: sunxi
  1250. 创建日期: 2013-08-07
  1251. 函数说明: 线路开关退出
  1252. 参数说明:
  1253. 返回值:
  1254. 0: 成功
  1255. 其它: 失败
  1256. 修改记录:
  1257. */
  1258. int sw_exit(void)
  1259. {
  1260. return 0;
  1261. }
  1262. int sw_di_get(u32 sw,u32 no)
  1263. {
  1264. u8 v;
  1265. if(no == 0)
  1266. {
  1267. return -1;
  1268. }
  1269. no--;
  1270. if(sw == 0)
  1271. {
  1272. v=g_sw_pub.di[no] ;
  1273. }
  1274. else
  1275. {
  1276. sw--;
  1277. v=g_sw[sw].di[no] ;
  1278. }
  1279. return v;
  1280. }
  1281. int sw_di_set(u32 sw,u32 no,u8 v)
  1282. {
  1283. if(no == 0)
  1284. {
  1285. return -1;
  1286. }
  1287. no--;
  1288. if(sw == 0)
  1289. {
  1290. g_sw_pub.di[no] = v;
  1291. }
  1292. else
  1293. {
  1294. sw--;
  1295. g_sw[sw].di[no] = v;
  1296. }
  1297. return 0;
  1298. }
  1299. /******************************************************************************
  1300. 函数名称: sw_do
  1301. 函数版本: 01.01
  1302. 创建作者: sunxi
  1303. 创建日期: 2013-08-07
  1304. 函数说明: 针对线路开关执行开出动作
  1305. 参数说明:
  1306. sw 开关序号
  1307. index 开出索引
  1308. type 开出类型
  1309. 返回值:
  1310. 0: 成功
  1311. 其它: 失败
  1312. 修改记录:
  1313. */
  1314. static int _sw_do(u32 slot,u32 index,int type)
  1315. {
  1316. int ret,do_num;
  1317. do_num = equ_get_do_num(slot);
  1318. if(do_num == 0)
  1319. {
  1320. return -1;
  1321. }
  1322. // 将辅助板的4个开出(64~67)映射到(0~3),
  1323. // 解决32位宽度不够的问题,这样LED灯不允许配置成开出。
  1324. // 其它板不存在这个问题,例如开出板只有16个开出可配
  1325. if((g_board_info[slot].type == BOARD_TYPE_AUX) || (g_board_info[slot].type == BOARD_TYPE_ZT))
  1326. {
  1327. index = index%32;
  1328. }
  1329. ret = 0;
  1330. switch(type)
  1331. {
  1332. case SW_DO_TYPE_OFF:
  1333. case SW_DO_TYPE_ON:
  1334. ret = dido_do(slot,(1<<index),type);
  1335. break;
  1336. case SW_DO_TYPE_SELECT_ON:
  1337. if(dido_do_have_select(slot,index))
  1338. {
  1339. ret = dido_do(slot,(1<<do_num),1);
  1340. }
  1341. break;
  1342. case SW_DO_TYPE_SELECT_OFF:
  1343. if(dido_do_have_select(slot,index))
  1344. {
  1345. ret = dido_do(slot,(1<<do_num),0);
  1346. }
  1347. break;
  1348. default:
  1349. ret = -3;
  1350. break;
  1351. }
  1352. return ret;
  1353. }
  1354. int sw_do(u32 sw,u32 index,int type)
  1355. {
  1356. int ret;
  1357. u32 slot;
  1358. TRELAY_T *pR=&g_tRelay[sw];
  1359. if((index == SW_DO_HZ || index == SW_DO_YKH || index == SW_DO_BHH) && (type == SW_DO_TYPE_ON))
  1360. {
  1361. if(pR->run_stu.sw==1)
  1362. {
  1363. pR->uRmtSW.bHz_Doing = 1;
  1364. #ifdef FUNC_DRIVE
  1365. gb_drive.bHz_Doing = 1;
  1366. #endif
  1367. }
  1368. pR->uRmtSW.bTz_Doing = 0;
  1369. #ifdef FUNC_DRIVE
  1370. gb_drive.bTz_Doing = 0;
  1371. #endif
  1372. }
  1373. if((index == SW_DO_FZ || index == SW_DO_YKT || index == SW_DO_BHT) && (type == SW_DO_TYPE_ON))
  1374. {
  1375. if(pR->run_stu.sw==2)
  1376. {
  1377. pR->uRmtSW.bTz_Doing = 1;
  1378. #ifdef FUNC_DRIVE
  1379. gb_drive.bTz_Doing = 1;
  1380. #endif
  1381. }
  1382. pR->uRmtSW.bHz_Doing = 0;
  1383. #ifdef FUNC_DRIVE
  1384. gb_drive.bHz_Doing = 0;
  1385. #endif
  1386. }
  1387. if(sw >= SWITCH_NUM_MAX || index >=SW_DO_NUM)
  1388. {
  1389. return -1;
  1390. }
  1391. // 气压低闭锁分合闸
  1392. if(pRunSet->tSwSet[sw].bTT_QYD_BS
  1393. && (g_sw[sw].di[SW_DI_QYD] == SW_DI_TYPE_ON)
  1394. && (index == SW_DO_HZ || index == SW_DO_FZ||index == SW_DO_YKH||index == SW_DO_YKT||index ==SW_DO_BHH||index ==SW_DO_BHT))
  1395. {
  1396. return -2;
  1397. }
  1398. // 需要通道有配置
  1399. index = g_sw[sw].do_cfg_index[index];
  1400. if(index == INDEX_INVALLID || index >= g_equ_config->do_num)
  1401. {
  1402. return -3;
  1403. }
  1404. slot = g_equ_config_do[index].slot;
  1405. index = g_equ_config_do[index].index;
  1406. ret = _sw_do(slot,index,type);
  1407. return ret;
  1408. }
  1409. /******************************************************************************
  1410. 函数名称: sw_do_pub
  1411. 函数版本: 01.01
  1412. 创建作者: sunxi
  1413. 创建日期: 2013-08-07
  1414. 函数说明: 针对线路开关公共部门执行开出动作
  1415. 参数说明:
  1416. index 开出索引
  1417. type 开出类型
  1418. 返回值:
  1419. 0: 成功
  1420. 其它: 失败
  1421. 修改记录:
  1422. */
  1423. int sw_do_pub(u32 index,int type)
  1424. {
  1425. int ret;
  1426. u32 slot;
  1427. if(index >=PUB_DO_NUM)
  1428. {
  1429. return -1;
  1430. }
  1431. index = g_sw_pub.do_cfg_index[index];
  1432. if(index == INDEX_INVALLID || index >= g_equ_config->do_num)
  1433. {
  1434. return -2;
  1435. }
  1436. slot = g_equ_config_do[index].slot;
  1437. index = g_equ_config_do[index].index;
  1438. ret = _sw_do(slot,index,type);
  1439. return ret;
  1440. }
  1441. /******************************************************************************
  1442. 函数名称: sw_do_yk
  1443. 函数版本: 01.01
  1444. 创建作者: sunxi
  1445. 创建日期: 2013-08-07
  1446. 函数说明: 预控继电器开出
  1447. 参数说明:
  1448. index 开出索引
  1449. type 开出类型
  1450. 返回值:
  1451. 0: 成功
  1452. 其它: 失败
  1453. 修改记录:
  1454. */
  1455. int sw_do_yuk(int type)
  1456. {
  1457. int ret;
  1458. u32 slot;
  1459. int index;
  1460. index = g_sw_pub.do_cfg_index[PUB_DO_YK];
  1461. if(index == INDEX_INVALLID || index >= g_equ_config->do_num)
  1462. {
  1463. return -2;
  1464. }
  1465. slot = g_equ_config_do[index].slot;
  1466. index = g_equ_config_do[index].index;
  1467. ret = _sw_do(slot,index,type);
  1468. return ret;
  1469. }
  1470. /******************************************************************************
  1471. 函数名称: sw_v_m2_factor_k
  1472. 函数版本: 01.01
  1473. 创建作者: sunxi
  1474. 创建日期: 2013-08-07
  1475. 函数说明: 得到一个保护定值计算用的理论转化系数。目前假设所有电压的系数都是一样,
  1476. 从第一组电压中取出一个。
  1477. 参数说明:
  1478. 返回值:
  1479. 修改记录:
  1480. */
  1481. float sw_v_m2_factor_k(int id)
  1482. {
  1483. if(id < PUB_AC_NUM)
  1484. {
  1485. if(id == PUB_AC_US1)
  1486. {
  1487. if((short)g_sw_pub.ac_cfg_index[PUB_AC_US1] == INDEX_INVALLID)
  1488. {
  1489. return g_ui[PUB_AC_UAB1].m2_factor_k;
  1490. }
  1491. else
  1492. {
  1493. if(g_ui[id].chn_index != CFG_ADC_CHANNEL_ZERO)
  1494. {
  1495. return g_ui[id].m2_factor_k;
  1496. }
  1497. }
  1498. }
  1499. else if(id == PUB_AC_US2)
  1500. {
  1501. if((short)g_sw_pub.ac_cfg_index[PUB_AC_US2] == INDEX_INVALLID)
  1502. {
  1503. return g_ui[PUB_AC_UBC2].m2_factor_k;
  1504. }
  1505. else
  1506. {
  1507. if(g_ui[id].chn_index != CFG_ADC_CHANNEL_ZERO)
  1508. {
  1509. return g_ui[id].m2_factor_k;
  1510. }
  1511. }
  1512. }
  1513. else if(id == PUB_AC_U01)
  1514. {
  1515. if(g_ui[id].chn_index == CFG_ADC_CHANNEL_ZERO)
  1516. {
  1517. return g_ui[PUB_AC_UA1].m2_factor_k;
  1518. }
  1519. else
  1520. {
  1521. if(g_ui[id].chn_index != CFG_ADC_CHANNEL_ZERO)
  1522. {
  1523. return g_ui[id].m2_factor_k;
  1524. }
  1525. }
  1526. }
  1527. else if(id == PUB_AC_U02)
  1528. {
  1529. if(g_ui[id].chn_index == CFG_ADC_CHANNEL_ZERO)
  1530. {
  1531. return g_ui[PUB_AC_UA2].m2_factor_k;
  1532. }
  1533. else
  1534. {
  1535. if(g_ui[id].chn_index != CFG_ADC_CHANNEL_ZERO)
  1536. {
  1537. return g_ui[id].m2_factor_k;
  1538. }
  1539. }
  1540. }
  1541. else
  1542. {
  1543. //if(g_ui[id].chn_index != CFG_ADC_CHANNEL_ZERO)
  1544. //{
  1545. return g_ui[id].m2_factor_k;
  1546. //}
  1547. }
  1548. }
  1549. return 1.0;
  1550. }
  1551. #ifdef FUNC_DRIVE_JY
  1552. static void drive_ui_proc(void)
  1553. {
  1554. int i=0,sw=0;
  1555. TSETSW *pSet = &pRunSet->tSwSet[sw];
  1556. if(!gb_drive.b_drive_on)
  1557. {
  1558. return;
  1559. }
  1560. for(i=0;i<1;i++)//保护遥测值
  1561. {
  1562. if(!gb_drive.tDriveUa1Time.boolTrip)
  1563. {
  1564. g_ui[PUB_AC_UA1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UA1]/256.0));
  1565. g_ui[PUB_AC_UB1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UB1]/256.0));
  1566. g_ui[PUB_AC_UC1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UC1]/256.0));
  1567. g_ui[PUB_AC_UAB1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UAB1]/256.0));
  1568. g_ui[PUB_AC_UBC1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UBC1]/256.0));
  1569. g_ui[PUB_AC_UCA1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UCA1]/256.0));
  1570. }
  1571. if(!gb_drive.tDriveUa2Time.boolTrip)
  1572. {
  1573. g_ui[PUB_AC_UA2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UA2]/256.0));
  1574. g_ui[PUB_AC_UB2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UB2]/256.0));
  1575. g_ui[PUB_AC_UC2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UC2]/256.0));
  1576. g_ui[PUB_AC_UAB2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UAB2]/256.0));
  1577. g_ui[PUB_AC_UBC2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UBC2]/256.0));
  1578. g_ui[PUB_AC_UCA2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UCA2]/256.0));
  1579. }
  1580. if(!gb_drive.tDriveU0Time.boolTrip)
  1581. {
  1582. g_ui[PUB_AC_U01].m2[i] = GetSetSQR(pSet->dU_drive_u0,(pRunSet->dKU[PUB_AC_U01]/256.0));
  1583. }
  1584. if(!gb_drive.tDriveITime.boolTrip)
  1585. {
  1586. g_ui[UI_SW_INDEX_BEGIN(sw)+SW_AC_IA].m2[i] = GetSetSQR(pSet->dU_drive_i,(g_ui[UI_SW_INDEX_BEGIN(sw)+SW_AC_IA].m2_factor_k/256.0));
  1587. }
  1588. if(!gb_drive.tDriveI0Time.boolTrip)
  1589. {
  1590. g_ui[UI_SW_INDEX_BEGIN(sw)+SW_AC_I0].m2[i] = GetSetSQR(pSet->dU_drive_i0,(g_ui[UI_SW_INDEX_BEGIN(sw)+SW_AC_I0].m2_factor_k/256.0));
  1591. }
  1592. }
  1593. #if 0
  1594. //测量显示遥测值
  1595. g_sw_pub.ac_in[PUB_AC_UA1] =(pSet->dU_drive_ua1*Q16_BASE);
  1596. g_sw_pub.ac_in[PUB_AC_UAB1] =(pSet->dU_drive_ua1*Q16_BASE);
  1597. g_sw_pub.ac_in[PUB_AC_UA2] =(pSet->dU_drive_ua2*Q16_BASE);
  1598. g_sw_pub.ac_in[PUB_AC_UAB2] =(pSet->dU_drive_ua2*Q16_BASE);
  1599. g_sw_pub.ac_in[PUB_AC_U01] = (qs16)(pSet->dU_drive_u0*Q16_BASE);
  1600. g_sw[sw].ac_in[SW_AC_IA] = (qs16)(pSet->dU_drive_i*Q16_BASE);
  1601. g_sw[sw].ac_in[SW_AC_I0] = (qs16)(pSet->dU_drive_i0*Q16_BASE);
  1602. #endif
  1603. }
  1604. #endif
  1605. /******************************************************************************
  1606. 函数名称: sw_cal_protect
  1607. 函数版本: 01.01
  1608. 创建作者: sunxi
  1609. 创建日期: 2013-08-07
  1610. 函数说明: 在保护5ms中断中计算基波的值。
  1611. 参数说明:
  1612. 返回值:
  1613. 修改记录:
  1614. */
  1615. void sw_cal_protect(void)
  1616. {
  1617. int sw,i,index ;
  1618. short *psam;
  1619. qs08 angle;
  1620. qs16 lncos,lnsin;
  1621. struct ri_s16 ri16;
  1622. struct ri_s16 ri16_2;
  1623. struct ri_s32 ri;
  1624. struct ri_s32 ri_2[2];
  1625. // 更新保护计算时采样点的索引
  1626. g_prot_index=g_adc_dots_index;
  1627. #ifdef FUN_HCBS
  1628. {
  1629. extern DWORD dTcounterrem;
  1630. dTcounterrem=dTCounter;
  1631. }
  1632. #endif
  1633. // 计算模值平方
  1634. for(i=0; i<UI_NUM; i++)
  1635. {
  1636. // 如果索引通道不存在,不需计算
  1637. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO)
  1638. {
  1639. continue;
  1640. }
  1641. // 检查硬件通道是否正常,如果不正常,ri清零;否则计算出ri。
  1642. if(equ_ac_channel_is_ok(g_ui[i].chn_index) == 0)
  1643. {
  1644. ri16.r = 0;
  1645. ri16.i = 0;
  1646. ri16_2.r = 0;
  1647. ri16_2.i = 0;
  1648. }
  1649. else
  1650. {
  1651. psam = adc_fourier_address(g_ui[i].chn_index,g_prot_index);
  1652. // 基波FFT
  1653. fourier32(psam, &ri16, FOURIER_HARMONIC_1);
  1654. // 二次谐波FFT
  1655. if (i >= PUB_AC_NUM)
  1656. {
  1657. fourier32(psam, &ri16_2, FOURIER_HARMONIC_2);
  1658. }
  1659. }
  1660. //基波计算
  1661. ri.r = _MulFac_S(ri16.r,g_ui[i].m2_factor_c); // 电压电流实部
  1662. ri.i = _MulFac_S(ri16.i,g_ui[i].m2_factor_c); // 电压电流虚部
  1663. angle = rt_round((g_ui[i].p_factor + factor_p_k(g_ui[i].chn_index))*256);
  1664. lncos = mCos(angle);
  1665. lnsin = mSin(angle);
  1666. g_ui[i].ri.r = _MulFac_S(ri.r,lncos) - _MulFac_S(ri.i,lnsin);
  1667. g_ui[i].ri.i = _MulFac_S(ri.r,lnsin) + _MulFac_S(ri.i,lncos);
  1668. g_ui[i].m2[0] = SQR(g_ui[i].ri.r,g_ui[i].ri.i); // 电压电流平方和
  1669. rt_stat_in(&g_ui[i].m2_stat,g_ui[i].m2[0]);
  1670. //二次谐波计算
  1671. if (i >= PUB_AC_NUM)
  1672. {
  1673. ri_2[0].r = _MulFac_S(ri16_2.r,g_ui[i].m2_factor_c); // 电压电流实部
  1674. ri_2[0].i = _MulFac_S(ri16_2.i,g_ui[i].m2_factor_c); // 电压电流虚部
  1675. #if 0
  1676. angle = rt_round(g_ui[i].p_factor*256);
  1677. lncos = mCos(angle);
  1678. lnsin = mSin(angle);
  1679. #endif
  1680. ri_2[1].r = _MulFac_S(ri_2[0].r,lncos) - _MulFac_S(ri_2[0].i,lnsin);
  1681. ri_2[1].i = _MulFac_S(ri_2[0].r,lnsin) + _MulFac_S(ri_2[0].i,lncos);
  1682. g_ui[i].m2[1] = SQR(ri_2[1].r,ri_2[1].i); // 电压电流平方和
  1683. }
  1684. }
  1685. #ifdef GD_AREA_ECZD_2020
  1686. //计算正序和负序电压
  1687. //US1
  1688. if((g_ui[PUB_AC_UA1].chn_index != CFG_ADC_CHANNEL_ZERO)&&(g_ui[PUB_AC_UB1].chn_index != CFG_ADC_CHANNEL_ZERO)&&(g_ui[PUB_AC_UC1].chn_index != CFG_ADC_CHANNEL_ZERO))
  1689. {
  1690. _sw_cal_Xfl120(PUB_AC_UA1, &Us1_120);
  1691. }
  1692. else
  1693. {
  1694. Us2_120.vect1=0;
  1695. Us2_120.vect2=0;
  1696. }
  1697. //US2
  1698. if((g_ui[PUB_AC_UA2].chn_index != CFG_ADC_CHANNEL_ZERO)&&(g_ui[PUB_AC_UB2].chn_index != CFG_ADC_CHANNEL_ZERO)&&(g_ui[PUB_AC_UC2].chn_index != CFG_ADC_CHANNEL_ZERO))
  1699. {
  1700. _sw_cal_Xfl120(PUB_AC_UA2, &Us2_120);
  1701. }
  1702. else
  1703. {
  1704. Us2_120.vect1=0;
  1705. Us2_120.vect2=0;
  1706. }
  1707. #endif
  1708. // 合成线电压1
  1709. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_LV1)
  1710. {
  1711. g_ui[PUB_AC_UAB1].ri.r = g_ui[PUB_AC_UA1].ri.r - g_ui[PUB_AC_UB1].ri.r;
  1712. g_ui[PUB_AC_UAB1].ri.i = g_ui[PUB_AC_UA1].ri.i - g_ui[PUB_AC_UB1].ri.i;
  1713. g_ui[PUB_AC_UAB1].m2[0] = SQR(g_ui[PUB_AC_UAB1].ri.r,g_ui[PUB_AC_UAB1].ri.i);
  1714. rt_stat_in(&g_ui[PUB_AC_UAB1].m2_stat,g_ui[PUB_AC_UAB1].m2[0]);
  1715. g_ui[PUB_AC_UBC1].ri.r = g_ui[PUB_AC_UB1].ri.r - g_ui[PUB_AC_UC1].ri.r;
  1716. g_ui[PUB_AC_UBC1].ri.i = g_ui[PUB_AC_UB1].ri.i - g_ui[PUB_AC_UC1].ri.i;
  1717. g_ui[PUB_AC_UBC1].m2[0] = SQR(g_ui[PUB_AC_UBC1].ri.r,g_ui[PUB_AC_UBC1].ri.i);
  1718. rt_stat_in(&g_ui[PUB_AC_UBC1].m2_stat,g_ui[PUB_AC_UBC1].m2[0]);
  1719. g_ui[PUB_AC_UCA1].ri.r = g_ui[PUB_AC_UC1].ri.r - g_ui[PUB_AC_UA1].ri.r;
  1720. g_ui[PUB_AC_UCA1].ri.i = g_ui[PUB_AC_UC1].ri.i - g_ui[PUB_AC_UA1].ri.i;
  1721. g_ui[PUB_AC_UCA1].m2[0] = SQR(g_ui[PUB_AC_UCA1].ri.r,g_ui[PUB_AC_UCA1].ri.i);
  1722. rt_stat_in(&g_ui[PUB_AC_UCA1].m2_stat,g_ui[PUB_AC_UCA1].m2[0]);
  1723. }
  1724. // 合成线电压2
  1725. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_LV2)
  1726. {
  1727. g_ui[PUB_AC_UAB2].ri.r = g_ui[PUB_AC_UA2].ri.r - g_ui[PUB_AC_UB2].ri.r;
  1728. g_ui[PUB_AC_UAB2].ri.i = g_ui[PUB_AC_UA2].ri.i - g_ui[PUB_AC_UB2].ri.i;
  1729. g_ui[PUB_AC_UAB2].m2[0] = SQR(g_ui[PUB_AC_UAB2].ri.r,g_ui[PUB_AC_UAB2].ri.i);
  1730. rt_stat_in(&g_ui[PUB_AC_UAB2].m2_stat,g_ui[PUB_AC_UAB2].m2[0]);
  1731. g_ui[PUB_AC_UBC2].ri.r = g_ui[PUB_AC_UB2].ri.r - g_ui[PUB_AC_UC2].ri.r;
  1732. g_ui[PUB_AC_UBC2].ri.i = g_ui[PUB_AC_UB2].ri.i - g_ui[PUB_AC_UC2].ri.i;
  1733. g_ui[PUB_AC_UBC2].m2[0] = SQR(g_ui[PUB_AC_UBC2].ri.r,g_ui[PUB_AC_UBC2].ri.i);
  1734. rt_stat_in(&g_ui[PUB_AC_UBC2].m2_stat,g_ui[PUB_AC_UBC2].m2[0]);
  1735. g_ui[PUB_AC_UCA2].ri.r = g_ui[PUB_AC_UC2].ri.r - g_ui[PUB_AC_UA2].ri.r;
  1736. g_ui[PUB_AC_UCA2].ri.i = g_ui[PUB_AC_UC2].ri.i - g_ui[PUB_AC_UA2].ri.i;
  1737. g_ui[PUB_AC_UCA2].m2[0] = SQR(g_ui[PUB_AC_UCA2].ri.r,g_ui[PUB_AC_UCA2].ri.i);
  1738. rt_stat_in(&g_ui[PUB_AC_UCA2].m2_stat,g_ui[PUB_AC_UCA2].m2[0]);
  1739. }
  1740. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_UCA1) // 合成线电压UCA1
  1741. {
  1742. g_ui[PUB_AC_UCA1].ri.r =- g_ui[PUB_AC_UAB1].ri.r - g_ui[PUB_AC_UBC1].ri.r;
  1743. g_ui[PUB_AC_UCA1].ri.i =- g_ui[PUB_AC_UAB1].ri.i - g_ui[PUB_AC_UBC1].ri.i;
  1744. g_ui[PUB_AC_UCA1].m2[0] = SQR(g_ui[PUB_AC_UCA1].ri.r,g_ui[PUB_AC_UCA1].ri.i);
  1745. rt_stat_in(&g_ui[PUB_AC_UCA1].m2_stat,g_ui[PUB_AC_UCA1].m2[0]);
  1746. }
  1747. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_UCA2) // 合成线电压UCA1
  1748. {
  1749. g_ui[PUB_AC_UCA2].ri.r =- g_ui[PUB_AC_UAB2].ri.r - g_ui[PUB_AC_UBC2].ri.r;
  1750. g_ui[PUB_AC_UCA2].ri.i =- g_ui[PUB_AC_UAB2].ri.i - g_ui[PUB_AC_UBC2].ri.i;
  1751. g_ui[PUB_AC_UCA2].m2[0] = SQR(g_ui[PUB_AC_UCA2].ri.r,g_ui[PUB_AC_UCA2].ri.i);
  1752. rt_stat_in(&g_ui[PUB_AC_UCA1].m2_stat,g_ui[PUB_AC_UCA2].m2[0]);
  1753. }
  1754. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_U01)
  1755. {
  1756. g_ui[PUB_AC_U01].ri.r = g_ui[PUB_AC_UA1].ri.r + g_ui[PUB_AC_UB1].ri.r+ g_ui[PUB_AC_UC1].ri.r;
  1757. g_ui[PUB_AC_U01].ri.i = g_ui[PUB_AC_UA1].ri.i + g_ui[PUB_AC_UB1].ri.i+ g_ui[PUB_AC_UC1].ri.i;
  1758. g_ui[PUB_AC_U01].m2[0] = SQR(g_ui[PUB_AC_U01].ri.r,g_ui[PUB_AC_U01].ri.i);
  1759. rt_stat_in(&g_ui[PUB_AC_U01].m2_stat,g_ui[PUB_AC_U01].m2[0]);
  1760. }
  1761. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_U02)
  1762. {
  1763. g_ui[PUB_AC_U02].ri.r = g_ui[PUB_AC_UA2].ri.r + g_ui[PUB_AC_UB2].ri.r+ g_ui[PUB_AC_UC2].ri.r;
  1764. g_ui[PUB_AC_U02].ri.i = g_ui[PUB_AC_UA2].ri.i + g_ui[PUB_AC_UB2].ri.i+ g_ui[PUB_AC_UC2].ri.i;
  1765. g_ui[PUB_AC_U02].m2[0] = SQR(g_ui[PUB_AC_U02].ri.r,g_ui[PUB_AC_U02].ri.i);
  1766. rt_stat_in(&g_ui[PUB_AC_U02].m2_stat,g_ui[PUB_AC_U02].m2[0]);
  1767. }
  1768. // 合成电流
  1769. for(sw=0; sw<g_sw_num; sw++)
  1770. {
  1771. // IB
  1772. if(g_sw[sw].ui_flags&UI_FLAGS_MAKE_IB)
  1773. {
  1774. index = UI_SW_INDEX(sw,SW_AC_IB);
  1775. g_ui[index].ri.r = -g_ui[UI_SW_INDEX(sw,SW_AC_IA)].ri.r - g_ui[UI_SW_INDEX(sw,SW_AC_IC)].ri.r;
  1776. g_ui[index].ri.i = -g_ui[UI_SW_INDEX(sw,SW_AC_IA)].ri.i - g_ui[UI_SW_INDEX(sw,SW_AC_IC)].ri.i;
  1777. g_ui[index].m2[0] = SQR(g_ui[index].ri.r,g_ui[index].ri.i);
  1778. rt_stat_in(&g_ui[index].m2_stat,g_ui[index].m2[0]);
  1779. }
  1780. // I0
  1781. if(g_sw[sw].ui_flags&UI_FLAGS_MAKE_I0)
  1782. {
  1783. index = UI_SW_INDEX(sw,SW_AC_I0);
  1784. g_ui[index].ri.r = g_ui[UI_SW_INDEX(sw,SW_AC_IA)].ri.r + g_ui[UI_SW_INDEX(sw,SW_AC_IB)].ri.r + g_ui[UI_SW_INDEX(sw,SW_AC_IC)].ri.r;
  1785. g_ui[index].ri.i = g_ui[UI_SW_INDEX(sw,SW_AC_IA)].ri.i + g_ui[UI_SW_INDEX(sw,SW_AC_IB)].ri.i + g_ui[UI_SW_INDEX(sw,SW_AC_IC)].ri.i;
  1786. g_ui[index].m2[0] = SQR(g_ui[index].ri.r,g_ui[index].ri.i);
  1787. rt_stat_in(&g_ui[index].m2_stat,g_ui[index].m2[0]);
  1788. }
  1789. #ifdef FUN_JDXX
  1790. //计算零序有功无功
  1791. if(pRunSet->tSwSet[sw].bTT_Power_v2 == 0)
  1792. {
  1793. if(g_ui[PUB_AC_U01].chn_index != CFG_ADC_CHANNEL_ZERO)
  1794. {
  1795. if(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].chn_index != CFG_ADC_CHANNEL_ZERO)
  1796. {
  1797. g_ui_p0[sw].p= _sw_p2(g_ui[PUB_AC_U01].ri.r,g_ui[PUB_AC_U01].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.i,g_ui[PUB_AC_U01].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].e_factor);
  1798. g_ui_p0[sw].q= _sw_q2(g_ui[PUB_AC_U01].ri.r,g_ui[PUB_AC_U01].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.i,g_ui[PUB_AC_U01].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].e_factor);
  1799. }
  1800. if(g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].chn_index != CFG_ADC_CHANNEL_ZERO)
  1801. {
  1802. g_ui_p0[sw].ps= _sw_p2(g_ui[PUB_AC_U01].ri.r,g_ui[PUB_AC_U01].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.i,g_ui[PUB_AC_U01].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].e_factor);
  1803. g_ui_p0[sw].qs= _sw_q2(g_ui[PUB_AC_U01].ri.r,g_ui[PUB_AC_U01].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.i,g_ui[PUB_AC_U01].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].e_factor);
  1804. }
  1805. }
  1806. else
  1807. {
  1808. g_ui_p0[sw].p=0;g_ui_p0[sw].q=0;
  1809. g_ui_p0[sw].ps=0;g_ui_p0[sw].qs=0;
  1810. }
  1811. }
  1812. else
  1813. {
  1814. if(g_ui[PUB_AC_U02].chn_index != CFG_ADC_CHANNEL_ZERO)
  1815. {
  1816. if(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].chn_index != CFG_ADC_CHANNEL_ZERO)
  1817. {
  1818. g_ui_p0[sw].p= _sw_p2(g_ui[PUB_AC_U02].ri.r,g_ui[PUB_AC_U02].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.i,g_ui[PUB_AC_U02].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].e_factor);
  1819. g_ui_p0[sw].q= _sw_q2(g_ui[PUB_AC_U02].ri.r,g_ui[PUB_AC_U02].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.i,g_ui[PUB_AC_U02].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].e_factor);
  1820. }
  1821. if(g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].chn_index != CFG_ADC_CHANNEL_ZERO)
  1822. {
  1823. g_ui_p0[sw].ps= _sw_p2(g_ui[PUB_AC_U02].ri.r,g_ui[PUB_AC_U02].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.i,g_ui[PUB_AC_U02].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].e_factor);
  1824. g_ui_p0[sw].qs= _sw_q2(g_ui[PUB_AC_U02].ri.r,g_ui[PUB_AC_U02].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.i,g_ui[PUB_AC_U02].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].e_factor);
  1825. }
  1826. }
  1827. else
  1828. {
  1829. g_ui_p0[sw].p=0;g_ui_p0[sw].q=0;
  1830. g_ui_p0[sw].ps=0;g_ui_p0[sw].qs=0;
  1831. }
  1832. }
  1833. #endif
  1834. }
  1835. // 仅线电压需计算幅值
  1836. for(i=PUB_AC_UAB1; i<PUB_AC_NUM; i++)
  1837. {
  1838. g_ui[i].fz = _AmXY(g_ui[i].ri.r,g_ui[i].ri.i);
  1839. }
  1840. #ifdef FUNC_DRIVE_JY
  1841. drive_ui_proc();
  1842. #endif
  1843. // 计算最大最小值
  1844. _sw_min_max(PUB_AC_UA1,&g_sw_pub.m2_min[0],&g_sw_pub.m2_max[0]);
  1845. _sw_min_max(PUB_AC_UAB1,&g_sw_pub.m2_min[2],&g_sw_pub.m2_max[2]);
  1846. _sw_min_max(PUB_AC_UAB2,&g_sw_pub.m2_min[3],&g_sw_pub.m2_max[3]);
  1847. _fz_min_max(PUB_AC_UAB1,PUB_AC_UCA1,&g_sw_pub.fz_min[0],&g_sw_pub.fz_max[0]);
  1848. _fz_min_max(PUB_AC_UAB2,PUB_AC_UCA2,&g_sw_pub.fz_min[1],&g_sw_pub.fz_max[1]);
  1849. for(sw=0; sw<g_sw_num; sw++)
  1850. {
  1851. for(i=UI_SW_INDEX(sw,SW_AC_IA); i<=UI_SW_INDEX(sw,SW_AC_IC); i++)
  1852. {
  1853. g_ui[i].fz = _AmXY(g_ui[i].ri.r,g_ui[i].ri.i);
  1854. }
  1855. _sw_min_max(UI_SW_INDEX_BEGIN(sw),&g_sw[sw].m2_min,&g_sw[sw].m2_max);
  1856. _fz_min_max(UI_SW_INDEX(sw,SW_AC_IA),UI_SW_INDEX(sw,SW_AC_IC),&g_sw[sw].fz_min,&g_sw[sw].fz_max);
  1857. }
  1858. return;
  1859. }
  1860. /******************************************************************************
  1861. 函数名称: sw_cal_app
  1862. 函数版本: 01.01
  1863. 创建作者: sunxi
  1864. 创建日期: 2013-08-07
  1865. 函数说明: 在测量线程中计算测量值
  1866. 参数说明:
  1867. 返回值:
  1868. 修改记录:
  1869. */
  1870. void _sw_cal_zl(void);
  1871. int sw_cal_app(void )
  1872. {
  1873. _sw_temp_factor();
  1874. if(_sw_cal_mea() != 0)
  1875. {
  1876. return 0;
  1877. }
  1878. // 如果没有达到累计次数,直接返回。
  1879. g_mea_cnt++;
  1880. if(g_mea_cnt < MEA_CAL_NUMBER)
  1881. {
  1882. return 0;
  1883. }
  1884. g_mea_cnt = 0;
  1885. _sw_cal_average(MEA_CAL_NUMBER);
  1886. return 0;
  1887. }
  1888. void sw_factor_cp(void) //保存校正的系数,根据第一路电流的配置,是按CT默认100A校正还是51欧校正
  1889. {
  1890. bool b100A=false;
  1891. bool b50A=false;
  1892. bool b20A=false;
  1893. bool b10A=false;
  1894. int i;
  1895. for(i=0; i< g_equ_config->ac_num; i++)
  1896. {
  1897. if(g_equ_config_ac[i].owner ==1&&g_equ_config_ac[i].type==(SW_AC_IA+1)) // 根据开关1 IA的配置,保存相关的参数
  1898. {
  1899. if(g_equ_config_ac[i].scale==EQU_SCALE_CT_DEFAULT)
  1900. {
  1901. b100A=true;
  1902. }
  1903. if(g_equ_config_ac[i].scale==EQU_SCALE_CT_10A_51)
  1904. {
  1905. b50A=true;
  1906. }
  1907. if(g_equ_config_ac[i].scale==EQU_SCALE_CT_10A_249)
  1908. {
  1909. b20A=true;
  1910. }
  1911. if(g_equ_config_ac[i].scale==EQU_SCALE_CT_10A_120)
  1912. {
  1913. b10A=true;
  1914. }
  1915. if(b100A)
  1916. {
  1917. rt_file_cp("/app/data/acfactor.bin","/app/data/acfactor_100A.bin");
  1918. }
  1919. if(b50A)
  1920. {
  1921. rt_file_cp("/app/data/acfactor.bin","/app/data/acfactor_50A.bin");
  1922. }
  1923. if(b20A)
  1924. {
  1925. rt_file_cp("/app/data/acfactor.bin","/app/data/acfactor_20A.bin");
  1926. }
  1927. if(b10A)
  1928. {
  1929. rt_file_cp("/app/data/acfactor.bin","/app/data/acfactor_10A.bin");
  1930. }
  1931. return;
  1932. }
  1933. }
  1934. }
  1935. /******************************************************************************
  1936. 函数名称: sw_auto_adjust
  1937. 函数版本: 01.01
  1938. 创建作者: sunxi
  1939. 创建日期: 2013-08-07
  1940. 函数说明: 自动校准程序
  1941. U 100V,I 5A,
  1942. 参数说明:
  1943. 返回值:
  1944. 0: 成功
  1945. 其它: 失败
  1946. 修改记录:
  1947. */
  1948. struct pq_factor
  1949. {
  1950. int cfg_index;
  1951. float pq[2];
  1952. };
  1953. struct pq_factor g_pq_factor[SWITCH_NUM_MAX][3];
  1954. int sw_auto_adjust(int ui_angle0)
  1955. {
  1956. float baseAng;
  1957. int ret,i,j,sw;
  1958. int cfg_index;
  1959. float factor;
  1960. float fv;
  1961. float minfv,maxfv;
  1962. float baseValue ;
  1963. u16 base_v=0,base_i=0;
  1964. #ifdef PROTECT_AC_ADJUST
  1965. float fv_p;
  1966. #endif
  1967. g_mea_cnt= 0;
  1968. // 如果是单板测试,可能需要使用PUB_AC_UA2作为角度0参考
  1969. if(ui_angle0 != -1)
  1970. {
  1971. g_ui_angle0 = ui_angle0;
  1972. }
  1973. // 测量值复位
  1974. g_factor_version = ACFACTOR_FILE_VERSION;
  1975. for(i=0; i<UI_NUM; i++)
  1976. {
  1977. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO)
  1978. {
  1979. continue;
  1980. }
  1981. g_ui[i].e_acc = 0;
  1982. g_ui[i].e = 0;
  1983. g_ui[i].p_acc = 0;
  1984. g_ui[i].p = 0;
  1985. g_ui[i].p_mark = 0;
  1986. g_ui[i].e_factor = 1.0/_sw_ui_e_k(i);
  1987. g_ui[i].p_factor = 0;
  1988. }
  1989. for(sw=0; sw<g_sw_num; sw++)
  1990. {
  1991. for(j=0; j<3; j++)
  1992. {
  1993. g_pq_factor[sw][j].cfg_index = -1;
  1994. g_pq_factor[sw][j].pq[0] = 0;
  1995. g_pq_factor[sw][j].pq[1] = 0;
  1996. }
  1997. }
  1998. sw_stat_reset();
  1999. // 测量AUTO_ADJUST_NUM次
  2000. for(i=0;i<AUTO_ADJUST_NUM;i++) // 计算多次幅值
  2001. {
  2002. watchdog_feed_mainloop();
  2003. // 得到采样点
  2004. _sw_get_dots();
  2005. // fft
  2006. _sw_cal_fft();
  2007. _sw_cal_ri_correct();
  2008. // 计算有效值
  2009. _sw_cal_effect();
  2010. // 计算角度
  2011. _sw_cal_angle();
  2012. // 延时20ms,并喂狗
  2013. #ifdef CPU_FUXI
  2014. msleep(30);
  2015. #else
  2016. ustimer_delay(20*USTIMER_MS);
  2017. #endif
  2018. watchdog_feed_mainloop();
  2019. }
  2020. _sw_cal_average(AUTO_ADJUST_NUM);
  2021. #if 0 //def PROTECT_AC_ADJUST
  2022. factor_restore_default();
  2023. ustimer_delay(20*USTIMER_MS);
  2024. #endif
  2025. for(i=0; i<UI_NUM; i++)
  2026. {
  2027. // 如果索引通道不存在,不需计算
  2028. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO)
  2029. {
  2030. continue;
  2031. }
  2032. fv = (float)g_ui[i].e/Q16_BASE;
  2033. #ifdef PROTECT_AC_ADJUST
  2034. fv_p = (float)_Mul_Div_U(sqrt_32fix(g_ui[i].m2[0]), 256, g_ui[i].m2_factor_k)/(float)Q16_BASE;
  2035. #endif
  2036. // 确定通道配置索引和基本值
  2037. if(i<PUB_AC_NUM)
  2038. {
  2039. cfg_index = g_sw_pub.ac_cfg_index[i];
  2040. //if(g_equ_config_ac[cfg_index].scale == EQU_SCALE_EVT_3V25_100V)
  2041. //{
  2042. // 电子式相电压
  2043. // baseValue = 57.735;
  2044. //}
  2045. /*
  2046. else if(g_equ_config_ac[cfg_index].scale == EQU_SCALE_EVT_6V50_100V)
  2047. {
  2048. // 电子式零序电压,为了校验方便,使用C相电压,换算零序为此值。
  2049. baseValue = 28.86751346;
  2050. }
  2051. */
  2052. // 自适应电压校准
  2053. if(fv > 200) // 220
  2054. {
  2055. // 220V额定电压
  2056. baseValue = 220; //
  2057. }
  2058. else if (fv > (120.0*1.732)) // 207.84
  2059. {
  2060. // 130V相电压合成线电压校准
  2061. // 因为罩式控制器在用100V校准时,PT切换不断的响,
  2062. // 130V相电压可得到225V电源,可避免PT切换的异响
  2063. baseValue = 130*1.732; // 225.16
  2064. }
  2065. else if(fv > 90*1.732) // 155.88
  2066. {
  2067. // 100V相电压合成线电压校准
  2068. baseValue = 100*1.732; // 173.2
  2069. }
  2070. else if (fv > 120.0) // 120
  2071. {
  2072. // 130V 相电压校准
  2073. baseValue = 130; // 130
  2074. }
  2075. else if(fv > 90.0)
  2076. {
  2077. // 100V 相电压校准
  2078. baseValue = 100; // 100
  2079. }
  2080. else if(fv > 50.0)
  2081. {
  2082. // 100V 相电压校准
  2083. baseValue = 57.735; // 57.735
  2084. }
  2085. else if(fv > 16.0)
  2086. {
  2087. // 100V 相电压校准
  2088. baseValue = 20; // 20
  2089. }
  2090. else if(fv > 8.0)
  2091. {
  2092. // 10V 相电压校准
  2093. baseValue = 10; // 10
  2094. }
  2095. else if(fv > 6.0)
  2096. {
  2097. baseValue =6.5;
  2098. }
  2099. else if(fv > 2.0)
  2100. {
  2101. // 10V 相电压校准
  2102. baseValue = 3; // 10
  2103. }
  2104. else if(fv > 1.5)
  2105. {
  2106. baseValue = 1.8763875;
  2107. }
  2108. else
  2109. {
  2110. // 57.735V 相电压校准
  2111. baseValue = 57.735; // 57.735
  2112. }
  2113. }
  2114. else
  2115. {
  2116. sw = (i - PUB_AC_NUM)/SW_AC_NUM;
  2117. j = (i - PUB_AC_NUM)%SW_AC_NUM;
  2118. cfg_index = g_sw[sw].ac_cfg_index[j];
  2119. // 电子式互感器I0使用5A校准
  2120. // if(g_equ_config_ac[cfg_index].scale == EQU_SCALE_ECT_1V_1A
  2121. // || g_equ_config_ac[cfg_index].scale == EQU_SCALE_ECT_0V2_1A)
  2122. if(g_equ_config_ac[cfg_index].scale == EQU_SCALE_ECT_1V_1A)
  2123. {
  2124. // 电子式CT使用1A。
  2125. baseValue = 1;
  2126. }
  2127. else if(g_equ_config_ac[cfg_index].scale == EQU_SCALE_CT_10A_249)
  2128. {
  2129. // 高精度零序电流互感器,小信号校正值
  2130. baseValue = 0.5;
  2131. }
  2132. else if(fv > 4)
  2133. {
  2134. baseValue=5;
  2135. }
  2136. else if(fv > 2)
  2137. {
  2138. // 大容量校准时,例如16回路,标准源可能带不动5A负载。
  2139. baseValue=3;
  2140. }
  2141. else
  2142. {
  2143. baseValue=1;
  2144. }
  2145. }
  2146. minfv=baseValue*0.9;
  2147. maxfv=baseValue*1.1;
  2148. // 检查幅值是否超范围
  2149. if(fv<minfv)
  2150. {
  2151. rt_printf("sw_auto_adjust(invalid):i=%d,fv=%f,minfv=%f\r\n",i,fv ,minfv);
  2152. continue;
  2153. }
  2154. else if(fv>maxfv)
  2155. {
  2156. rt_printf("sw_auto_adjust(err):i=%d,fv=%f,maxfv=%f\r\n",i,fv ,maxfv);
  2157. return -1;
  2158. }
  2159. // 得到并检查校正系数
  2160. factor=baseValue/fv;
  2161. if(CheckFloatSet(&factor,MAX_FACTOR,MIN_FACTOR)>0)
  2162. {
  2163. rt_printf("sw_auto_adjust(err):i=%d,fv=%f,factor=%f.\r\n",i,fv ,factor);
  2164. return -2;
  2165. }
  2166. // 保存校正系数
  2167. factor_e_c_set(g_equ_config_ac[cfg_index].slot,g_equ_config_ac[cfg_index].index,factor);
  2168. #ifdef PROTECT_AC_ADJUST
  2169. factor=baseValue/fv_p;
  2170. rt_printf("fv_p=%f,baseValue=%f,factor=%f\r\n",fv_p, baseValue, factor);
  2171. if(CheckFloatSet(&factor,MAX_FACTOR,MIN_FACTOR)>0)
  2172. {
  2173. rt_printf("sw_auto_adjust(err) protect ac:i=%d,fv=%f,factor_p=%f.\r\n",i,fv ,factor);
  2174. return -2;
  2175. }
  2176. // 保存校正系数
  2177. factor_p_e_c_set(g_equ_config_ac[cfg_index].slot,g_equ_config_ac[cfg_index].index,factor);
  2178. #endif
  2179. // 保存校正成功配置通道值
  2180. if(i >= PUB_AC_NUM)
  2181. {
  2182. g_pq_factor[sw][j].cfg_index = cfg_index;
  2183. }
  2184. // 角度校准
  2185. baseAng =_sw_base_angle(i);
  2186. fv = (float)g_ui[i].p/Q16_BASE;
  2187. if(baseAng == 360.0)
  2188. {
  2189. factor = 0;
  2190. }
  2191. else
  2192. {
  2193. factor = baseAng - fv;
  2194. }
  2195. // 确保角度在正负180内。
  2196. if(factor > 180.0)
  2197. {
  2198. factor -= 360.0;
  2199. }
  2200. if(factor < -180.0)
  2201. {
  2202. factor += 360.0;
  2203. }
  2204. rt_printf("sw_auto_adjust(ang):i=%d,fv=%f,factor=%f.\r\n",i,fv ,factor);
  2205. if(factor<MIN_PHASE)
  2206. {
  2207. return -3;
  2208. }
  2209. else if(factor>MAX_PHASE)
  2210. {
  2211. return -4;
  2212. }
  2213. if(CheckFloatSet(&factor,MAX_PHASE,MIN_PHASE)>0)
  2214. {
  2215. return -5;
  2216. }
  2217. // 如果是基准通道,就不更新角度校准值。
  2218. if(i != g_ui_angle0)
  2219. {
  2220. factor_p_c_set(g_equ_config_ac[cfg_index].slot,g_equ_config_ac[cfg_index].index,factor);
  2221. }
  2222. // 保存校正温度和基准值
  2223. factor_temp_set(g_equ_config_ac[cfg_index].slot,
  2224. #if defined TMP_CHIP_DS18B20
  2225. ds18b20_get_temp()
  2226. #elif defined TMP_CHIP_GX21M15
  2227. gx21m15_get_temp()
  2228. #elif defined TMP_CHIP_AHT20
  2229. aht20_get_temp()
  2230. #endif
  2231. );
  2232. if(i < PUB_AC_NUM)
  2233. {
  2234. base_v = baseValue;
  2235. }
  2236. else
  2237. {
  2238. base_i = baseValue;
  2239. }
  2240. }
  2241. // 重新初始化
  2242. sw_init();
  2243. //保存校正系数
  2244. ret = factor_write_all(base_v,base_i);
  2245. if(ret != 0)
  2246. {
  2247. return -6;
  2248. }
  2249. sw_factor_cp();
  2250. soe_record_opt(EV_CHNZJS, 0);
  2251. return 0;
  2252. }
  2253. float g_dc_factor[2][2]=
  2254. {
  2255. {1.0,1.0},
  2256. {1.0,1.0},
  2257. };
  2258. int sw_adjust_dc_0(void)
  2259. {
  2260. int i;
  2261. float dc;
  2262. #ifdef DC_NUM_SET
  2263. for(i=0;i<pRunSet->dDc_num;i++)
  2264. #else
  2265. for(i=0;i<DC_NUM;i++)
  2266. #endif
  2267. {
  2268. dc = dc_get(i);
  2269. if(dc < 0.5*dc_adjust[0])
  2270. {
  2271. return -1;
  2272. }
  2273. if(dc > 1.5*dc_adjust[0])
  2274. {
  2275. return -2;
  2276. }
  2277. g_dc_factor[i][0] = dc;
  2278. }
  2279. return 0;
  2280. }
  2281. int sw_adjust_dc_1(void)
  2282. {
  2283. int i;
  2284. float dc;
  2285. #ifdef DC_NUM_SET
  2286. for(i=0;i<pRunSet->dDc_num;i++)
  2287. #else
  2288. for(i=0;i<DC_NUM;i++)
  2289. #endif
  2290. {
  2291. dc = dc_get(i);
  2292. if(dc < 0.5*dc_adjust[1])
  2293. {
  2294. return -1;
  2295. }
  2296. if(dc > 1.5*dc_adjust[1])
  2297. {
  2298. return -2;
  2299. }
  2300. g_dc_factor[i][1] = dc;
  2301. }
  2302. _sw_save_dc_factor(g_dc_factor[0][1], g_dc_factor[0][0], g_dc_factor[1][1], g_dc_factor[1][0]);
  2303. return 0;
  2304. }
  2305. /*------------------------------ 内部函数 -------------------------------------
  2306. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  2307. */
  2308. /******************************************************************************
  2309. 函数名称: _sw_get_dots
  2310. 函数版本: 01.01
  2311. 创建作者: sunxi
  2312. 创建日期: 2013-08-07
  2313. 函数说明: 获取采样点,供测量计算用
  2314. 参数说明:
  2315. 返回值:
  2316. 修改记录:
  2317. */
  2318. void xdl_smooth3 ( short in[], short out[], int N );
  2319. void xdl_smooth5 ( short in[], short out[], int N );
  2320. int _sw_check_tb_dots(unsigned long dot_index)
  2321. {
  2322. int i,j;
  2323. if(pRunSet->dSmoothZero==0)return 0;
  2324. for(i=0;i<CFG_ADC_CHANNEL;i++)
  2325. {
  2326. short pnSam[3] = {0};
  2327. long laaa;
  2328. DWORD daaa;
  2329. int caulp;
  2330. if(!g_equ_adc_config[i]) // 通道无配置
  2331. {
  2332. continue;
  2333. }
  2334. for(j=0;j<CFG_ADC_DOTS_PER_PERIOD;j++)
  2335. {
  2336. caulp = (dot_index+j)&CFG_ADC_DOTS_MASK;
  2337. // 取出连续三周波的同一对应点
  2338. pnSam[0] = g_adc_dots[i][(caulp - 1) & SAMLENGTH];
  2339. pnSam[1] = g_adc_dots[i][(caulp - SAMFREQ -1) & SAMLENGTH];
  2340. pnSam[2] = g_adc_dots[i][(caulp - 2*SAMFREQ -1) & SAMLENGTH];
  2341. // 计算突变量并取绝对值,i(k)-2*i(k-N)+i(K-2N)
  2342. laaa = ( pnSam[0] - pnSam[1]*2 + pnSam[2]);
  2343. if(laaa < 0)
  2344. {
  2345. daaa = -laaa;//
  2346. }
  2347. else
  2348. {
  2349. daaa = laaa;
  2350. }
  2351. // 检查是否超过突变量门槛,且需满足3次,即对应相电流突变量满足要求
  2352. if(daaa > pRunSet->dSmoothZero)
  2353. {
  2354. rt_printf("\r\n chnel=%d zero=%d set=%d",i,daaa,pRunSet->dSmoothZero);
  2355. return -1;
  2356. }
  2357. }
  2358. }
  2359. return 0;
  2360. }
  2361. void _sw_get_dots(void)
  2362. {
  2363. unsigned long i,loop,dots_index ,dots_count_old;
  2364. int cnt;
  2365. int ret=0;
  2366. loop =0;
  2367. do
  2368. {
  2369. // 获取采样点的位置,如果最后一个周波跨界,调整采样点的位置。
  2370. #ifdef CPU_FUXI
  2371. dots_count_old = g_adc_dots_index - CFG_ADC_DOTS_PER_PERIOD; //jack.liu 20200921 获取最后一个周波的采样点
  2372. #else
  2373. dots_count_old = g_adc_dots_count - CFG_ADC_DOTS_PER_PERIOD; // 最后一个周波的采样点
  2374. #endif
  2375. cnt = (dots_count_old&CFG_ADC_DOTS_MASK) - (CFG_ADC_DOTS_PER_CHANNEL - CFG_ADC_DOTS_PER_PERIOD);
  2376. if(cnt > 0)
  2377. {
  2378. dots_count_old -= cnt;
  2379. }
  2380. dots_index = dots_count_old&CFG_ADC_DOTS_MASK;
  2381. ret=_sw_check_tb_dots(dots_index);
  2382. if(ret<0)return; // 波形判断有突变,不处理采样
  2383. for(i=0;i<CFG_ADC_CHANNEL;i++)
  2384. {
  2385. #if 0
  2386. if(g_equ_adc_config[i])
  2387. {
  2388. xdl_smooth3(&g_adc_dots[i][dots_index],&g_adc_dots[i][CFG_ADC_DOTS_PER_CHANNEL],CFG_ADC_DOTS_PER_PERIOD);
  2389. }
  2390. #else
  2391. memcpy(&g_adc_dots[i][CFG_ADC_DOTS_PER_CHANNEL],&g_adc_dots[i][dots_index],CFG_ADC_DOTS_PER_PERIOD*2);
  2392. #endif
  2393. }
  2394. loop++;
  2395. if(loop > 5)
  2396. {
  2397. rt_printf("sw_get_dots:i=%d\r\n",loop);
  2398. }
  2399. }
  2400. #ifdef CPU_FUXI
  2401. while((g_adc_dots_index - dots_count_old) > CFG_ADC_DOTS_PER_CHANNEL);
  2402. #else
  2403. while((g_adc_dots_count - dots_count_old) > CFG_ADC_DOTS_PER_CHANNEL);
  2404. #endif
  2405. }
  2406. /******************************************************************************
  2407. 函数名称: _sw_fft
  2408. 函数版本: 01.01
  2409. 创建作者: sunxi
  2410. 创建日期: 2013-08-07
  2411. 函数说明: 计算FFT,一次计算两个通道
  2412. 参数说明:
  2413. ch0 通道0索引
  2414. ch1 通道1索引
  2415. p0 通道0结果,所有谐波的复数表示。
  2416. p1 通道1结果,所有谐波的复数表示。
  2417. 返回值:
  2418. 修改记录:
  2419. */
  2420. void _sw_fft(int ch0,int ch1,complex * p0,complex * p1)
  2421. {
  2422. static complex k[CFG_ADC_DOTS_PER_PERIOD];
  2423. int i;
  2424. // 初始化点
  2425. for(i=0; i<CFG_ADC_DOTS_PER_PERIOD; i++)
  2426. {
  2427. k[i].r = g_adc_dots[ch0][CFG_ADC_DOTS_PER_CHANNEL + i];
  2428. k[i].i = g_adc_dots[ch1][CFG_ADC_DOTS_PER_CHANNEL + i];
  2429. }
  2430. // 计算
  2431. fft(CFG_ADC_DOTS_PER_PERIOD, &k[0]);
  2432. // 整理
  2433. for (i=1;i<=g_harmonic_num;i++)
  2434. {
  2435. if(p0)
  2436. {
  2437. p0[i].r = (k[i].r+k[CFG_ADC_DOTS_PER_PERIOD-i].r)/CFG_ADC_DOTS_PER_PERIOD;
  2438. p0[i].i = (k[i].i-k[CFG_ADC_DOTS_PER_PERIOD-i].i)/CFG_ADC_DOTS_PER_PERIOD;
  2439. }
  2440. if(p1)
  2441. {
  2442. p1[i].r = (k[i].i+k[CFG_ADC_DOTS_PER_PERIOD-i].i)/CFG_ADC_DOTS_PER_PERIOD;
  2443. p1[i].i = (k[CFG_ADC_DOTS_PER_PERIOD-i].r-k[i].r)/CFG_ADC_DOTS_PER_PERIOD;
  2444. }
  2445. }
  2446. }
  2447. /******************************************************************************
  2448. 函数名称: _sw_cal_fft
  2449. 函数版本: 01.01
  2450. 创建作者: sunxi
  2451. 创建日期: 2013-08-07
  2452. 函数说明: 计算所有通道的FFT
  2453. 参数说明:
  2454. 返回值:
  2455. 修改记录:
  2456. */
  2457. void _sw_cal_fft(void)
  2458. {
  2459. s32 i,index0;
  2460. // fft
  2461. index0 = UI_NUM;
  2462. for(i=0;i<UI_NUM;i++)
  2463. {
  2464. // 如果索引通道不存在,不需计算
  2465. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO)
  2466. {
  2467. continue;
  2468. }
  2469. // 检查硬件通道是否正常,如果不正常,ri清零;否则计算出ri。
  2470. if(equ_ac_channel_is_ok(g_ui[i].chn_index) == 0)
  2471. {
  2472. memset(&g_ui[i].h,0,sizeof(g_ui[i].h));
  2473. continue;
  2474. }
  2475. if(index0 == UI_NUM)
  2476. {
  2477. index0 = i;
  2478. }
  2479. else
  2480. {
  2481. _sw_fft(g_ui[index0].chn_index,g_ui[i].chn_index,g_ui[index0].h,g_ui[i].h);
  2482. index0 = UI_NUM;
  2483. }
  2484. }
  2485. if(index0 != UI_NUM)
  2486. {
  2487. _sw_fft(g_ui[index0].chn_index,g_ui[index0].chn_index,g_ui[index0].h,NULL);
  2488. }
  2489. return;
  2490. }
  2491. /******************************************************************************
  2492. 函数名称: _sw_cal_h_sub
  2493. 函数版本: 01.01
  2494. 创建作者: sunxi
  2495. 创建日期: 2013-08-07
  2496. 函数说明: 2个谐波向量减
  2497. 参数说明:
  2498. r 结果
  2499. a 向量a的g_ui索引
  2500. b 向量b的g_ui索引
  2501. 返回值:
  2502. 修改记录:
  2503. */
  2504. void _sw_cal_h_sub(int r,int a,int b)
  2505. {
  2506. int i;
  2507. for(i=1;i<=g_harmonic_num;i++)
  2508. {
  2509. g_ui[r].h[i].r = g_ui[a].h[i].r - g_ui[b].h[i].r;
  2510. g_ui[r].h[i].i = g_ui[a].h[i].i - g_ui[b].h[i].i;
  2511. }
  2512. return;
  2513. }
  2514. /******************************************************************************
  2515. 函数名称: _sw_cal_h_sub2
  2516. 函数版本: 01.01
  2517. 创建作者: sunxi
  2518. 创建日期: 2013-08-07
  2519. 函数说明: 谐波向量减,求Ib
  2520. 参数说明:
  2521. r 结果
  2522. o 向量o的g_ui索引
  2523. a 向量a的g_ui索引
  2524. b 向量b的g_ui索引
  2525. 返回值:
  2526. 修改记录:
  2527. */
  2528. void _sw_cal_h_sub2(int r,int o,int a,int b)
  2529. {
  2530. int i;
  2531. float factor_i0_ia=1.0;
  2532. if((g_ui[o].m2_factor_k!=0)&&(g_ui[o].m2_factor_k!=g_ui[a].m2_factor_k))
  2533. {
  2534. factor_i0_ia=(float)g_ui[a].m2_factor_k/g_ui[o].m2_factor_k;
  2535. }
  2536. for(i=1;i<=g_harmonic_num;i++)
  2537. {
  2538. g_ui[r].h[i].r = g_ui[o].h[i].r*factor_i0_ia - g_ui[a].h[i].r - g_ui[b].h[i].r;
  2539. g_ui[r].h[i].i = g_ui[o].h[i].i *factor_i0_ia- g_ui[a].h[i].i - g_ui[b].h[i].i;
  2540. }
  2541. return;
  2542. }
  2543. /******************************************************************************
  2544. 函数名称: _sw_cal_h_add
  2545. 函数版本: 01.01
  2546. 创建作者: sunxi
  2547. 创建日期: 2013-08-07
  2548. 函数说明: 3个谐波向量加
  2549. 参数说明:
  2550. r 结果
  2551. a 向量a的g_ui索引
  2552. b 向量b的g_ui索引
  2553. c 向量c的g_ui索引
  2554. 返回值:
  2555. 修改记录:
  2556. */
  2557. void _sw_cal_h_add(int r,int a,int b,int c)
  2558. {
  2559. int i;
  2560. for(i=1;i<=g_harmonic_num;i++)
  2561. {
  2562. g_ui[r].h[i].r = g_ui[a].h[i].r + g_ui[b].h[i].r + g_ui[c].h[i].r;
  2563. g_ui[r].h[i].i = g_ui[a].h[i].i + g_ui[b].h[i].i + g_ui[c].h[i].i;
  2564. }
  2565. return;
  2566. }
  2567. /******************************************************************************
  2568. 函数名称: _sw_cal_ri_correct
  2569. 函数版本: 01.01
  2570. 创建作者: sunxi
  2571. 创建日期: 2013-08-07
  2572. 函数说明: 根据角度误差校正向量值
  2573. 参数说明:
  2574. 返回值:
  2575. 修改记录:
  2576. */
  2577. void _sw_cal_ri_correct(void)
  2578. {
  2579. s32 i,j;
  2580. qs08 angle;
  2581. qs16 lncos,lnsin,v;
  2582. struct ri_s32 ri;
  2583. for(i=0;i<UI_NUM;i++)
  2584. {
  2585. // 如果索引通道不存在,不需计算
  2586. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO)
  2587. {
  2588. continue;
  2589. }
  2590. // 根据频率修正角度校正值,提高频率变化时的功率精度。
  2591. angle = rt_round((g_ui[i].p_factor + factor_p_k(g_ui[i].chn_index))*256);
  2592. for(j=1;j<=g_harmonic_num;j++)
  2593. {
  2594. lncos = mCos(angle*j);
  2595. lnsin = mSin(angle*j);
  2596. ri.r = rt_round(g_ui[i].h[j].r * Q16_BASE);
  2597. ri.i = rt_round(g_ui[i].h[j].i * Q16_BASE);
  2598. v = _MulFac_S(ri.r,lncos) - _MulFac_S(ri.i,lnsin);
  2599. g_ui[i].h[j].r = (float)v/Q16_BASE;
  2600. v = _MulFac_S(ri.r,lnsin) + _MulFac_S(ri.i,lncos);
  2601. g_ui[i].h[j].i = (float)v/Q16_BASE;
  2602. }
  2603. }
  2604. }
  2605. /******************************************************************************
  2606. 函数名称: _sw_cal_unbalance
  2607. 函数版本: 01.01
  2608. 创建作者: sunxi
  2609. 创建日期: 2013-08-07
  2610. 函数说明: 不平衡度计算
  2611. 参数说明:
  2612. 返回值:
  2613. 修改记录:
  2614. */
  2615. #ifdef asdfadasdfa
  2616. void CalcuIx120( struct UI *pI, struct UI120 *pII )
  2617. {
  2618. long labc,lbc;
  2619. labc = pI->lIaR - (( pI->lIbR + pI->lIcR )>>1);
  2620. lbc = pI->lIbI - pI->lIcI;
  2621. lbc =_MulFac_S(lbc, 56756);//(1.732/2)*2^16=56756
  2622. pII->l1Cos = labc - lbc;
  2623. pII->l2Cos = labc + lbc;
  2624. labc = pI->lIaI - ( (pI->lIbI + pI->lIcI )>>1);
  2625. lbc = pI->lIbR - pI->lIcR;
  2626. lbc =_MulFac_S(lbc,56756);//(1.732/2)*2^16=56756
  2627. pII->l1Sin = labc + lbc;
  2628. pII->l2Sin = labc - lbc;
  2629. pII->l0Cos = pI->lIaR + pI->lIbR + pI->lIcR;
  2630. pII->l0Sin = pI->lIaI + pI->lIbI + pI->lIcI;
  2631. pII->d1Modu = SQR( pII->l1Cos, pII->l1Sin );
  2632. pII->d2Modu = SQR( pII->l2Cos, pII->l2Sin );
  2633. pII->d0Modu = SQR( pII->l0Cos, pII->l0Sin );
  2634. }
  2635. #endif
  2636. float _sw_cal_unbalance(int ui_index)
  2637. {
  2638. float abc,bc;
  2639. float r1,r2,i1,i2;
  2640. abc = g_ui[ui_index].h[1].r - (g_ui[ui_index+1].h[1].r + g_ui[ui_index+2].h[1].r)/2;
  2641. bc = g_ui[ui_index+1].h[1].i - g_ui[ui_index+2].h[1].i;
  2642. bc = bc * (1.7320508/2);
  2643. r1 = abc - bc;
  2644. r2 = abc + bc;
  2645. abc = g_ui[ui_index].h[1].i - (g_ui[ui_index+1].h[1].i + g_ui[ui_index+2].h[1].i)/2;
  2646. bc = g_ui[ui_index+1].h[1].r - g_ui[ui_index+2].h[1].r;
  2647. bc = bc * (1.7320508/2);
  2648. i1 = abc + bc;
  2649. i2 = abc - bc;
  2650. abc = sqrtf(r1*r1 + i1*i1);
  2651. bc = sqrtf(r2*r2 + i2*i2);
  2652. //rt_printf("%s\tabc=%f,\tbc=%f.\r\n",g_ui[ui_index].name,abc*g_ui[ui_index].e_factor,bc*g_ui[ui_index].e_factor);
  2653. if(abc == 0.0)
  2654. {
  2655. return 100;
  2656. }
  2657. return bc/abc*100;
  2658. }
  2659. /******************************************************************************
  2660. 函数名称: _sw_cal_unbalance
  2661. 函数版本: 01.01
  2662. 创建作者: sunxi
  2663. 创建日期: 2013-08-07
  2664. 函数说明: 正负序计算
  2665. 参数说明:
  2666. 返回值:
  2667. 修改记录:
  2668. */
  2669. void _sw_cal_Xfl120( int ui_index, struct ui120 *pII )
  2670. {
  2671. float abc,bc;
  2672. float r1,r2,i1,i2;
  2673. abc = g_ui[ui_index].ri.r - (g_ui[ui_index+1].ri.r + g_ui[ui_index+2].ri.r)/2;
  2674. bc = g_ui[ui_index+1].ri.i - g_ui[ui_index+2].ri.i;
  2675. bc = bc * (1.7320508/2);
  2676. r1 = abc - bc;
  2677. r2 = abc + bc;
  2678. abc = g_ui[ui_index].ri.i - (g_ui[ui_index+1].ri.i + g_ui[ui_index+2].ri.i)/2;
  2679. bc = g_ui[ui_index+1].ri.r - g_ui[ui_index+2].ri.r;
  2680. bc = bc * (1.7320508/2);
  2681. i1 = abc + bc;
  2682. i2 = abc - bc;
  2683. pII->vect1 = (r1*r1 + i1*i1)/9;
  2684. pII->vect2 = (r2*r2 + i2*i2)/9;
  2685. }
  2686. /******************************************************************************
  2687. 函数名称: _sw_cal_make
  2688. 函数版本: 01.01
  2689. 创建作者: sunxi
  2690. 创建日期: 2013-08-07
  2691. 函数说明: 测量合成通道向量值
  2692. 参数说明:
  2693. 返回值:
  2694. 修改记录:
  2695. */
  2696. void _sw_cal_make(void)
  2697. {
  2698. int sw ;
  2699. // 合成电压
  2700. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_LV1)
  2701. {
  2702. _sw_cal_h_sub(PUB_AC_UAB1,PUB_AC_UA1,PUB_AC_UB1);
  2703. _sw_cal_h_sub(PUB_AC_UBC1,PUB_AC_UB1,PUB_AC_UC1);
  2704. _sw_cal_h_sub(PUB_AC_UCA1,PUB_AC_UC1,PUB_AC_UA1);
  2705. }
  2706. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_LV2)
  2707. {
  2708. _sw_cal_h_sub(PUB_AC_UAB2,PUB_AC_UA2,PUB_AC_UB2);
  2709. _sw_cal_h_sub(PUB_AC_UBC2,PUB_AC_UB2,PUB_AC_UC2);
  2710. _sw_cal_h_sub(PUB_AC_UCA2,PUB_AC_UC2,PUB_AC_UA2);
  2711. }
  2712. // 合成UCA
  2713. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_UCA1)
  2714. {
  2715. {
  2716. int i;
  2717. for(i=1;i<=g_harmonic_num;i++)
  2718. {
  2719. g_ui[PUB_AC_UCA1].h[i].r = -g_ui[PUB_AC_UAB1].h[i].r - g_ui[PUB_AC_UBC1].h[i].r;
  2720. g_ui[PUB_AC_UCA1].h[i].i = -g_ui[PUB_AC_UAB1].h[i].i - g_ui[PUB_AC_UBC1].h[i].i;
  2721. }
  2722. }
  2723. }
  2724. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_UCA2)
  2725. {
  2726. {
  2727. int i;
  2728. for(i=1;i<=g_harmonic_num;i++)
  2729. {
  2730. g_ui[PUB_AC_UCA2].h[i].r = -g_ui[PUB_AC_UAB2].h[i].r - g_ui[PUB_AC_UBC2].h[i].r;
  2731. g_ui[PUB_AC_UCA2].h[i].i = -g_ui[PUB_AC_UAB2].h[i].i - g_ui[PUB_AC_UBC2].h[i].i;
  2732. }
  2733. }
  2734. }
  2735. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_U01)
  2736. {
  2737. {
  2738. int i;
  2739. for(i=1;i<=g_harmonic_num;i++)
  2740. {
  2741. g_ui[PUB_AC_U01].h[i].r = g_ui[PUB_AC_UA1].h[i].r + g_ui[PUB_AC_UB1].h[i].r+ g_ui[PUB_AC_UC1].h[i].r;
  2742. g_ui[PUB_AC_U01].h[i].i = g_ui[PUB_AC_UA1].h[i].i + g_ui[PUB_AC_UB1].h[i].i+ g_ui[PUB_AC_UC1].h[i].i;
  2743. }
  2744. }
  2745. }
  2746. if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_U02)
  2747. {
  2748. {
  2749. int i;
  2750. for(i=1;i<=g_harmonic_num;i++)
  2751. {
  2752. g_ui[PUB_AC_U02].h[i].r = g_ui[PUB_AC_UA2].h[i].r + g_ui[PUB_AC_UB2].h[i].r+ g_ui[PUB_AC_UC2].h[i].r;
  2753. g_ui[PUB_AC_U02].h[i].i = g_ui[PUB_AC_UA2].h[i].i + g_ui[PUB_AC_UB2].h[i].i+ g_ui[PUB_AC_UC2].h[i].i;
  2754. }
  2755. }
  2756. }
  2757. // 电压不平衡计算
  2758. g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE1] += _sw_cal_unbalance(PUB_AC_UA1);
  2759. g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE2] += _sw_cal_unbalance(PUB_AC_UA2);
  2760. // 开关电流
  2761. for(sw=0; sw<g_sw_num; sw++)
  2762. {
  2763. // 合成电流IB
  2764. if(g_sw[sw].ui_flags&UI_FLAGS_MAKE_IB)
  2765. {
  2766. _sw_cal_h_sub2(UI_SW_INDEX(sw,SW_AC_IB),UI_SW_INDEX(sw,SW_AC_I0),UI_SW_INDEX(sw,SW_AC_IA),UI_SW_INDEX(sw,SW_AC_IC));
  2767. }
  2768. // 合成电流IB
  2769. if(g_sw[sw].ui_flags&UI_FLAGS_MAKE_CIB)
  2770. {
  2771. _sw_cal_h_sub2(UI_SW_INDEX(sw,SW_AC_CIB),UI_SW_INDEX(sw,SW_AC_I0),UI_SW_INDEX(sw,SW_AC_CIA),UI_SW_INDEX(sw,SW_AC_CIC));
  2772. }
  2773. // 合成电流I0
  2774. if(g_sw[sw].ui_flags&UI_FLAGS_MAKE_I0)
  2775. {
  2776. _sw_cal_h_add(UI_SW_INDEX(sw,SW_AC_I0),UI_SW_INDEX(sw,SW_AC_IA),UI_SW_INDEX(sw,SW_AC_IB),UI_SW_INDEX(sw,SW_AC_IC));
  2777. }
  2778. // 电流不平衡计算
  2779. g_sw[sw].ac_in_acc[SW_AC_IN_BI_UNBALANCE] += _sw_cal_unbalance(UI_SW_INDEX(sw,SW_AC_IA));
  2780. // 电流不平衡计算
  2781. g_sw[sw].ac_in_acc[SW_AC_IN_CI_UNBALANCE] += _sw_cal_unbalance(UI_SW_INDEX(sw,SW_AC_CIA));
  2782. }
  2783. }
  2784. /******************************************************************************
  2785. 函数名称: _sw_cal_effect
  2786. 函数版本: 01.01
  2787. 创建作者: sunxi
  2788. 创建日期: 2013-08-07
  2789. 函数说明: 测量计算有效值,累加结果。
  2790. 参数说明:
  2791. 返回值:
  2792. 修改记录:
  2793. */
  2794. void _sw_cal_effect(void)
  2795. {
  2796. int i,j;
  2797. float f,re,im,sum;
  2798. for(i=0;i<UI_NUM;i++)
  2799. {
  2800. // 如果索引通道不存在,不需计算
  2801. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO && g_ui[i].ui_base_make == -1)
  2802. {
  2803. continue;
  2804. }
  2805. sum = 0.0;
  2806. for(j=1;j<=g_harmonic_num;j++)
  2807. {
  2808. re = g_ui[i].h[j].r;
  2809. im = g_ui[i].h[j].i;
  2810. f = sqrtf(re*re+im*im);
  2811. f *= g_harmonic_factor[j]; // 谐波系数修正
  2812. sum += f*f;
  2813. #if 0
  2814. if(i>=UI_SW_INDEX(1,SW_AC_IA) && i<=UI_SW_INDEX(1,SW_AC_I0))
  2815. {
  2816. rt_printf("%s[%02d]:e=%f,p=%f.\r\n",g_ui[i].name,j,f*g_ui[i].e_factor,_sw_cal_angle0(re,im));
  2817. }
  2818. #endif
  2819. }
  2820. f = sqrtf(sum);
  2821. g_ui[i].e_acc += f*g_ui[i].e_factor ;
  2822. }
  2823. return ;
  2824. }
  2825. /******************************************************************************
  2826. 函数名称: _sw_cal_angle0
  2827. 函数版本: 01.01
  2828. 创建作者: sunxi
  2829. 创建日期: 2013-08-07
  2830. 函数说明: 计算向量角度
  2831. 参数说明:
  2832. re 向量实部
  2833. im 向量虚部
  2834. 返回值:
  2835. 修改记录:
  2836. */
  2837. #if 1
  2838. float _sw_cal_angle0(float re, float im)
  2839. {
  2840. float p;
  2841. p = atan2f(im,re);
  2842. p = p*180/pi;
  2843. return p;
  2844. }
  2845. #else
  2846. const int Angle_const[7] =
  2847. {
  2848. 0,267,577,1000,1732,3732,57400
  2849. };
  2850. float _sw_cal_angle0(float re, float im)
  2851. {
  2852. float angle_arttg;
  2853. float angle = 0;
  2854. uint8 quad;
  2855. if (re >=0)
  2856. {
  2857. if (im >=0)
  2858. quad = 1;
  2859. else
  2860. {
  2861. quad = 4;
  2862. im = im*(-1);
  2863. }
  2864. }
  2865. else
  2866. {
  2867. re = re*(-1);
  2868. if (im >= 0)
  2869. quad = 2;
  2870. else
  2871. {
  2872. im = im*(-1);
  2873. quad = 3;
  2874. }
  2875. }
  2876. if (re <=2)
  2877. {
  2878. switch (quad)
  2879. {
  2880. case 1:angle = 90;break;
  2881. case 2:angle = 90;break;
  2882. case 3:angle = 270;break;
  2883. case 4:angle = 270;break;
  2884. }
  2885. }
  2886. else
  2887. {
  2888. angle_arttg = (im*1000)/re;
  2889. if (angle_arttg <= Angle_const[1])
  2890. {
  2891. angle = 0 + (angle_arttg-Angle_const[0])*57/(1000+Angle_const[0]*angle_arttg/1000);
  2892. }
  2893. else if (angle_arttg <= Angle_const[2])
  2894. {
  2895. angle = 15 + (angle_arttg-Angle_const[1])*57/(1000+Angle_const[1]*angle_arttg/1000);
  2896. }
  2897. else if (angle_arttg <= Angle_const[3])
  2898. {
  2899. angle = 30 + (angle_arttg-Angle_const[2])*57/(1000+Angle_const[2]*angle_arttg/1000);
  2900. }
  2901. else if (angle_arttg <= Angle_const[4])
  2902. {
  2903. angle = 45 + (angle_arttg-Angle_const[3])*57/(1000+Angle_const[3]*angle_arttg/1000);
  2904. }
  2905. else if (angle_arttg <= Angle_const[5])
  2906. {
  2907. angle = 60 + (angle_arttg-Angle_const[4])*57/(1000+Angle_const[4]*angle_arttg/1000);
  2908. }
  2909. else if (angle_arttg <= Angle_const[6])
  2910. {
  2911. angle = 75 + (angle_arttg-Angle_const[5])*57/(1000+Angle_const[5]*angle_arttg/1000);
  2912. }
  2913. else
  2914. {
  2915. angle = 90;
  2916. }
  2917. switch (quad)
  2918. {
  2919. case 1: angle = angle;break;
  2920. case 2: angle = 180 - angle;break;
  2921. case 3: angle = 180 + angle;break;
  2922. case 4: angle = 360 - angle;break;
  2923. }
  2924. }
  2925. if((re < 5) && (im < 5)) angle = 0;
  2926. return(angle);
  2927. }
  2928. #endif
  2929. /******************************************************************************
  2930. 函数名称: _sw_cal_angle_correct
  2931. 函数版本: 01.01
  2932. 创建作者: sunxi
  2933. 创建日期: 2013-08-07
  2934. 函数说明: 测量计算角度时对角度进行校正,保证累加时不会出现计算错误。
  2935. 参数说明:
  2936. 返回值:
  2937. 修改记录:
  2938. */
  2939. void _sw_cal_angle_correct(qs16 *angle,int *mark)
  2940. {
  2941. if(*angle > ANGF180)
  2942. {
  2943. *angle -= ANG360;
  2944. }
  2945. if(*angle < ANGN180)
  2946. {
  2947. *angle += ANG360;
  2948. }
  2949. if(*mark == 0)
  2950. {
  2951. if(abs(*angle)< 90*Q16_BASE)
  2952. {
  2953. *mark = 1;
  2954. }
  2955. else
  2956. {
  2957. *mark = -1;
  2958. }
  2959. }
  2960. if(*mark == -1)
  2961. {
  2962. if(*angle >= 0)
  2963. {
  2964. *angle = 180*Q16_BASE - *angle;
  2965. }
  2966. else
  2967. {
  2968. *angle = (-180)*Q16_BASE - *angle;
  2969. }
  2970. }
  2971. }
  2972. /******************************************************************************
  2973. 函数名称: _sw_cal_angle
  2974. 函数版本: 01.01
  2975. 创建作者: sunxi
  2976. 创建日期: 2013-08-07
  2977. 函数说明: 测量计算角度,每次调用累加计算值。
  2978. 参数说明:
  2979. 返回值:
  2980. 修改记录:
  2981. */
  2982. void _sw_cal_angle(void)
  2983. {
  2984. int i;
  2985. qs16 qs;
  2986. float angle,angle0;
  2987. // 检查是否有基准通道
  2988. if(g_ui_angle0 == -1)
  2989. {
  2990. return;
  2991. }
  2992. // 计算基准通道的角度
  2993. angle0 = _sw_cal_angle0(g_ui[g_ui_angle0].h[1].r,g_ui[g_ui_angle0].h[1].i);
  2994. // angle0 += g_ui[g_ui_angle0].p_factor;
  2995. // 计算相对角度
  2996. for(i=0;i<UI_NUM;i++)
  2997. {
  2998. // 如果索引通道不存在,不需计算
  2999. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO && g_ui[i].ui_base_make == -1)
  3000. {
  3001. continue;
  3002. }
  3003. angle = _sw_cal_angle0(g_ui[i].h[1].r,g_ui[i].h[1].i);
  3004. // angle += g_ui[i].p_factor;
  3005. angle -= angle0;
  3006. qs = rt_round(angle*Q16_BASE);
  3007. _sw_cal_angle_correct(&qs,&g_ui[i].p_mark);
  3008. g_ui[i].p_acc += qs;
  3009. }
  3010. return ;
  3011. }
  3012. /******************************************************************************
  3013. 函数名称: _sw_p2
  3014. 函数版本: 01.01
  3015. 创建作者: sunxi
  3016. 创建日期: 2013-08-07
  3017. 函数说明: 根据电压电流向量计算p值
  3018. 参数说明:
  3019. ur 电压实部
  3020. ui 电压虚部
  3021. ir 电流实部
  3022. ii 电流虚部
  3023. k1 电压系数
  3024. k2 电流系数
  3025. 返回值: p值
  3026. 修改记录:
  3027. */
  3028. float _sw_p2( float Ur, float Ui,float Ir, float Ii, float k1, float k2)
  3029. {
  3030. float p ;
  3031. p = Ur*Ir + Ui*Ii;
  3032. p = p * k1 *k2;
  3033. return p;
  3034. }
  3035. /******************************************************************************
  3036. 函数名称: _sw_q2
  3037. 函数版本: 01.01
  3038. 创建作者: sunxi
  3039. 创建日期: 2013-08-07
  3040. 函数说明: 根据电压电流向量计算q值
  3041. 参数说明:
  3042. ur 电压实部
  3043. ui 电压虚部
  3044. ir 电流实部
  3045. ii 电流虚部
  3046. k1 电压系数
  3047. k2 电流系数
  3048. 返回值: q值
  3049. 修改记录:
  3050. */
  3051. float _sw_q2( float Ur, float Ui,float Ir,float Ii,float k1, float k2)
  3052. {
  3053. float q ;
  3054. q =Ui*Ir - Ur*Ii;
  3055. q = q * k1* k2;
  3056. return q;
  3057. }
  3058. /******************************************************************************
  3059. 函数名称: _sw_cal_pq_3m
  3060. 函数版本: 01.01
  3061. 创建作者: sunxi
  3062. 创建日期: 2013-08-07
  3063. 函数说明: 3表法计算一个开关的pq,每次调用累加计算值。
  3064. 参数说明:
  3065. sw 开关序号
  3066. 返回值:
  3067. 修改记录:
  3068. */
  3069. void _sw_cal_pq_3m(u32 sw)
  3070. {
  3071. u32 i,j,U,I,baseI;
  3072. float p,q,pz,qz;
  3073. if(g_ui[UI_SW_INDEX(sw,SW_AC_CIA)].chn_index != CFG_ADC_CHANNEL_ZERO)baseI=SW_AC_CIA;
  3074. else baseI=0;
  3075. U = pRunSet->tSwSet[sw].bTT_Power_v2 ? PUB_AC_UA2 : PUB_AC_UA1;
  3076. for(j=0; j<3; j++)
  3077. {
  3078. I = UI_SW_INDEX(sw,j+baseI);
  3079. p = 0;
  3080. q = 0;
  3081. pz=0;
  3082. qz=0;
  3083. for(i=1; i<=g_harmonic_num;i++)
  3084. {
  3085. p += _sw_p2(g_ui[U].h[i].r,g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ;
  3086. q += _sw_q2(g_ui[U].h[i].r,g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ;
  3087. }
  3088. pz=p*(1 + g_ui[I].pq_factor[0]) - q*g_ui[I].pq_factor[1];
  3089. qz=q*(1 + g_ui[I].pq_factor[0]) + p*g_ui[I].pq_factor[1];
  3090. g_sw[sw].ac_in_acc[SW_AC_IN_P] += pz;
  3091. g_sw[sw].ac_in_acc[SW_AC_IN_Q] += qz;
  3092. if(j==0)
  3093. {
  3094. g_sw[sw].ac_in_acc[SW_AC_IN_Pa] += pz;
  3095. g_sw[sw].ac_in_acc[SW_AC_IN_Qa] += qz;
  3096. }
  3097. else if(j==1)
  3098. {
  3099. g_sw[sw].ac_in_acc[SW_AC_IN_Pb] += pz;
  3100. g_sw[sw].ac_in_acc[SW_AC_IN_Qb] += qz;
  3101. }
  3102. else if(j==2)
  3103. {
  3104. g_sw[sw].ac_in_acc[SW_AC_IN_Pc] += pz;
  3105. g_sw[sw].ac_in_acc[SW_AC_IN_Qc] += qz;
  3106. }
  3107. U++;
  3108. }
  3109. return;
  3110. }
  3111. /******************************************************************************
  3112. 函数名称: _sw_cal_pq_2m
  3113. 函数版本: 01.01
  3114. 创建作者: sunxi
  3115. 创建日期: 2013-08-07
  3116. 函数说明: 2表法计算一个开关的pq,每次调用累加计算值。
  3117. 参数说明:
  3118. sw 开关序号
  3119. 返回值:
  3120. 修改记录:
  3121. */
  3122. void _sw_cal_pq_2m(u32 sw)
  3123. {
  3124. u32 i,U,I,baseI;
  3125. float p,q,pz,qz;
  3126. // IA
  3127. U = PUB_AC_UAB1;
  3128. if(g_ui[UI_SW_INDEX(sw,SW_AC_CIA)].chn_index != CFG_ADC_CHANNEL_ZERO)baseI=SW_AC_CIA;
  3129. else baseI=0;
  3130. if(pRunSet->tSwSet[sw].bTT_Power_v2)
  3131. {
  3132. U = PUB_AC_UAB2;
  3133. }
  3134. else if ((g_ui[PUB_AC_UAB1].chn_index == CFG_ADC_CHANNEL_ZERO)
  3135. && (g_ui[PUB_AC_UAB2].chn_index != CFG_ADC_CHANNEL_ZERO))
  3136. {
  3137. U = PUB_AC_UAB2;
  3138. }
  3139. I = UI_SW_INDEX(sw,baseI);
  3140. p = 0;
  3141. q = 0;
  3142. for(i=1; i<=g_harmonic_num;i++)
  3143. {
  3144. p += _sw_p2(g_ui[U].h[i].r,g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ;
  3145. q += _sw_q2(g_ui[U].h[i].r,g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ;
  3146. }
  3147. pz=p*(1 + g_ui[I].pq_factor[0]) - q*g_ui[I].pq_factor[1];
  3148. qz=q*(1 + g_ui[I].pq_factor[0]) + p*g_ui[I].pq_factor[1];;
  3149. g_sw[sw].ac_in_acc[SW_AC_IN_P] += pz;
  3150. g_sw[sw].ac_in_acc[SW_AC_IN_Q] += qz;
  3151. g_sw[sw].ac_in_acc[SW_AC_IN_Pa] += pz;
  3152. g_sw[sw].ac_in_acc[SW_AC_IN_Qa] += qz;
  3153. // IC
  3154. U = PUB_AC_UBC1;
  3155. if(pRunSet->tSwSet[sw].bTT_Power_v2)
  3156. {
  3157. U = PUB_AC_UBC2;
  3158. }
  3159. else if ((g_ui[PUB_AC_UBC1].chn_index == CFG_ADC_CHANNEL_ZERO)
  3160. && (g_ui[PUB_AC_UBC2].chn_index != CFG_ADC_CHANNEL_ZERO))
  3161. {
  3162. U = PUB_AC_UBC2;
  3163. }
  3164. I = UI_SW_INDEX(sw,2+baseI);
  3165. p = 0;
  3166. q = 0;
  3167. for(i=1; i<=g_harmonic_num;i++)
  3168. {
  3169. p += _sw_p2(-g_ui[U].h[i].r,-g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ;
  3170. q += _sw_q2(-g_ui[U].h[i].r,-g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ;
  3171. }
  3172. pz=p*(1 + g_ui[I].pq_factor[0]) - q*g_ui[I].pq_factor[1];
  3173. qz=q*(1 + g_ui[I].pq_factor[0]) + p*g_ui[I].pq_factor[1];;
  3174. g_sw[sw].ac_in_acc[SW_AC_IN_P] += pz;
  3175. g_sw[sw].ac_in_acc[SW_AC_IN_Q] += qz;
  3176. g_sw[sw].ac_in_acc[SW_AC_IN_Pc] += pz;
  3177. g_sw[sw].ac_in_acc[SW_AC_IN_Qc] += qz;
  3178. g_sw[sw].ac_in_acc[SW_AC_IN_Pb] = 0;
  3179. g_sw[sw].ac_in_acc[SW_AC_IN_Qb] = 0;
  3180. return;
  3181. }
  3182. /******************************************************************************
  3183. 函数名称: _sw_cal_pq
  3184. 函数版本: 01.01
  3185. 创建作者: sunxi
  3186. 创建日期: 2013-08-07
  3187. 函数说明: 测量计算pq,区分3表法和2表法,每次调用累加计算值。
  3188. 参数说明:
  3189. 返回值:
  3190. 修改记录:
  3191. */
  3192. void _sw_cal_pq(void)
  3193. {
  3194. u32 sw,U;
  3195. for(sw=0; sw<g_sw_num; sw++)
  3196. {
  3197. bool b3U,b3I=false;
  3198. U = pRunSet->tSwSet[sw].bTT_Power_v2 ? PUB_AC_UA2 : PUB_AC_UA1;
  3199. b3U= (g_ui[U+0].chn_index != CFG_ADC_CHANNEL_ZERO
  3200. && g_ui[U+1].chn_index != CFG_ADC_CHANNEL_ZERO
  3201. && g_ui[U+2].chn_index != CFG_ADC_CHANNEL_ZERO);
  3202. b3I|= (g_ui[UI_SW_INDEX(sw,SW_AC_IA)].chn_index != CFG_ADC_CHANNEL_ZERO
  3203. && g_ui[UI_SW_INDEX(sw,SW_AC_IB)].chn_index != CFG_ADC_CHANNEL_ZERO
  3204. && g_ui[UI_SW_INDEX(sw,SW_AC_IC)].chn_index != CFG_ADC_CHANNEL_ZERO
  3205. &&g_ui[UI_SW_INDEX(sw,SW_AC_CIA)].chn_index == CFG_ADC_CHANNEL_ZERO); //测量电流未配置
  3206. b3I|= (g_ui[UI_SW_INDEX(sw,SW_AC_CIA)].chn_index != CFG_ADC_CHANNEL_ZERO
  3207. && g_ui[UI_SW_INDEX(sw,SW_AC_CIB)].chn_index != CFG_ADC_CHANNEL_ZERO
  3208. && g_ui[UI_SW_INDEX(sw,SW_AC_CIC)].chn_index != CFG_ADC_CHANNEL_ZERO);
  3209. if(b3U&&b3I) //有三相电压,且有三相测量电流或无AC 测量电流有三相保护电流,用三表法
  3210. {
  3211. _sw_cal_pq_3m(sw);
  3212. }
  3213. else
  3214. {
  3215. _sw_cal_pq_2m(sw);
  3216. }
  3217. }
  3218. }
  3219. /******************************************************************************
  3220. 函数名称: _sw_cal_mea
  3221. 函数版本: 01.01
  3222. 创建作者: sunxi
  3223. 创建日期: 2013-08-07
  3224. 函数说明: 测量计算,每次调用累加计算值
  3225. 参数说明:
  3226. 返回值:
  3227. 修改记录:
  3228. */
  3229. int _sw_cal_mea(void)
  3230. {
  3231. static int g_cal_step = 0;
  3232. uint64_t us0;
  3233. us0 = bsp_ustimer_get_origin();
  3234. if(g_cal_step == 0)
  3235. {
  3236. // 得到采样点
  3237. _sw_get_dots();
  3238. // fft
  3239. _sw_cal_fft();
  3240. _sw_cal_ri_correct();
  3241. g_cal_step = 1;
  3242. rt_stat_other_in(3,bsp_ustimer_get_duration(us0)/USTIMER_US);
  3243. }
  3244. else
  3245. {
  3246. // 得到合成通道的向量值
  3247. _sw_cal_make();
  3248. // 计算有效值
  3249. _sw_cal_effect();
  3250. // 计算角度
  3251. _sw_cal_angle();
  3252. // 计算PQ
  3253. _sw_cal_pq();
  3254. g_cal_step = 0;
  3255. rt_stat_other_in(4,bsp_ustimer_get_duration(us0)/USTIMER_US);
  3256. }
  3257. return g_cal_step;
  3258. }
  3259. #ifdef FUN_JDXX
  3260. /*********************************************************
  3261. 函数名称:isTakeIsVal
  3262. 函数版本:v1.0
  3263. 作 者: Xzy
  3264. 日 期:2021.10.30
  3265. 函数说明:是否取Is通道的值
  3266. 参数说明:sw:开关号
  3267. I_chn:常规通道号
  3268. Is_chn:小值范围通道号
  3269. 返 回 值:true:取Is的值 false:不取Is的值
  3270. **********************************************************/
  3271. static bool isTakeIsVal(int sw,int I_chn,int Is_chn)
  3272. {
  3273. float I_val,Is_val,err_val;
  3274. if(g_ui[UI_SW_INDEX(sw,I_chn)].chn_index == CFG_ADC_CHANNEL_ZERO || g_ui[UI_SW_INDEX(sw,Is_chn)].chn_index == CFG_ADC_CHANNEL_ZERO){
  3275. return false;
  3276. }
  3277. I_val = (float)g_sw[sw].ac_in[I_chn]/65536;
  3278. Is_val = (float)g_sw[sw].ac_in[Is_chn]/65536;
  3279. if(Is_val == 0)
  3280. err_val = 1;
  3281. else
  3282. err_val = ((float)abs(I_val*1000-Is_val*1000))/(Is_val*1000);
  3283. if(Is_val > 0.5 || err_val >= 0.05)
  3284. return false;
  3285. return true;
  3286. }
  3287. #endif
  3288. /******************************************************************************
  3289. 函数名称: _sw_cal_average
  3290. 函数版本: 01.01
  3291. 创建作者: sunxi
  3292. 创建日期: 2013-08-07
  3293. 函数说明: 测量计算平均值
  3294. 参数说明:
  3295. cal_num 平均的次数
  3296. 返回值:
  3297. 修改记录:
  3298. */
  3299. void _sw_cal_average(int cal_num)
  3300. {
  3301. s32 i,sw;
  3302. s32 temp;
  3303. // 平均幅值和角度
  3304. for(i=0;i<UI_NUM;i++)
  3305. {
  3306. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO && g_ui[i].ui_base_make == -1)
  3307. {
  3308. continue;
  3309. }
  3310. // 幅值
  3311. g_ui[i].e = rt_round(g_ui[i].e_acc/cal_num*Q16_BASE);
  3312. rt_stat_in(&g_ui[i].e_stat,g_ui[i].e);
  3313. if(i<PUB_AC_NUM)
  3314. {
  3315. g_sw_pub.ac_in[i] = g_ui[i].e;
  3316. }
  3317. else
  3318. {
  3319. g_sw[(i-PUB_AC_NUM)/SW_AC_NUM].ac_in[(i-PUB_AC_NUM)%SW_AC_NUM] = g_ui[i].e;
  3320. }
  3321. // 角度
  3322. temp = (g_ui[i].p_acc + (cal_num/2))/cal_num;
  3323. if(g_ui[i].p_mark == -1)
  3324. {
  3325. if(temp >= 0)
  3326. {
  3327. temp = 180*Q16_BASE - temp;
  3328. }
  3329. else
  3330. {
  3331. temp = (-180)*Q16_BASE - temp;
  3332. }
  3333. }
  3334. g_ui[i].p = temp;
  3335. rt_stat_in(&g_ui[i].p_stat,g_ui[i].p);
  3336. g_ui[i].e_acc = 0;
  3337. g_ui[i].p_acc = 0;
  3338. g_ui[i].p_mark = 0;
  3339. }
  3340. #ifdef FUN_JDXX
  3341. // 电流值小于0.5A,取Is的,因为在这个范围I0s准确度高
  3342. for(sw=0;sw<g_sw_num;sw++){
  3343. if(isTakeIsVal(sw,SW_AC_I0,SW_AC_I0s)){
  3344. g_sw[sw].ac_in[SW_AC_I0] = g_sw[sw].ac_in[SW_AC_I0s];
  3345. }
  3346. }
  3347. #endif
  3348. // 角度清除
  3349. for(i=0;i<UI_NUM;i++)
  3350. {
  3351. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO && g_ui[i].ui_base_make == -1)
  3352. {
  3353. continue;
  3354. }
  3355. #ifdef MIN_SIGNAL_SAMPLE
  3356. if(g_ui_angle0 == -1 || g_ui[g_ui_angle0].e < 0.1*Q16_BASE)
  3357. #else
  3358. if(g_ui_angle0 == -1 || g_ui[g_ui_angle0].e < 10*Q16_BASE)
  3359. #endif
  3360. {
  3361. g_ui[i].p = ANGEL_INVALID;
  3362. }
  3363. }
  3364. // 平均开关内部测量值:P,Q,COS,电流不平衡度
  3365. for(sw=0;sw<g_sw_num;sw++)
  3366. {
  3367. #ifdef FUN_YC_POWER_S
  3368. float p,q;
  3369. p = g_sw[sw].ac_in_acc[SW_AC_IN_P]/cal_num;
  3370. q = g_sw[sw].ac_in_acc[SW_AC_IN_Q]/cal_num;
  3371. g_sw[sw].ac_in[SW_AC_IN_S] = sqrtf(p*p+q*q)*Q16_BASE;
  3372. #endif
  3373. g_sw[sw].ac_in[SW_AC_IN_P] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_P]/cal_num*Q16_BASE);
  3374. g_sw[sw].ac_in[SW_AC_IN_Q] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_Q]/cal_num*Q16_BASE);
  3375. g_sw[sw].ac_in[SW_AC_IN_Pa] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_Pa]/cal_num*Q16_BASE);
  3376. g_sw[sw].ac_in[SW_AC_IN_Pb] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_Pb]/cal_num*Q16_BASE);
  3377. g_sw[sw].ac_in[SW_AC_IN_Pc] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_Pc]/cal_num*Q16_BASE);
  3378. g_sw[sw].ac_in[SW_AC_IN_Qa] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_Qa]/cal_num*Q16_BASE);
  3379. g_sw[sw].ac_in[SW_AC_IN_Qb] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_Qb]/cal_num*Q16_BASE);
  3380. g_sw[sw].ac_in[SW_AC_IN_Qc] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_Qc]/cal_num*Q16_BASE);
  3381. // 如果电流反向,功率反向
  3382. if(pRunSet->tSwSet[sw].bTT_Current_Inv)
  3383. {
  3384. g_sw[sw].ac_in[SW_AC_IN_P] = -g_sw[sw].ac_in[SW_AC_IN_P];
  3385. g_sw[sw].ac_in[SW_AC_IN_Q] = -g_sw[sw].ac_in[SW_AC_IN_Q];
  3386. g_sw[sw].ac_in[SW_AC_IN_Pa] = -g_sw[sw].ac_in[SW_AC_IN_Pa];
  3387. g_sw[sw].ac_in[SW_AC_IN_Pb] = -g_sw[sw].ac_in[SW_AC_IN_Pb];
  3388. g_sw[sw].ac_in[SW_AC_IN_Pc] = -g_sw[sw].ac_in[SW_AC_IN_Pc];
  3389. g_sw[sw].ac_in[SW_AC_IN_Qa] = -g_sw[sw].ac_in[SW_AC_IN_Qa];
  3390. g_sw[sw].ac_in[SW_AC_IN_Qb] = -g_sw[sw].ac_in[SW_AC_IN_Qb];
  3391. g_sw[sw].ac_in[SW_AC_IN_Qc] = -g_sw[sw].ac_in[SW_AC_IN_Qc];
  3392. }
  3393. if( g_ui[UI_SW_INDEX(sw,SW_AC_IA)].e > g_unit[g_sw_ac_desc[SW_AC_IA].unit].zero
  3394. || g_ui[UI_SW_INDEX(sw,SW_AC_IB)].e > g_unit[g_sw_ac_desc[SW_AC_IB].unit].zero
  3395. || g_ui[UI_SW_INDEX(sw,SW_AC_IC)].e > g_unit[g_sw_ac_desc[SW_AC_IC].unit].zero)
  3396. {
  3397. g_sw[sw].ac_in[SW_AC_IN_BI_UNBALANCE] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_BI_UNBALANCE]/cal_num*Q16_BASE);
  3398. }
  3399. else
  3400. {
  3401. g_sw[sw].ac_in[SW_AC_IN_BI_UNBALANCE] = 0;
  3402. }
  3403. if( g_ui[UI_SW_INDEX(sw,SW_AC_CIA)].e > g_unit[g_sw_ac_desc[SW_AC_CIA].unit].zero
  3404. || g_ui[UI_SW_INDEX(sw,SW_AC_CIB)].e > g_unit[g_sw_ac_desc[SW_AC_CIB].unit].zero
  3405. || g_ui[UI_SW_INDEX(sw,SW_AC_CIC)].e > g_unit[g_sw_ac_desc[SW_AC_CIC].unit].zero)
  3406. {
  3407. g_sw[sw].ac_in[SW_AC_IN_CI_UNBALANCE] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_CI_UNBALANCE]/cal_num*Q16_BASE);
  3408. }
  3409. else
  3410. {
  3411. g_sw[sw].ac_in[SW_AC_IN_CI_UNBALANCE] = 0;
  3412. }
  3413. // TODO:
  3414. // 功率因数,I1/I*COSφ1=COSφ ,I1基波电流有效值,I总电流有效值,COSφ1基波功率因数,COSφ含谐波电网的实际功率因数
  3415. if(_AbsL(g_sw[sw].ac_in[SW_AC_IN_Q]) > g_unit[g_sw_ac_desc[SW_AC_IN_Q].unit].zero)
  3416. {
  3417. g_sw[sw].ac_in[SW_AC_IN_COS] =_CosPQ((g_sw[sw].ac_in[SW_AC_IN_P]>>14),(g_sw[sw].ac_in[SW_AC_IN_Q]>>14));
  3418. }
  3419. else if(g_sw[sw].ac_in[SW_AC_IN_P]>=Q16_BASE)
  3420. {
  3421. g_sw[sw].ac_in[SW_AC_IN_COS]=Q16_BASE;
  3422. }
  3423. else if(g_sw[sw].ac_in[SW_AC_IN_P]<=-Q16_BASE)
  3424. {
  3425. g_sw[sw].ac_in[SW_AC_IN_COS]=-Q16_BASE;
  3426. }
  3427. else
  3428. {
  3429. g_sw[sw].ac_in[SW_AC_IN_COS]=0;
  3430. }
  3431. g_sw[sw].ac_in_acc[SW_AC_IN_P] = 0;
  3432. g_sw[sw].ac_in_acc[SW_AC_IN_Q] = 0;
  3433. g_sw[sw].ac_in_acc[SW_AC_IN_Pa] = 0;
  3434. g_sw[sw].ac_in_acc[SW_AC_IN_Pb] = 0;
  3435. g_sw[sw].ac_in_acc[SW_AC_IN_Pc] = 0;
  3436. g_sw[sw].ac_in_acc[SW_AC_IN_Qa] = 0;
  3437. g_sw[sw].ac_in_acc[SW_AC_IN_Qb] = 0;
  3438. g_sw[sw].ac_in_acc[SW_AC_IN_Qc] = 0;
  3439. g_sw[sw].ac_in_acc[SW_AC_IN_BI_UNBALANCE] = 0;
  3440. #if 0
  3441. //电子电流互感器小信号电压值
  3442. for(i=0;i<4;i++)
  3443. {
  3444. s16 cfg,scale;
  3445. cfg = g_sw[sw].ac_cfg_index[SW_AC_IA+i];
  3446. if(cfg != INDEX_INVALLID)
  3447. {
  3448. scale = equ_get_ac_scale(g_equ_config_ac[cfg].slot,g_equ_config_ac[cfg].index);
  3449. if(scale == EQU_SCALE_ECT_1V_1A || scale == EQU_SCALE_ECT_0V2_1A)
  3450. {
  3451. g_sw[sw].ac_in[SW_AC_IN_IA_ECT+i] = g_ui[UI_SW_INDEX(sw,SW_AC_IA+i)].e*g_e_k_ECVT[scale];
  3452. }
  3453. }
  3454. }
  3455. #endif
  3456. }
  3457. // 其它测量值
  3458. // 频率
  3459. g_sw_pub.ac_in[PUB_AC_IN_F1] = (qs16)(freq_get(0)*Q16_BASE); //第1路频率
  3460. g_sw_pub.ac_in[PUB_AC_IN_F2] = (qs16)(freq_get(1)*Q16_BASE); //第2路频率
  3461. // 直流、温度
  3462. {
  3463. float factor,t,f0,f1;
  3464. #ifdef TMP_CHIP_AHT20
  3465. float h=0.0;
  3466. #endif
  3467. #if defined TMP_CHIP_DS18B20
  3468. t = ds18b20_get_temp();
  3469. #elif defined TMP_CHIP_GX21M15
  3470. t = gx21m15_get_temp();
  3471. #elif defined TMP_CHIP_AHT20
  3472. t = aht20_get_temp();
  3473. h = aht20_get_humi();
  3474. #endif
  3475. #ifdef DC_TEST_ONE
  3476. f0 = (dc_get(0)-g_dcfactor[0].f_dcL)*g_dcfactor[0].f_dc+dc_adjust[0];
  3477. f1 = 0;
  3478. #else
  3479. f0 = (dc_get(0)-g_dcfactor[0].f_dcL)*g_dcfactor[0].f_dc+dc_adjust[0];
  3480. f1 = (dc_get(1)-g_dcfactor[1].f_dcL)*g_dcfactor[1].f_dc+dc_adjust[0];
  3481. #endif
  3482. factor = 1.0;
  3483. if(t > -80.0 && t < 125.0)
  3484. {
  3485. factor += (t - g_dc_temp)* pRunSet->f_temp_factor_dc/1000000;
  3486. }
  3487. f0 /= factor;
  3488. f1 /= factor;
  3489. #ifdef DC_NUM_SET
  3490. if(pRunSet->dDc_num==1)
  3491. f1=0;//只有一个通道,将第二个直流通道强制=0
  3492. #endif
  3493. #ifdef CPU_FUXI
  3494. if(f0 < tRunPara.wDC_ZERO)
  3495. {
  3496. f0 = 0.0;
  3497. }
  3498. if(f1 < tRunPara.wDC_ZERO)
  3499. {
  3500. f1 = 0.0;
  3501. }
  3502. #endif
  3503. #ifdef TMP_CHIP_AHT20
  3504. g_sw_pub.ac_in[PUB_AC_IN_HUMI] = (qs16)(h*Q16_BASE);
  3505. #endif
  3506. g_sw_pub.ac_in[PUB_AC_IN_TEMP] = (qs16)(t*Q16_BASE);
  3507. g_sw_pub.ac_in[PUB_AC_IN_UZ1] = (qs16)(f0*Q16_BASE);
  3508. g_sw_pub.ac_in[PUB_AC_IN_UZ2] = (qs16)(f1*Q16_BASE);
  3509. if(g_sw_pub.ac_in[PUB_AC_IN_UZ1]<0)
  3510. g_sw_pub.ac_in[PUB_AC_IN_UZ1]=0;
  3511. if(g_sw_pub.ac_in[PUB_AC_IN_UZ2]<0)
  3512. g_sw_pub.ac_in[PUB_AC_IN_UZ2]=0;
  3513. }
  3514. // 电压不平衡度
  3515. if( g_ui[PUB_AC_UA1].e > g_unit[g_pub_ac_desc[PUB_AC_UA1].unit].zero
  3516. || g_ui[PUB_AC_UB1].e > g_unit[g_pub_ac_desc[PUB_AC_UB1].unit].zero
  3517. || g_ui[PUB_AC_UC1].e > g_unit[g_pub_ac_desc[PUB_AC_UC1].unit].zero)
  3518. {
  3519. g_sw_pub.ac_in[PUB_AC_IN_V_UNBALANCE1] = rt_round(g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE1]/cal_num*Q16_BASE);
  3520. }
  3521. else
  3522. {
  3523. g_sw_pub.ac_in[PUB_AC_IN_V_UNBALANCE1] = 0;
  3524. }
  3525. if( g_ui[PUB_AC_UA2].e > g_unit[g_pub_ac_desc[PUB_AC_UA2].unit].zero
  3526. || g_ui[PUB_AC_UB2].e > g_unit[g_pub_ac_desc[PUB_AC_UB2].unit].zero
  3527. || g_ui[PUB_AC_UC2].e > g_unit[g_pub_ac_desc[PUB_AC_UC2].unit].zero)
  3528. {
  3529. g_sw_pub.ac_in[PUB_AC_IN_V_UNBALANCE2] = rt_round(g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE2]/cal_num*Q16_BASE);
  3530. }
  3531. else
  3532. {
  3533. g_sw_pub.ac_in[PUB_AC_IN_V_UNBALANCE2] = 0;
  3534. }
  3535. g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE1] = 0;
  3536. g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE2] = 0;
  3537. #ifdef GD_AREA_YUNAN_LP // 云南涞浦
  3538. g_sw_pub.ac_in[PUB_AC_IN_DLTUAB] =_AbsL(g_ui[PUB_AC_UAB1].e -g_ui[PUB_AC_UAB2].e);
  3539. g_sw_pub.ac_in[PUB_AC_IN_DLTUBC] =_AbsL(g_ui[PUB_AC_UBC1].e -g_ui[PUB_AC_UBC2].e);
  3540. g_sw_pub.ac_in[PUB_AC_IN_DLTUCA] =_AbsL(g_ui[PUB_AC_UCA1].e -g_ui[PUB_AC_UCA2].e);
  3541. if(g_ui[PUB_AC_UAB1].e>10*Q16_BASE&&g_ui[PUB_AC_UAB2].e>10*Q16_BASE)
  3542. {
  3543. g_sw_pub.ac_in[PUB_AC_IN_ARGUAB] =_AbsL(CalcAngSub(g_ui[PUB_AC_UAB1].ri.r,g_ui[PUB_AC_UAB1].ri.i,g_ui[PUB_AC_UAB2].ri.r,g_ui[PUB_AC_UAB2].ri.i));
  3544. }
  3545. else
  3546. {
  3547. g_sw_pub.ac_in[PUB_AC_IN_ARGUAB]=0;
  3548. }
  3549. if(g_ui[PUB_AC_UBC1].e>10*Q16_BASE&&g_ui[PUB_AC_UBC2].e>10*Q16_BASE)
  3550. {
  3551. g_sw_pub.ac_in[PUB_AC_IN_ARGUBC] =_AbsL(CalcAngSub(g_ui[PUB_AC_UBC1].ri.r,g_ui[PUB_AC_UBC1].ri.i,g_ui[PUB_AC_UBC2].ri.r,g_ui[PUB_AC_UBC2].ri.i));
  3552. }
  3553. else
  3554. {
  3555. g_sw_pub.ac_in[PUB_AC_IN_ARGUBC]=0;
  3556. }
  3557. if(g_ui[PUB_AC_UCA1].e>10*Q16_BASE&&g_ui[PUB_AC_UCA2].e>10*Q16_BASE)
  3558. {
  3559. g_sw_pub.ac_in[PUB_AC_IN_ARGUCA] =_AbsL(CalcAngSub(g_ui[PUB_AC_UCA1].ri.r,g_ui[PUB_AC_UCA1].ri.i,g_ui[PUB_AC_UCA2].ri.r,g_ui[PUB_AC_UCA2].ri.i));
  3560. }
  3561. else
  3562. {
  3563. g_sw_pub.ac_in[PUB_AC_IN_ARGUCA]=0;
  3564. }
  3565. #endif
  3566. //版本号0x00010104
  3567. {
  3568. g_sw_pub.ac_in[PUB_AC_IN_VER] =((BYTE)((VER_NUM>>0)&0x0f)
  3569. +((BYTE)(VER_NUM>>4)&0x0f)*10
  3570. +((BYTE)(VER_NUM>>8)&0x0f)*100
  3571. +((BYTE)(VER_NUM>>12)&0x0f)*1000
  3572. +((BYTE)(VER_NUM>>16)&0x0f)*10000)*Q16_BASE;
  3573. }
  3574. #if 0
  3575. //电子电压互感器小信号电压值
  3576. for(i=0;i<8;i++)
  3577. {
  3578. u8 evt[8]={PUB_AC_UA1,PUB_AC_UB1,PUB_AC_UC1,PUB_AC_U01,PUB_AC_UA2,PUB_AC_UB2,PUB_AC_UC2,PUB_AC_U02};
  3579. s16 cfg,scale;
  3580. cfg = g_sw_pub.ac_cfg_index[evt[i]];
  3581. if(cfg != INDEX_INVALLID)
  3582. {
  3583. scale = equ_get_ac_scale(g_equ_config_ac[cfg].slot,g_equ_config_ac[cfg].index);
  3584. if(scale == EQU_SCALE_EVT_3V25_100V || scale == EQU_SCALE_EVT_6V50_100V)
  3585. {
  3586. g_sw_pub.ac_in[PUB_AC_IN_UA1_EVT+i] = g_ui[evt[i]].e*g_e_k_ECVT[scale];
  3587. }
  3588. }
  3589. }
  3590. #endif
  3591. }
  3592. void _sw_cal_zl(void)
  3593. {
  3594. // 直流、温度
  3595. {
  3596. float factor,t,f0,f1;
  3597. #if defined TMP_CHIP_DS18B20
  3598. t = ds18b20_get_temp();
  3599. #elif defined TMP_CHIP_GX21M15
  3600. t = gx21m15_get_temp();
  3601. #elif defined TMP_CHIP_AHT20
  3602. t = aht20_get_temp();
  3603. #endif
  3604. f0 = (dc_get(0)-g_dcfactor[0].f_dcL)*g_dcfactor[0].f_dc+dc_adjust[0];
  3605. f1 = (dc_get(1)-g_dcfactor[1].f_dcL)*g_dcfactor[1].f_dc+dc_adjust[0];
  3606. factor = 1.0;
  3607. if(t > -80.0 && t < 125.0)
  3608. {
  3609. factor += (t - g_dc_temp)* pRunSet->f_temp_factor_dc/1000000;
  3610. }
  3611. f0 /= factor;
  3612. f1 /= factor;
  3613. g_sw_pub.ac_in[PUB_AC_IN_TEMP] = (qs16)(t*Q16_BASE);
  3614. g_sw_pub.ac_in[PUB_AC_IN_UZ1] = (qs16)(f0*Q16_BASE);
  3615. g_sw_pub.ac_in[PUB_AC_IN_UZ2] = (qs16)(f1*Q16_BASE);
  3616. }
  3617. }
  3618. /******************************************************************************
  3619. 函数名称: _sw_auto_adjust_pq
  3620. 函数版本: 01.01
  3621. 创建作者: sunxi
  3622. 创建日期: 2013-08-07
  3623. 函数说明: 自动校正PQ,累加校正系数
  3624. 参数说明:
  3625. 返回值:
  3626. 修改记录:
  3627. */
  3628. void _sw_auto_adjust_pq(void)
  3629. {
  3630. float RateP;
  3631. float RateQ;
  3632. u32 sw,i,j,U,I;
  3633. float pp[3],qq[3];
  3634. RateP = (float)100*5*0.5; //U*I*COS60
  3635. RateQ = (float)100*5*0.866; //U*I*SIN60
  3636. for(sw=0; sw<g_sw_num; sw++)
  3637. {
  3638. for(j=0; j<3; j++)
  3639. {
  3640. U = PUB_AC_UA1+j;
  3641. I = UI_SW_INDEX(sw,j);
  3642. pp[j] = 0;
  3643. qq[j] = 0;
  3644. for(i=1; i<=g_harmonic_num;i++)
  3645. {
  3646. pp[j] += _sw_p2(g_ui[U].h[i].r,g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ;
  3647. qq[j] += _sw_q2(g_ui[U].h[i].r,g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ;
  3648. }
  3649. g_pq_factor[sw][j].pq[0] += (RateQ*qq[j] + RateP*pp[j])/(pp[j]*pp[j] + qq[j]*qq[j]) - 1;
  3650. g_pq_factor[sw][j].pq[1] += (RateQ*pp[j] - RateP*qq[j])/(pp[j]*pp[j] + qq[j]*qq[j]);
  3651. }
  3652. }
  3653. return;
  3654. }
  3655. /******************************************************************************
  3656. 函数名称: _sw_ui_e_k
  3657. 函数版本: 01.01
  3658. 创建作者: sunxi
  3659. 创建日期: 2013-08-07
  3660. 函数说明: 通过g_ui的索引得到对应通道的理论比例系数。
  3661. 参数说明:
  3662. ui_index 通道在g_ui中的索引值
  3663. 返回值: 对应通道的理论比例系数。
  3664. 修改记录:
  3665. */
  3666. float _sw_ui_e_k(int ui_index)
  3667. {
  3668. int sw,i;
  3669. if(ui_index < PUB_AC_NUM)
  3670. {
  3671. i = g_sw_pub.ac_cfg_index[ui_index];
  3672. }
  3673. else
  3674. {
  3675. sw = (ui_index - PUB_AC_NUM)/SW_AC_NUM;
  3676. i = (ui_index - PUB_AC_NUM)%SW_AC_NUM;
  3677. i = g_sw[sw].ac_cfg_index[i];
  3678. }
  3679. return factor_e_k(g_equ_config_ac[i].scale);
  3680. }
  3681. /******************************************************************************
  3682. 函数名称: _sw_min_max
  3683. 函数版本: 01.01
  3684. 创建作者: sunxi
  3685. 创建日期: 2013-08-07
  3686. 函数说明: 计算g_ui中连续三个通道中的m2的最小值,最大值,供保护算法使用
  3687. 参数说明:
  3688. ui_index 通道在g_ui中的索引值
  3689. p_min 返回的最小值
  3690. p_max 返回的最大值
  3691. 返回值:
  3692. 修改记录:
  3693. */
  3694. void _sw_min_max(int ui_index,u32 *p_min,u32*p_max)
  3695. {
  3696. u32 min,max,m2;
  3697. int i;
  3698. min = -1;
  3699. max = 0;
  3700. for(i=0;i<3;i++)
  3701. {
  3702. if(g_ui[ui_index].chn_index == CFG_ADC_CHANNEL_ZERO && g_ui[ui_index].ui_base_make == -1)
  3703. {
  3704. ui_index++;
  3705. continue;
  3706. }
  3707. m2 = g_ui[ui_index].m2[0];
  3708. if(m2 < min)
  3709. {
  3710. min = m2;
  3711. }
  3712. if(m2 > max)
  3713. {
  3714. max = m2;
  3715. }
  3716. ui_index++;
  3717. }
  3718. *p_min = min;
  3719. *p_max = max;
  3720. return;
  3721. }
  3722. /******************************************************************************
  3723. 函数名称: _fz_min_max
  3724. 函数版本: 01.01
  3725. 创建作者: xxxxxx
  3726. 创建日期: 2013-08-07
  3727. 函数说明: 计算g_ui中连续通道中的幅值的最小值,最大值,供保护算法使用
  3728. 参数说明:
  3729. ui_index1 起始通道在g_ui中的索引值
  3730. ui_index2 结束通道在g_ui中的索引值
  3731. p_min 返回的最小值
  3732. p_max 返回的最大值
  3733. 返回值:
  3734. 修改记录:
  3735. */
  3736. void _fz_min_max(int ui_index1,int ui_index2,u32 *p_min,u32*p_max)
  3737. {
  3738. u32 min,max,m2;
  3739. int i;
  3740. min = -1;
  3741. max = 0;
  3742. for(i=ui_index1;i<ui_index2+1;i++)
  3743. {
  3744. if(g_ui[ui_index1].chn_index == CFG_ADC_CHANNEL_ZERO && g_ui[ui_index1].ui_base_make == -1)
  3745. {
  3746. ui_index1++;
  3747. continue;
  3748. }
  3749. m2 = g_ui[ui_index1].fz;
  3750. if(m2 < min)
  3751. {
  3752. min = m2;
  3753. }
  3754. if(m2 > max)
  3755. {
  3756. max = m2;
  3757. }
  3758. ui_index1++;
  3759. }
  3760. *p_min = min;
  3761. *p_max = max;
  3762. return;
  3763. }
  3764. /******************************************************************************
  3765. 函数名称: _sw_base_angle
  3766. 函数版本: 01.01
  3767. 创建作者: sunxi
  3768. 创建日期: 2013-08-07
  3769. 函数说明: 自动校准时,通道的基本参考角度
  3770. 参数说明:
  3771. ui_index 通道在g_ui中的索引值
  3772. 返回值: 参考的角度
  3773. 修改记录:
  3774. */
  3775. float _sw_base_angle(int ui_index)
  3776. {
  3777. static float angle_v[8] = {0,-120,120,0,-120,120,120,120}; // U0、US使用UC角度
  3778. #ifdef SW_AC_I0S_SAMPLE
  3779. static float angle_a [SW_AC_NUM] = {0,-120,120,-120,-120,0,-120,120}; // I0使用IB值
  3780. #else
  3781. static float angle_a [SW_AC_NUM] = {0,-120,120,-120,0,-120,120}; // I0使用IB值
  3782. #endif
  3783. float angle;
  3784. if(ui_index < PUB_AC_NUM)
  3785. {
  3786. // 电压
  3787. // 将第2组电压映射到第一组上面
  3788. ui_index = ui_index%(PUB_AC_NUM/2);
  3789. // 得到基准电压
  3790. angle = angle_v[ui_index];
  3791. // 如果配置不是相电压,U01、US1减30度。
  3792. if((g_ui[PUB_AC_UA1].chn_index == CFG_ADC_CHANNEL_ZERO)
  3793. && (ui_index == PUB_AC_U01 || ui_index == PUB_AC_US1))
  3794. {
  3795. angle -= 30;
  3796. }
  3797. }
  3798. else
  3799. {
  3800. // 电流
  3801. ui_index = (ui_index - PUB_AC_NUM)%SW_AC_NUM;
  3802. angle = angle_a[ui_index];
  3803. // 如果配置不是相电压,电流减30度。
  3804. if(g_ui[PUB_AC_UA1].chn_index == CFG_ADC_CHANNEL_ZERO)
  3805. {
  3806. angle -= 30;
  3807. }
  3808. }
  3809. return angle;
  3810. }
  3811. /******************************************************************************
  3812. 函数名称: _sw_save_dc_factor
  3813. 函数版本: 01.01
  3814. 创建作者: sunxi
  3815. 创建日期: 2013-08-07
  3816. 函数说明: 将直流量校正系数保存到内部定值
  3817. 参数说明:
  3818. dc1 直流量1的校正系数
  3819. dc2 只流量2的校正系数
  3820. 返回值:
  3821. 0: 成功
  3822. 其它: 失败
  3823. 修改记录:
  3824. */
  3825. int _sw_save_dc_factor(float dc1_H, float dc1_L,float dc2_H, float dc2_L)
  3826. {
  3827. struct dc_factor_save factor[2];
  3828. u8 id[8];
  3829. if(dc1_H != 0.0)
  3830. {
  3831. factor[0].dc_h = dc1_H;
  3832. factor[0].adjust_set = DC_ADJUST;
  3833. }
  3834. if(dc1_L!= 0.0)
  3835. {
  3836. factor[0].dc_l= dc1_L;
  3837. factor[0].adjust_set = DC_ADJUST;
  3838. }
  3839. if(dc2_H != 0.0)
  3840. {
  3841. factor[1].dc_h = dc2_H;
  3842. factor[1].adjust_set = DC_ADJUST;
  3843. }
  3844. if(dc2_L!= 0.0)
  3845. {
  3846. factor[1].dc_l = dc2_L;
  3847. factor[1].adjust_set = DC_ADJUST;
  3848. }
  3849. memcpy(id, g_auth_id, 8);
  3850. if(dcfactor_createfile(&id[0], (u8*)&factor) != 0)
  3851. {
  3852. rt_printf("直流系数文件保存失败\r\n");
  3853. return -1;
  3854. }
  3855. return 0;
  3856. }
  3857. float g_temp_factor[EQU_SLOT_AC_NUM];
  3858. void _sw_temp_factor(void)
  3859. {
  3860. int i;
  3861. float t;
  3862. #if defined TMP_CHIP_DS18B20
  3863. t = ds18b20_get_temp();
  3864. #elif defined TMP_CHIP_GX21M15
  3865. t = gx21m15_get_temp();
  3866. #elif defined TMP_CHIP_AHT20
  3867. t = aht20_get_temp();
  3868. #endif
  3869. if(t < -80.0 || t > 125.0)
  3870. {
  3871. // 温度超范围,可能温度传感器坏,使用默认值
  3872. for(i=0; i<EQU_SLOT_AC_NUM; i++)
  3873. {
  3874. g_temp_factor[i] = 1.0;
  3875. }
  3876. }
  3877. else
  3878. {
  3879. //在正常范围内,使用温度校正
  3880. for(i=0; i<EQU_SLOT_AC_NUM; i++)
  3881. {
  3882. factor_temp_get(equ_ac_index_to_slot(i),&g_temp_factor[i]);
  3883. g_temp_factor[i] = t - g_temp_factor[i];
  3884. g_temp_factor[i] *= pRunSet->f_temp_factor_ac/1000000;
  3885. g_temp_factor[i] += 1.0;
  3886. }
  3887. }
  3888. for(i=0;i<UI_NUM;i++)
  3889. {
  3890. if(g_ui[i].chn_index != CFG_ADC_CHANNEL_ZERO)
  3891. {
  3892. g_ui[i].e_factor = g_ui[i].e_factor0*g_temp_factor[g_ui[i].chn_index/16];
  3893. }
  3894. else if(g_ui[i].ui_base_make != -1)
  3895. {
  3896. g_ui[i].e_factor = g_ui[i].e_factor0*g_temp_factor[g_ui[g_ui[i].ui_base_make].chn_index/16];
  3897. }
  3898. }
  3899. return;
  3900. }
  3901. int sw_get_chnl_ps(int index,bool prim)
  3902. {
  3903. int owner,type;
  3904. owner=g_equ_config_ac[index].owner;
  3905. type=g_equ_config_ac[index].type;
  3906. if(owner==0)
  3907. {
  3908. type-=1;
  3909. if(type==PUB_AC_U01||type==PUB_AC_U02) //零序 PT变比为默认10000/100
  3910. {
  3911. if(prim) return 10000;
  3912. else return 100;
  3913. }
  3914. else if(PUB_AC_UA2||PUB_AC_UB2||PUB_AC_UC2||PUB_AC_UAB2||PUB_AC_UBC2||PUB_AC_UCA2)
  3915. { //采用PT2变比 dlj 2019-6-5
  3916. if(prim)return 10000;
  3917. else return pRunSet->pt2_two;
  3918. }
  3919. else if(type<PUB_AC_NUM)
  3920. {
  3921. if(prim)return 10000;
  3922. else return pRunSet->pt1_two;
  3923. }
  3924. }
  3925. else
  3926. {
  3927. owner-=1;
  3928. type-=1;
  3929. if(type==SW_AC_I0) //零序 CT变比
  3930. {
  3931. if(prim) return pRunSet->ct0_one;
  3932. else return pRunSet->ct0_two;
  3933. }
  3934. else if(type==SW_AC_IA||type==SW_AC_IB||type==SW_AC_IC)
  3935. {
  3936. if(prim) return pRunSet->ct_one;
  3937. else return pRunSet->ct_two;
  3938. }
  3939. }
  3940. return 1;
  3941. }
  3942. /*------------------------------ 测试函数 -------------------------------------
  3943. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  3944. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  3945. */
  3946. int sw_stat_reset(void)
  3947. {
  3948. int i;
  3949. for(i=0; i< UI_NUM; i++)
  3950. {
  3951. rt_stat_init(&g_ui[i].m2_stat,g_ui[i].name);
  3952. rt_stat_init(&g_ui[i].e_stat,g_ui[i].name);
  3953. rt_stat_init(&g_ui[i].p_stat,g_ui[i].name);
  3954. }
  3955. return 0;
  3956. }
  3957. int sw_pub_printf(void)
  3958. {
  3959. return 0;
  3960. }
  3961. int sw_pub_printf_v(void)
  3962. {
  3963. int i;
  3964. // rt_printf("PUB AC通道模值:\r\n");
  3965. // rt_printf("name\t\t\tmin\tmax\tavg\tsum\t\tcnt\r\n");
  3966. rt_printf("PUB AC通道有效值:\r\n");
  3967. rt_printf("name\t\t\tmin\tmax\tavg\tsum\t\tcnt\r\n");
  3968. for(i=0; i<PUB_AC_NUM; i++)
  3969. {
  3970. rt_stat_printf_q16(&g_ui[i].e_stat);
  3971. }
  3972. #if 1
  3973. rt_printf("PUB AC通道角度:\r\n");
  3974. rt_printf("name\t\t\tmin\tmax\tavg\tsum\t\tcnt\r\n");
  3975. for(i=0; i<PUB_AC_NUM; i++)
  3976. {
  3977. rt_stat_printf_q16(&g_ui[i].p_stat);
  3978. }
  3979. #endif
  3980. return 0;
  3981. }
  3982. int sw_printf(void)
  3983. {
  3984. return 0;
  3985. }
  3986. int sw_printf_v(void)
  3987. {
  3988. int i,sw;
  3989. rt_printf("SW AC通道有效值:\r\n");
  3990. rt_printf("name\t\t\tmin\tmax\tavg\tsum\t\tcnt\r\n");
  3991. for(sw=0; sw<SWITCH_NUM_MAX; sw++)
  3992. {
  3993. rt_printf("sw%02d\r\n",sw);
  3994. for(i=0; i<SW_AC_NUM; i++)
  3995. {
  3996. rt_stat_printf_q16(&g_ui[PUB_AC_NUM + sw*SW_AC_NUM + i].e_stat);
  3997. }
  3998. for(i=SW_AC_NUM; i<SW_AC_NUM_ALL; i++)
  3999. {
  4000. rt_printf("%s:%s.\r\n",g_sw_ac_desc[i].name,q16_to_str((long)g_sw[sw].ac_in[i]));
  4001. }
  4002. }
  4003. #if 0
  4004. rt_printf("SW AC通道角度:\r\n");
  4005. rt_printf("name\t\t\tmin\tmax\tavg\tsum\t\tcnt\r\n");
  4006. for(sw=0; sw<SWITCH_NUM_MAX; sw++)
  4007. {
  4008. for(i=0; i<SW_AC_NUM; i++)
  4009. {
  4010. rt_stat_printf_q16(&g_sw[sw].I.i_stat_p[i]);
  4011. }
  4012. }
  4013. #endif
  4014. return 0;
  4015. }
  4016. int sw_ui_printf(void)
  4017. {
  4018. int i;
  4019. rt_printf("谐波次数:%d\r\n",g_harmonic_num);
  4020. rt_printf("UI通道:\r\n");
  4021. rt_printf("\t\tm2_factor_k\tm2_factor_c\te_factor\tp_factor\te_ps\r\n");
  4022. for(i=0; i<UI_NUM; i++)
  4023. {
  4024. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO)
  4025. {
  4026. // continue;
  4027. }
  4028. rt_printf("%s(%02d,%02d):\t%f\t%f\t%f\t%f\t%f\r\n",
  4029. g_ui[i].name,
  4030. g_ui[i].chn_index ,
  4031. g_ui[i].ui_base_make ,
  4032. (float)g_ui[i].m2_factor_k/Q08_BASE,
  4033. (float)g_ui[i].m2_factor_c/Q16_BASE,
  4034. g_ui[i].e_factor ,
  4035. g_ui[i].p_factor ,
  4036. g_ui[i].e_ps);
  4037. }
  4038. return 0;
  4039. }
  4040. #if 1
  4041. void rt_stat_printf_m2(int i,struct rt_stat *stat)
  4042. {
  4043. uint32_t avg = 0;
  4044. qs16 qs;
  4045. if(stat->cnt)
  4046. {
  4047. avg = stat->sum/stat->cnt;
  4048. }
  4049. rt_printf("%-24s",stat->name);
  4050. qs = _Mul_Div_U(sqrt_32fix(stat->min), 256, g_ui[i].m2_factor_k);
  4051. rt_printf("%f\t", (float)qs/Q16_BASE);
  4052. qs = _Mul_Div_U(sqrt_32fix(stat->max), 256, g_ui[i].m2_factor_k);
  4053. rt_printf("%f\t", (float)qs/Q16_BASE);
  4054. qs = _Mul_Div_U(sqrt_32fix(avg), 256, g_ui[i].m2_factor_k);
  4055. rt_printf("%f\t", (float)qs/Q16_BASE);
  4056. rt_printf("%-016d%d\r\n",stat->sum,stat->cnt);
  4057. return;
  4058. }
  4059. #else
  4060. void rt_stat_printf_m2(int i,struct rt_stat *stat)
  4061. {
  4062. uint32_t avg = 0;
  4063. float k;
  4064. if(stat->cnt)
  4065. {
  4066. avg = stat->sum/stat->cnt;
  4067. }
  4068. k = _sw_ui_e_k(i);
  4069. rt_printf("%-24s",stat->name);
  4070. rt_printf("%f\t", sqrtf((float)stat->min)/k);
  4071. rt_printf("%f\t", sqrtf((float)stat->max)/k);
  4072. rt_printf("%f\t", sqrtf((float)avg)/k);
  4073. rt_printf("%-016d%d\r\n",stat->sum,stat->cnt);
  4074. return;
  4075. }
  4076. #endif
  4077. int sw_ui_printf_e(void)
  4078. {
  4079. int i;
  4080. rt_printf("UI通道:\r\n");
  4081. rt_printf("name\t\t\tmin\t\tmax\t\tavg\t\tsum\t\tcnt\r\n");
  4082. for(i=0; i<UI_NUM; i++)
  4083. {
  4084. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO)
  4085. {
  4086. // continue;
  4087. }
  4088. // rt_stat_printf_m2(i,&g_ui[i].m2_stat);
  4089. rt_stat_printf_q16(&g_ui[i].e_stat);
  4090. // rt_stat_printf_q16(&g_ui[i].p_stat);
  4091. }
  4092. return 0;
  4093. }
  4094. int sw_ui_printf_m(void)
  4095. {
  4096. int i;
  4097. rt_printf("UI通道:\r\n");
  4098. rt_printf("name\t\t\tmin\t\tmax\t\tavg\t\tsum\t\tcnt\r\n");
  4099. for(i=0; i<UI_NUM; i++)
  4100. {
  4101. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO)
  4102. {
  4103. // continue;
  4104. }
  4105. rt_stat_printf_m2(i,&g_ui[i].m2_stat);
  4106. }
  4107. return 0;
  4108. }
  4109. int sw_ui_printf_p(void)
  4110. {
  4111. int i;
  4112. rt_printf("UI通道:\r\n");
  4113. rt_printf("name\t\t\tmin\t\tmax\t\tavg\t\tsum\t\tcnt\r\n");
  4114. for(i=0; i<UI_NUM; i++)
  4115. {
  4116. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO)
  4117. {
  4118. // continue;
  4119. }
  4120. rt_stat_printf_q16(&g_ui[i].p_stat);
  4121. }
  4122. return 0;
  4123. }
  4124. int sw_ui_temp(void)
  4125. {
  4126. int i;
  4127. float t;
  4128. rt_printf("温度校正系数[当前温度:%f]:\r\n",
  4129. #if defined TMP_CHIP_DS18B20
  4130. ds18b20_get_temp()
  4131. #elif defined TMP_CHIP_GX21M15
  4132. gx21m15_get_temp()
  4133. #elif defined TMP_CHIP_AHT20
  4134. aht20_get_temp()
  4135. #endif
  4136. );
  4137. for(i=0; i<EQU_SLOT_AC_NUM;i++)
  4138. {
  4139. factor_temp_get(equ_ac_index_to_slot(i),&t);
  4140. rt_printf("%d[slot=%02d,temp=%f]:%f.\r\n",i,equ_ac_index_to_slot(i),t,g_temp_factor[i]);
  4141. }
  4142. rt_printf("谐波校正系数[次数=%d]:\r\n",g_harmonic_num);
  4143. for(i=0; i<CFG_ADC_DOTS_PER_PERIOD/2;i++)
  4144. {
  4145. rt_printf("%02d\t%f.\r\n",i,g_harmonic_factor[i]);
  4146. }
  4147. return 0;
  4148. }
  4149. /*------------------------------ 文件结束 -------------------------------------
  4150. */