FA.c 175 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: vol_ls.c
  4. 文件版本: 01.01
  5. 创建作者: xxxxxx
  6. 创建日期: 2013-04-15
  7. 功能说明: 上电合闸、失压分闸、合环配网功能
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. const char *fa_s_status[]={"S_0",
  15. "S_INIT",
  16. "S_TEMP",
  17. "S_BSFLASH",
  18. "S_XTIME",
  19. "S_X_ZTIME",
  20. "S_BSXTIME",
  21. "S_YTIME",
  22. "S_Y_ZTIME",
  23. "S_BSYTIME",
  24. "S_USUAL",
  25. "S_BSDOUBLE",
  26. "S_BSHHGZ", //合后故障闭锁状态
  27. "S_BSFZ", //合后闭锁分闸状态
  28. "S_BSDL", //大电流闭锁分闸状态
  29. "S_BS_SW",
  30. "S_ERROR",
  31. };
  32. const char *fa_l_status[13]={"L_0",
  33. "L_INIT", //初始状态
  34. "L_BS_STATE", //联络闭锁,待双侧YL有压解锁
  35. "L_Y_ZTIME", //Y时限计数状态中发生的Z时限计数状态
  36. "L_USUAL", //正常运行状态
  37. "L_XLTIME", //X时限计数状态
  38. "L_XL_ZTIME", //X时限计数中发生的Z时限计数状态
  39. "L_RELAYON", //开关合运行状态
  40. "L_YL_TIME",}; //合闸成功Y计时
  41. //FA.h USDHZ_U
  42. const char *fa_run_falg_str[]={
  43. "UAB有压标志",
  44. "UBC有压标志",
  45. "UAB残压标志",
  46. "UBC残压标志",
  47. "上电记录标志 Uab1侧,电源侧",
  48. "有压标志",
  49. "两侧有压标志",
  50. "一侧失压标志",
  51. "对侧有压标志",
  52. "对侧有瞬时电压标志",
  53. "电源侧有压标志",
  54. "X时间闭锁",
  55. "Y时间闭锁",
  56. "瞬时加压闭锁",
  57. "双侧电源闭锁",
  58. "开关合命令标志",
  59. "告警动作",
  60. "合闸事件",
  61. "X闭锁事件",
  62. "Y闭锁事件"
  63. "瞬时电压闭锁事件 ",
  64. "双电源闭锁事件",
  65. "故障记忆",
  66. "接地记忆",
  67. "零序过压标志",
  68. "X 时间有U0"
  69. ,
  70. "失电过程中的Uab瞬压标志"
  71. ,
  72. "失电过程中的Ubc瞬压标志",
  73. "合闸事件",
  74. "状态保护标志",
  75. "上电记录标志",
  76. "暂态判断小电流接地",
  77. 0,
  78. };
  79. //FA.h UVOT_U
  80. const char *sw_u_str[]={
  81. "失压启动",
  82. "失压启动",
  83. "分闸",
  84. "合闸",
  85. "合后故障闭锁失压分闸标志",
  86. "合后故障闭锁失压分闸标志",
  87. "合后接地故障闭锁失压分闸标志",
  88. "过流启动",
  89. "闭锁",
  90. "保护退出 ",
  91. "保护退出",
  92. "bEvent"
  93. "计数完成",
  94. #if 1
  95. "跳闸2",
  96. "15",
  97. "16",
  98. "17",
  99. "18",
  100. "19",
  101. "20",
  102. "21",
  103. "22",
  104. "23",
  105. "24",
  106. "25",
  107. "26",
  108. "27",
  109. "28",
  110. "29",
  111. "30",
  112. "31",
  113. "32",
  114. #endif
  115. };
  116. //run_status.h USWST
  117. const char *sw_status_str[]={
  118. "重合闸分位信号",
  119. "重合闸合位信号",
  120. "外部开入合位",
  121. "外部开入分位",
  122. "未储能告警",
  123. "控制回路",
  124. "跳位有流告警",
  125. "三相无流",
  126. "手合加速",
  127. "上电加速 ",
  128. "智能分布式联络合闸,加速",
  129. "闭锁跳闸"
  130. "曾有压",
  131. #if 1
  132. "14",
  133. "15",
  134. "16",
  135. "17",
  136. "18",
  137. "19",
  138. "20",
  139. "21",
  140. "22",
  141. "23",
  142. "24",
  143. "25",
  144. "26",
  145. "27",
  146. "28",
  147. "29",
  148. "30",
  149. "31",
  150. "32",
  151. #endif
  152. 0,
  153. };
  154. #if defined FUNC_MODE_JS || defined FUNC_ONLY_MMD_JS
  155. bool gb_js_mode=false;
  156. #endif
  157. static void _volstu_update(void);
  158. static void _volstatus_init(void);
  159. #define FA_BSYTIME_JS //中山局正向闭锁后,不解锁直接来电合闸,合闸3S内两侧有压无故障则解除正向闭锁。如果两侧都闭锁则不执行来电合
  160. #define VOLSTATUS_FILE_VERSION 0X01010101 //文件版本
  161. //上电合闸状态存储数据文件头
  162. struct vol_file_head
  163. {
  164. struct cfg_file_head cfh; //配置文件头
  165. u32 addr; //起始地址
  166. u32 num; //存储总量
  167. u8 reserved[8];
  168. };
  169. u8 g_volfile_open=0;
  170. static u8 vol_filelen;
  171. char *g_volbuf;
  172. struct vol_stu g_vol_stu[SWITCH_NUM_MAX];
  173. struct file * gf_volstu;
  174. #if 0 // 板上瞬压板处理
  175. unsigned short fa_getUFDI(void)
  176. {
  177. unsigned int di=0;
  178. unsigned short ret=0;
  179. if( pRunSet->bTT_SY_Board)
  180. {
  181. di = gpio_get_di();
  182. }
  183. ret = (unsigned short)((di >> 15) & 0x0003); // YX16 Yx17为瞬压信号
  184. return ret;
  185. }
  186. TIMERELAY tUfdiTime;
  187. void fa_RstUFDI(DWORD dStep)
  188. {
  189. static bool brst=false;
  190. static DWORD rstUFDICounter=0;
  191. int ufdi=fa_getUFDI();
  192. RunTR(&tUfdiTime, (ufdi>0), dStep); //延迟 1秒 复归瞬压继电器,防止抖动
  193. if(tUfdiTime.boolTrip) brst=true;
  194. if(brst&&pRunSet->bTT_SY_Board)
  195. {
  196. gpio_pwm_do(1, 2); // PWM2 为复归瞬压信号的开出
  197. if(dTCounter-rstUFDICounter>=T_20ms) //开出20ms开出
  198. {
  199. gpio_pwm_do(0, 2); // PWM2 为复归瞬压信号的开出
  200. brst=false;
  201. rstUFDICounter=dTCounter;
  202. }
  203. }
  204. else
  205. {
  206. rstUFDICounter=dTCounter;
  207. }
  208. }
  209. #endif
  210. /**************************************************************************
  211. 函数名称:FA_Init
  212. 函数版本:1.00
  213. 作者: 电力产品开发部
  214. 创建日期:2011.10.28
  215. 函数功能说明:状态初始化
  216. 输入参数:
  217. 其他输入:
  218. 输出参数:
  219. 返回值:
  220. ***************************************************************************/
  221. void FA_Init(void)
  222. {
  223. u8 sw;
  224. //unsigned short ufdi;
  225. //bool bUab,bUbc;
  226. //ufdi=fa_getUFDI()&0x03;
  227. //bUab=(ufdi&0x01)?true:false;
  228. //bUbc=(ufdi&0x02)?true:false;
  229. for (sw=0; sw< SWITCH_NUM_MAX; sw++)
  230. {
  231. g_tRelay[sw].tSDHZ.S_Status = S_INIT;
  232. g_tRelay[sw].tSDHZ.L_Status = L_INIT;
  233. //g_tRelay[sw].tSDHZ.uSdhz_S.bFlag.bUabflashDI=bUab&&pRunSet->tSwSet[sw].bTT_FA;
  234. //g_tRelay[sw].tSDHZ.uSdhz_S.bFlag.bUbcflashDI=bUbc&&pRunSet->tSwSet[sw].bTT_FA;
  235. }
  236. //InitTR(&tUfdiTime, T_1s,0 );
  237. _volstatus_init();
  238. }
  239. static void dl_ope_event(int sw,int code,long v1,long v2,long v3)
  240. {
  241. int i;
  242. for(i=EV_FA_HZ;i<=EV_YK_FZ;i++)
  243. {
  244. if(i==code)
  245. {
  246. if(soe_check(i+sw*EV_SW_NUM)==false) //
  247. {
  248. soe_record_ev(i+sw*EV_SW_NUM, 1, v1,v2,v3 );
  249. }
  250. }
  251. else
  252. {
  253. if(soe_check(i+sw*EV_SW_NUM)==true) //
  254. {
  255. soe_record_ev(i+sw*EV_SW_NUM, 0, 0,0,0 );
  256. }
  257. }
  258. }
  259. }
  260. static bool fa_check_all_s_bs(int sw)
  261. {
  262. bool bY=false;
  263. bool bY1=false;
  264. TSETSW *pSet = &pRunSet->tSwSet[sw];
  265. bY=0
  266. ||soe_check(EV_BS_X_L+sw*EV_SW_NUM)
  267. ||soe_check(EV_BS_Y_L+sw*EV_SW_NUM)
  268. ||soe_check(EV_BS_X_P+sw*EV_SW_NUM)
  269. ||soe_check(EV_BS_Y_P+sw*EV_SW_NUM)
  270. ||(soe_check(EV_BS_U0+sw*EV_SW_NUM)&&pSet->bTT_fa_gzbshz)
  271. ||soe_check(EV_BS_HA+sw*EV_SW_NUM)
  272. ||soe_check(EV_BS_UF_P+sw*EV_SW_NUM)
  273. ||soe_check(EV_BSBE_U0+sw*EV_SW_NUM)
  274. ||(soe_check(EV_HHGZ+sw*EV_SW_NUM)&&pSet->bTT_fa_gzbshz)
  275. ||soe_check(EV_BS_FZMORE+sw*EV_SW_NUM)
  276. ||soe_check(EV_BS_UF_L+sw*EV_SW_NUM)
  277. ||soe_check(EV_GOOSE_GZBS_FA)// goose故障闭锁
  278. ||soe_check(EV_GOOSE_TZBS_FA)// goose故障闭锁
  279. #ifdef FA_OC_COUNT
  280. ||soe_check(EV_BS_OC_COUNT+sw*EV_SW_NUM)// 过流脉冲计数闭锁
  281. #endif
  282. #ifdef YK_FA_ENBLE
  283. ||soe_check(EV_YK_BS_FA+sw*EV_SW_NUM) // 遥控闭锁FA
  284. #endif
  285. #ifndef GD_AREA_ECZD_MEIZHOU_2021
  286. || g_tRelay[sw].tPLJL.bLed //解裂动作后需闭锁合闸
  287. #endif
  288. || g_tRelay[sw].tDYJL.bLed; //解裂动作后需闭锁合闸
  289. //||soe_check(EV_BS_DB+sw*EV_SW_NUM); //广西双电源不点闭锁灯
  290. bY1=soe_check(EV_BS_DB+sw*EV_SW_NUM);
  291. if(bY||bY1)
  292. {
  293. if(soe_check(EV_BS_ALL+sw*EV_SW_NUM)==false)
  294. {
  295. soe_record_ev(EV_BS_ALL+sw*EV_SW_NUM, 1, 0,0,0 );
  296. }
  297. }
  298. else
  299. {
  300. if(soe_check(EV_BS_ALL+sw*EV_SW_NUM)==true)
  301. {
  302. soe_record_ev(EV_BS_ALL+sw*EV_SW_NUM, 0, 0,0,0 );
  303. }
  304. }
  305. //return(bY; // 广西FA 双电源闭锁,不点闭锁灯
  306. return (bY||bY1);
  307. }
  308. /**************************************************************************
  309. 函数名称:Pro_LS_LED
  310. 函数版本:1.00
  311. 作者: 电力产品开发部
  312. 创建日期:2011.10.28
  313. 函数功能说明:VSP5开关LED灯处理
  314. 输入参数:
  315. 其他输入:
  316. 输出参数:
  317. 返回值:
  318. ***************************************************************************/
  319. static void fa_ls_led(int sw, bool bFA_L)
  320. {
  321. TSDHZ_T *pSW = &g_tRelay[sw].tSDHZ;
  322. if(!bFA_L)
  323. {
  324. if (pSW->S_Status == S_XTIME)
  325. led_set_sw(sw,SW_LED_XT, LED_ON);
  326. else
  327. led_set_sw(sw,SW_LED_XT, LED_OFF);
  328. if (pSW->S_Status == S_YTIME)
  329. led_set_sw(sw,SW_LED_YT, LED_ON);
  330. else
  331. led_set_sw(sw,SW_LED_YT, LED_OFF);
  332. if(pSW->S_Status == S_XTIME)
  333. led_set_sw(sw,SW_LED_X_YT, LED_ON);
  334. else if(pSW->S_Status == S_YTIME)
  335. led_set_sw(sw,SW_LED_X_YT, LED_QUICK);
  336. else
  337. led_set_sw(sw,SW_LED_X_YT, LED_OFF);
  338. //if(fa_check_all_s_bs(sw))
  339. // led_set_sw(sw,SW_LED_LOCK, LED_ON);
  340. //else
  341. // led_set_sw(sw,SW_LED_LOCK, LED_OFF);
  342. }
  343. else
  344. {
  345. if (pSW->L_Status == L_XLTIME)
  346. led_set_sw(sw,SW_LED_XT, LED_ON);
  347. else
  348. led_set_sw(sw,SW_LED_XT, LED_OFF);
  349. if (((pSW->L_Status == L_BS_STATE) || (pSW->L_Status == L_Y_ZTIME)||(pSW->L_Status == L_YL_TIME) ) && (!pSW->uSdhz_L.bFlag.bLockUFlash))
  350. led_set_sw(sw,SW_LED_YT, LED_ON);
  351. else
  352. led_set_sw(sw,SW_LED_YT, LED_OFF);
  353. if(pSW->L_Status == L_XLTIME)
  354. led_set_sw(sw,SW_LED_X_YT, LED_ON);
  355. else if (((pSW->L_Status == L_BS_STATE) ||(pSW->L_Status == L_Y_ZTIME)||(pSW->L_Status == L_YL_TIME) ) && (!pSW->uSdhz_L.bFlag.bLockUFlash))
  356. led_set_sw(sw,SW_LED_X_YT, LED_QUICK);
  357. else
  358. led_set_sw(sw,SW_LED_X_YT, LED_OFF);
  359. if(pSW->L_Status == L_USUAL)
  360. {
  361. led_set_sw(sw,SW_LED_XT, LED_OFF);
  362. led_set_sw(sw,SW_LED_YT, LED_OFF);
  363. led_set_sw(sw,SW_LED_X_YT, LED_OFF);
  364. }
  365. //if (pSW->uSdhz_L.bFlag.bLockY)
  366. // led_set_sw(sw,SW_LED_LOCK, LED_ON);
  367. //else
  368. // led_set_sw(sw,SW_LED_LOCK, LED_OFF);
  369. }
  370. }
  371. /**************************************************************************
  372. 函数名称:Pro_UF_Clear
  373. 函数版本:1.00
  374. 作者: 电力产品开发部
  375. 创建日期:2011.10.28
  376. 函数功能说明:瞬时电压标志处理
  377. 输入参数:
  378. 其他输入:
  379. 输出参数:
  380. 返回值:
  381. ***************************************************************************/
  382. static void fa_uf_set(int sw, bool bSW_LL, DWORD dStep)
  383. {
  384. bool bY1,bY2;
  385. TRELAY_T *pR=&g_tRelay[sw];
  386. TSWST *pSWST =&pR->tSWST;
  387. TSDHZ_T *pSW=&pR->tSDHZ;
  388. TSETSW *pSet = &pRunSet->tSwSet[sw];
  389. #ifdef FA_PL_PJ
  390. bool bFreq0,bFreq1;
  391. float freq0,freq1;
  392. #endif
  393. //频率在要求范围内
  394. #ifdef FA_PL_PJ
  395. if(pRunSet->bTT_judgeFreq)
  396. {
  397. freq0=freq_get(0);
  398. freq1=freq_get(1);
  399. //电源1频率判断
  400. if((freq0>=48.9) && (freq0<=50.9))
  401. {
  402. bFreq0 = true;
  403. }
  404. else
  405. {
  406. bFreq0 = false;
  407. }
  408. //电源2频率判断
  409. if((freq1>=48.9) && (freq1<=50.9))
  410. {
  411. bFreq1 = true;
  412. }
  413. else
  414. {
  415. bFreq1 = false;
  416. }
  417. if(bSW_LL)
  418. {
  419. RunTR(&pSW->tFREQAB25ms_LCY, bFreq0, dStep);
  420. RunTR(&pSW->tFREQBC25ms_LCY, bFreq1, dStep);
  421. }
  422. else
  423. {
  424. RunTR(&pSW->tFREQAB25ms_SCY, bFreq0, dStep);
  425. RunTR(&pSW->tFREQBC25ms_SCY, bFreq1, dStep);
  426. }
  427. }
  428. #endif
  429. #ifdef FA_PL_PJ
  430. if(pRunSet->bTT_judgeFreq)
  431. {
  432. if(bSW_LL)
  433. {
  434. #ifdef GD_AREA_LIAONING_2021
  435. bY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_UF, pSet->dU_UF, 0)&&pSW->tFREQAB25ms_LCY.boolTrip&&pR->run_stu.fa_start_hz;// 电源1瞬压
  436. bY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_UF2, pSet->dU_UF2, 0)&&pSW->tFREQBC25ms_LCY.boolTrip;// 电源2瞬压
  437. #else
  438. bY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_UF, pSet->dU_UF, 0)&&pSW->tFREQAB25ms_LCY.boolTrip;// 电源1瞬压
  439. bY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_UF2, pSet->dU_UF2, 0)&&pR->run_stu.fa_start_hz&&pSW->tFREQBC25ms_LCY.boolTrip;// 电源2瞬压
  440. #endif
  441. }
  442. else
  443. {
  444. #ifdef GD_AREA_LIAONING_2021
  445. bY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_UF, pSet->dU_UF, 0)&&pSW->tFREQAB25ms_SCY.boolTrip&&pR->run_stu.fa_start_hz;// 电源1瞬压
  446. bY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_UF2, pSet->dU_UF2, 0)&&pSW->tFREQBC25ms_SCY.boolTrip;// 电源2瞬压
  447. #else
  448. bY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_UF, pSet->dU_UF, 0)&&pSW->tFREQAB25ms_SCY.boolTrip;// 电源1瞬压
  449. bY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_UF2, pSet->dU_UF2, 0)&&pR->run_stu.fa_start_hz&&pSW->tFREQBC25ms_SCY.boolTrip;// 电源2瞬压
  450. #endif
  451. }
  452. }
  453. else
  454. {
  455. #ifdef GD_AREA_LIAONING_2021
  456. bY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_UF, pSet->dU_UF, 0)&&pR->run_stu.fa_start_hz;// 电源1瞬压
  457. bY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_UF2, pSet->dU_UF2, 0);// 电源2瞬压
  458. #else
  459. bY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_UF, pSet->dU_UF, 0);// 电源1瞬压
  460. bY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_UF2, pSet->dU_UF2, 0)&&pR->run_stu.fa_start_hz;// 电源2瞬压
  461. #endif
  462. }
  463. #elif defined GD_AREA_JIEYANG
  464. bY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_UF, pSet->dU_UF, 0)&&pR->run_stu.fa_start_hz;
  465. bY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_UF2, pSet->dU_UF2, 0);
  466. #else //GD_AREA_ZHUHAI_V2
  467. bY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_UF, pSet->dU_UF, 0);// 电源1瞬压
  468. bY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_UF2, pSet->dU_UF2, 0)&&pR->run_stu.fa_start_hz;// 电源2瞬压
  469. #endif
  470. if(bSW_LL)
  471. {
  472. RunTR(&pSW->tUFABL25ms, !bY1, dStep); //确认从无压到有压
  473. RunTR(&pSW->tUFBCL25ms, !bY2, dStep);
  474. RunTR(&pSW->tUFABL80ms, (bY1 && pSW->tUFABL25ms.boolTrip), dStep);
  475. RunTR(&pSW->tUFBCL80ms, (bY2 && pSW->tUFBCL25ms.boolTrip), dStep);
  476. #ifdef GD_AREA_CHAOZHOUFENGXI //潮州 联络残压不需要对侧有压条件 2020-8-12
  477. pSW->uSdhz_L.bFlag.bUABFlash = ((pSW->tUFABL80ms.boolTrip&&(!bY1))
  478. ||pSW->uSdhz_L.bFlag.bUABFlash)&&pSet->bTT_fa_cybs;
  479. pSW->uSdhz_L.bFlag.bUBCFlash = ((pSW->tUFBCL80ms.boolTrip&&(!bY2))
  480. ||pSW->uSdhz_L.bFlag.bUBCFlash)&&pSet->bTT_fa_cybs;//&&pR->run_stu.fa_start_hz;
  481. #else
  482. pSW->uSdhz_L.bFlag.bUABFlash = ((pSW->tUFABL80ms.boolTrip&&(!bY1)&&pSW->uSdhz_L.bFlag.bUBCYY)
  483. ||pSW->uSdhz_L.bFlag.bUABFlash)&&pSet->bTT_fa_cybs;
  484. pSW->uSdhz_L.bFlag.bUBCFlash = ((pSW->tUFBCL80ms.boolTrip&&(!bY2)&&pSW->uSdhz_L.bFlag.bUABYY)
  485. ||pSW->uSdhz_L.bFlag.bUBCFlash)&&pSet->bTT_fa_cybs;
  486. #endif
  487. }
  488. else
  489. {
  490. RunTR(&pSW->tUFABS25ms, !bY1, dStep);
  491. RunTR(&pSW->tUFBCS25ms, !bY2, dStep);
  492. RunTR(&pSW->tUFABS80ms, (bY1 && pSW->tUFABS25ms.boolTrip&&pSWST->uSWST.bFlag.bDITW), dStep);
  493. RunTR(&pSW->tUFBCS80ms, (bY2 && pSW->tUFBCS25ms.boolTrip&&pSWST->uSWST.bFlag.bDITW), dStep);
  494. pSW->uSdhz_S.bFlag.bUABFlash = ((pSW->tUFABS80ms.boolTrip&&(!bY1)&& pSWST->uSWST.bFlag.bDITW)
  495. || pSW->uSdhz_S.bFlag.bUABFlash)&&pSet->bTT_fa_cybs;
  496. pSW->uSdhz_S.bFlag.bUBCFlash = ((pSW->tUFBCS80ms.boolTrip&&(!bY2)&&pSWST->uSWST.bFlag.bDITW)
  497. || pSW->uSdhz_S.bFlag.bUBCFlash)&&pSet->bTT_fa_cybs;//&&pR->run_stu.fa_start_hz;
  498. }
  499. }
  500. static void fa_uf_clear(int sw, bool bSW_LL)
  501. {
  502. TSDHZ_T *pSW=&g_tRelay[sw].tSDHZ;
  503. if(bSW_LL)
  504. {
  505. ResetTR(&pSW->tUFABL25ms); //清零
  506. ResetTR(&pSW->tUFBCL25ms); //清零
  507. ResetTR(&pSW->tUFABL80ms); //清零
  508. ResetTR(&pSW->tUFBCL80ms); //清零
  509. #ifdef FA_PL_PJ
  510. ResetTR(&pSW->tFREQAB25ms_LCY);
  511. ResetTR(&pSW->tFREQBC25ms_LCY);
  512. #endif
  513. pSW->uSdhz_L.bFlag.bUABFlash = false;
  514. pSW->uSdhz_L.bFlag.bUBCFlash = false;
  515. }
  516. else
  517. {
  518. ResetTR(&pSW->tUFABS25ms);
  519. ResetTR(&pSW->tUFBCS25ms);
  520. ResetTR(&pSW->tUFABS80ms);
  521. ResetTR(&pSW->tUFBCS80ms);
  522. #ifdef FA_PL_PJ
  523. ResetTR(&pSW->tFREQAB25ms_SCY);
  524. ResetTR(&pSW->tFREQBC25ms_SCY);
  525. #endif
  526. pSW->uSdhz_S.bFlag.bUABFlash = false;
  527. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  528. pSW->uSdhz_S.bFlag.bUabflashDI=false;
  529. pSW->uSdhz_S.bFlag.bUbcflashDI=false;
  530. }
  531. }
  532. /**************************************************************************
  533. 函数名称:Pro_CLOSE_LED
  534. 函数版本:1.00
  535. 作者: 电力产品开发部
  536. 创建日期:2011.10.28
  537. 函数功能说明:VSP5关LED灯
  538. 输入参数:
  539. 其他输入:
  540. 输出参数:
  541. 返回值:
  542. ***************************************************************************/
  543. static void fa_close_led(int sw)
  544. {
  545. led_set_sw(sw,SW_LED_XT, LED_OFF);
  546. led_set_sw(sw,SW_LED_YT, LED_OFF);
  547. led_set_sw(sw,SW_LED_LOCK, LED_OFF);
  548. led_set_sw(sw,SW_LED_JD, LED_OFF);
  549. led_set_sw(sw,SW_LED_GL, LED_OFF);
  550. led_set_sw(sw,SW_LED_DZ, LED_OFF);
  551. led_set_sw(sw,SW_LED_TZ, LED_OFF);
  552. g_tRelay[sw].run_stu.dz=0;
  553. g_tRelay[sw].tU0TZ.bU0Led=false;
  554. g_tRelay[sw].tOC[FA_GL].sta.bFlag.bDzLed = false;
  555. g_tRelay[sw].tOC[FA_GL].sta.bFlag.bGj = false;
  556. g_tRelay[sw].tOC[FA_GL_II].sta.bFlag.bDzLed = false;
  557. g_tRelay[sw].tOC[FA_GL_II].sta.bFlag.bGj = false;
  558. g_tRelay[sw].tOC[FA_GL2].sta.bFlag.bDzLed = false;
  559. g_tRelay[sw].tOC[FA_GL2].sta.bFlag.bGj = false;
  560. g_tRelay[sw].tOC[FA_LX].sta.bFlag.bDzLed = false;
  561. g_tRelay[sw].tOC[FA_LX].sta.bFlag.bGj = false;
  562. g_tRelay[sw].tOC[FA_LX2].sta.bFlag.bDzLed = false;
  563. g_tRelay[sw].tOC[FA_LX2].sta.bFlag.bGj = false;
  564. }
  565. void fa_s_set_savestatus(int sw)
  566. {
  567. TRELAY_T *pR=&g_tRelay[sw];
  568. TSDHZ_T *pSW =&pR->tSDHZ;
  569. pSW->uSdhz_S.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  570. }
  571. //谐波含量
  572. bool fa_XBCalc(int sw,DWORD Iset)
  573. {
  574. TSETSW *pSet = &pRunSet->tSwSet[sw];
  575. TRELAY_T *pR=&g_tRelay[sw];
  576. int index=0;
  577. if(FA_ALL_EN(sw)&&pSet->bTT_fa_xbbs)
  578. {
  579. for(index=0;index<3;index++)
  580. {
  581. if(( g_ui[UI_SW_INDEX(sw,SW_AC_IA+index)].m2[0] > Iset) && ( g_ui[UI_SW_INDEX(sw,SW_AC_IA+index)].m2[1] > pR->tSWST.uSWST.bFlag.bFAWL)) // I 与 Ixb2 均应大于无流定值
  582. {
  583. if( g_ui[UI_SW_INDEX(sw,SW_AC_IA+index)].m2[1] > _MulFac_U(g_ui[UI_SW_INDEX(sw,SW_AC_IA+index)].m2[0], pSet->d_fa_xbcoe ))
  584. return(true);
  585. }
  586. }
  587. }
  588. return(false);
  589. }
  590. void run_vol_refersh(int sw, DWORD dStep)
  591. {
  592. bool bY2, bY3,bQDD1,bQDD2;
  593. #ifdef FUNC_NYY_NWY
  594. bool bY2_n=0,bY3_n=0;
  595. #endif
  596. TRELAY_T *pR=&g_tRelay[sw];
  597. TSDHZ_T *pSW =&pR->tSDHZ;
  598. TSETSW *pSet = &pRunSet->tSwSet[sw];
  599. DWORD Us1,Us2;
  600. int ui_begin;
  601. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  602. bool bY4, bY5;
  603. #endif
  604. //用于保存故障断面
  605. ui_begin = UI_SW_INDEX_BEGIN(sw);
  606. if(pRunSet->bTT_UYYmin)
  607. {
  608. Us1 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_min[2]), 256, pRunSet->dKU[PUB_AC_UAB1]);
  609. Us2 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_min[3]), 256, pRunSet->dKU[pRunSet->pt2vol]);
  610. }
  611. else
  612. {
  613. Us1 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[2]), 256, pRunSet->dKU[PUB_AC_UAB1]);
  614. Us2 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[3]), 256, pRunSet->dKU[pRunSet->pt2vol]);
  615. }
  616. //有压检测
  617. // 电源1上电合闸
  618. if(pRunSet->bTT_UYYmin)
  619. {
  620. bY2 = OverRelay(g_sw_pub.m2_min[2], pSet->dU_fa_YY, pSet->dU_fa_YY_fh, pSW->uSdhz_S.bFlag.bUABYY);
  621. #ifdef FUNC_NYY_NWY
  622. bY2_n = (((g_sw_pub.m2_min[2] > pSet->dU_fa_WY) && (g_sw_pub.m2_min[2] < pSet->dU_fa_YY))?true:false)
  623. || (tPT.uPT1DX.bFlag.bQD && pSW->uSdhz_S.bFlag.bUBCYY)
  624. ;
  625. #endif
  626. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  627. pSW->uSdhz_S.bFlag.bHzEnable_P = true;
  628. if(pSW->uSdhz_S.bFlag.bBsXtime_P)
  629. pSW->uSdhz_S.bFlag.bHzEnable_P = false;
  630. bY4 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_fa_YY, pSet->dU_fa_YY_fh, pSW->uSdhz_S.bFlag.bUABYY);
  631. if(bY4 && pSW->uSdhz_S.bFlag.bBsXtime_P)
  632. {
  633. pSW->uSdhz_S.bFlag.bHzEnable_P = true;
  634. pSW->uSdhz_S.bFlag.bBsXtime_P = false;
  635. }
  636. #endif
  637. }
  638. else
  639. {
  640. bY2 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_fa_YY, pSet->dU_fa_YY_fh, pSW->uSdhz_S.bFlag.bUABYY);
  641. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  642. pSW->uSdhz_S.bFlag.bHzEnable_P = true;
  643. pSW->uSdhz_S.bFlag.bHzEnable_L = true;
  644. #endif
  645. }
  646. RunTR(&pSW->tUABS25ms, bY2, dStep);
  647. #ifdef FUNC_NYY_NWY
  648. RunTR(&pSW->tUABS_NYY_NWY_50ms, bY2_n, dStep);
  649. pSW->uSdhz_S.bFlag.bUAB_NYY_NWY = pSW->tUABS_NYY_NWY_50ms.boolTrip;
  650. #endif
  651. #if defined GD_AREA_JIEYANG || defined GD_AREA_LIAONING_2021
  652. pSW->uSdhz_S.bFlag.bUABYY = pSW->tUABS25ms.boolTrip && pR->run_stu.fa_start_hz;
  653. #else
  654. pSW->uSdhz_S.bFlag.bUABYY = pSW->tUABS25ms.boolTrip;
  655. #endif
  656. if(soe_check(EV_YY_P+sw*EV_SW_NUM)!=pSW->uSdhz_S.bFlag.bUABYY)//记录SOE
  657. soe_record_ev(EV_YY_P+sw*EV_SW_NUM, pSW->uSdhz_S.bFlag.bUABYY, Us1,Us2,0 );
  658. // 电源2上电合闸
  659. if(pRunSet->bTT_UYYmin)
  660. {
  661. bY3 = OverRelay(g_sw_pub.m2_min[3], pSet->dU_fa_YY2, pSet->dU_fa_YY2_fh, pSW->uSdhz_S.bFlag.bUBCYY) ;
  662. #ifdef FUNC_NYY_NWY
  663. bY3_n = (((g_sw_pub.m2_min[3] > pSet->dU_fa_WY2) && (g_sw_pub.m2_min[3] < pSet->dU_fa_YY2))?true:false)
  664. || (tPT.uPT2DX.bFlag.bQD && pSW->uSdhz_S.bFlag.bUABYY)
  665. ;
  666. #endif
  667. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  668. pSW->uSdhz_S.bFlag.bHzEnable_L = true;
  669. if(pSW->uSdhz_S.bFlag.bBsXtime_L)
  670. pSW->uSdhz_S.bFlag.bHzEnable_L = false;
  671. bY5 = LowRelay(g_sw_pub.m2_max[3], pSet->dU_fa_YY2, pSet->dU_fa_YY2_fh, pSW->uSdhz_S.bFlag.bUBCYY);
  672. if(bY5 && pSW->uSdhz_S.bFlag.bBsXtime_L)
  673. {
  674. pSW->uSdhz_S.bFlag.bHzEnable_L = true;
  675. pSW->uSdhz_S.bFlag.bBsXtime_L = false;
  676. }
  677. #endif
  678. }
  679. else
  680. {
  681. bY3 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_fa_YY2, pSet->dU_fa_YY2_fh, pSW->uSdhz_S.bFlag.bUBCYY) ;
  682. }
  683. RunTR(&pSW->tUBCS25ms, bY3, dStep);
  684. #ifdef FUNC_NYY_NWY
  685. RunTR(&pSW->tUBCS_NYY_NWY_50ms, bY3_n, dStep);
  686. pSW->uSdhz_S.bFlag.bUBC_NYY_NWY = pSW->tUBCS_NYY_NWY_50ms.boolTrip;
  687. #endif
  688. #if defined GD_AREA_JIEYANG || defined GD_AREA_LIAONING_2021
  689. pSW->uSdhz_S.bFlag.bUBCYY = pSW->tUBCS25ms.boolTrip;
  690. #else
  691. pSW->uSdhz_S.bFlag.bUBCYY = pSW->tUBCS25ms.boolTrip && pR->run_stu.fa_start_hz;
  692. #endif
  693. if(soe_check(EV_YY_L+sw*EV_SW_NUM)!=pSW->uSdhz_S.bFlag.bUBCYY)//记录SOE
  694. soe_record_ev(EV_YY_L+sw*EV_SW_NUM, pSW->uSdhz_S.bFlag.bUBCYY, Us1,Us2,0 );
  695. //曾有压标志
  696. if( pSW->uSdhz_S.bFlag.bUABYY || pSW->uSdhz_S.bFlag.bUBCYY)
  697. pSW->uSdhz_S.bFlag.bCYY = TRUE;
  698. //两侧有压
  699. pSW->uSdhz_S.bFlag.bDBYY = pSW->uSdhz_S.bFlag.bUABYY && pSW->uSdhz_S.bFlag.bUBCYY;//双侧有压直接赋值,不需等待稳定时间
  700. //停电时间Z
  701. pR->tSWST.uSWST.bFlag.bFAWL = LowRelay(g_sw[sw].m2_max, pSet->dT_wldz,pSet->dT_wldz,false);
  702. #if defined GD_AREA_JIEYANG || defined GD_AREA_LIAONING_2021
  703. bQDD1 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_fa_WY, pSet->dU_fa_WY_fh, false) || !pR->run_stu.fa_start_hz;
  704. bQDD2 = LowRelay(g_sw_pub.m2_max[3], pSet->dU_fa_WY2, pSet->dU_fa_WY2_fh, false);
  705. #else
  706. bQDD1 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_fa_WY, pSet->dU_fa_WY_fh, false);
  707. bQDD2 = LowRelay(g_sw_pub.m2_max[3], pSet->dU_fa_WY2, pSet->dU_fa_WY2_fh, false) || !pR->run_stu.fa_start_hz;
  708. #endif
  709. RunTR(&pR->tLostVot.tLostVotTime, bQDD1 && bQDD2&&pSet->bTT_fa_Lostfz && pR->tSWST.uSWST.bFlag.bFAWL, dStep);
  710. pSW->uSdhz_S.bFlag.bPowerZ=pSW->uSdhz_L.bFlag.bPowerZ = pR->tLostVot.tLostVotTime.boolTrip
  711. && !pSW->uSdhz_S.bFlag.bUABYY && !pSW->uSdhz_S.bFlag.bUBCYY //两侧无压
  712. //&& pR->tSWST.uSWST.bFlag.bHZWZ //在合闸位置
  713. //&& pR->tSWST.uSWST.bFlag.bSXWL; //三相无流
  714. && pSW->uSdhz_S.bFlag.bCYY;
  715. if(soe_check(EV_Z_TIME+sw*EV_SW_NUM)!=pSW->uSdhz_S.bFlag.bPowerZ)//记录SOE
  716. soe_record_ev(EV_Z_TIME+sw*EV_SW_NUM, pSW->uSdhz_S.bFlag.bPowerZ, Us1,Us2,0 );
  717. }
  718. void fa_s_Dataset(int sw, DWORD dStep)
  719. {
  720. bool bY1;//, bY2, bY3,bQDD1,bQDD2;
  721. TRELAY_T *pR=&g_tRelay[sw];
  722. TSDHZ_T *pSW =&pR->tSDHZ;
  723. TSETSW *pSet = &pRunSet->tSwSet[sw];
  724. bool bgl,bjd=false;
  725. DWORD Us1,Us2;
  726. DWORD Ia,Ib,Ic;
  727. DWORD I0,U0;
  728. int ui_begin;
  729. bool xbQD1=false;
  730. DWORD U01,U02;
  731. //#if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 //潮州局要求合后电流两段处理
  732. #if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  733. bool xbQD2=false;
  734. #endif
  735. bool xbAll=false;
  736. //用于保存故障断面
  737. ui_begin = UI_SW_INDEX_BEGIN(sw);
  738. Us1 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[2]), 256, pRunSet->dKU[PUB_AC_UAB1]);
  739. Us2 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[3]), 256, pRunSet->dKU[pRunSet->pt2vol]);
  740. Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
  741. Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
  742. Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
  743. I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
  744. U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  745. U01 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  746. U02 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U02].m2[0]), 256, g_ui[PUB_AC_U02].m2_factor_k);
  747. //遮断电流
  748. bgl = OverRelay(g_sw[sw].m2_max, pSet->toc[FA_DLBS].dI, pSet->toc[FA_DLBS].dI_fh, 0);//
  749. RunTR(&g_tRelay[sw].tOC[FA_DLBS].tQDTime,bgl && !pR->tSWST.uSWST.bFlag.bFAWL, dStep);
  750. pR->bBSTZ = g_tRelay[sw].tOC[FA_DLBS].tQDTime.boolTrip&&pSet->toc[FA_DLBS].bTz;
  751. pR->tOC[FA_DLBS].sta.bFlag.bGj = pR->tOC[FA_DLBS].sta.bFlag.bTz =pR->tOC[FA_DLBS].sta.bFlag.bDzLed = pR->bBSTZ;
  752. if(soe_check(EV_BSTZ+sw*EV_SW_NUM)!=pR->bBSTZ)//记录SOE
  753. soe_record_ev(EV_BSTZ+sw*EV_SW_NUM, pR->bBSTZ, Ia,Ib,Ic );
  754. //相间故障谐波
  755. xbQD1 = fa_XBCalc(sw,pSet->toc[FA_GL].dI);
  756. RunTR(&g_tRelay[sw].tOC[FA_GL].tXBTime, xbQD1, dStep);//谐波含量
  757. //xbQD1 = g_tRelay[sw].tOC[FA_GL].tXBTime.boolTrip;
  758. //#if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 //潮州局要求合后电流两段处理
  759. #if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  760. xbQD2 = fa_XBCalc(sw,pSet->toc[FA_GL_II].dI);
  761. RunTR(&g_tRelay[sw].tOC[FA_GL_II].tXBTime, xbQD2, dStep);//谐波含量
  762. //xbQD2 = g_tRelay[sw].tOC[FA_GL_II].tXBTime.boolTrip;
  763. #else
  764. g_tRelay[sw].tOC[FA_GL_II].tXBTime.boolTrip=false;
  765. #endif
  766. xbAll = (g_tRelay[sw].tOC[FA_GL].tXBTime.boolTrip||g_tRelay[sw].tOC[FA_GL_II].tXBTime.boolTrip);
  767. if(FA_ALL_EN(sw))
  768. {
  769. if(soe_check(EV_XBBS+sw*EV_SW_NUM)!=xbAll) //记录谐波SOE
  770. {
  771. if(pSW->S_Status==S_YTIME || pSW->L_Status==L_YL_TIME)//非Y时限内,不产生谐波闭锁SOE
  772. soe_record_ev(EV_XBBS+sw*EV_SW_NUM, xbAll, 0,0,0 );
  773. else if(soe_check(EV_XBBS+sw*EV_SW_NUM))
  774. soe_record_ev(EV_XBBS+sw*EV_SW_NUM, 0, 0,0,0 );
  775. }
  776. }
  777. //相间故障
  778. bgl = OverRelay(g_sw[sw].m2_max, pSet->toc[FA_GL].dI, pSet->toc[FA_GL].dI_fh, pSW->uSdhz_S.bFlag.bGL) && (pSet->bTT_fa_Icheck||pSet->toc[FA_GL].bTz);//
  779. pR->tOC[FA_GL].sta.bFlag.bQD = bgl; // add xxxxxx 20220705 需要置上启动标志,否则会启动后马上进入整组复归
  780. #ifdef EV_GL_STATR
  781. gl_start_soe_set( bgl,sw,EV_FA_GL_START);
  782. #endif
  783. RunTR(&pSW->tGZJYRstGLTime, bgl&&!xbQD1 ,dStep); //跳闸位置、超过故障记忆过流复归时间,清跳闸次数
  784. pSW->uSdhz_S.bFlag.bGL=pSW->uSdhz_L.bFlag.bGL = pSW->tGZJYRstGLTime.boolTrip && !xbQD1;//时间&&谐波含量
  785. //#if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 //潮州局要求合后电流两段处理
  786. #if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  787. //相间II段故障
  788. bgl = OverRelay(g_sw[sw].m2_max, pSet->toc[FA_GL_II].dI, pSet->toc[FA_GL_II].dI_fh, pSW->uSdhz_S.bFlag.bGL_II) && (pSet->bTT_fa_Icheck||pSet->toc[FA_GL_II].bTz);//
  789. RunTR(&pSW->tGZJYRstGL_II_Time, bgl&&!xbQD2,dStep); //跳闸位置、超过故障记忆过流复归时间,清跳闸次数
  790. pSW->uSdhz_S.bFlag.bGL_II=pSW->uSdhz_L.bFlag.bGL_II = pSW->tGZJYRstGL_II_Time.boolTrip && !xbQD2;//时间&&谐波含量
  791. pR->tOC[FA_GL_II].sta.bFlag.bQD = bgl; // add xxxxxx 20220705 需要置上启动标志,否则会启动后马上进入整组复归
  792. #ifdef GD_AREA_ECZD_2020
  793. gl_start_soe_set( bgl,sw,EV_FA_GL2_START);
  794. #endif
  795. #else
  796. pSW->uSdhz_S.bFlag.bGL_II=pSW->uSdhz_L.bFlag.bGL_II=0;
  797. #endif
  798. //相间告警
  799. #ifdef GD_AREA_ECZD_2020
  800. bgl = OverRelay(g_sw[sw].m2_max, pSet->toc[FA_GL2].dI, pSet->toc[FA_GL2].dI_fh, pSW->uSdhz_S.bFlag.bGL2)
  801. &&(LowRelay(g_sw_pub.m2_min[2], pSet->toc[FA_GL2].dU, pSet->toc[FA_GL2].dU_fh, pSW->uSdhz_S.bFlag.bGL2)||OverRelay(Us1_120.vect2, pSet->toc[FA_GL2].dU2, pSet->toc[FA_GL2].dU2_fh, pSW->uSdhz_S.bFlag.bGL2))
  802. &&(pSet->bTT_fa_gl2);
  803. #else
  804. bgl = OverRelay(g_sw[sw].m2_max, pSet->toc[FA_GL2].dI, pSet->toc[FA_GL2].dI_fh, pSW->uSdhz_S.bFlag.bGL2)&&(pSet->bTT_fa_gl2);
  805. #endif
  806. pR->tOC[FA_GL2].sta.bFlag.bQD = bgl; // add xxxxxx 20220705 需要置上启动标志,否则会启动后马上进入整组复归
  807. #ifdef FUN_JDXX
  808. bjd |= ((soe_check(EV_JDXX_TZ+sw*EV_SW_NUM) || soe_check(EV_JDXX_GJ+sw*EV_SW_NUM)) ? true : false);
  809. #endif
  810. RunTR(&pSW->tGZJYRstGL2Time, bgl,dStep); //跳闸位置、超过故障记忆过流复归时间,清跳闸次数
  811. pSW->uSdhz_S.bFlag.bGL2 = pSW->tGZJYRstGL2Time.boolTrip;
  812. pR->tOC[FA_GL2].sta.bFlag.bGj = pR->tOC[FA_GL2].sta.bFlag.bGjLed = pSW->uSdhz_S.bFlag.bGL2;
  813. if(soe_check(EV_FA_GL_GJ+sw*EV_SW_NUM)!=pSW->uSdhz_S.bFlag.bGL2)//记录SOE
  814. soe_record_ev(EV_FA_GL_GJ+sw*EV_SW_NUM, pSW->uSdhz_S.bFlag.bGL2, Ia,Ib,Ic );
  815. if(soe_check(EV_FA_GL_TZ+sw*EV_SW_NUM)&& !soe_check(EV_FA_GL_GJ+sw*EV_SW_NUM))
  816. {
  817. soe_record_ev(EV_FA_GL_TZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  818. }
  819. //接地故障
  820. bjd = OverRelay(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].m2[0], pSet->toc[FA_LX].dI, pSet->toc[FA_LX].dI_fh,pSW->uSdhz_S.bFlag.bJD) && (pSet->bTT_fa_Icheck||pSet->toc[FA_LX].bTz);
  821. pR->tOC[FA_LX].sta.bFlag.bQD = bjd; // add xxxxxx 20220705 需要置上启动标志,否则会启动后马上进入整组复归
  822. #ifdef EV_GL_STATR
  823. lx_start_soe_set( bjd,sw,EV_FA_LX_START);
  824. #endif
  825. RunTR(&pSW->tGZJYRstJDTime, bjd,dStep); //跳闸位置、超过故障记忆过流复归时间,清跳闸次数
  826. pSW->uSdhz_S.bFlag.bJD=pSW->uSdhz_L.bFlag.bJD=pSW->tGZJYRstJDTime.boolTrip;
  827. //接地告警
  828. bjd = OverRelay(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].m2[0], pSet->toc[FA_LX2].dI, pSet->toc[FA_LX2].dI_fh, pSW->uSdhz_S.bFlag.bJD2) && (pSet->bTT_fa_lx2);
  829. pR->tOC[FA_LX2].sta.bFlag.bQD = bjd; // add xxxxxx 20220705 需要置上启动标志,否则会启动后马上进入整组复归
  830. RunTR(&pSW->tGZJYRstJD2Time, bjd,dStep); //跳闸位置、超过故障记忆过流复归时间,清跳闸次数
  831. pSW->uSdhz_S.bFlag.bJD2=pSW->tGZJYRstJD2Time.boolTrip;
  832. pR->tOC[FA_LX2].sta.bFlag.bGj = pSW->uSdhz_S.bFlag.bJD2;
  833. if(soe_check(EV_FA_LX_GJ+sw*EV_SW_NUM)!=pSW->uSdhz_S.bFlag.bJD2)//记录SOE
  834. soe_record_ev(EV_FA_LX_GJ+sw*EV_SW_NUM, pSW->uSdhz_S.bFlag.bJD2, I0, U01>U02?U01:U02,0 );
  835. #ifdef GD_AREA_ZHONGSHAN_2020//中山2020要求Y时间内失压,且FA二段或者零序一段满足条件后报Y闭锁 2020-10-24
  836. RunTR(&pSW->tOnOCingTime, soe_check(EV_FA_GL2_START+sw*EV_SW_NUM),dStep);
  837. RunTR(&pSW->tOnLXingTime, soe_check(EV_FA_LX_START+sw*EV_SW_NUM),dStep);
  838. pSW->uSdhz_S.bFlag.bOCing = (pSW->tOnOCingTime.boolTrip||pSW->tOnLXingTime.boolTrip);
  839. #endif
  840. //零序电压判断
  841. #ifdef GD_AREA_CHAOZHOUFENGXI
  842. bjd = OverRelay(g_ui[PUB_AC_U01].m2[0] >g_ui[PUB_AC_U02].m2[0] ?g_ui[PUB_AC_U01].m2[0]:g_ui[PUB_AC_U02].m2[0], pSet->dU_OverU0, pSet->dU_OverU0_fh, pSW->uSdhz_S.bFlag.bOverU0);
  843. #else
  844. bjd = OverRelay(g_ui[PUB_AC_U01].m2[0], pSet->dU_OverU0, pSet->dU_OverU0_fh, pSW->uSdhz_S.bFlag.bOverU0);
  845. #endif
  846. #ifdef EV_GL_STATR
  847. lx_start_soe_set( bjd,sw,EV_FA_U0_STATR);
  848. #endif
  849. RunTR(&pR->tU0TZ.tZOVTime, bjd,dStep);
  850. pSW->uSdhz_S.bFlag.bOverU0 = pR->tU0TZ.tZOVTime.boolTrip;
  851. pSW->uSdhz_L.bFlag.bOverU0 = pSW->uSdhz_S.bFlag.bOverU0;
  852. pR->tU0TZ.bU0GjLed = 0;
  853. if(pSet->bTT_fa_U0Gj)
  854. pR->tU0TZ.bU0GjLed = pSW->uSdhz_S.bFlag.bOverU0;
  855. if((soe_check(EV_FA_U0GJ+sw*EV_SW_NUM)!=pSW->uSdhz_S.bFlag.bOverU0) && pSet->bTT_fa_U0Gj &&(pSW->S_Status==S_YTIME || pSW->L_Status==L_YL_TIME
  856. #ifdef GD_AREA_HEYUAN_2021
  857. || ((pSW->S_Status==S_USUAL) && pSW->uSdhz_S.bFlag.bYtOn) || ((pSW->L_Status==L_RELAYON) && pSW->uSdhz_L.bFlag.bYtOn)
  858. #endif
  859. ) )
  860. {
  861. soe_record_ev(EV_FA_U0GJ+sw*EV_SW_NUM, pSW->uSdhz_S.bFlag.bOverU0 , U01>U02?U01:U02,I0,0 );
  862. }
  863. if(soe_check(EV_BE_UO+sw*EV_SW_NUM) && !pSW->uSdhz_S.bFlag.bOverU0) // 合前零压返回
  864. soe_record_ev(EV_BE_UO+sw*EV_SW_NUM, 0, 0,0,0 );
  865. #ifdef GD_AREA_HEYUAN_2021
  866. if(pR->tSWST.uSWST.bFlag.bDITW)
  867. {
  868. pSW->uSdhz_L.bFlag.bYtOn = false;
  869. pSW->uSdhz_S.bFlag.bYtOn = false;
  870. }
  871. #endif
  872. //残压检测
  873. fa_uf_set(sw, pR->run_stu.fa_ls>0, dStep);
  874. //有压标志
  875. pSW->uSdhz_S.bFlag.bYY = pSW->uSdhz_S.bFlag.bUABYY || pSW->uSdhz_S.bFlag.bUBCYY; //有压
  876. //初始化完成
  877. if((pR->tSWST.uSWST.bFlag.bDIHW && pSW->uSdhz_S.bFlag.bYY) //合位时,无压变有压才能动作
  878. ||(pR->tSWST.uSWST.bFlag.bDITW && !pSW->uSdhz_S.bFlag.bYY))//分位时,有压变无压才能动作
  879. {
  880. pSW->bSDHZinit=1;
  881. }
  882. /*对侧有残压压标志
  883. pSW->uSdhz_S.bFlag.bOppositeUF = (pSW->uSdhz_S.bFlag.bUABFlash && (!pSW->uSdhz_S.bFlag.bPower))
  884. || (pSW->uSdhz_S.bFlag.bUBCFlash && pSW->uSdhz_S.bFlag.bPower);
  885. */
  886. //对侧来电
  887. bY1 = ((pSW->uSdhz_S.bFlag.bUABYY && (!pSW->uSdhz_S.bFlag.bUBCYY) && (!pSW->uSdhz_S.bFlag.bPower))
  888. ||((!pSW->uSdhz_S.bFlag.bUABYY) && pSW->uSdhz_S.bFlag.bUBCYY && pSW->uSdhz_S.bFlag.bPower));
  889. RunTR(&pSW->tOpsiteYY100ms, bY1, dStep);
  890. pSW->uSdhz_S.bFlag.bOppositeYY = pSW->tOpsiteYY100ms.boolTrip && pSet->bTT_fa_poweron && pSet->bTT_fa_lineon;
  891. //上电侧来电
  892. bY1 = ((pSW->uSdhz_S.bFlag.bUABYY && (!pSW->uSdhz_S.bFlag.bUBCYY) && (pSW->uSdhz_S.bFlag.bPower))
  893. || ((!pSW->uSdhz_S.bFlag.bUABYY) && pSW->uSdhz_S.bFlag.bUBCYY && (!pSW->uSdhz_S.bFlag.bPower)));
  894. RunTR(&pSW->tPowerYY100ms, bY1, dStep);
  895. pSW->uSdhz_S.bFlag.bPowerYY = pSW->tPowerYY100ms.boolTrip;
  896. }
  897. static void fa_unlock_s_bs(int sw)
  898. {
  899. if(soe_check(EV_BS_X_L+sw*EV_SW_NUM)==true) //
  900. {
  901. soe_record_ev(EV_BS_X_L+sw*EV_SW_NUM, 0, 0,0,0 );
  902. }
  903. if(soe_check(EV_BS_X_P+sw*EV_SW_NUM)==true) //
  904. {
  905. soe_record_ev(EV_BS_X_P+sw*EV_SW_NUM, 0, 0,0,0 );
  906. }
  907. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==true) //
  908. {
  909. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 0, 0,0,0 );
  910. }
  911. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==true) //
  912. {
  913. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 0, 0,0,0 );
  914. }
  915. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true) //
  916. {
  917. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 0, 0,0,0 );
  918. }
  919. if(soe_check(EV_BSBE_U0+sw*EV_SW_NUM)==true) //
  920. {
  921. soe_record_ev(EV_BSBE_U0+sw*EV_SW_NUM, 0, 0,0,0 );
  922. }
  923. if(soe_check(EV_BS_DB+sw*EV_SW_NUM)==true) //
  924. {
  925. soe_record_ev(EV_BS_DB+sw*EV_SW_NUM, 0, 0,0,0 );
  926. }
  927. #ifdef GD_AREA_ZHONGSHAN_FTU
  928. if(!g_tRelay[sw].run_stu.bs_bhz)
  929. #endif
  930. {
  931. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)==true) //
  932. {
  933. soe_record_ev(EV_BS_HA+sw*EV_SW_NUM, 0, 0,0,0 );
  934. }
  935. }
  936. if(soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==true) //
  937. {
  938. soe_record_ev(EV_BS_UF_P+sw*EV_SW_NUM, 0, 0,0,0 );
  939. }
  940. if(soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==true) //
  941. {
  942. soe_record_ev(EV_BS_UF_L+sw*EV_SW_NUM, 0, 0,0,0 );
  943. }
  944. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  945. {
  946. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0,0 );
  947. }
  948. if(soe_check(EV_BS_FZMORE+sw*EV_SW_NUM)==true)
  949. {
  950. soe_record_ev(EV_BS_FZMORE+sw*EV_SW_NUM, 0, 0,0,0 );
  951. }
  952. //if(soe_check(EV_GOOSE_GZBS_FA)==true) // goose故障闭锁
  953. // soe_record_ev(EV_GOOSE_GZBS_FA, 0, 0,0,0 );
  954. //if(soe_check(EV_GOOSE_TZBS_FA)==true) // goose故障闭锁
  955. // soe_record_ev(EV_GOOSE_TZBS_FA, 0, 0,0,0 );
  956. #ifdef FA_OC_COUNT
  957. if(soe_check(EV_BS_OC_COUNT+sw*EV_SW_NUM)==true)
  958. {
  959. soe_record_ev(EV_BS_OC_COUNT+sw*EV_SW_NUM, 0, 0,0,0 );
  960. }
  961. g_tRelay[sw].tSDHZ.fa_oc_count=0;
  962. #endif
  963. #ifdef GD_AREA_CHAOZHOUFENGXI//潮州合前零压不允许直接解锁 2021-4-27
  964. if(soe_check(EV_BE_UO+sw*EV_SW_NUM)==true) //
  965. {
  966. soe_record_ev(EV_BE_UO+sw*EV_SW_NUM, 0, 0,0,0 );
  967. }
  968. #endif
  969. fa_s_set_savestatus(sw);
  970. }
  971. static bool fa_check_s_bs_hz(int sw)
  972. {
  973. #if 0
  974. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true) //
  975. {
  976. return true;
  977. }
  978. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true) //
  979. {
  980. return true;
  981. }
  982. #endif
  983. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)==true) //
  984. {
  985. return true;
  986. }
  987. #ifdef FA_OC_COUNT
  988. if(soe_check(EV_BS_OC_COUNT+sw*EV_SW_NUM)==true) //
  989. {
  990. return true;
  991. }
  992. #endif
  993. if(soe_check(EV_BS_FZMORE+sw*EV_SW_NUM)==true) //
  994. {
  995. return true;
  996. }
  997. #ifdef YK_FA_ENBLE
  998. if(soe_check(EV_YK_BS_FA+sw*EV_SW_NUM)==true) //
  999. {
  1000. return true;
  1001. }
  1002. #endif
  1003. #ifdef GD_AREA_CHAOZHOUFENGXI
  1004. if(soe_check(EV_BSBE_U0+sw*EV_SW_NUM)==true) //
  1005. {
  1006. return true;
  1007. }
  1008. #endif
  1009. if(g_tRelay[sw].tDYJL.bLed==true)
  1010. {
  1011. return true;
  1012. }
  1013. #ifndef GD_AREA_ECZD_MEIZHOU_2021
  1014. if(g_tRelay[sw].tPLJL.bLed==true)
  1015. {
  1016. return true;
  1017. }
  1018. #endif
  1019. if(soe_check(EV_GOOSE_GZBS_FA)==true) // goose故障闭锁
  1020. return true;
  1021. if(soe_check(EV_GOOSE_TZBS_FA)==true) // goose故障闭锁
  1022. return true;
  1023. return false;
  1024. }
  1025. static void fa_unlock_l_bs(int sw)
  1026. {
  1027. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)==true) //
  1028. {
  1029. soe_record_ev(EV_BS_HA+sw*EV_SW_NUM, 0, 0,0,0 );
  1030. }
  1031. if(soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==true) //
  1032. {
  1033. soe_record_ev(EV_BS_UF_P+sw*EV_SW_NUM, 0, 0,0,0 );
  1034. }
  1035. if(soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==true) //
  1036. {
  1037. soe_record_ev(EV_BS_UF_L+sw*EV_SW_NUM, 0, 0,0,0 );
  1038. }
  1039. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  1040. {
  1041. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0,0 );
  1042. }
  1043. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true) //
  1044. {
  1045. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 0, 0,0,0 );
  1046. }
  1047. if(soe_check(EV_BS_FZMORE+sw*EV_SW_NUM)==true)
  1048. {
  1049. soe_record_ev(EV_BS_FZMORE+sw*EV_SW_NUM, 0, 0,0,0 );
  1050. }
  1051. /*if(soe_check(EV_GOOSE_GZBS_FA)==true) // goose故障闭锁
  1052. soe_record_ev(EV_GOOSE_GZBS_FA, 0, 0,0,0 );
  1053. if(soe_check(EV_GOOSE_TZBS_FA)==true) // goose故障闭锁
  1054. soe_record_ev(EV_GOOSE_TZBS_FA, 0, 0,0,0 );
  1055. */
  1056. }
  1057. #if 0
  1058. static bool fa_check_l_bs_hz(int sw)
  1059. {
  1060. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)==true) //
  1061. {
  1062. return true;
  1063. }
  1064. return false;
  1065. }
  1066. #endif
  1067. static bool fa_check_all_l_bs(int sw)
  1068. {
  1069. bool bY=false;
  1070. bY=0
  1071. ||soe_check(EV_BS_UF_P+sw*EV_SW_NUM)
  1072. ||soe_check(EV_BS_UF_L+sw*EV_SW_NUM)
  1073. ||soe_check(EV_HHGZ+sw*EV_SW_NUM)
  1074. ||soe_check(EV_BS_U0+sw*EV_SW_NUM)
  1075. ||soe_check(EV_BS_HA+sw*EV_SW_NUM)
  1076. #ifdef YK_FA_ENBLE
  1077. ||soe_check(EV_YK_BS_FA+sw*EV_SW_NUM)
  1078. #endif
  1079. ||soe_check(EV_GOOSE_GZBS_FA)// goose故障闭锁
  1080. ||soe_check(EV_GOOSE_TZBS_FA);// goose故障闭锁
  1081. if(bY)
  1082. {
  1083. if(soe_check(EV_BS_ALL+sw*EV_SW_NUM)==false)
  1084. {
  1085. soe_record_ev(EV_BS_ALL+sw*EV_SW_NUM, 1, 0,0,0 );
  1086. }
  1087. }
  1088. else
  1089. {
  1090. if(soe_check(EV_BS_ALL+sw*EV_SW_NUM)==true)
  1091. {
  1092. soe_record_ev(EV_BS_ALL+sw*EV_SW_NUM, 0, 0,0,0 );
  1093. }
  1094. }
  1095. return bY;
  1096. }
  1097. bool fa_check_auto_l_bs(int sw)
  1098. {
  1099. bool bY=false;
  1100. bY=0
  1101. //||soe_check(EV_BS_U0+sw*EV_SW_NUM)
  1102. ||soe_check(EV_BS_HA+sw*EV_SW_NUM);
  1103. return bY;
  1104. }
  1105. void fa_rstbs_soe(int sw)
  1106. {
  1107. if(soe_check(EV_BS_X_P+sw*EV_SW_NUM)==true)
  1108. {
  1109. soe_record_ev(EV_BS_X_P+sw*EV_SW_NUM, 0, 0,0,0 );
  1110. }
  1111. if(soe_check(EV_BS_X_L+sw*EV_SW_NUM)==true)
  1112. {
  1113. soe_record_ev(EV_BS_X_L+sw*EV_SW_NUM, 0, 0,0,0 );
  1114. }
  1115. #ifndef FA_BSYTIME_JS //不允许直接解锁
  1116. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==true)
  1117. {
  1118. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 0, 0,0,0 );
  1119. }
  1120. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==true)
  1121. {
  1122. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 0, 0,0,0 );
  1123. }
  1124. if(soe_check(EV_HHGZ_P+sw*EV_SW_NUM)==true)
  1125. {
  1126. soe_record_ev(EV_HHGZ_P+sw*EV_SW_NUM, 0, 0,0,0 );
  1127. }
  1128. if(soe_check(EV_HHGZ_L+sw*EV_SW_NUM)==true)
  1129. {
  1130. soe_record_ev(EV_HHGZ_L+sw*EV_SW_NUM, 0, 0,0,0 );
  1131. }
  1132. #endif
  1133. if(soe_check(EV_BS_DB+sw*EV_SW_NUM)==true)
  1134. {
  1135. soe_record_ev(EV_BS_DB+sw*EV_SW_NUM, 0, 0,0,0 );
  1136. }
  1137. if(soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==true)
  1138. {
  1139. soe_record_ev(EV_BS_UF_P+sw*EV_SW_NUM, 0, 0,0,0 );
  1140. }
  1141. if(soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==true)
  1142. {
  1143. soe_record_ev(EV_BS_UF_L+sw*EV_SW_NUM, 0, 0,0,0 );
  1144. }
  1145. if(soe_check(EV_JS_HA+sw*EV_SW_NUM)==true) //
  1146. {
  1147. soe_record_ev(EV_JS_HA+sw*EV_SW_NUM, 0, 0,0,0 );
  1148. }
  1149. if(soe_check(EV_JS_HZ+sw*EV_SW_NUM)==true) //
  1150. {
  1151. soe_record_ev(EV_JS_HZ+sw*EV_SW_NUM, 0, 0,0,0 );
  1152. }
  1153. #ifndef GD_AREA_CHAOZHOUFENGXI//潮州合前零压不允许直接解锁 2021-4-27
  1154. if(soe_check(EV_BE_UO+sw*EV_SW_NUM)==true) //
  1155. {
  1156. soe_record_ev(EV_BE_UO+sw*EV_SW_NUM, 0, 0,0,0 );
  1157. }
  1158. #endif
  1159. if(soe_check(EV_FA_GL_TZ+sw*EV_SW_NUM)==true)
  1160. soe_record_ev(EV_FA_GL_TZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  1161. //#if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 //潮州局要求合后电流两段处理
  1162. #if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  1163. if(soe_check(EV_FA_GL_TZ2+sw*EV_SW_NUM)==true)
  1164. soe_record_ev(EV_FA_GL_TZ2+sw*EV_SW_NUM, 0, 0,0 ,0 );
  1165. #endif
  1166. if(soe_check(EV_FA_LX_TZ+sw*EV_SW_NUM)==true)
  1167. soe_record_ev(EV_FA_LX_TZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  1168. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true)
  1169. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 0, 0,0 ,0 );
  1170. if(soe_check(EV_FA_FZ+sw*EV_SW_NUM)==true) //
  1171. soe_record_ev(EV_FA_FZ+sw*EV_SW_NUM, 0, 0,0,0 );
  1172. if(soe_check(EV_X_SWFAIL+sw*EV_SW_NUM)==true) //
  1173. soe_record_ev(EV_X_SWFAIL+sw*EV_SW_NUM, 0, 0,0,0 );
  1174. if(soe_check(EV_SH_BSFZ+sw*EV_SW_NUM)==true) //
  1175. soe_record_ev(EV_SH_BSFZ+sw*EV_SW_NUM, 0, 0,0,0 );
  1176. }
  1177. void fa_change_status_print(WORD oldStatus,WORD newStatus,const char **str)
  1178. {
  1179. if(oldStatus==newStatus)
  1180. return;
  1181. rt_printf_time("status: %s -> %s \r\n",str[oldStatus],str[newStatus]);
  1182. }
  1183. //S 状态转换
  1184. void fa_s_state_change(int sw,int state)
  1185. {
  1186. TRELAY_T *pR=&g_tRelay[sw];
  1187. TSDHZ_T *pSW = &pR->tSDHZ;
  1188. #ifdef FA_BSYTIME_JS
  1189. if(pSW->uSdhz_S.bFlag.bTempJS && S_YTIME==pSW->S_Status && S_BSYTIME==state)//之前已正向闭锁未解锁,再次进入Y闭锁
  1190. pSW->uSdhz_S.bFlag.bTempJS = false;//产生Y闭锁SOE后,再次=TURE
  1191. #endif
  1192. ResetTR(&pSW->tOnXSTime);//X
  1193. if(state!=S_BSHHGZ && state!=S_BSDL)//合后故障/大电流闭锁可以继续报Y闭锁SOE,所以不清Y计时器
  1194. ResetTR(&pSW->tOnYSTime);//Y
  1195. //ResetTR(&pSW->tOnZSTime);//Z
  1196. ResetTR(&pR->tSDHZ.tOnBSTZTime);
  1197. if(pSW->S_Status == state)
  1198. return;
  1199. fa_change_status_print(pSW->S_Status,state,fa_s_status);
  1200. pSW->S_Status = state;
  1201. pSW->s_flag_save=pSW->uSdhz_S.wfFlag;
  1202. pSW->S_Status_save=pSW->S_Status;
  1203. // pSW->uSdhz_S.bFlag.bSNChange = pSW->uSdhz_S.bFlag.bUABYY;
  1204. // pSW->uSdhz_S.bFlag.bPower = pSW->uSdhz_S.bFlag.bUABYY;
  1205. pSW->uSdhz_S.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  1206. }
  1207. static void fa_l_state_change(int sw,int state)
  1208. {
  1209. TRELAY_T *pR=&g_tRelay[sw];
  1210. TSDHZ_T *pSW = &pR->tSDHZ;
  1211. if(pSW->L_Status == state)
  1212. return;
  1213. fa_change_status_print(pSW->L_Status,state,fa_l_status);
  1214. pSW->L_Status = state;
  1215. pSW->l_flag_save=pSW->uSdhz_L.wfFlag;
  1216. pSW->L_Status_save=pSW->L_Status;
  1217. pSW->L_Status = state;
  1218. pSW->uSdhz_L.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  1219. }
  1220. static bool soe_check_pt_ok(u32 sw)
  1221. {
  1222. TSETSW *pSet = &pRunSet->tSwSet[sw];
  1223. if(!pSet->bTT_fa_ptdx)//PT告警
  1224. return true;//未投入,直接返回OK
  1225. return ((soe_check(EV_PT1ERR)==false) && (soe_check(EV_PT2ERR)==false));
  1226. }
  1227. static bool cheak_pt_ok_ing(u32 sw)//检查PT实时状态
  1228. {
  1229. if(!soe_check_pt_ok(sw))
  1230. return FALSE;//返回异常
  1231. if(tPT.tTPT1DXTime.dTimer>T_100ms || tPT.tTPT2DXTime.dTimer>T_100ms)
  1232. return FALSE;//返回异常
  1233. return TRUE;//返回OK
  1234. }
  1235. #ifdef FA_OC_COUNT
  1236. static bool isBs_fa_oc_count(int sw)
  1237. {
  1238. TRELAY_T *pR=&g_tRelay[sw];
  1239. TSDHZ_T *pSW = &pR->tSDHZ;
  1240. TSETSW *pSet = &pRunSet->tSwSet[sw];
  1241. bool bVIok;
  1242. static bool oc_flag;
  1243. bVIok = pSW->uSdhz_S.bFlag.bGL2;
  1244. if(!pSet->bTT_fa_oc_count)//压板退出
  1245. return FALSE;
  1246. if(pSW->fa_oc_count >= pSet->fa_oc_count_m)//次数已满足闭锁条件
  1247. return TRUE;
  1248. if(bVIok)
  1249. {
  1250. if(oc_flag==false)
  1251. {
  1252. //rt_printf("count=%d m=%d\r\n",pSW->fa_oc_count,pSet->fa_oc_count_m);
  1253. pSW->fa_oc_count++ ;
  1254. }
  1255. oc_flag=TRUE;
  1256. }
  1257. else
  1258. {
  1259. oc_flag=FALSE;
  1260. }
  1261. return FALSE;
  1262. }
  1263. #endif
  1264. static void fa_sw_opt(int sw,u16 soeCode)
  1265. {
  1266. TRELAY_T *pR=&g_tRelay[sw];
  1267. TSDHZ_T *pSW =&pR->tSDHZ;
  1268. TU0_T *pU0=&pR->tU0TZ;
  1269. TOC_T *poc ;
  1270. DWORD Us1,Us2;
  1271. DWORD Ia,Ib,Ic;
  1272. DWORD I0,U01,U02;
  1273. int ui_begin;
  1274. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1275. Us1 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[2]), 256, pRunSet->dKU[PUB_AC_UAB1]);
  1276. Us2 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[3]), 256, pRunSet->dKU[pRunSet->pt2vol]);
  1277. Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
  1278. Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
  1279. Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
  1280. I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
  1281. U01 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1282. U02 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U02].m2[0]), 256, g_ui[PUB_AC_U02].m2_factor_k);
  1283. //复归合闸原因SOE
  1284. if(soe_check(EV_YK_HZ+sw*EV_SW_NUM)==true) // 遥控合闸
  1285. soe_record_ev(EV_YK_HZ+sw*EV_SW_NUM,0, 0,0,0 );
  1286. if(soe_check(EV_DL_HZ+sw*EV_SW_NUM)==true) //
  1287. soe_record_ev(EV_DL_HZ+sw*EV_SW_NUM,0, 0,0,0 );
  1288. if(soe_check(EV_HA_HZ+sw*EV_SW_NUM)==true) //
  1289. soe_record_ev(EV_HA_HZ+sw*EV_SW_NUM,0, 0,0,0 );
  1290. switch(soeCode)
  1291. {
  1292. case EV_FA_FZ:
  1293. if(soe_check(EV_FA_FZ+sw*EV_SW_NUM)==false) // EV_FA_FZ
  1294. soe_record_ev(EV_FA_FZ+sw*EV_SW_NUM, 1, Us1,Us2,0 );
  1295. rcd_start(sw,RECORD_TYPE_XLSY, RECORD_LEN_TZQD); //录波类型:跳闸类
  1296. pR->tLostVot.bLostVotLed = true;
  1297. pR->tLostVot.uLostVot.bFlag.bEvent = true;
  1298. pR->tSWST.uSWST.bFlag.bCYY = false; //清曾有压标志
  1299. //ResetTR(&pR->tLostVot.tCYY25ms0ms);
  1300. pR->tLostVot.uLostVot.bFlag.bTz=true;
  1301. //InitTR_Time(&pR->tLostVot.tLostVotTime, pSet->dT_Z, T_20ms); //
  1302. pR->tLostVot.uLostVot.bFlag.bQD=true;
  1303. break;
  1304. case EV_HHGZ://合后故障分:相间、接地、零序电压
  1305. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==false)
  1306. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );
  1307. #if defined GD_AREA_ECZD_2020 && !defined GD_AREA_ZHONGSHAN_2020
  1308. pSW->uSdhz_S.bFlag.bHhgz = true;
  1309. #endif
  1310. if(pSW->uSdhz_S.bFlag.bGL)
  1311. {
  1312. poc = &g_tRelay[sw].tOC[FA_GL];
  1313. //poc->sta.bFlag.bIaQD=true;
  1314. poc->sta.bFlag.bQD = true;
  1315. poc->sta.bFlag.bTz = true;
  1316. poc->sta.bFlag.bTripBak = true;
  1317. poc->sta.bFlag.bDzLed = true;
  1318. poc->sta.bFlag.bGj = true; // 告警
  1319. poc->sta.bFlag.bGjEvent = true;
  1320. poc->tQDTime.boolTrip = true;
  1321. poc->tQD25ms.boolTrip =true;
  1322. if(soe_check(EV_FA_GL_TZ+sw*EV_SW_NUM)==false) //
  1323. soe_record_ev(EV_FA_GL_TZ+sw*EV_SW_NUM, 1, Ia,Ib,Ic );
  1324. if(g_ui[ui_begin + SW_AC_IA].m2[0] > pRunSet->tSwSet[sw].toc[FA_GL].dI)
  1325. {
  1326. pR->bYcRefresh.bAGl = true;
  1327. }
  1328. if(g_ui[ui_begin + SW_AC_IB].m2[0] > pRunSet->tSwSet[sw].toc[FA_GL].dI)
  1329. {
  1330. pR->bYcRefresh.bBGl = true;
  1331. }
  1332. if(g_ui[ui_begin + SW_AC_IC].m2[0] > pRunSet->tSwSet[sw].toc[FA_GL].dI)
  1333. {
  1334. pR->bYcRefresh.bCGl = true;
  1335. }
  1336. rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  1337. poc->sta.bFlag.bQDWave=true;
  1338. }
  1339. else if(pSW->uSdhz_S.bFlag.bGL_II)
  1340. {
  1341. poc = &g_tRelay[sw].tOC[FA_GL_II];
  1342. //poc->sta.bFlag.bIaQD=true;
  1343. poc->sta.bFlag.bQD = true;
  1344. poc->sta.bFlag.bTz = true;
  1345. poc->sta.bFlag.bTripBak = true;
  1346. poc->sta.bFlag.bDzLed = true;
  1347. poc->sta.bFlag.bGj = true; // 告警
  1348. poc->sta.bFlag.bGjEvent = true;
  1349. poc->tQDTime.boolTrip = true;
  1350. poc->tQD25ms.boolTrip =true;
  1351. //#if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 //潮州局要求合后电流两段处理
  1352. #if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  1353. if(soe_check(EV_FA_GL_TZ2+sw*EV_SW_NUM)==false) //
  1354. soe_record_ev(EV_FA_GL_TZ2+sw*EV_SW_NUM, 1, Ia,Ib,Ic );
  1355. #endif
  1356. rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  1357. poc->sta.bFlag.bQDWave=true;
  1358. if(g_ui[ui_begin + SW_AC_IA].m2[0] > pRunSet->tSwSet[sw].toc[FA_GL_II].dI)
  1359. {
  1360. pR->bYcRefresh.bAGl = true;
  1361. }
  1362. if(g_ui[ui_begin + SW_AC_IB].m2[0] > pRunSet->tSwSet[sw].toc[FA_GL_II].dI)
  1363. {
  1364. pR->bYcRefresh.bBGl = true;
  1365. }
  1366. if(g_ui[ui_begin + SW_AC_IC].m2[0] > pRunSet->tSwSet[sw].toc[FA_GL_II].dI)
  1367. {
  1368. pR->bYcRefresh.bCGl = true;
  1369. }
  1370. }
  1371. else if (pSW->uSdhz_S.bFlag.bJD)
  1372. {
  1373. poc = &g_tRelay[sw].tOC[FA_LX];
  1374. poc->sta.bFlag.bQD = true;
  1375. poc->sta.bFlag.bTz = true;
  1376. poc->sta.bFlag.bTripBak = true;
  1377. poc->sta.bFlag.bDzLed = true;
  1378. poc->sta.bFlag.bGj = true; // 告警
  1379. poc->sta.bFlag.bGjEvent = true;
  1380. if(soe_check(EV_FA_LX_TZ+sw*EV_SW_NUM)==false) //
  1381. soe_record_ev(EV_FA_LX_TZ+sw*EV_SW_NUM, 1, I0, U01>U02?U01:U02,0 );
  1382. rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD); //录波类型:跳闸类
  1383. poc->sta.bFlag.bQDWave=true;
  1384. if(g_ui[ui_begin + SW_AC_I0].m2[0] > pRunSet->tSwSet[sw].toc[FA_LX].dI)
  1385. {
  1386. pR->bYcRefresh.bLx = true;
  1387. }
  1388. }
  1389. else if (pSW->uSdhz_S.bFlag.bOverU0)
  1390. {
  1391. pU0->uZOV.bFlag.bQD = true;
  1392. pU0->uZOV.bFlag.bTz = true;
  1393. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==false)
  1394. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 1, U01>U02?U01:U02,I0 ,0 );
  1395. rcd_start(sw,RECORD_TYPE_LXDY, RECORD_LEN_TZQD);
  1396. pU0->uZOV.bFlag.bEvent = true;
  1397. pU0->bU0Led = true;
  1398. }
  1399. else
  1400. {
  1401. rt_printf_time("error HHGZ\r\n");
  1402. if(soe_check(EV_FA_FZ+sw*EV_SW_NUM)==false) // EV_FA_FZ
  1403. soe_record_ev(EV_FA_FZ+sw*EV_SW_NUM, 1, Us1,Us2,0 );
  1404. rcd_start(sw,RECORD_TYPE_XLSY, RECORD_LEN_TZQD); //录波类型:跳闸类
  1405. pR->tLostVot.bLostVotLed = true;
  1406. pR->tLostVot.uLostVot.bFlag.bEvent = true;
  1407. pR->tSWST.uSWST.bFlag.bCYY = false; //清曾有压标志
  1408. pR->tLostVot.uLostVot.bFlag.bTz=true;
  1409. pR->tLostVot.uLostVot.bFlag.bQD=true;
  1410. //fa_s_state_change(sw,S_INIT);
  1411. }
  1412. break;
  1413. }
  1414. }
  1415. #ifdef FA_BSYTIME_JS
  1416. static void rst_ybs_soe(int sw)
  1417. {
  1418. TRELAY_T *pR=&g_tRelay[sw];
  1419. TSDHZ_T *pSW = &pR->tSDHZ;
  1420. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==true)
  1421. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 0, 0,0,0 );
  1422. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==true)
  1423. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 0, 0,0,0 );
  1424. if(soe_check(EV_HHGZ_P+sw*EV_SW_NUM)==true)
  1425. soe_record_ev(EV_HHGZ_P+sw*EV_SW_NUM, 0, 0,0,0 );
  1426. if(soe_check(EV_HHGZ_L+sw*EV_SW_NUM)==true)
  1427. soe_record_ev(EV_HHGZ_L+sw*EV_SW_NUM, 0, 0,0,0 );
  1428. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  1429. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0,0 );
  1430. pR->tU0TZ.bU0Led=false;
  1431. pSW->uSdhz_S.bFlag.bTempJS = false;
  1432. fa_close_led(sw);
  1433. }
  1434. void fa_s_bsYtime_js(int sw, DWORD dStep)
  1435. {
  1436. TRELAY_T *pR=&g_tRelay[sw];
  1437. TSDHZ_T *pSW = &pR->tSDHZ;
  1438. //TSETSW *pSet = &pRunSet->tSwSet[sw];
  1439. {
  1440. //fa_rstbs_soe(sw);
  1441. fa_s_state_change(sw,S_INIT);//pSW->S_Status = S_INIT; //返回初始状态
  1442. //pSW->uSdhz_S.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  1443. pSW->uSdhz_S.bFlag.bUABFlash = false;
  1444. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  1445. }
  1446. pSW->uSdhz_S.bFlag.bTempJS = TRUE;
  1447. ResetTR(&pSW->tOnY_JSTime); //js时间计数
  1448. }
  1449. #endif
  1450. /**************************************************************************
  1451. 函数名称:Pro_S_Status_Run
  1452. 函数版本:1.00
  1453. 作者: 电力产品开发部
  1454. 创建日期:2011.10.28
  1455. 函数功能说明:分段开关状态流程
  1456. 输入参数:
  1457. 其他输入:
  1458. 输出参数:
  1459. 返回值:
  1460. ***************************************************************************/
  1461. static void fa_s_status_run(int sw, DWORD dStep)
  1462. {
  1463. TRELAY_T *pR=&g_tRelay[sw];
  1464. TSDHZ_T *pSW = &pR->tSDHZ;
  1465. TSETSW *pSet = &pRunSet->tSwSet[sw];
  1466. bool bVTok,bVIok,bUoOk;
  1467. DWORD U01 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1468. DWORD U02 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U02].m2[0]), 256, g_ui[PUB_AC_U02].m2_factor_k);
  1469. #ifdef FA_PL_PJ
  1470. bool bFreq0,bFreq1;
  1471. float freq0,freq1;
  1472. #endif
  1473. #ifdef GD_AREA_ECZD_MEIZHOU_2021
  1474. static bool bLockHZ=false;
  1475. #endif
  1476. if(!pSW->bSDHZinit) return;//#ifdef GD_AREA_ZHONGSHAN_2020
  1477. #ifdef FA_PL_PJ
  1478. if(pRunSet->bTT_judgeFreq)
  1479. {
  1480. //频率在要求范围内
  1481. freq0=freq_get(0);
  1482. freq1=freq_get(1);
  1483. //电源1频率判断
  1484. if((freq0>=48.9) && (freq0<=50.9))
  1485. {
  1486. bFreq0 = true;
  1487. }
  1488. else
  1489. {
  1490. bFreq0 = false;
  1491. }
  1492. //电源2频率判断
  1493. if((freq1>=48.9) && (freq1<=50.9))
  1494. {
  1495. bFreq1 = true;
  1496. }
  1497. else
  1498. {
  1499. bFreq1 = false;
  1500. }
  1501. }
  1502. else
  1503. {
  1504. bFreq0 = true;
  1505. bFreq1 = true;
  1506. }
  1507. #endif
  1508. #if defined GD_AREA_ECZD_2020
  1509. if(!pSW->uSdhz_S.bFlag.bYY)
  1510. {
  1511. pSW->uSdhz_S.bFlag.bJS=false;
  1512. }
  1513. #endif
  1514. switch(pSW->S_Status)
  1515. {
  1516. case S_INIT:
  1517. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  1518. pSW->uSdhz_S.bFlag.bBsXtime_P = false;
  1519. pSW->uSdhz_S.bFlag.bBsXtime_L = false;
  1520. #endif
  1521. #ifdef FA_OC_COUNT
  1522. if(pSet->bTT_fa_oc_count && pR->tSWST.uSWST.bFlag.bDIHW)
  1523. {
  1524. fa_s_state_change(sw,S_USUAL);
  1525. return; //开关在合闸位置且双侧有压,进入正常运行态
  1526. }
  1527. #endif
  1528. if((!pSet->bTT_fa_poweron)&&(!pSet->bTT_fa_lineon))
  1529. {
  1530. fa_uf_clear(sw,false);//两侧上电合闸压板退出,清残压标志
  1531. return;
  1532. }
  1533. if(pR->tSWST.uSWST.bFlag.bDIHW && pSW->uSdhz_S.bFlag.bUABYY && pSW->uSdhz_S.bFlag.bUBCYY)
  1534. {
  1535. //rt_printf("双侧有压,开关合位 %d %d \r\n",pSW->uSdhz_S.bFlag.bUABYY,pSW->uSdhz_S.bFlag.bUBCYY);
  1536. fa_s_state_change(sw,S_USUAL);
  1537. pSW->bSDHZinit=1;
  1538. return; //开关在合闸位置且双侧有压,进入正常运行态
  1539. }
  1540. ResetTR(&pSW->tOnXSTime);
  1541. ResetTR(&pSW->tOnYSTime);
  1542. ResetTR(&pSW->tOnZSTime);
  1543. #ifdef FA_PL_PJ
  1544. ResetTR(&pSW->tFREQSAB25ms);
  1545. ResetTR(&pSW->tFREQSBC25ms);
  1546. #endif
  1547. #ifdef GD_AREA_ECZD_MEIZHOU_2021
  1548. if(pR->tPLJL.sta.bFlag.bTz || bLockHZ)
  1549. {//中山局要求频率解列后需判掉电再上电的过程才允许得电合闸
  1550. fa_uf_clear(sw,false);
  1551. if(pSW->uSdhz_S.bFlag.bYY)
  1552. {
  1553. bLockHZ = true;
  1554. return;
  1555. }
  1556. else
  1557. {
  1558. bLockHZ = false;
  1559. }
  1560. }
  1561. #endif
  1562. if (pSW->uSdhz_S.bFlag.bUABFlash||pSW->uSdhz_S.bFlag.bUBCFlash) //如果对侧有瞬时电压
  1563. {
  1564. //pSW->S_Status = S_BSFLASH; //进入瞬时电压闭锁状态
  1565. pSW->uSdhz_S.bFlag.bPower = pSW->uSdhz_S.bFlag.bUABFlash;//电压方向保存残压方向
  1566. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  1567. fa_s_state_change(sw,S_BSFLASH);
  1568. return;
  1569. }
  1570. else if (pSW->uSdhz_S.bFlag.bYY) //有压&&PT正常&&soe_check_pt_ok(sw)
  1571. {
  1572. if(pSW->bSDHZinit==0)//先无压再有压
  1573. {
  1574. return;
  1575. }
  1576. if((pSW->uSdhz_S.bFlag.bUabflashDI && !pSW->uSdhz_S.bFlag.bUABYY)
  1577. ||(pSW->uSdhz_S.bFlag.bUbcflashDI && !pSW->uSdhz_S.bFlag.bUBCYY))
  1578. {
  1579. pSW->uSdhz_S.bFlag.bPower = pSW->uSdhz_S.bFlag.bUABYY;//电压方向保存残压方向
  1580. pSW->uSdhz_S.bFlag.bSNChange = !pSW->uSdhz_S.bFlag.bPower;
  1581. fa_s_state_change(sw,S_BSFLASH); //进入瞬时电压闭锁状态
  1582. return;
  1583. }
  1584. pSW->uSdhz_S.bFlag.bPower = pSW->uSdhz_S.bFlag.bUABYY;
  1585. if(pR->tSWST.uSWST.bFlag.bHZWZ)
  1586. {
  1587. fa_s_state_change(sw,S_YTIME);//有压且合位直接进入Y时限
  1588. #ifdef FUNC_DRIVE_JY
  1589. ResetTR(&gb_drive.tDriveFaBSTime);
  1590. #endif
  1591. }
  1592. #ifdef FA_PL_PJ
  1593. else if((pSW->uSdhz_S.bFlag.bUABYY&&pSet->bTT_fa_poweron&&bFreq0) || (pSW->uSdhz_S.bFlag.bUBCYY && pSet->bTT_fa_lineon&&bFreq1))
  1594. #else
  1595. else if((pSW->uSdhz_S.bFlag.bUABYY&&pSet->bTT_fa_poweron) || (pSW->uSdhz_S.bFlag.bUBCYY && pSet->bTT_fa_lineon))
  1596. #endif
  1597. {
  1598. if(pSW->uSdhz_S.bFlag.bJS)
  1599. return;
  1600. #ifdef FUNC_NYY_NWY
  1601. if((pSW->uSdhz_S.bFlag.bUABYY && pSW->uSdhz_S.bFlag.bUBC_NYY_NWY)
  1602. ||(pSW->uSdhz_S.bFlag.bUBCYY && pSW->uSdhz_S.bFlag.bUAB_NYY_NWY))
  1603. return;
  1604. #endif
  1605. fa_s_state_change(sw,S_XTIME);//;//pSW->S_Status = S_TEMP; //进入临时状态
  1606. }
  1607. }
  1608. else if(!pSW->uSdhz_S.bFlag.bYY && pSW->uSdhz_S.bFlag.bUabflashDI!=pSW->uSdhz_S.bFlag.bUbcflashDI)//无压且单侧有残压
  1609. {
  1610. pSW->uSdhz_S.bFlag.bPower = pSW->uSdhz_S.bFlag.bUabflashDI;//电压方向保存残压方向
  1611. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  1612. fa_s_state_change(sw,S_BSFLASH); //进入瞬时电压闭锁状态
  1613. return;
  1614. }
  1615. else if(!pSW->uSdhz_S.bFlag.bYY && pSW->uSdhz_S.bFlag.bUabflashDI&&pSW->uSdhz_S.bFlag.bUbcflashDI)//开机的时候两侧都残压闭锁,等待有压信号
  1616. {
  1617. return;
  1618. }
  1619. else if(!pSW->uSdhz_S.bFlag.bYY)
  1620. {
  1621. pSW->uSdhz_S.bFlag.bJS=false;
  1622. }
  1623. if (pR->tSWST.uSWST.bFlag.bDIHW && !pSW->uSdhz_S.bFlag.bYY) //开关合位且两侧失压
  1624. pR->tSWST.uSWST.bFlag.bCYY=true;
  1625. fa_rstbs_soe(sw);
  1626. break;
  1627. case S_BSFLASH:
  1628. if((pSW->uSdhz_S.bFlag.bUABFlash||pSW->uSdhz_S.bFlag.bUabflashDI)&&!pSW->uSdhz_S.bFlag.bUABYY)
  1629. {
  1630. if(soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==false) // 瞬压闭锁
  1631. {
  1632. soe_record_ev(EV_BS_UF_P+sw*EV_SW_NUM, 1, 0,0,0 );
  1633. }
  1634. pSW->uSdhz_S.bFlag.bUBCFlash=false;
  1635. pSW->uSdhz_S.bFlag.bUbcflashDI=false;
  1636. }
  1637. else if((pSW->uSdhz_S.bFlag.bUBCFlash||pSW->uSdhz_S.bFlag.bUbcflashDI)&&!pSW->uSdhz_S.bFlag.bUBCYY)
  1638. {
  1639. if(soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==false) // 瞬压闭锁
  1640. {
  1641. soe_record_ev(EV_BS_UF_L+sw*EV_SW_NUM, 1, 0,0,0 );
  1642. }
  1643. pSW->uSdhz_S.bFlag.bUABFlash=false;
  1644. pSW->uSdhz_S.bFlag.bUabflashDI=false;
  1645. }
  1646. if(pSW->bSDHZinit==0)
  1647. {
  1648. return;
  1649. }
  1650. if ((pSW->uSdhz_S.bFlag.bUABYY&&((pSW->uSdhz_S.bFlag.bUABFlash||pSW->uSdhz_S.bFlag.bUabflashDI)&&soe_check(EV_BS_UF_P+sw*EV_SW_NUM))) // 本侧检出有压
  1651. ||(pSW->uSdhz_S.bFlag.bUBCYY&&((pSW->uSdhz_S.bFlag.bUBCFlash||pSW->uSdhz_S.bFlag.bUbcflashDI)&&soe_check(EV_BS_UF_L+sw*EV_SW_NUM)))
  1652. )
  1653. {
  1654. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 || defined GD_AREA_CHAOZHOU_2021 || defined GD_AREA_ECZD_2020 || defined GD_AREA_ECZD_MEIZHOU_2021//中山局、广东二次指导意见要求残压经过解锁时间才能解锁
  1655. RunTR(&pSW->tOnJSTime, TRUE , dStep); //js时间计数
  1656. if(!pSW->tOnJSTime.boolTrip)
  1657. break;
  1658. #endif
  1659. if(soe_check(EV_JS_POWER+sw*EV_SW_NUM)==false) // 单侧来电解锁
  1660. {
  1661. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 1, 0,0,0 );
  1662. #ifdef GD_AREA_ECZD_2020
  1663. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 0, 0,0,0 );
  1664. #endif
  1665. }
  1666. fa_uf_clear(sw,false);
  1667. fa_s_state_change(sw,S_INIT);//pSW->S_Status = S_INIT; //进入临时状态
  1668. //pSW->uSdhz_S.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  1669. pSW->uSdhz_S.bFlag.bUABFlash = false;
  1670. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  1671. pSW->uSdhz_S.wfFlag = 0;
  1672. pSW->uSdhz_S.wfFlag = 0;
  1673. pSW->bS_BSLed = 0;
  1674. }
  1675. else
  1676. {
  1677. ResetTR(&pSW->tOnJSTime);
  1678. }
  1679. break;
  1680. case S_XTIME:
  1681. {
  1682. #ifdef GD_AREA_ECZD_MEIZHOU_2021
  1683. if(pR->tPLJL.sta.bFlag.bTz)
  1684. { //X计时过程中频率解列跳闸后回到INIT状态
  1685. fa_s_state_change(sw,S_INIT);
  1686. ResetTR(&pSW->tOnXSTime);
  1687. fa_uf_clear(sw,false);
  1688. return;
  1689. }
  1690. #endif
  1691. #ifdef GD_AREA_ZHONGSHAN
  1692. if(soe_check(EV_HHGZ+sw*EV_SW_NUM))
  1693. {
  1694. if(!(soe_check(EV_HHGZ_P+sw*EV_SW_NUM) && soe_check(EV_HHGZ_L+sw*EV_SW_NUM)))
  1695. {
  1696. if((soe_check(EV_HHGZ_P+sw*EV_SW_NUM) && pSW->uSdhz_S.bFlag.bUBCYY)
  1697. || (soe_check(EV_HHGZ_L+sw*EV_SW_NUM) && pSW->uSdhz_S.bFlag.bUABYY))
  1698. {
  1699. RunTR(&pSW->tOnXSTime, true, dStep); //X时间计数
  1700. }
  1701. else
  1702. {
  1703. ResetTR(&pSW->tOnXSTime);
  1704. }
  1705. if(pSW->tOnXSTime.boolTrip)
  1706. {
  1707. pSW->uSdhz_S.bFlag.bRLONFLAG = TRUE;
  1708. fa_s_state_change(sw,S_YTIME); //进入Y计时状态
  1709. }
  1710. }
  1711. break;
  1712. }
  1713. #endif
  1714. #ifdef FA_PL_PJ
  1715. if(pRunSet->bTT_judgeFreq)
  1716. {
  1717. RunTR(&pSW->tFREQSAB25ms, bFreq0, dStep);
  1718. RunTR(&pSW->tFREQSBC25ms, bFreq1, dStep);
  1719. }
  1720. else
  1721. {
  1722. pSW->tFREQSAB25ms.boolTrip = true;
  1723. pSW->tFREQSBC25ms.boolTrip = true;
  1724. }
  1725. #endif
  1726. #ifdef FA_PL_PJ
  1727. if(pSW->uSdhz_S.bFlag.bYY && !pSW->uSdhz_S.bFlag.bPowerZ && (pSW->tFREQSAB25ms.boolTrip || pSW->tFREQSBC25ms.boolTrip))
  1728. #else
  1729. if(pSW->uSdhz_S.bFlag.bYY && !pSW->uSdhz_S.bFlag.bPowerZ)//无压暂停计时&& soe_check_pt_ok(sw)
  1730. #endif
  1731. {
  1732. if ( pSW->uSdhz_S.bFlag.bPower != pSW->uSdhz_S.bFlag.bUABYY && pSW->uSdhz_S.bFlag.bUABYY != pSW->uSdhz_S.bFlag.bUBCYY) //无压暂停过程中,对侧有压
  1733. {
  1734. #if defined GD_AREA_ZHAOQING_FENGKAI
  1735. if(!pSW->tOnYSTime.boolTrip)//肇庆封开县要求X上电的Y时间内失压为残压
  1736. {
  1737. fa_s_state_change(sw,S_BSFLASH);//
  1738. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  1739. break;
  1740. }
  1741. #endif
  1742. #if defined GD_AREA_ZHONGSHAN_2020
  1743. if(!pSW->tOnYSTime.boolTrip)
  1744. {
  1745. fa_s_state_change(sw,S_BSFLASH);//
  1746. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  1747. break;
  1748. }
  1749. else
  1750. {
  1751. fa_uf_clear(sw,false);
  1752. ResetTR(&pSW->tOnYSTime);
  1753. //fa_s_state_change(sw,S_BSFLASH);//
  1754. //pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  1755. break;
  1756. }
  1757. #endif
  1758. fa_s_state_change(sw,S_BSXTIME);//
  1759. pSW->uSdhz_S.bFlag.bUABFlash = false;
  1760. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  1761. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  1762. }
  1763. else
  1764. {
  1765. RunTR(&pSW->tOnXSTime, TRUE, dStep); //X时间计数
  1766. #if defined GD_AREA_ZHAOQING_FENGKAI || defined GD_AREA_ZHONGSHAN_2020 || defined FA_PL_PJ
  1767. RunTR(&pSW->tOnYSTime,TRUE, dStep);
  1768. #endif
  1769. }
  1770. }
  1771. //合前零压
  1772. if(pSW->uSdhz_S.bFlag.bOverU0 && (pSet->bTT_fa_U0Tz||pSet->bTT_fa_U0Gj))
  1773. {
  1774. if(soe_check(EV_BE_UO+sw*EV_SW_NUM)==false) //
  1775. soe_record_ev(EV_BE_UO+sw*EV_SW_NUM, 1, U01>U02?U01:U02,0,0 );
  1776. #ifdef GD_AREA_CHAOZHOUFENGXI
  1777. if(soe_check(EV_BSBE_U0+sw*EV_SW_NUM)==false) //
  1778. soe_record_ev(EV_BSBE_U0+sw*EV_SW_NUM, 1, U01>U02?U01:U02,0,0 );
  1779. ResetTR(&pSW->tOnXSTime);
  1780. break;//合前零压不走上电合闸,重新X计时 2021-4-15
  1781. #endif
  1782. }
  1783. if (pSW->uSdhz_S.bFlag.bPowerZ&&pR->tSWST.uSWST.bFlag.bFAWL) //如果两侧失压且无流,停电Z
  1784. {
  1785. #if defined GD_AREA_ZHAOQING_FENGKAI || defined GD_AREA_ECZD_MEIZHOU_2021
  1786. if(!pSW->tOnYSTime.boolTrip)//肇庆封开县要求X上电计时的Y时间内失压为残压
  1787. {
  1788. fa_s_state_change(sw,S_BSFLASH);//
  1789. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  1790. break;
  1791. }
  1792. #endif
  1793. #if defined GD_AREA_ZHONGSHAN_2020 //X上电计时的Y时间内失压为残压,否则返回初始状态 2020-12-3
  1794. if(!pSW->tOnYSTime.boolTrip)
  1795. {
  1796. fa_s_state_change(sw,S_BSFLASH);//
  1797. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  1798. break;
  1799. }
  1800. else
  1801. {
  1802. fa_uf_clear(sw,false);
  1803. fa_s_state_change(sw,S_INIT);//
  1804. break;
  1805. }
  1806. #endif
  1807. fa_s_state_change(sw,S_BSXTIME);//pSW->S_Status = S_BSXTIME; //进入X-Z状态,即X计时中的Z计时状态,置X计时暂停标志
  1808. pSW->uSdhz_S.bFlag.bUABFlash = false;
  1809. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  1810. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  1811. //pSW->uSdhz_S.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  1812. }
  1813. else if((pSW->uSdhz_S.bFlag.bPower&&pSW->uSdhz_S.bFlag.bUBCFlash)||(!pSW->uSdhz_S.bFlag.bPower&&pSW->uSdhz_S.bFlag.bUABFlash)) //对侧有残压
  1814. {
  1815. pSW->uSdhz_S.bFlag.bPower=!pSW->uSdhz_S.bFlag.bPower;
  1816. fa_s_state_change(sw,S_BSFLASH);
  1817. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  1818. //pSW->uSdhz_S.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  1819. }
  1820. #ifdef GD_AREA_ZHAOQING_FENGKAI
  1821. else if(pSW->tOnYSTime.boolTrip&&pSW->uSdhz_S.bFlag.bDBYY)
  1822. {
  1823. //过了Y计时且如果双侧有压
  1824. {
  1825. fa_s_state_change(sw,S_BSDOUBLE);//pSW->S_Status = S_BSDOUBLE; //进入双侧电源闭锁状态
  1826. fa_uf_clear(sw,false);
  1827. break;
  1828. }
  1829. }
  1830. #endif
  1831. #ifdef FUNC_NYY_NWY
  1832. else if(pSW->tOnXSTime.boolTrip && ((pSW->uSdhz_S.bFlag.bUABYY && pSW->uSdhz_S.bFlag.bUBC_NYY_NWY)
  1833. ||(pSW->uSdhz_S.bFlag.bUBCYY && pSW->uSdhz_S.bFlag.bUAB_NYY_NWY)))
  1834. {
  1835. ResetTR(&pSW->tOnXSTime);
  1836. fa_uf_clear(sw,false);
  1837. fa_s_state_change(sw,S_INIT);
  1838. break;
  1839. }
  1840. #endif
  1841. else if (pSW->tOnXSTime.boolTrip||pR->tSWST.uSWST.bFlag.bDIHW //如果X计时完毕
  1842. #ifdef FUNC_DRIVE_JY
  1843. || gb_drive.b_fa_reclose
  1844. #endif
  1845. )
  1846. {
  1847. #if 1 //在X计时结束后,仍然双侧有压才判为双电源闭锁
  1848. if(!pR->tSWST.uSWST.bFlag.bDIHW)
  1849. {
  1850. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  1851. if (pSW->uSdhz_S.bFlag.bDBYY||(pSW->uSdhz_S.bFlag.bUABYY&&pSW->uSdhz_S.bFlag.bUBCYY)
  1852. || (pSW->uSdhz_S.bFlag.bUABYY && soe_check(EV_PT2ERR))
  1853. || (pSW->uSdhz_S.bFlag.bUBCYY && soe_check(EV_PT1ERR))
  1854. ) //如果双侧有压,潮州要求就地FA分段PT断线不闭锁得电合
  1855. #else
  1856. if (pSW->uSdhz_S.bFlag.bDBYY||(pSW->uSdhz_S.bFlag.bUABYY&&pSW->uSdhz_S.bFlag.bUBCYY)|| !cheak_pt_ok_ing(sw)) //如果双侧有压
  1857. #endif
  1858. {
  1859. #ifdef FUNC_PRINT_PT_ERR
  1860. if(!cheak_pt_ok_ing(sw))
  1861. {
  1862. rt_printf("分段模式有上电合闸需求但PT断线,不允许合闸!\r\n");
  1863. }
  1864. #endif
  1865. fa_s_state_change(sw,S_BSDOUBLE);//pSW->S_Status = S_BSDOUBLE; //进入双侧电源闭锁状态
  1866. fa_uf_clear(sw,false);
  1867. break;
  1868. }
  1869. }
  1870. #endif
  1871. pSW->uSdhz_S.bFlag.bRLONFLAG = TRUE;
  1872. pSW->uSdhz_S.bFlag.bGL = false;
  1873. pSW->uSdhz_S.bFlag.bGL_II = false;
  1874. pSW->uSdhz_S.bFlag.bJD = false;
  1875. pSW->uSdhz_S.bFlag.bXOverUo=pSW->uSdhz_S.bFlag.bOverU0;
  1876. pR->tU0TZ.uZOV.bFlag.bU0Ov=false;
  1877. pR->tLostVot.uLostVot.bFlag.bStartLock = false;
  1878. pR->tLostVot.uLostVot.bFlag.bGL = false;
  1879. pR->tLostVot.uLostVot.bFlag.bJD = false;
  1880. pR->tLostVot.uLostVot.bFlag.bFault=false;
  1881. pR->tLostVot.uLostVot.bFlag.bSHWY = false;
  1882. ResetTR(&pSW->tGZJYRstGLTime);
  1883. ResetTR(&pSW->tGZJYRstGL_II_Time);
  1884. ResetTR(&pSW->tGZJYRstJDTime);
  1885. ResetTR(&pSW->tGZJYRstGL2Time);
  1886. ResetTR(&pSW->tGZJYRstJD2Time);
  1887. ResetTR(&pSW->tOnYSTime);
  1888. #ifdef FA_PL_PJ
  1889. ResetTR(&pSW->tFREQSAB25ms);
  1890. ResetTR(&pSW->tFREQSBC25ms);
  1891. #endif
  1892. #ifdef FUNC_DRIVE_JY
  1893. ResetTR(&gb_drive.tDriveFaBSTime);
  1894. gb_drive.b_fa_reclose = false;
  1895. gb_drive.b_clear_bs = true;
  1896. #endif
  1897. //ResetTR(&pSW->tOnJSTime); //js时间计数
  1898. pR->tLostVot.uLostVot.bFlag.bSHWY=false;//清手合无压标志
  1899. fa_s_state_change(sw,S_YTIME);//pSW->S_Status = S_YTIME; //进入Y计时状态
  1900. }
  1901. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  1902. if(!pSW->uSdhz_S.bFlag.bUABYY && !pSW->uSdhz_S.bFlag.bUBCYY && !pSW->uSdhz_S.bFlag.bPowerZ && pR->tSWST.uSWST.bFlag.bFAWL)
  1903. { //双侧有压返回但电压未低于无压值时
  1904. ResetTR(&pSW->tOnXSTime);
  1905. fa_s_state_change(sw,S_BSXTIME);
  1906. pSW->uSdhz_S.bFlag.bUABFlash = false;
  1907. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  1908. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  1909. }
  1910. #endif
  1911. }
  1912. break;
  1913. case S_BSXTIME:
  1914. if(pSW->uSdhz_S.bFlag.bPower)
  1915. {
  1916. if(soe_check(EV_BS_X_P+sw*EV_SW_NUM)==false) // x闭锁
  1917. {
  1918. soe_record_ev(EV_BS_X_P+sw*EV_SW_NUM, 1, 0,0,0 );
  1919. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  1920. pSW->uSdhz_S.bFlag.bBsXtime_P = true;
  1921. pSW->uSdhz_S.bFlag.bHzEnable_P = false;
  1922. #endif
  1923. }
  1924. }
  1925. else
  1926. {
  1927. if(soe_check(EV_BS_X_L+sw*EV_SW_NUM)==false) // x闭锁
  1928. {
  1929. soe_record_ev(EV_BS_X_L+sw*EV_SW_NUM, 1, 0,0,0 );
  1930. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  1931. pSW->uSdhz_S.bFlag.bBsXtime_L = true;
  1932. pSW->uSdhz_S.bFlag.bHzEnable_L = false;
  1933. #endif
  1934. }
  1935. }
  1936. #if defined GD_AREA_ZHUHAI_V2
  1937. if (pSW->uSdhz_S.bFlag.bPowerYY && (pSW->uSdhz_S.bFlag.bUABYY||(pSW->uSdhz_S.bFlag.bUBCYY&&pR->run_stu.fa_start_hz))) //上电侧来电
  1938. #elif defined GD_AREA_JIEYANG
  1939. if (pSW->uSdhz_S.bFlag.bPowerYY && (pSW->uSdhz_S.bFlag.bUBCYY||(pSW->uSdhz_S.bFlag.bUABYY&&pR->run_stu.fa_start_hz)))
  1940. #elif defined GD_AREA_ECZD_CHAOZHOU_2022
  1941. if (pSW->uSdhz_S.bFlag.bPowerYY && ((pSW->uSdhz_S.bFlag.bPowerYY == pSW->uSdhz_S.bFlag.bUABYY)?(pSW->uSdhz_S.bFlag.bHzEnable_P):(pSW->uSdhz_S.bFlag.bHzEnable_L))) //上电侧掉电再来电
  1942. #else
  1943. if (pSW->uSdhz_S.bFlag.bPowerYY) //上电侧来电
  1944. #endif
  1945. {
  1946. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 || defined GD_AREA_ECZD_2020 //中山、广东二次指导意见要求X闭锁需经过解锁时间才能解
  1947. RunTR(&pSW->tOnJSTime, TRUE, dStep); //js时间计时器
  1948. if(!pSW->tOnJSTime.boolTrip)
  1949. break;
  1950. #endif
  1951. fa_s_state_change(sw,S_INIT);//pSW->S_Status = S_INIT; //返回初始状态
  1952. if(soe_check(EV_JS_POWER+sw*EV_SW_NUM)==false) // 对侧来电解锁
  1953. {
  1954. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 1, 0,0,0 );
  1955. #ifdef GD_AREA_ECZD_2020
  1956. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 0, 0,0,0 );
  1957. #endif
  1958. }
  1959. pSW->uSdhz_S.bFlag.bUABFlash = false;
  1960. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  1961. }
  1962. #ifdef GD_AREA_ZHONGSHAN_2020
  1963. else if(pSW->uSdhz_S.bFlag.bDBYY)
  1964. {
  1965. RunTR(&pSW->tOnJSTime, TRUE, dStep); //js时间计时器
  1966. if(!pSW->tOnJSTime.boolTrip)
  1967. break;
  1968. fa_s_state_change(sw,S_BSDOUBLE);
  1969. }
  1970. #endif
  1971. else
  1972. {
  1973. ResetTR(&pSW->tOnJSTime); //js时间计时器
  1974. }
  1975. fa_uf_clear(sw,false);
  1976. break;
  1977. case S_BSDOUBLE:
  1978. #ifdef GD_AREA_ZHONGSHAN_2020
  1979. #if 0
  1980. if(soe_check(EV_JS_POWER+sw*EV_SW_NUM)==false) // 对侧来电解锁
  1981. {
  1982. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 1, 0,0,0 );
  1983. }
  1984. #endif
  1985. pSW->uSdhz_S.bFlag.bUABFlash = false;
  1986. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  1987. if(soe_check(EV_BS_X_P+sw*EV_SW_NUM)==true)
  1988. {
  1989. soe_record_ev(EV_BS_X_P+sw*EV_SW_NUM, 0, 0,0,0 );
  1990. }
  1991. if(soe_check(EV_BS_X_L+sw*EV_SW_NUM)==true)
  1992. {
  1993. soe_record_ev(EV_BS_X_L+sw*EV_SW_NUM, 0, 0,0,0 );
  1994. }
  1995. if(soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==true)
  1996. {
  1997. soe_record_ev(EV_BS_UF_P+sw*EV_SW_NUM, 0, 0,0,0 );
  1998. }
  1999. if(soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==true)
  2000. {
  2001. soe_record_ev(EV_BS_UF_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2002. }
  2003. if(soe_check(EV_BE_UO+sw*EV_SW_NUM)==true) //
  2004. {
  2005. soe_record_ev(EV_BE_UO+sw*EV_SW_NUM, 0, 0,0,0 );
  2006. }
  2007. if(soe_check(EV_FA_GL_TZ+sw*EV_SW_NUM)==true)
  2008. {
  2009. soe_record_ev(EV_FA_GL_TZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  2010. }
  2011. if(soe_check(EV_FA_GL_TZ2+sw*EV_SW_NUM)==true)
  2012. {
  2013. soe_record_ev(EV_FA_GL_TZ2+sw*EV_SW_NUM, 0, 0,0 ,0 );
  2014. }
  2015. if(soe_check(EV_FA_LX_TZ+sw*EV_SW_NUM)==true)
  2016. {
  2017. soe_record_ev(EV_FA_LX_TZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  2018. }
  2019. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true)
  2020. {
  2021. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 0, 0,0 ,0 );
  2022. }
  2023. if(soe_check(EV_FA_FZ+sw*EV_SW_NUM)==true) //
  2024. {
  2025. soe_record_ev(EV_FA_FZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2026. }
  2027. if(soe_check(EV_X_SWFAIL+sw*EV_SW_NUM)==true) //
  2028. {
  2029. soe_record_ev(EV_X_SWFAIL+sw*EV_SW_NUM, 0, 0,0,0 );
  2030. }
  2031. if(soe_check(EV_SH_BSFZ+sw*EV_SW_NUM)==true) //
  2032. {
  2033. soe_record_ev(EV_SH_BSFZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2034. }
  2035. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  2036. {
  2037. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2038. }
  2039. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==true)
  2040. {
  2041. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 0, 0,0,0 );
  2042. }
  2043. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==true)
  2044. {
  2045. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2046. }
  2047. if(soe_check(EV_HHGZ_P+sw*EV_SW_NUM)==true)
  2048. {
  2049. soe_record_ev(EV_HHGZ_P+sw*EV_SW_NUM, 0, 0,0,0 );
  2050. }
  2051. if(soe_check(EV_HHGZ_L+sw*EV_SW_NUM)==true)
  2052. {
  2053. soe_record_ev(EV_HHGZ_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2054. }
  2055. #endif
  2056. #ifndef GD_AREA_ZHONGSHAN_2020 //中山2020要求双电源不报双电源闭锁SOE
  2057. if(soe_check(EV_BS_DB+sw*EV_SW_NUM)==false && pSW->uSdhz_S.bFlag.bDBYY) //双电源闭锁
  2058. {
  2059. soe_record_ev(EV_BS_DB+sw*EV_SW_NUM, 1, 0,0,0 );
  2060. }
  2061. #endif
  2062. if (!pSW->uSdhz_S.bFlag.bDBYY&&pSW->uSdhz_S.bFlag.bPowerZ) //如果失压
  2063. {
  2064. fa_uf_clear(sw,false);
  2065. fa_s_state_change(sw,S_INIT);//pSW->S_Status = S_D_ZTIME; //进入D-Z状态
  2066. }
  2067. break;
  2068. case S_YTIME:
  2069. {
  2070. #ifdef GD_AREA_ECZD_MEIZHOU_2021
  2071. if(pR->tPLJL.sta.bFlag.bTz)
  2072. { //Y计时过程中频率解列跳闸后回到INIT状态
  2073. fa_s_state_change(sw,S_INIT);
  2074. ResetTR(&pSW->tOnYSTime);
  2075. fa_uf_clear(sw,false);
  2076. return;
  2077. }
  2078. #endif
  2079. #ifdef GD_AREA_ZHONGSHAN_2020 //中山2020要求手合无压进入Y时间,如果Y时间合后故障则闭锁双侧 2020-12-23
  2080. if((pSW->uSdhz_S.bFlag.bYY && !pSW->uSdhz_S.bFlag.bPowerZ)||pR->tLostVot.uLostVot.bFlag.bSHWY )//无压暂停计时
  2081. RunTR(&pSW->tOnYSTime, TRUE, dStep); //启动Y时间计数
  2082. #else
  2083. if(pSW->uSdhz_S.bFlag.bYY && !pSW->uSdhz_S.bFlag.bPowerZ)//无压暂停计时
  2084. RunTR(&pSW->tOnYSTime, TRUE, dStep); //启动Y时间计数
  2085. #endif
  2086. #ifdef GD_AREA_ZHONGSHAN
  2087. if((soe_check(EV_HHGZ_P+sw*EV_SW_NUM) && !soe_check(EV_HHGZ_L+sw*EV_SW_NUM))
  2088. || (!soe_check(EV_HHGZ_P+sw*EV_SW_NUM) && soe_check(EV_HHGZ_L+sw*EV_SW_NUM)))
  2089. {
  2090. if(!pSW->uSdhz_S.bFlag.bYY)
  2091. {
  2092. ResetTR(&pSW->tOnJSTime);
  2093. fa_s_state_change(sw,S_XTIME);
  2094. fa_sw_opt(sw, EV_FA_FZ);//失压分闸
  2095. }
  2096. RunTR(&pSW->tOnJSTime, (pSW->uSdhz_S.bFlag.bDBYY || pSW->uSdhz_S.bFlag.bOppositeYY) && (soe_check(EV_HHGZ+sw*EV_SW_NUM)==true), dStep);
  2097. if(pSW->tOnJSTime.boolTrip)
  2098. {
  2099. fa_close_led(sw);
  2100. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true)
  2101. {
  2102. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 0, 0,0,0 );
  2103. }
  2104. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  2105. {
  2106. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2107. }
  2108. if(soe_check(EV_HHGZ_P+sw*EV_SW_NUM)==true)
  2109. {
  2110. soe_record_ev(EV_HHGZ_P+sw*EV_SW_NUM, 0, 0,0,0 );
  2111. }
  2112. if(soe_check(EV_HHGZ_L+sw*EV_SW_NUM)==true)
  2113. {
  2114. soe_record_ev(EV_HHGZ_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2115. }
  2116. }
  2117. bVTok=!pSet->bTT_fa_Icheck ; //电压时间型,不判故障电流
  2118. bVIok=(pSW->uSdhz_S.bFlag.bGL||pSW->uSdhz_S.bFlag.bGL_II||pSW->uSdhz_S.bFlag.bJD);//合后故障跳闸
  2119. bUoOk = pSW->uSdhz_S.bFlag.bOverU0 && pSet->bTT_fa_U0Tz && soe_check(EV_BE_UO+sw*EV_SW_NUM)==false;
  2120. if(((bVIok&&pSet->bTT_fa_gzTz)||bUoOk)&& !pR->bBSTZ) //合后有故障 且未遮断闭锁
  2121. {
  2122. fa_sw_opt(sw, EV_HHGZ);//合后故障分闸
  2123. if((soe_check(EV_HHGZ_P+sw*EV_SW_NUM) && pSW->uSdhz_S.bFlag.bUBCYY)
  2124. || (soe_check(EV_HHGZ_L+sw*EV_SW_NUM) && pSW->uSdhz_S.bFlag.bUABYY))
  2125. {
  2126. pSW->uSdhz_S.bFlag.bPower = !pSW->uSdhz_S.bFlag.bPower;
  2127. }
  2128. if(pSet->bTT_fa_gzbshz||bUoOk)//合后故障闭锁合闸
  2129. fa_s_state_change(sw,S_BSHHGZ);
  2130. ResetTR(&pSW->tOnJSTime);
  2131. }
  2132. break;
  2133. }
  2134. #endif
  2135. //X上电合闸失败
  2136. #ifdef FUNC_DRIVE_JY
  2137. //为避免传动合闸时直接进入YTIME而合闸拒动SOE未返回而导致进入错误态;
  2138. //正常逻辑进入YTIME时合闸拒动已返回,无需此延时;
  2139. if(gb_drive.b_clear_bs)
  2140. {
  2141. RunTR(&gb_drive.tDriveFaBSTime,true,dStep);
  2142. if(gb_drive.tDriveFaBSTime.boolTrip)
  2143. {
  2144. gb_drive.b_clear_bs = false;
  2145. if(soe_check(EV_HZFAIL+sw*EV_SW_NUM))
  2146. {
  2147. pSW->uSdhz_S.bFlag.bSNChange = pSW->uSdhz_S.bFlag.bPower;
  2148. if(soe_check(EV_X_SWFAIL+sw*EV_SW_NUM)==false)
  2149. soe_record_ev(EV_X_SWFAIL+sw*EV_SW_NUM, 1, 0,0,0 );
  2150. fa_s_state_change(sw,S_BS_SW);// pSW->uSdhz_S.bFlag.bUABFlash = false;
  2151. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  2152. break;
  2153. }
  2154. }
  2155. }
  2156. else
  2157. #endif
  2158. {
  2159. if(soe_check(EV_HZFAIL+sw*EV_SW_NUM))
  2160. {
  2161. pSW->uSdhz_S.bFlag.bSNChange = pSW->uSdhz_S.bFlag.bPower;
  2162. if(soe_check(EV_X_SWFAIL+sw*EV_SW_NUM)==false)
  2163. soe_record_ev(EV_X_SWFAIL+sw*EV_SW_NUM, 1, 0,0,0 );
  2164. fa_s_state_change(sw,S_BS_SW);// pSW->uSdhz_S.bFlag.bUABFlash = false;
  2165. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  2166. break;
  2167. }
  2168. }
  2169. #ifdef FA_BSYTIME_JS
  2170. #ifdef GD_AREA_ZHONGSHAN
  2171. RunTR(&pSW->tOnY_JSTime, pSW->uSdhz_S.bFlag.bTempJS && !pR->bBSTZ , dStep); //js时间计数
  2172. #else
  2173. RunTR(&pSW->tOnY_JSTime, pSW->uSdhz_S.bFlag.bDBYY&&pSW->uSdhz_S.bFlag.bTempJS && !pR->bBSTZ , dStep); //js时间计数
  2174. #endif
  2175. if(pSW->tOnY_JSTime.boolTrip)
  2176. rst_ybs_soe(sw);
  2177. #endif
  2178. pR->tSWST.uSWST.bFlag.bCYY = true; //防止开关位置遥信未来得及检测到,CYY标志未及时置一,CYY判断开关位置为合状态
  2179. if(pSW->uSdhz_S.bFlag.bGL||pSW->uSdhz_S.bFlag.bGL_II) //合后故障时间内发生故障在判故障时已与控制字关联
  2180. {
  2181. pR->tLostVot.uLostVot.bFlag.bGL = true;
  2182. }
  2183. if(pSW->uSdhz_S.bFlag.bJD) //合后故障时间内发生故障
  2184. {
  2185. pR->tLostVot.uLostVot.bFlag.bJD = true;
  2186. }
  2187. if(pSW->uSdhz_S.bFlag.bOverU0) //合后有接地故障启动零序过压
  2188. {
  2189. pR->tU0TZ.uZOV.bFlag.bU0Ov = true&&(!pSW->uSdhz_S.bFlag.bXOverUo);
  2190. }
  2191. pR->tLostVot.uLostVot.bFlag.bStartLock = pSW->tOnYSTime.boolTrip&&(!pR->tLostVot.uLostVot.bFlag.bGL)&&(!pR->tLostVot.uLostVot.bFlag.bJD); //Y时间内无失压且无故障,启动失压闭锁
  2192. if (pR->tLostVot.uLostVot.bFlag.bGL||pSW->uSdhz_S.bFlag.bGL_II||pR->tLostVot.uLostVot.bFlag.bJD||pR->tU0TZ.uZOV.bFlag.bU0Ov)
  2193. {
  2194. //if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==false)
  2195. //{
  2196. //soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );
  2197. //}
  2198. pR->tLostVot.uLostVot.bFlag.bFault=true;
  2199. }
  2200. bVTok=!pSet->bTT_fa_Icheck ; //电压时间型,不判故障电流
  2201. bVIok=(pSW->uSdhz_S.bFlag.bGL||pSW->uSdhz_S.bFlag.bGL_II||pSW->uSdhz_S.bFlag.bJD);//合后故障跳闸
  2202. bUoOk = pSW->uSdhz_S.bFlag.bOverU0 && pSet->bTT_fa_U0Tz && soe_check(EV_BE_UO+sw*EV_SW_NUM)==false;
  2203. if(((bVIok&&pSet->bTT_fa_gzTz)||bUoOk)&& !pR->bBSTZ) //合后有故障 且未遮断闭锁
  2204. {
  2205. fa_sw_opt(sw, EV_HHGZ);//合后故障分闸
  2206. pSW->uSdhz_S.bFlag.bSNChange = pSW->uSdhz_S.bFlag.bPower;
  2207. //pSW->uSdhz_S.bFlag.bPower=pSW->uSdhz_S.bFlag.bUABYY;
  2208. if(pSet->bTT_fa_gzbshz||bUoOk)//合后故障闭锁合闸
  2209. fa_s_state_change(sw,S_BSHHGZ);
  2210. else if(!pSet->bTT_fa_gzbshz&&bVTok)//电压时间型,主动跳闸后没投“合到故障闭锁合闸”,进入Y闭锁
  2211. fa_s_state_change(sw,S_BSYTIME);//
  2212. else
  2213. {
  2214. if(pSW->uSdhz_S.bFlag.bTempJS)//!!!正向闭锁临时解锁,电压方向需取反
  2215. pSW->uSdhz_S.bFlag.bPower=!pSW->uSdhz_S.bFlag.bPower;
  2216. fa_s_state_change(sw,S_USUAL);//直接切换至正常运行态
  2217. }
  2218. #ifdef FUNC_DRIVE_JY
  2219. gb_drive.b_clear_bs = false;
  2220. #endif
  2221. ResetTR(&pSW->tOnJSTime);
  2222. break;
  2223. }
  2224. #ifdef GD_AREA_ZHONGSHAN_2020//中山2020最新要求失压的时候有故障延时到报Y闭锁
  2225. else if(pSW->uSdhz_S.bFlag.bPowerZ && !pR->tLostVot.uLostVot.bFlag.bSHWY && !pR->bBSTZ && pR->tSWST.uSWST.bFlag.bFAWL)//Z停电&&未遮断闭锁,被动跳闸
  2226. #else
  2227. else if(pSW->uSdhz_S.bFlag.bPowerZ && !pR->bBSTZ && pR->tSWST.uSWST.bFlag.bFAWL)//Z停电&&未遮断闭锁,被动跳闸
  2228. #endif
  2229. {
  2230. pSW->uSdhz_S.bFlag.bSNChange = pSW->uSdhz_S.bFlag.bPower;
  2231. if(bVTok||(bVIok&&(pSet->bTT_fa_gzTz||pSet->bTT_fa_Icheck)))//电压时间型失压 或 电压电流型过流且失压
  2232. fa_s_state_change(sw,S_BSYTIME);//pSW->S_Status = S_BSYTIME; //进入Y闭锁状态
  2233. else if(pSW->uSdhz_S.bFlag.bTempJS)//!!!正向闭锁临时解锁,电压方向需取反
  2234. { //
  2235. pSW->uSdhz_S.bFlag.bPower=!pSW->uSdhz_S.bFlag.bPower;
  2236. fa_s_state_change(sw,S_BSYTIME);
  2237. }
  2238. #ifdef GD_AREA_ZHONGSHAN_2020//中山2020最新要求失压的时候有故障延时到报Y闭锁
  2239. else if(pSW->uSdhz_S.bFlag.bOCing)
  2240. {
  2241. fa_s_state_change(sw,S_BSYTIME);
  2242. }
  2243. #endif
  2244. else
  2245. {
  2246. fa_uf_clear(sw,false);
  2247. fa_s_state_change(sw,S_INIT);
  2248. }
  2249. #ifdef FUNC_DRIVE_JY
  2250. gb_drive.b_clear_bs = false;
  2251. #endif
  2252. fa_sw_opt(sw, EV_FA_FZ);
  2253. }
  2254. else if ( pSW->tOnYSTime.boolTrip)//如果Y计时完毕
  2255. {
  2256. #ifdef GD_AREA_HEYUAN_2021
  2257. pSW->uSdhz_S.bFlag.bYtOn = true;
  2258. #endif
  2259. if(pR->bBSTZ //闭锁
  2260. ||(!pR->tSWST.uSWST.bFlag.bFAWL&&pSW->uSdhz_S.bFlag.bPowerZ)//有流且失压
  2261. )
  2262. {
  2263. fa_s_state_change(sw,S_BSDL); //为满足分闸条件,等待至满足分闸条件为止
  2264. }
  2265. else if(pSet->bTT_fa_bsTz)
  2266. {
  2267. if(soe_check(EV_BSTZ_FA+sw*EV_SW_NUM)==false)
  2268. soe_record_ev(EV_BSTZ_FA+sw*EV_SW_NUM, 1, 0,0,0 );
  2269. fa_s_state_change(sw,S_BSFZ); //合闸成功进入闭锁分闸状态
  2270. }
  2271. else
  2272. {
  2273. if(pSW->uSdhz_S.bFlag.bTempJS)//!!!正向闭锁临时解锁,电压方向需取反
  2274. pSW->uSdhz_S.bFlag.bPower=!pSW->uSdhz_S.bFlag.bPower;
  2275. fa_s_state_change(sw,S_USUAL); //进入正常运行状态
  2276. pR->tLostVot.uLostVot.bFlag.bFault=false;
  2277. }
  2278. if(soe_check(EV_X_SWFAIL+sw*EV_SW_NUM)==false && pR->tSWST.uSWST.bFlag.bDITW)//X上电合闸失败
  2279. {
  2280. soe_record_ev(EV_X_SWFAIL+sw*EV_SW_NUM, 1, 0,0,0 );
  2281. }
  2282. #ifdef FUNC_DRIVE_JY
  2283. gb_drive.b_clear_bs = false;
  2284. #endif
  2285. }
  2286. break;
  2287. }
  2288. case S_BS_SW:
  2289. if((soe_check(EV_X_SWFAIL+sw*EV_SW_NUM)||soe_check(EV_HZFAIL+sw*EV_SW_NUM)) && !pSW->uSdhz_S.bFlag.bPowerZ)//X上电合闸失败且未失压
  2290. {
  2291. #ifdef FUNC_DRIVE_JY
  2292. if(gb_drive.b_fa_reclose)
  2293. {
  2294. fa_s_state_change(sw,S_XTIME);
  2295. }
  2296. #endif
  2297. break;
  2298. }
  2299. else if((soe_check(EV_X_SWFAIL+sw*EV_SW_NUM)||soe_check(EV_HZFAIL+sw*EV_SW_NUM)) && pSW->uSdhz_S.bFlag.bPowerZ)////X上电合闸失败且失压
  2300. {
  2301. if(soe_check(EV_X_SWFAIL+sw*EV_SW_NUM))
  2302. soe_record_ev(EV_X_SWFAIL+sw*EV_SW_NUM, 0, 0,0,0 );
  2303. if(soe_check(EV_HZFAIL+sw*EV_SW_NUM))
  2304. soe_record_ev(EV_HZFAIL+sw*EV_SW_NUM, 0, 0,0,0 );
  2305. fa_s_state_change(sw,S_INIT);
  2306. break;
  2307. }
  2308. break;
  2309. case S_BSYTIME:
  2310. if(pR->tSWST.uSWST.bFlag.bDIHW )
  2311. {
  2312. if( soe_check(EV_TZFAIL+sw*EV_SW_NUM))//
  2313. {
  2314. fa_s_state_change(sw,S_BS_SW);
  2315. }
  2316. break;
  2317. }
  2318. if(!pSW->uSdhz_S.bFlag.bTempJS)//未临时解锁,则报Y闭锁SOE
  2319. {
  2320. if(pSW->uSdhz_S.bFlag.bPower)
  2321. {
  2322. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==false) // Y闭锁
  2323. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 1, 0,0,0 );
  2324. }
  2325. else
  2326. {
  2327. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==false) // Y闭锁
  2328. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 1, 0,0,0 );
  2329. }
  2330. }
  2331. #ifdef GD_AREA_ZHONGSHAN //中山局Y闭锁,需合闸且双侧有压才能解锁
  2332. pSW->uSdhz_S.bFlag.bTempJS = true;
  2333. ResetTR(&pSW->tOnY_JSTime); //js时间计数
  2334. if (pSW->uSdhz_S.bFlag.bOppositeYY &&
  2335. (soe_check(EV_BS_Y_P+sw*EV_SW_NUM)!=soe_check(EV_BS_Y_L+sw*EV_SW_NUM)||soe_check(EV_HHGZ_P+sw*EV_SW_NUM)!=soe_check(EV_HHGZ_L+sw*EV_SW_NUM)) )//对侧来电且双侧未闭锁
  2336. {
  2337. fa_s_bsYtime_js(sw,dStep);
  2338. }
  2339. #else//非中山局Y闭锁,反向来压直接解锁
  2340. #ifdef GD_AREA_ZHONGSHAN_2020
  2341. if(pSW->uSdhz_S.bFlag.bPowerZ)//(!pSW->uSdhz_S.bFlag.bDBYY && !pSW->uSdhz_S.bFlag.bOppositeYY)
  2342. {
  2343. ResetTR(&pSW->tOnJSTime);
  2344. }
  2345. RunTR(&pSW->tOnJSTime, (pSW->uSdhz_S.bFlag.bDBYY || pSW->uSdhz_S.bFlag.bOppositeYY)&&((soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==true)||(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==true)), dStep);
  2346. if(pSW->tOnJSTime.boolTrip) //如果双侧有压,js时间计时器
  2347. {
  2348. if(pSW->uSdhz_S.bFlag.bDBYY)
  2349. {
  2350. fa_s_state_change(sw,S_BSDOUBLE);
  2351. }
  2352. else if(pSW->uSdhz_S.bFlag.bOppositeYY)
  2353. {
  2354. if(soe_check(EV_JS_POWER+sw*EV_SW_NUM)==false) // 对侧来电解锁
  2355. {
  2356. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 1, 0,0,0 );
  2357. #ifdef GD_AREA_ECZD_2020
  2358. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 0, 0,0,0 );
  2359. #endif
  2360. }
  2361. fa_rstbs_soe(sw);
  2362. fa_s_state_change(sw,S_INIT);//pSW->S_Status = S_INIT; //返回初始状态
  2363. //pSW->uSdhz_S.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  2364. pSW->uSdhz_S.bFlag.bUABFlash = false;
  2365. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  2366. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true)
  2367. {
  2368. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 0, 0,0,0 );
  2369. }
  2370. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  2371. {
  2372. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2373. }
  2374. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==true)
  2375. {
  2376. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 0, 0,0,0 );
  2377. }
  2378. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==true)
  2379. {
  2380. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2381. }
  2382. if(soe_check(EV_HHGZ_P+sw*EV_SW_NUM)==true)
  2383. {
  2384. soe_record_ev(EV_HHGZ_P+sw*EV_SW_NUM, 0, 0,0,0 );
  2385. }
  2386. if(soe_check(EV_HHGZ_L+sw*EV_SW_NUM)==true)
  2387. {
  2388. soe_record_ev(EV_HHGZ_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2389. }
  2390. }
  2391. }
  2392. #else
  2393. //对侧来电,且非双侧有压
  2394. if (pSW->uSdhz_S.bFlag.bOppositeYY) //对侧来电
  2395. {
  2396. if(soe_check(EV_JS_POWER+sw*EV_SW_NUM)==false) // 对侧来电解锁
  2397. {
  2398. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 1, 0,0,0 );
  2399. #ifdef GD_AREA_ECZD_2020
  2400. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 0, 0,0,0 );
  2401. #endif
  2402. }
  2403. fa_rstbs_soe(sw);
  2404. fa_s_state_change(sw,S_INIT);//pSW->S_Status = S_INIT; //返回初始状态
  2405. //pSW->uSdhz_S.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  2406. pSW->uSdhz_S.bFlag.bUABFlash = false;
  2407. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  2408. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true)
  2409. {
  2410. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 0, 0,0,0 );
  2411. }
  2412. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  2413. {
  2414. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2415. }
  2416. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==true)
  2417. {
  2418. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 0, 0,0,0 );
  2419. }
  2420. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==true)
  2421. {
  2422. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2423. }
  2424. if(soe_check(EV_HHGZ_P+sw*EV_SW_NUM)==true)
  2425. {
  2426. soe_record_ev(EV_HHGZ_P+sw*EV_SW_NUM, 0, 0,0,0 );
  2427. }
  2428. if(soe_check(EV_HHGZ_L+sw*EV_SW_NUM)==true)
  2429. {
  2430. soe_record_ev(EV_HHGZ_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2431. }
  2432. }
  2433. #endif
  2434. #endif
  2435. break;
  2436. case S_BSHHGZ://合后故障
  2437. if(pR->tSWST.uSWST.bFlag.bDIHW)
  2438. {
  2439. if(soe_check(EV_TZFAIL+sw*EV_SW_NUM))//
  2440. {
  2441. fa_s_state_change(sw,S_BS_SW);
  2442. }
  2443. break;
  2444. }
  2445. #ifdef GD_AREA_ZHONGSHAN_2020
  2446. if(pR->tLostVot.uLostVot.bFlag.bSHWY)
  2447. { //手合无压进入Y时间闭锁后禁止解锁 2020-12-23
  2448. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==false) // EV_HHGZ闭锁
  2449. {
  2450. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );
  2451. }
  2452. break;
  2453. }
  2454. #endif
  2455. //if(pSW->uSdhz_S.bFlag.bYY && !pSW->uSdhz_S.bFlag.bPowerZ)//无压暂停计时
  2456. RunTR(&pSW->tOnYSTime, TRUE, dStep); //启动Y时间计数
  2457. if (!pSW->tOnYSTime.boolTrip)//Y计时未完毕失压
  2458. {
  2459. if(pSW->uSdhz_S.bFlag.bPowerZ)//当前失压且在合位
  2460. {
  2461. //合后故障后,Y时间内失压,加记录Y闭锁SOE
  2462. if(pSW->uSdhz_S.bFlag.bPower)
  2463. {
  2464. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==false) // Y闭锁
  2465. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 1, 0,0,0 );
  2466. }
  2467. else
  2468. {
  2469. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==false) // Y闭锁
  2470. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 1, 0,0,0 );
  2471. }
  2472. }
  2473. }
  2474. if(pSW->uSdhz_S.bFlag.bPower)
  2475. {
  2476. if(soe_check(EV_HHGZ_P+sw*EV_SW_NUM)==false) // Y闭锁
  2477. {
  2478. soe_record_ev(EV_HHGZ_P+sw*EV_SW_NUM, 1, 0,0,0 );
  2479. }
  2480. }
  2481. else
  2482. {
  2483. if(soe_check(EV_HHGZ_L+sw*EV_SW_NUM)==false) // Y闭锁
  2484. {
  2485. soe_record_ev(EV_HHGZ_L+sw*EV_SW_NUM, 1, 0,0,0 );
  2486. }
  2487. }
  2488. //if(pSW->uSdhz_S.bFlag.bPowerZ && pR->tSWST.uSWST.bFlag.bHZWZ)//当前失压且在合位
  2489. // fa_sw_opt(sw, EV_HHGZ);
  2490. //if(pSW->uSdhz_S.bFlag.bPower)
  2491. {
  2492. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==false) // EV_HHGZ闭锁
  2493. {
  2494. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );
  2495. }
  2496. }
  2497. #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_ZHUHAI_FTU//珠海局2019供货要求合后故障只能在有压且开关合位的时候才能解锁
  2498. break;
  2499. #endif
  2500. #ifdef FA_BSYTIME_JS
  2501. #ifdef GD_AREA_ZHONGSHAN_2020
  2502. if(!pSW->uSdhz_S.bFlag.bDBYY && !pSW->uSdhz_S.bFlag.bOppositeYY)
  2503. {
  2504. ResetTR(&pSW->tOnJSTime);
  2505. }
  2506. RunTR(&pSW->tOnJSTime, (pSW->uSdhz_S.bFlag.bDBYY || pSW->uSdhz_S.bFlag.bOppositeYY) && (soe_check(EV_HHGZ+sw*EV_SW_NUM)==true), dStep);
  2507. if(pSW->tOnJSTime.boolTrip)
  2508. {
  2509. if(pSW->uSdhz_S.bFlag.bDBYY)//如果双侧有压,js时间计时器
  2510. {
  2511. fa_s_state_change(sw,S_BSDOUBLE);
  2512. }
  2513. else if(pSW->uSdhz_S.bFlag.bOppositeYY)//对侧来电,且非双侧有压
  2514. {
  2515. if(soe_check(EV_JS_POWER+sw*EV_SW_NUM)==false) // 对侧来电解锁
  2516. {
  2517. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 1, 0,0,0 );
  2518. #ifdef GD_AREA_ECZD_2020
  2519. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 0, 0,0,0 );
  2520. #endif
  2521. }
  2522. fa_rstbs_soe(sw);
  2523. fa_close_led(sw);
  2524. fa_s_state_change(sw,S_INIT);
  2525. pSW->uSdhz_S.bFlag.bUABFlash = false;
  2526. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  2527. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true)
  2528. {
  2529. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 0, 0,0,0 );
  2530. }
  2531. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  2532. {
  2533. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2534. }
  2535. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==true)
  2536. {
  2537. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 0, 0,0,0 );
  2538. }
  2539. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==true)
  2540. {
  2541. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2542. }
  2543. if(soe_check(EV_HHGZ_P+sw*EV_SW_NUM)==true)
  2544. {
  2545. soe_record_ev(EV_HHGZ_P+sw*EV_SW_NUM, 0, 0,0,0 );
  2546. }
  2547. if(soe_check(EV_HHGZ_L+sw*EV_SW_NUM)==true)
  2548. {
  2549. soe_record_ev(EV_HHGZ_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2550. }
  2551. }
  2552. }
  2553. #elif defined GD_AREA_ZHONGSHAN
  2554. if(pSW->uSdhz_S.bFlag.bDBYY || pSW->uSdhz_S.bFlag.bOppositeYY)
  2555. {
  2556. fa_s_state_change(sw,S_XTIME);
  2557. if(soe_check(EV_FA_GL_TZ+sw*EV_SW_NUM)==true)
  2558. soe_record_ev(EV_FA_GL_TZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  2559. if(soe_check(EV_FA_LX_TZ+sw*EV_SW_NUM)==true)
  2560. soe_record_ev(EV_FA_LX_TZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  2561. }
  2562. #else
  2563. if (pSW->uSdhz_S.bFlag.bOppositeYY && !pSW->uSdhz_S.bFlag.bDBYY &&soe_check(EV_HHGZ_P+sw*EV_SW_NUM)!=soe_check(EV_HHGZ_L+sw*EV_SW_NUM)) //对侧来电,且非双侧有压
  2564. {
  2565. fa_s_bsYtime_js(sw,dStep);
  2566. }
  2567. #endif
  2568. #else
  2569. if (pSW->uSdhz_S.bFlag.bOppositeYY && !pSW->uSdhz_S.bFlag.bDBYY) //对侧来电,且非双侧有压
  2570. {
  2571. if(soe_check(EV_JS_POWER+sw*EV_SW_NUM)==false) // 对侧来电解锁
  2572. {
  2573. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 1, 0,0,0 );
  2574. #ifdef GD_AREA_ECZD_2020
  2575. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 0, 0,0,0 );
  2576. #endif
  2577. }
  2578. fa_rstbs_soe(sw);
  2579. fa_s_state_change(sw,S_INIT);//pSW->S_Status = S_INIT; //返回初始状态
  2580. //pSW->uSdhz_S.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  2581. pSW->uSdhz_S.bFlag.bUABFlash = false;
  2582. pSW->uSdhz_S.bFlag.bUBCFlash = false;
  2583. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true)
  2584. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 0, 0,0,0 );
  2585. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  2586. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2587. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==true)
  2588. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 0, 0,0,0 );
  2589. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==true)
  2590. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2591. }
  2592. #endif
  2593. break;
  2594. case S_BSDL://遮断电流
  2595. if(pSW->uSdhz_S.bFlag.bYY && !pSW->uSdhz_S.bFlag.bPowerZ)//无压暂停计时
  2596. RunTR(&pSW->tOnYSTime, TRUE, dStep); //启动Y时间计数
  2597. if (!pSW->tOnYSTime.boolTrip)//Y计时未完毕失压
  2598. {
  2599. if(pSW->uSdhz_S.bFlag.bPowerZ)
  2600. {
  2601. //合后故障后,Y时间内失压,加记录Y闭锁SOE
  2602. if(pSW->uSdhz_S.bFlag.bPower)
  2603. {
  2604. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==false) // Y闭锁
  2605. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 1, 0,0,0 );
  2606. }
  2607. else
  2608. {
  2609. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==false) // Y闭锁
  2610. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 1, 0,0,0 );
  2611. }
  2612. }
  2613. }
  2614. bVTok=!pSet->bTT_fa_Icheck ; //电压时间型,不判故障电流
  2615. bVIok=(pSW->uSdhz_S.bFlag.bGL||pSW->uSdhz_S.bFlag.bGL_II||pSW->uSdhz_S.bFlag.bJD)&&pSet->bTT_fa_gzbshz;
  2616. bUoOk = pSW->uSdhz_S.bFlag.bOverU0 && pSet->bTT_fa_U0Tz;
  2617. if((bVIok||bUoOk) //合后有故障
  2618. &&pSet->bTT_fa_gzTz //合后故障跳闸
  2619. && !pR->bBSTZ) //未遮断闭锁 -> //合后故障,主动跳闸
  2620. {
  2621. fa_sw_opt(sw, EV_HHGZ);
  2622. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  2623. fa_s_state_change(sw,S_BSHHGZ);//主动跳闸过了Y时限,不报Y闭锁
  2624. }
  2625. else if(pSW->uSdhz_S.bFlag.bPowerZ&& !pR->bBSTZ&&pR->tSWST.uSWST.bFlag.bFAWL)//Z停电,被动跳闸,电压时间型
  2626. {
  2627. fa_sw_opt(sw, EV_FA_FZ);
  2628. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  2629. //if(bVTok)//电压时间型失压
  2630. fa_s_state_change(sw,S_BSYTIME);//pSW->S_Status = S_BSYTIME; //进入Y闭锁状态
  2631. //else
  2632. // fa_s_state_change(sw,S_INIT);
  2633. }
  2634. break;
  2635. case S_BSFZ://合闸成功闭锁失压分
  2636. RunTR(&pSW->tOnBSTZTime, TRUE, dStep); //启动Y时间计数
  2637. if(pSW->uSdhz_S.bFlag.bYY)
  2638. {
  2639. pR->tLostVot.uLostVot.bFlag.bSHWY=false;//清手分闭锁标志
  2640. }
  2641. if(pSW->tOnBSTZTime.boolTrip||!KZ_OUT_ALL_EN(sw))
  2642. {
  2643. //if (pSW->uSdhz_S.bFlag.bPowerZ || !pR->tSWST.uSWST.bFlag.bHZWZ)//失压或者当前分位
  2644. if(soe_check(EV_BSTZ_FA+sw*EV_SW_NUM)==true)
  2645. soe_record_ev(EV_BSTZ_FA+sw*EV_SW_NUM, 0, 0,0,0 );
  2646. fa_s_state_change(sw,S_USUAL);
  2647. }
  2648. else if(!pR->tSWST.uSWST.bFlag.bHZWZ)//手分?
  2649. {
  2650. if(soe_check(EV_BSTZ_FA+sw*EV_SW_NUM)==true)
  2651. soe_record_ev(EV_BSTZ_FA+sw*EV_SW_NUM, 0, 0,0,0 );
  2652. fa_uf_clear(sw,false);
  2653. fa_s_state_change(sw,S_INIT);
  2654. }
  2655. break;
  2656. case S_USUAL:
  2657. #ifdef FA_OC_COUNT
  2658. if(isBs_fa_oc_count(sw))//过流脉冲计数闭锁
  2659. {
  2660. if(!pSW->uSdhz_S.bFlag.bYY && pR->tSWST.uSWST.bFlag.bFAWL)
  2661. {
  2662. fa_sw_opt(sw, EV_FA_FZ);
  2663. fa_uf_clear(sw,false);
  2664. if(soe_check(EV_BS_OC_COUNT+sw*EV_SW_NUM)==false) // 脉冲计数闭锁
  2665. soe_record_ev(EV_BS_OC_COUNT+sw*EV_SW_NUM,1, 0,0,0 );
  2666. }
  2667. break;
  2668. }
  2669. #endif
  2670. if(!pR->tSWST.uSWST.bFlag.bHZWZ || !pR->tSWST.uSWST.bFlag.bDIHW)//开关拉杆分闸,手分
  2671. {
  2672. fa_uf_clear(sw,false);
  2673. #ifdef FA_BSYTIME_JS
  2674. if(pSW->uSdhz_S.bFlag.bTempJS)
  2675. { //当前正向闭锁未解锁,需切换至Y闭锁状态
  2676. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  2677. fa_s_state_change(sw,S_BSYTIME);
  2678. }
  2679. else
  2680. #endif
  2681. {
  2682. fa_s_state_change(sw,S_INIT);
  2683. }
  2684. break;
  2685. }
  2686. if(pR->tLostVot.uLostVot.bFlag.bSHWY && !pSet->bTT_fa_shbs)//手合无压,闭锁合闸
  2687. {
  2688. if(pSW->uSdhz_S.bFlag.bYY) //有压
  2689. pR->tLostVot.uLostVot.bFlag.bSHWY = FALSE; //清手合无压标志
  2690. else
  2691. break;
  2692. }
  2693. #ifdef FA_BSYTIME_JS
  2694. //正向闭锁需等待解锁处理
  2695. #ifdef GD_AREA_ZHONGSHAN
  2696. RunTR(&pSW->tOnY_JSTime, pSW->uSdhz_S.bFlag.bTempJS && !pR->bBSTZ , dStep); //js时间计数
  2697. #elif defined GD_AREA_ECZD_2020
  2698. RunTR(&pSW->tOnY_JSTime,((pR->tSWST.uSWST.bFlag.bDITW && pSW->uSdhz_S.bFlag.bDBYY)// 双侧有压 && 分位
  2699. || (pR->tSWST.uSWST.bFlag.bDIHW && pSW->uSdhz_S.bFlag.bYY))// 有压 && 合位
  2700. && pSW->uSdhz_S.bFlag.bTempJS,dStep);
  2701. #else
  2702. RunTR(&pSW->tOnY_JSTime, pSW->uSdhz_S.bFlag.bDBYY&&pSW->uSdhz_S.bFlag.bTempJS && !pR->bBSTZ , dStep); //js时间计数
  2703. #endif
  2704. if(pSW->tOnY_JSTime.boolTrip)
  2705. rst_ybs_soe(sw);
  2706. else if(!pSW->tOnY_JSTime.boolTrip && pSW->uSdhz_S.bFlag.bPowerZ&&pSW->uSdhz_S.bFlag.bTempJS)//正向闭锁后未解锁,且失压 再次Y闭锁
  2707. {
  2708. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  2709. fa_s_state_change(sw,S_BSYTIME);
  2710. }
  2711. #endif
  2712. if (!pSW->uSdhz_S.bFlag.bPowerZ)//等待无压
  2713. break;
  2714. if (pSW->uSdhz_S.bFlag.bPowerZ&&pR->tSWST.uSWST.bFlag.bHZWZ && pR->tSWST.uSWST.bFlag.bFAWL) //失压
  2715. {
  2716. if(pSet->bTT_hzbs)//正常运行,连续闭锁分闸投入
  2717. {
  2718. pR->thzbs.fztimes++;
  2719. rt_printf("连续闭锁分闸次数 = %d次 \r\n",pR->thzbs.fztimes);
  2720. }
  2721. fa_sw_opt(sw, EV_FA_FZ);
  2722. fa_uf_clear(sw,false);
  2723. #ifdef FA_BSYTIME_JS
  2724. if(pSW->uSdhz_S.bFlag.bTempJS)
  2725. { //当前正向闭锁未解锁,需切换至Y闭锁状态
  2726. pSW->uSdhz_S.bFlag.bSNChange=pSW->uSdhz_S.bFlag.bPower;
  2727. fa_s_state_change(sw,S_BSYTIME);
  2728. }
  2729. else
  2730. #endif
  2731. {
  2732. fa_s_state_change(sw,S_INIT);//pSW->S_Status = S_INIT; //进入U-Z状态,即正常运行中的失电状态
  2733. }
  2734. if(soe_check(EV_SH_BSFZ+sw*EV_SW_NUM)==true) //
  2735. {
  2736. soe_record_ev(EV_SH_BSFZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2737. }
  2738. }
  2739. break;
  2740. default:
  2741. break;
  2742. }
  2743. }
  2744. /**************************************************************************
  2745. 函数名称:Pro_L_Status_RUN
  2746. 函数版本:1.00
  2747. 作者: 电力产品开发部
  2748. 创建日期:2011.10.28
  2749. 函数功能说明:联络点状态流程
  2750. 输入参数:
  2751. 其他输入:
  2752. 输出参数:
  2753. 返回值:
  2754. ***************************************************************************/
  2755. static void fa_l_status_run(int sw, DWORD dStep)
  2756. {
  2757. TRELAY_T *pR=&g_tRelay[sw];
  2758. TSDHZ_T *pSW = &pR->tSDHZ;
  2759. TSETSW *pSet = &pRunSet->tSwSet[sw];
  2760. bool bVTok,bVIok,bUoOk;
  2761. DWORD U01 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  2762. DWORD U02 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U02].m2[0]), 256, g_ui[PUB_AC_U02].m2_factor_k);
  2763. static bool TempBSTZ;//保存Y时间内产生的遮断信息
  2764. #ifdef FA_PL_PJ
  2765. bool bFreq0,bFreq1;
  2766. float freq0,freq1;
  2767. //频率在要求范围内
  2768. freq0=freq_get(0);
  2769. freq1=freq_get(1);
  2770. //电源1频率判断
  2771. if((freq0>=48.9) && (freq0<=50.9))
  2772. {
  2773. bFreq0 = true;
  2774. }
  2775. else
  2776. {
  2777. bFreq0 = false;
  2778. }
  2779. //电源2频率判断
  2780. if((freq1>=48.9) && (freq1<=50.9))
  2781. {
  2782. bFreq1 = true;
  2783. }
  2784. else
  2785. {
  2786. bFreq1 = false;
  2787. }
  2788. #endif
  2789. if(pSW->uSdhz_L.bFlag.bYY)
  2790. pSW->bSDHZinit=true;
  2791. if(!pSW->bSDHZinit)//未曾有压
  2792. return;
  2793. switch(pSW->L_Status)
  2794. {
  2795. case L_INIT:
  2796. ResetTR(&pSW->tOnXLTime);
  2797. #ifdef GD_AREA_ZHONGSHAN_2020//中山2020需要独立设置联络充电时间
  2798. ResetTR(&pSW->tOnLLCDYLTime);
  2799. #endif
  2800. ResetTR(&pSW->tOnYLTime);
  2801. ResetTR(&pSW->tOnZLTime);
  2802. #ifdef FA_PL_PJ
  2803. ResetTR(&pSW->tFREQLAB25ms);
  2804. ResetTR(&pSW->tFREQLBC25ms);
  2805. #endif
  2806. ResetTR(&pSW->tL_RELAYONL3s);
  2807. pR->uRmtSW.bYH_fajs_flag=false;
  2808. pR->run_stu.fa_ll_cd=0;
  2809. //if(fa_check_auto_l_bs(sw))return;
  2810. if (pSW->uSdhz_L.bFlag.bYY)
  2811. pSW->uSdhz_L.bFlag.bPower = pSW->uSdhz_L.bFlag.bUABYY; //记录上电侧
  2812. #ifdef GD_AREA_ZHONGSHAN_2020
  2813. if(pSW->uSdhz_L.bFlag.bYY) //有压
  2814. {
  2815. pR->tLostVot.uLostVot.bFlag.bSHWY = FALSE; //清手合无压标志
  2816. }
  2817. if(!pR->tLostVot.uLostVot.bFlag.bSHWY )//手合无压,闭锁合闸
  2818. {
  2819. if(pR->tSWST.uSWST.bFlag.bDIHW && pSW->uSdhz_L.bFlag.bPowerZ)//防止开关在合位不分闸 2020-11-13
  2820. {
  2821. pR->tLostVot.uLostVot.bFlag.bSHWY= true;//防止分闸过程中未检测到合位,多次进入失压分闸操作函数 2020-11-16
  2822. fa_sw_opt(sw, EV_FA_FZ);
  2823. }
  2824. }
  2825. //中山2020要求闭锁后需经双侧有压、分位且持续6s解锁 2020-10-24
  2826. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)
  2827. ||soe_check(EV_BS_Y_P+sw*EV_SW_NUM)
  2828. ||soe_check(EV_BS_Y_L+sw*EV_SW_NUM)
  2829. ||soe_check(EV_BS_UF_P+sw*EV_SW_NUM)
  2830. ||soe_check(EV_BS_UF_L+sw*EV_SW_NUM)
  2831. ||soe_check(EV_BS_HA+sw*EV_SW_NUM)
  2832. )
  2833. {
  2834. RunTR(&pSW->tOnJSTime, pSW->uSdhz_L.bFlag.bDBYY && !pR->tSWST.uSWST.bFlag.bDIHW, dStep); //js时间计数
  2835. if(!pSW->tOnJSTime.boolTrip)
  2836. break;
  2837. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)==true) // 手动分闸,闭锁合闸
  2838. {
  2839. soe_record_ev(EV_BS_HA+sw*EV_SW_NUM, 0, 0,0,0 );
  2840. }
  2841. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  2842. {
  2843. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2844. }
  2845. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==true)
  2846. {
  2847. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 0, 0,0,0 );
  2848. }
  2849. if(soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==true)
  2850. {
  2851. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 0, 0,0,0 );
  2852. }
  2853. }
  2854. #endif
  2855. if(soe_check(EV_L_LST_T+sw*EV_SW_NUM)==true)
  2856. {
  2857. soe_record_ev(EV_L_LST_T+sw*EV_SW_NUM, 0, 0,0,0 ); //联络单侧失压时间到
  2858. }
  2859. if(soe_check(EV_FA_FZ+sw*EV_SW_NUM)==true)
  2860. {
  2861. soe_record_ev(EV_FA_FZ+sw*EV_SW_NUM, 0, 0,0,0 ); //失电分闸
  2862. }
  2863. if(soe_check(EV_FA_GL_TZ+sw*EV_SW_NUM)==true)
  2864. soe_record_ev(EV_FA_GL_TZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  2865. //#if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 //潮州局要求合后电流两段处理
  2866. #if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  2867. if(soe_check(EV_FA_GL_TZ2+sw*EV_SW_NUM)==true)
  2868. soe_record_ev(EV_FA_GL_TZ2+sw*EV_SW_NUM, 0, 0,0 ,0 );
  2869. #endif
  2870. if(soe_check(EV_FA_LX_TZ+sw*EV_SW_NUM)==true)
  2871. soe_record_ev(EV_FA_LX_TZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  2872. if(soe_check(EV_SH_BSFZ+sw*EV_SW_NUM)==true) //
  2873. soe_record_ev(EV_SH_BSFZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2874. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true)
  2875. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 0, 0,0 ,0 );
  2876. //2020-03-17
  2877. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  2878. if(soe_check(EV_FA_LL_EN+sw*EV_SW_NUM)==true)//自转电功能投入SOE返回
  2879. {
  2880. soe_record_ev(EV_FA_LL_EN+sw*EV_SW_NUM, 0, 0,0,0 );
  2881. }
  2882. #ifdef GD_AREA_ZHONGSHAN_2020
  2883. if(soe_check(EV_FA_HZ_OK+sw*EV_SW_NUM)==true)//联络合闸成功返回
  2884. {
  2885. soe_record_ev(EV_FA_HZ_OK+sw*EV_SW_NUM, 0, 0,0,0 );
  2886. }
  2887. if(soe_check(EV_FA_HZ_FAIL+sw*EV_SW_NUM)==true)//自转电失败SOE返回
  2888. {
  2889. soe_record_ev(EV_FA_HZ_FAIL+sw*EV_SW_NUM, 0, 0,0,0 );
  2890. }
  2891. #endif
  2892. #endif
  2893. #ifdef GD_AREA_ZHUHAI_V2
  2894. if(soe_check(EV_FA_HZ_OK+sw*EV_SW_NUM)==true)//联络合闸成功返回
  2895. {
  2896. soe_record_ev(EV_FA_HZ_OK+sw*EV_SW_NUM, 0, 0,0,0 );
  2897. }
  2898. #elif defined GD_AREA_ZHONGSHAN
  2899. if(soe_check(EV_GOOSE_HZ_OK+sw*EV_SW_NUM)==true)
  2900. {
  2901. soe_record_ev(EV_GOOSE_HZ_OK+sw*EV_SW_NUM, 0, 0,0,0 );
  2902. }
  2903. #endif
  2904. if(soe_check(EV_FA_LL_CD+sw*EV_SW_NUM)==true)
  2905. {
  2906. soe_record_ev(EV_FA_LL_CD+sw*EV_SW_NUM, 0, 0,0,0 );
  2907. }
  2908. #ifdef GD_AREA_CHAOZHOUFENGXI //潮州
  2909. if(pSW->uSdhz_L.bFlag.bUABFlash)
  2910. {
  2911. if(soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==false)
  2912. {
  2913. soe_record_ev(EV_BS_UF_P+sw*EV_SW_NUM, 1, 0,0,0 );
  2914. }
  2915. }
  2916. if(pSW->uSdhz_L.bFlag.bUBCFlash)
  2917. {
  2918. if(soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==false)
  2919. {
  2920. soe_record_ev(EV_BS_UF_L+sw*EV_SW_NUM, 1, 0,0,0 );
  2921. }
  2922. }
  2923. #endif
  2924. if (pSW->uSdhz_L.bFlag.bDBYY) //两侧有压
  2925. {
  2926. fa_uf_clear(sw,true);
  2927. if(pR->tSWST.uSWST.bFlag.bDIHW)
  2928. fa_l_state_change(sw,L_YL_TIME);
  2929. else
  2930. {
  2931. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  2932. if((!soe_check(EV_PT2ERR) && pSW->uSdhz_L.bFlag.bHzEnable_P) || (!soe_check(EV_PT1ERR) && pSW->uSdhz_L.bFlag.bHzEnable_L))
  2933. #endif
  2934. {
  2935. fa_l_state_change(sw,L_BS_STATE);
  2936. }
  2937. }
  2938. }
  2939. else if(pSW->uSdhz_L.bFlag.bYY && pR->tSWST.uSWST.bFlag.bDIHW)
  2940. {
  2941. fa_uf_clear(sw,true);
  2942. fa_l_state_change(sw,L_YL_TIME);
  2943. }
  2944. #ifdef GD_TEST_2021
  2945. if(soe_check(EV_L_A_LST_ALA+sw*EV_SW_NUM))
  2946. soe_record_ev(EV_L_A_LST_ALA+sw*EV_SW_NUM, 0, 0,0,0 );
  2947. if(soe_check(EV_L_A_LST_HZ+sw*EV_SW_NUM))
  2948. soe_record_ev(EV_L_A_LST_HZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2949. if(soe_check(EV_L_B_LST_ALA+sw*EV_SW_NUM))
  2950. soe_record_ev(EV_L_B_LST_ALA+sw*EV_SW_NUM, 0, 0,0,0 );
  2951. if(soe_check(EV_L_B_LST_HZ+sw*EV_SW_NUM))
  2952. soe_record_ev(EV_L_B_LST_HZ+sw*EV_SW_NUM, 0, 0,0,0 );
  2953. #endif
  2954. break;
  2955. case L_BS_STATE:
  2956. #ifdef GD_AREA_ZHONGSHAN_2020//中山2020需要独立设置联络充电时间
  2957. //if(pSW->uSdhz_L.bFlag.bYY && soe_check_pt_ok(sw))//无压暂停计时
  2958. RunTR(&pSW->tOnLLCDYLTime, TRUE, dStep); //启动Y时间计数
  2959. #else
  2960. //if(pSW->uSdhz_L.bFlag.bYY && soe_check_pt_ok(sw))//无压暂停计时
  2961. RunTR(&pSW->tOnYLTime, TRUE, dStep); //启动Y时间计数
  2962. #endif
  2963. //零序电压不允许解锁 2021-4-27
  2964. if((pSW->uSdhz_L.bFlag.bOverU0 && (pSet->bTT_fa_U0Tz||pSet->bTT_fa_U0Gj))
  2965. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  2966. || (!soe_check_pt_ok(sw))
  2967. #endif
  2968. )
  2969. ResetTR(&pSW->tOnYLTime);
  2970. #if defined GD_AREA_MAIN_2020 || defined GD_AREA_ECZD_2020
  2971. if(soe_check(EV_BS_DB+sw*EV_SW_NUM)==false)
  2972. {
  2973. soe_record_ev(EV_BS_DB+sw*EV_SW_NUM, 1, 0,0,0 );
  2974. }
  2975. #endif
  2976. #ifdef GD_AREA_ZHONGSHAN_2020
  2977. if ((!pSW->tOnLLCDYLTime.boolTrip) && pSW->uSdhz_L.bFlag.bOneLostV)//如果Y计时未完成且一侧失压
  2978. #else
  2979. if ((!pSW->tOnYLTime.boolTrip) && pSW->uSdhz_L.bFlag.bOneLostV)//如果Y计时未完成且一侧失压
  2980. #endif
  2981. {
  2982. ResetTR(&pSW->tOnZLTime);
  2983. fa_l_state_change(sw,L_Y_ZTIME);
  2984. #if defined GD_AREA_MAIN_2020 || defined GD_AREA_ECZD_2020
  2985. if(soe_check(EV_BS_DB+sw*EV_SW_NUM))
  2986. {
  2987. soe_record_ev(EV_BS_DB+sw*EV_SW_NUM, 0, 0,0,0 );
  2988. }
  2989. #endif
  2990. }
  2991. #ifdef GD_AREA_ZHONGSHAN_2020//中山2020需要独立设置联络充电时间
  2992. else if (pSW->tOnLLCDYLTime.boolTrip && soe_check_pt_ok(sw)) //如果Y计时完毕
  2993. #else
  2994. else if (pSW->tOnYLTime.boolTrip && soe_check_pt_ok(sw)) //如果Y计时完毕
  2995. #endif
  2996. {
  2997. pR->run_stu.fa_ll_cd=1;
  2998. fa_uf_clear(sw,true);
  2999. fa_close_led(sw);
  3000. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  3001. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  3002. fa_l_state_change(sw,L_USUAL);
  3003. if((soe_check(EV_JS_L+sw*EV_SW_NUM)==false)&&(soe_check(EV_BS_UF_P+sw*EV_SW_NUM)||soe_check(EV_BS_UF_L+sw*EV_SW_NUM)))
  3004. {
  3005. soe_record_ev(EV_JS_L+sw*EV_SW_NUM, 1, 0,0,0 );
  3006. }
  3007. if(soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==true)
  3008. {
  3009. soe_record_ev(EV_BS_UF_P+sw*EV_SW_NUM, 0, 0,0,0 );
  3010. }
  3011. if(soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==true)
  3012. {
  3013. soe_record_ev(EV_BS_UF_L+sw*EV_SW_NUM, 0, 0,0,0 );
  3014. }
  3015. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)==true)
  3016. {
  3017. soe_record_ev(EV_BS_HA+sw*EV_SW_NUM, 0, 0,0,0 );
  3018. }
  3019. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)==true)
  3020. {
  3021. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 0, 0,0,0 );
  3022. }
  3023. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==true)
  3024. {
  3025. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 0, 0,0,0 );
  3026. }
  3027. //2020-03-17
  3028. #ifdef GD_AREA_ZHUHAI_V2
  3029. if(soe_check(EV_FA_HZ_FAIL+sw*EV_SW_NUM)==true)//自转电失败SOE返回
  3030. {
  3031. soe_record_ev(EV_FA_HZ_FAIL+sw*EV_SW_NUM, 0, 0,0,0 );
  3032. }
  3033. #elif defined GD_AREA_ZHONGSHAN
  3034. if(soe_check(EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM)==true)//自转电失败SOE返回
  3035. {
  3036. soe_record_ev(EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM, 0, 0,0,0 );
  3037. }
  3038. #endif
  3039. if(soe_check(EV_FA_LL_CD+sw*EV_SW_NUM)==false)
  3040. {
  3041. soe_record_ev(EV_FA_LL_CD+sw*EV_SW_NUM, 1, 0,0,0 );
  3042. }
  3043. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  3044. if(soe_check(EV_FA_LL_EN+sw*EV_SW_NUM)==false)//自转电功能SOE置位
  3045. {
  3046. soe_record_ev(EV_FA_LL_EN+sw*EV_SW_NUM, 1, 0,0,0 );
  3047. }
  3048. #endif
  3049. pSW->uSdhz_L.bFlag.bLockUFlash = FALSE;
  3050. }
  3051. break;
  3052. case L_Y_ZTIME:
  3053. RunTR(&pSW->tOnZLTime, TRUE, dStep); //启动Z时间计数
  3054. if ((!pSW->tOnZLTime.boolTrip) && pSW->uSdhz_L.bFlag.bDBYY) //如果Z计时未完时失压侧恢复供电
  3055. {
  3056. ResetTR(&pSW->tOnZLTime);
  3057. //pSW->L_Status = L_BS_STATE; //返回Y计时状态
  3058. fa_l_state_change(sw,L_BS_STATE);
  3059. }
  3060. else if (pSW->tOnZLTime.boolTrip) //如果Z计时完成
  3061. {
  3062. ResetTR(&pSW->tOnYLTime); //清零Y计时
  3063. pSW->uSdhz_L.wfFlag = 0; //返回初始状态
  3064. fa_l_state_change(sw,L_INIT);
  3065. }
  3066. break;
  3067. case L_USUAL:
  3068. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  3069. if(!cheak_pt_ok_ing(sw))
  3070. {
  3071. if(soe_check(EV_PT1ERR))
  3072. {
  3073. pSW->uSdhz_L.bFlag.bPtErr_P = true;
  3074. }
  3075. if(soe_check(EV_PT2ERR))
  3076. {
  3077. pSW->uSdhz_L.bFlag.bPtErr_L = true;
  3078. }
  3079. }
  3080. #endif
  3081. #ifdef FUNC_YL_FZ_SOE
  3082. if(soe_check(EV_YL_FZ+sw*EV_SW_NUM))
  3083. {
  3084. soe_record_ev(EV_YL_FZ+sw*EV_SW_NUM, 0, 0,0,0 );
  3085. }
  3086. #endif
  3087. if (pSW->uSdhz_L.bFlag.bOneLostV) //如果一侧失压
  3088. {
  3089. pSW->uSdhz_L.bFlag.bPower = pSW->uSdhz_L.bFlag.bUABYY;
  3090. //pSW->L_Status = L_XLTIME; //进入X延时投入状态,
  3091. ResetTR(&pSW->tOnYLTime); //清零Y计时
  3092. ResetTR(&pSW->tUFDBTime); //清零
  3093. fa_uf_clear(sw,true);
  3094. if((pSW->uSdhz_L.bFlag.bPower&&(!pSet->bTT_fa_lineoff)) //负荷侧失压,负荷侧失压合闸退出
  3095. || ((!pSW->uSdhz_L.bFlag.bPower)&&(!pSet->bTT_fa_poweroff)) // 电源侧失压,电源侧侧失压合闸退出
  3096. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  3097. || (pSW->uSdhz_L.bFlag.bPtErr_P || pSW->uSdhz_L.bFlag.bPtErr_L)
  3098. #endif
  3099. )
  3100. {
  3101. //pSW->L_Status = L_INIT; //进入初始状态,重新充电
  3102. fa_l_state_change(sw,L_INIT);
  3103. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  3104. if(!pSW->uSdhz_L.bFlag.bPower && pSW->uSdhz_L.bFlag.bPtErr_P)
  3105. {
  3106. pSW->uSdhz_L.bFlag.bBsXtime_P = true;
  3107. pSW->uSdhz_L.bFlag.bPtErr_P = false;
  3108. }
  3109. if(pSW->uSdhz_L.bFlag.bPower && pSW->uSdhz_L.bFlag.bPtErr_L)
  3110. {
  3111. pSW->uSdhz_L.bFlag.bBsXtime_L = true;
  3112. pSW->uSdhz_L.bFlag.bPtErr_L = false;
  3113. }
  3114. #endif
  3115. }
  3116. else
  3117. {
  3118. fa_l_state_change(sw,L_XLTIME);
  3119. }
  3120. #if defined GD_AREA_MAIN_2020 || defined GD_AREA_ECZD_2020
  3121. if(soe_check(EV_BS_DB+sw*EV_SW_NUM))
  3122. {
  3123. soe_record_ev(EV_BS_DB+sw*EV_SW_NUM, 0, 0,0,0 );
  3124. }
  3125. #endif
  3126. }
  3127. else if(!pSW->uSdhz_L.bFlag.bYY)
  3128. {
  3129. //pSW->L_Status = L_INIT; //两侧失压进入初始状态
  3130. fa_l_state_change(sw,L_INIT);
  3131. #if defined GD_AREA_MAIN_2020 || defined GD_AREA_ECZD_2020
  3132. if(soe_check(EV_BS_DB+sw*EV_SW_NUM))
  3133. {
  3134. soe_record_ev(EV_BS_DB+sw*EV_SW_NUM, 0, 0,0,0 );
  3135. }
  3136. #endif
  3137. }
  3138. break;
  3139. case L_XLTIME:
  3140. #if defined GD_AREA_MAIN_2020 || defined GD_AREA_ECZD_2020
  3141. if(soe_check(EV_BS_DB+sw*EV_SW_NUM))
  3142. {
  3143. soe_record_ev(EV_BS_DB+sw*EV_SW_NUM, 0, 0,0,0 );
  3144. }
  3145. #endif
  3146. #ifdef FA_PL_PJ
  3147. if(pRunSet->bTT_judgeFreq)
  3148. {
  3149. RunTR(&pSW->tFREQLAB25ms,bFreq0,dStep);
  3150. RunTR(&pSW->tFREQLBC25ms,bFreq1,dStep);
  3151. }
  3152. else
  3153. {
  3154. pSW->tFREQLAB25ms.boolTrip = true;
  3155. pSW->tFREQLBC25ms.boolTrip = true;
  3156. }
  3157. #endif
  3158. #ifdef FA_PL_PJ
  3159. if(((pSW->uSdhz_L.bFlag.bUABYY && pSW->tFREQLAB25ms.boolTrip) || (pSW->uSdhz_L.bFlag.bUBCYY && pSW->tFREQLBC25ms.boolTrip))
  3160. && !pSW->uSdhz_L.bFlag.bOppositeYY)
  3161. #else
  3162. #ifdef GD_AREA_ECZD_2020
  3163. if(pSW->uSdhz_L.bFlag.bYY && !pSW->uSdhz_L.bFlag.bOppositeYY)
  3164. #endif
  3165. #endif
  3166. {
  3167. RunTR(&pSW->tOnXLTime, soe_check_pt_ok(sw), dStep); //启动X时间计数
  3168. }
  3169. RunTR(&pSW->tOnZLTime, TRUE, dStep); //启动Z时间计数
  3170. //if (pSW->uSdhz_L.bFlag.bPower != pSW->uSdhz_L.bFlag.bUABYY) //电压方向有变化
  3171. //{
  3172. // fa_l_state_change(sw,L_INIT);
  3173. // break;
  3174. //}
  3175. //合前零压
  3176. if(pSW->uSdhz_L.bFlag.bOverU0 && (pSet->bTT_fa_U0Tz||pSet->bTT_fa_U0Gj))
  3177. {
  3178. if(soe_check(EV_BE_UO+sw*EV_SW_NUM)==false) //
  3179. soe_record_ev(EV_BE_UO+sw*EV_SW_NUM, 1, U01>U02?U01:U02,0,0 );
  3180. #ifdef GD_AREA_CHAOZHOUFENGXI
  3181. ResetTR(&pSW->tOnXLTime);
  3182. fa_l_state_change(sw,L_INIT);
  3183. break;//合前零压不合闸,重新Xl计时 2021-4-19
  3184. #endif
  3185. }
  3186. if (pSW->uSdhz_L.bFlag.bUABFlash||pSW->uSdhz_L.bFlag.bUBCFlash||pSW->uSdhz_L.bFlag.bDBYY)//如果X计数过程中有瞬时电压
  3187. {
  3188. if(pSW->uSdhz_L.bFlag.bDBYY)//在YL时间内双侧有压认为是残压,过了YL时间则进入初始状态
  3189. {
  3190. pSW->uSdhz_L.bFlag.bUABFlash = !pSW->uSdhz_L.bFlag.bPower;
  3191. pSW->uSdhz_L.bFlag.bUBCFlash = pSW->uSdhz_L.bFlag.bPower;
  3192. }
  3193. ResetTR(&pSW->tOnYLTime);
  3194. pSW->uSdhz_L.bFlag.bSNChange = pSW->uSdhz_L.bFlag.bUABFlash;//残压方向
  3195. fa_l_state_change(sw,L_XL_ZTIME);
  3196. }
  3197. else if (pSW->tOnXLTime.boolTrip && pSW->uSdhz_L.bFlag.bOneLostV ) //如果X计数完毕
  3198. {
  3199. #ifdef FUNC_NYY_NWY
  3200. if((pSW->uSdhz_L.bFlag.bUABYY && pSW->uSdhz_L.bFlag.bUBC_NYY_NWY)
  3201. || (pSW->uSdhz_L.bFlag.bUBCYY && pSW->uSdhz_L.bFlag.bUAB_NYY_NWY))
  3202. {
  3203. pSW->uSdhz_L.wfFlag = 0;
  3204. fa_l_state_change(sw,L_INIT);
  3205. }
  3206. else
  3207. #endif
  3208. {
  3209. #ifdef GD_TEST_2021
  3210. if(pSW->uSdhz_L.bFlag.bUABYY){
  3211. if(pSet->bTT_fa_lineoff == 1){
  3212. if(!soe_check(EV_L_B_LST_ALA+sw*EV_SW_NUM))
  3213. soe_record_ev(EV_L_B_LST_ALA+sw*EV_SW_NUM, 1, 0,0,0 );
  3214. }else{
  3215. pSW->uSdhz_L.bFlag.bRLONFLAG = TRUE;
  3216. if(!soe_check(EV_L_B_LST_HZ+sw*EV_SW_NUM))
  3217. soe_record_ev(EV_L_B_LST_HZ+sw*EV_SW_NUM, 1, 0,0,0 );
  3218. }
  3219. }else{
  3220. if(pSet->bTT_fa_poweroff == 1){
  3221. if(!soe_check(EV_L_A_LST_ALA+sw*EV_SW_NUM))
  3222. soe_record_ev(EV_L_A_LST_ALA+sw*EV_SW_NUM, 1, 0,0,0 );
  3223. }else{
  3224. pSW->uSdhz_L.bFlag.bRLONFLAG = TRUE;
  3225. if(!soe_check(EV_L_A_LST_HZ+sw*EV_SW_NUM))
  3226. soe_record_ev(EV_L_A_LST_HZ+sw*EV_SW_NUM, 1, 0,0,0 );
  3227. }
  3228. }
  3229. #else
  3230. pSW->uSdhz_L.bFlag.bRLONFLAG = TRUE;
  3231. soe_record_ev(EV_L_LST_T+sw*EV_SW_NUM, 1, 0,0,0 ); //联络单侧失压时间到
  3232. #endif
  3233. //pSW->L_Status = L_RELAYON; //进入合闸状态
  3234. ResetTR(&pSW->tOnYLTime);
  3235. #ifdef FA_PL_PJ
  3236. ResetTR(&pSW->tFREQLAB25ms);
  3237. ResetTR(&pSW->tFREQLBC25ms);
  3238. #endif
  3239. TempBSTZ=false;
  3240. fa_l_state_change(sw,L_YL_TIME);//fa_l_state_change(sw,L_RELAYON);
  3241. pSW->uSdhz_L.bFlag.bXOverUo= pSW->uSdhz_L.bFlag.bOverU0;
  3242. }
  3243. }
  3244. else if (pSW->tOnXLTime.boolTrip||pSW->uSdhz_L.bFlag.bPowerZ
  3245. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  3246. || !soe_check_pt_ok(sw)
  3247. #endif
  3248. )
  3249. {
  3250. pSW->uSdhz_L.wfFlag = 0;
  3251. //pSW->L_Status = L_INIT; //返回初始状态
  3252. fa_l_state_change(sw,L_INIT);
  3253. }
  3254. break;
  3255. case L_XL_ZTIME: // 有瞬压产生
  3256. RunTR(&pSW->tOnYLTime, TRUE, dStep); //启动Y时间计数
  3257. if(pSW->tOnYLTime.boolTrip && !soe_check(EV_BS_UF_P+sw*EV_SW_NUM) && !soe_check(EV_BS_UF_L+sw*EV_SW_NUM))//有压持续时间超过YL延时,不认为残压,进入初始状态
  3258. {
  3259. pSW->uSdhz_L.wfFlag = 0;
  3260. fa_l_state_change(sw,L_INIT);
  3261. break;
  3262. }
  3263. if (pSW->uSdhz_L.bFlag.bOneLostV||pSW->uSdhz_L.bFlag.bPowerZ)
  3264. {
  3265. if(pSW->uSdhz_L.bFlag.bUABFlash)
  3266. {
  3267. if(soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==false)
  3268. {
  3269. soe_record_ev(EV_BS_UF_P+sw*EV_SW_NUM, 1, 0,0,0 );
  3270. }
  3271. }
  3272. if(pSW->uSdhz_L.bFlag.bUBCFlash)
  3273. {
  3274. if(soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==false)
  3275. {
  3276. soe_record_ev(EV_BS_UF_L+sw*EV_SW_NUM, 1, 0,0,0 );
  3277. }
  3278. }
  3279. //ResetTR(&pSW->tOnJSTime); //js时间计数
  3280. }
  3281. #ifdef GD_AREA_ZHONGSHAN_2020 //中山2020要求双侧有压经过解锁时间6s才能解锁 2020-10-24
  3282. if( (pSW->uSdhz_L.bFlag.bUABYY && pSW->uSdhz_L.bFlag.bUBCYY)
  3283. &&(soe_check(EV_BS_UF_P+sw*EV_SW_NUM) || soe_check(EV_BS_UF_L+sw*EV_SW_NUM)) )
  3284. #else
  3285. //感受到残压一侧得电,延时6s解除残压闭锁 (中山局交底文件需求 2019-10)
  3286. if( (pSW->uSdhz_L.bFlag.bUABYY&&soe_check(EV_BS_UF_P+sw*EV_SW_NUM))
  3287. ||(pSW->uSdhz_L.bFlag.bUBCYY&&soe_check(EV_BS_UF_L+sw*EV_SW_NUM)) )
  3288. #endif
  3289. {
  3290. RunTR(&pSW->tOnJSTime, TRUE, dStep); //js时间计数
  3291. if(!pSW->tOnJSTime.boolTrip)
  3292. break;
  3293. if(soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==true)
  3294. {
  3295. soe_record_ev(EV_BS_UF_P+sw*EV_SW_NUM, 0, 0,0,0 );
  3296. }
  3297. if(soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==true)
  3298. {
  3299. soe_record_ev(EV_BS_UF_L+sw*EV_SW_NUM, 0, 0,0,0 );
  3300. }
  3301. pSW->uSdhz_L.wfFlag = 0;
  3302. fa_l_state_change(sw,L_INIT);
  3303. ResetTR(&pSW->tUABL25ms);
  3304. ResetTR(&pSW->tUBCL25ms);
  3305. }
  3306. else
  3307. {
  3308. ResetTR(&pSW->tOnJSTime); //js时间计数
  3309. }
  3310. break;
  3311. case L_YL_TIME:
  3312. if(!pR->bBSTZ)//遮断暂停计时
  3313. RunTR(&pSW->tOnYLTime, pSW->uSdhz_L.bFlag.bYY , dStep);
  3314. else
  3315. TempBSTZ = true;//保存之前遮断闭锁信号
  3316. #ifdef GD_AREA_ZHONGSHAN_2020//中山2020最新要求失压的时候有故障延时到报Y闭锁
  3317. if(pSW->uSdhz_L.bFlag.bYY) //有压
  3318. {
  3319. pR->tLostVot.uLostVot.bFlag.bSHWY = FALSE; //清手合无压标志
  3320. }
  3321. bVTok=(!pSet->bTT_fa_Icheck && pSW->uSdhz_L.bFlag.bPowerZ && pR->tSWST.uSWST.bFlag.bFAWL && !pR->tLostVot.uLostVot.bFlag.bSHWY); //电压时间型,不判故障电流
  3322. #else
  3323. bVTok=(!pSet->bTT_fa_Icheck && pSW->uSdhz_L.bFlag.bPowerZ && pR->tSWST.uSWST.bFlag.bFAWL); //电压时间型,不判故障电流
  3324. #endif
  3325. bVIok=(pSW->uSdhz_L.bFlag.bGL||pSW->uSdhz_L.bFlag.bGL_II||pSW->uSdhz_L.bFlag.bJD)&&pSet->bTT_fa_gzTz;
  3326. bUoOk = pSW->uSdhz_L.bFlag.bOverU0 && pSet->bTT_fa_U0Tz && soe_check(EV_BE_UO+sw*EV_SW_NUM)==false;
  3327. if(!pR->bBSTZ)
  3328. {
  3329. if(bVTok||bVIok||bUoOk||TempBSTZ)
  3330. {
  3331. if(bVTok)
  3332. fa_sw_opt(sw, EV_FA_FZ);
  3333. else
  3334. fa_sw_opt(sw, EV_HHGZ);
  3335. TempBSTZ=false;
  3336. ResetTR(&pSW->tUABL25ms);//跳闸后,将电压计时器清零,防止INIT 状态后,合位未及时检测到又返回 L_YL_TIME
  3337. ResetTR(&pSW->tUBCL25ms);
  3338. pSW->uSdhz_L.bFlag.bDBYY=0;
  3339. fa_l_state_change(sw,L_INIT);
  3340. #ifdef FUNC_YL_FZ_SOE
  3341. if(soe_check(EV_YL_FZ+sw*EV_SW_NUM)==false)
  3342. {
  3343. soe_record_ev(EV_YL_FZ+sw*EV_SW_NUM, 1, 0,0,0 );
  3344. }
  3345. #endif
  3346. #ifdef GD_AREA_ECZD_2020
  3347. fa_uf_clear(sw,true);
  3348. #endif
  3349. //2020-03-17 EV_GOOSE_HZ_FAIL
  3350. #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_ZHONGSHAN_2020
  3351. if(soe_check(EV_FA_HZ_FAIL+sw*EV_SW_NUM)==false)
  3352. {
  3353. soe_record_ev(EV_FA_HZ_FAIL+sw*EV_SW_NUM, 1, 0,0,0 );
  3354. }
  3355. #elif defined GD_AREA_ZHONGSHAN
  3356. if(soe_check(EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM)==false)
  3357. {
  3358. soe_record_ev(EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM, 1, 0,0,0 );
  3359. }
  3360. #endif
  3361. break;
  3362. }
  3363. }
  3364. //开关拒动
  3365. if(soe_check(EV_HZFAIL+sw*EV_SW_NUM)==true)
  3366. {
  3367. #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_ZHONGSHAN_2020
  3368. if(soe_check(EV_FA_HZ_FAIL+sw*EV_SW_NUM)==false)
  3369. {
  3370. soe_record_ev(EV_FA_HZ_FAIL+sw*EV_SW_NUM, 1, 0,0,0 );
  3371. }
  3372. #elif defined GD_AREA_ZHONGSHAN
  3373. if(soe_check(EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM)==false)
  3374. {
  3375. soe_record_ev(EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM, 1, 0,0,0 );
  3376. }
  3377. #endif
  3378. fa_l_state_change(sw,L_INIT);
  3379. }
  3380. if(pSW->tOnYLTime.boolTrip)
  3381. {
  3382. TempBSTZ=false;
  3383. fa_l_state_change(sw,L_RELAYON);
  3384. #ifdef GD_AREA_HEYUAN_2021
  3385. pSW->uSdhz_L.bFlag.bYtOn = true;
  3386. #endif
  3387. //2020-03-17 EV_GOOSE_HZ_OK
  3388. if(pR->tSWST.uSWST.bFlag.bHZWZ)//开关合位,SOE转供电成功
  3389. {
  3390. #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_ZHONGSHAN_2020
  3391. if(soe_check(EV_FA_HZ_OK+sw*EV_SW_NUM)==false)
  3392. {
  3393. soe_record_ev(EV_FA_HZ_OK+sw*EV_SW_NUM, 1, 0,0,0 );
  3394. }
  3395. #elif defined GD_AREA_ZHONGSHAN
  3396. if(soe_check(EV_GOOSE_HZ_OK+sw*EV_SW_NUM)==false)
  3397. {
  3398. soe_record_ev(EV_GOOSE_HZ_OK+sw*EV_SW_NUM, 1, 0,0,0 );
  3399. }
  3400. #endif
  3401. }
  3402. else
  3403. {
  3404. #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_ZHONGSHAN_2020
  3405. if(soe_check(EV_FA_HZ_FAIL+sw*EV_SW_NUM)==false)
  3406. {
  3407. soe_record_ev(EV_FA_HZ_FAIL+sw*EV_SW_NUM, 1, 0,0,0 );
  3408. }
  3409. #elif defined GD_AREA_ZHONGSHAN
  3410. if(soe_check(EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM)==false)
  3411. {
  3412. soe_record_ev(EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM, 1, 0,0,0 );
  3413. }
  3414. #endif
  3415. fa_l_state_change(sw,L_INIT);
  3416. }
  3417. }
  3418. else if(pSW->uSdhz_L.bFlag.bPowerZ && pR->tSWST.uSWST.bFlag.bFAWL && !pR->bBSTZ)
  3419. {
  3420. #if defined GD_AREA_ZHONGSHAN_2020
  3421. if(pR->tLostVot.uLostVot.bFlag.bSHWY)
  3422. break;
  3423. #endif
  3424. fa_sw_opt(sw, EV_FA_FZ);
  3425. TempBSTZ=false;
  3426. ResetTR(&pSW->tUABL25ms);//跳闸后,将电压计时器清零,防止INIT 状态后,合位未及时检测到又返回 L_YL_TIME
  3427. ResetTR(&pSW->tUBCL25ms);
  3428. pSW->uSdhz_L.bFlag.bDBYY=0;
  3429. #ifdef FUNC_YL_FZ_SOE
  3430. if(soe_check(EV_YL_FZ+sw*EV_SW_NUM)==false)
  3431. {
  3432. soe_record_ev(EV_YL_FZ+sw*EV_SW_NUM, 1, 0,0,0 );
  3433. }
  3434. #endif
  3435. fa_l_state_change(sw,L_INIT);
  3436. break;
  3437. }
  3438. break;
  3439. case L_RELAYON:
  3440. if(pR->tLostVot.uLostVot.bFlag.bSHWY && !pSet->bTT_fa_shbs)//手合无压,闭锁合闸
  3441. {
  3442. if(pSW->uSdhz_L.bFlag.bYY) //有压
  3443. pR->tLostVot.uLostVot.bFlag.bSHWY = FALSE; //清手合无压标志
  3444. else
  3445. break;
  3446. if(pSW->uSdhz_L.bFlag.bPowerZ && pR->tSWST.uSWST.bFlag.bHZWZ && pR->tSWST.uSWST.bFlag.bFAWL)//双侧失压&&在合位
  3447. {
  3448. fa_sw_opt(sw, EV_FA_FZ);
  3449. pSW->uSdhz_L.wfFlag = 0;
  3450. fa_l_state_change(sw,L_INIT);
  3451. break;
  3452. }
  3453. }
  3454. pR->uRmtSW.bYH_fajs_flag=false;
  3455. RunTR(&pSW->tL_RELAYONL3s, TRUE, dStep); //启动合闸确认时间计数
  3456. if(!pSW->tL_RELAYONL3s.boolTrip)
  3457. {
  3458. pR->tU0TZ.uZOV.bFlag.bU0Ov=pSW->uSdhz_L.bFlag.bOverU0&&!pSW->uSdhz_L.bFlag.bXOverUo;
  3459. }
  3460. if ((pR->tSWST.uSWST.bFlag.bTZWZ) && pSW->tL_RELAYONL3s.boolTrip)
  3461. {
  3462. pSW->uSdhz_L.wfFlag = 0;
  3463. //fa_sw_opt(sw, EV_FA_FZ);
  3464. //pSW->L_Status = L_INIT; //返回初始状态
  3465. fa_l_state_change(sw,L_INIT);
  3466. break;
  3467. }
  3468. if(pSW->uSdhz_L.bFlag.bPowerZ && pR->tSWST.uSWST.bFlag.bFAWL)//双侧失压
  3469. {
  3470. if(pR->tSWST.uSWST.bFlag.bHZWZ)
  3471. fa_sw_opt(sw, EV_FA_FZ);
  3472. pSW->uSdhz_L.wfFlag = 0;
  3473. //pSW->L_Status = L_INIT; //返回初始状态
  3474. fa_l_state_change(sw,L_INIT);
  3475. break;
  3476. }
  3477. break;
  3478. default:
  3479. break;
  3480. }
  3481. }
  3482. bool get_s_bs(WORD s_status)
  3483. {
  3484. switch(s_status)
  3485. {
  3486. case S_BSFLASH:
  3487. case S_BSXTIME:
  3488. #ifndef GD_AREA_ZHONGSHAN
  3489. case S_BSYTIME:
  3490. case S_BSHHGZ:
  3491. #endif
  3492. return true;
  3493. default:
  3494. return false;
  3495. }
  3496. return false;
  3497. }
  3498. /**************************************************************************
  3499. 函数名称:fa_s_run
  3500. 函数版本:1.00
  3501. 作者: 电力产品开发部
  3502. 创建日期:2011.10.28
  3503. 函数功能说明:顺送/逆送运行
  3504. 输入参数:
  3505. 其他输入:
  3506. 输出参数:
  3507. 返回值:
  3508. ***************************************************************************/
  3509. static void fa_s_run(int sw, DWORD dStep)
  3510. {
  3511. TRELAY_T *pR=&g_tRelay[sw];
  3512. TSDHZ_T *pSW = &pR->tSDHZ;
  3513. TSETSW *pSet = &pRunSet->tSwSet[sw];
  3514. int bJS=0,bFWJS=0;
  3515. #if defined GD_AREA_ECZD_2020 && !defined GD_AREA_ZHONGSHAN_2020
  3516. static int i=0;
  3517. bool b_SyFinish=false;
  3518. #endif
  3519. #ifdef FA_OC_COUNT
  3520. RunTR(&pSW->tFaOcCountTime,pSet->bTT_fa_oc_count&&pSW->fa_oc_count,dStep);
  3521. if(pSW->tFaOcCountTime.boolTrip)
  3522. {
  3523. pSW->fa_oc_count=0;//过流脉冲计数清零,复归
  3524. }
  3525. #endif
  3526. if ((pR->uRmtSW.bYTExecute || pR->uRmtSW.bHandTz||pSW->bDL_Tz) && pSet->bTT_fa_sfbs)
  3527. {
  3528. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)==false) // 手动分闸,闭锁合闸
  3529. {
  3530. soe_record_ev(EV_BS_HA+sw*EV_SW_NUM, 1, 0,0,0 );
  3531. fa_s_set_savestatus(sw);
  3532. }
  3533. if(soe_check(EV_SH_BSFZ+sw*EV_SW_NUM)==true) //
  3534. {
  3535. soe_record_ev(EV_SH_BSFZ+sw*EV_SW_NUM, 0, 0,0,0 );
  3536. }
  3537. if(soe_check(EV_BSTZ_FA+sw*EV_SW_NUM)==true)
  3538. {
  3539. soe_record_ev(EV_BSTZ_FA+sw*EV_SW_NUM, 0, 0,0,0 );
  3540. }
  3541. ResetTR(&pSW->tOnJSTime); //js时间计数
  3542. pSW->bDL_Tz=false;
  3543. pR->uRmtSW.bYHExecute_fa=false; //遥控合
  3544. pR->uRmtSW.bHandHz_fa=false; //遥信合
  3545. g_run_stu.js=false; //遥信解锁
  3546. //pSW->bDL_Hz=false; //拉杆合
  3547. g_run_stu.rmtjs=false; //按钮解锁
  3548. pR->uRmtSW.bYH_fajs_flag=false; //状态保持合
  3549. pR->uBHDZ.bFlag.bTZSB=false;
  3550. }
  3551. //#if defined GD_AREA_MEIZHOU_FTU || defined GD_AREA_ZHONGSHAN
  3552. #if defined GD_AREA_MEIZHOU_FTU
  3553. // 合位 && 闭锁 && 未跳闸失败 ,则可以直接合位解锁
  3554. RunTR(&pSW->tOnHW_FA_JSTime,
  3555. pR->tSWST.uSWST.bFlag.bHZWZ
  3556. && (soe_check(EV_BS_ALL+sw*EV_SW_NUM) || get_s_bs(pSW->S_Status) )
  3557. && !soe_check(EV_TZFAIL+sw*EV_SW_NUM)
  3558. && pSW->S_Status != S_BS_SW ,dStep); //js时间计数
  3559. if(pSW->tOnHW_FA_JSTime.boolTrip) //合位直接解锁,防止闭锁且合位无法解锁 2020-7-28
  3560. pSW->bDL_Hz = true;
  3561. #elif defined GD_AREA_ECZD_2020 && !defined GD_AREA_ZHONGSHAN_2020
  3562. //合后故障后需等双侧完全失压才允许判解锁逻辑,
  3563. //因解锁时间判50ms,合后故障后50ms内有压来不及变为无压导致判定分位、双侧有压进入解锁会执行逻辑出错
  3564. if(pSW->uSdhz_S.bFlag.bHhgz && pSW->uSdhz_S.bFlag.bDBYY)
  3565. {
  3566. b_SyFinish = false;
  3567. }
  3568. else
  3569. {
  3570. b_SyFinish = true;
  3571. pSW->uSdhz_S.bFlag.bHhgz = false;
  3572. }
  3573. RunTR(&pSW->tOnHW_FA_JSTime,
  3574. ((pR->tSWST.uSWST.bFlag.bDITW && pSW->uSdhz_S.bFlag.bDBYY && (soe_check(EV_BS_DB+sw*EV_SW_NUM)==false))// 双侧有压 && 分位 && 非双电源闭锁
  3575. || (pR->tSWST.uSWST.bFlag.bDIHW && pSW->uSdhz_S.bFlag.bYY)) // 有压 && 合位
  3576. #ifdef GD_AREA_ECZD_MAOMING
  3577. && ((soe_check(EV_BS_ALL+sw*EV_SW_NUM) && soe_check(EV_BS_HA+sw*EV_SW_NUM)) || get_s_bs(pSW->S_Status) )
  3578. #else
  3579. && ((soe_check(EV_BS_ALL+sw*EV_SW_NUM) && !soe_check(EV_BS_HA+sw*EV_SW_NUM)) || get_s_bs(pSW->S_Status) )
  3580. #endif
  3581. && !soe_check(EV_TZFAIL+sw*EV_SW_NUM)
  3582. && b_SyFinish
  3583. ,dStep);
  3584. //&& pSW->S_Status != S_BS_SW ,dStep);
  3585. if(pSW->tOnHW_FA_JSTime.boolTrip)
  3586. {
  3587. if(pR->tSWST.uSWST.bFlag.bDIHW && pSW->uSdhz_S.bFlag.bYY)
  3588. {
  3589. bJS=1;
  3590. }
  3591. else
  3592. {//双侧有压且分位满足解锁条件后进入init状态,报对侧来电解锁SOE
  3593. bFWJS=1;
  3594. }
  3595. }
  3596. if(pR->tSWST.uSWST.bFlag.bDIHW && soe_check(EV_BS_ALL+sw*EV_SW_NUM))
  3597. {//有闭锁合闸事件且开关在合位,如果失压应能报失电分闸
  3598. if(((i==0)||(i==2)) && pSW->uSdhz_S.bFlag.bYY)
  3599. {//如果开关合后有压
  3600. i=1;
  3601. }
  3602. else if(((i==0)||(i==2)) && !pSW->uSdhz_S.bFlag.bYY)
  3603. {
  3604. i=2;
  3605. }
  3606. if(i==1)
  3607. {
  3608. if(pSW->uSdhz_S.bFlag.bPowerZ && pR->tSWST.uSWST.bFlag.bFAWL) //停电或无流则报失电分闸
  3609. {
  3610. i=0;
  3611. fa_sw_opt(sw, EV_FA_FZ);
  3612. }
  3613. }
  3614. }
  3615. else
  3616. {
  3617. i=0;
  3618. }
  3619. if(soe_check(EV_BS_X_P+sw*EV_SW_NUM)==false
  3620. && soe_check(EV_BS_X_L+sw*EV_SW_NUM)==false
  3621. && soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==false
  3622. && soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==false
  3623. && soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==false
  3624. && soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==false
  3625. && soe_check(EV_HHGZ+sw*EV_SW_NUM)==false
  3626. )
  3627. {//合位解锁手分闭锁合闸
  3628. #ifndef GD_AREA_ECZD_MAOMING
  3629. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)&&(pSW->bDL_Hz||pR->uRmtSW.bHandHz_fa||pR->uRmtSW.bYHExecute_fa||soe_check(EV_DL_HZ+sw*EV_SW_NUM)))//手分/遥分闭锁后,再次手合/遥控合立即解锁
  3630. {
  3631. bJS = 1;
  3632. }
  3633. #endif
  3634. }
  3635. #elif defined GD_AREA_ZHONGSHAN
  3636. RunTR(&pSW->tOnHW_FA_JSTime,
  3637. pR->tSWST.uSWST.bFlag.bDIHW
  3638. && (pSW->uSdhz_S.bFlag.bUABYY || pSW->uSdhz_S.bFlag.bUBCYY)
  3639. && (get_s_bs(pSW->S_Status)
  3640. || (soe_check(EV_HHGZ+sw*EV_SW_NUM) && !(soe_check(EV_HHGZ_P+sw*EV_SW_NUM) && soe_check(EV_HHGZ_L+sw*EV_SW_NUM))) //非双侧合后故障
  3641. || (soe_check(EV_BS_Y_P+sw*EV_SW_NUM) != soe_check(EV_BS_Y_L+sw*EV_SW_NUM))) //非双侧Y闭锁
  3642. && !soe_check(EV_TZFAIL+sw*EV_SW_NUM)
  3643. && pSW->S_Status != S_BS_SW ,dStep); //js时间计数
  3644. if(pSW->tOnHW_FA_JSTime.boolTrip)
  3645. {
  3646. pR->uRmtSW.bYH_fajs_flag= true;
  3647. }
  3648. if(pSW->S_Status == S_XTIME)
  3649. {
  3650. if(pR->run_stu.sw==2)
  3651. { //X计时过程有合信号时,先记录上电侧,因本体合闸有100ms延时,往下代码在本体合后才判上电侧会导致逻辑出错
  3652. pSW->uSdhz_S.bFlag.bPower=pSW->uSdhz_S.bFlag.bUABYY;
  3653. }
  3654. }
  3655. #elif defined GD_AREA_ZHONGSHAN_2020
  3656. RunTR(&pSW->tOnHW_FA_JSTime,
  3657. pR->tSWST.uSWST.bFlag.bDIHW
  3658. && (pSW->uSdhz_S.bFlag.bUABYY || pSW->uSdhz_S.bFlag.bUBCYY)
  3659. && (soe_check(EV_BS_ALL+sw*EV_SW_NUM) || get_s_bs(pSW->S_Status) )
  3660. && !soe_check(EV_TZFAIL+sw*EV_SW_NUM)
  3661. && pSW->S_Status != S_BS_SW ,dStep); //js时间计数
  3662. if(pSW->tOnHW_FA_JSTime.boolTrip)//合位直接解锁,防止闭锁且合位无法解锁 2020-7-28
  3663. {
  3664. pR->uRmtSW.bYH_fajs_flag= true;
  3665. }
  3666. #if 1
  3667. if(soe_check(EV_BS_X_P+sw*EV_SW_NUM)==false
  3668. && soe_check(EV_BS_X_L+sw*EV_SW_NUM)==false
  3669. && soe_check(EV_BS_Y_P+sw*EV_SW_NUM)==false
  3670. && soe_check(EV_BS_Y_L+sw*EV_SW_NUM)==false
  3671. && soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==false
  3672. && soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==false
  3673. && soe_check(EV_HHGZ+sw*EV_SW_NUM)==false
  3674. )
  3675. {
  3676. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)&&(pSW->bDL_Hz||pR->uRmtSW.bHandHz_fa||soe_check(EV_DL_HZ+sw*EV_SW_NUM)))//手分闭锁后,再次手合立即解锁
  3677. {
  3678. pR->uRmtSW.bYH_fajs_flag= true;
  3679. }
  3680. }
  3681. #endif
  3682. //拉杆合、遥信合、遥控合进入Y计时 2020-12-23
  3683. if((pSW->bDL_Hz||pR->uRmtSW.bHandHz_fa||pR->uRmtSW.bYHExecute_fa)&&pR->tSWST.uSWST.bFlag.bHZWZ && pSW->S_Status != S_YTIME)
  3684. {
  3685. //pR->uRmtSW.bYH_fajs_flag= true;
  3686. pR->tLostVot.uLostVot.bFlag.bSHWY=!(pSW->uSdhz_S.bFlag.bUABYY||pSW->uSdhz_S.bFlag.bUBCYY);//将手合状态电压保存
  3687. fa_s_state_change(sw,S_YTIME);//
  3688. if(soe_check(EV_BS_HA+sw*EV_SW_NUM))//手分闭锁清
  3689. soe_record_ev(EV_BS_HA, 0, 0,0,0 );
  3690. pSW->bDL_Hz = false;
  3691. pR->uRmtSW.bHandHz_fa=false;
  3692. pR->uRmtSW.bYHExecute_fa=false;
  3693. //#if defined GD_AREA_ZHONGSHAN_2020 //中山2020允许无压进入Y实现即时,需将故障定时器清零
  3694. ResetTR(&pSW->tGZJYRstGLTime);
  3695. ResetTR(&pSW->tGZJYRstGL_II_Time);
  3696. ResetTR(&pSW->tGZJYRstJDTime);
  3697. ResetTR(&pSW->tGZJYRstGL2Time);
  3698. ResetTR(&pSW->tGZJYRstJD2Time);
  3699. ResetTR(&pR->tU0TZ.tZOVTime);
  3700. #ifdef FUNC_DRIVE_JY
  3701. ResetTR(&gb_drive.tDriveFaBSTime);
  3702. #endif
  3703. //#endif
  3704. }
  3705. else
  3706. {
  3707. pSW->bDL_Hz = false;
  3708. //pR->uRmtSW.bHandHz_fa=false;
  3709. //pR->uRmtSW.bYHExecute_fa=false;
  3710. }
  3711. #endif
  3712. #ifdef FUNC_REBOOT_BS_HA_JS_3S
  3713. RunTR(&pSW->tHW_JS_HA_3STime, (g_tRelay[sw].uRmtSW.b_bsha && pR->tSWST.uSWST.bFlag.bDIHW), dStep);
  3714. if(pSW->tHW_JS_HA_3STime.boolTrip)
  3715. {
  3716. g_tRelay[sw].uRmtSW.b_bsha = false;
  3717. g_run_stu.js = true;
  3718. }
  3719. #endif
  3720. //手合、遥合解锁
  3721. if ((pR->uRmtSW.bYHExecute_fa&&pR->tSWST.uSWST.bFlag.bHZWZ) //遥控合
  3722. ||(pR->uRmtSW.bHandHz_fa&&pR->tSWST.uSWST.bFlag.bHZWZ) //遥信合
  3723. ||g_run_stu.js //遥信解锁
  3724. ||pSW->bDL_Hz //拉杆合
  3725. ||g_run_stu.rmtjs //按钮解锁
  3726. ||(pR->uRmtSW.bYH_fajs_flag&&pR->tSWST.uSWST.bFlag.bHZWZ) //状态保持合
  3727. || bFWJS || bJS
  3728. ) // 解锁
  3729. {
  3730. bool bUAB,bUBC;
  3731. bool bU0;
  3732. #ifdef GD_AREA_ZHONGSHAN
  3733. bool b_temp; //记录清所有标志前的上电侧标志
  3734. #endif
  3735. bUAB = pSW->uSdhz_S.bFlag.bUABYY;
  3736. bUBC = pSW->uSdhz_S.bFlag.bUBCYY;
  3737. bU0=pSW->uSdhz_S.bFlag.bOverU0;
  3738. //遥控合&遥信合
  3739. #ifndef GD_AREA_ZHONGSHAN
  3740. if(pR->uRmtSW.bYHExecute_fa||pR->uRmtSW.bHandHz_fa)
  3741. pR->uRmtSW.bYH_fajs_flag=true;
  3742. #endif
  3743. #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_ZHUHAI_FTU || (defined GD_AREA_ECZD_2020 && !defined GD_AREA_ZHONGSHAN_2020) || defined GD_AREA_ZHONGSHAN//有压且合位的时候才能解锁
  3744. #ifdef GD_AREA_ZHONGSHAN
  3745. if(soe_check(EV_HHGZ+sw*EV_SW_NUM) || soe_check(EV_BS_UF_L+sw*EV_SW_NUM) || soe_check(EV_BS_UF_P+sw*EV_SW_NUM)
  3746. || soe_check(EV_BS_X_P+sw*EV_SW_NUM) || soe_check(EV_BS_X_L+sw*EV_SW_NUM)
  3747. || soe_check(EV_BS_Y_P+sw*EV_SW_NUM) || soe_check(EV_BS_Y_L+sw*EV_SW_NUM))
  3748. #else
  3749. if(soe_check(EV_HHGZ+sw*EV_SW_NUM))
  3750. #endif
  3751. {
  3752. #if defined GD_AREA_ECZD_2020 && !defined GD_AREA_ZHONGSHAN_2020
  3753. if(bFWJS || bJS || g_run_stu.rmtjs || g_run_stu.js) //满足解锁条件解锁/按钮解锁/遥信解锁
  3754. {
  3755. ;
  3756. }
  3757. #elif defined GD_AREA_ZHONGSHAN
  3758. if(g_run_stu.rmtjs || g_run_stu.js || ((bUAB||bUBC) && pR->uRmtSW.bYH_fajs_flag && pR->tSWST.uSWST.bFlag.bHZWZ ))// 有压 && 合位
  3759. {
  3760. ;//解锁
  3761. }
  3762. #else
  3763. if((bUAB||bUBC) && pR->tSWST.uSWST.bFlag.bHZWZ )// 有压 && 合位
  3764. ;//解锁
  3765. #endif
  3766. else
  3767. {
  3768. g_run_stu.js=0;
  3769. g_run_stu.rmtjs=0;
  3770. return ;//不允许解锁;
  3771. }
  3772. }
  3773. #ifdef GD_AREA_ZHUHAI_FTU//珠海之前提出Y闭锁后有压不允许解锁,合后故障有压且合位才能解锁
  3774. if(soe_check(EV_BS_Y_P+sw*EV_SW_NUM)||soe_check(EV_BS_Y_L+sw*EV_SW_NUM))
  3775. {
  3776. if(bUAB||bUBC)// 有压
  3777. {
  3778. g_run_stu.js=0;
  3779. g_run_stu.rmtjs=0;
  3780. return ;//不允许解锁;
  3781. }
  3782. }
  3783. #endif
  3784. #endif
  3785. #if defined GD_AREA_ECZD_2020 && !defined GD_AREA_ZHONGSHAN_2020
  3786. if(soe_check(EV_BS_ALL+sw*EV_SW_NUM))
  3787. {
  3788. if(bFWJS || bJS || g_run_stu.rmtjs || g_run_stu.js) //满足解锁条件解锁/按钮解锁/遥信解锁
  3789. {
  3790. ;
  3791. }
  3792. else
  3793. {
  3794. g_run_stu.js=0;
  3795. g_run_stu.rmtjs=0;
  3796. return ;//不允许解锁;
  3797. }
  3798. }
  3799. #endif
  3800. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_YUNFU || defined GD_AREA_ZHONGSHAN_2020 //中山&东莞 有压不允许直接解锁
  3801. #if 0//def GD_AREA_ZHONGSHAN//中山局要求手合闸后,双侧有压且合位6S后才能解锁(正向解锁方式)
  3802. if( (pSW->bDL_Hz||pR->uRmtSW.bHandHz_fa||pR->uRmtSW.bYHExecute_fa||pR->uRmtSW.bYH_fajs_flag) &&soe_check(EV_BS_ALL+sw*EV_SW_NUM))
  3803. {
  3804. RunTR(&pSW->tOnJSTime,pSW->uSdhz_S.bFlag.bDBYY,dStep); //js时间计数
  3805. if(!pSW->tOnJSTime.boolTrip )
  3806. {
  3807. return;
  3808. }
  3809. }
  3810. #endif
  3811. if (g_run_stu.js||g_run_stu.rmtjs)
  3812. {
  3813. if(soe_check(EV_BS_ALL+sw*EV_SW_NUM))//闭锁合闸
  3814. {
  3815. if(bUAB||bUBC)//有压
  3816. {
  3817. //pR->uRmtSW.bYHExecute_fa=0;
  3818. //pR->uRmtSW.bHandHz_fa=0;
  3819. g_run_stu.js=0;
  3820. g_run_stu.rmtjs=0;
  3821. return ;//有压不允许直接解锁
  3822. }
  3823. }
  3824. }
  3825. #endif
  3826. #if 0
  3827. else if(pSW->bDL_Hz || pR->uRmtSW.bYH_fajs_flag || pR->uRmtSW.bHandHz_fa)//分段(?) -> 手合或遥控合闸,开关两侧至少有一侧电压正常,延时6s解除残压闭锁。(中山局新增)
  3828. {
  3829. if(pSW->S_Status == S_BSFLASH||soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==true||soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==true)
  3830. {
  3831. //手合或遥控合闸,开关两侧至少有一侧电压正常,延时6s解除残压闭锁。
  3832. RunTR(&pSW->tOnJSTime, (bUAB||bUBC), dStep); //js时间计数
  3833. if(!pSW->tOnJSTime.boolTrip)//残压闭锁后 开关合位且双侧有压才能解锁
  3834. return;
  3835. }
  3836. ResetTR(&pSW->tOnJSTime); //js时间计数
  3837. SignalReset(0,false);
  3838. }
  3839. #endif
  3840. #if defined GD_AREA_ECZD_2020
  3841. if((pSW->bDL_Hz||pR->uRmtSW.bYHExecute_fa||pR->uRmtSW.bHandHz_fa||bJS)&&pSW->uSdhz_S.bFlag.bYY&&pR->tSWST.uSWST.bFlag.bHZWZ)
  3842. {
  3843. pR->tLostVot.uLostVot.bFlag.bSHWY=!(pSW->uSdhz_S.bFlag.bUABYY||pSW->uSdhz_S.bFlag.bUBCYY);
  3844. fa_s_state_change(sw,S_YTIME);
  3845. bJS = false;
  3846. pSW->bDL_Hz = false;
  3847. pR->uRmtSW.bHandHz_fa=false;
  3848. pR->uRmtSW.bYHExecute_fa=false;
  3849. ResetTR(&pSW->tGZJYRstGLTime);
  3850. ResetTR(&pSW->tGZJYRstGL_II_Time);
  3851. ResetTR(&pSW->tGZJYRstJDTime);
  3852. ResetTR(&pSW->tGZJYRstGL2Time);
  3853. ResetTR(&pSW->tGZJYRstJD2Time);
  3854. ResetTR(&pR->tU0TZ.tZOVTime);
  3855. #ifdef FUNC_DRIVE_JY
  3856. ResetTR(&gb_drive.tDriveFaBSTime);
  3857. #endif
  3858. }
  3859. #endif
  3860. #if defined GD_AREA_CHAOZHOU_2021
  3861. #if defined GD_AREA_CHAOZHOUFENGXI
  3862. if (g_run_stu.js||g_run_stu.rmtjs)
  3863. { //潮州要求人工干预直接解锁 2020-8-4
  3864. if(bUAB||bUBC)//有压
  3865. {
  3866. pR->uRmtSW.bYHExecute_fa=0;
  3867. pR->uRmtSW.bHandHz_fa=0;
  3868. g_run_stu.js=0;
  3869. g_run_stu.rmtjs=0;
  3870. return ;//当前有压不允许直接解锁
  3871. }
  3872. }else
  3873. #endif
  3874. if(pSW->S_Status == S_BSFLASH||soe_check(EV_BS_UF_L+sw*EV_SW_NUM)==true||soe_check(EV_BS_UF_P+sw*EV_SW_NUM)==true)
  3875. {
  3876. RunTR(&pSW->tOnJSTime, (bUAB||bUBC), dStep); //js时间计数
  3877. if(!pSW->tOnJSTime.boolTrip)//残压闭锁后
  3878. return;
  3879. ResetTR(&pSW->tOnJSTime); //js时间计数
  3880. //SignalReset(0,false);
  3881. }
  3882. #endif
  3883. SignalReset(0,false);
  3884. g_tRelay[sw].tDYJL.bLed=false;
  3885. g_tRelay[sw].tPLJL.bLed=false;
  3886. #ifdef GD_AREA_ZHONGSHAN
  3887. b_temp = pSW->uSdhz_S.bFlag.bPower;
  3888. #endif
  3889. pSW->uSdhz_S.wfFlag = 0;
  3890. pSW->bS_BSLed = 0;
  3891. pSW->uSdhz_S.bFlag.bUABYY = bUAB;
  3892. pSW->uSdhz_S.bFlag.bUBCYY = bUBC;
  3893. #ifdef GD_AREA_ZHONGSHAN
  3894. if(pSW->S_Status == S_YTIME)
  3895. { //X计时过程中本体合进入YTIME,本体合瞬间UAB已有压,但本体合信号需延时100ms,所以应以100ms前的上电侧为准
  3896. pSW->uSdhz_S.bFlag.bPower = b_temp;
  3897. }
  3898. else
  3899. #endif
  3900. {
  3901. pSW->uSdhz_S.bFlag.bPower=pSW->uSdhz_S.bFlag.bUABYY;
  3902. }
  3903. //pSW->uSdhz_S.bFlag.bTempJS = false;
  3904. #ifdef FA_BSYTIME_JS
  3905. rst_ybs_soe( sw);
  3906. #endif
  3907. pR->bBSHZ=false; // 解锁合闸闭锁
  3908. fa_close_led(sw);
  3909. pR->tU0TZ.bU0Led=false;
  3910. if(g_run_stu.js||g_run_stu.rmtjs||bFWJS||bJS) // 解锁后,进入初始状态
  3911. {//解锁条件后期需更改?无闭锁直接退出?
  3912. if(pR->tSWST.uSWST.bFlag.bHZWZ)//当前在合位且正常运行态,直接切换至正常运行???
  3913. {
  3914. //#ifdef GD_AREA_ZHUHAI_V2//珠海要求B侧需判断对侧开关位置
  3915. #if defined GD_AREA_ZHUHAI_V2 //|| defined GD_AREA_JIEYANG
  3916. pR->tLostVot.uLostVot.bFlag.bSHWY=!(bUAB||(bUBC&&pR->run_stu.fa_start_hz));//将手合状态电压保存
  3917. #elif defined GD_AREA_JIEYANG
  3918. pR->tLostVot.uLostVot.bFlag.bSHWY=!(bUBC||(bUAB&&pR->run_stu.fa_start_hz));//将手合状态电压保存
  3919. #else
  3920. pR->tLostVot.uLostVot.bFlag.bSHWY=!(bUAB||bUBC);//将手合状态电压保存
  3921. #endif
  3922. pSW->uSdhz_S.bFlag.bPowerZ=0;
  3923. ResetTR(&pR->tLostVot.tLostVotTime);//重新开始Z计时
  3924. fa_s_state_change(sw,S_USUAL);//
  3925. pR->thzbs.fztimes=0; //连续分闸计数清零
  3926. pSW->uSdhz_S.bFlag.bOppositeYY =false;
  3927. pR->tSWST.uSWST.bFlag.bSDJS =true;
  3928. ResetTR(&pSW->tOpsiteYY100ms);
  3929. ResetTR(&pSW->tGZJYRstGLTime);
  3930. ResetTR(&pSW->tGZJYRstGL_II_Time);
  3931. ResetTR(&pSW->tGZJYRstJDTime);
  3932. ResetTR(&pSW->tGZJYRstGL2Time);
  3933. ResetTR(&pSW->tGZJYRstJD2Time);
  3934. }
  3935. else
  3936. {
  3937. fa_s_state_change(sw,S_INIT);//pSW->S_Status = S_INIT;
  3938. //pSW->uSdhz_S.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  3939. }
  3940. SignalReset(0,true);
  3941. }
  3942. else if(pSW->S_Status != S_YTIME)//手合启动Y时限// if(bUAB||bUBC) //手合遥控合,开关合,单侧有电压
  3943. {
  3944. ResetTR(&pSW->tOnYSTime); //清零Y计时
  3945. pR->tU0TZ.uZOV.bFlag.bU0Ov=false;
  3946. pR->tLostVot.uLostVot.bFlag.bStartLock = false;
  3947. pR->tLostVot.uLostVot.bFlag.bGL = false;
  3948. pSW->uSdhz_S.bFlag.bGL = false;
  3949. pSW->uSdhz_S.bFlag.bGL_II=false;
  3950. pSW->uSdhz_S.bFlag.bJD = false;
  3951. pSW->uSdhz_S.bFlag.bXOverUo=bU0;
  3952. //#ifdef GD_AREA_ZHUHAI_V2//珠海要求B侧需判断对侧开关位置
  3953. #if defined GD_AREA_ZHUHAI_V2 //|| defined GD_AREA_JIEYANG
  3954. pR->tLostVot.uLostVot.bFlag.bSHWY=!(bUAB||(bUBC&&pR->run_stu.fa_start_hz));//将手合状态电压保存
  3955. #elif defined GD_AREA_JIEYANG
  3956. pR->tLostVot.uLostVot.bFlag.bSHWY=!(bUBC||(bUAB&&pR->run_stu.fa_start_hz));//将手合状态电压保存
  3957. #else
  3958. pR->tLostVot.uLostVot.bFlag.bSHWY=!(bUAB||bUBC);//将手合状态电压保存
  3959. #endif
  3960. #ifndef GD_AREA_ZHONGSHAN_2020 //中山2020要求手合无压进入Y时间,如果Y时间合后故障则闭锁双侧 2020-12-23
  3961. if(pR->tLostVot.uLostVot.bFlag.bSHWY || pSW->S_Status == S_USUAL)
  3962. {
  3963. pSW->uSdhz_S.bFlag.bPowerZ=0;
  3964. ResetTR(&pR->tLostVot.tLostVotTime);//重新开始Z计时
  3965. fa_s_state_change(sw,S_USUAL);//pSW->S_Status = S_USUAL;//手合于无压,闭锁合闸
  3966. #ifndef GD_AREA_YUNFU //云浮要求不报 手合/遥合闭锁失压分 SOE
  3967. if(soe_check(EV_SH_BSFZ+sw*EV_SW_NUM)==false && !pSet->bTT_fa_shbs) //
  3968. {
  3969. soe_record_ev(EV_SH_BSFZ+sw*EV_SW_NUM, 1, 0,0,0 );
  3970. }
  3971. #endif
  3972. pR->thzbs.fztimes=0; //连续分闸计数清零
  3973. }
  3974. else
  3975. #endif
  3976. {
  3977. #ifdef GD_AREA_ZHONGSHAN
  3978. if(pSW->S_Status != S_BSFZ)
  3979. #endif
  3980. fa_s_state_change(sw,S_YTIME);//pSW->S_Status = S_YTIME;//手合启动Y时限
  3981. if(soe_check(EV_FA_GL_TZ+sw*EV_SW_NUM)==true)
  3982. soe_record_ev(EV_FA_GL_TZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  3983. //#if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 //潮州局要求合后电流两段处理
  3984. #if defined GD_AREA_CHAOZHOU || defined GD_AREA_SHANTOU || defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  3985. if(soe_check(EV_FA_GL_TZ2+sw*EV_SW_NUM)==true)
  3986. soe_record_ev(EV_FA_GL_TZ2+sw*EV_SW_NUM, 0, 0,0 ,0 );
  3987. #endif
  3988. if(soe_check(EV_FA_LX_TZ+sw*EV_SW_NUM)==true)
  3989. soe_record_ev(EV_FA_LX_TZ+sw*EV_SW_NUM, 0, 0,0 ,0 );
  3990. }
  3991. pSW->uSdhz_S.bFlag.bOppositeYY =false;
  3992. pR->tSWST.uSWST.bFlag.bSDJS =true;
  3993. ResetTR(&pSW->tOpsiteYY100ms);
  3994. ResetTR(&pSW->tGZJYRstGLTime);
  3995. ResetTR(&pSW->tGZJYRstGL_II_Time);
  3996. ResetTR(&pSW->tGZJYRstJDTime);
  3997. ResetTR(&pSW->tGZJYRstGL2Time);
  3998. ResetTR(&pSW->tGZJYRstJD2Time);
  3999. #ifdef FUNC_DRIVE_JY
  4000. ResetTR(&gb_drive.tDriveFaBSTime);
  4001. #endif
  4002. }
  4003. /*else
  4004. {
  4005. pSW->S_Status = S_INIT;
  4006. pSW->uSdhz_S.bFlag.bSaveStatus = TRUE; //存储状态标志、来电切换状态
  4007. }*/
  4008. if(soe_check(EV_GOOSE_GZBS_FA)==true) // goose故障闭锁
  4009. soe_record_ev(EV_GOOSE_GZBS_FA, 0, 0,0,0 );
  4010. if(soe_check(EV_GOOSE_TZBS_FA)==true) // goose故障闭锁
  4011. soe_record_ev(EV_GOOSE_TZBS_FA, 0, 0,0,0 );
  4012. if(g_run_stu.js||g_run_stu.rmtjs)
  4013. {
  4014. if(soe_check(EV_JS_HA+sw*EV_SW_NUM)==false) //
  4015. {
  4016. soe_record_ev(EV_JS_HA+sw*EV_SW_NUM, 1, 0,0,0 );
  4017. }
  4018. if(soe_check(EV_JS_HZ+sw*EV_SW_NUM)==true) //
  4019. {
  4020. soe_record_ev(EV_JS_HZ+sw*EV_SW_NUM, 0, 0,0,0 );
  4021. }
  4022. if(soe_check(EV_JS_L+sw*EV_SW_NUM)==true) //
  4023. {
  4024. soe_record_ev(EV_JS_L+sw*EV_SW_NUM, 0, 0,0,0 );
  4025. }
  4026. if(soe_check(EV_JS_POWER+sw*EV_SW_NUM)==true) //
  4027. {
  4028. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 0, 0,0,0 );
  4029. }
  4030. if(soe_check(EV_BSTZ_FA+sw*EV_SW_NUM)==true)
  4031. {
  4032. soe_record_ev(EV_BSTZ_FA+sw*EV_SW_NUM, 0, 0,0,0 );
  4033. }
  4034. if(soe_check(EV_FA_U0GJ+sw*EV_SW_NUM)==true)
  4035. {
  4036. soe_record_ev(EV_FA_U0GJ+sw*EV_SW_NUM, 0, 0,0,0 );
  4037. }
  4038. }
  4039. #ifdef GD_AREA_ECZD_2020
  4040. else if(bFWJS)
  4041. {
  4042. if(soe_check(EV_JS_POWER+sw*EV_SW_NUM)==false) //
  4043. {
  4044. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 1, 0,0,0 );
  4045. }
  4046. if(soe_check(EV_JS_HA+sw*EV_SW_NUM)==true) //
  4047. {
  4048. soe_record_ev(EV_JS_HA+sw*EV_SW_NUM, 0, 0,0,0 );
  4049. }
  4050. if(soe_check(EV_JS_HZ+sw*EV_SW_NUM)==true) //
  4051. {
  4052. soe_record_ev(EV_JS_HZ+sw*EV_SW_NUM, 0, 0,0,0 );
  4053. }
  4054. if(soe_check(EV_JS_HA+sw*EV_SW_NUM)==true) //
  4055. {
  4056. soe_record_ev(EV_JS_HA+sw*EV_SW_NUM, 0, 0,0,0 );
  4057. }
  4058. if(soe_check(EV_JS_L+sw*EV_SW_NUM)==true) //
  4059. {
  4060. soe_record_ev(EV_JS_L+sw*EV_SW_NUM, 0, 0,0,0 );
  4061. }
  4062. if(soe_check(EV_JS_POWER+sw*EV_SW_NUM)==true) //
  4063. {
  4064. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 0, 0,0,0 );
  4065. }
  4066. }
  4067. #endif
  4068. else
  4069. {
  4070. if(soe_check(EV_JS_HZ+sw*EV_SW_NUM)==false&&soe_check(EV_BS_ALL+sw*EV_SW_NUM)==true) //
  4071. {
  4072. soe_record_ev(EV_JS_HZ+sw*EV_SW_NUM, 1, 0,0,0 );
  4073. }
  4074. if(soe_check(EV_JS_HA+sw*EV_SW_NUM)==true) //
  4075. {
  4076. soe_record_ev(EV_JS_HA+sw*EV_SW_NUM, 0, 0,0,0 );
  4077. }
  4078. if(soe_check(EV_JS_L+sw*EV_SW_NUM)==true) //
  4079. {
  4080. soe_record_ev(EV_JS_L+sw*EV_SW_NUM, 0, 0,0,0 );
  4081. }
  4082. if(soe_check(EV_JS_POWER+sw*EV_SW_NUM)==true) //
  4083. {
  4084. soe_record_ev(EV_JS_POWER+sw*EV_SW_NUM, 0, 0,0,0 );
  4085. }
  4086. }
  4087. {
  4088. TLOSTVOT_T *pSW = &pR->tLostVot;
  4089. pSW->losttimes=0;
  4090. }
  4091. g_run_stu.rmtjs=false;
  4092. #if defined FUNC_MODE_JS || defined FUNC_ONLY_MMD_JS
  4093. if(!gb_js_mode)
  4094. #endif
  4095. {
  4096. g_run_stu.js=false;
  4097. }
  4098. pSW->bDL_Hz=false;
  4099. pR->uRmtSW.bYHExecute_fa=false;
  4100. pR->uRmtSW.bHandHz_fa=false;
  4101. pR->uRmtSW.bYH_fajs_flag=false;
  4102. pSW->uSdhz_S.bFlag.bJS=true;
  4103. fa_unlock_s_bs(sw);
  4104. fa_uf_clear(sw,false);
  4105. pSW->bS_BSLed=fa_check_all_s_bs(sw);
  4106. return;
  4107. }
  4108. //运行状态流程处理
  4109. if(!fa_check_s_bs_hz(sw))
  4110. {
  4111. fa_s_status_run(sw, dStep);
  4112. }
  4113. else
  4114. {
  4115. fa_s_state_change(sw,S_INIT);//pSW->S_Status = S_USUAL;
  4116. }
  4117. pSW->bS_BSLed=fa_check_all_s_bs(sw);
  4118. //闭锁标志处理
  4119. pSW->uSdhz_S.bFlag.bLockUFlash = (pSW->S_Status == S_BSFLASH) && pSW->uSdhz_S.bFlag.bPowerYY;
  4120. // pSW->uSdhz_S.bFlag.bLockX = (pSW->S_Status == S_BSXTIME) && pSW->uSdhz_S.bFlag.bOppositeYY;
  4121. pSW->uSdhz_S.bFlag.bLockY = (pSW->S_Status == S_BSYTIME) && pSW->uSdhz_S.bFlag.bPowerYY;
  4122. // pSW->uSdhz_S.bFlag.bLockUDouble = (pSW->S_Status == S_BSDOUBLE) && pSW->uSdhz_S.bFlag.bYY;
  4123. //pSW->bS_BSLed = pSW->uSdhz_S.bFlag.bLockUFlash
  4124. // || pSW->uSdhz_S.bFlag.bLockX
  4125. // || pSW->uSdhz_S.bFlag.bLockY
  4126. // || pSW->uSdhz_S.bFlag.bLockUDouble;
  4127. //
  4128. //LED灯处理
  4129. fa_ls_led(sw, false);
  4130. /*********************合闸判断***********************/
  4131. RunTR(&pSW->tHzS100ms, pSW->uSdhz_S.bFlag.bRLONFLAG, dStep); // 合闸信号,限制在合闸脉冲时间以内
  4132. pSW->uSdhz_S.bFlag.bHz = pSW->tHzS100ms.boolTrip;
  4133. //上电加速
  4134. RunTR(&pSW->tTSDHzHJS, (pSW->uSdhz_S.bFlag.bHz && pR->tSWST.uSWST.bFlag.bTZWZ), dStep);
  4135. pR->tSWST.uSWST.bFlag.bSDJS = pSW->tTSDHzHJS.boolTrip && (!pR->tSWST.uSWST.bFlag.bTZWZ);
  4136. /************事件记录及出口****************************/
  4137. if(pSW->uSdhz_S.bFlag.bHz)
  4138. {
  4139. if(!pSW->uSdhz_S.bFlag.bHZEvent)
  4140. {
  4141. DWORD Us1,Us2;
  4142. if(pRunSet->bTT_UYYmin)
  4143. {
  4144. Us1 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_min[2]), 256, pRunSet->dKU[PUB_AC_UAB1]);
  4145. Us2 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_min[3]), 256, pRunSet->dKU[pRunSet->pt2vol]);
  4146. }
  4147. else
  4148. {
  4149. Us1 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[2]), 256, pRunSet->dKU[PUB_AC_UAB1]);
  4150. Us2 = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[3]), 256, pRunSet->dKU[pRunSet->pt2vol]);
  4151. }
  4152. //rcd_start(sw,RECORD_WAVE_TYPE_TZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  4153. soe_record_ev(EV_FA_HZ+sw*EV_SW_NUM, 1, Us1,Us2,0 );
  4154. #if defined GD_AREA_MEIZHOU_FTU || defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_JIEYANG_FTU || defined GD_AREA_ECZD_MEIZHOU_2021
  4155. if(pSW->uSdhz_S.bFlag.bPower)
  4156. soe_record_ev(EV_FA_HZ_L+sw*EV_SW_NUM, 1, Us1,Us2,0 );
  4157. else
  4158. soe_record_ev(EV_FA_HZ_P+sw*EV_SW_NUM, 1, Us1,Us2,0 );
  4159. #endif
  4160. pSW->uSdhz_S.bFlag.bHZEvent = true;
  4161. pSW->uSdhz_S.bFlag.bRLONFLAG = false;
  4162. }
  4163. }
  4164. else
  4165. {
  4166. if(pSW->uSdhz_S.bFlag.bHZEvent)
  4167. {
  4168. soe_record_ev(EV_FA_HZ+sw*EV_SW_NUM, 0, 0,0,0 );
  4169. #if defined GD_AREA_MEIZHOU_FTU || defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_JIEYANG_FTU || defined GD_AREA_ECZD_MEIZHOU_2021
  4170. if(pSW->uSdhz_S.bFlag.bPower)
  4171. soe_record_ev(EV_FA_HZ_L+sw*EV_SW_NUM,0, 0,0,0 );
  4172. else
  4173. soe_record_ev(EV_FA_HZ_P+sw*EV_SW_NUM, 0, 0,0,0 );
  4174. #endif
  4175. pSW->uSdhz_S.bFlag.bHZEvent = false;
  4176. }
  4177. }
  4178. }
  4179. /**************************************************************************
  4180. 函数名称:Pro_L_RUN
  4181. 函数版本:1.00
  4182. 作者: 电力产品开发部
  4183. 创建日期:2011.10.28
  4184. 函数功能说明:环网点运行
  4185. 输入参数:
  4186. 其他输入:
  4187. 输出参数:
  4188. 返回值:
  4189. ***************************************************************************/
  4190. static void fa_l_run(int sw, DWORD dStep)
  4191. {
  4192. bool bY1=FALSE;
  4193. bool bY2=FALSE;
  4194. #ifdef FUNC_NYY_NWY
  4195. bool bY1_n=0,bY2_n=0;
  4196. #endif
  4197. TRELAY_T *pR=&g_tRelay[sw];
  4198. TSDHZ_T *pSW = &pR->tSDHZ;
  4199. TSETSW *pSet = &pRunSet->tSwSet[sw];
  4200. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  4201. bool bY3=false,bY4=false;
  4202. #endif
  4203. //有压检测
  4204. // 电源1上电合闸
  4205. if(pRunSet->bTT_UYYmin)
  4206. {
  4207. bY1 = OverRelay(g_sw_pub.m2_min[2], pSet->dU_fa_YY, pSet->dU_fa_WY, pSW->uSdhz_L.bFlag.bUABYY);
  4208. bY2 = OverRelay(g_sw_pub.m2_min[3], pSet->dU_fa_YY2, pSet->dU_fa_WY2, pSW->uSdhz_L.bFlag.bUBCYY);
  4209. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  4210. //电源侧
  4211. {
  4212. pSW->uSdhz_L.bFlag.bHzEnable_P = true;
  4213. if(pSW->uSdhz_L.bFlag.bBsXtime_P)
  4214. pSW->uSdhz_L.bFlag.bHzEnable_P = false;
  4215. bY3 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_fa_YY, pSet->dU_fa_YY_fh, pSW->uSdhz_L.bFlag.bUABYY);
  4216. if(bY3 && pSW->uSdhz_L.bFlag.bBsXtime_P && cheak_pt_ok_ing(sw))
  4217. {
  4218. pSW->uSdhz_L.bFlag.bHzEnable_P = true;
  4219. pSW->uSdhz_L.bFlag.bBsXtime_P = false;
  4220. }
  4221. }
  4222. //负荷侧
  4223. {
  4224. pSW->uSdhz_L.bFlag.bHzEnable_L = true;
  4225. if(pSW->uSdhz_L.bFlag.bBsXtime_L)
  4226. pSW->uSdhz_L.bFlag.bHzEnable_L = false;
  4227. bY4 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_fa_YY, pSet->dU_fa_YY_fh, pSW->uSdhz_L.bFlag.bUABYY);
  4228. if(bY4 && pSW->uSdhz_L.bFlag.bBsXtime_L && cheak_pt_ok_ing(sw))
  4229. {
  4230. pSW->uSdhz_L.bFlag.bHzEnable_L = true;
  4231. pSW->uSdhz_L.bFlag.bBsXtime_L = false;
  4232. }
  4233. }
  4234. #endif
  4235. #ifdef FUNC_NYY_NWY
  4236. bY1_n = (((g_sw_pub.m2_min[2] > pSet->dU_fa_WY) && (g_sw_pub.m2_min[2] < pSet->dU_fa_YY))?true:false)
  4237. || (tPT.uPT1DX.bFlag.bQD && pSW->uSdhz_L.bFlag.bUBCYY)
  4238. ;
  4239. bY2_n = (((g_sw_pub.m2_min[3] > pSet->dU_fa_WY2) && (g_sw_pub.m2_min[3] < pSet->dU_fa_YY2))?true:false)
  4240. || (tPT.uPT2DX.bFlag.bQD && pSW->uSdhz_L.bFlag.bUABYY)
  4241. ;
  4242. #endif
  4243. }
  4244. else
  4245. {
  4246. bY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_fa_YY, pSet->dU_fa_WY, pSW->uSdhz_L.bFlag.bUABYY);
  4247. bY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_fa_YY2, pSet->dU_fa_WY2, pSW->uSdhz_L.bFlag.bUBCYY);
  4248. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  4249. pSW->uSdhz_L.bFlag.bHzEnable_P = true;
  4250. pSW->uSdhz_L.bFlag.bHzEnable_L = true;
  4251. #endif
  4252. }
  4253. RunTR(&pSW->tUABL25ms, bY1, dStep);
  4254. #ifdef GD_AREA_LIAONING_2021
  4255. pSW->uSdhz_L.bFlag.bUABYY = pSW->tUABL25ms.boolTrip && pR->run_stu.fa_start_hz;
  4256. #else
  4257. pSW->uSdhz_L.bFlag.bUABYY = pSW->tUABL25ms.boolTrip;
  4258. #endif
  4259. // 电源2上电合闸
  4260. //bY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_fa_YY, pSet->dU_fa_YY_fh, pSW->uSdhz_L.bFlag.bUBCYY);
  4261. RunTR(&pSW->tUBCL25ms, bY2, dStep);
  4262. pSW->uSdhz_L.bFlag.bUBCYY = pSW->tUBCL25ms.boolTrip;
  4263. #ifdef FUNC_NYY_NWY
  4264. RunTR(&pSW->tUABL_NYY_NWY_50ms, bY1_n, dStep);
  4265. pSW->uSdhz_L.bFlag.bUAB_NYY_NWY = pSW->tUABL_NYY_NWY_50ms.boolTrip;
  4266. RunTR(&pSW->tUBCL_NYY_NWY_50ms, bY2_n, dStep);
  4267. pSW->uSdhz_L.bFlag.bUBC_NYY_NWY = pSW->tUBCL_NYY_NWY_50ms.boolTrip;
  4268. #endif
  4269. //两侧有压
  4270. pSW->uSdhz_L.bFlag.bDBYY = pSW->uSdhz_L.bFlag.bUABYY && pSW->uSdhz_L.bFlag.bUBCYY;
  4271. /*对侧有瞬时电压
  4272. pSW->uSdhz_L.bFlag.bOppositeUF = (pSW->uSdhz_L.bFlag.bUABFlash && (!pSW->uSdhz_L.bFlag.bPower))
  4273. || (pSW->uSdhz_L.bFlag.bUBCFlash && pSW->uSdhz_L.bFlag.bPower);
  4274. */
  4275. //一侧失压
  4276. pSW->uSdhz_L.bFlag.bOneLostV = pSW->uSdhz_L.bFlag.bUABYY ^ pSW->uSdhz_L.bFlag.bUBCYY;
  4277. //有压
  4278. pSW->uSdhz_L.bFlag.bYY = pSW->uSdhz_L.bFlag.bUABYY || pSW->uSdhz_L.bFlag.bUBCYY;
  4279. bY1 = ((pSW->uSdhz_L.bFlag.bUABYY && (!pSW->uSdhz_L.bFlag.bUBCYY) && (!pSW->uSdhz_L.bFlag.bPower))
  4280. ||((!pSW->uSdhz_L.bFlag.bUABYY) && pSW->uSdhz_L.bFlag.bUBCYY && pSW->uSdhz_L.bFlag.bPower));
  4281. RunTR(&pSW->tOpsiteYY100ms, bY1, dStep);
  4282. pSW->uSdhz_L.bFlag.bOppositeYY = pSW->tOpsiteYY100ms.boolTrip && pSet->bTT_fa_poweron && pSet->bTT_fa_lineon;
  4283. if (pR->uRmtSW.bYTExecute || pR->uRmtSW.bHandTz||pSW->bDL_Tz)
  4284. {
  4285. #ifndef GD_AREA_ZHONGSHAN_2020//中山2020联络模式不报手分闭锁SOE 2020-11-3
  4286. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)==false) // 手动分闸,闭锁合闸
  4287. {
  4288. soe_record_ev(EV_BS_HA+sw*EV_SW_NUM, 1, 0,0,0 );
  4289. }
  4290. #endif
  4291. pSW->bDL_Tz=false;
  4292. //pSW->L_Status = L_INIT;
  4293. fa_l_state_change(sw,L_INIT);
  4294. pSW->uSdhz_L.wfFlag = 0;
  4295. //pSW->bL_BSLed = 0;
  4296. }
  4297. #ifdef FUNC_REBOOT_BS_HA_JS_3S
  4298. RunTR(&pSW->tHW_JS_HA_3STime, (g_tRelay[sw].uRmtSW.b_bsha && pR->tSWST.uSWST.bFlag.bDIHW), dStep);
  4299. if(pSW->tHW_JS_HA_3STime.boolTrip)
  4300. {
  4301. g_tRelay[sw].uRmtSW.b_bsha = false;
  4302. g_run_stu.js = true;
  4303. }
  4304. #endif
  4305. if (pR->uRmtSW.bYHExecute_fa || pR->uRmtSW.bHandHz_fa||g_run_stu.js||pSW->bDL_Hz||g_run_stu.rmtjs||pR->uRmtSW.bYH_fajs_flag) //如果有手合、遥合事件,
  4306. {
  4307. bool bUAB,bUBC;
  4308. bUAB = pSW->uSdhz_L.bFlag.bUABYY;
  4309. bUBC = pSW->uSdhz_L.bFlag.bUBCYY;
  4310. pSW->uSdhz_L.bFlag.bUABYY = bUAB;
  4311. pSW->uSdhz_L.bFlag.bUBCYY = bUBC;
  4312. #ifdef GD_AREA_ZHONGSHAN_2020
  4313. //if(pSW->uSdhz_L.bFlag.bYY && (pSW->bDL_Hz || pR->uRmtSW.bHandHz_fa))
  4314. {
  4315. fa_l_state_change(sw,L_YL_TIME);
  4316. }
  4317. g_run_stu.rmtjs=false;
  4318. g_run_stu.js=false;
  4319. pSW->bDL_Hz=false;
  4320. pR->uRmtSW.bYHExecute_fa=false;
  4321. pR->uRmtSW.bHandHz_fa=false;
  4322. pR->uRmtSW.bYH_fajs_flag=false;
  4323. //if(pSW->L_Status == L_INIT)
  4324. {
  4325. pR->tLostVot.uLostVot.bFlag.bSHWY=!(bUAB||bUBC);//将手合状态电压保存
  4326. }
  4327. //#if defined GD_AREA_ZHONGSHAN_2020 //中山2020允许无压进入Y实现即时,需将故障定时器清零
  4328. ResetTR(&pSW->tGZJYRstGLTime);
  4329. ResetTR(&pSW->tGZJYRstGL_II_Time);
  4330. ResetTR(&pSW->tGZJYRstJDTime);
  4331. ResetTR(&pSW->tGZJYRstGL2Time);
  4332. ResetTR(&pSW->tGZJYRstJD2Time);
  4333. ResetTR(&pR->tU0TZ.tZOVTime);
  4334. ResetTR(&pSW->tOnYLTime);
  4335. //#endif
  4336. return;//中山2020要求不允许任何人为情况干预解锁
  4337. #endif
  4338. if(pR->uRmtSW.bYHExecute_fa||pR->uRmtSW.bHandHz_fa)
  4339. pR->uRmtSW.bYH_fajs_flag=true;
  4340. //rt_printf_time("遥控合闸解锁 bYHExecute_fa=%d bHandHz_fa=%d js=%d bDL_Hz=%d rmtjs=%d\r\n",pR->uRmtSW.bYHExecute_fa , pR->uRmtSW.bHandHz_fa,g_run_stu.js,pSW->bDL_Hz,g_run_stu.rmtjs);
  4341. //if (g_run_stu.js||g_run_stu.rmtjs)
  4342. // ;//除了合位解锁条件
  4343. //else if(pSW->bDL_Hz || pR->uRmtSW.bYH_fajs_flag || pR->uRmtSW.bHandHz_fa)//联络 -> 手合或遥控合闸,开关两侧至少有一侧电压正常,延时6s解除残压闭锁。(中山局新增)
  4344. {
  4345. #ifndef GD_AREA_CHAOZHOUFENGXI//潮州要求直接解锁 2020-8-12
  4346. if(soe_check(EV_BS_UF_P+sw*EV_SW_NUM)||soe_check(EV_BS_UF_L+sw*EV_SW_NUM))
  4347. {
  4348. if(!bUAB&&!bUBC)
  4349. return;
  4350. RunTR(&pSW->tOnJSTime, TRUE, dStep); //js时间计数
  4351. if(!pSW->tOnJSTime.boolTrip)
  4352. return;
  4353. }
  4354. #endif
  4355. pR->tLostVot.uLostVot.bFlag.bSHWY=!(bUAB||bUBC);//将手合状态电压保存
  4356. if(pR->tSWST.uSWST.bFlag.bDIHW || pR->uRmtSW.bYH_fajs_flag)//合位或者手合遥控合
  4357. {
  4358. ResetTR(&pSW->tOnYLTime);
  4359. #ifndef GD_AREA_YUNFU //云浮要求不报 手合/遥合闭锁失压分 SOE
  4360. if(soe_check(EV_SH_BSFZ+sw*EV_SW_NUM)==false && !pSet->bTT_fa_shbs) //
  4361. {
  4362. soe_record_ev(EV_SH_BSFZ+sw*EV_SW_NUM, 1, 0,0,0 );
  4363. }
  4364. #endif
  4365. if((pR->tLostVot.uLostVot.bFlag.bSHWY && pR->uRmtSW.bYH_fajs_flag) ||pR->tLostVot.uLostVot.bFlag.bSHWY)
  4366. {
  4367. pSW->uSdhz_L.bFlag.bPowerZ=0;
  4368. ResetTR(&pR->tLostVot.tLostVotTime);//重新开始Z计时
  4369. fa_l_state_change(sw,L_RELAYON);
  4370. }
  4371. else
  4372. {
  4373. fa_l_state_change(sw,L_YL_TIME);
  4374. }
  4375. }
  4376. else
  4377. {
  4378. ResetTR(&pSW->tOnYLTime);
  4379. if(pR->tSWST.uSWST.bFlag.bDIHW)
  4380. fa_l_state_change(sw,L_BS_STATE);
  4381. else
  4382. fa_l_state_change(sw,L_INIT);
  4383. }
  4384. }
  4385. ResetTR(&pSW->tOnJSTime); //js时间计数
  4386. pSW->uSdhz_L.wfFlag = 0;
  4387. pSW->bL_BSLed = 0;
  4388. SignalReset(0,true);
  4389. fa_close_led(sw);
  4390. if(g_run_stu.js||g_run_stu.rmtjs)
  4391. {
  4392. SignalReset(0,false);
  4393. if(soe_check(EV_JS_HA+sw*EV_SW_NUM)==false) //
  4394. {
  4395. soe_record_ev(EV_JS_HA+sw*EV_SW_NUM, 1, 0,0,0 );
  4396. }
  4397. if(soe_check(EV_JS_L+sw*EV_SW_NUM)==true) //
  4398. {
  4399. soe_record_ev(EV_JS_L+sw*EV_SW_NUM, 0, 0,0,0 );
  4400. }
  4401. if(soe_check(EV_JS_HZ+sw*EV_SW_NUM)==true) //
  4402. {
  4403. soe_record_ev(EV_JS_HZ+sw*EV_SW_NUM, 0, 0,0,0 );
  4404. }
  4405. if(soe_check(EV_FA_U0GJ+sw*EV_SW_NUM)==true)
  4406. {
  4407. soe_record_ev(EV_FA_U0GJ+sw*EV_SW_NUM, 0, 0,0,0 );
  4408. }
  4409. }
  4410. else
  4411. {
  4412. if(soe_check(EV_JS_HZ+sw*EV_SW_NUM)==false&&soe_check(EV_BS_ALL+sw*EV_SW_NUM)==true) //
  4413. {
  4414. soe_record_ev(EV_JS_HZ+sw*EV_SW_NUM, 1, 0,0,0 );
  4415. }
  4416. if(soe_check(EV_JS_L+sw*EV_SW_NUM)==true) //
  4417. {
  4418. soe_record_ev(EV_JS_L+sw*EV_SW_NUM, 0, 0,0,0 );
  4419. }
  4420. if(soe_check(EV_JS_HA+sw*EV_SW_NUM)==true) //
  4421. {
  4422. soe_record_ev(EV_JS_HA+sw*EV_SW_NUM, 0, 0,0,0 );
  4423. }
  4424. }
  4425. g_run_stu.rmtjs=false;
  4426. #if defined FUNC_MODE_JS || defined FUNC_ONLY_MMD_JS
  4427. if(!gb_js_mode)
  4428. #endif
  4429. {
  4430. g_run_stu.js=false;
  4431. }
  4432. pSW->bDL_Hz=false;
  4433. pR->uRmtSW.bYHExecute_fa=false;
  4434. pR->uRmtSW.bHandHz_fa=false;
  4435. pR->uRmtSW.bYH_fajs_flag=false;
  4436. fa_unlock_l_bs(sw);
  4437. return;
  4438. }
  4439. //if (!pSW->uSdhz_L.bFlag.bYY) //如果两侧失压
  4440. //{
  4441. // pSW->L_Status = L_INIT;
  4442. // pSW->uSdhz_L.wfFlag = 0;
  4443. // pSW->bL_BSLed = 0;
  4444. // _pro_close_led();
  4445. // return;
  4446. //}
  4447. //运行状态流程处理
  4448. //if(!check_l_bs_hz(sw))
  4449. {
  4450. fa_l_status_run(sw, dStep);
  4451. }
  4452. //pSW->bL_BSLed=check_all_l_bs(sw);
  4453. //闭锁标志处理
  4454. #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_ZHONGSHAN_2020
  4455. pSW->uSdhz_L.bFlag.bLockY = pSW->uSdhz_L.bFlag.bLockUFlash;//( ((pSW->L_Status == L_BS_STATE) && (!pSW->tOnYLTime.boolTrip))
  4456. //|| (pSW->uSdhz_L.bFlag.bLockUFlash)); //L_Status == L_Y_ZTIME));
  4457. #else
  4458. pSW->uSdhz_L.bFlag.bLockY = (((pSW->L_Status == L_INIT) && pSW->uSdhz_L.bFlag.bYY)
  4459. || ((pSW->L_Status == L_BS_STATE) && (!pSW->tOnYLTime.boolTrip))
  4460. || (pSW->uSdhz_L.bFlag.bLockUFlash)); //L_Status == L_Y_ZTIME));
  4461. #endif
  4462. pSW->bL_BSLed = pSW->uSdhz_L.bFlag.bLockY||fa_check_all_l_bs(sw);
  4463. //LED灯处理
  4464. fa_ls_led(sw, true);
  4465. //合闸判断
  4466. RunTR(&pSW->tHzS100ms, pSW->uSdhz_L.bFlag.bRLONFLAG, dStep); // 合闸信号,限制在合闸脉冲时间以内
  4467. pSW->uSdhz_L.bFlag.bHz = pSW->tHzS100ms.boolTrip;
  4468. //上电加速
  4469. RunTR(&pSW->tTSDHzHJS, (pSW->uSdhz_L.bFlag.bHz && pR->tSWST.uSWST.bFlag.bTZWZ), dStep);
  4470. pR->tSWST.uSWST.bFlag.bSDJS = pSW->tTSDHzHJS.boolTrip && (!pR->tSWST.uSWST.bFlag.bTZWZ); //上电后加速标志
  4471. /************事件记录及出口****************************/
  4472. if(pSW->uSdhz_L.bFlag.bHz)
  4473. {
  4474. if(!pSW->uSdhz_L.bFlag.bHZEvent)
  4475. {
  4476. DWORD Uab,Ubc;
  4477. Uab = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[2]), 256, pRunSet->dKU[PUB_AC_UAB1]);
  4478. Ubc = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[3]), 256, pRunSet->dKU[pRunSet->pt2vol]);
  4479. //rcd_start(sw,RECORD_WAVE_TYPE_TZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  4480. soe_record_ev(EV_FA_LL_HZ+sw*EV_SW_NUM, 1, Uab,Ubc,0 );
  4481. pSW->uSdhz_L.bFlag.bHZEvent = true;
  4482. pSW->uSdhz_L.bFlag.bRLONFLAG = false;
  4483. pSW->uSdhz_L.bFlag.bX_HZEvent = true;
  4484. }
  4485. }
  4486. else
  4487. {
  4488. if(pSW->uSdhz_L.bFlag.bHZEvent)
  4489. {
  4490. soe_record_ev(EV_FA_LL_HZ+sw*EV_SW_NUM, 0, 0,0,0 );
  4491. pSW->uSdhz_L.bFlag.bHZEvent = false;
  4492. }
  4493. }
  4494. }
  4495. void fa_status_print(int sw)
  4496. {
  4497. {
  4498. TRELAY_T *pR=&g_tRelay[sw];
  4499. TSDHZ_T *pSW =&pR->tSDHZ;
  4500. if(pSW->uSdhz_L.wfFlag!=pSW->l_flag_save||pSW->L_Status!=pSW->L_Status_save)
  4501. {
  4502. //if(pSW->uSdhz_L.wfFlag!=pSW->l_flag_save)
  4503. // fa_change_flag_print(sw,pSW->l_flag_save,pSW->uSdhz_L.wfFlag,fa_run_falg_str);
  4504. //fa_change_status_print(pSW->L_Status_save,pSW->L_Status,fa_l_status);
  4505. pSW->l_flag_save=pSW->uSdhz_L.wfFlag;
  4506. pSW->L_Status_save=pSW->L_Status;
  4507. }
  4508. if(pSW->uSdhz_S.wfFlag!=pSW->s_flag_save||pSW->S_Status!=pSW->S_Status_save)
  4509. {
  4510. //if(pSW->uSdhz_S.wfFlag!=pSW->s_flag_save)
  4511. // fa_change_flag_print(sw,pSW->s_flag_save,pSW->uSdhz_S.wfFlag,fa_run_falg_str);
  4512. //fa_change_status_print(pSW->S_Status_save,pSW->S_Status,fa_s_status);
  4513. pSW->s_flag_save=pSW->uSdhz_S.wfFlag;
  4514. pSW->S_Status_save=pSW->S_Status;
  4515. }
  4516. #if 0
  4517. if(pR->tLostVot.uLostVot.wfFlag!=pR->tLostVot.wfFlagsave)
  4518. {
  4519. //fa_change_flag_print(sw,pR->tLostVot.wfFlagsave,pR->tLostVot.uLostVot.wfFlag,sw_u_str);
  4520. rt_printf("sw=%d tLostFlag=%08x losttimes=%d\r\n",sw,pR->tLostVot.uLostVot.wfFlag,pR->tLostVot.losttimes);
  4521. pR->tLostVot.wfFlagsave=pR->tLostVot.uLostVot.wfFlag;
  4522. }
  4523. if(pR->tSWST.uSWST.wfFlag!=pR->tSWST.wfFlagsave)
  4524. {
  4525. //fa_change_flag_print(sw,pR->tSWST.wfFlagsave,pR->tSWST.uSWST.wfFlag,sw_status_str);
  4526. rt_printf("\r\n sw=%d tSWST Flag=%08x\r\n",sw,pR->tSWST.uSWST.wfFlag);
  4527. pR->tSWST.wfFlagsave=pR->tSWST.uSWST.wfFlag;
  4528. }
  4529. #endif
  4530. }
  4531. }
  4532. int fa_UFDI_Init(void)
  4533. {
  4534. int sw, i;
  4535. if(!pRunSet->bTT_SY_Board)return 1; //无瞬压模块
  4536. #if (1) /* TODO lch */
  4537. for (sw=0; sw< SWITCH_NUM_MAX; sw++)
  4538. {
  4539. g_tRelay[sw].tSDHZ.uSdhz_S.bFlag.bUabflashDI=g_tRelay[sw].run_stu.pt1uf&&pRunSet->tSwSet[sw].bTT_FA;
  4540. g_tRelay[sw].tSDHZ.uSdhz_S.bFlag.bUbcflashDI=g_tRelay[sw].run_stu.pt2uf&&pRunSet->tSwSet[sw].bTT_FA;
  4541. }
  4542. #else // DTU需采集初始遥信才能返回
  4543. for(i=0; i<g_equ_config->equ_slot_num; i++)
  4544. {
  4545. int di_num = equ_get_di_num(i);
  4546. if(di_num>0)
  4547. {
  4548. if(g_board_info[i].type != BOARD_TYPE_DI)continue;
  4549. if(g_di[i].bInited==false) return 0;
  4550. }
  4551. }
  4552. #endif
  4553. for (sw=0; sw< SWITCH_NUM_MAX; sw++)
  4554. {
  4555. g_tRelay[sw].tSDHZ.uSdhz_S.bFlag.bUabflashDI=g_tRelay[sw].run_stu.pt1uf&&pRunSet->tSwSet[sw].bTT_FA;
  4556. g_tRelay[sw].tSDHZ.uSdhz_S.bFlag.bUbcflashDI=g_tRelay[sw].run_stu.pt2uf&&pRunSet->tSwSet[sw].bTT_FA;
  4557. }
  4558. return 1;
  4559. }
  4560. void fa_RstUFDI(int sw)
  4561. {
  4562. if(!pRunSet->bTT_SY_Board)return;
  4563. sw_do(sw,SW_FBT_SY,SW_DO_TYPE_ON);
  4564. if(g_tRelay[sw].run_stu.pt1uf||g_tRelay[sw].run_stu.pt2uf)
  4565. {
  4566. sw_do(sw,SW_RST_SY,SW_DO_TYPE_ON);
  4567. sw_do(sw,SW_RST_SY1,SW_DO_TYPE_OFF);
  4568. }
  4569. else
  4570. {
  4571. sw_do(sw,SW_RST_SY1,SW_DO_TYPE_ON);
  4572. sw_do(sw,SW_RST_SY,SW_DO_TYPE_OFF);
  4573. }
  4574. }
  4575. //清启动跳闸启动条件
  4576. static void fa_cls_qd(int sw)
  4577. {
  4578. TRELAY_T *pR=&g_tRelay[sw];
  4579. //TSDHZ_T *pSW =&pR->tSDHZ;
  4580. //TSETSW *pSet = &pRunSet->tSwSet[sw];
  4581. TU0_T *pU0=&pR->tU0TZ;
  4582. TOC_T *poc ;
  4583. if(pR->bBSTZ)//遮断电流的时候防止提前清掉启动标志
  4584. return;
  4585. // if(!pR->tSWST.uSWST.bFlag.bDIHW)
  4586. {
  4587. pR->tLostVot.uLostVot.bFlag.bQD = false;//失压启动返回
  4588. pR->tLostVot.uLostVot.bFlag.bTz = false;
  4589. }
  4590. //if(pSW->uSdhz_S.bFlag.bGL)
  4591. {
  4592. poc = &g_tRelay[sw].tOC[FA_GL];
  4593. poc->sta.bFlag.bQD = false;
  4594. poc->sta.bFlag.bTz = false;
  4595. }
  4596. //else if(pSW->uSdhz_S.bFlag.bGL_II)
  4597. {
  4598. poc = &g_tRelay[sw].tOC[FA_GL_II];
  4599. poc->sta.bFlag.bQD = false;
  4600. poc->sta.bFlag.bTz = false;
  4601. }
  4602. //else if (pSW->uSdhz_S.bFlag.bJD)
  4603. {
  4604. poc = &g_tRelay[sw].tOC[FA_LX];
  4605. poc->sta.bFlag.bQD = false;
  4606. poc->sta.bFlag.bTz = false;
  4607. }
  4608. //else if (pSW->uSdhz_S.bFlag.bOverU0)
  4609. {
  4610. pU0->uZOV.bFlag.bQD = false;
  4611. pU0->uZOV.bFlag.bTz = false;
  4612. }
  4613. }
  4614. //fa闭锁分合闸
  4615. bool fa_bs_fz(int sw)
  4616. {
  4617. TRELAY_T *pR=&g_tRelay[sw];
  4618. //TSDHZ_T *pSW = &pR->tSDHZ;
  4619. TSETSW *pSet = &pRunSet->tSwSet[sw];
  4620. if (!(FA_ALL_EN(sw)) || !pSet->bTT_FA) // FA功能未投入
  4621. return false;
  4622. if(pR->bBSTZ) //
  4623. {
  4624. rt_printf("遮断电流,禁止分闸\r\n");
  4625. return true;
  4626. }
  4627. return false;
  4628. }
  4629. bool fa_bs_hz(int sw)
  4630. {
  4631. TRELAY_T *pR=&g_tRelay[sw];
  4632. TSDHZ_T *pSW = &pR->tSDHZ;
  4633. TSETSW *pSet = &pRunSet->tSwSet[sw];
  4634. RUN_STU_SW *prun=&g_tRelay[sw].run_stu;
  4635. if (!(FA_ALL_EN(sw)) || !pSet->bTT_FA ) // FA功能未投入
  4636. return false;
  4637. if((soe_check(EV_BS_DB+(sw)*EV_SW_NUM)||pSW->uSdhz_S.bFlag.bDBYY) && pSet->bTT_fa_scyy_bs)
  4638. {
  4639. rt_printf("FA双侧有压,禁止合\r\n");
  4640. return true;//
  4641. }
  4642. if (prun->fa_ls) // 联络
  4643. {
  4644. if(pSW->bL_BSLed && pRunSet->bTT_bs_ykon)
  4645. {
  4646. rt_printf("联络双侧有压,禁止合闸\r\n");
  4647. return true;
  4648. }
  4649. }
  4650. else
  4651. {
  4652. if(soe_check(EV_BS_ALL+(sw)*EV_SW_NUM) && pRunSet->bTT_bs_ykon)
  4653. {
  4654. rt_printf("FA闭锁合闸,禁止合\r\n");
  4655. return true;//
  4656. }
  4657. }
  4658. return false;
  4659. }
  4660. #ifdef FUNC_MODE_JS
  4661. //清重合闸闭锁
  4662. void Reset_chz_bs(int sw)
  4663. {
  4664. if(soe_check(EV_ARBS+sw*EV_SW_NUM)==true)
  4665. {
  4666. g_tRelay[sw].tCHZ.sta.bFlag.bCHBS=false;
  4667. soe_record_ev(EV_ARBS+sw*EV_SW_NUM, 0, 0,0,0); // 重合闸闭锁
  4668. led_set_sw(sw,SW_LED_CHZBS, LED_OFF);
  4669. led_set_sw(sw,SW_LED_CHZBS_LOCK, LED_OFF);
  4670. ResetTR(&g_tRelay[sw].tCHZ.tTCHJBSTime);
  4671. }
  4672. }
  4673. #endif
  4674. /**************************************************************************
  4675. 函数名称:Pro_LS_RUN
  4676. 函数版本:1.00
  4677. 作者: 电力产品开发部
  4678. 创建日期:2011.10.28
  4679. 函数功能说明:环网点运行
  4680. 输入参数:
  4681. 其他输入:
  4682. 输出参数:
  4683. 返回值:
  4684. ***************************************************************************/
  4685. void FA_Run(DWORD dStep)
  4686. {
  4687. int sw=g_protect.sw;
  4688. bool bSW_LL,bY1;
  4689. TRELAY_T *pR=&g_tRelay[sw];
  4690. TSDHZ_T *pSW =&pR->tSDHZ;
  4691. TSETSW *pSet = &pRunSet->tSwSet[sw];
  4692. #ifdef FUNC_MODE_JS
  4693. static bool sb_first=true,sb_first_ll = true,sb_first_fd = true;
  4694. #endif
  4695. #ifdef FUNC_DRIVE
  4696. gb_drive.b_fa_drive = true;
  4697. #endif
  4698. if(!pSW->bInitUF)
  4699. {
  4700. int ret;
  4701. ret=fa_UFDI_Init();
  4702. if(ret==0)return;
  4703. pSW->bInitUF=true;
  4704. }
  4705. run_vol_refersh(sw, dStep);
  4706. if (!(FA_ALL_EN(sw)) || !pSet->bTT_FA) // FA功能未投入
  4707. {
  4708. pR->tU0TZ.bU0Led=false;
  4709. pR->tU0TZ.bU0GjLed = false;
  4710. pR->tOC[FA_GL].sta.bFlag.bDzLed = false;
  4711. pR->tOC[FA_GL].sta.bFlag.bGj = false;
  4712. pR->tOC[FA_GL_II].sta.bFlag.bDzLed = false;
  4713. pR->tOC[FA_GL_II].sta.bFlag.bGj = false;
  4714. pR->tOC[FA_GL2].sta.bFlag.bDzLed = false;
  4715. pR->tOC[FA_GL2].sta.bFlag.bGj = false;
  4716. pR->tOC[FA_LX].sta.bFlag.bDzLed = false;
  4717. pR->tOC[FA_LX].sta.bFlag.bGj = false;
  4718. pR->tOC[FA_LX2].sta.bFlag.bDzLed = false;
  4719. pR->tOC[FA_LX2].sta.bFlag.bGj = false;
  4720. if(soe_check(EV_BS_HA+sw*EV_SW_NUM))//手分闭锁后,切换至其他模式应保持该信号 2020-11-3
  4721. {
  4722. pSW->bDL_Tz=true;
  4723. }
  4724. if(pR->tSWST.uSWST.bFlag.bDIHW)
  4725. {
  4726. pSW->bDL_Tz=false;//合位清手分闭锁标志 2020-11-3
  4727. }
  4728. pSW->bS_BSLed = 0;
  4729. pSW->bL_BSLed = 0;
  4730. #ifndef GD_AREA_ECZD_2020
  4731. fa_unlock_s_bs(sw);
  4732. #endif
  4733. //非FA逻辑下实时清以下状态
  4734. pR->uRmtSW.bYHExecute_fa =0;
  4735. pR->uRmtSW.bHandHz_fa=0;
  4736. #if !defined FUNC_MODE_JS && !defined FUNC_ONLY_MMD_JS
  4737. g_run_stu.js=0;
  4738. #endif
  4739. pSW->bDL_Hz=0;
  4740. g_run_stu.rmtjs=0;
  4741. pR->tLostVot.uLostVot.bFlag.bSHWY = FALSE; //清手合无压标志
  4742. pR->uRmtSW.bYTExecute=0 ;
  4743. pR->uRmtSW.bHandTz=0;
  4744. //pSW->bDL_Tz=0;
  4745. pSW->bSDHZinit=0;
  4746. //开关状态监测计时器
  4747. ResetTR(&pSW->tHw100ms100ms);
  4748. ResetTR(&pSW->tTw100ms100ms);
  4749. ResetTR(&pSW->tTz0ms1s);
  4750. ResetTR(&pSW->tHz0ms1s);
  4751. ResetTR(&pSW->tOnYLTime);
  4752. ResetTR(&pSW->tUABL25ms);
  4753. ResetTR(&pSW->tUBCL25ms);
  4754. ResetTR(&pSW->tOnHW_FA_JSTime);
  4755. if(pSW->S_Status==S_XTIME)
  4756. {
  4757. ResetTR(&pSW->tOnXSTime);
  4758. }
  4759. if(pSW->S_Status==S_YTIME)
  4760. {
  4761. ResetTR(&pSW->tOnYSTime);
  4762. }
  4763. //fa_s_state_change(sw,S_INIT);
  4764. //fa_l_state_change(sw,L_INIT);
  4765. //#ifdef FA_BSYTIME_JS
  4766. //rst_ybs_soe( sw);
  4767. //#endif
  4768. //fa_close_led(sw);
  4769. #if defined FUNC_MODE_JS || defined FUNC_ONLY_MMD_JS
  4770. {
  4771. bool b_js_mode=false,b_js_mmd=false;
  4772. #ifdef FUNC_MODE_JS
  4773. b_js_mode = (!sb_first_ll || !sb_first_fd);
  4774. #endif
  4775. #ifdef FUNC_ONLY_MMD_JS
  4776. b_js_mmd = g_run_stu.b_mmdjs;
  4777. #endif
  4778. if(b_js_mode || b_js_mmd)
  4779. {
  4780. #ifdef FUNC_MODE_JS
  4781. if(b_js_mode)
  4782. {
  4783. sb_first_ll = true;
  4784. sb_first_fd = true;
  4785. sb_first = false;
  4786. }
  4787. #endif
  4788. #ifdef FUNC_ONLY_MMD_JS
  4789. if(b_js_mmd)
  4790. {
  4791. pSW->bDL_Tz=false;
  4792. }
  4793. #endif
  4794. gb_js_mode = true;
  4795. if(gb_js_mode)
  4796. {
  4797. g_run_stu.js = true;
  4798. fa_s_run(sw, dStep);
  4799. fa_l_run(sw, dStep);
  4800. fa_rstbs_soe(sw);
  4801. pSW->bL_BSLed=fa_check_all_l_bs(sw);
  4802. pSW->bS_BSLed=fa_check_all_s_bs(sw);
  4803. fa_uf_clear(sw,false);
  4804. fa_uf_clear(sw,true);
  4805. }
  4806. gb_js_mode = false;
  4807. #ifdef FUNC_ONLY_MMD_JS
  4808. g_run_stu.b_mmdjs = false;
  4809. #endif
  4810. }
  4811. //解锁标志在宏定义FUNC_MODE_JS开启时有用到,需在用完后再清,所以调整到此位置
  4812. g_run_stu.js=0;
  4813. }
  4814. #endif
  4815. return;
  4816. }
  4817. #if defined FUNC_MODE_JS || defined FUNC_ONLY_MMD_JS
  4818. gb_js_mode = false;
  4819. #endif
  4820. #ifdef FUNC_ONLY_MMD_JS
  4821. //FA模式下要将此标志一直置0,否则可能出现FA下有解锁需求将此标志置位后,切模式后会因为此标志一直未清零而自动解锁一次
  4822. g_run_stu.b_mmdjs = false;
  4823. #endif
  4824. fa_cls_qd(sw);
  4825. fa_RstUFDI(sw); //复归瞬压继电器
  4826. fa_s_Dataset(sw, dStep);
  4827. bSW_LL=(pR->run_stu.fa_ls>0)?true:false;
  4828. #if 1
  4829. if (pR->uRmtSW.bYTExecute )
  4830. {
  4831. dl_ope_event(sw,EV_YK_FZ, 0,0,0 );
  4832. }
  4833. if (pR->uRmtSW.bYHExecute )
  4834. {
  4835. dl_ope_event(sw,EV_YK_HZ, 0,0,0 );
  4836. }
  4837. if (pR->uRmtSW.bHandTz )
  4838. {
  4839. dl_ope_event(sw,EV_HA_FZ, 0,0,0 );
  4840. }
  4841. if (pR->uRmtSW.bHandHz )
  4842. {
  4843. dl_ope_event(sw,EV_HA_HZ, 0,0,0 );
  4844. }
  4845. RunTR(&pSW->tHw100ms100ms,( (pR->run_stu.sw==2)?true:false), dStep);
  4846. RunTR(&pSW->tTz0ms1s,(pR->uBHDZ.bFlag.bBHT||pR->uRmtSW.bYTExecute || pR->uRmtSW.bHandTz || pR->tgoc.bTzout), dStep); //
  4847. bY1=pSW->tHw100ms100ms.boolTrip&&((pR->run_stu.sw==1)?true:false);
  4848. if(bY1) // 开关由合到分
  4849. {
  4850. //ResetTR(&pSW->tHz0ms2s);
  4851. if(!pSW->tTz0ms1s.boolTrip)
  4852. {
  4853. if(pR->run_stu.kgyf)
  4854. {
  4855. dl_ope_event(sw,EV_HA_FZ, 0,0,0 );
  4856. }
  4857. else
  4858. {
  4859. dl_ope_event(sw,EV_DL_FZ, 0,0,0 );
  4860. pSW->bDL_Tz=true;
  4861. }
  4862. }
  4863. }
  4864. RunTR(&pSW->tTw100ms100ms,( (pR->run_stu.sw==1)?true:false), dStep);
  4865. RunTR(&pSW->tHz0ms1s,(pR->uBHDZ.bFlag.bBHH||pR->uRmtSW.bYHExecute || pR->uRmtSW.bHandHz||pR->tTQHz.uTQHz.bFlag.bHz||pR->tgoc.sta.bFlag.bllhz), dStep);
  4866. bY1=pSW->tTw100ms100ms.boolTrip&&((pR->run_stu.sw==2)?true:false);
  4867. if(bY1) // 开关由分到合
  4868. {
  4869. //ResetTR(&pSW->tTz0ms2s);
  4870. if(!pSW->tHz0ms1s.boolTrip)
  4871. {
  4872. if(pR->run_stu.kgyf)
  4873. {
  4874. dl_ope_event(sw,EV_HA_HZ, 0,0,0 );
  4875. }
  4876. else
  4877. {
  4878. dl_ope_event(sw,EV_DL_HZ, 0,0,0 );
  4879. pSW->bDL_Hz=true;
  4880. }
  4881. if(pSW->uSdhz_L.bFlag.bX_HZEvent)
  4882. {
  4883. //if(soe_check(EV_GOOSE_HZ_OK+sw*EV_SW_NUM)==false)
  4884. // soe_record_ev(EV_GOOSE_HZ_OK+sw*EV_SW_NUM, 1, 0,0,0 );
  4885. }
  4886. pSW->uSdhz_L.bFlag.bX_HZEvent = false;
  4887. }
  4888. }
  4889. #endif
  4890. if (!(FA_ALL_EN(sw)) ||!pSet->bTT_FA) // FA功能未投入
  4891. {
  4892. if(!BH_GOOSE_EN(sw))fa_close_led(sw);
  4893. if (pSW->S_Status != S_USUAL)
  4894. {
  4895. fa_s_state_change(sw,S_USUAL);//pSW->S_Status = S_USUAL;
  4896. pSW->uSdhz_S.wfFlag = 0;
  4897. pSW->bS_BSLed = 0;
  4898. }
  4899. if (pSW->L_Status != L_INIT)
  4900. {
  4901. //pSW->L_Status = L_INIT;
  4902. fa_l_state_change(sw,L_INIT);
  4903. pSW->uSdhz_L.wfFlag = 0;
  4904. pSW->bL_BSLed = 0;
  4905. }
  4906. return;
  4907. }
  4908. fa_status_print(sw);
  4909. if (!bSW_LL) // 分段功能
  4910. {
  4911. #ifdef FUNC_MODE_JS
  4912. if(sb_first_fd && !sb_first)
  4913. {
  4914. sb_first_fd = false;
  4915. sb_first_ll = true;
  4916. g_run_stu.js=true;
  4917. fa_l_run(sw, dStep);
  4918. fa_rstbs_soe(sw);
  4919. Reset_chz_bs(sw);
  4920. pSW->bL_BSLed=fa_check_all_l_bs(sw);
  4921. fa_uf_clear(sw,false);
  4922. fa_uf_clear(sw,true);
  4923. }
  4924. if(sb_first_fd)
  4925. {
  4926. sb_first_fd = false;
  4927. sb_first_ll = true;
  4928. sb_first = false;
  4929. }
  4930. #endif
  4931. fa_s_run(sw, dStep);
  4932. //pSW->L_Status = L_INIT;
  4933. if(pSW->L_Status==L_XL_ZTIME)
  4934. fa_rstbs_soe( sw);
  4935. fa_l_state_change(sw,L_INIT);
  4936. pSW->bL_BSLed = 0;
  4937. #ifdef FUNC_DRIVE_JY
  4938. if(gb_drive.b_drive_success_again || gb_drive.b_drive_success)
  4939. {
  4940. if(fa_check_all_s_bs(sw))
  4941. {
  4942. gb_drive.b_drive_success_again = false;
  4943. gb_drive.b_drive_success = false;
  4944. if(soe_check(EV_DRIVE_HZ_FAIL+sw*EV_SW_NUM) == false)
  4945. {
  4946. soe_record_ev(EV_DRIVE_HZ_FAIL+sw*EV_SW_NUM, 1, 0,0,0 );
  4947. }
  4948. if(soe_check(EV_DRIVE_END+sw*EV_SW_NUM)==false) //传动结束
  4949. {
  4950. soe_record_ev(EV_DRIVE_END+sw*EV_SW_NUM, 1, 0,0,0 );
  4951. }
  4952. if(soe_check(EV_DRIVE_END+sw*EV_SW_NUM)==true) //传动结束返回
  4953. {
  4954. soe_record_ev(EV_DRIVE_END+sw*EV_SW_NUM, 0, 0,0,0 );
  4955. }
  4956. }
  4957. }
  4958. #endif
  4959. }
  4960. else // 联络功能
  4961. {
  4962. #ifdef FUNC_MODE_JS
  4963. if(sb_first_ll && !sb_first)
  4964. {
  4965. sb_first_fd = true;
  4966. sb_first_ll = false;
  4967. g_run_stu.js=true;
  4968. fa_s_run(sw, dStep);
  4969. fa_rstbs_soe(sw);
  4970. Reset_chz_bs(sw);
  4971. pSW->bS_BSLed=fa_check_all_s_bs(sw);
  4972. fa_uf_clear(sw,false);
  4973. fa_uf_clear(sw,true);
  4974. }
  4975. if(sb_first_ll)
  4976. {
  4977. sb_first_ll = false;
  4978. sb_first_fd = true;
  4979. sb_first = false;
  4980. }
  4981. #endif
  4982. if (pSW->S_Status != S_USUAL)
  4983. {
  4984. fa_s_state_change(sw,S_USUAL);//pSW->S_Status = S_USUAL;
  4985. pSW->uSdhz_S.wfFlag = 0;
  4986. pSW->bS_BSLed = 0;
  4987. }
  4988. fa_l_run(sw, dStep);
  4989. #ifdef FUNC_DRIVE_JY
  4990. if(gb_drive.b_drive_success_again || gb_drive.b_drive_success)
  4991. {
  4992. if(fa_check_all_l_bs(sw))
  4993. {
  4994. gb_drive.b_drive_success_again = false;
  4995. gb_drive.b_drive_success = false;
  4996. if(soe_check(EV_DRIVE_HZ_FAIL+sw*EV_SW_NUM) == false)
  4997. {
  4998. soe_record_ev(EV_DRIVE_HZ_FAIL+sw*EV_SW_NUM, 1, 0,0,0 );
  4999. }
  5000. if(soe_check(EV_DRIVE_END+sw*EV_SW_NUM)==false) //传动结束
  5001. {
  5002. soe_record_ev(EV_DRIVE_END+sw*EV_SW_NUM, 1, 0,0,0 );
  5003. }
  5004. if(soe_check(EV_DRIVE_END+sw*EV_SW_NUM)==true) //传动结束返回
  5005. {
  5006. soe_record_ev(EV_DRIVE_END+sw*EV_SW_NUM, 0, 0,0,0 );
  5007. }
  5008. }
  5009. }
  5010. #endif
  5011. }
  5012. }
  5013. static int _volstatus_createfile(void)
  5014. {
  5015. unsigned int addr,file_length;
  5016. u16 crc;
  5017. loff_t pos;
  5018. struct vol_file_head volstatus_file;
  5019. // 写文件头
  5020. memset(&volstatus_file,0,sizeof(volstatus_file));
  5021. volstatus_file.cfh.signature = SIG_VOL_STATUS_FILE;
  5022. volstatus_file.cfh.version = VOLSTATUS_FILE_VERSION;
  5023. volstatus_file.addr = FILE_ADDR_ALGIN(sizeof(volstatus_file));
  5024. volstatus_file.num = SWITCH_NUM_MAX;
  5025. // 得到文件长度
  5026. addr = volstatus_file.addr + volstatus_file.num * sizeof(struct vol_stu);
  5027. file_length = FILE_ADDR_ALGIN(addr);
  5028. vol_filelen = file_length+2;
  5029. // 分配并初始化空间
  5030. g_volbuf = rt_malloc(file_length + 2);
  5031. if(!g_volbuf)
  5032. {
  5033. g_volbuf = 0;
  5034. return -1;
  5035. }
  5036. memset(g_volbuf, 0, file_length + 2);
  5037. // 写入文件头
  5038. memcpy(g_volbuf, (char *)&volstatus_file, sizeof(volstatus_file));
  5039. // 写上电合闸状态
  5040. memcpy(g_volbuf+volstatus_file.addr, (char *)&g_vol_stu, volstatus_file.num * sizeof(struct vol_stu));
  5041. // 计算CRC
  5042. crc = CrcStr(g_volbuf, file_length);
  5043. memcpy(g_volbuf+file_length, &crc, 2);
  5044. // 创建数据文件
  5045. gf_volstu = rt_file_open("/app/data/vol_status.bin",O_CREAT|O_RDWR|O_TRUNC,0);
  5046. if(IS_ERR(gf_volstu))
  5047. {
  5048. rt_free(g_volbuf);
  5049. gf_volstu = 0;
  5050. g_volbuf = 0;
  5051. return -2;
  5052. }
  5053. pos = 0;
  5054. rt_file_write(gf_volstu, g_volbuf, file_length+2, &pos);
  5055. return 0;
  5056. }
  5057. /**************************************************************************
  5058. 函数名称:StatusRead
  5059. 函数版本:1.00
  5060. 作者: 电力产品开发部
  5061. 创建日期:2011.10.28
  5062. 函数功能说明:上电后对相关状态进行读取
  5063. 输入参数:
  5064. 其他输入:
  5065. 输出参数:
  5066. 返回值:
  5067. ***************************************************************************/
  5068. static int _volstatus_readfile(void)
  5069. {
  5070. u32 len;
  5071. u16 crc, crc1;
  5072. loff_t pos;
  5073. struct vol_file_head *brh;
  5074. // 创建并打开文件
  5075. gf_volstu = rt_file_open("/app/data/vol_status.bin",O_RDWR,0);
  5076. if(IS_ERR(gf_volstu))
  5077. {
  5078. gf_volstu = 0;
  5079. return -1;
  5080. }
  5081. // 得到文件长度
  5082. len = rt_file_getfile_size(gf_volstu);
  5083. if(len <= 0)
  5084. {
  5085. rt_file_close(gf_volstu,0);
  5086. return -11;
  5087. }
  5088. // 分配内存
  5089. g_volbuf = rt_malloc(len);
  5090. if((g_volbuf) == NULL)
  5091. {
  5092. rt_file_close(gf_volstu,0);
  5093. g_volbuf = 0;
  5094. return -2;
  5095. }
  5096. // 读出内容
  5097. pos = 0;
  5098. if(rt_file_read(gf_volstu,g_volbuf,len,&pos) != len)
  5099. {
  5100. rt_file_close(gf_volstu,0);
  5101. rt_free(g_volbuf);
  5102. gf_volstu = 0;
  5103. g_volbuf = 0;
  5104. return -3;
  5105. }
  5106. // 检查CRC
  5107. crc = CrcStr(g_volbuf,len-2);
  5108. crc1 = *(u16*)(g_volbuf+len-2);
  5109. if(crc != crc1)
  5110. {
  5111. rt_file_close(gf_volstu,0);
  5112. rt_free(g_volbuf);
  5113. gf_volstu = 0;
  5114. g_volbuf = 0;
  5115. return -4;
  5116. }
  5117. // 检查文件签名
  5118. brh = (struct vol_file_head*)g_volbuf;
  5119. if(brh->cfh.signature != SIG_VOL_STATUS_FILE)
  5120. {
  5121. rt_file_close(gf_volstu,0);
  5122. rt_free(g_volbuf);
  5123. gf_volstu = 0;
  5124. g_volbuf = 0;
  5125. return -5;
  5126. }
  5127. // 检查开关个数是否对应
  5128. if(brh->num != SWITCH_NUM_MAX)
  5129. {
  5130. rt_file_close(gf_volstu,0);
  5131. rt_free(g_volbuf);
  5132. gf_volstu = 0;
  5133. g_volbuf = 0;
  5134. return -6;
  5135. }
  5136. //检查数据长度
  5137. if((len-2) != FILE_ADDR_ALGIN((SWITCH_NUM_MAX * sizeof(struct vol_stu) + sizeof(struct vol_file_head))))
  5138. {
  5139. rt_printf("当前volstatus文件长度为%d,正确文件长度为%d\r\n",len-2,FILE_ADDR_ALGIN((SWITCH_NUM_MAX * sizeof(struct vol_stu) + sizeof(struct vol_file_head))));
  5140. rt_file_close(gf_volstu,0);
  5141. rt_free(g_volbuf);
  5142. gf_volstu = 0;
  5143. g_volbuf = 0;
  5144. return -7;
  5145. }
  5146. #if 0
  5147. // 检测文件长度是否合法
  5148. if(len-sizeof(struct vol_file_head ) != sizeof(struct vol_stu)*brh->num+2)
  5149. {
  5150. rt_printf("vol_status.bin is err len=%d %d addr=%d %d\r\n",len,sizeof(struct vol_stu)*brh->num,brh->addr ,sizeof(struct vol_file_head ));
  5151. return -7;
  5152. }
  5153. #endif
  5154. //取出文件中存储内容
  5155. memcpy (&g_vol_stu, g_volbuf+brh->addr, sizeof(struct vol_stu)*brh->num);
  5156. vol_filelen = len;
  5157. return 0;
  5158. }
  5159. bool gb_wake_soe=false;
  5160. static void _volstu_update(void)
  5161. {
  5162. int sw;
  5163. gb_wake_soe = true;
  5164. for (sw=0; sw<SWITCH_NUM_MAX; sw++)
  5165. {
  5166. TSDHZ_T *pSW = &g_tRelay[sw].tSDHZ;
  5167. if (!(FA_ALL_EN(sw)) || !pRunSet->tSwSet[sw].bTT_FA) // FA功能未投入
  5168. continue;
  5169. if (pRunSet->tSwSet[sw].bTT_FA&&!g_tRelay[sw].run_stu.fa_ls)
  5170. {
  5171. pSW->S_Status = g_vol_stu[sw].status;//初始化FA状态
  5172. pSW->uSdhz_S.bFlag.bPower= g_vol_stu[sw].shangdiance;
  5173. rt_printf_time("\r\n当前分段模式 FA S_Status >>>>>>>>>上电方向=%d 上电状态=%s\r\n",pSW->uSdhz_S.bFlag.bPower,fa_s_status[pSW->S_Status]);
  5174. if(pSW->S_Status==S_BSXTIME)
  5175. {
  5176. pSW->S_Status=S_BSXTIME;
  5177. if(pSW->uSdhz_S.bFlag.bPower)
  5178. soe_record_ev(EV_BS_X_P+sw*EV_SW_NUM, 1, 0,0,0 );
  5179. else
  5180. soe_record_ev(EV_BS_X_L+sw*EV_SW_NUM, 1, 0,0,0 );
  5181. }
  5182. else if(pSW->S_Status==S_BSFLASH)
  5183. {
  5184. pSW->S_Status=S_BSFLASH;
  5185. pSW->uSdhz_S.bFlag.bUABFlash = pSW->uSdhz_S.bFlag.bPower;
  5186. pSW->uSdhz_S.bFlag.bUBCFlash = !pSW->uSdhz_S.bFlag.bUABFlash;
  5187. if(pSW->uSdhz_S.bFlag.bPower)
  5188. soe_record_ev(EV_BS_UF_P+sw*EV_SW_NUM, 1, 0,0,0 );
  5189. else
  5190. soe_record_ev(EV_BS_UF_L+sw*EV_SW_NUM, 1, 0,0,0 );
  5191. }
  5192. else if(g_vol_stu[sw].S_lockstatus&(1<<0))//零序电压合后故障
  5193. {
  5194. pSW->S_Status = S_BSHHGZ ;
  5195. soe_record_ev(EV_BS_U0+sw*EV_SW_NUM, 1, 0,0,0 );//soe_ev_set(EV_BS_U0+sw*EV_SW_NUM,1);
  5196. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );//soe_ev_set(EV_HHGZ+sw*EV_SW_NUM,1);
  5197. pSW->tOnYSTime.boolTrip=true;//强制将Y计时器置一,防止开机后再次产生Y闭锁
  5198. if(pSW->uSdhz_S.bFlag.bPower)
  5199. soe_record_ev(EV_HHGZ_P+sw*EV_SW_NUM, 1, 0,0,0 );//soe_ev_set(EV_HHGZ_P+sw*EV_SW_NUM,1);
  5200. else
  5201. soe_record_ev(EV_HHGZ_L+sw*EV_SW_NUM, 1, 0,0,0 );//soe_ev_set(EV_HHGZ_L+sw*EV_SW_NUM,1);
  5202. }
  5203. else if(pSW->S_Status==S_BSYTIME|| pSW->S_Status==S_BSHHGZ ||pSW->S_Status==S_BSDL)
  5204. {
  5205. if(pSW->uSdhz_S.bFlag.bPower)
  5206. {
  5207. if(pSW->S_Status==S_BSYTIME)
  5208. soe_record_ev(EV_BS_Y_P+sw*EV_SW_NUM, 1, 0,0,0 ); //soe_ev_set(EV_BS_Y_P+sw*EV_SW_NUM,1);
  5209. else if(pSW->S_Status==S_BSHHGZ||pSW->S_Status==S_BSDL)
  5210. {
  5211. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );//soe_ev_set(EV_HHGZ+sw*EV_SW_NUM,1);
  5212. soe_record_ev(EV_HHGZ_P+sw*EV_SW_NUM, 1, 0,0,0 );//soe_ev_set(EV_HHGZ_P+sw*EV_SW_NUM,1);
  5213. pSW->tOnYSTime.boolTrip=true;//强制将Y计时器置一,防止开机后再次产生Y闭锁
  5214. }
  5215. }
  5216. else
  5217. {
  5218. if(pSW->S_Status==S_BSYTIME)
  5219. soe_record_ev(EV_BS_Y_L+sw*EV_SW_NUM, 1, 0,0,0 );//soe_ev_set(EV_BS_Y_L+sw*EV_SW_NUM,1);
  5220. else if(pSW->S_Status==S_BSHHGZ||pSW->S_Status==S_BSDL)
  5221. {
  5222. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );//soe_ev_set(EV_HHGZ+sw*EV_SW_NUM,1);
  5223. soe_record_ev(EV_HHGZ_L+sw*EV_SW_NUM, 1, 0,0,0 );//soe_ev_set(EV_HHGZ_L+sw*EV_SW_NUM,1);
  5224. pSW->tOnYSTime.boolTrip=true;//强制将Y计时器置一,防止开机后再次产生Y闭锁
  5225. }
  5226. }
  5227. }
  5228. else if(pSW->S_Status!=S_INIT)
  5229. {
  5230. fa_s_state_change(sw,S_INIT);//pSW->S_Status=S_INIT;
  5231. pSW->uSdhz_S.bFlag.bPower=0;
  5232. }
  5233. if(g_vol_stu[sw].S_lockstatus&(1<<1))
  5234. {
  5235. soe_record_ev(EV_BS_HA+sw*EV_SW_NUM, 1, 0,0,0 );//soe_ev_set(EV_BS_HA+sw*EV_SW_NUM,1);
  5236. #ifdef FUNC_REBOOT_BS_HA_JS_3S
  5237. g_tRelay[sw].uRmtSW.b_bsha = true;
  5238. #endif
  5239. }
  5240. if(g_vol_stu[sw].S_lockstatus&(1<<2))
  5241. {
  5242. soe_record_ev(EV_BS_FZMORE+sw*EV_SW_NUM, 1, 0,0,0 );//soe_ev_set(EV_BS_FZMORE+sw*EV_SW_NUM,1);
  5243. }
  5244. #ifdef GD_AREA_CHAOZHOUFENGXI
  5245. if(g_vol_stu[sw].S_lockstatus&(1<<3))
  5246. {
  5247. soe_record_ev(EV_BSBE_U0+sw*EV_SW_NUM, 1, 0,0,0 );
  5248. }
  5249. #endif
  5250. #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_ZHUHAI_FTU //珠海局要求合后故障,有压且合位的时候才能解锁
  5251. if(soe_check(EV_HHGZ+sw*EV_SW_NUM))
  5252. {
  5253. g_tRelay[sw].uRmtSW.bYH_fajs_flag=true;
  5254. pSW->bS_BSLed=fa_check_all_s_bs(sw);//点灯
  5255. }
  5256. #endif
  5257. g_vol_stu[sw].L_status = L_INIT;//重置联络模式保存信息
  5258. }
  5259. else if (pRunSet->tSwSet[sw].bTT_FA && g_tRelay[sw].run_stu.fa_ls)
  5260. {
  5261. rt_printf_time("\r\n当前联络模式 FA L_Status >>>>>>>>>上电方向=%d 上电状态=%s\r\n",g_vol_stu[sw].shangdiance,fa_l_status[g_vol_stu[sw].L_status]);
  5262. if(g_vol_stu[sw].L_status == L_XL_ZTIME)
  5263. {
  5264. pSW->uSdhz_L.bFlag.bUABFlash = g_vol_stu[sw].shangdiance;//残压方向
  5265. pSW->uSdhz_L.bFlag.bUBCFlash = !pSW->uSdhz_L.bFlag.bUABFlash;
  5266. ResetTR(&pSW->tOnYLTime);
  5267. fa_l_state_change(sw,L_XL_ZTIME);
  5268. #ifdef GD_AREA_ZHONGSHAN_2020
  5269. if(pSW->uSdhz_L.bFlag.bUABFlash)
  5270. soe_record_ev(EV_BS_UF_P+sw*EV_SW_NUM, 1, 0,0,0 );
  5271. if(pSW->uSdhz_L.bFlag.bUBCFlash)
  5272. soe_record_ev(EV_BS_UF_L+sw*EV_SW_NUM, 1, 0,0,0 );
  5273. #endif
  5274. }
  5275. else
  5276. {
  5277. g_vol_stu[sw].L_status = L_INIT;//重置联络模式保存信息
  5278. }
  5279. if(g_vol_stu[sw].L_lockstatus&(1<<0))//合后故障
  5280. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );
  5281. #ifdef FUNC_REBOOT_BS_HA_JS_3S
  5282. if(g_vol_stu[sw].L_lockstatus&(1<<1))
  5283. {
  5284. soe_record_ev(EV_BS_HA+sw*EV_SW_NUM, 1, 0,0,0 );
  5285. g_tRelay[sw].uRmtSW.b_bsha = true;
  5286. }
  5287. #endif
  5288. g_vol_stu[sw].status = S_INIT;//重置分段模式保存信息
  5289. }
  5290. }
  5291. gb_wake_soe = false;
  5292. }
  5293. #if 0
  5294. static void _volstu_update(void)
  5295. {
  5296. int sw;
  5297. for (sw=0; sw<SWITCH_NUM_MAX; sw++)
  5298. {
  5299. TSDHZ_T *pSW = &g_tRelay[sw].tSDHZ;
  5300. if (pRunSet->tSwSet[sw].bTT_FA&&!g_tRelay[sw].run_stu.fa_ls)
  5301. {
  5302. pSW->S_Status = g_vol_stu[sw].status;//初始化FA状态
  5303. pSW->uSdhz_S.bFlag.bPower= g_vol_stu[sw].shangdiance;
  5304. if(pSW->S_Status==S_BSXTIME||pSW->S_Status==S_BSFLASH)
  5305. {
  5306. pSW->S_Status=S_BSXTIME;
  5307. if(pSW->uSdhz_S.bFlag.bPower)
  5308. {
  5309. soe_ev_set(EV_BS_X_P+sw*EV_SW_NUM,1);
  5310. }
  5311. else
  5312. {
  5313. soe_ev_set(EV_BS_X_L+sw*EV_SW_NUM,1);
  5314. }
  5315. }
  5316. else if(pSW->S_Status==S_BSYTIME||pSW->S_Status==S_BSHHGZ||pSW->S_Status==S_BSDL)
  5317. {
  5318. if(pSW->uSdhz_S.bFlag.bPower)
  5319. {
  5320. soe_ev_set(EV_BS_Y_P+sw*EV_SW_NUM,1);
  5321. }
  5322. else
  5323. {
  5324. soe_ev_set(EV_BS_Y_L+sw*EV_SW_NUM,1);
  5325. }
  5326. }
  5327. else if(pSW->S_Status!=S_INIT)
  5328. {
  5329. fa_s_state_change(sw,S_INIT);//pSW->S_Status=S_INIT;
  5330. pSW->uSdhz_S.bFlag.bPower=0;
  5331. }
  5332. if(g_vol_stu[sw].lockstatus&(1<<0))
  5333. {
  5334. soe_ev_set(EV_BS_U0+sw*EV_SW_NUM,1);
  5335. }
  5336. if(g_vol_stu[sw].lockstatus&(1<<1))
  5337. {
  5338. soe_ev_set(EV_BS_HA+sw*EV_SW_NUM,1);
  5339. }
  5340. if(g_vol_stu[sw].lockstatus&(1<<2))
  5341. {
  5342. soe_ev_set(EV_BS_FZMORE+sw*EV_SW_NUM,1);
  5343. }
  5344. }
  5345. }
  5346. }
  5347. #endif
  5348. static void _volstatus_init(void)
  5349. {
  5350. int i;
  5351. int sw;
  5352. for(sw=0; sw<SWITCH_NUM_MAX; sw++)
  5353. {
  5354. // 仅保护投入时,才初始化上电合闸标志
  5355. if (pRunSet->tSwSet[sw].bTT_FA)
  5356. {
  5357. i = _volstatus_readfile();
  5358. if (i != 0)
  5359. {
  5360. rt_printf("上电合闸标志文件错误: %d\r\n", i);
  5361. // 上电合闸状态
  5362. memset (g_vol_stu, 0, sizeof(g_vol_stu));
  5363. g_vol_stu[sw].status = 1;
  5364. _volstatus_createfile();
  5365. }
  5366. g_volfile_open = 1;
  5367. break;
  5368. }
  5369. }
  5370. _volstu_update();
  5371. }
  5372. static void _volstatus_reinit(void)
  5373. {
  5374. int i;
  5375. int sw;
  5376. for(sw=0; sw<SWITCH_NUM_MAX; sw++)
  5377. {
  5378. // 仅保护投入时,才初始化上电合闸标志
  5379. if (pRunSet->tSwSet[sw].bTT_FA&& FA_ALL_EN(sw))
  5380. {
  5381. i = _volstatus_readfile();
  5382. if (i != 0)
  5383. {
  5384. rt_printf("上电合闸标志文件错误: %d\r\n", i);
  5385. // 上电合闸状态
  5386. memset (g_vol_stu, 0, sizeof(g_vol_stu));
  5387. g_vol_stu[sw].status = 0;
  5388. _volstatus_createfile();
  5389. }
  5390. g_volfile_open = 1;
  5391. break;
  5392. }
  5393. }
  5394. }
  5395. int vol_stu_printf(void)
  5396. {
  5397. int sw;
  5398. rt_printf("\r\nsw\tS_Status\tshangdiance\r\n");
  5399. for (sw=0; sw<SWITCH_NUM_MAX; sw++)
  5400. {
  5401. rt_printf("%d\t%02d\t%02d\r\n",
  5402. sw,
  5403. g_vol_stu[sw].status,
  5404. g_vol_stu[sw].shangdiance);
  5405. }
  5406. return 0;
  5407. }
  5408. int FA_status_write(void)
  5409. {
  5410. int sw, writeflag=0, bhTT=0;
  5411. loff_t pos;
  5412. int ret;
  5413. u16 crc;
  5414. //确保文件曾经打开
  5415. if (!g_volfile_open)
  5416. {
  5417. _volstatus_reinit();
  5418. return -1;
  5419. }
  5420. //文件句柄被清0,释放缓存
  5421. if(gf_volstu == 0)
  5422. {
  5423. if(g_volbuf)
  5424. {
  5425. rt_free(g_volbuf);
  5426. g_volbuf = 0;
  5427. g_volfile_open = 0;
  5428. }
  5429. return -2;
  5430. }
  5431. //判断保护是否投入,判断是否有存储标志
  5432. for (sw=0; sw<SWITCH_NUM_MAX; sw++)
  5433. {
  5434. if (pRunSet->tSwSet[sw].bTT_FA&& FA_ALL_EN(sw))
  5435. {
  5436. bhTT = 1;
  5437. }
  5438. if(g_tRelay[sw].tSDHZ.uSdhz_S.bFlag.bSaveStatus)
  5439. {
  5440. g_vol_stu[sw].status = g_tRelay[sw].tSDHZ.S_Status;
  5441. g_vol_stu[sw].shangdiance = g_tRelay[sw].tSDHZ.uSdhz_S.bFlag.bSNChange;
  5442. g_vol_stu[sw].S_lockstatus=0;
  5443. if(soe_check(EV_BS_U0+sw*EV_SW_NUM)) // 合后零压
  5444. {
  5445. g_vol_stu[sw].S_lockstatus|=(1<<0);
  5446. }
  5447. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)) //手分闭锁
  5448. {
  5449. g_vol_stu[sw].S_lockstatus|=(1<<1);
  5450. }
  5451. if(soe_check(EV_BS_FZMORE+sw*EV_SW_NUM))//多次分闸闭锁
  5452. {
  5453. g_vol_stu[sw].S_lockstatus|=(1<<2);
  5454. }
  5455. #ifdef GD_AREA_CHAOZHOUFENGXI
  5456. if(soe_check(EV_BSBE_U0+sw*EV_SW_NUM)==true) //
  5457. {
  5458. g_vol_stu[sw].S_lockstatus|=(1<<3);
  5459. }
  5460. #endif
  5461. writeflag = 1;
  5462. g_tRelay[sw].tSDHZ.uSdhz_S.bFlag.bSaveStatus=false;
  5463. }
  5464. else if(g_tRelay[sw].tSDHZ.uSdhz_L.bFlag.bSaveStatus)
  5465. {
  5466. g_vol_stu[sw].status = 0;
  5467. g_vol_stu[sw].shangdiance = g_tRelay[sw].tSDHZ.uSdhz_L.bFlag.bSNChange;
  5468. g_vol_stu[sw].L_lockstatus=0;
  5469. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)) // 合后故障
  5470. {
  5471. g_vol_stu[sw].L_lockstatus|=(1<<0);
  5472. }
  5473. #ifdef FUNC_REBOOT_BS_HA_JS_3S
  5474. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)) // 手分闭锁
  5475. {
  5476. g_vol_stu[sw].L_lockstatus|=(1<<1);
  5477. }
  5478. #endif
  5479. g_vol_stu[sw].L_status = g_tRelay[sw].tSDHZ.L_Status;
  5480. writeflag = 1;
  5481. g_tRelay[sw].tSDHZ.uSdhz_L.bFlag.bSaveStatus=false;
  5482. }
  5483. }
  5484. //所有上电合闸保护全部退出时,关闭文件,释放缓存
  5485. if (!bhTT)
  5486. {
  5487. if(gf_volstu != 0)
  5488. {
  5489. rt_file_close(gf_volstu,0);
  5490. }
  5491. if(g_volbuf)
  5492. {
  5493. rt_free(g_volbuf);
  5494. gf_volstu = 0;
  5495. g_volbuf = 0;
  5496. g_volfile_open = 0;
  5497. }
  5498. return -3;
  5499. }
  5500. //巡检上电合闸的存储标志
  5501. if (!writeflag)
  5502. {
  5503. return -4;
  5504. }
  5505. //存储标志
  5506. memcpy(g_volbuf+sizeof(struct vol_file_head), g_vol_stu, sizeof(g_vol_stu));
  5507. // 计算CRC
  5508. crc = CrcStr(g_volbuf, vol_filelen-2);
  5509. //CRC的位置需考虑16对齐
  5510. memcpy(g_volbuf+vol_filelen-2, &crc, 2);
  5511. pos = 0;
  5512. ret = rt_file_write(gf_volstu, g_volbuf, vol_filelen, &pos);
  5513. if(ret != vol_filelen)
  5514. {
  5515. rt_file_close(gf_volstu,0);
  5516. rt_free(g_volbuf);
  5517. gf_volstu = 0;
  5518. g_volbuf = 0;
  5519. g_volfile_open = 0;
  5520. rt_printf("\r\n write error");
  5521. return -5;
  5522. }
  5523. return 0;
  5524. }
  5525. int FA_exit(void)
  5526. {
  5527. if(gf_volstu != 0)
  5528. {
  5529. rt_file_close(gf_volstu,0);
  5530. }
  5531. if(g_volbuf)
  5532. {
  5533. rt_free(g_volbuf);
  5534. gf_volstu = 0;
  5535. g_volbuf = 0;
  5536. g_volfile_open = 0;
  5537. }
  5538. return 0;
  5539. }
  5540. void Pro_hzbs(int sw,DWORD dStep)
  5541. {
  5542. TRELAY_T *pR=&g_tRelay[sw];
  5543. THZBS_T *pSW = &pR->thzbs;
  5544. TSETSW *pSet = &pRunSet->tSwSet[sw];
  5545. bool bY1;
  5546. RunTR(&pSW->tTw100ms100ms,( (pR->run_stu.sw==2)?true:false), dStep);
  5547. bY1=pSW->tTw100ms100ms.boolTrip&&((pR->run_stu.sw==1)?true:false);
  5548. #if 1
  5549. if(pR->run_stu.sw==1 && soe_check(EV_BS_FZMORE+sw*EV_SW_NUM))
  5550. {
  5551. pSW->fztimes = 0;
  5552. }
  5553. #endif
  5554. RunTR(&pSW->tBSHZTime,((pSW->fztimes>0)?true:false), dStep);
  5555. bY1=FA_ALL_EN(sw)
  5556. &&pSet->bTT_hzbs //连续分闸闭锁投退
  5557. &&!pSW->tBSHZTime.boolTrip; //时间未到, 设定时间内连续失压分闸
  5558. if(bY1)
  5559. {
  5560. if(pSW->fztimes>=pSet->hzbstimes) //分闸次数大于整定值,
  5561. {
  5562. pR->bBSHZ=true;
  5563. if(soe_check(EV_BS_FZMORE+sw*EV_SW_NUM)==false)
  5564. {
  5565. soe_record_ev(EV_BS_FZMORE+sw*EV_SW_NUM, 1, 0,0,0 );
  5566. fa_s_set_savestatus(sw);
  5567. }
  5568. pSW->fztimes=0;
  5569. ResetTR(&pSW->tBSHZTime);
  5570. }
  5571. }
  5572. else //超时清零
  5573. {
  5574. pSW->fztimes = 0;
  5575. ResetTR(&pSW->tBSHZTime);
  5576. }
  5577. if(pSet->bTT_hzbs) //
  5578. {
  5579. if(g_run_stu.js||g_run_stu.rmtjs)
  5580. {
  5581. if(pSW->fztimes)
  5582. rt_printf("js:连续分闸闭锁\r\n");
  5583. pR->bBSHZ=false;
  5584. pSW->fztimes=0;
  5585. ResetTR(&pSW->tBSHZTime);
  5586. if(soe_check(EV_BS_FZMORE+sw*EV_SW_NUM)==true)
  5587. {
  5588. soe_record_ev(EV_BS_FZMORE+sw*EV_SW_NUM, 0, 0,0,0 );
  5589. fa_s_set_savestatus(sw);
  5590. }
  5591. }
  5592. }
  5593. }
  5594. #ifdef FUN_JDXX
  5595. /**************************************************************************
  5596. 函数名称:get_power_on_dir
  5597. 函数版本:1.00
  5598. 作者:
  5599. 创建日期:
  5600. 函数功能说明:获取上电方向(目前暂未使用,仅用作返回参数,后续小电流接地需判方向时再做完整功能)
  5601. 输入参数:
  5602. 其他输入:
  5603. 输出参数:
  5604. 返回值:true----负荷侧送电 false电源侧送电
  5605. ***************************************************************************/
  5606. bool get_power_on_dir(int sw)
  5607. {
  5608. return false;
  5609. }
  5610. #endif
  5611. // = ========================= 本文件结束 =============================