DispatchSystem.cs 393 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. using AGV_WPF_Global;
  11. using System.Data.OleDb;
  12. using System.Xml.Serialization;
  13. using System.IO;
  14. using System.Threading.Tasks;
  15. using AGV_WPF.Models;
  16. using HslCommunication;
  17. using AGV_WPF.Tools;
  18. using System.Diagnostics;
  19. using HslCommunication.Profinet.Siemens;
  20. using Newtonsoft.Json.Linq;
  21. using AGV_WPF.DLL;
  22. using AGV_WPF.ExtraUI;
  23. using AGV_WPF.Services;
  24. using WCS.API;
  25. using AGV_WPF.Model;
  26. using WCS.API.WebApiClient;
  27. namespace AGV_WPF
  28. {
  29. public partial class DispatchSystem : Form
  30. {
  31. DataTable dtConfig = new DataTable();
  32. HslCommunication.OperateResult result;// HslCommunication.OperateResult result2;
  33. int HeartBitCount = 1; //int HeartBitCount2 = 1;
  34. private delegate void InvokeDelegate();
  35. Dictionary<int, string> checkPosDic = new Dictionary<int, string>();
  36. Dictionary<int, int> AGVIDWithPosByCheckPos = new Dictionary<int, int>();
  37. Dictionary<int, int> AGVIDWithPosByCheckPosReal = new Dictionary<int, int>();
  38. Dictionary<int, int> AGVIDWithRouteByCheckPos = new Dictionary<int, int>();
  39. Dictionary<string, byte> DBWithByteValue = new Dictionary<string, byte>();
  40. private static object portLock = new object();
  41. Stopwatch sw = new Stopwatch();
  42. Dictionary<string, CFDClass> dicReleaseArea = new Dictionary<string, CFDClass>();
  43. public int CurCFDRoute = -1;
  44. Dictionary<string, bool> InitOK = new Dictionary<string, bool>();
  45. List<int> CFDRoutes = new List<int>();
  46. int index = 0;
  47. int CFDWaitTimes = 15;
  48. int CFDCheckTimes = 0;
  49. Dictionary<string, List<string>> dicCheck = new Dictionary<string, List<string>>();
  50. DataTable DtTraffic = new DataTable();
  51. List<string> listTra = new List<string>();
  52. byte PLCHeartBitCount = 0;
  53. bool HeartBitFlag = true;
  54. OperateResult<byte> PLCResult;
  55. bool IsPLCChangeOff = false;
  56. DataTable LineDt = new DataTable();
  57. DataTable ProductTypeDt = new DataTable();
  58. bool DockingOK = false;
  59. int lastSWAGVNum = -1;
  60. SocketTcpServer Server;
  61. // SocketTcpServer Server;
  62. bool isChoseMat = false;
  63. static List<JObject> MesStations = new List<JObject>();
  64. List<string> afterRelease = new List<string>();
  65. System.Timers.Timer timer = new System.Timers.Timer(); System.Timers.Timer timer2 = new System.Timers.Timer();
  66. Dictionary<string, SiemensS7Net> DicPLC = new Dictionary<string, SiemensS7Net>();
  67. List<string> heartBitList = new List<string>(); List<string> heartBitList2 = new List<string>();
  68. Dictionary<SiemensS7Net, OperateResult> DicPLCResult = new Dictionary<SiemensS7Net, OperateResult>();
  69. List<string> BoxMarkList = new List<string>();
  70. DataTable dtSKQPLC = new DataTable();
  71. DataTable dtTestPLC = new DataTable();
  72. DataTable dtBigzPLC = new DataTable();
  73. bool PLCPackAlarm = false;
  74. bool PLCTestAlarm = false;
  75. List<string> AlarmPackStations = new List<string>();
  76. int AlarmNumber = 1;
  77. public DispatchSystem()
  78. {
  79. InitializeComponent();
  80. }
  81. private void DispatchSystem_Load(object sender, EventArgs e)
  82. {
  83. LoadConfig();
  84. if (!isChoseMat)
  85. {
  86. this.FormClosing += new FormClosingEventHandler(DispatchSystem_FormClosing);
  87. Thread thread2 = new Thread(HeartBit); thread2.IsBackground = true;
  88. thread2.Start();
  89. // Thread thread = new Thread(Analzye); thread.IsBackground = true;
  90. // thread.Start();
  91. timer.Enabled = true;
  92. timer.Interval = 200;
  93. timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
  94. timer.Start();
  95. timer2.Enabled = true;
  96. timer2.Interval = 2000;
  97. timer2.Elapsed += new System.Timers.ElapsedEventHandler(timer2_Elapsed);
  98. timer2.Start();
  99. }
  100. //MES通讯
  101. if (Server == null)
  102. {
  103. Server = new SocketTcpServer(int.Parse(dtConfig.Rows[12][1].ToString()));
  104. Server.ReceiveDataDeal = ExcuteSKQMES;
  105. Server.StartListener(1000, Int32.MaxValue);
  106. }
  107. }
  108. void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
  109. {
  110. //throw new NotImplementedException();
  111. try
  112. {
  113. if (AlarmPackStations.Count == 0) { PLCPackAlarm = false; }
  114. else { PLCPackAlarm = true; }
  115. if (PLCPackAlarm)
  116. {
  117. // DispatcherTool.AlarmStartOrStop(3, AlarmNumber);
  118. }
  119. else if (PLCTestAlarm)
  120. {
  121. // DispatcherTool.AlarmStartOrStop(2, AlarmNumber);
  122. }
  123. else if (!PLCTestAlarm && !PLCPackAlarm)
  124. {
  125. // DispatcherTool.AlarmStartOrStop(1, AlarmNumber);
  126. }
  127. }
  128. catch (Exception) { }
  129. }
  130. void DispatchSystem_FormClosing(object sender, FormClosingEventArgs e)
  131. {
  132. if (!isChoseMat)
  133. {
  134. e.Cancel = true;
  135. }
  136. else
  137. {
  138. DispatchSystem ds = new DispatchSystem();
  139. ds.Show();
  140. }
  141. }
  142. /// <summary>
  143. /// 加载配置
  144. /// </summary>
  145. public void LoadConfig()
  146. {
  147. sw.Restart();
  148. tabControl1.TabPages.Clear();
  149. 物料设置ToolStripMenuItem.DropDownItems.Clear();
  150. checkPosDic.Clear();
  151. AGVIDWithPosByCheckPos.Clear();
  152. DBWithByteValue.Clear();
  153. HeartBitCount = 1;
  154. XmlSerializer deserializer1 = new XmlSerializer(GlobalPara.gs_configInfo.GetType());
  155. try
  156. {
  157. using (TextReader tr = new StreamReader("CConfig.xml"))
  158. {
  159. GlobalPara.gs_configInfo = (AGV_WPF.Tools.CConfigData)deserializer1.Deserialize(tr);
  160. }
  161. }
  162. catch (Exception ex)
  163. { }
  164. string currPath = System.AppDomain.CurrentDomain.BaseDirectory;
  165. string dataPath = currPath + @"data";
  166. string dataFile = dataPath + @"\基础配置表.xls";
  167. try
  168. {
  169. string confStr1 = @"Provider=Microsoft.ACE.OLEDB.12.0;";
  170. string confStr2 = @"Persist Security Info=false;";
  171. string confStr3 = @"Data Source=" + dataFile + ";";
  172. string confStr4 = @"Extended Properties=" + "'Excel 12.0;HDR=YES;IMEX=1'";
  173. string connStr = confStr1 + confStr2 + confStr3 + confStr4;
  174. OleDbConnection oleDC = new OleDbConnection(connStr);
  175. OleDbDataAdapter oleDDA1 = new OleDbDataAdapter("Select * From [参数配置$]", oleDC);
  176. oleDDA1.Fill(dtConfig);
  177. OleDbDataAdapter oleDDA2 = new OleDbDataAdapter("Select * From [物料类型$]", oleDC);
  178. DataTable temp = new DataTable();
  179. oleDDA2.Fill(temp);
  180. if (temp.Rows.Count > 0)
  181. {
  182. for (int i = 0; i < temp.Rows.Count; i++)
  183. {
  184. ToolStripMenuItem tsm = new ToolStripMenuItem(temp.Rows[i][1].ToString());
  185. 物料设置ToolStripMenuItem.DropDownItems.Add(tsm);
  186. tsm.Font = new Font("黑体", 15);
  187. if (GlobalPara.gs_configInfo.CurrentMatName == temp.Rows[i][1].ToString())
  188. {
  189. tsm.CheckState = CheckState.Checked;
  190. }
  191. tsm.Click += new EventHandler(tsm_Click);
  192. }
  193. }
  194. string temo = dtConfig.Rows[10][1].ToString();
  195. BoxMarkList = dtConfig.Rows[10][1].ToString().Split(';').ToList();
  196. GlobalPara.BoxMarkLists = BoxMarkList;
  197. tabControl1.DrawMode = TabDrawMode.Normal;
  198. tabControl1.SizeMode = TabSizeMode.Fixed;
  199. tabControl1.DrawItem += new DrawItemEventHandler(tabControl1_DrawItem);
  200. GlobalPara.s701 = new HslCommunication.Profinet.Siemens.SiemensS7Net(HslCommunication.Profinet.Siemens.SiemensPLCS.S1500,
  201. dtConfig.Rows[0][1].ToString());
  202. GlobalPara.s701.Rack = (byte)Convert.ToInt16(dtConfig.Rows[2][1].ToString());
  203. GlobalPara.s701.Slot = (byte)Convert.ToInt16(dtConfig.Rows[3][1].ToString());
  204. GlobalPara.s701.ConnectTimeOut = 300;
  205. GlobalPara.s701.ReceiveTimeOut = 200;
  206. GlobalPara.s701.ConnectServer();
  207. GlobalPara.s701.SetPersistentConnection();
  208. if (!DicPLC.ContainsKey(dtConfig.Rows[0][2].ToString().Trim()))
  209. {
  210. DicPLC.Add(dtConfig.Rows[0][2].ToString().Trim(), GlobalPara.s701); //1,
  211. DicPLCResult.Add(GlobalPara.s701, null);
  212. }
  213. if (dtConfig.Rows[1][2] != null && !string.IsNullOrEmpty(dtConfig.Rows[1][2].ToString()))
  214. {
  215. GlobalPara.Gloal1063Flag = true;
  216. }
  217. //GlobalPara.s702 = new HslCommunication.Profinet.Siemens.SiemensS7Net(HslCommunication.Profinet.Siemens.SiemensPLCS.S1500,
  218. //dtConfig.Rows[5][1].ToString());
  219. //GlobalPara.s702.Rack = (byte)Convert.ToInt16(dtConfig.Rows[7][1].ToString());
  220. //GlobalPara.s702.Slot = (byte)Convert.ToInt16(dtConfig.Rows[8][1].ToString());
  221. //GlobalPara.s702.ConnectTimeOut = 500;
  222. //GlobalPara.s702.ReceiveTimeOut = 200;
  223. //GlobalPara.s702.ConnectServer();
  224. //GlobalPara.s702.SetPersistentConnection();
  225. //if (!DicPLC.ContainsKey(dtConfig.Rows[5][2].ToString().Trim()))
  226. //{
  227. // DicPLC.Add(dtConfig.Rows[5][2].ToString().Trim(), GlobalPara.s702);
  228. // DicPLCResult.Add(GlobalPara.s702, null);
  229. //}
  230. // result = GlobalPara.s701.ConnectServer();
  231. heartBitList.Add(dtConfig.Rows[1][1].ToString()); heartBitList2.Add(dtConfig.Rows[4][1].ToString());
  232. heartBitList.Add(dtConfig.Rows[6][1].ToString()); heartBitList2.Add(dtConfig.Rows[9][1].ToString());
  233. if (dtConfig.Rows.Count >= 11)
  234. {
  235. AlarmNumber = int.Parse(dtConfig.Rows[11][1].ToString());
  236. }
  237. if (File.Exists(@"Exception\判断点放行信息.txt"))
  238. {
  239. string[] texts = File.ReadAllLines(@"Exception\判断点放行信息.txt");
  240. if (texts != null && texts.Length > 0)
  241. {
  242. foreach (string str in texts)
  243. {
  244. string[] context = str.Split(',');
  245. if (context.Length > 1)
  246. {
  247. int num = int.Parse(context[0]);
  248. if (!AGVIDWithPosByCheckPos.ContainsKey(num))
  249. {
  250. AGVIDWithPosByCheckPos.Add(num, int.Parse(context[1]));
  251. }
  252. if (context.Length > 2)
  253. {
  254. if (!AGVIDWithRouteByCheckPos.ContainsKey(num))
  255. {
  256. AGVIDWithRouteByCheckPos.Add(num, int.Parse(context[2]));
  257. }
  258. }
  259. }
  260. }
  261. }
  262. }
  263. sw.Stop();
  264. Console.WriteLine("配置初始化总共花费{0}s.", sw.Elapsed.TotalSeconds);
  265. sw.Restart();
  266. InitView();
  267. sw.Stop();
  268. Console.WriteLine("界面初始化总共花费{0}s.", sw.Elapsed.TotalSeconds);
  269. }
  270. catch (System.Exception ex)
  271. {
  272. MessageBox.Show(ex.StackTrace);
  273. }
  274. }
  275. void tsm_Click(object sender, EventArgs e)
  276. {
  277. for (int i = 0; i < 物料设置ToolStripMenuItem.DropDownItems.Count; i++)
  278. {
  279. if (((ToolStripMenuItem)物料设置ToolStripMenuItem.DropDownItems[i]).Text == ((ToolStripMenuItem)sender).Text
  280. && ((ToolStripMenuItem)sender).CheckState == CheckState.Checked)
  281. {
  282. return;
  283. }
  284. ((ToolStripMenuItem)物料设置ToolStripMenuItem.DropDownItems[i]).CheckState = CheckState.Unchecked;
  285. }
  286. ((ToolStripMenuItem)sender).Checked = true;
  287. GlobalPara.gs_configInfo.CurrentMatName = ((ToolStripMenuItem)sender).Text;
  288. XmlSerializer serializer2 = new XmlSerializer(GlobalPara.gs_configInfo.GetType());
  289. using (TextWriter tw = new StreamWriter("CConfig.xml"))
  290. {
  291. serializer2.Serialize(tw, GlobalPara.gs_configInfo);
  292. }
  293. // this.DispatchSystem_Load(null, null);
  294. isChoseMat = true;
  295. this.Close();
  296. }
  297. void tsm_CheckedChanged(object sender, EventArgs e)
  298. {
  299. //throw new NotImplementedException();
  300. }
  301. void tsm_CheckStateChanged(object sender, EventArgs e)
  302. {
  303. //throw new NotImplementedException();
  304. }
  305. public void Releasetest()
  306. {
  307. bool flag = false;
  308. string ProductType = "2500010EDG";
  309. if (!string.IsNullOrEmpty(ProductType) && ProductType.Length > 3)
  310. {
  311. for (int i1 = 0; i1 < ProductTypeDt.Rows.Count; i1++) //循环表
  312. {
  313. string route = "";
  314. List<string> list1 = new List<string>();
  315. if (ProductTypeDt.Rows[i1][0] != null)
  316. {
  317. route = ProductTypeDt.Rows[i1][0].ToString().Trim();
  318. }
  319. list1 = ProductTypeDt.Rows[i1][1].ToString().Trim().Split(';').ToList();
  320. foreach (string type1 in list1)
  321. {
  322. int length = ProductType.Length;
  323. String Type = ProductType.Substring(length - 3);
  324. if (Type.StartsWith(type1) && route != "")
  325. {
  326. int route1 = int.Parse(route);
  327. //DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, int.Parse(route)); //根据路线放行
  328. flag = true;
  329. }
  330. }
  331. if (flag)
  332. {
  333. break;
  334. }
  335. }
  336. }
  337. }
  338. PLCSqlDLL PLCSql = new PLCSqlDLL();
  339. /// <summary>
  340. /// 界面初始化
  341. /// </summary>
  342. /// <param name="temp"></param>
  343. public void InitView()
  344. {
  345. StartHttpServer();
  346. string currPath = System.AppDomain.CurrentDomain.BaseDirectory;
  347. string dataPath = currPath + @"data\";
  348. string dataFile = dataPath + GlobalPara.gs_configInfo.CurrentMatName + ".xls";
  349. if (false == File.Exists(dataFile))
  350. {
  351. DirectoryInfo di = new DirectoryInfo(dataPath);
  352. foreach (FileInfo f in di.GetFiles())
  353. {
  354. if (!f.Name.Contains("基础配置表") && f.Extension.Contains(".xls"))
  355. {
  356. GlobalPara.gs_configInfo.CurrentMatName = f.Name.Replace(".xls", "");
  357. for (int i = 0; i < 物料设置ToolStripMenuItem.DropDownItems.Count; i++)
  358. {
  359. if (物料设置ToolStripMenuItem.DropDownItems[i].Text == GlobalPara.gs_configInfo.CurrentMatName)
  360. {
  361. ((ToolStripMenuItem)物料设置ToolStripMenuItem.DropDownItems[i]).CheckState = CheckState.Checked;
  362. }
  363. }
  364. dataFile = f.FullName;
  365. break;
  366. }
  367. }
  368. }
  369. try
  370. {
  371. string confStr1 = @"Provider=Microsoft.ACE.OLEDB.12.0;";
  372. string confStr2 = @"Persist Security Info=false;";
  373. string confStr3 = @"Data Source=" + dataFile + ";";
  374. string confStr4 = @"Extended Properties=" + "'Excel 12.0;HDR=YES;IMEX=1'";
  375. string connStr = confStr1 + confStr2 + confStr3 + confStr4;
  376. OleDbConnection oleDC = new OleDbConnection(connStr);
  377. OleDbDataAdapter oleDDA2 = new OleDbDataAdapter("Select * From [线体信息$]", oleDC);
  378. oleDDA2.Fill(LineDt);
  379. OleDbDataAdapter oleDDA5 = new OleDbDataAdapter("Select * From [产品类型$]", oleDC);
  380. oleDDA5.Fill(ProductTypeDt);
  381. OleDbDataAdapter oleDDA33 = new OleDbDataAdapter("Select * From [PACK线$]", oleDC);
  382. oleDDA33.Fill(dtSKQPLC);
  383. GlobalPara.dtSKQPLCs = dtSKQPLC;
  384. //OleDbDataAdapter oleDDA44 = new OleDbDataAdapter("Select * From [PLC工站$]", oleDC);
  385. //oleDDA44.Fill(dtTestPLC);
  386. // Releasetest();
  387. //if (!string.IsNullOrEmpty(dtConfig.Rows[13][1].ToString()))
  388. //{
  389. // AGVInfo Agvinfo = new AGVInfo();
  390. // string ProductType = "";
  391. // bool flag = false;
  392. // string MARKNUM = "65";
  393. // string ss = dtConfig.Rows[13][1].ToString();
  394. // if (MARKNUM.Equals(dtConfig.Rows[13][1].ToString())) //到达分配点地标
  395. // {
  396. // PLCSql.PLCMESSelect("4", "2", ref Agvinfo); //查询数据
  397. // ProductType = Agvinfo.ProductType;
  398. // }
  399. //}
  400. //OleDbDataAdapter oleDDA55 = new OleDbDataAdapter("Select * From [大族焊房$]", oleDC);
  401. //oleDDA55.Fill(dtBigzPLC);
  402. //OleDbDataAdapter oleDDA44 = new OleDbDataAdapter("Select * From [先惠测试$]", oleDC);
  403. //oleDDA44.Fill(dtTestPLC);
  404. Dictionary<Thread, object[]> listThread = new Dictionary<Thread, object[]>();
  405. for (int i = 0; i < LineDt.Rows.Count; i++)
  406. {
  407. int ConnectType = int.Parse(LineDt.Rows[i]["对接方式"].ToString());
  408. string lineName = LineDt.Rows[i]["线体名称"].ToString();
  409. TabPage tb = new TabPage(lineName);
  410. tb.Font = new System.Drawing.Font("楷体", tb.Font.Size + 5);
  411. oleDDA2 = new OleDbDataAdapter("Select * From [" + lineName + "$]", oleDC);
  412. DataTable temp2 = new DataTable();
  413. temp2.TableName = lineName;
  414. oleDDA2.Fill(temp2);
  415. if (LineDt.Rows[i]["判断点"] != null && !string.IsNullOrEmpty(LineDt.Rows[i]["判断点"].ToString()) && LineDt.Rows[i]["判断点"].ToString() != "0")
  416. {
  417. if (!checkPosDic.ContainsKey(int.Parse(LineDt.Rows[i]["判断点"].ToString())))
  418. {
  419. checkPosDic.Add(int.Parse(LineDt.Rows[i]["判断点"].ToString()), lineName);
  420. }
  421. }
  422. int X = 10, Y = 10;
  423. List<Button> listBtn = new List<Button>();
  424. if (lineName == "充放电测试")
  425. {
  426. DataView dv = temp2.DefaultView;
  427. dv.Sort = " 优先级 asc";
  428. temp2 = dv.ToTable();
  429. }
  430. for (int j = 1; j <= temp2.Rows.Count; j++)
  431. {
  432. //if (temp2.Columns.Contains("组号") && !dicReleaseArea.ContainsKey(int.Parse(temp2.Rows[j - 1]["组号"].ToString())))
  433. //{
  434. // dicReleaseArea.Add(int.Parse(temp2.Rows[j - 1]["组号"].ToString()), null);
  435. //}
  436. if (temp2.Rows[j - 1]["放行DB"] != null && !string.IsNullOrEmpty(temp2.Rows[j - 1]["放行DB"].ToString()) && temp2.Rows[j - 1]["放行DB"].ToString() != "0")
  437. {
  438. if (!DBWithByteValue.ContainsKey((temp2.Rows[j - 1]["放行DB"].ToString())))
  439. {
  440. DBWithByteValue.Add((temp2.Rows[j - 1]["放行DB"].ToString()), (byte)255);
  441. }
  442. }
  443. if (temp2.Columns.Contains("判断地标"))
  444. {
  445. if (temp2.Rows[j - 1]["判断地标"] != null && !string.IsNullOrEmpty(temp2.Rows[j - 1]["判断地标"].ToString()))
  446. {
  447. if (!dicCheck.ContainsKey(temp2.Rows[j - 1]["工位地标"].ToString()))
  448. {
  449. dicCheck.Add(temp2.Rows[j - 1]["工位地标"].ToString(), temp2.Rows[j - 1]["判断地标"].ToString().Split(',').ToList());
  450. }
  451. }
  452. }
  453. Button btn = new Button();
  454. btn.Text = temp2.Rows[j - 1][1].ToString();
  455. btn.Location = new Point(X, Y);
  456. btn.Font = new Font("宋体", 15);
  457. btn.Size = new Size(100, 80);
  458. btn.Click
  459. += new EventHandler(btn_Click);
  460. btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  461. X += btn.Size.Width + 20;
  462. if (j % 8 == 0)
  463. {
  464. X = 10; Y += btn.Height + 20;
  465. }
  466. btn.Tag = temp2.Rows[j - 1][2].ToString();
  467. tb.Controls.Add(btn);
  468. if (!string.IsNullOrEmpty(temp2.Rows[j - 1][2].ToString()) && AGVIDWithPosByCheckPos.ContainsValue(int.Parse(temp2.Rows[j - 1][2].ToString())))
  469. {
  470. List<int> keys = AGVIDWithPosByCheckPos.Keys.ToList();
  471. for (int a = 0; a < keys.Count; a++)
  472. {
  473. if (AGVIDWithPosByCheckPos[keys[a]] == int.Parse(temp2.Rows[j - 1][2].ToString()))
  474. {
  475. btn.Text = btn.Text.Replace("\n", "") + "\n" + keys[a];
  476. btn.BackColor = Color.Blue;
  477. break;
  478. }
  479. }
  480. }
  481. listBtn.Add(btn);
  482. if (lineName == "充放电测试")
  483. {
  484. if (!CFDRoutes.Contains(int.Parse(temp2.Rows[j - 1]["放行路线"].ToString())))
  485. {
  486. CFDRoutes.Add(int.Parse(temp2.Rows[j - 1]["放行路线"].ToString()));
  487. }
  488. }
  489. }
  490. Tools.TabPageTag tt = new Tools.TabPageTag();
  491. tt.Table = temp2.Copy();
  492. tt.ListBtn = new List<Button>();
  493. string PLCNumber = LineDt.Rows[i][4].ToString().Trim();
  494. if (DicPLC.ContainsKey(PLCNumber))
  495. {
  496. tt.S7 = DicPLC[PLCNumber];
  497. }
  498. else
  499. {
  500. tt.S7 = null;
  501. }
  502. tt.ListBtn.AddRange(listBtn);
  503. tt.ConnectType = ConnectType;
  504. listAllBtns.AddRange(listBtn);
  505. tb.Tag = tt;
  506. tabControl1.TabPages.Add(tb);
  507. object[] obj = new object[3];
  508. obj[0] = listBtn; obj[1] = 0; obj[2] = lineName;
  509. if (lineName == "充放电测试")
  510. {
  511. CurCFDRoute = CFDRoutes[index];
  512. }
  513. // if (lineName == "充放电测试") { tabControl1.SelectedTab = tb; }
  514. if (ConnectType == 2)
  515. {
  516. // MesDts.Add(temp2.Copy()); //初始化MES对接工站
  517. for (int a = 0; a < tt.Table.Rows.Count; a++)
  518. {
  519. JObject jobj = new JObject();
  520. jobj["ID"] = tt.Table.Rows[a]["ID"].ToString();
  521. jobj["Mark"] = tt.Table.Rows[a]["工位地标"].ToString();
  522. if (a + 1 < tt.Table.Rows.Count)
  523. {
  524. jobj["NextMark"] = tt.Table.Rows[a + 1]["工位地标"].ToString();
  525. }
  526. else
  527. {
  528. jobj["NextMark"] = 0;
  529. }
  530. jobj["Status"] = 0;
  531. jobj["AGVID"] = 0;
  532. jobj["AGVStatus"] = 0;
  533. jobj["TargetStation"] = 0;
  534. MesStations.Add(jobj);
  535. }
  536. }
  537. listThread.Add(new Thread(new ParameterizedThreadStart(DockingOpeare0)), obj);//.Start(listBtn);
  538. // DockingOpeare0(obj);
  539. }
  540. OleDbDataAdapter oleDDA3 = new OleDbDataAdapter("Select * From [管制信息$]", oleDC);
  541. oleDDA3.Fill(DtTraffic);
  542. if (File.Exists(@"Exception\管制点放行信息.txt"))
  543. {
  544. string[] texts = File.ReadAllLines(@"Exception\管制点放行信息.txt");
  545. listTra.AddRange(texts.ToList());
  546. if (listTra.Count < DtTraffic.Rows.Count)
  547. {
  548. for (int i = 0; i < DtTraffic.Rows.Count - listTra.Count; i++)
  549. {
  550. listTra.Add("0");
  551. }
  552. }
  553. }
  554. else
  555. {
  556. if (DtTraffic.Rows.Count > 0)
  557. {
  558. listTra = new List<string>(DtTraffic.Rows.Count);
  559. for (int i = 0; i < DtTraffic.Rows.Count; i++)
  560. {
  561. listTra.Add("0");
  562. }
  563. }
  564. }
  565. foreach (Thread t in listThread.Keys)
  566. {
  567. t.Priority = ThreadPriority.Highest; t.IsBackground = true;
  568. t.Start(listThread[t]);
  569. }
  570. // Thread.Sleep(8000);
  571. //Thread t2 = new Thread(new ThreadStart(checkingOperate));
  572. //t2.Priority = ThreadPriority.BelowNormal;
  573. //t2.Start();
  574. // new Thread(new ThreadStart(CFDCheck)).Start();
  575. // new Thread(new ThreadStart(checkingRelease2)).Start();
  576. //Thread t3 = new Thread(new ThreadStart(TrafficByDispatch));
  577. //t3.Priority = ThreadPriority.AboveNormal;
  578. //t3.Start();
  579. //Thread t5 = new Thread(new ThreadStart(CFDCheck)); t5.IsBackground = true;
  580. //t5.Priority = ThreadPriority.Normal;
  581. //t5.Start();
  582. //test(dtSKQPLC.Rows[0]);
  583. SKQPLC();
  584. Thread t4 = new Thread(new ThreadStart(PLCHeartBit)); t4.IsBackground = true;
  585. t4.Priority = ThreadPriority.Lowest;
  586. // t4.Start(); 220713 XDL注释
  587. Thread t5 = new Thread(new ThreadStart(ReleaseBoxLight)); t5.IsBackground = true;
  588. t5.Priority = ThreadPriority.Normal;
  589. t5.Start();
  590. }
  591. catch (System.Exception ex)
  592. {
  593. WriteFile("调度程序异常" + DateTime.Now.ToString("yyyy-MM-dd"), ex.Message + ex.StackTrace);
  594. MessageBox.Show(ex.StackTrace);
  595. }
  596. }
  597. public void StartHttpServer()
  598. {
  599. string address = "http://localhost:3350";
  600. if (WcsServerHost.Instance.StartServer(address))
  601. {
  602. // lb_Address.Text = address;
  603. }
  604. else
  605. {
  606. // lb_Address.Text = $"Http服务启动失败,地址:{address}";
  607. }
  608. }
  609. void btn_Click(object sender, EventArgs e)
  610. {
  611. //throw new NotImplementedException();
  612. Button btn = (Button)sender;
  613. if (btn.BackColor == Color.Blue)
  614. {
  615. if (MessageBox.Show("该工位已被分配锁定,是否解除锁定?", "警告", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
  616. {
  617. btn.Invoke(new InvokeDelegate(delegate
  618. {
  619. if (AGVIDWithPosByCheckPos.ContainsValue(int.Parse(btn.Tag.ToString())))
  620. {
  621. int num = AGVIDWithPosByCheckPos.Keys.ToList()[AGVIDWithPosByCheckPos.Values.ToList().IndexOf(int.Parse(btn.Tag.ToString()))];
  622. if (AGVIDWithPosByCheckPos.ContainsKey(num))
  623. {
  624. lock (AGVIDWithPosByCheckPos)
  625. {
  626. AGVIDWithPosByCheckPos.Remove(num);
  627. }
  628. }
  629. if (AGVIDWithRouteByCheckPos.ContainsKey(num))
  630. {
  631. lock (AGVIDWithRouteByCheckPos)
  632. {
  633. AGVIDWithRouteByCheckPos.Remove(num);
  634. recordReleaseInfo();
  635. }
  636. }
  637. if (AGVIDWithPosByCheckPosReal.ContainsKey(num))
  638. {
  639. lock (AGVIDWithPosByCheckPosReal)
  640. {
  641. AGVIDWithPosByCheckPosReal.Remove(num);
  642. }
  643. }
  644. btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  645. if (btn.Text.Contains("("))
  646. {
  647. btn.Text = btn.Text.Replace("\n", "").Substring(0, btn.Text.LastIndexOf("(") - 1);
  648. }
  649. }
  650. else
  651. {
  652. int num = int.Parse(btn.Tag.ToString());
  653. if (AGVIDWithPosByCheckPos.Values.Contains(num))
  654. {
  655. lock (AGVIDWithPosByCheckPos)
  656. {
  657. var temp = AGVIDWithPosByCheckPos.First(o => o.Value == num);
  658. if (AGVIDWithPosByCheckPos.ContainsKey(temp.Key))
  659. {
  660. AGVIDWithPosByCheckPos.Remove(temp.Key);
  661. }
  662. }
  663. }
  664. if (AGVIDWithRouteByCheckPos.Values.Contains(num))
  665. {
  666. lock (AGVIDWithRouteByCheckPos)
  667. {
  668. var temp = AGVIDWithRouteByCheckPos.First(o => o.Value == num);
  669. if (AGVIDWithRouteByCheckPos.ContainsKey(temp.Key))
  670. {
  671. AGVIDWithRouteByCheckPos.Remove(temp.Key);
  672. recordReleaseInfo();
  673. }
  674. }
  675. }
  676. if (AGVIDWithPosByCheckPosReal.Values.Contains(num))
  677. {
  678. lock (AGVIDWithPosByCheckPosReal)
  679. {
  680. var temp = AGVIDWithPosByCheckPosReal.First(o => o.Value == num);
  681. if (AGVIDWithPosByCheckPosReal.ContainsKey(temp.Key))
  682. {
  683. AGVIDWithPosByCheckPosReal.Remove(temp.Key);
  684. }
  685. }
  686. }
  687. btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  688. if (btn.Text.Contains("("))
  689. {
  690. btn.Text = btn.Text.Replace("\n", "").Substring(0, btn.Text.LastIndexOf("(") - 1);
  691. }
  692. }
  693. }
  694. ));
  695. }
  696. else if (btn.BackColor == Color.Red)
  697. {
  698. if (MessageBox.Show("该工位AGV已故障,是否解除状态,并将AGV移到故障?", "警告", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
  699. {
  700. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  701. IEnumerable<AGVInfoModel> temp = listModel.Where(o => o.MARKNUM.ToString() == btn.Tag.ToString());
  702. if (temp.Count() > 0)
  703. {
  704. AGVInfoModel info = temp.ToList()[0];
  705. info.MARKNUM = 0;
  706. GlobalPara.AgvInfoDic[info.AGVNUM] = info;
  707. }
  708. btn.Invoke(new InvokeDelegate(delegate
  709. {
  710. btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  711. if (btn.Text.Contains("("))
  712. {
  713. btn.Text = btn.Text.Replace("\n", "").Substring(0, btn.Text.LastIndexOf("(") - 1);
  714. }
  715. }));
  716. }
  717. }
  718. }
  719. }
  720. /// <summary>
  721. /// 记录放行后的情况
  722. /// </summary>
  723. public void recordReleaseInfo()
  724. {
  725. if (AGVIDWithPosByCheckPos.Count > 0)
  726. {
  727. string[] textArray = new string[AGVIDWithPosByCheckPos.Count];
  728. int aryIndex = 0;
  729. foreach (int num in AGVIDWithPosByCheckPos.Keys)
  730. {
  731. if (AGVIDWithPosByCheckPos.ContainsKey(num))
  732. {
  733. textArray[aryIndex] = num + "," + AGVIDWithPosByCheckPos[num];
  734. }
  735. if (AGVIDWithRouteByCheckPos.ContainsKey(num))
  736. {
  737. textArray[aryIndex] += "," + AGVIDWithRouteByCheckPos[num];
  738. }
  739. ++aryIndex;
  740. }
  741. File.WriteAllLines(@"Exception\判断点放行信息.txt", textArray);
  742. }
  743. else
  744. {
  745. ClearTxt(@"Exception\判断点放行信息.txt");
  746. }
  747. }
  748. public void ClearTxt(string path)
  749. {
  750. try
  751. {
  752. FileStream stream = File.Open(path, FileMode.OpenOrCreate, FileAccess.Write);
  753. stream.Seek(0, SeekOrigin.Begin);
  754. stream.SetLength(0);
  755. stream.Close();
  756. }
  757. catch (Exception)
  758. {
  759. }
  760. }
  761. /// <summary>
  762. /// 调度管制
  763. /// </summary>
  764. public void TrafficByDispatch()
  765. {
  766. if (isChoseMat) { return; }
  767. if (DtTraffic.Rows.Count > 0)
  768. {
  769. bool b = true;
  770. while (b)
  771. {
  772. try
  773. {
  774. // if (!GlobalPara.IsOneKeySleep)
  775. {
  776. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  777. for (int i = 0; i < DtTraffic.Rows.Count; i++)
  778. {
  779. List<string> listIn = DtTraffic.Rows[i][0].ToString().Split(',').ToList();
  780. List<string> listTraffic = DtTraffic.Rows[i][1].ToString().Split(',').ToList();
  781. //List<AGVInfoModel> results = listModel.FindAll(o => listTra[i].Equals(o.MARKNUM.ToString()) && o.ConnectStatus == true);
  782. //if (results != null && results.Count > 0)
  783. //{
  784. //}
  785. //else
  786. // {
  787. List<AGVInfoModel> results = listModel.FindAll(o => listIn.Contains(o.MARKNUM.ToString()) && o.ConnectStatus == true);
  788. // }
  789. if (results != null && results.Count > 0)
  790. {
  791. AGVInfoModel result = results.OrderBy(o => o.LastModifyMarkTime).ToList()[0];
  792. List<AGVInfoModel> results2 = listModel.FindAll(o => listTraffic.Contains(o.MARKNUM.ToString()) && o.ConnectStatus == true);
  793. if (listIn.Count == 1 && results.Count > 1)
  794. {
  795. continue;
  796. }
  797. if (results == null || results2.Count <= 0)
  798. {
  799. List<AGVInfoModel> results3 = listModel.FindAll(o => result.MARKNUM == o.MARKNUM && o.RUNSTATUS_Cur != 0x41 && o.ConnectStatus == true);
  800. if (results3 != null && results3.Count <= 0)
  801. {
  802. int route = 0; int targetMark = 0;
  803. if (AGVIDWithPosByCheckPos.Keys.Contains(result.AGVNUM))
  804. {
  805. targetMark = AGVIDWithPosByCheckPos[result.AGVNUM];
  806. }
  807. if (AGVIDWithRouteByCheckPos.Keys.Contains(result.AGVNUM))
  808. {
  809. route = AGVIDWithRouteByCheckPos[result.AGVNUM];
  810. }
  811. //List<int> markList = new List<int>() { 5,19,34};
  812. Thread.Sleep(1000);
  813. DispatcherTool.ReleaseAgvOnStop(result.MARKNUM, route, targetMark, 1);
  814. if (listTra[i] != result.MARKNUM.ToString())
  815. {
  816. listTra[i] = result.MARKNUM.ToString();
  817. File.WriteAllLines(@"Exception\管制点放行信息.txt", listTra.ToArray());
  818. }
  819. WriteFile("管制记录" + DateTime.Now.ToString("yyyy-MM-dd"), result.AGVNUM + "号AGV符合放行条件,地标为:" + result.MARKNUM + ",路线为" + route + ",目的地标为" + targetMark);
  820. }
  821. }
  822. }
  823. }
  824. }
  825. }
  826. catch (Exception)
  827. {
  828. b = false;
  829. //Thread.Sleep(200);
  830. //new Thread(new ThreadStart(TrafficByDispatch)).Start();
  831. }
  832. finally
  833. {
  834. //if (!b)
  835. //{
  836. // Thread.Sleep(500);
  837. // Thread t2 = new Thread(new ThreadStart(TrafficByDispatch)); t2.IsBackground = true;
  838. // t2.Priority = ThreadPriority.AboveNormal;
  839. // t2.Start();
  840. // WriteFile("线程重启", "TrafficByDispatch报错,已重启!");
  841. //}
  842. }
  843. Thread.Sleep(500);
  844. }
  845. }
  846. }
  847. /// <summary>
  848. /// 收到PLC放行信号继续发送放行
  849. /// </summary>
  850. public void checkingRelease()
  851. {
  852. bool b = true;
  853. while (b)
  854. {
  855. try
  856. {
  857. // if (!GlobalPara.IsOneKeySleep)
  858. {
  859. // if (result != null && result.IsSuccess)
  860. {
  861. for (int j = 0; j < tabControl1.TabPages.Count; j++) //当前页码
  862. {
  863. if (tabControl1.TabPages[j].Tag != null)
  864. {
  865. TabPageTag tt = (TabPageTag)tabControl1.TabPages[j].Tag;
  866. SiemensS7Net s7 = tt.S7;
  867. //result = s7.ConnectServer();
  868. // result = DicPLCResult[s7];
  869. // if (result != null && result.IsSuccess)
  870. {
  871. for (int k = 0; k < tt.Table.Rows.Count; k++)
  872. {
  873. DataRow dr = tt.Table.Rows[k];
  874. string releaseAddress = dr["放行DB"].ToString();
  875. if (!string.IsNullOrEmpty(releaseAddress))
  876. {
  877. OperateResult<byte> resultRead = s7.ReadByte(releaseAddress);
  878. if (resultRead != null && result.IsSuccess)
  879. {
  880. if (resultRead.Content == (byte)GlobalPara.DBControlValues.OKRelease)
  881. {
  882. DispatcherTool.ReleaseAgvOnStop(int.Parse(dr["工位地标"].ToString()), 0, int.Parse(dr["目的地标"].ToString()));
  883. }
  884. else if (resultRead.Content == (byte)GlobalPara.DBControlValues.NGRelease)
  885. {
  886. DispatcherTool.ReleaseAgvOnStop(int.Parse(dr["工位地标"].ToString()), int.Parse(dr["NG路线"].ToString()));
  887. }
  888. }
  889. }
  890. Thread.Sleep(10);
  891. }
  892. }
  893. }
  894. }
  895. }
  896. }
  897. }
  898. catch (Exception)
  899. {
  900. b = false;
  901. //Thread.Sleep(500);
  902. //new Thread(new ThreadStart(checkingRelease)).Start();
  903. }
  904. finally
  905. {
  906. if (!b)
  907. {
  908. Thread.Sleep(500);
  909. Thread t2 = new Thread(new ThreadStart(checkingRelease)); t2.IsBackground = true;
  910. t2.Priority = ThreadPriority.BelowNormal;
  911. t2.Start();
  912. WriteFile("线程重启", "checkingRelease报错,已重启!");
  913. }
  914. }
  915. Thread.Sleep(500);
  916. }
  917. }
  918. /// <summary>
  919. /// 收到PLC放行信号继续发送放行
  920. /// </summary>
  921. public void checkingRelease2()
  922. {
  923. bool b = true;
  924. while (b)
  925. {
  926. try
  927. {
  928. // if (result != null && result.IsSuccess)
  929. {
  930. List<string> keys = DBWithByteValue.Keys.ToList();
  931. for (int i = 0; i < keys.Count; i++)
  932. {
  933. if (DBWithByteValue[keys[i]] == (byte)GlobalPara.DBControlValues.OKRelease ||
  934. DBWithByteValue[keys[i]] == (byte)GlobalPara.DBControlValues.NGRelease)
  935. {
  936. for (int j = 0; j < tabControl1.TabPages.Count; j++)
  937. {
  938. if (tabControl1.TabPages[j].Tag != null)
  939. {
  940. TabPageTag tt = (TabPageTag)tabControl1.TabPages[j].Tag;
  941. SiemensS7Net s7 = tt.S7;
  942. //result = s7.ConnectServer();
  943. result = DicPLCResult[s7];
  944. if (result != null && result.IsSuccess)
  945. {
  946. DataRow[] drs = tt.Table.Select("放行DB='" + keys[i] + "'");
  947. if (drs != null && drs.Length > 0)
  948. {
  949. if (DBWithByteValue[keys[i]] == (byte)GlobalPara.DBControlValues.OKRelease)
  950. {
  951. DispatcherTool.ReleaseAgvOnStop(int.Parse(drs[0]["工位地标"].ToString()), 0, int.Parse(drs[0]["目的地标"].ToString()));
  952. break;
  953. }
  954. else if (DBWithByteValue[keys[i]] == (byte)GlobalPara.DBControlValues.NGRelease)
  955. {
  956. DispatcherTool.ReleaseAgvOnStop(int.Parse(drs[0]["工位地标"].ToString()), int.Parse(drs[0]["NG路线"].ToString()));
  957. break;
  958. }
  959. }
  960. }
  961. }
  962. }
  963. }
  964. }
  965. }
  966. }
  967. catch (Exception)
  968. {
  969. b = false;
  970. //Thread.Sleep(500);
  971. //new Thread(new ThreadStart(checkingRelease2)).Start();
  972. }
  973. finally
  974. {
  975. if (!b)
  976. {
  977. Thread.Sleep(500);
  978. new Thread(new ThreadStart(checkingRelease2)).Start();
  979. WriteFile("线程重启", "checkingRelease报错,已重启!");
  980. }
  981. }
  982. Thread.Sleep(500);
  983. }
  984. }
  985. /// <summary>
  986. /// 判断点事件
  987. /// </summary>
  988. public void checkingOperate()
  989. {
  990. while (true)
  991. {
  992. if (isChoseMat) { return; }
  993. bool bb = false;
  994. Stopwatch sw2 = new Stopwatch();
  995. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  996. ParallelLoopResult result;
  997. try
  998. {
  999. result = Parallel.ForEach<int>(checkPosDic.Keys, new ParallelOptions { MaxDegreeOfParallelism = 1 }, pos =>
  1000. {
  1001. // if (!GlobalPara.IsOneKeySleep)
  1002. {
  1003. // && !AGVIDWithPosByCheckPos.ContainsKey(o.AGVNUM)
  1004. AGVInfoModel temp = listModel.Find(o => o.MARKNUM == pos && (o.RUNSTATUS_Cur == 0x41 || (o.MARKFUN == 1 && o.ALARMINFO == "低电压报警")) && o.ConnectStatus == true);
  1005. if (temp != null)
  1006. {
  1007. int num = temp.AGVNUM;
  1008. int checkRoute = temp.ROUTENUM;
  1009. lock (listModel)
  1010. {
  1011. //if (temp.EollFlag == false)
  1012. //{
  1013. // temp.EollFlag = true;
  1014. // WriteFile("EOL1-EOL2", "(地标:" + temp.MARKNUM + ", " + ",车号:" + temp.AGVNUM + ") ,开关打开,原因:读到判断点");
  1015. //}
  1016. }
  1017. if (!AGVIDWithPosByCheckPos.ContainsKey(num))
  1018. {
  1019. string lineName = checkPosDic[pos];
  1020. bool b2 = false;
  1021. for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
  1022. {
  1023. if (this.tabControl1.TabPages[i].Text == lineName && InitOK.ContainsKey(lineName) && InitOK[lineName])
  1024. {
  1025. TabPageTag tag = this.tabControl1.TabPages[i].Tag as TabPageTag;
  1026. DataRow[] drs = null;
  1027. {
  1028. drs = tag.Table.Select("优先级>0", "优先级 asc");
  1029. }
  1030. if (lineName.ToLower().Contains("pack线"))
  1031. {
  1032. drs = tag.Table.Select("优先级>0 and 判断路线<>'0'", "优先级 asc");
  1033. List<DataRow> listDr = new List<DataRow>();
  1034. foreach (DataRow dr in drs)
  1035. {
  1036. if (dr["判断路线"].ToString().Split(';').Contains(checkRoute.ToString()))
  1037. {
  1038. listDr.Add(dr);
  1039. }
  1040. }
  1041. drs = listDr.ToArray();
  1042. }
  1043. for (int j = 0; j < drs.Length; j++)
  1044. {
  1045. // IEnumerable<DataRow> query =
  1046. //from data in tag.Table.AsEnumerable()
  1047. //group data by data["路线"] into g
  1048. //select g.First();
  1049. if (tag.Table.Columns.Contains("通道DB"))
  1050. {
  1051. string releaseAddress = drs[j]["通道DB"].ToString();
  1052. if (releaseAddress != "0")
  1053. {
  1054. OperateResult<byte> resultRead = tag.S7.ReadByte(releaseAddress);
  1055. if (resultRead.IsSuccess)
  1056. {
  1057. if (resultRead.Content == (byte)1)
  1058. {
  1059. }
  1060. else
  1061. {
  1062. continue;
  1063. }
  1064. }
  1065. }
  1066. }
  1067. Button btn = tag.ListBtn.Find(o => o.Tag.ToString() == drs[j]["工位地标"].ToString() && !AGVIDWithPosByCheckPos.ContainsValue(int.Parse(o.Tag.ToString()))
  1068. && (o.BackColor == Color.FromKnownColor(KnownColor.Control) || o.BackColor == Color.FromKnownColor(KnownColor.Green)
  1069. ) && o.BackColor != Color.FromKnownColor(KnownColor.Blue));
  1070. if (btn != null)
  1071. {
  1072. //找到目的站点,放行路线
  1073. bool b = true;
  1074. if (dicCheck.ContainsKey(drs[j]["工位地标"].ToString()))
  1075. {
  1076. List<string> tempList = dicCheck[drs[j]["工位地标"].ToString()];
  1077. for (int a = 0; a < tempList.Count; a++)
  1078. {
  1079. int iindex = listModel.FindIndex(o => o.MARKNUM.ToString() == tempList[a] && o.ConnectStatus == true);
  1080. if (iindex > -1)
  1081. {
  1082. b = false;
  1083. break;
  1084. }
  1085. }
  1086. }
  1087. if (b)
  1088. {
  1089. AGVIDWithPosByCheckPos.Add(num, int.Parse(drs[j]["工位地标"].ToString()));
  1090. AGVIDWithRouteByCheckPos.Add(num, int.Parse(drs[j]["放行路线"].ToString()));
  1091. AGVIDWithPosByCheckPosReal.Add(num, pos);
  1092. DispatcherTool.ReleaseAgvOnStop(pos, int.Parse(drs[j]["放行路线"].ToString()), int.Parse(drs[j]["工位地标"].ToString()));
  1093. WriteFile("判断点记录-" + DateTime.Now.ToString("yyyy-MM-dd"), "(判断点地标:" + pos + ",放行路线:" + drs[j]["放行路线"].ToString() + ",目的地标:" + int.Parse(drs[j]["工位地标"].ToString()) + ",车号:" + num + ",工位颜色为" + btn.BackColor.Name + ") ");
  1094. if (!dicReleaseArea.ContainsKey(num.ToString()))
  1095. {
  1096. CFDClass cfd = new CFDClass();
  1097. cfd.agvID = num;
  1098. cfd.mark = pos;
  1099. cfd.targetMark = int.Parse(drs[j]["工位地标"].ToString());
  1100. cfd.route = int.Parse(drs[j]["放行路线"].ToString());
  1101. cfd.IsRelease = false;
  1102. dicReleaseArea.Add(num.ToString(), cfd);
  1103. }
  1104. recordReleaseInfo();
  1105. btn.Invoke(new InvokeDelegate(delegate
  1106. {
  1107. if (btn.BackColor != Color.FromKnownColor(KnownColor.Blue))
  1108. {
  1109. btn.BackColor = Color.Blue;
  1110. if (btn.Text.Contains("("))
  1111. {
  1112. int textIndex = btn.Text.LastIndexOf("(");
  1113. string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  1114. btn.Text = orignName + "\n" + "(" + num + ")";
  1115. }
  1116. else
  1117. {
  1118. btn.Text = btn.Text.Replace("\n", "") + "\n" + "(" + num + ")";
  1119. }
  1120. }
  1121. }));
  1122. b2 = true;
  1123. break;
  1124. }
  1125. }
  1126. }
  1127. }
  1128. if (b2)
  1129. {
  1130. break;
  1131. }
  1132. }
  1133. }
  1134. else //AGVIDWithPosByCheckPos 包含当前AGVID
  1135. {
  1136. if (AGVIDWithPosByCheckPosReal.ContainsKey(num))
  1137. {
  1138. if (AGVIDWithPosByCheckPosReal[num] != pos)
  1139. {
  1140. if (AGVIDWithPosByCheckPos.ContainsKey(num))
  1141. {
  1142. AGVIDWithPosByCheckPos.Remove(num);
  1143. }
  1144. if (AGVIDWithRouteByCheckPos.ContainsKey(num))
  1145. {
  1146. AGVIDWithRouteByCheckPos.Remove(num);
  1147. }
  1148. AGVIDWithPosByCheckPosReal.Remove(num);
  1149. recordReleaseInfo();
  1150. for (int i = 0; i < tabControl1.TabPages.Count; i++)
  1151. {
  1152. Button tempBtn = (tabControl1.TabPages[i].Tag as TabPageTag).ListBtn.Find(o => o.Text.Contains("(" + num + ")") && o.BackColor == Color.Blue);
  1153. if (tempBtn != null)
  1154. {
  1155. tempBtn.BackColor = Color.FromKnownColor(KnownColor.Control);
  1156. if (tempBtn.Text.Contains("("))
  1157. {
  1158. tempBtn.Text = tempBtn.Text.Replace("\n", "").Substring(0, tempBtn.Text.LastIndexOf("(") - 1);
  1159. }
  1160. break;
  1161. }
  1162. }
  1163. WriteFile("判断点异常自解除记录" + DateTime.Now.ToString("yyyy-MM-dd"), num + "号车在" + pos + "地标判断点解除上次锁定");
  1164. }
  1165. else //AGVIDWithPosByCheckPosReal[num] == pos
  1166. {
  1167. // AGVIDWithPosByCheckPosReal
  1168. //int route = -1; int target = -1;
  1169. //if (AGVIDWithPosByCheckPos.ContainsKey(num))
  1170. //{
  1171. // target = AGVIDWithPosByCheckPos[num];
  1172. //}
  1173. //if (AGVIDWithRouteByCheckPos.ContainsKey(num))
  1174. //{
  1175. // route = AGVIDWithRouteByCheckPos[num];
  1176. //}
  1177. //if (route != -1 && target != -1)
  1178. //{
  1179. // DispatcherTool.ReleaseAgvOnStop(pos, route, target, 1);
  1180. //}
  1181. }
  1182. }
  1183. }
  1184. }
  1185. }
  1186. });
  1187. // if (result.IsCompleted)
  1188. {
  1189. sw2.Stop();
  1190. Console.WriteLine("判断点任务总共花费{0}s.", sw.Elapsed.TotalSeconds);
  1191. //Thread.Sleep(50);
  1192. //Thread t2 = new Thread(new ThreadStart(checkingOperate)); t2.IsBackground = true;
  1193. //t2.Priority = ThreadPriority.BelowNormal;
  1194. //t2.Start();
  1195. }
  1196. }
  1197. catch (Exception ex)
  1198. {
  1199. //DateTime time = DateTime.Now;
  1200. ////MessageBox.Show("线程异常:"+e.ExceptionObject);
  1201. //FileStream stream = File.Open(@"Exception\调度程序异常.txt", FileMode.Append, FileAccess.Write);
  1202. //StreamWriter writer = new StreamWriter(stream);
  1203. //if (ex != null)
  1204. //{
  1205. // string msg = string.Format("[{0}]Test:\r\nMessage:{1}\r\nStackTrace:\r\n{2}", time.ToString("yyyy-MM-dd HH:mm:ss"), ex.Message, ex.StackTrace);
  1206. // writer.WriteLine(msg);
  1207. // writer.Close();
  1208. // stream.Close();
  1209. //}
  1210. //bb = true;
  1211. //Thread.Sleep(500);
  1212. //new Thread(new ThreadStart(checkingOperate)).Start();
  1213. }
  1214. finally
  1215. {
  1216. //if (bb)
  1217. //{
  1218. // Thread.Sleep(500);
  1219. // Thread t2 = new Thread(new ThreadStart(checkingOperate)); t2.IsBackground = true;
  1220. // t2.Priority = ThreadPriority.BelowNormal;
  1221. // t2.Start();
  1222. // WriteFile("线程重启", "checkingOperate报错,已重启!");
  1223. //}
  1224. }
  1225. Thread.Sleep(500);
  1226. }
  1227. }
  1228. public void CFDCheck()
  1229. {
  1230. if (isChoseMat) { return; }
  1231. bool bb = false;
  1232. ParallelLoopResult result2;
  1233. try
  1234. {
  1235. List<string> list = dicReleaseArea.Keys.ToList();
  1236. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  1237. result2 = Parallel.ForEach<string>(list, new ParallelOptions { MaxDegreeOfParallelism = 2 }, key =>
  1238. {
  1239. if (dicReleaseArea[key] != null)
  1240. {
  1241. // List<Button> listBtn = dicReleaseArea[key].btns;
  1242. // if (listBtn != null && listBtn.Count > 0)
  1243. {
  1244. CFDClass cfd = dicReleaseArea[key];
  1245. if (listModel.FindIndex(o => o.AGVNUM == cfd.agvID && cfd.mark == o.MARKNUM && o.ConnectStatus == true
  1246. && ((o.RUNSTATUS_Cur == 0x43 || o.RUNSTATUS_Cur == 0x44 || (o.MARKFUN == 1 && o.ALARMINFO == "低电压报警")))) > -1)
  1247. {
  1248. if (listModel.FindAll(o => cfd.mark == o.MARKNUM && o.ConnectStatus == true).Count() == 1)
  1249. {
  1250. DispatcherTool.ReleaseAgvOnStop(cfd.mark, cfd.route, cfd.targetMark, 2);
  1251. if (!cfd.IsRelease)
  1252. {
  1253. cfd.IsRelease = true;
  1254. lock (dicReleaseArea)
  1255. {
  1256. dicReleaseArea[key] = cfd;
  1257. }
  1258. }
  1259. }
  1260. }
  1261. else
  1262. {
  1263. lock (dicReleaseArea)
  1264. {
  1265. dicReleaseArea.Remove(key);
  1266. }
  1267. if (cfd.IsRelease)
  1268. {
  1269. WriteFile("补充放行记录" + DateTime.Now.ToString("yyyy-MM-dd"), key + "号AGV放行完成");
  1270. }
  1271. }
  1272. }
  1273. }
  1274. });
  1275. // if (result2.IsCompleted)
  1276. {
  1277. Thread.Sleep(2000);
  1278. Thread t2 = new Thread(new ThreadStart(CFDCheck));
  1279. t2.Priority = ThreadPriority.Normal; t2.IsBackground = true;
  1280. t2.Start();
  1281. }
  1282. }
  1283. catch (Exception ex)
  1284. {
  1285. DateTime time = DateTime.Now;
  1286. //MessageBox.Show("线程异常:"+e.ExceptionObject);
  1287. FileStream stream = File.Open(@"Exception\调度程序异常.txt", FileMode.Append, FileAccess.Write);
  1288. StreamWriter writer = new StreamWriter(stream);
  1289. if (ex != null)
  1290. {
  1291. string msg = string.Format("[{0}]Test:\r\nMessage:{1}\r\nStackTrace:\r\n{2}", time.ToString("yyyy-MM-dd HH:mm:ss"), ex.Message, ex.StackTrace);
  1292. writer.WriteLine(msg);
  1293. writer.Close();
  1294. stream.Close();
  1295. }
  1296. bb = true;
  1297. }
  1298. finally
  1299. {
  1300. if (bb)
  1301. {
  1302. Thread.Sleep(2000);
  1303. Thread t2 = new Thread(new ThreadStart(CFDCheck)); t2.IsBackground = true;
  1304. t2.Priority = ThreadPriority.BelowNormal;
  1305. t2.Start();
  1306. WriteFile("线程重启", "CFDCheck报错,已重启!");
  1307. }
  1308. }
  1309. }
  1310. public void DockingOpeare0(object o)
  1311. {
  1312. object[] obj = (object[])o;
  1313. DockingOpeare((List<Button>)obj[0], (int)obj[1], (string)obj[2]);
  1314. }
  1315. public void ReleaseLot()
  1316. {
  1317. try
  1318. {
  1319. List<string> list = new List<string>();
  1320. for (int i = 0; i < dtConfig.Rows.Count; i++)
  1321. {
  1322. if (dtConfig.Rows[i][0] != null && dtConfig.Rows[i][1] != null && dtConfig.Rows[i][0].ToString().Trim() == "解绑地标")
  1323. {
  1324. list = dtConfig.Rows[i][1].ToString().Trim().Split(';').ToList();
  1325. }
  1326. }
  1327. if (list != null && list.Count > 0)
  1328. {
  1329. while (true)
  1330. {
  1331. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  1332. List<AGVInfoModel> results = listModel.FindAll(o => list.Contains(o.MARKNUM.ToString()) && o.ConnectStatus == true);
  1333. if (results != null && results.Count > 0)
  1334. {
  1335. foreach (AGVInfoModel info in results)
  1336. {
  1337. if (info != null)
  1338. {
  1339. PLCSql.PLCSql(info.AGVNUM.ToString(), "", "", "3");
  1340. }
  1341. }
  1342. }
  1343. Thread.Sleep(500);
  1344. }
  1345. }
  1346. }
  1347. catch (Exception ex)
  1348. {
  1349. FileStream stream = File.Open(@"Exception\调度程序异常lot.txt", FileMode.Append, FileAccess.Write);
  1350. StreamWriter writer = new StreamWriter(stream);
  1351. if (ex != null)
  1352. {
  1353. string msg = string.Format("[{0}]Test:\r\nMessage:{1}\r\nStackTrace:\r\n{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), ex.Message, ex.StackTrace);
  1354. writer.WriteLine(msg);
  1355. writer.Close();
  1356. stream.Close();
  1357. }
  1358. }
  1359. }
  1360. /// <summary>
  1361. /// 工位事件
  1362. /// </summary>
  1363. /// <param name="listBtn"></param>
  1364. public void DockingOpeare(List<Button> listBtn, int tag, string lineName)
  1365. {
  1366. while (true)
  1367. {
  1368. if (isChoseMat) { return; }
  1369. ParallelLoopResult result2;
  1370. bool bb = false;
  1371. try
  1372. {
  1373. Stopwatch sw2 = new Stopwatch();
  1374. List<Button> list = (List<Button>)listBtn;
  1375. // TabPageTag tag = this.tabControl1.TabPages[i].Tag as TabPageTag;
  1376. DataTable dt = (list[0].Parent.Tag as TabPageTag).Table; //当前table pack线.table
  1377. SiemensS7Net s7 = (list[0].Parent.Tag as TabPageTag).S7;
  1378. int type = (list[0].Parent.Tag as TabPageTag).ConnectType;
  1379. // s7.SetPersistentConnection();
  1380. List<int> list2 = AGVIDWithPosByCheckPos.Values.ToList();
  1381. // while (true)
  1382. {
  1383. for (int i = 0; i < list.Count; i++)
  1384. // result2 = Parallel.ForEach<Button>(list, new ParallelOptions { MaxDegreeOfParallelism = 8 }, btn =>
  1385. {
  1386. //if (list2.Contains((int)btn.Tag))
  1387. //{
  1388. // IEnumerable<AGVInfoModel> temp = listModel.Where(o => o.MARKNUM.ToString() == btn.Tag.ToString() && o.ConnectStatus == true);
  1389. // btn.Invoke(new InvokeDelegate(delegate
  1390. // {
  1391. // if (btn.BackColor != Color.FromKnownColor(KnownColor.Blue))
  1392. // {
  1393. // btn.BackColor = Color.Blue;
  1394. // }
  1395. // }));
  1396. //}
  1397. //else
  1398. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  1399. {
  1400. Button btn = list[i];
  1401. if (btn.Tag != null)
  1402. {
  1403. //到站集合
  1404. List<AGVInfoModel> temp = listModel.FindAll(o => o.MARKNUM.ToString() == btn.Tag.ToString() && o.ConnectStatus == true);
  1405. IEnumerable<DataRow> query = //当前table中到站集合
  1406. from order in dt.AsEnumerable()
  1407. where order["工位地标"].ToString() == btn.Tag.ToString()
  1408. select order;
  1409. if (temp != null && temp.Count() > 0)
  1410. {
  1411. if (lineName.Contains("气密"))
  1412. {
  1413. foreach (AGVInfoModel info in temp)
  1414. {
  1415. if (info.EollFlag == false)
  1416. {
  1417. info.EollFlag = true;
  1418. WriteFile("EOL1-EOL2", "(地标:" + info.MARKNUM + ", " + ",车号:" + info.AGVNUM + ") ,开关打开,原因:读到整包地标");
  1419. }
  1420. }
  1421. }
  1422. //到站停止集合
  1423. List<AGVInfoModel> temp2 = temp.FindAll(o => ((o.RUNSTATUS_Cur == 0x41 || o.RUNSTATUS_Cur == 0x46 || o.RUNSTATUS_Cur == 0x44 || (o.MARKFUN == 1 && o.ALARMINFO == "低电压报警"))
  1424. && o.ConnectStatus == true && o.AGVNUM != 0));
  1425. if (temp2.Count() > 0)
  1426. {
  1427. List<AGVInfoModel> infos = temp2.ToList();
  1428. infos = infos.OrderByDescending(o => o.LastModifyMarkTime).ToList();
  1429. AGVInfoModel info = infos[0];
  1430. bool agvSame = true;
  1431. bool needToNext = false;
  1432. info.IsOutFlag = false;
  1433. if (info.IsReachFlag == false && (info.MARKNUM != 65))
  1434. {
  1435. #region MES 到岗上报
  1436. StationInfo info1 = new StationInfo();
  1437. info1.Mark = info.MARKNUM.ToString();
  1438. info1.AGVNum = info.AGVNUM;
  1439. info1.StationName = query.ToList()[0]["工位名称"].ToString();
  1440. string address = "/AgvInfo/AgvArrival";
  1441. PostPelletIdStatus(info1, address);
  1442. info.IsReachFlag = true;
  1443. info.AllowReleaseFlag = false;
  1444. #endregion
  1445. WriteFile("MES工位点记录-" + DateTime.Now.ToString("yyyy-MM-dd"), "小车到港记录:" + info.AGVNUM + ",地标:" + info1.Mark + "车号:" + info.AGVNUM + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur);
  1446. }
  1447. string Test = "";
  1448. #region 根据产品类型判断放行方法
  1449. if (!string.IsNullOrEmpty(dtConfig.Rows[13][1].ToString()))
  1450. {
  1451. AGVInfo Agvinfo = new AGVInfo();
  1452. string ProductType = "";
  1453. bool flag = false;
  1454. // WriteFile("进站记录-" + DateTime.Now.ToString("yyyy-MM-dd"), "小车进站记录2:" + info.AGVNUM + ",地标:" + info.MARKNUM + ",ProductType" + Test + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur + "dtConfig.Rows[13][1].ToString()" + dtConfig.Rows[13][1].ToString());
  1455. if (info.MARKNUM.ToString().Equals(dtConfig.Rows[13][1].ToString())) //到达分配点地标
  1456. {
  1457. PLCSql.PLCMESSelect(info.AGVNUM.ToString(), "2", ref Agvinfo); //查询数据
  1458. ProductType = Agvinfo.ProductType;
  1459. Test = Agvinfo.ProductType;
  1460. WriteFile("65判断放行记录-" + DateTime.Now.ToString("yyyy-MM-dd"), "小车放行记录3:" + info.AGVNUM + ",地标:" + info.MARKNUM + ",ProductType" + Test + ",放行路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur + "dtConfig.Rows[13][1].ToString()" + dtConfig.Rows[13][1].ToString());
  1461. if (!string.IsNullOrEmpty(ProductType) && ProductType.Length > 3)
  1462. {
  1463. for (int i1 = 0; i1 < ProductTypeDt.Rows.Count; i1++) //循环表
  1464. {
  1465. string route = "";
  1466. List<string> list1 = new List<string>();
  1467. if (ProductTypeDt.Rows[i1][0] != null)
  1468. {
  1469. route = ProductTypeDt.Rows[i1][0].ToString().Trim();
  1470. }
  1471. list1 = ProductTypeDt.Rows[i1][1].ToString().Trim().Split(';').ToList();
  1472. foreach (string type1 in list1)
  1473. {
  1474. int length = ProductType.Length;
  1475. String Type = ProductType.Substring(length - 3);
  1476. if (Type.StartsWith(type1) && route != "")
  1477. {
  1478. DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, int.Parse(route)); //根据路线放行
  1479. flag = true;
  1480. }
  1481. }
  1482. if (flag)
  1483. {
  1484. break;
  1485. }
  1486. }
  1487. }
  1488. }
  1489. }
  1490. #endregion
  1491. // WriteFile("进站记录-" + DateTime.Now.ToString("yyyy-MM-dd"), "小车进站记录4:" + info.AGVNUM + ",地标:" + info.MARKNUM + ",ProductType" + Test + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur + "dtConfig.Rows[13][1].ToString()" + dtConfig.Rows[13][1].ToString());
  1492. for (int ii = 0; ii < BoxMarkList.Count; ii++)
  1493. {
  1494. if (BoxMarkList[ii] == (info.MARKNUM.ToString()))
  1495. {
  1496. MainWindow.ReadingStopPoint(info.MARKNUM, info.ROUTENUM);
  1497. break;
  1498. }
  1499. }
  1500. if (lineName.Contains("EOL"))
  1501. {
  1502. if (dt.Columns.Contains("下一地标") && dt.Columns.Contains("随同地标"))
  1503. {
  1504. if (query.ToList()[0]["下一地标"].ToString().Trim() != "0")
  1505. {
  1506. List<string> listCheck = query.ToList()[0]["随同地标"].ToString().Trim().Split(',').ToList();
  1507. listCheck.Add(query.ToList()[0]["下一地标"].ToString());
  1508. List<AGVInfoModel> temp3 = listModel.FindAll(o => listCheck.Contains(o.MARKNUM.ToString()) && o.ConnectStatus == true);
  1509. if (temp3.Count < 1)
  1510. {
  1511. if (info.EollFlag == true)
  1512. {
  1513. // if ((DateTime.Now - info.LastStopMarkTime).TotalSeconds <= GlobalPara.EOLCheckSecs)
  1514. {
  1515. needToNext = true;
  1516. info.EollFlag = false;
  1517. DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0, int.Parse(query.ToList()[0]["下一地标"].ToString()), 5);
  1518. WriteFile("EOL1-EOL2", "(放行地标:" + info.MARKNUM + ",放行路线:0" + ",下一地标:" + (query.ToList()[0]["下一地标"].ToString()) + ",车号:" + info.AGVNUM + ") ,开关:打开→关闭,原因:EOL1-EOL2");
  1519. }
  1520. //else
  1521. //{
  1522. // info.EollFlag = false;
  1523. // WriteFile("EOL1-EOL2", "(地标:" + info.MARKNUM + ", " + ",车号:" + info.AGVNUM + ") ,开关关闭,原因:判定时间超时");
  1524. //}
  1525. }
  1526. else
  1527. {
  1528. // WriteFile("EOL1-EOL2", "(地标:" + info.MARKNUM + ", " + ",车号:" + info.AGVNUM + ") ,开关关闭,EOL1无法前往EOL2,原因:该AGV的开关为关闭状态");
  1529. }
  1530. }
  1531. else
  1532. {
  1533. if (info.EollFlag == true)
  1534. {
  1535. info.EollFlag = false;
  1536. WriteFile("EOL1-EOL2", "(地标:" + info.MARKNUM + ", " + ",车号:" + info.AGVNUM + ") ,开关:打开→关闭,原因:下一地标或者随同地标有车");
  1537. }
  1538. }
  1539. }
  1540. }
  1541. }
  1542. //到站方法
  1543. if (!needToNext)
  1544. {
  1545. btn.Invoke(new InvokeDelegate(delegate
  1546. {
  1547. if (btn.Text.Contains("("))
  1548. {
  1549. int textIndex = btn.Text.LastIndexOf("(");
  1550. string agvnum = btn.Text.Substring(textIndex + 1).Replace(")", "");
  1551. if (agvnum != info.AGVNUM.ToString())
  1552. {
  1553. agvSame = false;
  1554. }
  1555. }
  1556. // if (btn.BackColor != Color.FromKnownColor(KnownColor.Yellow) || !agvSame)
  1557. {
  1558. if (AGVIDWithPosByCheckPos.ContainsKey(info.AGVNUM))
  1559. {
  1560. AGVIDWithPosByCheckPos.Remove(info.AGVNUM);
  1561. }
  1562. if (AGVIDWithRouteByCheckPos.ContainsKey(info.AGVNUM))
  1563. {
  1564. AGVIDWithRouteByCheckPos.Remove(info.AGVNUM);
  1565. }
  1566. if (AGVIDWithPosByCheckPosReal.ContainsKey(info.AGVNUM))
  1567. {
  1568. AGVIDWithPosByCheckPosReal.Remove(info.AGVNUM);
  1569. }
  1570. if (AGVIDWithPosByCheckPos.ContainsValue(info.MARKNUM))
  1571. {
  1572. for (int ab = AGVIDWithPosByCheckPos.Keys.Count - 1; ab >= 0; ab--)
  1573. {
  1574. if (AGVIDWithPosByCheckPos[AGVIDWithPosByCheckPos.Keys.ToList()[ab]] == info.MARKNUM)
  1575. {
  1576. AGVIDWithPosByCheckPos.Remove(AGVIDWithPosByCheckPos.Keys.ToList()[ab]);
  1577. }
  1578. }
  1579. }
  1580. recordReleaseInfo();
  1581. // result = s7.ConnectServer();
  1582. // result = DicPLCResult[s7];
  1583. // if (result != null && result.IsSuccess)
  1584. {
  1585. if (type == 1)
  1586. {
  1587. if (s7 != null)
  1588. {
  1589. OperateResult rs = s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)info.AGVNUM);
  1590. OperateResult rs2 = null;
  1591. if (info.ALARMCODE != "5")
  1592. {
  1593. rs2 = s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.StopOnStation);
  1594. }
  1595. else //在工位上时 障碍物的状态也给停站状态
  1596. {
  1597. rs2 = s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.StopOnStation);
  1598. }
  1599. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)(int.Parse(info.ALARMCODE) - 1));
  1600. }
  1601. }
  1602. // if (rs.IsSuccess && rs2.IsSuccess)
  1603. else if (type == 2)
  1604. {
  1605. //btn.BackColor = Color.Yellow;
  1606. //if (btn.Text.Contains("("))
  1607. //{
  1608. // int textIndex = btn.Text.LastIndexOf("(");
  1609. // string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  1610. // btn.Text = orignName + "\n" + "(" + info.AGVNUM + ")";
  1611. //}
  1612. //else
  1613. //{
  1614. // btn.Text = btn.Text.Replace("\n", "") + "\n" + "(" + info.AGVNUM + ")";
  1615. //}
  1616. lock (MesStations)
  1617. {
  1618. var station = MesStations.Find(o => o["Mark"].ToString() == info.MARKNUM.ToString());
  1619. if (station != null)
  1620. {
  1621. station["AGVID"] = info.AGVNUM;
  1622. station["AGVStatus"] = 3;
  1623. if (dt.Columns.Contains("目的地标"))
  1624. {
  1625. station["TargetMark"] = query.ToList()[0]["目的地标"].ToString();
  1626. }
  1627. }
  1628. }
  1629. }
  1630. {
  1631. btn.BackColor = Color.Yellow;
  1632. if (btn.Text.Contains("("))
  1633. {
  1634. int textIndex = btn.Text.LastIndexOf("(");
  1635. string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  1636. btn.Text = orignName + "\n" + "(" + info.AGVNUM + ")";
  1637. }
  1638. else
  1639. {
  1640. btn.Text = btn.Text.Replace("\n", "") + "\n" + "(" + info.AGVNUM + ")";
  1641. }
  1642. }
  1643. }
  1644. }
  1645. // else
  1646. {
  1647. //OperateResult rs = GlobalPara.s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)info.AGVNUM);
  1648. //OperateResult rs2 = null;
  1649. //if (info.ALARMCODE != "5")
  1650. //{
  1651. // rs2 = GlobalPara.s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.StopOnStation);
  1652. //}
  1653. //else //在工位上时 障碍物的状态也给停站状态
  1654. //{
  1655. // rs2 = GlobalPara.s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.StopOnStation);
  1656. //}
  1657. //GlobalPara.s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)(int.Parse(info.ALARMCODE) - 1));
  1658. }
  1659. }));
  1660. // result = s7.ConnectServer();
  1661. // result = DicPLCResult[s7];
  1662. // if (result != null && result.IsSuccess)
  1663. if (s7 != null && type == 1)
  1664. {
  1665. //if (dt.Columns.Contains("允许进入") && dt.Columns.Contains("正在进入"))
  1666. //{
  1667. // var result1 = s7.ReadBool(query.ToList()[0]["允许进入"].ToString());
  1668. // if (result1 != null && result1.IsSuccess)
  1669. // {
  1670. // s7.Write(query.ToList()[0]["正在进入"].ToString(), true);
  1671. // }
  1672. //}
  1673. string releaseAddress = query.ToList()[0]["放行DB"].ToString();
  1674. OperateResult<byte> resultRead = s7.ReadByte(releaseAddress);
  1675. //if (resultRead.IsSuccess && DBWithByteValue.Keys.Contains(releaseAddress) &&
  1676. // DBWithByteValue[releaseAddress] != resultRead.Content)
  1677. {
  1678. if (resultRead.Content == (byte)GlobalPara.DBControlValues.OKRelease)
  1679. {
  1680. {
  1681. DispatcherTool.ReleaseAgvOnStop(int.Parse(btn.Tag.ToString()),
  1682. 0, int.Parse(query.ToList()[0]["目的地标"].ToString()), 5);
  1683. lock (afterRelease)
  1684. {
  1685. string tempStr = info.AGVNUM + ",1000,64";
  1686. if (!afterRelease.Contains(tempStr))
  1687. {
  1688. afterRelease.Add(tempStr);
  1689. }
  1690. }
  1691. lock (DBWithByteValue)
  1692. {
  1693. DBWithByteValue[releaseAddress] = resultRead.Content;
  1694. }
  1695. WriteFile("工位点记录-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + btn.Tag.ToString() + ",放行路线:0" + ",目的地标:" + (query.ToList()[0]["目的地标"].ToString()) + ",车号:" + info.AGVNUM + ") ");
  1696. }
  1697. //走OK放行路线
  1698. }
  1699. else if (resultRead.Content == (byte)GlobalPara.DBControlValues.NGRelease)
  1700. {
  1701. {
  1702. DispatcherTool.ReleaseAgvOnStop(int.Parse(btn.Tag.ToString()),
  1703. int.Parse(query.ToList()[0]["NG路线"].ToString()), 0, 5);
  1704. lock (afterRelease)
  1705. {
  1706. string tempStr = info.AGVNUM + ",1000,64";
  1707. if (!afterRelease.Contains(tempStr))
  1708. {
  1709. afterRelease.Add(tempStr);
  1710. }
  1711. }
  1712. lock (DBWithByteValue)
  1713. {
  1714. DBWithByteValue[releaseAddress] = resultRead.Content;
  1715. }
  1716. WriteFile("工位点记录-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + btn.Tag.ToString() + ",放行路线:" + query.ToList()[0]["NG路线"].ToString() + ",车号:" + info.AGVNUM + ") ");
  1717. }
  1718. }
  1719. else
  1720. {
  1721. if (resultRead.Content != (byte)GlobalPara.DBControlValues.StopImmediate)
  1722. {
  1723. DBWithByteValue[releaseAddress] = resultRead.Content;
  1724. }
  1725. }
  1726. }
  1727. }
  1728. }
  1729. }
  1730. else //temp2.Count() < 0 不是停车状态
  1731. {
  1732. //停止点状态集合
  1733. List<AGVInfoModel> temp3 = temp.FindAll(o => ((o.RUNSTATUS_Cur == 0x43 && o.ALARMCODE != "5") || o.RUNSTATUS_Cur == 0x47 || (o.MARKFUN == 1 && o.ALARMINFO == "低电压停机")) && o.ConnectStatus == true && o.AGVNUM != 0);
  1734. if (temp3 != null && temp3.Count() > 0)
  1735. {
  1736. List<AGVInfoModel> infos = temp3.ToList();
  1737. infos = infos.OrderByDescending(o => o.LastModifyMarkTime).ToList();
  1738. AGVInfoModel info = infos[0];
  1739. bool agvSame = true;
  1740. btn.Invoke(new InvokeDelegate(delegate
  1741. {
  1742. if (btn.Text.Contains("("))
  1743. {
  1744. int textIndex = btn.Text.LastIndexOf("(");
  1745. string agvnum = btn.Text.Substring(textIndex + 1).Replace(")", "");
  1746. if (agvnum != info.AGVNUM.ToString())
  1747. {
  1748. agvSame = false;
  1749. }
  1750. }
  1751. // if (btn.BackColor != Color.FromKnownColor(KnownColor.Red) || !agvSame)
  1752. {
  1753. //if (AGVIDWithPosByCheckPos.ContainsKey(info.AGVNUM))
  1754. //{
  1755. // AGVIDWithPosByCheckPos.Remove(info.AGVNUM);
  1756. //}
  1757. //if (AGVIDWithRouteByCheckPos.ContainsKey(info.AGVNUM))
  1758. //{
  1759. // AGVIDWithRouteByCheckPos.Remove(info.AGVNUM);
  1760. //}
  1761. //if (AGVIDWithPosByCheckPosReal.ContainsKey(info.AGVNUM))
  1762. //{
  1763. // AGVIDWithPosByCheckPosReal.Remove(info.AGVNUM);
  1764. //}
  1765. //result = s7.ConnectServer();
  1766. // result = DicPLCResult[s7];
  1767. if (type == 1)
  1768. {
  1769. if (info.RUNSTATUS_Cur == 0x43 || info.ALARMCODE != "")
  1770. {
  1771. if (s7 != null)
  1772. {
  1773. OperateResult rs = s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)info.AGVNUM);
  1774. OperateResult rs2 = null;
  1775. if (info.ALARMCODE != "5" && info.ALARMCODE != "0" && info.ALARMCODE != "9")
  1776. {
  1777. rs2 = s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Pause);
  1778. }
  1779. else
  1780. {
  1781. rs2 = s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Running);
  1782. }
  1783. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)(int.Parse(info.ALARMCODE) - 1));
  1784. }
  1785. if (btn.BackColor != Color.FromKnownColor(KnownColor.Blue))
  1786. {
  1787. // if (rs.IsSuccess && rs2.IsSuccess)
  1788. {
  1789. btn.BackColor = Color.Red;
  1790. if (btn.Text.Contains("("))
  1791. {
  1792. int textIndex = btn.Text.LastIndexOf("(");
  1793. string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  1794. btn.Text = orignName + "\n" + "(" + info.AGVNUM + ")";
  1795. }
  1796. else
  1797. {
  1798. btn.Text = btn.Text.Replace("\n", "") + "\n" + "(" + info.AGVNUM + ")";
  1799. }
  1800. }
  1801. }
  1802. }
  1803. }
  1804. else if (type == 2)
  1805. {
  1806. //btn.BackColor = Color.Red;
  1807. //if (btn.Text.Contains("("))
  1808. //{
  1809. // int textIndex = btn.Text.LastIndexOf("(");
  1810. // string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  1811. // btn.Text = orignName + "\n" + "(" + info.AGVNUM + ")";
  1812. //}
  1813. //else
  1814. //{
  1815. // btn.Text = btn.Text.Replace("\n", "") + "\n" + "(" + info.AGVNUM + ")";
  1816. //}
  1817. lock (MesStations)
  1818. {
  1819. var station = MesStations.Find(o => o["Mark"].ToString() == info.MARKNUM.ToString());
  1820. if (station != null)
  1821. {
  1822. station["AGVID"] = info.AGVNUM;
  1823. if (info.ALARMCODE == "2") //急停
  1824. {
  1825. station["AGVStatus"] = 4;
  1826. }
  1827. else if (info.ALARMCODE == "3") //机械防撞
  1828. {
  1829. station["AGVStatus"] = 5;
  1830. }
  1831. else if (info.ALARMCODE == "4") //驱动故障
  1832. {
  1833. station["AGVStatus"] = 6;
  1834. }
  1835. else if (info.ALARMCODE == "5")//传感器错误
  1836. {
  1837. station["AGVStatus"] = 7;
  1838. }
  1839. else if (info.ALARMCODE == "8") //脱线
  1840. {
  1841. station["AGVStatus"] = 8;
  1842. }
  1843. else
  1844. {
  1845. station["AGVStatus"] = 2; //暂停
  1846. }
  1847. }
  1848. }
  1849. }
  1850. }
  1851. // else
  1852. {
  1853. //OperateResult rs = GlobalPara.s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)info.AGVNUM);
  1854. //OperateResult rs2 = null;
  1855. //if (info.ALARMCODE != "5" && info.ALARMCODE != "0" && info.ALARMCODE != "9")
  1856. //{
  1857. // rs2 = GlobalPara.s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Pause);
  1858. //}
  1859. //else
  1860. //{
  1861. // rs2 = GlobalPara.s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Running);
  1862. //}
  1863. //GlobalPara.s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)(int.Parse(info.ALARMCODE) - 1));
  1864. }
  1865. }));
  1866. if (info.RUNSTATUS_Cur == 0x43 || info.ALARMCODE == "1")
  1867. {
  1868. if (info.AllowReleaseFlag == false)
  1869. {
  1870. #region MES 急停上报
  1871. StationInfo info1 = new StationInfo();
  1872. info1.Mark = info.MARKNUM.ToString();
  1873. info1.AGVNum = info.AGVNUM;
  1874. info1.StationName = "ZBPL03_00R";
  1875. string address = "/AgvInfo/AgvOut";
  1876. PostPelletIdStatus3(info1, address);
  1877. info.AllowReleaseFlag = true;
  1878. #endregion
  1879. WriteFile("MES工位点记录-" + DateTime.Now.ToString("yyyy-MM-dd"), "小车急停记录:" + info.AGVNUM + ",地标:" + info1.Mark + "车号:" + info.AGVNUM + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur);
  1880. }
  1881. //result = s7.ConnectServer();
  1882. // result = DicPLCResult[s7];
  1883. // if (result != null && result.IsSuccess)
  1884. if (s7 != null && type == 1)
  1885. {
  1886. string releaseAddress = query.ToList()[0]["放行DB"].ToString();
  1887. OperateResult<byte> resultRead = s7.ReadByte(releaseAddress);
  1888. // if (resultRead.IsSuccess && DBWithByteValue.Keys.Contains(releaseAddress) &&
  1889. // DBWithByteValue[releaseAddress] != resultRead.Content)
  1890. {
  1891. if (resultRead.Content == (byte)GlobalPara.DBControlValues.StopRelease)
  1892. {
  1893. lock (DBWithByteValue)
  1894. {
  1895. DBWithByteValue[releaseAddress] = resultRead.Content;
  1896. }
  1897. DispatcherTool.ControlAGVBy1071(info.AGVNUM, 0);
  1898. //放行被暂停的车
  1899. WriteFile("急停记录", btn.Text + "工位被放行,已生成消息,当前放行地标:" + btn.Tag.ToString() + ",车号为:" + info.AGVNUM);
  1900. }
  1901. else if (resultRead.Content == (byte)GlobalPara.DBControlValues.OKRelease)
  1902. {
  1903. lock (DBWithByteValue)
  1904. {
  1905. DBWithByteValue[releaseAddress] = resultRead.Content;
  1906. }
  1907. DispatcherTool.ReleaseAgvOnStop(int.Parse(btn.Tag.ToString()), int.Parse(query.ToList()[0]["放行路线"].ToString()));
  1908. //放行被暂停的车
  1909. WriteFile("工位点记录" + DateTime.Now.ToString("yyyy-MM-dd"), btn.Text + "工位被放行,已生成消息,当前放行地标:" + btn.Tag.ToString() + ",车号为:" + info.AGVNUM);
  1910. }
  1911. else
  1912. {
  1913. DBWithByteValue[releaseAddress] = resultRead.Content;
  1914. }
  1915. }
  1916. }
  1917. }
  1918. }
  1919. else //temp3.Count() < 0 不是停止点
  1920. {
  1921. //运行集合
  1922. List<AGVInfoModel> temp4 = temp.FindAll(o => (o.RUNSTATUS_Cur == 0x40 || (o.RUNSTATUS_Cur == 0x41 && o.ALARMCODE == "5")) && o.ConnectStatus == true && o.AGVNUM != 0);
  1923. if (temp4 != null && temp4.Count() > 0)
  1924. {
  1925. List<AGVInfoModel> infos = temp4.ToList();
  1926. infos = infos.OrderByDescending(o => o.LastModifyMarkTime).ToList();
  1927. AGVInfoModel info = infos[0];
  1928. bool agvSame = true;
  1929. info.IsReachFlag = false; //运行就解除
  1930. info.AllowMesReleaseFlag = false; //放行锁住
  1931. #region MES 离港上报
  1932. StationInfo info1 = new StationInfo();
  1933. info1.Mark = info.MARKNUM.ToString();
  1934. foreach (DataRow dr in GlobalPara.dtSKQPLCs.Rows)
  1935. {
  1936. if (dr["工位地标"].ToString() == info.MARKNUM.ToString() && GlobalPara.ReleaseMarkList.Contains(info.MARKNUM.ToString())) //
  1937. {
  1938. info1.StationName = dr["工位名称"].ToString();
  1939. if (info.MARKNUM == 63)
  1940. {
  1941. MainWindow.ReleaseStopPoint(36, 0);
  1942. }
  1943. else
  1944. {
  1945. MainWindow.ReleaseStopPoint(info.MARKNUM, 0);
  1946. }
  1947. GlobalPara.ReleaseMarkList.Remove(info.MARKNUM.ToString());
  1948. WriteFile("点灭放行盒记录" + DateTime.Now.ToString("yyyy-MM-dd"), btn.Text + "工位点灭2222,当前放行地标:" + btn.Tag.ToString() + ",车号为:" + info.AGVNUM);
  1949. break;
  1950. }
  1951. }
  1952. if (info.IsOutFlag == false && info.MARKNUM != 65)
  1953. {
  1954. string address = "/AgvInfo/AgvOut";
  1955. PostPelletIdStatus1(info1, address);
  1956. info.IsOutFlag = true;
  1957. }
  1958. #endregion
  1959. //foreach (string mark in GlobalPara.ReleaseMarkList)
  1960. //{
  1961. // if (info.MARKNUM.ToString().Equals(mark))
  1962. // {
  1963. // MainWindow.ReleaseStopPoint(int.Parse(mark), 0);
  1964. // GlobalPara.ReleaseMarkList.Remove(mark);
  1965. // WriteFile("点灭放行盒记录" + DateTime.Now.ToString("yyyy-MM-dd"), btn.Text + "工位点灭2222,当前放行地标:" + btn.Tag.ToString() + ",车号为:" + info.AGVNUM);
  1966. // }
  1967. //}
  1968. for (int i2 = 0; i2 < BoxMarkList.Count; i2++)
  1969. {
  1970. if (BoxMarkList[i2] == (info.MARKNUM.ToString()))
  1971. {
  1972. MainWindow.ReleaseStopPoint(info.MARKNUM, info.ROUTENUM);
  1973. break;
  1974. }
  1975. }
  1976. // GlobalPara.ReleaseMarkList.Add(Mark);
  1977. btn.Invoke(new InvokeDelegate(delegate
  1978. {
  1979. if (btn.Text.Contains("("))
  1980. {
  1981. int textIndex = btn.Text.LastIndexOf("(");
  1982. string agvnum = btn.Text.Substring(textIndex + 1).Replace(")", "");
  1983. if (agvnum != info.AGVNUM.ToString())
  1984. {
  1985. agvSame = false;
  1986. }
  1987. }
  1988. // if (( info.AGVRunningCount > 1) || !agvSame || (info.RUNSTATUS_Cur == 0x43 && info.ALARMCODE == "5"))
  1989. {
  1990. //if (AGVIDWithPosByCheckPos.ContainsKey(info.AGVNUM))
  1991. //{
  1992. // AGVIDWithPosByCheckPos.Remove(info.AGVNUM);
  1993. //}
  1994. //if (AGVIDWithRouteByCheckPos.ContainsKey(info.AGVNUM))
  1995. //{
  1996. // AGVIDWithRouteByCheckPos.Remove(info.AGVNUM);
  1997. //}
  1998. //if (AGVIDWithPosByCheckPosReal.ContainsKey(info.AGVNUM))
  1999. //{
  2000. // AGVIDWithPosByCheckPosReal.Remove(info.AGVNUM);
  2001. //}
  2002. // if (info.AGVNUM != 0)
  2003. //{
  2004. //result = s7.ConnectServer();
  2005. // result = DicPLCResult[s7];
  2006. // if (result != null && result.IsSuccess)
  2007. if (type == 1)
  2008. {
  2009. if (s7 != null)
  2010. {
  2011. OperateResult rs = s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)info.AGVNUM);
  2012. OperateResult rs2 = null;
  2013. rs2 = s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Running);
  2014. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)(int.Parse(info.ALARMCODE) - 1));
  2015. }
  2016. //}
  2017. }
  2018. else if (type == 2)
  2019. {
  2020. lock (MesStations)
  2021. {
  2022. var station = MesStations.Find(o => o["Mark"].ToString() == info.MARKNUM.ToString());
  2023. if (station != null)
  2024. {
  2025. station["AGVID"] = info.AGVNUM;
  2026. station["AGVStatus"] = 1;
  2027. }
  2028. }
  2029. }
  2030. if (btn.BackColor != Color.FromKnownColor(KnownColor.Blue))
  2031. {
  2032. // if (rs.IsSuccess && rs2.IsSuccess)
  2033. {
  2034. btn.BackColor = Color.Green;
  2035. if (btn.Text.Contains("("))
  2036. {
  2037. int textIndex = btn.Text.LastIndexOf("(");
  2038. string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  2039. btn.Text = orignName + "\n" + "(" + info.AGVNUM + ")";
  2040. }
  2041. else
  2042. {
  2043. btn.Text = btn.Text.Replace("\n", "") + "\n" + "(" + info.AGVNUM + ")";
  2044. }
  2045. }
  2046. }
  2047. }
  2048. // else
  2049. {
  2050. //OperateResult rs = GlobalPara.s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)info.AGVNUM);
  2051. //OperateResult rs2 = null;
  2052. //rs2 = GlobalPara.s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Running);
  2053. //GlobalPara.s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)(int.Parse(info.ALARMCODE) - 1));
  2054. }
  2055. if (query.ToList()[0]["放行DB"].ToString() == "DB200.2")
  2056. {
  2057. // MessageBox.Show(info.AGVNUM.ToString() + ":" + info.RUNSTATUS_Cur.ToString());
  2058. }
  2059. if (info.RUNSTATUS_Cur == 0x40 || info.ALARMCODE == "1")
  2060. {
  2061. //result = s7.ConnectServer();
  2062. // result = DicPLCResult[s7];
  2063. // if (result != null && result.IsSuccess)
  2064. if (s7 != null)
  2065. {
  2066. string releaseAddress = query.ToList()[0]["放行DB"].ToString();
  2067. OperateResult<byte> resultRead = s7.ReadByte(releaseAddress);
  2068. // if (resultRead.IsSuccess && DBWithByteValue.Keys.Contains(releaseAddress) &&
  2069. // DBWithByteValue[releaseAddress] != resultRead.Content)
  2070. {
  2071. if (resultRead.Content == (byte)GlobalPara.DBControlValues.StopImmediate)
  2072. {
  2073. lock (DBWithByteValue)
  2074. {
  2075. DBWithByteValue[releaseAddress] = resultRead.Content;
  2076. }
  2077. DispatcherTool.ControlAGVBy1071(info.AGVNUM, 1);
  2078. //立刻暂停行驶中的车
  2079. WriteFile("急停记录", btn.Text + "工位被暂停,已生成消息,当前急停地标:" + btn.Tag.ToString() + ",车号为:" + info.AGVNUM);
  2080. }
  2081. else
  2082. {
  2083. lock (DBWithByteValue)
  2084. {
  2085. DBWithByteValue[releaseAddress] = (byte)resultRead.Content;
  2086. }
  2087. }
  2088. }
  2089. }
  2090. }
  2091. }));
  2092. }
  2093. else //temp4.Count() < 0
  2094. {
  2095. btn.Invoke(new InvokeDelegate(delegate
  2096. {
  2097. if (tag >= 1)
  2098. {
  2099. if (AGVIDWithPosByCheckPos.ContainsValue(int.Parse(query.ToList()[0]["工位地标"].ToString())))
  2100. {
  2101. List<int> keys = AGVIDWithPosByCheckPos.Keys.ToList();
  2102. for (int a = 0; a < keys.Count; a++)
  2103. {
  2104. if (AGVIDWithPosByCheckPos[keys[a]] == int.Parse(query.ToList()[0]["工位地标"].ToString()))
  2105. {
  2106. // btn.Text = query.ToList()[0]["工位名称"].ToString() + "\n(" + keys[a] + ")";
  2107. // btn.BackColor = Color.Blue;
  2108. break;
  2109. }
  2110. }
  2111. }
  2112. else
  2113. {
  2114. if (btn.BackColor != Color.Blue && btn.BackColor != Color.FromKnownColor(KnownColor.Control))
  2115. {
  2116. if (s7 != null)
  2117. {
  2118. OperateResult rs = s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)0);
  2119. OperateResult rs2 =
  2120. s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Unknow);
  2121. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)0);
  2122. }
  2123. if (btn.BackColor != Color.FromKnownColor(KnownColor.Blue))
  2124. {
  2125. // if (rs.IsSuccess && rs2.IsSuccess)
  2126. {
  2127. btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  2128. if (btn.Text.Contains("("))
  2129. {
  2130. int textIndex = btn.Text.LastIndexOf("(");
  2131. string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  2132. btn.Text = orignName;
  2133. }
  2134. }
  2135. }
  2136. }
  2137. }
  2138. }
  2139. else if (tag == 0)
  2140. {
  2141. //result = s7.ConnectServer();
  2142. //result = DicPLCResult[s7];
  2143. //if (result != null && result.IsSuccess)
  2144. if (btn.BackColor != Color.FromKnownColor(KnownColor.Blue) && (btn.BackColor != Color.FromKnownColor(KnownColor.Control)))
  2145. {
  2146. btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  2147. if (s7 != null)
  2148. {
  2149. s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)0);
  2150. s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Unknow);
  2151. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)0);
  2152. }
  2153. }
  2154. if (AGVIDWithPosByCheckPos.ContainsValue(int.Parse(query.ToList()[0]["工位地标"].ToString())))
  2155. {
  2156. List<int> keys = AGVIDWithPosByCheckPos.Keys.ToList();
  2157. for (int a = 0; a < keys.Count; a++)
  2158. {
  2159. if (AGVIDWithPosByCheckPos[keys[a]] == int.Parse(query.ToList()[0]["工位地标"].ToString()))
  2160. {
  2161. // btn.Text = query.ToList()[0]["工位名称"].ToString() + "\n(" + keys[a] + ")";
  2162. // btn.BackColor = Color.Blue;
  2163. break;
  2164. }
  2165. }
  2166. }
  2167. }
  2168. }));
  2169. //result = s7.ConnectServer();
  2170. // result = DicPLCResult[s7];
  2171. // if (result != null && result.IsSuccess)
  2172. {
  2173. //string releaseAddress = query.ToList()[0]["放行DB"].ToString();
  2174. //OperateResult<byte> resultRead = s7.ReadByte(releaseAddress);
  2175. ////if (resultRead.IsSuccess && DBWithByteValue.Keys.Contains(releaseAddress) &&
  2176. //// DBWithByteValue[releaseAddress] != resultRead.Content)
  2177. //{
  2178. // {
  2179. // if (resultRead.Content != (byte)GlobalPara.DBControlValues.StopImmediate)
  2180. // {
  2181. // DBWithByteValue[releaseAddress] = resultRead.Content;
  2182. // }
  2183. // }
  2184. //}
  2185. }
  2186. }
  2187. }
  2188. }
  2189. }
  2190. else //emp.Count()< 0 不是到站集合
  2191. {
  2192. btn.Invoke(new InvokeDelegate(delegate
  2193. {
  2194. if (tag >= 1)
  2195. {
  2196. //if (btn.BackColor != Color.FromKnownColor(KnownColor.Control) &&
  2197. // btn.BackColor != Color.FromKnownColor(KnownColor.Blue))
  2198. // var rs3 = s7.ReadByte(query.ToList()[0]["AGVDB"].ToString());
  2199. // if (rs3.Content != (byte)0)
  2200. if (btn.BackColor != Color.FromKnownColor(KnownColor.Blue) && btn.BackColor != Color.FromKnownColor(KnownColor.Control))
  2201. {
  2202. btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  2203. }
  2204. if (btn.Text.Contains("("))
  2205. {
  2206. int textIndex = btn.Text.LastIndexOf("(");
  2207. string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  2208. btn.Text = orignName;
  2209. }
  2210. {
  2211. if (type == 1)
  2212. {
  2213. if (s7 != null)
  2214. {
  2215. OperateResult rs = s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)0);
  2216. OperateResult rs2 =
  2217. s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Unknow);
  2218. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)0);
  2219. }
  2220. }
  2221. else if (type == 2)
  2222. {
  2223. lock (MesStations)
  2224. {
  2225. var station = MesStations.Find(o => o["Mark"].ToString() == btn.Tag.ToString());
  2226. if (station != null)
  2227. {
  2228. station["AGVID"] = 0;
  2229. station["AGVStatus"] = 0;
  2230. }
  2231. }
  2232. }
  2233. }
  2234. }
  2235. else if (tag <= 0)
  2236. {
  2237. if (btn.BackColor != Color.FromKnownColor(KnownColor.Blue))
  2238. {
  2239. btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  2240. }
  2241. //result = s7.ConnectServer();
  2242. // result = DicPLCResult[s7];
  2243. // if (result != null && result.IsSuccess)
  2244. if (s7 != null && type == 1)
  2245. {
  2246. s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)0);
  2247. s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Unknow);
  2248. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)0);
  2249. }
  2250. if (type == 1 && AGVIDWithPosByCheckPos.ContainsValue(int.Parse(query.ToList()[0]["工位地标"].ToString())))
  2251. {
  2252. List<int> keys = AGVIDWithPosByCheckPos.Keys.ToList();
  2253. for (int a = 0; a < keys.Count; a++)
  2254. {
  2255. if (AGVIDWithPosByCheckPos[keys[a]] == int.Parse(query.ToList()[0]["工位地标"].ToString()))
  2256. {
  2257. // btn.Text = query.ToList()[0]["工位名称"].ToString() + "\n(" + keys[a] + ")";
  2258. // btn.BackColor = Color.Blue;
  2259. break;
  2260. }
  2261. }
  2262. }
  2263. }
  2264. }));
  2265. //result = s7.ConnectServer();
  2266. // result = DicPLCResult[s7];
  2267. // if (result != null && result.IsSuccess)
  2268. {
  2269. //string releaseAddress = query.ToList()[0]["放行DB"].ToString();
  2270. //OperateResult<byte> resultRead = s7.ReadByte(releaseAddress);
  2271. ////if (resultRead.IsSuccess && DBWithByteValue.Keys.Contains(releaseAddress) &&
  2272. //// DBWithByteValue[releaseAddress] != resultRead.Content)
  2273. //{
  2274. // if (resultRead.Content != (byte)GlobalPara.DBControlValues.StopImmediate)
  2275. // {
  2276. // DBWithByteValue[releaseAddress] = resultRead.Content;
  2277. // }
  2278. //}
  2279. }
  2280. }
  2281. }
  2282. }
  2283. }//);
  2284. // if (result2.IsCompleted)
  2285. {
  2286. sw2.Stop();
  2287. Console.WriteLine(dt.TableName + "任务总共花费{0}s.", sw.Elapsed.TotalSeconds);
  2288. object[] obj = new object[3];
  2289. obj[0] = listBtn; obj[1] = ++tag; obj[2] = lineName;
  2290. if (tag == 5)
  2291. {
  2292. if (!InitOK.ContainsKey(lineName))
  2293. {
  2294. InitOK.Add(lineName, true);
  2295. // tag = 1;
  2296. }
  2297. }
  2298. if (tag > 5)
  2299. {
  2300. tag = 11;
  2301. }
  2302. //Thread.Sleep(20);
  2303. //Thread t2 = new Thread(new ParameterizedThreadStart(DockingOpeare0)); t2.IsBackground = true;
  2304. //t2.Priority = ThreadPriority.Highest;
  2305. //t2.Start(obj);
  2306. // DockingOpeare(list);
  2307. }
  2308. }
  2309. }
  2310. catch (Exception ex)
  2311. {
  2312. //try
  2313. //{
  2314. // DateTime time = DateTime.Now;
  2315. // //MessageBox.Show("线程异常:"+e.ExceptionObject);
  2316. // FileStream stream = File.Open(@"Exception\调度程序异常.txt", FileMode.Append, FileAccess.Write);
  2317. // StreamWriter writer = new StreamWriter(stream);
  2318. // //if (ex != null)
  2319. // //{
  2320. // // string msg = string.Format("[{0}]Test:\r\nMessage:{1}\r\nStackTrace:\r\n{2}", time.ToString("yyyy-MM-dd HH:mm:ss"), ex.Message, ex.StackTrace);
  2321. // // writer.WriteLine(msg);
  2322. // // writer.Close();
  2323. // // stream.Close();
  2324. // //}
  2325. // bb = true;
  2326. //}
  2327. //catch (Exception)
  2328. //{
  2329. //}
  2330. //object[] obj = new object[3];
  2331. //obj[0] = listBtn; obj[1] = 0; obj[2] = lineName;
  2332. //Thread.Sleep(500);
  2333. //new Thread(new ParameterizedThreadStart(DockingOpeare0)).Start(obj);
  2334. }
  2335. finally
  2336. {
  2337. //if (bb)
  2338. //{
  2339. // object[] obj = new object[3];
  2340. // obj[0] = listBtn; obj[1] = 0; obj[2] = lineName;
  2341. // Thread.Sleep(500);
  2342. // Thread t2 = new Thread(new ParameterizedThreadStart(DockingOpeare0)); t2.IsBackground = true;
  2343. // t2.Priority = ThreadPriority.Highest;
  2344. // t2.Start(obj);
  2345. // // WriteFile("线程重启", "DockingOpeare0报错,已重启!");
  2346. //}
  2347. if (!DockingOK)// && InitOK.Count == LineDt.Rows.Count)
  2348. {
  2349. DockingOK = true;
  2350. Thread t2 = new Thread(new ThreadStart(checkingOperate)); t2.IsBackground = true;
  2351. t2.Priority = ThreadPriority.BelowNormal;
  2352. t2.Start();
  2353. Thread t3 = new Thread(new ThreadStart(TrafficByDispatch)); t3.IsBackground = true;
  2354. t3.Priority = ThreadPriority.AboveNormal;
  2355. t3.Start();
  2356. //Thread t4 = new Thread(new ThreadStart(ReleaseBoxLight)); t4.IsBackground = true;
  2357. //t4.Priority = ThreadPriority.AboveNormal;
  2358. //t4.Start();
  2359. }
  2360. }
  2361. Thread.Sleep(500);
  2362. }
  2363. }
  2364. /// <summary>
  2365. /// 下线上传方法
  2366. /// </summary>
  2367. /// <param name="agvNum"></param>
  2368. public void AGVDownMethod(StationInfo infos)
  2369. {
  2370. string url = "http://10.197.244.100:10057/AgvInfo/AgvBindMes";
  2371. AGVInfo info = new AGVInfo();
  2372. PLCSql.PLCMESSelect(infos.AGVNum.ToString(), "2", ref info); //查询数据
  2373. info.Time = DateTime.Now;
  2374. info.Behavior = 2;
  2375. bool res = WcsApi.Post(url, null, info, out string data, out string msg);
  2376. string str = $"下线上报:{res},信息:{msg},数据:{data}";
  2377. if (!string.IsNullOrEmpty(info.ProductType))
  2378. {
  2379. PLCSql.PLCSqlMES(infos.AGVNum.ToString(), "", "", "", "3"); //解绑
  2380. }
  2381. if (GlobalPara.AgvInfoDic.ContainsKey(infos.AGVNum))
  2382. {
  2383. var agv = GlobalPara.AgvInfoDic.FirstOrDefault(o => o.Key == infos.AGVNum).Value;
  2384. OutTraffic(agv);
  2385. }
  2386. string Responses = $"当前下线AGV信息:工站名={info.stationName},mark ={infos.Mark}, AGVID = {info.AgvCode},ProductCode = {info.ProductCode},HolderBarCode = {info.HolderBarCode},ProductType = {info.ProductType},返回时间 = {DateTime.Now.ToString()}";//,产品个数 = {products.Count}
  2387. WriteFile("下线上报-" + DateTime.Now.ToString("yyyy-MM-dd"), Responses);
  2388. }
  2389. public void OutTraffic(AGVInfoModel agv)
  2390. {
  2391. if (agv.TRAFFICNUM.Count > 0)
  2392. {
  2393. List<TrafficAreaModel> templist = new List<TrafficAreaModel>();
  2394. templist.AddRange(agv.TRAFFICNUM);
  2395. foreach (TrafficAreaModel traffic in templist)
  2396. {
  2397. //踢出管制区
  2398. //tt.OutTraffic(agv);
  2399. int a1 = agv.ReleaseCount;
  2400. traffic.AGVLEAVE(agv);//管制区有AGV离开
  2401. int a = agv.ReleaseCount;
  2402. if (traffic.listAgvQueue.Count > 0)
  2403. {
  2404. traffic.ReleaseAgv(); //调用放行事件
  2405. }
  2406. agv.TRAFFICNUM.Remove(traffic);//清空之前,先做一些处理。让AGV退出的那些管制区解除管制状态。
  2407. string astr = string.Format("管制状态{0}--{1}", agv.TrafficFlag, agv.ReleaseCount);
  2408. }
  2409. }
  2410. }
  2411. public void ReleaseBoxLight()
  2412. {
  2413. try
  2414. {
  2415. while (true)
  2416. {
  2417. for (int i = 0; i < GlobalPara.dtSKQPLCs.Rows.Count; i++)
  2418. {
  2419. DataRow dr = (DataRow)GlobalPara.dtSKQPLCs.Rows[i];
  2420. string mark = dr["工位地标"].ToString();
  2421. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  2422. var results = listModel.Find(o => o.MARKNUM.ToString() == mark && o.ConnectStatus == true && (o.RUNSTATUS_Cur == 0x40)); //工位运行就发
  2423. if (results != null)
  2424. {
  2425. MainWindow.ReleaseStopPoint(int.Parse(mark), 0); //点灭放行盒
  2426. if (GlobalPara.ReleaseMarkList.Contains(mark))
  2427. {
  2428. GlobalPara.ReleaseMarkList.Remove(mark);
  2429. }
  2430. WriteFile("点灭放行盒记录" + DateTime.Now.ToString("yyyy-MM-dd"), "ReleaseBoxLight点灭放行盒,当前放行地标:" + results.MARKNUM + ",车号为:" + results.AGVNUM);
  2431. }
  2432. Thread.Sleep(500);
  2433. }
  2434. }
  2435. }
  2436. //}
  2437. catch (Exception ex)
  2438. {
  2439. WriteFile("调度程序异常" + DateTime.Now.ToString("yyyy-MM-dd"), "ReleaseBoxLight点灭放行盒失败" + ex.Message);
  2440. }
  2441. }
  2442. public void PostPelletIdStatus1(StationInfo infos, string ApiAdress)
  2443. {
  2444. string address = "http://10.197.244.100:10057";
  2445. string url = address + ApiAdress;
  2446. string id = DateTime.Now.ToString("yyyyMMddhhmmssffff");
  2447. string s = $"123 {id}";
  2448. AGVInfo info = GetStationInfo1(infos.Mark);
  2449. if (info.AgvCode != 0)
  2450. {
  2451. info.stationName = infos.StationName;
  2452. info.Time = DateTime.Now;
  2453. bool res = WcsApi.Post(url, null, info, out string data, out string msg);
  2454. string str = $"离港上报:{res},信息:{msg},数据:{data}";
  2455. string Responses = $"离港AGV信息:工站名={info.stationName},mark ={infos.Mark}, AGVID = {info.AgvCode},ProductCode = {info.ProductCode},HolderBarCode = {info.HolderBarCode},ProductType = {info.ProductType},返回时间 = {DateTime.Now.ToString()}";//,产品个数 = {products.Count}
  2456. WriteFile("离港上报-" + DateTime.Now.ToString("yyyy-MM-dd"), Responses);
  2457. WriteFile("MES工位点记录-" + DateTime.Now.ToString("yyyy-MM-dd"), Responses + str);
  2458. }
  2459. }
  2460. public AGVInfo GetStationInfo1(string statiom)
  2461. {
  2462. AGVInfo Agvinfo = new AGVInfo();
  2463. try
  2464. {
  2465. {
  2466. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  2467. List<AGVInfoModel> temp4 = listModel.FindAll(o => (o.MARKNUM.ToString() == statiom && o.ConnectStatus == true && o.AGVNUM != 0));
  2468. if (temp4 != null && temp4.Count() > 0)
  2469. {
  2470. List<AGVInfoModel> infos = temp4.ToList();
  2471. infos = infos.OrderByDescending(o => o.LastModifyMarkTime).ToList();
  2472. AGVInfoModel info = infos[0];
  2473. if (info != null) //&& info.IsOutFlag
  2474. {
  2475. PLCSql.PLCMESSelect(info.AGVNUM.ToString(), "2", ref Agvinfo);
  2476. }
  2477. }
  2478. }
  2479. }
  2480. catch (Exception ex)
  2481. {
  2482. }
  2483. return Agvinfo;
  2484. }
  2485. void WriteFile(string fileName, string context)
  2486. {
  2487. try
  2488. {
  2489. lock (portLock)
  2490. {
  2491. DateTime time = DateTime.Now;
  2492. //MessageBox.Show("线程异常:"+e.ExceptionObject);
  2493. FileStream stream = File.Open(@"Exception\" + fileName + ".txt", FileMode.Append, FileAccess.Write);
  2494. StreamWriter writer = new StreamWriter(stream);
  2495. {
  2496. string msg = string.Format("[{0}]Test:\r\nMessage:{1}\r\n", time.ToString("yyyy-MM-dd HH:mm:ss"), context);
  2497. writer.WriteLine(msg);
  2498. writer.Close();
  2499. stream.Close();
  2500. }
  2501. }
  2502. }
  2503. catch (Exception)
  2504. {
  2505. }
  2506. }
  2507. void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
  2508. {
  2509. Graphics g = e.Graphics;
  2510. Font font = new Font("微软雅黑", 16f, System.Drawing.GraphicsUnit.Pixel);
  2511. SolidBrush brush = new SolidBrush(Color.Black);
  2512. if (e.Index == this.tabControl1.SelectedIndex)
  2513. {
  2514. brush = new SolidBrush(Color.Blue);
  2515. }
  2516. RectangleF rectangle = (RectangleF)(tabControl1.GetTabRect(e.Index));
  2517. RectangleF rectangle2 = new RectangleF(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
  2518. g.FillRectangle(new SolidBrush(SystemColors.ButtonHighlight), rectangle2);
  2519. StringFormat sformat = new StringFormat();
  2520. sformat.LineAlignment = StringAlignment.Center;
  2521. sformat.Alignment = StringAlignment.Center;
  2522. g.DrawString(((TabControl)sender).TabPages[e.Index].Text, font, brush, rectangle2, sformat);
  2523. }
  2524. /// <summary>
  2525. /// 获取心跳包
  2526. /// </summary>
  2527. private void PLCHeartBit()
  2528. {
  2529. while (!isChoseMat)
  2530. {
  2531. List<SiemensS7Net> list = DicPLC.Values.ToList();
  2532. foreach (SiemensS7Net s7 in list)
  2533. {
  2534. if (!string.IsNullOrEmpty(heartBitList2[list.IndexOf(s7)]))
  2535. {
  2536. PLCResult = s7.ReadByte(dtConfig.Rows[4][1].ToString()); //PLC心跳记录
  2537. if (PLCResult != null && PLCResult.IsSuccess)
  2538. {
  2539. // OperateResult<byte> tempResult = GlobalPara.s7.ReadByte(dtConfig.Rows[1][4].ToString());
  2540. if (PLCResult != null && PLCResult.IsSuccess)
  2541. {
  2542. if (PLCResult.Content != PLCHeartBitCount)
  2543. {
  2544. //result = s7.ConnectServer();
  2545. result = DicPLCResult[s7];
  2546. PLCHeartBitCount = PLCResult.Content;
  2547. HeartBitFlag = true;
  2548. if (IsPLCChangeOff)
  2549. {
  2550. //重新给PLC工位信息,只写不读
  2551. Dictionary<Thread, object[]> listThread = new Dictionary<Thread, object[]>();
  2552. for (int i = 0; i < tabControl1.TabPages.Count; i++)
  2553. {
  2554. // object[] obj = new object[3];
  2555. //obj[0] = (tabControl1.TabPages[i].Tag as TabPageTag).ListBtn; obj[1] = 0; obj[2] = tabControl1.TabPages[i].Text;
  2556. // listThread.Add(new Thread(new ParameterizedThreadStart(DockingOpeareForPLCReOpen)), obj);
  2557. }
  2558. //foreach (Thread t in listThread.Keys)
  2559. //{
  2560. // t.IsBackground = true;
  2561. // t.Priority = ThreadPriority.Highest;
  2562. // t.Start(listThread[t]);
  2563. //}
  2564. IsPLCChangeOff = false;
  2565. }
  2566. }
  2567. else
  2568. {
  2569. lock (DicPLCResult)
  2570. {
  2571. DicPLCResult[s7] = s7.ConnectServer();
  2572. }
  2573. // HeartBitFlag = false;
  2574. IsPLCChangeOff = true;
  2575. }
  2576. }
  2577. }
  2578. else
  2579. {
  2580. lock (DicPLCResult)
  2581. {
  2582. DicPLCResult[s7] = s7.ConnectServer();
  2583. }
  2584. // HeartBitFlag = false;
  2585. IsPLCChangeOff = true;
  2586. }
  2587. }
  2588. Thread.Sleep(2000);
  2589. }
  2590. }
  2591. }
  2592. /// <summary>
  2593. /// 发送心跳包
  2594. /// </summary>
  2595. private void HeartBit()
  2596. {
  2597. try
  2598. {
  2599. while (!isChoseMat)
  2600. {
  2601. if (HeartBitFlag)
  2602. {
  2603. //更新心跳包
  2604. List<SiemensS7Net> list = DicPLC.Values.ToList();
  2605. for (int i = 0; i < list.Count; i++)
  2606. {
  2607. SiemensS7Net s7 = list[i];
  2608. if (s7 == null) { continue; }
  2609. OperateResult result = null;
  2610. if (DicPLCResult.ContainsKey(s7))
  2611. {
  2612. result = DicPLCResult[s7];
  2613. }
  2614. if (result == null || !result.IsSuccess)
  2615. {
  2616. if (s7 != null)
  2617. {
  2618. lock (DicPLCResult)
  2619. {
  2620. DicPLCResult[s7] = result = s7.ConnectServer();
  2621. }
  2622. }
  2623. if (result == null || !result.IsSuccess)
  2624. {
  2625. //statusStrip1.Invoke(new InvokeDelegate(delegate
  2626. //{
  2627. // if (i == 0)
  2628. // {
  2629. // toolStripStatusLabel1.Text = s7.IpAddress + "," + " " + "PLC连接失败";
  2630. // }
  2631. // else
  2632. // {
  2633. // toolStripStatusLabel1.Text += ";" + s7.IpAddress + "," + " " + "PLC连接失败";
  2634. // }
  2635. //}));
  2636. }
  2637. else
  2638. {
  2639. // this.Invoke(new InvokeDelegate(delegate
  2640. // {
  2641. // if (i == 0)
  2642. // {
  2643. // toolStripStatusLabel1.Text = s7.IpAddress + "," + " " + "PLC连接成功";
  2644. // }
  2645. // else
  2646. // {
  2647. // toolStripStatusLabel1.Text += ";"+s7.IpAddress + "," + " " + "PLC连接成功";
  2648. // }
  2649. // }
  2650. //));
  2651. }
  2652. }
  2653. else
  2654. {
  2655. if (result != null && result.IsSuccess)
  2656. {
  2657. var tempResult = s7.Write(heartBitList[i], (byte)HeartBitCount);
  2658. if (tempResult.IsSuccess)
  2659. {
  2660. if (i == list.Count - 1)
  2661. {
  2662. HeartBitCount++;
  2663. }
  2664. if (HeartBitCount > 0xFF)
  2665. {
  2666. HeartBitCount = 1;
  2667. }
  2668. //statusStrip1.Invoke(new InvokeDelegate(delegate
  2669. //{
  2670. // if (i == 0)
  2671. // {
  2672. // toolStripStatusLabel1.Text = s7.IpAddress + "," + " " + "PLC连接成功";
  2673. // }
  2674. // else
  2675. // {
  2676. // toolStripStatusLabel1.Text += ";"+s7.IpAddress + "," + " " + "PLC连接成功";
  2677. // }
  2678. //}
  2679. //));
  2680. }
  2681. else
  2682. {
  2683. // this.Invoke(new InvokeDelegate(delegate
  2684. //{
  2685. // if (i == 0)
  2686. // {
  2687. // toolStripStatusLabel1.Text = s7.IpAddress + "," + " " + "PLC连接失败";
  2688. // }
  2689. // else
  2690. // {
  2691. // toolStripStatusLabel1.Text += ";" + s7.IpAddress + "," + " " + "PLC连接失败";
  2692. // }
  2693. //}
  2694. //));
  2695. }
  2696. }
  2697. }
  2698. }
  2699. for (int i = 0; i < list.Count; i++)
  2700. {
  2701. this.Invoke(new InvokeDelegate(delegate
  2702. {
  2703. if (i == 0)
  2704. {
  2705. toolStripStatusLabel1.Text = list[i].IpAddress + "," + " " + "PLC连接" + (DicPLCResult[list[i]].IsSuccess ? "成功" : "失败");
  2706. }
  2707. else
  2708. {
  2709. toolStripStatusLabel1.Text += ";" + list[i].IpAddress + "," + " " + "PLC连接" + (DicPLCResult[list[i]].IsSuccess ? "成功" : "失败");
  2710. }
  2711. if ((DicPLCResult[list[i]].IsSuccess))
  2712. {
  2713. PLCTestAlarm = false;
  2714. }
  2715. else
  2716. {
  2717. PLCTestAlarm = true;
  2718. }
  2719. }
  2720. ));
  2721. }
  2722. Thread.Sleep(500);
  2723. }
  2724. }
  2725. }
  2726. catch (Exception)
  2727. {
  2728. }
  2729. }
  2730. public void DockingOpeareForPLCReOpen(object o)
  2731. {
  2732. object[] obj = (object[])o;
  2733. DockingOpeareForPLCReOpen((List<Button>)obj[0], (int)obj[1], (string)obj[2]);
  2734. }
  2735. /// <summary>
  2736. /// 工位事件
  2737. /// </summary>
  2738. /// <param name="listBtn"></param>
  2739. public void DockingOpeareForPLCReOpen(List<Button> listBtn, int tag, string lineName)
  2740. {
  2741. if (isChoseMat) { return; }
  2742. ParallelLoopResult result2;
  2743. bool bb = false;
  2744. try
  2745. {
  2746. Stopwatch sw2 = new Stopwatch();
  2747. List<Button> list = (List<Button>)listBtn;
  2748. // TabPageTag tag = this.tabControl1.TabPages[i].Tag as TabPageTag;
  2749. DataTable dt = (list[0].Parent.Tag as TabPageTag).Table;
  2750. SiemensS7Net s7 = (list[0].Parent.Tag as TabPageTag).S7;
  2751. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  2752. List<int> list2 = AGVIDWithPosByCheckPos.Values.ToList();
  2753. {
  2754. // for (int i = 0; i < list.Count; i++)
  2755. result2 = Parallel.ForEach<Button>(list, new ParallelOptions { MaxDegreeOfParallelism = 1 }, btn =>
  2756. {
  2757. {
  2758. {
  2759. IEnumerable<AGVInfoModel> temp = listModel.Where(o => o.MARKNUM.ToString() == btn.Tag.ToString() && o.ConnectStatus == true);
  2760. IEnumerable<DataRow> query =
  2761. from order in dt.AsEnumerable()
  2762. where order["工位地标"].ToString() == btn.Tag.ToString()
  2763. select order;
  2764. if (temp.Count() > 0)
  2765. {
  2766. IEnumerable<AGVInfoModel> temp2 = temp.Where(o => ((o.RUNSTATUS_Cur == 0x41 || o.RUNSTATUS_Cur == 0x44 || o.RUNSTATUS_Cur == 0x46 || (o.MARKFUN == 1 && o.ALARMINFO == "低电压报警"))
  2767. && o.ConnectStatus == true && o.AGVNUM != 0));
  2768. if (temp2.Count() > 0)
  2769. {
  2770. List<AGVInfoModel> infos = temp2.ToList();
  2771. AGVInfoModel info = infos[0];
  2772. btn.Invoke(new InvokeDelegate(delegate
  2773. {
  2774. // if (btn.BackColor != Color.FromKnownColor(KnownColor.Yellow))
  2775. {
  2776. if (AGVIDWithRouteByCheckPos.ContainsKey(info.AGVNUM))
  2777. {
  2778. AGVIDWithRouteByCheckPos.Remove(info.AGVNUM);
  2779. }
  2780. if (AGVIDWithPosByCheckPos.ContainsKey(info.AGVNUM))
  2781. {
  2782. AGVIDWithPosByCheckPos.Remove(info.AGVNUM);
  2783. }
  2784. if (AGVIDWithPosByCheckPos.ContainsValue(info.MARKNUM))
  2785. {
  2786. for (int ab = AGVIDWithPosByCheckPos.Keys.Count - 1; ab >= 0; ab--)
  2787. {
  2788. if (AGVIDWithPosByCheckPos[AGVIDWithPosByCheckPos.Keys.ToList()[ab]] == info.MARKNUM)
  2789. {
  2790. AGVIDWithPosByCheckPos.Remove(AGVIDWithPosByCheckPos.Keys.ToList()[ab]);
  2791. }
  2792. }
  2793. }
  2794. recordReleaseInfo();
  2795. //result = s7.ConnectServer();
  2796. result = DicPLCResult[s7];
  2797. if (result != null && result.IsSuccess)
  2798. {
  2799. OperateResult rs = s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)info.AGVNUM);
  2800. OperateResult rs2 = null;
  2801. if (info.ALARMCODE != "5")
  2802. {
  2803. rs2 = s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.StopOnStation);
  2804. }
  2805. else //在工位上时 障碍物的状态也给停站状态
  2806. {
  2807. rs2 = s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.StopOnStation);
  2808. }
  2809. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)(int.Parse(info.ALARMCODE) - 1));
  2810. if (rs.IsSuccess && rs2.IsSuccess)
  2811. {
  2812. btn.BackColor = Color.Yellow;
  2813. if (btn.Text.Contains("("))
  2814. {
  2815. int textIndex = btn.Text.LastIndexOf("(");
  2816. string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  2817. btn.Text = orignName + "\n" + "(" + info.AGVNUM + ")";
  2818. }
  2819. else
  2820. {
  2821. btn.Text = btn.Text.Replace("\n", "") + "\n" + "(" + info.AGVNUM + ")";
  2822. }
  2823. }
  2824. }
  2825. }
  2826. }));
  2827. }
  2828. else
  2829. {
  2830. IEnumerable<AGVInfoModel> temp3 = temp.Where(o => (o.RUNSTATUS_Cur == 0x43 || (o.MARKFUN == 1 && o.ALARMINFO == "低电压停机")) && o.ConnectStatus == true && o.AGVNUM != 0);
  2831. if (temp3.Count() > 0)
  2832. {
  2833. AGVInfoModel info = temp3.ToList()[0];
  2834. btn.Invoke(new InvokeDelegate(delegate
  2835. {
  2836. if (btn.BackColor != Color.FromKnownColor(KnownColor.Red))
  2837. {
  2838. //result = s7.ConnectServer();
  2839. result = DicPLCResult[s7];
  2840. if (result != null && result.IsSuccess && info.ALARMCODE != "")
  2841. {
  2842. OperateResult rs = s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)info.AGVNUM);
  2843. OperateResult rs2 = null;
  2844. if (info.ALARMCODE != "5" && info.ALARMCODE != "0" && info.ALARMCODE != "9")
  2845. {
  2846. rs2 = s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Pause);
  2847. }
  2848. else
  2849. {
  2850. rs2 = s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Running);
  2851. }
  2852. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)(int.Parse(info.ALARMCODE) - 1));
  2853. // if (btn.BackColor != Color.FromKnownColor(KnownColor.Blue))
  2854. {
  2855. if (rs.IsSuccess && rs2.IsSuccess)
  2856. {
  2857. btn.BackColor = Color.Red;
  2858. if (btn.Text.Contains("("))
  2859. {
  2860. int textIndex = btn.Text.LastIndexOf("(");
  2861. string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  2862. btn.Text = orignName + "\n" + "(" + info.AGVNUM + ")";
  2863. }
  2864. else
  2865. {
  2866. btn.Text = btn.Text.Replace("\n", "") + "\n" + "(" + info.AGVNUM + ")";
  2867. }
  2868. }
  2869. }
  2870. }
  2871. }
  2872. }));
  2873. // if (info.ALARMCODE == "1")
  2874. {
  2875. }
  2876. }
  2877. else
  2878. {
  2879. IEnumerable<AGVInfoModel> temp4 = temp.Where(o => o.RUNSTATUS_Cur == 0x40 && o.ConnectStatus == true && o.AGVNUM != 0);
  2880. if (temp4.Count() > 0)
  2881. {
  2882. AGVInfoModel info = temp4.ToList()[0];
  2883. btn.Invoke(new InvokeDelegate(delegate
  2884. {
  2885. // if (btn.BackColor != Color.FromKnownColor(KnownColor.Green))
  2886. {
  2887. //result = s7.ConnectServer();
  2888. result = DicPLCResult[s7];
  2889. if (result != null && result.IsSuccess)
  2890. {
  2891. OperateResult rs = s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)info.AGVNUM);
  2892. OperateResult rs2 = null;
  2893. rs2 = s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Running);
  2894. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)(int.Parse(info.ALARMCODE) - 1));
  2895. //}
  2896. if (btn.BackColor != Color.FromKnownColor(KnownColor.Blue))
  2897. {
  2898. if (rs.IsSuccess && rs2.IsSuccess)
  2899. {
  2900. btn.BackColor = Color.Green;
  2901. if (btn.Text.Contains("("))
  2902. {
  2903. int textIndex = btn.Text.LastIndexOf("(");
  2904. string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  2905. btn.Text = orignName + "\n" + "(" + info.AGVNUM + ")";
  2906. }
  2907. else
  2908. {
  2909. btn.Text = btn.Text.Replace("\n", "") + "\n" + "(" + info.AGVNUM + ")";
  2910. }
  2911. }
  2912. }
  2913. }
  2914. }
  2915. }));
  2916. }
  2917. else
  2918. {
  2919. btn.Invoke(new InvokeDelegate(delegate
  2920. {
  2921. if (tag >= 1)
  2922. {
  2923. if (AGVIDWithPosByCheckPos.ContainsValue(int.Parse(query.ToList()[0]["工位地标"].ToString())))
  2924. {
  2925. List<int> keys = AGVIDWithPosByCheckPos.Keys.ToList();
  2926. for (int a = 0; a < keys.Count; a++)
  2927. {
  2928. if (AGVIDWithPosByCheckPos[keys[a]] == int.Parse(query.ToList()[0]["工位地标"].ToString()))
  2929. {
  2930. btn.Text = query.ToList()[0]["工位名称"].ToString() + "\n(" + keys[a] + ")";
  2931. btn.BackColor = Color.Blue;
  2932. break;
  2933. }
  2934. }
  2935. }
  2936. else
  2937. {
  2938. // if (btn.BackColor != Color.FromKnownColor(KnownColor.Control))
  2939. {
  2940. OperateResult rs = s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)0);
  2941. OperateResult rs2 =
  2942. s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Unknow);
  2943. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)0);
  2944. if (btn.BackColor != Color.FromKnownColor(KnownColor.Blue))
  2945. {
  2946. if (rs.IsSuccess && rs2.IsSuccess)
  2947. {
  2948. btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  2949. if (btn.Text.Contains("("))
  2950. {
  2951. int textIndex = btn.Text.LastIndexOf("(");
  2952. string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  2953. btn.Text = orignName;
  2954. }
  2955. }
  2956. }
  2957. }
  2958. }
  2959. }
  2960. else if (tag == 0)
  2961. {
  2962. //result = s7.ConnectServer();
  2963. result = DicPLCResult[s7];
  2964. btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  2965. if (result != null && result.IsSuccess)
  2966. {
  2967. s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)0);
  2968. s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Unknow);
  2969. s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)0);
  2970. }
  2971. if (AGVIDWithPosByCheckPos.ContainsValue(int.Parse(query.ToList()[0]["工位地标"].ToString())))
  2972. {
  2973. List<int> keys = AGVIDWithPosByCheckPos.Keys.ToList();
  2974. for (int a = 0; a < keys.Count; a++)
  2975. {
  2976. if (AGVIDWithPosByCheckPos[keys[a]] == int.Parse(query.ToList()[0]["工位地标"].ToString()))
  2977. {
  2978. btn.Text = query.ToList()[0]["工位名称"].ToString() + "\n(" + keys[a] + ")";
  2979. btn.BackColor = Color.Blue;
  2980. break;
  2981. }
  2982. }
  2983. }
  2984. }
  2985. }));
  2986. }
  2987. }
  2988. }
  2989. }
  2990. else
  2991. {
  2992. //btn.Invoke(new InvokeDelegate(delegate
  2993. //{
  2994. // if (tag >= 1)
  2995. // {
  2996. // if (btn.BackColor != Color.FromKnownColor(KnownColor.Control) &&
  2997. // btn.BackColor != Color.FromKnownColor(KnownColor.Blue))
  2998. // {
  2999. // OperateResult rs = GlobalPara.s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)0);
  3000. // OperateResult rs2 =
  3001. // GlobalPara.s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Unknow);
  3002. // GlobalPara.s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)0);
  3003. // if (rs.IsSuccess && rs2.IsSuccess)
  3004. // {
  3005. // btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  3006. // if (btn.Text.Contains("("))
  3007. // {
  3008. // int textIndex = btn.Text.LastIndexOf("(");
  3009. // string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  3010. // btn.Text = orignName;
  3011. // }
  3012. // }
  3013. // }
  3014. // }
  3015. // else if (tag <= 0)
  3016. // {
  3017. // btn.BackColor = Color.FromKnownColor(KnownColor.Control);
  3018. // if (result != null && result.IsSuccess)
  3019. // {
  3020. // GlobalPara.s7.Write(query.ToList()[0]["AGVDB"].ToString(), (byte)0);
  3021. // GlobalPara.s7.Write(query.ToList()[0]["行驶状态DB"].ToString(), (byte)GlobalPara.DBRunValues.Unknow);
  3022. // GlobalPara.s7.Write(query.ToList()[0]["故障DB"].ToString(), (byte)0);
  3023. // }
  3024. // if (AGVIDWithPosByCheckPos.ContainsValue(int.Parse(query.ToList()[0]["工位地标"].ToString())))
  3025. // {
  3026. // List<int> keys = AGVIDWithPosByCheckPos.Keys.ToList();
  3027. // for (int a = 0; a < keys.Count; a++)
  3028. // {
  3029. // if (AGVIDWithPosByCheckPos[keys[a]] == int.Parse(query.ToList()[0]["工位地标"].ToString()))
  3030. // {
  3031. // btn.Text = query.ToList()[0]["工位名称"].ToString() + "\n(" + keys[a] + ")";
  3032. // btn.BackColor = Color.Blue;
  3033. // break;
  3034. // }
  3035. // }
  3036. // }
  3037. // }
  3038. //}));
  3039. }
  3040. }
  3041. }
  3042. });
  3043. // if (result2.IsCompleted)
  3044. {
  3045. sw2.Stop();
  3046. Console.WriteLine(dt.TableName + "任务总共花费{0}s.", sw.Elapsed.TotalSeconds);
  3047. object[] obj = new object[3];
  3048. obj[0] = listBtn; obj[1] = ++tag; obj[2] = lineName;
  3049. if (tag < 3)
  3050. {
  3051. Thread.Sleep(100);
  3052. Thread t2 = new Thread(new ParameterizedThreadStart(DockingOpeareForPLCReOpen)); t2.IsBackground = true;
  3053. t2.Priority = ThreadPriority.Highest;
  3054. t2.Start(obj);
  3055. }
  3056. // DockingOpeare(list);
  3057. }
  3058. }
  3059. }
  3060. catch (Exception ex)
  3061. {
  3062. DateTime time = DateTime.Now;
  3063. //MessageBox.Show("线程异常:"+e.ExceptionObject);
  3064. FileStream stream = File.Open(@"Exception\调度程序异常.txt", FileMode.Append, FileAccess.Write);
  3065. StreamWriter writer = new StreamWriter(stream);
  3066. if (ex != null)
  3067. {
  3068. string msg = string.Format("[{0}]Test:\r\nMessage:{1}\r\nStackTrace:\r\n{2}", time.ToString("yyyy-MM-dd HH:mm:ss"), ex.Message, ex.StackTrace);
  3069. writer.WriteLine(msg);
  3070. writer.Close();
  3071. stream.Close();
  3072. }
  3073. bb = true;
  3074. }
  3075. finally
  3076. {
  3077. //if (bb)
  3078. //{
  3079. // object[] obj = new object[3];
  3080. // obj[0] = listBtn; obj[1] = 0; obj[2] = lineName;
  3081. // Thread.Sleep(100);
  3082. // Thread t2 = new Thread(new ParameterizedThreadStart(DockingOpeare0)); t2.IsBackground = true;
  3083. // t2.Priority = ThreadPriority.BelowNormal;
  3084. // t2.Start(obj);
  3085. //}
  3086. //if (!DockingOK && InitOK.Count == LineDt.Rows.Count)
  3087. //{
  3088. // DockingOK = true;
  3089. // Thread t2 = new Thread(new ThreadStart(checkingOperate)); t2.IsBackground = true;
  3090. // t2.Priority = ThreadPriority.BelowNormal;
  3091. // t2.Start();
  3092. // Thread t3 = new Thread(new ThreadStart(TrafficByDispatch)); t3.IsBackground = true;
  3093. // t3.Priority = ThreadPriority.AboveNormal;
  3094. // t3.Start();
  3095. //}
  3096. }
  3097. }
  3098. /// <summary>
  3099. /// 处理调度的协议
  3100. /// </summary>
  3101. private void Analzye()
  3102. {
  3103. while (!isChoseMat)
  3104. {
  3105. try
  3106. {
  3107. if (GlobalPara.dispatchList.Count > 0)
  3108. {
  3109. byte[] bytes = GlobalPara.dispatchList[0];
  3110. if (bytes != null)
  3111. {
  3112. AnalzyeBytes(bytes);
  3113. Console.WriteLine("调度模块收到数据:" + GlobalPara.ByteToHexString(bytes));
  3114. if (GlobalPara.dispatchList.Contains(bytes))
  3115. {
  3116. GlobalPara.dispatchList.Remove(bytes);
  3117. }
  3118. }
  3119. else
  3120. {
  3121. if (GlobalPara.dispatchList.Contains(bytes))
  3122. {
  3123. GlobalPara.dispatchList.Remove(bytes);
  3124. }
  3125. }
  3126. }
  3127. }
  3128. catch (Exception)
  3129. {
  3130. }
  3131. Thread.Sleep(50);
  3132. }
  3133. }
  3134. public void AnalzyeBytes(byte[] bytes)
  3135. {
  3136. try
  3137. {
  3138. if (bytes != null && bytes.Length >= 14 && bytes[0] == 0xAA && bytes[1] == 0x11 && bytes[bytes.Length - 1] == 0xAB)
  3139. {
  3140. int agvnum = (int)bytes[5];
  3141. if (GlobalPara.isSingleControl && GlobalPara.SingleSWAGVNum == agvnum && lastSWAGVNum != agvnum)
  3142. {
  3143. lastSWAGVNum = agvnum;
  3144. if (bytes[2] == 0x22)
  3145. {
  3146. MessageBox.Show(agvnum + "号AGV休眠成功!");
  3147. }
  3148. else if (bytes[2] == 0x32)
  3149. {
  3150. MessageBox.Show(agvnum + "号AGV唤醒成功!");
  3151. }
  3152. }
  3153. else if (!GlobalPara.isSingleControl)
  3154. {
  3155. if (bytes[2] == 0x22)
  3156. {
  3157. if (!GlobalPara.SleepAGVNumList.Contains(agvnum))
  3158. {
  3159. GlobalPara.SleepAGVNumList.Add(agvnum);
  3160. }
  3161. if (GlobalPara.WakeUpAGVNumList.Contains(agvnum))
  3162. {
  3163. GlobalPara.WakeUpAGVNumList.Remove(agvnum);
  3164. }
  3165. }
  3166. else if (bytes[2] == 0x32)
  3167. {
  3168. if (!GlobalPara.WakeUpAGVNumList.Contains(agvnum))
  3169. {
  3170. GlobalPara.WakeUpAGVNumList.Add(agvnum);
  3171. }
  3172. if (GlobalPara.SleepAGVNumList.Contains(agvnum))
  3173. {
  3174. GlobalPara.SleepAGVNumList.Remove(agvnum);
  3175. }
  3176. }
  3177. }
  3178. }
  3179. else if (bytes != null && bytes.Length >= 14 && bytes[0] == 0x10 && bytes[1] == 0x37)
  3180. {
  3181. int agvnum = (int)bytes[11];
  3182. if (GlobalPara.AgvInfoDic.ContainsKey(agvnum))
  3183. {
  3184. AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[agvnum];
  3185. if (agvinfo.RUNSTATUS_Cur != 0x43)
  3186. {
  3187. agvinfo.RUNSTATUS_Cur = 0x43;
  3188. agvinfo.ConnectStatus = true;
  3189. agvinfo.OffLineCount = 0;
  3190. }
  3191. for (int i = 0; i < BoxMarkList.Count; i++)
  3192. {
  3193. if (BoxMarkList[i] == (agvinfo.MARKNUM.ToString()))
  3194. {
  3195. DispatcherTool.ReleaseAgvOnStop(agvinfo.MARKNUM, agvinfo.ROUTENUM, 0, 1);
  3196. break;
  3197. }
  3198. }
  3199. }
  3200. else
  3201. {
  3202. // for (int i = 0; i < BoxMarkList.Count; i++)
  3203. {
  3204. //if (BoxMarkList[i] == (agvinfo.MARKNUM.ToString()))
  3205. {
  3206. DispatcherTool.ReleaseAgvOnStop((int)bytes[9], 0, 0, 1);
  3207. // break;
  3208. }
  3209. }
  3210. }
  3211. }
  3212. else if (bytes != null && bytes.Length >= 14 && bytes[0] == 0x10 && bytes[1] == 0x38)
  3213. {
  3214. int agvnum = (int)bytes[11];
  3215. if (GlobalPara.AgvInfoDic.ContainsKey(agvnum))
  3216. {
  3217. AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[agvnum];
  3218. if (agvinfo.RUNSTATUS_Cur != 0x40)
  3219. {
  3220. agvinfo.RUNSTATUS_Cur = 0x40;
  3221. agvinfo.ConnectStatus = true;
  3222. agvinfo.OffLineCount = 0;
  3223. }
  3224. }
  3225. }
  3226. else if (bytes != null && bytes.Length >= 14 && bytes[0] == 0x10 && bytes[1] == 0x55)
  3227. {
  3228. bytes[1] = 0x56;
  3229. byte checkSum = 0x00;
  3230. for (int i = 0; i < 12; i++)
  3231. {
  3232. checkSum ^= bytes[i];
  3233. }
  3234. bytes[12] = checkSum;
  3235. //GlobalPara.communication.SendData(bytes, null);
  3236. }
  3237. }
  3238. catch (Exception ex)
  3239. {
  3240. }
  3241. }
  3242. //时间超时
  3243. void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
  3244. {
  3245. //throw new NotImplementedException();
  3246. try
  3247. {
  3248. lock (afterRelease)
  3249. {
  3250. if (afterRelease.Count > 0 && !isChoseMat)
  3251. {
  3252. for (int i = afterRelease.Count - 1; i >= 0; i--)
  3253. {
  3254. string[] temps = afterRelease[i].Split(',');
  3255. double limitedTime = double.Parse(temps[1]);
  3256. if (limitedTime > 0)
  3257. {
  3258. limitedTime -= timer.Interval;
  3259. afterRelease[i] = temps[0] + "," + limitedTime + "," + temps[2];
  3260. }
  3261. else
  3262. {
  3263. int agvnum = int.Parse(temps[0]);
  3264. int statu = int.Parse(temps[2]);
  3265. if (GlobalPara.AgvInfoDic.ContainsKey(agvnum))
  3266. {
  3267. AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[agvnum];
  3268. if (agvinfo.RUNSTATUS_Cur != statu)
  3269. {
  3270. // if (GlobalPara.IsNeedToReplyPLCImmediately)
  3271. {
  3272. agvinfo.RUNSTATUS_Cur = statu;
  3273. agvinfo.AGVRunningCount = 5;
  3274. agvinfo.ConnectStatus = true;
  3275. }
  3276. }
  3277. }
  3278. afterRelease.RemoveAt(i);
  3279. }
  3280. }
  3281. }
  3282. else //afterRelease.Count < 0
  3283. {
  3284. //lock (afterRelease)
  3285. //{
  3286. // string tempStr = "1,1000,64";
  3287. // string[] temps = tempStr.Split(',');
  3288. // int agvnum = int.Parse(temps[0]);
  3289. // int statu = int.Parse(temps[2]);
  3290. // if (GlobalPara.AgvInfoDic.ContainsKey(agvnum))
  3291. // {
  3292. // AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[agvnum];
  3293. // if (agvinfo.RUNSTATUS_Cur != 0)
  3294. // {
  3295. // agvinfo.RUNSTATUS_Cur = 0;
  3296. // agvinfo.ConnectStatus = true;
  3297. // }
  3298. // }
  3299. // if (!afterRelease.Contains(tempStr))
  3300. // {
  3301. // afterRelease.Add(tempStr);
  3302. // }
  3303. //}
  3304. }
  3305. }
  3306. }
  3307. catch (Exception)
  3308. {
  3309. }
  3310. try
  3311. {
  3312. lock (listObjs)
  3313. {
  3314. // List<int> list = new List<int>();
  3315. if (listObjs.Count > 0)
  3316. {
  3317. for (int i = listObjs.Count - 1; i >= 0; i--)
  3318. {
  3319. int Secs = (int)listObjs[i]["Secs"];
  3320. if (Secs > 0) { Secs = Secs - (int)timer.Interval; listObjs[i]["Secs"] = Secs; }
  3321. else
  3322. {
  3323. listObjs.RemoveAt(i);
  3324. }
  3325. }
  3326. }
  3327. }
  3328. lock (GlobalPara.ListReleaseObj)
  3329. {
  3330. if (GlobalPara.ListReleaseObj.Count > 0)
  3331. {
  3332. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  3333. for (int i = GlobalPara.ListReleaseObj.Count - 1; i >= 0; i--)
  3334. {
  3335. var temp = listModel.Find(o => o.ConnectStatus && o.AGVNUM == GlobalPara.ListReleaseObj[i].AGVNUM&&o.RUNSTATUS_Cur==0x41);
  3336. if (temp != null)
  3337. {
  3338. DispatcherTool.ReleaseAgvOnStop(GlobalPara.ListReleaseObj[i].MARKNUM, 0, 0, 1);
  3339. }
  3340. else
  3341. {
  3342. GlobalPara.ListReleaseObj.RemoveAt(i);
  3343. }
  3344. }
  3345. }
  3346. }
  3347. }
  3348. catch (Exception)
  3349. {
  3350. }
  3351. }
  3352. private void 异常解除ToolStripMenuItem_Click(object sender, EventArgs e)
  3353. {
  3354. RemoveError RemoveErrorForm = new RemoveError();
  3355. RemoveErrorForm.button1.Click += new EventHandler(button1_Click);
  3356. RemoveErrorForm.Load += new EventHandler(RemoveErrorForm_Load);
  3357. RemoveErrorForm.Owner = this;
  3358. RemoveErrorForm.ShowDialog();
  3359. }
  3360. void RemoveErrorForm_Load(object sender, EventArgs e)
  3361. {
  3362. RemoveError RemoveErrorForm = (RemoveError)(sender);
  3363. RemoveErrorForm.InitView(AGVIDWithPosByCheckPos, AGVIDWithRouteByCheckPos, checkPosDic);
  3364. if (RemoveErrorForm.listCreateBtns.Count > 0)
  3365. {
  3366. foreach (Button btn in RemoveErrorForm.listCreateBtns)
  3367. {
  3368. btn.Click += new EventHandler(RemoveErrorForm_btn_Click);
  3369. }
  3370. }
  3371. }
  3372. void RemoveErrorForm_btn_Click(object sender, EventArgs e)
  3373. {
  3374. Button btn = (Button)sender;
  3375. RemoveError RemoveErrorForm = ((RemoveError)(btn.FindForm()));
  3376. int AGVNUM = int.Parse(btn.Tag.ToString());
  3377. if (MessageBox.Show("是否要解除" + AGVNUM + "号AGV锁定?", "警告", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
  3378. {
  3379. if (AGVIDWithRouteByCheckPos.ContainsKey(AGVNUM))
  3380. {
  3381. AGVIDWithRouteByCheckPos.Remove(AGVNUM);
  3382. }
  3383. if (AGVIDWithPosByCheckPos.ContainsKey(AGVNUM))
  3384. {
  3385. AGVIDWithPosByCheckPos.Remove(AGVNUM);
  3386. }
  3387. if (AGVIDWithPosByCheckPosReal.ContainsKey(AGVNUM))
  3388. {
  3389. AGVIDWithPosByCheckPosReal.Remove(AGVNUM);
  3390. }
  3391. recordReleaseInfo();
  3392. for (int i = 0; i < tabControl1.TabPages.Count; i++)
  3393. {
  3394. Button temp = (tabControl1.TabPages[i].Tag as TabPageTag).ListBtn.Find(o => o.Text.Contains("(" + AGVNUM + ")") && o.BackColor == Color.Blue);
  3395. if (temp != null)
  3396. {
  3397. temp.BackColor = Color.FromKnownColor(KnownColor.Control);
  3398. if (temp.Text.Contains("("))
  3399. {
  3400. temp.Text = temp.Text.Replace("\n", "").Substring(0, temp.Text.LastIndexOf("(") - 1);
  3401. }
  3402. break;
  3403. }
  3404. }
  3405. RemoveErrorForm.button1.PerformClick();
  3406. }
  3407. }
  3408. void button1_Click(object sender, EventArgs e)
  3409. {
  3410. RemoveError RemoveErrorForm = ((RemoveError)(((Button)sender).FindForm()));
  3411. RemoveErrorForm.InitView(AGVIDWithPosByCheckPos, AGVIDWithRouteByCheckPos, checkPosDic);
  3412. if (RemoveErrorForm.listCreateBtns.Count > 0)
  3413. {
  3414. foreach (Button btn in RemoveErrorForm.listCreateBtns)
  3415. {
  3416. btn.Click += new EventHandler(RemoveErrorForm_btn_Click);
  3417. }
  3418. }
  3419. }
  3420. public void SKQPLC()
  3421. {
  3422. for (int i = 0; i < dtSKQPLC.Rows.Count; i++)
  3423. {
  3424. if (dtSKQPLC.Columns.Contains("请求出门DB"))
  3425. {
  3426. if (!string.IsNullOrEmpty(dtSKQPLC.Rows[i]["请求出门DB"].ToString()))
  3427. {
  3428. if (!GlobalPara.plcs.ContainsKey(dtSKQPLC.Rows[i]))
  3429. {
  3430. SiemensS7Net s7 = new SiemensS7Net(SiemensPLCS.S1500, dtSKQPLC.Rows[i]["IP地址"].ToString());
  3431. s7.Rack = (byte)0;
  3432. s7.Slot = (byte)1;
  3433. s7.ConnectTimeOut = 500;
  3434. s7.ReceiveTimeOut = 500;
  3435. s7.SetPersistentConnection();
  3436. GlobalPara.plcs.Add(dtSKQPLC.Rows[i], s7);
  3437. }
  3438. }
  3439. }
  3440. MyTest.ManagedThreadPoolcs.ManagedThreadPool.QueueUserWorkItem(new WaitCallback(Test), dtSKQPLC.Rows[i]);
  3441. // Thread.Sleep(50);
  3442. }
  3443. // MyTest.ManagedThreadPoolcs.ManagedThreadPool.QueueUserWorkItem(new WaitCallback(Test), dtTestPLC.Rows[i]); //PLC工站/
  3444. // Thread thread = new Thread(new ThreadStart(Test1));
  3445. // thread.Start();
  3446. // Thread.Sleep(50);c
  3447. //for (int i = 0; i < dtBigzPLC.Rows.Count; i++)
  3448. //{
  3449. // MyTest.ManagedThreadPoolcs.ManagedThreadPool.QueueUserWorkItem(new WaitCallback(Test), dtBigzPLC.Rows[i]);
  3450. // // Thread.Sleep(50);
  3451. //}
  3452. }
  3453. public byte[] ExcuteSKQMES(System.Net.Sockets.Socket SocketClient, byte[] bytes)
  3454. {
  3455. String resultRead1 = "";
  3456. String resultRead2 = "";
  3457. byte[] result = null;
  3458. try
  3459. {
  3460. {
  3461. if (bytes.Length >= 8 && bytes[0] == 0x4A && bytes[1] == 0x54 && bytes[2] == 0x58)//帧开头
  3462. {
  3463. int dataLength = (int)bytes[3];
  3464. List<byte> list = new List<byte>();
  3465. for (int i = 0; i < 4 + dataLength + 2; i++)
  3466. {
  3467. list.Add(bytes[i]);
  3468. }
  3469. // byte[] CRC = DispatcherTool.CRC16(list.ToArray());
  3470. // if (CRC[0] == bytes[4 + dataLength] && CRC[1] == bytes[5 + dataLength])//校验通过
  3471. {
  3472. List<byte> listSend = new List<byte>();
  3473. //GlobalPara.listSKQMes.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "接收数据来自:" + SocketClient.RemoteEndPoint.ToString() + ",数据是 " + DispatcherTool.ByteToHexString(list.ToArray()));
  3474. WriteFile("SKQMES对接记录" + DateTime.Now.ToString("yyyy-MM-dd"), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "接收数据来自:" + SocketClient.RemoteEndPoint.ToString() + ",数据是 " + DispatcherTool.ByteToHexString(list.ToArray()));
  3475. switch (bytes[4])
  3476. {
  3477. case 0xE1://询问工位状态
  3478. listSend.Add(0XD1);
  3479. if (bytes[5] == 0)
  3480. {
  3481. foreach (var station in MesStations)
  3482. {
  3483. listSend.Add((byte)station["Mark"]);
  3484. listSend.Add((byte)station["Status"]);
  3485. listSend.Add((byte)station["AGVID"]);
  3486. listSend.Add((byte)station["AGVStatus"]);
  3487. }
  3488. }
  3489. else
  3490. {
  3491. var station = MesStations.Find(o => o["Mark"].ToString() == bytes[5].ToString());
  3492. if (station != null)
  3493. {
  3494. listSend.Add((byte)station["Mark"]);
  3495. listSend.Add((byte)station["Status"]);
  3496. listSend.Add((byte)station["AGVID"]);
  3497. listSend.Add((byte)station["AGVStatus"]);
  3498. }
  3499. }
  3500. break;
  3501. case 0xE2://询问AGV状态
  3502. listSend.Add(0XD2);
  3503. var agv = GlobalPara.AgvInfoDic.Values.ToList().Find(o => o.AGVNUM == ((int)bytes[5]));
  3504. var agv2 = MesStations.Find(o => o["AGVID"].ToString() == bytes[5].ToString());
  3505. if (agv != null && agv2 != null)
  3506. {
  3507. listSend.Add((byte)agv.AGVNUM);
  3508. listSend.Add((byte)agv2["AGVStatus"]);
  3509. if (agv.ConnectStatus)
  3510. {
  3511. listSend.Add((byte)1);
  3512. }
  3513. else
  3514. {
  3515. listSend.Add((byte)0);
  3516. }
  3517. listSend.Add((byte)agv.MARKNUM);
  3518. listSend.Add((byte)0);
  3519. listSend.Add((byte)agv2["ID"]);
  3520. listSend.Add((byte)0);
  3521. listSend.Add((byte)0);
  3522. listSend.Add(SpeedOptByte[agv.SPEEDLEVEL]);
  3523. listSend.Add((byte)((int)agv.Battery_Power));
  3524. }
  3525. break;
  3526. case 0xE3://控制工位状态
  3527. for (int i = 5; i < 4 + dataLength; i = i + 2)
  3528. {
  3529. lock (MesStations)
  3530. {
  3531. var station = MesStations.Find(o => o["Mark"].ToString() == bytes[i].ToString());
  3532. if (station != null)
  3533. {
  3534. //if (station.Property("TargetMark") != null)
  3535. //{
  3536. // DispatcherTool.ReleaseAgvOnStop((int)bytes[i], 0, int.Parse(station["TargetMark"].ToString()));
  3537. // // DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0, 10);
  3538. //}
  3539. //else
  3540. //{
  3541. DispatcherTool.ReleaseAgvOnStop((int)bytes[i], 0);
  3542. //}
  3543. // WriteFile("SKQMES人工位放行信号" + DateTime.Now.ToString("yyyy-MM-dd"), "在放行点" + (int)station[i]["Mark"] + "上放行!");
  3544. // station["Status"] = (int)bytes[i + 1];
  3545. //if ((int)bytes[i + 1] == 2)//启动
  3546. //{
  3547. // DispatcherTool.ControlAGVBy1071((int)bytes[i], 0);
  3548. //}
  3549. //else if ((int)bytes[i + 1] == 3)//暂停
  3550. //{
  3551. // DispatcherTool.ControlAGVBy1071((int)bytes[i], 1);
  3552. //}
  3553. listSend.Add(0xF3); listSend.Add(0x01);
  3554. }
  3555. else
  3556. {
  3557. listSend.Add(0xF3); listSend.Add(0x00);
  3558. }
  3559. }
  3560. }
  3561. break;
  3562. case 0xE4://控制AGV站点状态
  3563. var station3 = MesStations.FindAll(o => o["AGVID"].ToString() == bytes[5].ToString() && bytes[5] != 0);
  3564. if (station3 != null)
  3565. {
  3566. // var temp = MesStations.Find(o => o["Mark"].ToString() == bytes[6].ToString());
  3567. // if (temp != null)
  3568. for (int i = 0; i < station3.Count; i++)
  3569. {
  3570. // station2["TargetStation"] = temp["Mark"];
  3571. DispatcherTool.ReleaseAgvOnStop((int)station3[i]["Mark"], 0, (int)bytes[6]);
  3572. WriteFile("SKQMES人工位放行信号" + DateTime.Now.ToString("yyyy-MM-dd"), "在放行点" + (int)station3[i]["Mark"] + "上放行!");
  3573. }
  3574. }
  3575. listSend.Add(0XF4); listSend.Add(0x01);
  3576. break;
  3577. case 0xE5://控制AGV状态
  3578. var station2 = MesStations.Find(o => o["AGVID"].ToString() == bytes[5].ToString());
  3579. if (station2 != null)
  3580. {
  3581. int status = (int)bytes[6];
  3582. if (status == 2 || status == 4)
  3583. {
  3584. DispatcherTool.ControlAGVBy1071((int)station2["AGVID"], 1);
  3585. //WriteFile("SKQMES人工位停止信号" + DateTime.Now.ToString("yyyy-MM-dd"), "车子编号"+(int)station2["AGVID"]+"上放行!");
  3586. }
  3587. else if (status == 1)
  3588. {
  3589. DispatcherTool.ControlAGVBy1071((int)station2["AGVID"], 0);
  3590. //WriteFile("SKQMES人工位放行信号" + DateTime.Now.ToString("yyyy-MM-dd"), "在放行点"+(int)station3[i]["Mark"]+"上放行!");
  3591. }
  3592. }
  3593. listSend.Add(0XF5); listSend.Add(0x01);
  3594. break;
  3595. case 0xE6://控制AGV速度
  3596. station2 = MesStations.Find(o => o["AGVID"].ToString() == bytes[5].ToString());
  3597. if (station2 != null)
  3598. {
  3599. int speedd = (int)bytes[6];
  3600. if (speedd > 0 && speedd <= 30)
  3601. {
  3602. DispatcherTool.ControlAGVBy1071((int)station2["AGVID"], 0, 1);
  3603. }
  3604. else if (speedd > 30 && speedd <= 60)
  3605. {
  3606. DispatcherTool.ControlAGVBy1071((int)station2["AGVID"], 0, 2);
  3607. }
  3608. else if (speedd > 60)
  3609. {
  3610. DispatcherTool.ControlAGVBy1071((int)station2["AGVID"], 0, 3);
  3611. }
  3612. }
  3613. listSend.Add(0XF6); listSend.Add(0x01);
  3614. break;
  3615. case 0xE7://发送SN1码
  3616. listSend.Add(0xB1);
  3617. //var agvID1 = MesStations.Find(o => o["AGVID"].ToString() == bytes[5].ToString());
  3618. //if (agvID1 != null)
  3619. //{
  3620. PLCSql.PLCSqlSelect(bytes[5].ToString(), "2", ref resultRead1, ref resultRead2); //查询数据
  3621. if (resultRead1 != "")
  3622. {
  3623. listSend.Add(bytes[5]);
  3624. byte[] byteArray = System.Text.Encoding.Default.GetBytes(resultRead1);
  3625. listSend.AddRange(byteArray.ToArray());
  3626. string s = DispatcherTool.ByteToHexString(byteArray.ToArray());
  3627. WriteFile("查询SN记录", "AGVID+" + bytes[5].ToString() + "SN1DB+" + resultRead1 + "SN2DB+" + resultRead2 + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  3628. }
  3629. break;
  3630. case 0xE8://发送SN2码
  3631. listSend.Add(0xB2);
  3632. PLCSql.PLCSqlSelect(bytes[5].ToString(), "2", ref resultRead1, ref resultRead2); //查询数据
  3633. if (resultRead2 != "")
  3634. {
  3635. listSend.Add(bytes[5]);
  3636. byte[] byteArray = System.Text.Encoding.Default.GetBytes(resultRead2);
  3637. listSend.AddRange(byteArray.ToArray());
  3638. WriteFile("查询SN记录", "AGVID+" + bytes[5].ToString() + "SN1DB+" + resultRead1 + "SN2DB+" + resultRead2 + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  3639. }
  3640. break;
  3641. }
  3642. if (listSend.Count > 1)
  3643. {
  3644. List<byte> list2 = new List<byte>();
  3645. list2.Add(bytes[0]); list2.Add(bytes[1]); list2.Add(bytes[2]);
  3646. list2.Add((byte)listSend.Count);
  3647. list2.AddRange(listSend.ToArray());
  3648. byte[] crc = DispatcherTool.CRC16(list2.ToArray());
  3649. list2.AddRange(crc);
  3650. result = list2.ToArray();
  3651. //GlobalPara.listSKQMes.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 发送数据到 :" + SocketClient.RemoteEndPoint.ToString() + ",数据是 " + DispatcherTool.ByteToHexString(list2.ToArray()));
  3652. WriteFile("SKQMES对接记录" + DateTime.Now.ToString("yyyy-MM-dd"), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 发送数据到 :" + SocketClient.RemoteEndPoint.ToString() + ",数据是 " + DispatcherTool.ByteToHexString(list2.ToArray()));
  3653. }
  3654. List<byte> temp2 = bytes.ToList();
  3655. temp2.RemoveRange(0, 3 + 1 + dataLength + 2);
  3656. bytes = new List<byte>().ToArray();
  3657. }
  3658. }
  3659. else
  3660. {
  3661. bytes = new List<byte>().ToArray();
  3662. }
  3663. }
  3664. }
  3665. catch (Exception ex)
  3666. {
  3667. }
  3668. return result;
  3669. }
  3670. public static byte[] SpeedOptByte = { 0x00, 0x06, 0x0C, 0x14 };
  3671. List<Button> listAllBtns = new List<Button>();
  3672. List<JObject> listObjs = new List<JObject>();
  3673. Boolean CarAlarmFlag = false;
  3674. //pack线方法
  3675. public void Test(object Dr)
  3676. {
  3677. if (Dr != null)
  3678. {
  3679. DataRow dr = (DataRow)Dr;
  3680. while (true)
  3681. {
  3682. Console.WriteLine(dr["ID"].ToString() + ":" + dr["工位名称"].ToString());
  3683. HslCommunication.Profinet.Siemens.SiemensS7Net s7 = null;
  3684. try
  3685. {
  3686. // Button btn = listAllBtns.Find(o => o.Tag.ToString() == dr["工位地标"].ToString());
  3687. // if (btn == null) { return; }
  3688. var infos = GlobalPara.AgvInfoDic.Values.ToList();
  3689. // btn.Invoke(new InvokeDelegate(delegate
  3690. // for (int i = 0; i < dtSKQPLC.Rows.Count; i++)
  3691. {
  3692. if (!string.IsNullOrEmpty(dr["PLC类型"].ToString())&& !string.IsNullOrEmpty(dr["IP地址"].ToString()))
  3693. {
  3694. switch (dr["PLC类型"].ToString().ToLower())
  3695. {
  3696. case "s1200":
  3697. s7 = new HslCommunication.Profinet.Siemens.SiemensS7Net(HslCommunication.Profinet.Siemens.SiemensPLCS.S1200,
  3698. dr["IP地址"].ToString());
  3699. break;
  3700. case "s1500":
  3701. s7 = new HslCommunication.Profinet.Siemens.SiemensS7Net(HslCommunication.Profinet.Siemens.SiemensPLCS.S1500,
  3702. dr["IP地址"].ToString());
  3703. break;
  3704. default:
  3705. s7 = new HslCommunication.Profinet.Siemens.SiemensS7Net(HslCommunication.Profinet.Siemens.SiemensPLCS.S1500,
  3706. dr["IP地址"].ToString());
  3707. break;
  3708. }
  3709. s7.Rack = (byte)0;
  3710. s7.Slot = (byte)1;
  3711. s7.ConnectTimeOut = 500;
  3712. s7.ReceiveTimeOut = 500;
  3713. var connet = s7.ConnectServer();
  3714. // s7.LogNet = new HslCommunication.LogNet.LogNetSingle("logs.txt");
  3715. if (!connet.IsSuccess)
  3716. {
  3717. //GlobalPara.listSKQPLC.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址请求连接失败");
  3718. WriteFile("SKQPLC对接失败记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址请求连接失败");
  3719. // return;
  3720. // PLCPackAlarm = true;
  3721. lock (AlarmPackStations)
  3722. {
  3723. if (!AlarmPackStations.Contains(dr["工位名称"].ToString()))
  3724. {
  3725. AlarmPackStations.Add(dr["工位名称"].ToString());
  3726. }
  3727. }
  3728. continue;
  3729. }
  3730. else
  3731. {
  3732. // PLCPackAlarm = false;
  3733. lock (AlarmPackStations)
  3734. {
  3735. if (AlarmPackStations.Contains(dr["工位名称"].ToString()))
  3736. {
  3737. AlarmPackStations.RemoveAll(o => o == dr["工位名称"].ToString());
  3738. }
  3739. }
  3740. }
  3741. if (dr.Table.Columns.Contains("PLC心跳DB") && dr.Table.Columns.Contains("中控心跳DB"))
  3742. {
  3743. if (!string.IsNullOrEmpty(dr["PLC心跳DB"].ToString()) && !string.IsNullOrEmpty(dr["中控心跳DB"].ToString()))
  3744. {
  3745. var result = s7.ReadBool(dr["PLC心跳DB"].ToString());
  3746. if (result != null && result.IsSuccess)
  3747. {
  3748. s7.Write(dr["中控心跳DB"].ToString(), result.Content);
  3749. }
  3750. }
  3751. }
  3752. bool IsInOtherInMarks = false;
  3753. if (dr.Table.Columns.Contains("其他进入中地标"))
  3754. {
  3755. if (!string.IsNullOrEmpty(dr["其他进入中地标"].ToString()))
  3756. {
  3757. List<string> list = dr["其他进入中地标"].ToString().Split(';').ToList();
  3758. var infoList = infos.FindAll(o => list.Contains(o.MARKNUM.ToString()) && o.ConnectStatus && (o.RUNSTATUS_Cur == 0x40 || o.RUNSTATUS_Cur == 0x41));
  3759. if (infoList != null && infoList.Count >= 1)
  3760. {
  3761. IsInOtherInMarks = true;
  3762. s7.Write(dr["进入中DB"].ToString(), true);
  3763. }
  3764. else
  3765. {
  3766. // s7.Write(dr["进入中DB"].ToString(), false);
  3767. }
  3768. }
  3769. }
  3770. #region 请求地标判断放行
  3771. if (dr.Table.Columns.Contains("请求地标"))
  3772. {
  3773. if (!string.IsNullOrEmpty(dr["请求地标"].ToString()))
  3774. {
  3775. var infoList = infos.FindAll(o => o.MARKNUM.ToString() == dr["请求地标"].ToString() && o.ConnectStatus);
  3776. if (infoList.Count > 1)
  3777. {
  3778. var info = infoList.Find(o => o.RUNSTATUS_Cur == 0x40);//运行
  3779. bool b2 = true;
  3780. if (info != null)
  3781. {
  3782. s7.Write(dr["进入中DB"].ToString(), true);
  3783. if (dr.Table.Columns.Contains("进入互锁DB"))
  3784. {
  3785. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  3786. {
  3787. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  3788. if (result2 != null && result2.IsSuccess)
  3789. {
  3790. if (result2.Content == false)
  3791. {
  3792. DispatcherTool.ControlAGVBy1071(info.AGVNUM, 1);
  3793. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info.AGVNUM + ",进入互锁DB为false) ");
  3794. info.EmergencyFlag = true;
  3795. s7.Write(dr["进入中DB"].ToString(), false);
  3796. }
  3797. }
  3798. }
  3799. }
  3800. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  3801. if (result != null && result.IsSuccess)
  3802. {
  3803. if (result.Content == false)
  3804. {
  3805. DispatcherTool.ControlAGVBy1071(info.AGVNUM, 1);
  3806. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info.AGVNUM + ",急停) ");
  3807. info.EmergencyFlag = true;
  3808. }
  3809. }
  3810. b2 = false;
  3811. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:true(AGV在进入地标运行中,等待地标大于1台车),车号:" + info.AGVNUM);
  3812. }
  3813. if (b2)
  3814. {
  3815. info = infoList.Find(o => o.RUNSTATUS_Cur == 0x41); //暂停
  3816. if (info != null)
  3817. {
  3818. s7.Write(dr["进入中DB"].ToString(), false);
  3819. var result = s7.ReadBool(dr["允许DB"].ToString());
  3820. bool b = true;
  3821. if (result != null && result.IsSuccess)
  3822. {
  3823. bool bb = true;
  3824. if (dr.Table.Columns.Contains("进入互锁DB"))
  3825. {
  3826. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  3827. {
  3828. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  3829. if (result2 != null && result2.IsSuccess)
  3830. {
  3831. if (result2.Content == false)
  3832. {
  3833. bb = false;
  3834. }
  3835. }
  3836. else
  3837. {
  3838. bb = false;
  3839. }
  3840. }
  3841. }
  3842. if (result.Content == true && bb)
  3843. {
  3844. b = false;
  3845. // s7.Write(dr["进入中DB"].ToString(), true);
  3846. Thread.Sleep(1000);
  3847. s7.Write(dr["请求DB"].ToString(), false);
  3848. DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0, 10);
  3849. var temp = GlobalPara.ListReleaseObj.Find(o => o.AGVNUM == info.AGVNUM && info.ConnectStatus);
  3850. if (temp == null)
  3851. {
  3852. GlobalPara.ListReleaseObj.Add(info);
  3853. }
  3854. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info.AGVNUM + ",进入自动位) ");
  3855. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:true(PLC允许进入),车号:" + infoList[0].AGVNUM);
  3856. }
  3857. }
  3858. if (b)
  3859. {
  3860. s7.Write(dr["请求DB"].ToString(), true);
  3861. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["请求DB"].ToString() + ",写入数据:true(AGV在等待点地标,请求PLC进入),车号:" + infoList[0].AGVNUM);
  3862. }
  3863. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:true(AGV在进入地标运行中,等待地标大于1台车),车号:" + info.AGVNUM);
  3864. }
  3865. else
  3866. {
  3867. s7.Write(dr["进入中DB"].ToString(), false);
  3868. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  3869. if (dr.Table.Columns.Contains("进入互锁DB"))
  3870. {
  3871. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  3872. {
  3873. var info3 = infoList.Find(o => o.RUNSTATUS_Cur == 0x43);
  3874. if (info3 != null)
  3875. {
  3876. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  3877. if (result2 != null && result2.IsSuccess)
  3878. {
  3879. if (result2.Content == true && info3.EmergencyFlag && result.Content == true)
  3880. {
  3881. DispatcherTool.ControlAGVBy1071(info3.AGVNUM, 0);
  3882. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info3.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info3.AGVNUM + ",进入互锁DB为true) ");
  3883. info3.EmergencyFlag = false;
  3884. s7.Write(dr["进入中DB"].ToString(), true);
  3885. }
  3886. }
  3887. }
  3888. }
  3889. }
  3890. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:false(无AGV在进入地标运行,等待地标大于1台车),车号:" + info.AGVNUM);
  3891. }
  3892. }
  3893. else
  3894. {
  3895. }
  3896. }
  3897. else if (infoList.Count == 1)
  3898. {
  3899. if (infoList[0].RUNSTATUS_Cur == 0x40)
  3900. {
  3901. //if (dr["IP地址"].ToString() == "192.168.101.34")
  3902. //{
  3903. //add by cjs 20211126 for conminitite with plc begin-- 到位之后开始通讯
  3904. if (s7 != null)
  3905. {
  3906. string resultRead1 = "";
  3907. string resultRead2 = "";
  3908. if (dr.Table.Columns.Contains("SN1发送DB") && dr.Table.Columns.Contains("SN2发送DB"))
  3909. {
  3910. // PLCSql.PLCSqlSelect(infoList[0].AGVNUM.ToString(), "2", ref resultRead1, ref resultRead2); //查询数据
  3911. if (!string.IsNullOrEmpty(dr["SN1发送DB"].ToString()))
  3912. {
  3913. //OperateResult rs2 = s7.Write(dr["AGVDB"].ToString(), info.AGVNUM.ToString());
  3914. if (resultRead1 != null)
  3915. {
  3916. int s = resultRead1.Length;
  3917. OperateResult rs = s7.Write(dr["SN1发送DB"].ToString(), resultRead1.Trim());
  3918. }
  3919. }
  3920. if (!string.IsNullOrEmpty(dr["SN2发送DB"].ToString()) && resultRead2 != null)
  3921. {
  3922. OperateResult rs1 = s7.Write(dr["SN2发送DB"].ToString(), resultRead2.Trim());
  3923. }
  3924. // WriteFile("查询SN记录", "AGVID+" + info.AGVNUM.ToString() + "SN1DB+" + resultRead1 + "SN2DB+" + resultRead2 + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  3925. }
  3926. }
  3927. //add by cjs 20211126 for conminitite with plc end
  3928. //}
  3929. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  3930. if (result != null && result.IsSuccess)
  3931. {
  3932. if (result.Content == false)
  3933. {
  3934. DispatcherTool.ControlAGVBy1071(infoList[0].AGVNUM, 1);
  3935. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + infoList[0].MARKNUM + ",放行路线:0" + ", " + ",车号:" + infoList[0].AGVNUM + ",急停) ");
  3936. infoList[0].EmergencyFlag = true;
  3937. }
  3938. }
  3939. s7.Write(dr["进入中DB"].ToString(), true);
  3940. s7.Write(dr["请求DB"].ToString(), false);
  3941. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:true(AGV在进入地标运行中),车号:" + infoList[0].AGVNUM);
  3942. if (dr.Table.Columns.Contains("进入互锁DB"))
  3943. {
  3944. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  3945. {
  3946. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  3947. if (result2 != null && result2.IsSuccess)
  3948. {
  3949. if (result2.Content == false)
  3950. {
  3951. DispatcherTool.ControlAGVBy1071(infoList[0].AGVNUM, 1);
  3952. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + infoList[0].MARKNUM + ",放行路线:0" + ", " + ",车号:" + infoList[0].AGVNUM + ",进入互锁DB为false) ");
  3953. infoList[0].EmergencyFlag = true;
  3954. s7.Write(dr["进入中DB"].ToString(), false);
  3955. }
  3956. }
  3957. }
  3958. }
  3959. }
  3960. else if (infoList[0].RUNSTATUS_Cur == 0x41)
  3961. {
  3962. s7.Write(dr["进入中DB"].ToString(), false);
  3963. var result = s7.ReadBool(dr["允许DB"].ToString());
  3964. bool b = true;
  3965. if (result != null && result.IsSuccess)
  3966. {
  3967. bool bb = true;
  3968. if (dr.Table.Columns.Contains("进入互锁DB"))
  3969. {
  3970. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  3971. {
  3972. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  3973. if (result2 != null && result2.IsSuccess)
  3974. {
  3975. if (result2.Content == false)
  3976. {
  3977. bb = false;
  3978. }
  3979. }
  3980. else
  3981. {
  3982. bb = false;
  3983. }
  3984. }
  3985. }
  3986. if (result.Content == true && bb)
  3987. {
  3988. b = false;
  3989. s7.Write(dr["进入中DB"].ToString(), true);
  3990. Thread.Sleep(1000);
  3991. s7.Write(dr["请求DB"].ToString(), false);
  3992. DispatcherTool.ReleaseAgvOnStop(infoList[0].MARKNUM, 0, 10);
  3993. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + infoList[0].MARKNUM + ",放行路线:0" + ", " + ",车号:" + infoList[0].AGVNUM + ",进入自动位) ");
  3994. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:true(PLC允许进入),车号:" + infoList[0].AGVNUM);
  3995. }
  3996. }
  3997. if (b)
  3998. {
  3999. s7.Write(dr["请求DB"].ToString(), true);
  4000. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["请求DB"].ToString() + ",写入数据:true(AGV在等待点地标,请求PLC进入),车号:" + infoList[0].AGVNUM);
  4001. }
  4002. }
  4003. else
  4004. {
  4005. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  4006. s7.Write(dr["进入中DB"].ToString(), false);
  4007. if (dr.Table.Columns.Contains("进入互锁DB"))
  4008. {
  4009. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  4010. {
  4011. var info3 = infoList.Find(o => o.RUNSTATUS_Cur == 0x43);
  4012. if (info3 != null)
  4013. {
  4014. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  4015. if (result2 != null && result2.IsSuccess)
  4016. {
  4017. if (result2.Content == true && info3.EmergencyFlag && result.Content == true)
  4018. {
  4019. DispatcherTool.ControlAGVBy1071(info3.AGVNUM, 0);
  4020. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info3.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info3.AGVNUM + ",进入互锁DB为true) ");
  4021. info3.EmergencyFlag = false;
  4022. s7.Write(dr["进入中DB"].ToString(), true);
  4023. }
  4024. }
  4025. }
  4026. }
  4027. }
  4028. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:false(AGV状态不符合),车号:" + infoList[0].AGVNUM);
  4029. }
  4030. }
  4031. else
  4032. {
  4033. if (!IsInOtherInMarks)
  4034. {
  4035. s7.Write(dr["进入中DB"].ToString(), false);
  4036. }
  4037. s7.Write(dr["请求DB"].ToString(), false);
  4038. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:false(无车在进入地标运行),车号:无");
  4039. }
  4040. }
  4041. }
  4042. #endregion
  4043. bool IsInOtherOutMarks = false;
  4044. if (dr.Table.Columns.Contains("其他离开中地标"))
  4045. {
  4046. if (!string.IsNullOrEmpty(dr["其他离开中地标"].ToString()))
  4047. {
  4048. List<string> list = dr["其他离开中地标"].ToString().Split(';').ToList();
  4049. var infoList = infos.FindAll(o => list.Contains(o.MARKNUM.ToString()) && o.ConnectStatus && (o.RUNSTATUS_Cur == 0x40 || o.RUNSTATUS_Cur == 0x41));
  4050. if (infoList != null && infoList.Count >= 1)
  4051. {
  4052. IsInOtherOutMarks = true;
  4053. s7.Write(dr["离开DB"].ToString(), true);
  4054. }
  4055. else
  4056. {
  4057. // s7.Write(dr["离开DB"].ToString(), false);
  4058. }
  4059. }
  4060. }
  4061. #region 工位地标判断放行
  4062. if (!string.IsNullOrEmpty(dr["工位地标"].ToString()))
  4063. {
  4064. var t2 = listObjs.Find(o => o["Mark"].ToString() == dr["工位地标"].ToString());
  4065. if (t2 != null)
  4066. {
  4067. continue;
  4068. }
  4069. var infoList = infos.FindAll(o => o.MARKNUM.ToString() == dr["工位地标"].ToString() && o.ConnectStatus);
  4070. if (infoList != null && infoList.Count >= 1)
  4071. {
  4072. // foreach (var info in infoList)
  4073. var info = infoList.Find(o => o.RUNSTATUS_Cur == 0x41 || o.RUNSTATUS_Cur == 0x44); //停止
  4074. if (info != null)
  4075. {
  4076. if (!string.IsNullOrEmpty(dr["急停控制DB"].ToString()))
  4077. {
  4078. if (connet.IsSuccess)
  4079. {
  4080. var result11 = s7.ReadBool(dr["急停控制DB"].ToString()); //线束信号
  4081. if (result11 != null && result11.IsSuccess)
  4082. {
  4083. if (result11.Content == false)
  4084. {
  4085. info.EmergencyCar = false;
  4086. }
  4087. else
  4088. {
  4089. info.EmergencyCar = true;
  4090. }
  4091. }
  4092. }
  4093. }
  4094. if (!string.IsNullOrEmpty(dr["AGVDB"].ToString()))
  4095. {
  4096. var reulsttt = s7.ReadByte(dr["AGVDB"].ToString());
  4097. if (reulsttt != null && reulsttt.IsSuccess)
  4098. {
  4099. if (reulsttt.Content != (byte)info.AGVNUM)
  4100. {
  4101. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入车号数据:" + info.AGVNUM + ",地标:" + info.MARKNUM + "车号:" + info.AGVNUM + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur);
  4102. }
  4103. }
  4104. var resultt = s7.Write(dr["AGVDB"].ToString(), (byte)info.AGVNUM);
  4105. //if (info.RUNSTATUS_Cur == 0x41 || info.RUNSTATUS_Cur == 0x44)
  4106. {
  4107. var reulsttt2 = s7.ReadBool(dr["到位DB"].ToString());
  4108. if (reulsttt2 != null && reulsttt2.IsSuccess)
  4109. {
  4110. if (reulsttt2.Content != true)
  4111. {
  4112. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入到位数据:true,地标:" + info.MARKNUM + "车号:" + info.AGVNUM + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur);
  4113. }
  4114. }
  4115. resultt = s7.Write(dr["到位DB"].ToString(), true);
  4116. var reulsttt22 = s7.ReadBool(dr["离开DB"].ToString());
  4117. if (reulsttt22 != null && reulsttt22.IsSuccess)
  4118. {
  4119. if (reulsttt22.Content != false)
  4120. {
  4121. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入离开DB数据:false(到位),地标:" + info.MARKNUM + "车号:" + info.AGVNUM + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur);
  4122. }
  4123. }
  4124. if (!IsInOtherOutMarks)
  4125. {
  4126. resultt = s7.Write(dr["离开DB"].ToString(), false);
  4127. }
  4128. resultt = s7.Write(dr["离开DB"].ToString(), false);
  4129. // if (btn.BackColor != Color.Blue)
  4130. {
  4131. // btn.BackColor = Color.Yellow;
  4132. }
  4133. {
  4134. string resultRead1 = "", resultRead2 = "";
  4135. PLCSql.PLCSqlSelect(info.AGVNUM.ToString(), "2", ref resultRead1, ref resultRead2);
  4136. WriteFile("查询SN记录" + DateTime.Now.ToString("yyyy-MM-dd"), "AGVID+" + info.AGVNUM.ToString() + "SN1DB+" + resultRead1 + "SN2DB+" + resultRead2 + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  4137. OperateResult rs1 = s7.Write(dr["SN1发送DB"].ToString(), resultRead1);
  4138. if (!string.IsNullOrEmpty(dr["SN2发送DB"].ToString()))
  4139. {
  4140. OperateResult rs2 = s7.Write(dr["SN2发送DB"].ToString(), resultRead2);
  4141. }
  4142. if (!string.IsNullOrEmpty(dr["修改完成DB"].ToString()))
  4143. {
  4144. OperateResult rs = s7.Write(dr["修改完成DB"].ToString(), true);
  4145. }
  4146. }
  4147. string addr = dr["放行DB"].ToString();
  4148. var result = s7.ReadBool(addr);
  4149. if (result != null && result.IsSuccess)
  4150. {
  4151. bool bb = true;
  4152. if (dr.Table.Columns.Contains("离开互锁DB"))
  4153. {
  4154. if (!string.IsNullOrEmpty(dr["离开互锁DB"].ToString()))
  4155. {
  4156. var result2 = s7.ReadBool(dr["离开互锁DB"].ToString());
  4157. if (result2 != null && result2.IsSuccess)
  4158. {
  4159. if (result2.Content == false)
  4160. {
  4161. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "离开互锁DB值:" + result2.Content);
  4162. bb = false;
  4163. }
  4164. }
  4165. }
  4166. }
  4167. if (result.Content == true && bb )
  4168. {
  4169. var result2 = s7.ReadInt16(dr["放行路径DB"].ToString());
  4170. if (result2 != null && result2.IsSuccess) //加上允许放行信号 // && info.AllowReleaseFlag
  4171. {
  4172. // WriteFile("工位点记录-"+ dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"),"放行路径DB值:"+result2.Content);
  4173. if (result2.Content == (short.Parse("1")))//OK路线
  4174. {
  4175. //lock (afterRelease)
  4176. //{
  4177. // string tempStr = info.AGVNUM + ",400,64";
  4178. // if (!afterRelease.Contains(tempStr))
  4179. // {
  4180. // afterRelease.Add(tempStr);
  4181. // }
  4182. OperateResult rs1 = s7.Write(dr["SN1发送DB"].ToString(), "");
  4183. if (!string.IsNullOrEmpty(dr["SN2发送DB"].ToString()))
  4184. {
  4185. OperateResult rs2 = s7.Write(dr["SN2发送DB"].ToString(), "");
  4186. }
  4187. if (!string.IsNullOrEmpty(dr["修改完成DB"].ToString()))
  4188. {
  4189. OperateResult rs = s7.Write(dr["修改完成DB"].ToString(), false);
  4190. }
  4191. DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0, 10);
  4192. if (!string.IsNullOrEmpty(dr["请求地标"].ToString()))
  4193. {
  4194. var tempp = listObjs.Find(o => o["Mark"].ToString() == info.MARKNUM.ToString());
  4195. if (tempp == null)
  4196. {
  4197. JObject obj = new JObject();
  4198. obj["Mark"] = info.MARKNUM;
  4199. obj["AGVID"] = info.AGVNUM;
  4200. obj["Secs"] = 2000;
  4201. listObjs.Add(obj);
  4202. }
  4203. s7.Write(dr["到位DB"].ToString(), false);
  4204. s7.Write(dr["离开DB"].ToString(), true);
  4205. }
  4206. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info.AGVNUM + ",OK放行) ");
  4207. }
  4208. else if (result2.Content > 1) //NG路线
  4209. {
  4210. //lock (afterRelease)
  4211. //{
  4212. // string tempStr = info.AGVNUM + ",400,64";
  4213. // if (!afterRelease.Contains(tempStr))
  4214. // {
  4215. // afterRelease.Add(tempStr);
  4216. // }
  4217. //}
  4218. OperateResult rs1 = s7.Write(dr["SN1发送DB"].ToString(), "");
  4219. if (!string.IsNullOrEmpty(dr["SN2发送DB"].ToString()))
  4220. {
  4221. OperateResult rs2 = s7.Write(dr["SN2发送DB"].ToString(), "");
  4222. }
  4223. if (!string.IsNullOrEmpty(dr["修改完成DB"].ToString()))
  4224. {
  4225. OperateResult rs = s7.Write(dr["修改完成DB"].ToString(), false);
  4226. }
  4227. if (!string.IsNullOrEmpty(dr["修改完成DB"].ToString()))
  4228. {
  4229. OperateResult rs = s7.Write(dr["修改完成DB"].ToString(), false);
  4230. }
  4231. DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, int.Parse(dr["NG路线"].ToString()), 10);
  4232. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:" + dr["NG路线"].ToString() + ", " + ",车号:" + info.AGVNUM + ",NG放行) ");
  4233. }
  4234. var reulsttt33 = s7.ReadBool(dr["修改完成DB"].ToString());
  4235. if (reulsttt33 != null && reulsttt33.IsSuccess)
  4236. {
  4237. if (reulsttt22.Content != false)
  4238. {
  4239. OperateResult rs = s7.Write(dr["修改完成DB"].ToString(), false);
  4240. }
  4241. }
  4242. }
  4243. }
  4244. }
  4245. result = s7.ReadBool(dr["屏蔽DB"].ToString()); //收到屏蔽信号 直接放行
  4246. if (result != null && result.IsSuccess)
  4247. {
  4248. if (result.Content == true)
  4249. {
  4250. // DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0, 10);
  4251. info.AllowMesReleaseFlag = true;
  4252. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info.AGVNUM + ",屏蔽放行) ");
  4253. }
  4254. }
  4255. int AlarmCode = int.Parse(info.ALARMCODE);
  4256. if (AlarmCode == 1 || AlarmCode == 5 || AlarmCode == 9 || AlarmCode == 256)
  4257. {
  4258. s7.Write(dr["是否故障DB"].ToString(), false);
  4259. }
  4260. else
  4261. {
  4262. s7.Write(dr["是否故障DB"].ToString(), true);
  4263. CarAlarmFlag = true;
  4264. }
  4265. if (AlarmCode == 256) { AlarmCode = 1; }
  4266. //reulsttt = s7.ReadByte(dr["行驶状态DB"].ToString());
  4267. //if (reulsttt != null && reulsttt.IsSuccess)
  4268. //{
  4269. // if (reulsttt.Content != (byte)(AlarmCode - 1))
  4270. // {
  4271. // WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入行驶状态数据:" + ((AlarmCode - 1)) + ",地标:" + info.MARKNUM + "车号:" + info.AGVNUM + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur);
  4272. // }
  4273. //}
  4274. //s7.Write(dr["行驶状态DB"].ToString(), (byte)(AlarmCode - 1));
  4275. }
  4276. }
  4277. continue;
  4278. }
  4279. else
  4280. {
  4281. var info2 = infoList.Find(o => o.RUNSTATUS_Cur == 0x40); //运行
  4282. if (info2 != null)
  4283. {
  4284. info2.IsReachFlag = false;
  4285. info2.EmergencyFlag = false;
  4286. if (!string.IsNullOrEmpty(dr["急停控制DB"].ToString()))
  4287. {
  4288. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  4289. if (result != null && result.IsSuccess)
  4290. {
  4291. if (result.Content == false)
  4292. {
  4293. DispatcherTool.ControlAGVBy1071(info2.AGVNUM, 1);
  4294. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info2.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info2.AGVNUM + ",急停) ");
  4295. info2.EmergencyFlag = true;
  4296. }
  4297. }
  4298. }
  4299. if (!string.IsNullOrEmpty(dr["AGVDB"].ToString()))
  4300. {
  4301. var reulsttt = s7.ReadByte(dr["AGVDB"].ToString());
  4302. if (reulsttt != null && reulsttt.IsSuccess)
  4303. {
  4304. if (reulsttt.Content != (byte)info2.AGVNUM)
  4305. {
  4306. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入车号数据:" + info2.AGVNUM + ",地标:" + info2.MARKNUM + "车号:" + info2.AGVNUM + ",当前路线为:" + info2.ROUTENUM + ",状态为" + info2.RUNSTATUS_Cur);
  4307. }
  4308. }
  4309. var reulsttt2 = s7.ReadBool(dr["到位DB"].ToString());
  4310. if (reulsttt2 != null && reulsttt2.IsSuccess)
  4311. {
  4312. if (reulsttt2.Content != false)
  4313. {
  4314. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入到位数据:false,地标:" + info2.MARKNUM + "车号:" + info2.AGVNUM + ",当前路线为:" + info2.ROUTENUM + ",状态为" + info2.RUNSTATUS_Cur);
  4315. }
  4316. }
  4317. s7.Write(dr["AGVDB"].ToString(), (byte)info2.AGVNUM);
  4318. s7.Write(dr["到位DB"].ToString(), false);
  4319. var reulsttt22 = s7.ReadBool(dr["离开DB"].ToString());
  4320. if (reulsttt22 != null && reulsttt22.IsSuccess)
  4321. {
  4322. if (reulsttt22.Content != true)
  4323. {
  4324. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入离开DB数据:true(离站),地标:" + info2.MARKNUM + "车号:" + info2.AGVNUM + ",当前路线为:" + info2.ROUTENUM + ",状态为" + info2.RUNSTATUS_Cur);
  4325. }
  4326. }
  4327. s7.Write(dr["离开DB"].ToString(), true);
  4328. // if (btn.BackColor != Color.Blue)
  4329. {
  4330. // btn.BackColor = Color.Green;
  4331. }
  4332. int AlarmCode = int.Parse(info2.ALARMCODE);
  4333. if (AlarmCode == 1 || AlarmCode == 5 || AlarmCode == 9 || AlarmCode == 256)
  4334. {
  4335. s7.Write(dr["是否故障DB"].ToString(), false);
  4336. }
  4337. else
  4338. {
  4339. s7.Write(dr["是否故障DB"].ToString(), true);
  4340. CarAlarmFlag = true;
  4341. }
  4342. if (AlarmCode == 256) { AlarmCode = 1; }
  4343. // reulsttt = s7.ReadByte(dr["行驶状态DB"].ToString());
  4344. //if (reulsttt != null && reulsttt.IsSuccess)
  4345. //{
  4346. // if (reulsttt.Content != (byte)(AlarmCode - 1))
  4347. // {
  4348. // WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入行驶状态数据:" + ((AlarmCode - 1)) + ",地标:" + info2.MARKNUM + "车号:" + info2.AGVNUM + ",当前路线为:" + info2.ROUTENUM + ",状态为" + info2.RUNSTATUS_Cur);
  4349. // }
  4350. //}
  4351. // s7.Write(dr["行驶状态DB"].ToString(), (byte)(AlarmCode - 1));
  4352. if (dr.Table.Columns.Contains("离开互锁DB"))
  4353. {
  4354. if (!string.IsNullOrEmpty(dr["离开互锁DB"].ToString()))
  4355. {
  4356. var result2 = s7.ReadBool(dr["离开互锁DB"].ToString());
  4357. if (result2 != null && result2.IsSuccess)
  4358. {
  4359. if (result2.Content == false)
  4360. {
  4361. DispatcherTool.ControlAGVBy1071(info2.AGVNUM, 1); //不互锁 放行
  4362. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info2.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info2.AGVNUM + ",离开互锁DB值为false) ");
  4363. info2.EmergencyFlag = true;
  4364. }
  4365. }
  4366. }
  4367. }
  4368. if (dr.Table.Columns.Contains("请求出门DB"))
  4369. {
  4370. if (!string.IsNullOrEmpty(dr["请求出门DB"].ToString()))
  4371. {
  4372. s7.Write(dr["请求出门DB"].ToString(), false);
  4373. {
  4374. if (!GlobalPara.ReleaseMarkList.Contains(info2.MARKNUM.ToString()))
  4375. {
  4376. GlobalPara.ReleaseMarkList.Add(info2.MARKNUM.ToString());
  4377. WriteFile("点灭放行盒记录" + DateTime.Now.ToString("yyyy-MM-dd"), "工位放行成功,等待点灭,当前放行地标:" + info2.MARKNUM);
  4378. }
  4379. }
  4380. }
  4381. }
  4382. continue;
  4383. }
  4384. }
  4385. else
  4386. {
  4387. var info3 = infoList.Find(o => o.RUNSTATUS_Cur == 0x43);
  4388. if (info3 != null)
  4389. {
  4390. info3.IsReachFlag = false;
  4391. if (!string.IsNullOrEmpty(dr["SN1发送DB"].ToString()))
  4392. {
  4393. OperateResult rs1 = s7.Write(dr["SN1发送DB"].ToString(), "");
  4394. }
  4395. if (!string.IsNullOrEmpty(dr["SN2发送DB"].ToString()))
  4396. {
  4397. OperateResult rs2 = s7.Write(dr["SN2发送DB"].ToString(), "");
  4398. }
  4399. if (!string.IsNullOrEmpty(dr["修改完成DB"].ToString()))
  4400. {
  4401. OperateResult rs = s7.Write(dr["修改完成DB"].ToString(), false);
  4402. }
  4403. if (!string.IsNullOrEmpty("急停控制DB"))
  4404. {
  4405. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  4406. if (result != null && result.IsSuccess)
  4407. {
  4408. if (result.Content == true && info3.EmergencyFlag)
  4409. {
  4410. // DispatcherTool.ControlAGVBy1071(info3.AGVNUM, 0);
  4411. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info3.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info3.AGVNUM + ",离开互锁DB值为true) ");
  4412. }
  4413. }
  4414. }
  4415. if (!string.IsNullOrEmpty("AGVDB"))
  4416. {
  4417. var reulsttt = s7.ReadByte(dr["AGVDB"].ToString());
  4418. if (reulsttt != null && reulsttt.IsSuccess)
  4419. {
  4420. if (reulsttt.Content != (byte)info3.AGVNUM)
  4421. {
  4422. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入车号数据:" + info3.AGVNUM + ",地标:" + info3.MARKNUM + "车号:" + info3.AGVNUM + ",当前路线为:" + info3.ROUTENUM + ",状态为" + info3.RUNSTATUS_Cur);
  4423. }
  4424. }
  4425. s7.Write(dr["AGVDB"].ToString(), (byte)info3.AGVNUM);
  4426. var reulsttt2 = s7.ReadBool(dr["到位DB"].ToString());
  4427. if (reulsttt2 != null && reulsttt2.IsSuccess)
  4428. {
  4429. if (reulsttt2.Content != false)
  4430. {
  4431. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入到位数据:false,地标:" + info3.MARKNUM + "车号:" + info3.AGVNUM + ",当前路线为:" + info3.ROUTENUM + ",状态为" + info3.RUNSTATUS_Cur);
  4432. }
  4433. }
  4434. s7.Write(dr["到位DB"].ToString(), false);
  4435. var reulsttt22 = s7.ReadBool(dr["离开DB"].ToString());
  4436. if (reulsttt22 != null && reulsttt22.IsSuccess)
  4437. {
  4438. if (reulsttt22.Content != false)
  4439. {
  4440. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入离开DB数据:false(暂停),地标:" + info3.MARKNUM + "车号:" + info3.AGVNUM + ",当前路线为:" + info3.ROUTENUM + ",状态为" + info3.RUNSTATUS_Cur);
  4441. }
  4442. }
  4443. if (!IsInOtherOutMarks)
  4444. {
  4445. s7.Write(dr["离开DB"].ToString(), false);
  4446. s7.Write(dr["已离开DB"].ToString(), false);
  4447. }
  4448. // if (btn.BackColor != Color.Blue)
  4449. {
  4450. // btn.BackColor = Color.Red;
  4451. }
  4452. //if (result != null && result.IsSuccess)
  4453. //{
  4454. // if (result.Content == true && info3.EmergencyFlag)
  4455. // {
  4456. // DispatcherTool.ControlAGVBy1071(info3.AGVNUM, 0, 10);
  4457. // WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info3.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info3.AGVNUM + ",释放急停) ");
  4458. // info3.EmergencyFlag = false;
  4459. // }
  4460. //}
  4461. int AlarmCode = int.Parse(info3.ALARMCODE);
  4462. if (AlarmCode == 1 || AlarmCode == 5 || AlarmCode == 9 || AlarmCode == 256)
  4463. {
  4464. s7.Write(dr["是否故障DB"].ToString(), false);
  4465. }
  4466. else
  4467. {
  4468. s7.Write(dr["是否故障DB"].ToString(), true);
  4469. CarAlarmFlag = true;
  4470. }
  4471. if (AlarmCode == 256) { AlarmCode = 1; }
  4472. //reulsttt = s7.ReadByte(dr["行驶状态DB"].ToString());
  4473. //if (reulsttt != null && reulsttt.IsSuccess)
  4474. //{
  4475. // if (reulsttt.Content != (byte)(AlarmCode - 1))
  4476. // {
  4477. // WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入行驶状态数据:" + ((AlarmCode - 1)) + ",地标:" + info3.MARKNUM + "车号:" + info3.AGVNUM + ",当前路线为:" + info3.ROUTENUM + ",状态为" + info3.RUNSTATUS_Cur);
  4478. // }
  4479. //}
  4480. //s7.Write(dr["行驶状态DB"].ToString(), (byte)(AlarmCode - 1));
  4481. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  4482. if (dr.Table.Columns.Contains("离开互锁DB"))
  4483. {
  4484. if (!string.IsNullOrEmpty(dr["离开互锁DB"].ToString()))
  4485. {
  4486. var result2 = s7.ReadBool(dr["离开互锁DB"].ToString());
  4487. if (result2 != null && result2.IsSuccess)
  4488. {
  4489. if (result2.Content == true && result.Content == true && info3.EmergencyFlag)
  4490. {
  4491. DispatcherTool.ControlAGVBy1071(info3.AGVNUM, 0);
  4492. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info3.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info3.AGVNUM + ",离开互锁DB值为true) ");
  4493. info3.EmergencyFlag = false;
  4494. }
  4495. }
  4496. }
  4497. }
  4498. }
  4499. continue;
  4500. }
  4501. }
  4502. }
  4503. //if (btn.Text.Contains("("))
  4504. //{
  4505. // int textIndex = btn.Text.LastIndexOf("(");
  4506. // string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  4507. // btn.Text = orignName + "\n" + "(" + info.AGVNUM + ")";
  4508. //}
  4509. //else
  4510. //{
  4511. // btn.Text = btn.Text.Replace("\n", "") + "\n" + "(" + info.AGVNUM + ")";
  4512. //}
  4513. }
  4514. else
  4515. {
  4516. if (!string.IsNullOrEmpty(dr["AGVDB"].ToString()))
  4517. {
  4518. var reulsttt = s7.ReadByte(dr["AGVDB"].ToString());
  4519. if (reulsttt != null && reulsttt.IsSuccess)
  4520. {
  4521. if (reulsttt.Content != (byte)0)
  4522. {
  4523. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入车号数据:0,当前工位无AGV");
  4524. }
  4525. }
  4526. s7.Write(dr["AGVDB"].ToString(), (byte)0);
  4527. s7.Write(dr["是否故障DB"].ToString(), false);
  4528. //reulsttt = s7.ReadByte(dr["行驶状态DB"].ToString());
  4529. //if (reulsttt != null && reulsttt.IsSuccess)
  4530. //{
  4531. // if (reulsttt.Content != 0)
  4532. // {
  4533. // WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入行驶状态数据:0,当前工位无AGV");
  4534. // }
  4535. //}
  4536. //s7.Write(dr["行驶状态DB"].ToString(), (byte)0);
  4537. var reulsttt2 = s7.ReadBool(dr["到位DB"].ToString());
  4538. if (reulsttt2 != null && reulsttt2.IsSuccess)
  4539. {
  4540. if (reulsttt2.Content != false)
  4541. {
  4542. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入到位数据:false,当前工位无AGV");
  4543. }
  4544. }
  4545. s7.Write(dr["到位DB"].ToString(), false);
  4546. var reulsttt22 = s7.ReadBool(dr["离开DB"].ToString());
  4547. if (reulsttt22 != null && reulsttt22.IsSuccess)
  4548. {
  4549. if (reulsttt22.Content != false)
  4550. {
  4551. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入离开DB数据:false,无车离开");
  4552. }
  4553. }
  4554. if (!IsInOtherOutMarks)
  4555. {
  4556. s7.Write(dr["离开DB"].ToString(), false);
  4557. }
  4558. s7.Write(dr["已离开DB"].ToString(), false);
  4559. // if (btn.BackColor != Color.Blue)
  4560. {
  4561. // btn.BackColor = SystemColors.Control;
  4562. }
  4563. }
  4564. }
  4565. }
  4566. #endregion
  4567. #region 离开工位点
  4568. if (dr.Table.Columns.Contains("离开工位") && dr.Table.Columns.Contains("已离开DB"))
  4569. {
  4570. if (!string.IsNullOrEmpty(dr["离开工位"].ToString()))
  4571. {
  4572. var infoList = infos.FindAll(o => o.MARKNUM.ToString() == dr["离开工位"].ToString() && o.ConnectStatus && o.RUNSTATUS_Cur == 0x41); //&& (|| o.RUNSTATUS_Cur == 0x40)
  4573. if (infoList.Count >= 1)
  4574. {
  4575. WriteFile("离开工位记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "3333有车到达离开工位地标" + dr["离开工位"].ToString());
  4576. if (!string.IsNullOrEmpty(dr["已离开DB"].ToString()))
  4577. {
  4578. s7.Write(dr["已离开DB"].ToString(), true);
  4579. s7.Write(dr["离开DB"].ToString(), false);
  4580. Thread.Sleep(1200);
  4581. }
  4582. }
  4583. else
  4584. {
  4585. if (!string.IsNullOrEmpty(dr["已离开DB"].ToString()))
  4586. {
  4587. s7.Write(dr["已离开DB"].ToString(), false);
  4588. }
  4589. }
  4590. }
  4591. }
  4592. #endregion
  4593. }//));
  4594. }
  4595. }
  4596. catch (Exception)
  4597. {
  4598. // WriteFile("离开工位记录111-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "5555有车到达离开" + ex.Message);
  4599. }
  4600. finally
  4601. {
  4602. if (s7 != null)
  4603. {
  4604. s7.ConnectClose();
  4605. }
  4606. }
  4607. Thread.Sleep(500);
  4608. }
  4609. }
  4610. }
  4611. public void Test1()
  4612. {
  4613. while (true)
  4614. {
  4615. for (int i = 0; i < dtTestPLC.Rows.Count; i++)
  4616. {
  4617. if (dtTestPLC.Rows[i] != null)
  4618. {
  4619. DataRow dr = (DataRow)dtTestPLC.Rows[i];
  4620. Console.WriteLine(dr["ID"].ToString() + ":" + dr["工位名称"].ToString());
  4621. HslCommunication.Profinet.Siemens.SiemensS7Net s7 = null;
  4622. try
  4623. {
  4624. // Button btn = listAllBtns.Find(o => o.Tag.ToString() == dr["工位地标"].ToString());
  4625. // if (btn == null) { return; }
  4626. var infos = GlobalPara.AgvInfoDic.Values.ToList();
  4627. // btn.Invoke(new InvokeDelegate(delegate
  4628. // for (int i = 0; i < dtSKQPLC.Rows.Count; i++)
  4629. {
  4630. if (!string.IsNullOrEmpty(dr["PLC类型"].ToString()))
  4631. {
  4632. switch (dr["PLC类型"].ToString())
  4633. {
  4634. case "s1200":
  4635. s7 = new HslCommunication.Profinet.Siemens.SiemensS7Net(HslCommunication.Profinet.Siemens.SiemensPLCS.S1200,
  4636. dr["IP地址"].ToString());
  4637. break;
  4638. case "s1500":
  4639. s7 = new HslCommunication.Profinet.Siemens.SiemensS7Net(HslCommunication.Profinet.Siemens.SiemensPLCS.S1500,
  4640. dr["IP地址"].ToString());
  4641. break;
  4642. default:
  4643. s7 = new HslCommunication.Profinet.Siemens.SiemensS7Net(HslCommunication.Profinet.Siemens.SiemensPLCS.S1500,
  4644. dr["IP地址"].ToString());
  4645. break;
  4646. }
  4647. s7.Rack = (byte)0;
  4648. s7.Slot = (byte)1;
  4649. s7.ConnectTimeOut = 1000;
  4650. s7.ReceiveTimeOut = 1000;
  4651. var connet = s7.ConnectServer();
  4652. // s7.LogNet = new HslCommunication.LogNet.LogNetSingle("logs.txt");
  4653. if (!connet.IsSuccess)
  4654. {
  4655. GlobalPara.PLCTestDic.Add(dr["IP地址"].ToString(), s7);
  4656. //GlobalPara.listSKQPLC.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址请求连接失败");
  4657. WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址请求连接失败");
  4658. // return;
  4659. // PLCPackAlarm = true;
  4660. lock (AlarmPackStations)
  4661. {
  4662. if (!AlarmPackStations.Contains(dr["工位名称"].ToString()))
  4663. {
  4664. AlarmPackStations.Add(dr["工位名称"].ToString());
  4665. }
  4666. }
  4667. continue;
  4668. }
  4669. else
  4670. {
  4671. // PLCPackAlarm = false;
  4672. lock (AlarmPackStations)
  4673. {
  4674. if (AlarmPackStations.Contains(dr["工位名称"].ToString()))
  4675. {
  4676. AlarmPackStations.RemoveAll(o => o == dr["工位名称"].ToString());
  4677. }
  4678. }
  4679. }
  4680. if (dr.Table.Columns.Contains("PLC心跳DB") && dr.Table.Columns.Contains("中控心跳DB"))
  4681. {
  4682. if (!string.IsNullOrEmpty(dr["PLC心跳DB"].ToString()) && !string.IsNullOrEmpty(dr["中控心跳DB"].ToString()))
  4683. {
  4684. var result = s7.ReadBool(dr["PLC心跳DB"].ToString());
  4685. if (result != null && result.IsSuccess)
  4686. {
  4687. s7.Write(dr["中控心跳DB"].ToString(), result.Content);
  4688. }
  4689. }
  4690. }
  4691. bool IsInOtherInMarks = false;
  4692. if (dr.Table.Columns.Contains("其他进入中地标"))
  4693. {
  4694. if (!string.IsNullOrEmpty(dr["其他进入中地标"].ToString()))
  4695. {
  4696. List<string> list = dr["其他进入中地标"].ToString().Split(';').ToList();
  4697. var infoList = infos.FindAll(o => list.Contains(o.MARKNUM.ToString()) && o.ConnectStatus && (o.RUNSTATUS_Cur == 0x40 || o.RUNSTATUS_Cur == 0x41));
  4698. if (infoList != null && infoList.Count >= 1)
  4699. {
  4700. IsInOtherInMarks = true;
  4701. s7.Write(dr["进入中DB"].ToString(), true);
  4702. }
  4703. else
  4704. {
  4705. // s7.Write(dr["进入中DB"].ToString(), false);
  4706. }
  4707. }
  4708. }
  4709. #region 请求地标判断放行
  4710. if (!string.IsNullOrEmpty(dr["请求地标"].ToString()))
  4711. {
  4712. var infoList = infos.FindAll(o => o.MARKNUM.ToString() == dr["请求地标"].ToString() && o.ConnectStatus);
  4713. if (infoList.Count > 1)
  4714. {
  4715. var info = infoList.Find(o => o.RUNSTATUS_Cur == 0x40);//运行
  4716. bool b2 = true;
  4717. if (info != null)
  4718. {
  4719. s7.Write(dr["进入中DB"].ToString(), true);
  4720. if (dr.Table.Columns.Contains("进入互锁DB"))
  4721. {
  4722. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  4723. {
  4724. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  4725. if (result2 != null && result2.IsSuccess)
  4726. {
  4727. if (result2.Content == false)
  4728. {
  4729. DispatcherTool.ControlAGVBy1071(info.AGVNUM, 1);
  4730. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info.AGVNUM + ",进入互锁DB为false) ");
  4731. info.EmergencyFlag = true;
  4732. s7.Write(dr["进入中DB"].ToString(), false);
  4733. }
  4734. }
  4735. }
  4736. }
  4737. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  4738. if (result != null && result.IsSuccess)
  4739. {
  4740. if (result.Content == false)
  4741. {
  4742. DispatcherTool.ControlAGVBy1071(info.AGVNUM, 1);
  4743. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info.AGVNUM + ",急停) ");
  4744. info.EmergencyFlag = true;
  4745. }
  4746. }
  4747. b2 = false;
  4748. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:true(AGV在进入地标运行中,等待地标大于1台车),车号:" + info.AGVNUM);
  4749. }
  4750. if (b2)
  4751. {
  4752. info = infoList.Find(o => o.RUNSTATUS_Cur == 0x41); //暂停
  4753. if (info != null)
  4754. {
  4755. s7.Write(dr["进入中DB"].ToString(), false);
  4756. var result = s7.ReadBool(dr["允许DB"].ToString());
  4757. bool b = true;
  4758. if (result != null && result.IsSuccess)
  4759. {
  4760. bool bb = true;
  4761. if (dr.Table.Columns.Contains("进入互锁DB"))
  4762. {
  4763. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  4764. {
  4765. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  4766. if (result2 != null && result2.IsSuccess)
  4767. {
  4768. if (result2.Content == false)
  4769. {
  4770. bb = false;
  4771. }
  4772. }
  4773. else
  4774. {
  4775. bb = false;
  4776. }
  4777. }
  4778. }
  4779. if (result.Content == true && bb)
  4780. {
  4781. b = false;
  4782. s7.Write(dr["进入中DB"].ToString(), true);
  4783. Thread.Sleep(1000);
  4784. s7.Write(dr["请求DB"].ToString(), false);
  4785. DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0, 10);
  4786. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info.AGVNUM + ",进入自动位) ");
  4787. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:true(PLC允许进入),车号:" + infoList[0].AGVNUM);
  4788. }
  4789. }
  4790. if (b)
  4791. {
  4792. s7.Write(dr["请求DB"].ToString(), true);
  4793. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["请求DB"].ToString() + ",写入数据:true(AGV在等待点地标,请求PLC进入),车号:" + infoList[0].AGVNUM);
  4794. }
  4795. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:true(AGV在进入地标运行中,等待地标大于1台车),车号:" + info.AGVNUM);
  4796. }
  4797. else
  4798. {
  4799. s7.Write(dr["进入中DB"].ToString(), false);
  4800. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  4801. if (dr.Table.Columns.Contains("进入互锁DB"))
  4802. {
  4803. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  4804. {
  4805. var info3 = infoList.Find(o => o.RUNSTATUS_Cur == 0x43);
  4806. if (info3 != null)
  4807. {
  4808. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  4809. if (result2 != null && result2.IsSuccess)
  4810. {
  4811. if (result2.Content == true && info3.EmergencyFlag && result.Content == true)
  4812. {
  4813. DispatcherTool.ControlAGVBy1071(info3.AGVNUM, 0);
  4814. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info3.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info3.AGVNUM + ",进入互锁DB为true) ");
  4815. info3.EmergencyFlag = false;
  4816. s7.Write(dr["进入中DB"].ToString(), true);
  4817. }
  4818. }
  4819. }
  4820. }
  4821. }
  4822. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:false(无AGV在进入地标运行,等待地标大于1台车),车号:" + info.AGVNUM);
  4823. }
  4824. }
  4825. else
  4826. {
  4827. }
  4828. }
  4829. else if (infoList.Count == 1)
  4830. {
  4831. if (infoList[0].RUNSTATUS_Cur == 0x40)
  4832. {
  4833. //if (dr["IP地址"].ToString() == "192.168.101.34")
  4834. //{
  4835. //add by cjs 20211126 for conminitite with plc begin-- 到位之后开始通讯
  4836. if (s7 != null)
  4837. {
  4838. string resultRead1 = "";
  4839. string resultRead2 = "";
  4840. if (dr.Table.Columns.Contains("SN1发送DB") && dr.Table.Columns.Contains("SN2发送DB"))
  4841. {
  4842. // PLCSql.PLCSqlSelect(infoList[0].AGVNUM.ToString(), "2", ref resultRead1, ref resultRead2); //查询数据
  4843. if (!string.IsNullOrEmpty(dr["SN1发送DB"].ToString()))
  4844. {
  4845. //OperateResult rs2 = s7.Write(dr["AGVDB"].ToString(), info.AGVNUM.ToString());
  4846. if (resultRead1 != null)
  4847. {
  4848. int s = resultRead1.Length;
  4849. OperateResult rs = s7.Write(dr["SN1发送DB"].ToString(), resultRead1.Trim());
  4850. }
  4851. }
  4852. if (!string.IsNullOrEmpty(dr["SN2发送DB"].ToString()) && resultRead2 != null)
  4853. {
  4854. OperateResult rs1 = s7.Write(dr["SN2发送DB"].ToString(), resultRead2.Trim());
  4855. }
  4856. // WriteFile("查询SN记录", "AGVID+" + info.AGVNUM.ToString() + "SN1DB+" + resultRead1 + "SN2DB+" + resultRead2 + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  4857. }
  4858. }
  4859. //add by cjs 20211126 for conminitite with plc end
  4860. //}
  4861. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  4862. if (result != null && result.IsSuccess)
  4863. {
  4864. if (result.Content == false)
  4865. {
  4866. DispatcherTool.ControlAGVBy1071(infoList[0].AGVNUM, 1);
  4867. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + infoList[0].MARKNUM + ",放行路线:0" + ", " + ",车号:" + infoList[0].AGVNUM + ",急停) ");
  4868. infoList[0].EmergencyFlag = true;
  4869. }
  4870. }
  4871. s7.Write(dr["进入中DB"].ToString(), true);
  4872. s7.Write(dr["请求DB"].ToString(), false);
  4873. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:true(AGV在进入地标运行中),车号:" + infoList[0].AGVNUM);
  4874. if (dr.Table.Columns.Contains("进入互锁DB"))
  4875. {
  4876. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  4877. {
  4878. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  4879. if (result2 != null && result2.IsSuccess)
  4880. {
  4881. if (result2.Content == false)
  4882. {
  4883. DispatcherTool.ControlAGVBy1071(infoList[0].AGVNUM, 1);
  4884. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + infoList[0].MARKNUM + ",放行路线:0" + ", " + ",车号:" + infoList[0].AGVNUM + ",进入互锁DB为false) ");
  4885. infoList[0].EmergencyFlag = true;
  4886. s7.Write(dr["进入中DB"].ToString(), false);
  4887. }
  4888. }
  4889. }
  4890. }
  4891. }
  4892. else if (infoList[0].RUNSTATUS_Cur == 0x41)
  4893. {
  4894. s7.Write(dr["进入中DB"].ToString(), false);
  4895. var result = s7.ReadBool(dr["允许DB"].ToString());
  4896. bool b = true;
  4897. if (result != null && result.IsSuccess)
  4898. {
  4899. bool bb = true;
  4900. if (dr.Table.Columns.Contains("进入互锁DB"))
  4901. {
  4902. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  4903. {
  4904. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  4905. if (result2 != null && result2.IsSuccess)
  4906. {
  4907. if (result2.Content == false)
  4908. {
  4909. bb = false;
  4910. }
  4911. }
  4912. else
  4913. {
  4914. bb = false;
  4915. }
  4916. }
  4917. }
  4918. if (result.Content == true && bb)
  4919. {
  4920. b = false;
  4921. s7.Write(dr["进入中DB"].ToString(), true);
  4922. Thread.Sleep(1000);
  4923. s7.Write(dr["请求DB"].ToString(), false);
  4924. DispatcherTool.ReleaseAgvOnStop(infoList[0].MARKNUM, 0, 10);
  4925. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + infoList[0].MARKNUM + ",放行路线:0" + ", " + ",车号:" + infoList[0].AGVNUM + ",进入自动位) ");
  4926. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:true(PLC允许进入),车号:" + infoList[0].AGVNUM);
  4927. }
  4928. }
  4929. if (b)
  4930. {
  4931. s7.Write(dr["请求DB"].ToString(), true);
  4932. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["请求DB"].ToString() + ",写入数据:true(AGV在等待点地标,请求PLC进入),车号:" + infoList[0].AGVNUM);
  4933. }
  4934. }
  4935. else
  4936. {
  4937. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  4938. s7.Write(dr["进入中DB"].ToString(), false);
  4939. if (dr.Table.Columns.Contains("进入互锁DB"))
  4940. {
  4941. if (!string.IsNullOrEmpty(dr["进入互锁DB"].ToString()))
  4942. {
  4943. var info3 = infoList.Find(o => o.RUNSTATUS_Cur == 0x43);
  4944. if (info3 != null)
  4945. {
  4946. var result2 = s7.ReadBool(dr["进入互锁DB"].ToString());
  4947. if (result2 != null && result2.IsSuccess)
  4948. {
  4949. if (result2.Content == true && info3.EmergencyFlag && result.Content == true)
  4950. {
  4951. DispatcherTool.ControlAGVBy1071(info3.AGVNUM, 0);
  4952. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info3.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info3.AGVNUM + ",进入互锁DB为true) ");
  4953. info3.EmergencyFlag = false;
  4954. s7.Write(dr["进入中DB"].ToString(), true);
  4955. }
  4956. }
  4957. }
  4958. }
  4959. }
  4960. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:false(AGV状态不符合),车号:" + infoList[0].AGVNUM);
  4961. }
  4962. }
  4963. else
  4964. {
  4965. if (!IsInOtherInMarks)
  4966. {
  4967. s7.Write(dr["进入中DB"].ToString(), false);
  4968. }
  4969. s7.Write(dr["请求DB"].ToString(), false);
  4970. // WriteFile("SKQPLC对接记录" + DateTime.Now.ToString("yyyy-MM-dd") + "" + dr["IP地址"].ToString() + "", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 向PLC(" + dr["IP地址"].ToString() + ")的地址" + dr["进入中DB"].ToString() + ",写入数据:false(无车在进入地标运行),车号:无");
  4971. }
  4972. }
  4973. #endregion
  4974. bool IsInOtherOutMarks = false;
  4975. if (dr.Table.Columns.Contains("其他离开中地标"))
  4976. {
  4977. if (!string.IsNullOrEmpty(dr["其他离开中地标"].ToString()))
  4978. {
  4979. List<string> list = dr["其他离开中地标"].ToString().Split(';').ToList();
  4980. var infoList = infos.FindAll(o => list.Contains(o.MARKNUM.ToString()) && o.ConnectStatus && (o.RUNSTATUS_Cur == 0x40 || o.RUNSTATUS_Cur == 0x41));
  4981. if (infoList != null && infoList.Count >= 1)
  4982. {
  4983. IsInOtherOutMarks = true;
  4984. s7.Write(dr["离开DB"].ToString(), true);
  4985. }
  4986. else
  4987. {
  4988. // s7.Write(dr["离开DB"].ToString(), false);
  4989. }
  4990. }
  4991. }
  4992. #region 工位地标判断放行
  4993. if (!string.IsNullOrEmpty(dr["工位地标"].ToString()))
  4994. {
  4995. var t2 = listObjs.Find(o => o["Mark"].ToString() == dr["工位地标"].ToString());
  4996. if (t2 != null)
  4997. {
  4998. continue;
  4999. }
  5000. var infoList = infos.FindAll(o => o.MARKNUM.ToString() == dr["工位地标"].ToString() && o.ConnectStatus);
  5001. if (infoList != null && infoList.Count >= 1)
  5002. {
  5003. // foreach (var info in infoList)
  5004. var info = infoList.Find(o => o.RUNSTATUS_Cur == 0x41 || o.RUNSTATUS_Cur == 0x44); //停止
  5005. if (info != null)
  5006. {
  5007. if (!string.IsNullOrEmpty(dr["急停控制DB"].ToString()))
  5008. {
  5009. var result11 = s7.ReadBool(dr["急停控制DB"].ToString()); //线束信号
  5010. if (result11 != null && result11.IsSuccess)
  5011. {
  5012. if (result11.Content == false)
  5013. {
  5014. info.EmergencyCar = false;
  5015. }
  5016. else
  5017. {
  5018. info.EmergencyCar = true;
  5019. }
  5020. }
  5021. }
  5022. if (!string.IsNullOrEmpty(dr["AGVDB"].ToString()))
  5023. {
  5024. var reulsttt = s7.ReadByte(dr["AGVDB"].ToString());
  5025. if (reulsttt != null && reulsttt.IsSuccess)
  5026. {
  5027. if (reulsttt.Content != (byte)info.AGVNUM)
  5028. {
  5029. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入车号数据:" + info.AGVNUM + ",地标:" + info.MARKNUM + "车号:" + info.AGVNUM + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur);
  5030. }
  5031. }
  5032. var resultt = s7.Write(dr["AGVDB"].ToString(), (byte)info.AGVNUM);
  5033. //if (info.RUNSTATUS_Cur == 0x41 || info.RUNSTATUS_Cur == 0x44)
  5034. {
  5035. var reulsttt2 = s7.ReadBool(dr["到位DB"].ToString());
  5036. if (reulsttt2 != null && reulsttt2.IsSuccess)
  5037. {
  5038. if (reulsttt2.Content != true)
  5039. {
  5040. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入到位数据:true,地标:" + info.MARKNUM + "车号:" + info.AGVNUM + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur);
  5041. }
  5042. }
  5043. resultt = s7.Write(dr["到位DB"].ToString(), true);
  5044. var reulsttt22 = s7.ReadBool(dr["离开DB"].ToString());
  5045. if (reulsttt22 != null && reulsttt22.IsSuccess)
  5046. {
  5047. if (reulsttt22.Content != false)
  5048. {
  5049. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入离开DB数据:false(到位),地标:" + info.MARKNUM + "车号:" + info.AGVNUM + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur);
  5050. }
  5051. }
  5052. if (!IsInOtherOutMarks)
  5053. {
  5054. resultt = s7.Write(dr["离开DB"].ToString(), false);
  5055. }
  5056. resultt = s7.Write(dr["离开DB"].ToString(), false);
  5057. // if (btn.BackColor != Color.Blue)
  5058. {
  5059. // btn.BackColor = Color.Yellow;
  5060. }
  5061. string addr = dr["放行DB"].ToString();
  5062. var result = s7.ReadBool(addr);
  5063. if (result != null && result.IsSuccess)
  5064. {
  5065. bool bb = true;
  5066. if (dr.Table.Columns.Contains("离开互锁DB"))
  5067. {
  5068. if (!string.IsNullOrEmpty(dr["离开互锁DB"].ToString()))
  5069. {
  5070. var result2 = s7.ReadBool(dr["离开互锁DB"].ToString());
  5071. if (result2 != null && result2.IsSuccess)
  5072. {
  5073. if (result2.Content == false)
  5074. {
  5075. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "离开互锁DB值:" + result2.Content);
  5076. bb = false;
  5077. }
  5078. }
  5079. }
  5080. }
  5081. if (result.Content == true && bb )
  5082. {
  5083. var result2 = s7.ReadInt16(dr["放行路径DB"].ToString());
  5084. if (result2 != null && result2.IsSuccess) //加上允许放行信号 // && info.AllowReleaseFlag
  5085. {
  5086. // WriteFile("工位点记录-"+ dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"),"放行路径DB值:"+result2.Content);
  5087. if (result2.Content == (short.Parse("1")))//OK路线
  5088. {
  5089. //lock (afterRelease)
  5090. //{
  5091. // string tempStr = info.AGVNUM + ",400,64";
  5092. // if (!afterRelease.Contains(tempStr))
  5093. // {
  5094. // afterRelease.Add(tempStr);
  5095. // }
  5096. OperateResult rs1 = s7.Write(dr["SN1发送DB"].ToString(), "");
  5097. if (!string.IsNullOrEmpty(dr["SN2发送DB"].ToString()))
  5098. {
  5099. OperateResult rs2 = s7.Write(dr["SN2发送DB"].ToString(), "");
  5100. }
  5101. if (!string.IsNullOrEmpty(dr["修改完成DB"].ToString()))
  5102. {
  5103. OperateResult rs = s7.Write(dr["修改完成DB"].ToString(), false);
  5104. }
  5105. DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0, 10);
  5106. if (!string.IsNullOrEmpty(dr["请求地标"].ToString()))
  5107. {
  5108. var tempp = listObjs.Find(o => o["Mark"].ToString() == info.MARKNUM.ToString());
  5109. if (tempp == null)
  5110. {
  5111. JObject obj = new JObject();
  5112. obj["Mark"] = info.MARKNUM;
  5113. obj["AGVID"] = info.AGVNUM;
  5114. obj["Secs"] = 2000;
  5115. listObjs.Add(obj);
  5116. }
  5117. s7.Write(dr["到位DB"].ToString(), false);
  5118. s7.Write(dr["离开DB"].ToString(), true);
  5119. }
  5120. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info.AGVNUM + ",OK放行) ");
  5121. }
  5122. else if (result2.Content > 1) //NG路线
  5123. {
  5124. //lock (afterRelease)
  5125. //{
  5126. // string tempStr = info.AGVNUM + ",400,64";
  5127. // if (!afterRelease.Contains(tempStr))
  5128. // {
  5129. // afterRelease.Add(tempStr);
  5130. // }
  5131. //}
  5132. OperateResult rs1 = s7.Write(dr["SN1发送DB"].ToString(), "");
  5133. if (!string.IsNullOrEmpty(dr["SN2发送DB"].ToString()))
  5134. {
  5135. OperateResult rs2 = s7.Write(dr["SN2发送DB"].ToString(), "");
  5136. }
  5137. if (!string.IsNullOrEmpty(dr["修改完成DB"].ToString()))
  5138. {
  5139. OperateResult rs = s7.Write(dr["修改完成DB"].ToString(), false);
  5140. }
  5141. if (!string.IsNullOrEmpty(dr["修改完成DB"].ToString()))
  5142. {
  5143. OperateResult rs = s7.Write(dr["修改完成DB"].ToString(), false);
  5144. }
  5145. DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, int.Parse(dr["NG路线"].ToString()), 10);
  5146. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:" + dr["NG路线"].ToString() + ", " + ",车号:" + info.AGVNUM + ",NG放行) ");
  5147. }
  5148. var reulsttt33 = s7.ReadBool(dr["修改完成DB"].ToString());
  5149. if (reulsttt33 != null && reulsttt33.IsSuccess)
  5150. {
  5151. if (reulsttt22.Content != false)
  5152. {
  5153. OperateResult rs = s7.Write(dr["修改完成DB"].ToString(), false);
  5154. }
  5155. }
  5156. }
  5157. }
  5158. }
  5159. result = s7.ReadBool(dr["屏蔽DB"].ToString()); //收到屏蔽信号 直接放行
  5160. if (result != null && result.IsSuccess)
  5161. {
  5162. if (result.Content == true)
  5163. {
  5164. // DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0, 10);
  5165. info.AllowMesReleaseFlag = true;
  5166. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info.AGVNUM + ",屏蔽放行) ");
  5167. }
  5168. }
  5169. int AlarmCode = int.Parse(info.ALARMCODE);
  5170. if (AlarmCode == 1 || AlarmCode == 5 || AlarmCode == 9 || AlarmCode == 256)
  5171. {
  5172. s7.Write(dr["是否故障DB"].ToString(), false);
  5173. }
  5174. else
  5175. {
  5176. s7.Write(dr["是否故障DB"].ToString(), true);
  5177. CarAlarmFlag = true;
  5178. }
  5179. if (AlarmCode == 256) { AlarmCode = 1; }
  5180. reulsttt = s7.ReadByte(dr["行驶状态DB"].ToString());
  5181. if (reulsttt != null && reulsttt.IsSuccess)
  5182. {
  5183. if (reulsttt.Content != (byte)(AlarmCode - 1))
  5184. {
  5185. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入行驶状态数据:" + ((AlarmCode - 1)) + ",地标:" + info.MARKNUM + "车号:" + info.AGVNUM + ",当前路线为:" + info.ROUTENUM + ",状态为" + info.RUNSTATUS_Cur);
  5186. }
  5187. }
  5188. s7.Write(dr["行驶状态DB"].ToString(), (byte)(AlarmCode - 1));
  5189. }
  5190. }
  5191. continue;
  5192. }
  5193. else
  5194. {
  5195. var info2 = infoList.Find(o => o.RUNSTATUS_Cur == 0x40); //运行
  5196. if (info2 != null)
  5197. {
  5198. info2.IsReachFlag = false;
  5199. info2.EmergencyFlag = false;
  5200. if (!string.IsNullOrEmpty(dr["急停控制DB"].ToString()))
  5201. {
  5202. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  5203. if (result != null && result.IsSuccess)
  5204. {
  5205. if (result.Content == false)
  5206. {
  5207. DispatcherTool.ControlAGVBy1071(info2.AGVNUM, 1);
  5208. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info2.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info2.AGVNUM + ",急停) ");
  5209. info2.EmergencyFlag = true;
  5210. }
  5211. }
  5212. }
  5213. if (!string.IsNullOrEmpty(dr["AGVDB"].ToString()))
  5214. {
  5215. var reulsttt = s7.ReadByte(dr["AGVDB"].ToString());
  5216. if (reulsttt != null && reulsttt.IsSuccess)
  5217. {
  5218. if (reulsttt.Content != (byte)info2.AGVNUM)
  5219. {
  5220. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入车号数据:" + info2.AGVNUM + ",地标:" + info2.MARKNUM + "车号:" + info2.AGVNUM + ",当前路线为:" + info2.ROUTENUM + ",状态为" + info2.RUNSTATUS_Cur);
  5221. }
  5222. }
  5223. var reulsttt2 = s7.ReadBool(dr["到位DB"].ToString());
  5224. if (reulsttt2 != null && reulsttt2.IsSuccess)
  5225. {
  5226. if (reulsttt2.Content != false)
  5227. {
  5228. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入到位数据:false,地标:" + info2.MARKNUM + "车号:" + info2.AGVNUM + ",当前路线为:" + info2.ROUTENUM + ",状态为" + info2.RUNSTATUS_Cur);
  5229. }
  5230. }
  5231. s7.Write(dr["AGVDB"].ToString(), (byte)info2.AGVNUM);
  5232. s7.Write(dr["到位DB"].ToString(), false);
  5233. var reulsttt22 = s7.ReadBool(dr["离开DB"].ToString());
  5234. if (reulsttt22 != null && reulsttt22.IsSuccess)
  5235. {
  5236. if (reulsttt22.Content != true)
  5237. {
  5238. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入离开DB数据:true(离站),地标:" + info2.MARKNUM + "车号:" + info2.AGVNUM + ",当前路线为:" + info2.ROUTENUM + ",状态为" + info2.RUNSTATUS_Cur);
  5239. }
  5240. }
  5241. s7.Write(dr["离开DB"].ToString(), true);
  5242. // if (btn.BackColor != Color.Blue)
  5243. {
  5244. // btn.BackColor = Color.Green;
  5245. }
  5246. int AlarmCode = int.Parse(info2.ALARMCODE);
  5247. if (AlarmCode == 1 || AlarmCode == 5 || AlarmCode == 9 || AlarmCode == 256)
  5248. {
  5249. s7.Write(dr["是否故障DB"].ToString(), false);
  5250. }
  5251. else
  5252. {
  5253. s7.Write(dr["是否故障DB"].ToString(), true);
  5254. CarAlarmFlag = true;
  5255. }
  5256. if (AlarmCode == 256) { AlarmCode = 1; }
  5257. // reulsttt = s7.ReadByte(dr["行驶状态DB"].ToString());
  5258. if (reulsttt != null && reulsttt.IsSuccess)
  5259. {
  5260. if (reulsttt.Content != (byte)(AlarmCode - 1))
  5261. {
  5262. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入行驶状态数据:" + ((AlarmCode - 1)) + ",地标:" + info2.MARKNUM + "车号:" + info2.AGVNUM + ",当前路线为:" + info2.ROUTENUM + ",状态为" + info2.RUNSTATUS_Cur);
  5263. }
  5264. }
  5265. // s7.Write(dr["行驶状态DB"].ToString(), (byte)(AlarmCode - 1));
  5266. if (dr.Table.Columns.Contains("离开互锁DB"))
  5267. {
  5268. if (!string.IsNullOrEmpty(dr["离开互锁DB"].ToString()))
  5269. {
  5270. var result2 = s7.ReadBool(dr["离开互锁DB"].ToString());
  5271. if (result2 != null && result2.IsSuccess)
  5272. {
  5273. if (result2.Content == false)
  5274. {
  5275. DispatcherTool.ControlAGVBy1071(info2.AGVNUM, 1); //不互锁 放行
  5276. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info2.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info2.AGVNUM + ",离开互锁DB值为false) ");
  5277. info2.EmergencyFlag = true;
  5278. }
  5279. }
  5280. }
  5281. }
  5282. continue;
  5283. }
  5284. }
  5285. else
  5286. {
  5287. var info3 = infoList.Find(o => o.RUNSTATUS_Cur == 0x43);
  5288. if (info3 != null)
  5289. {
  5290. info3.IsReachFlag = false;
  5291. if (!string.IsNullOrEmpty(dr["SN1发送DB"].ToString()))
  5292. {
  5293. OperateResult rs1 = s7.Write(dr["SN1发送DB"].ToString(), "");
  5294. }
  5295. if (!string.IsNullOrEmpty(dr["SN2发送DB"].ToString()))
  5296. {
  5297. OperateResult rs2 = s7.Write(dr["SN2发送DB"].ToString(), "");
  5298. }
  5299. if (!string.IsNullOrEmpty(dr["修改完成DB"].ToString()))
  5300. {
  5301. OperateResult rs = s7.Write(dr["修改完成DB"].ToString(), false);
  5302. }
  5303. if (!string.IsNullOrEmpty("急停控制DB"))
  5304. {
  5305. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  5306. if (result != null && result.IsSuccess)
  5307. {
  5308. if (result.Content == true && info3.EmergencyFlag)
  5309. {
  5310. // DispatcherTool.ControlAGVBy1071(info3.AGVNUM, 0);
  5311. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info3.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info3.AGVNUM + ",离开互锁DB值为true) ");
  5312. }
  5313. }
  5314. }
  5315. if (!string.IsNullOrEmpty("AGVDB"))
  5316. {
  5317. var reulsttt = s7.ReadByte(dr["AGVDB"].ToString());
  5318. if (reulsttt != null && reulsttt.IsSuccess)
  5319. {
  5320. if (reulsttt.Content != (byte)info3.AGVNUM)
  5321. {
  5322. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入车号数据:" + info3.AGVNUM + ",地标:" + info3.MARKNUM + "车号:" + info3.AGVNUM + ",当前路线为:" + info3.ROUTENUM + ",状态为" + info3.RUNSTATUS_Cur);
  5323. }
  5324. }
  5325. s7.Write(dr["AGVDB"].ToString(), (byte)info3.AGVNUM);
  5326. var reulsttt2 = s7.ReadBool(dr["到位DB"].ToString());
  5327. if (reulsttt2 != null && reulsttt2.IsSuccess)
  5328. {
  5329. if (reulsttt2.Content != false)
  5330. {
  5331. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入到位数据:false,地标:" + info3.MARKNUM + "车号:" + info3.AGVNUM + ",当前路线为:" + info3.ROUTENUM + ",状态为" + info3.RUNSTATUS_Cur);
  5332. }
  5333. }
  5334. s7.Write(dr["到位DB"].ToString(), false);
  5335. var reulsttt22 = s7.ReadBool(dr["离开DB"].ToString());
  5336. if (reulsttt22 != null && reulsttt22.IsSuccess)
  5337. {
  5338. if (reulsttt22.Content != false)
  5339. {
  5340. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入离开DB数据:false(暂停),地标:" + info3.MARKNUM + "车号:" + info3.AGVNUM + ",当前路线为:" + info3.ROUTENUM + ",状态为" + info3.RUNSTATUS_Cur);
  5341. }
  5342. }
  5343. if (!IsInOtherOutMarks)
  5344. {
  5345. s7.Write(dr["离开DB"].ToString(), false);
  5346. s7.Write(dr["已离开DB"].ToString(), false);
  5347. }
  5348. // if (btn.BackColor != Color.Blue)
  5349. {
  5350. // btn.BackColor = Color.Red;
  5351. }
  5352. //if (result != null && result.IsSuccess)
  5353. //{
  5354. // if (result.Content == true && info3.EmergencyFlag)
  5355. // {
  5356. // DispatcherTool.ControlAGVBy1071(info3.AGVNUM, 0, 10);
  5357. // WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info3.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info3.AGVNUM + ",释放急停) ");
  5358. // info3.EmergencyFlag = false;
  5359. // }
  5360. //}
  5361. int AlarmCode = int.Parse(info3.ALARMCODE);
  5362. if (AlarmCode == 1 || AlarmCode == 5 || AlarmCode == 9 || AlarmCode == 256)
  5363. {
  5364. s7.Write(dr["是否故障DB"].ToString(), false);
  5365. }
  5366. else
  5367. {
  5368. s7.Write(dr["是否故障DB"].ToString(), true);
  5369. CarAlarmFlag = true;
  5370. }
  5371. if (AlarmCode == 256) { AlarmCode = 1; }
  5372. reulsttt = s7.ReadByte(dr["行驶状态DB"].ToString());
  5373. if (reulsttt != null && reulsttt.IsSuccess)
  5374. {
  5375. if (reulsttt.Content != (byte)(AlarmCode - 1))
  5376. {
  5377. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入行驶状态数据:" + ((AlarmCode - 1)) + ",地标:" + info3.MARKNUM + "车号:" + info3.AGVNUM + ",当前路线为:" + info3.ROUTENUM + ",状态为" + info3.RUNSTATUS_Cur);
  5378. }
  5379. }
  5380. s7.Write(dr["行驶状态DB"].ToString(), (byte)(AlarmCode - 1));
  5381. var result = s7.ReadBool(dr["急停控制DB"].ToString());
  5382. if (dr.Table.Columns.Contains("离开互锁DB"))
  5383. {
  5384. if (!string.IsNullOrEmpty(dr["离开互锁DB"].ToString()))
  5385. {
  5386. var result2 = s7.ReadBool(dr["离开互锁DB"].ToString());
  5387. if (result2 != null && result2.IsSuccess)
  5388. {
  5389. if (result2.Content == true && result.Content == true && info3.EmergencyFlag)
  5390. {
  5391. DispatcherTool.ControlAGVBy1071(info3.AGVNUM, 0);
  5392. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info3.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info3.AGVNUM + ",离开互锁DB值为true) ");
  5393. info3.EmergencyFlag = false;
  5394. }
  5395. }
  5396. }
  5397. }
  5398. }
  5399. continue;
  5400. }
  5401. }
  5402. }
  5403. //if (btn.Text.Contains("("))
  5404. //{
  5405. // int textIndex = btn.Text.LastIndexOf("(");
  5406. // string orignName = btn.Text.Substring(0, textIndex).Replace("\n", "");
  5407. // btn.Text = orignName + "\n" + "(" + info.AGVNUM + ")";
  5408. //}
  5409. //else
  5410. //{
  5411. // btn.Text = btn.Text.Replace("\n", "") + "\n" + "(" + info.AGVNUM + ")";
  5412. //}
  5413. }
  5414. else
  5415. {
  5416. if (!string.IsNullOrEmpty(dr["AGVDB"].ToString()))
  5417. {
  5418. var reulsttt = s7.ReadByte(dr["AGVDB"].ToString());
  5419. if (reulsttt != null && reulsttt.IsSuccess)
  5420. {
  5421. if (reulsttt.Content != (byte)0)
  5422. {
  5423. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入车号数据:0,当前工位无AGV");
  5424. }
  5425. }
  5426. s7.Write(dr["AGVDB"].ToString(), (byte)0);
  5427. s7.Write(dr["是否故障DB"].ToString(), false);
  5428. reulsttt = s7.ReadByte(dr["行驶状态DB"].ToString());
  5429. if (reulsttt != null && reulsttt.IsSuccess)
  5430. {
  5431. if (reulsttt.Content != 0)
  5432. {
  5433. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入行驶状态数据:0,当前工位无AGV");
  5434. }
  5435. }
  5436. s7.Write(dr["行驶状态DB"].ToString(), (byte)0);
  5437. var reulsttt2 = s7.ReadBool(dr["到位DB"].ToString());
  5438. if (reulsttt2 != null && reulsttt2.IsSuccess)
  5439. {
  5440. if (reulsttt2.Content != false)
  5441. {
  5442. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入到位数据:false,当前工位无AGV");
  5443. }
  5444. }
  5445. s7.Write(dr["到位DB"].ToString(), false);
  5446. var reulsttt22 = s7.ReadBool(dr["离开DB"].ToString());
  5447. if (reulsttt22 != null && reulsttt22.IsSuccess)
  5448. {
  5449. if (reulsttt22.Content != false)
  5450. {
  5451. WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "向PLC写入离开DB数据:false,无车离开");
  5452. }
  5453. }
  5454. if (!IsInOtherOutMarks)
  5455. {
  5456. s7.Write(dr["离开DB"].ToString(), false);
  5457. }
  5458. s7.Write(dr["已离开DB"].ToString(), false);
  5459. // if (btn.BackColor != Color.Blue)
  5460. {
  5461. // btn.BackColor = SystemColors.Control;
  5462. }
  5463. }
  5464. }
  5465. }
  5466. #endregion
  5467. #region 离开工位点
  5468. if (dr.Table.Columns.Contains("离开工位") && dr.Table.Columns.Contains("已离开DB"))
  5469. {
  5470. if (!string.IsNullOrEmpty(dr["离开工位"].ToString()))
  5471. {
  5472. var infoList = infos.FindAll(o => o.MARKNUM.ToString() == dr["离开工位"].ToString() && o.ConnectStatus && o.RUNSTATUS_Cur == 0x41); //&& (|| o.RUNSTATUS_Cur == 0x40)
  5473. if (infoList.Count >= 1)
  5474. {
  5475. WriteFile("离开工位记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "3333有车到达离开工位地标" + dr["离开工位"].ToString());
  5476. if (!string.IsNullOrEmpty(dr["已离开DB"].ToString()))
  5477. {
  5478. s7.Write(dr["已离开DB"].ToString(), true);
  5479. s7.Write(dr["离开DB"].ToString(), false);
  5480. }
  5481. }
  5482. else
  5483. {
  5484. if (!string.IsNullOrEmpty(dr["已离开DB"].ToString()))
  5485. {
  5486. s7.Write(dr["已离开DB"].ToString(), false);
  5487. }
  5488. }
  5489. }
  5490. }
  5491. #endregion
  5492. }//));
  5493. }
  5494. }
  5495. catch (Exception)
  5496. {
  5497. // WriteFile("离开工位记录111-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "程序异常" + ex.StackTrace);
  5498. }
  5499. finally
  5500. {
  5501. if (s7 != null)
  5502. {
  5503. s7.ConnectClose();
  5504. }
  5505. }
  5506. Thread.Sleep(1000);
  5507. }
  5508. }
  5509. }
  5510. }
  5511. public void SendLightDate()
  5512. {
  5513. }
  5514. public void PostPelletIdStatus3(StationInfo infos, string ApiAdress)
  5515. {
  5516. string address = "http://10.197.244.100:10057";
  5517. string url = address + ApiAdress;
  5518. string id = DateTime.Now.ToString("yyyyMMddhhmmssffff");
  5519. string s = $"123 {id}";
  5520. AGVInfo info = new AGVInfo();
  5521. PLCSql.PLCMESSelect(infos.AGVNum.ToString(), "2", ref info); //查询数据
  5522. info.Behavior = 2;
  5523. info.stationName = infos.StationName;
  5524. info.Time = DateTime.Now;
  5525. bool res = WcsApi.Post(url, null, info, out string data, out string msg);
  5526. string str = $"AGV异常上报:{res},信息:{msg},数据:{data}";
  5527. string Responses = $"当前站异常AGV信息:工站名={info.stationName},mark ={infos.Mark}, AGVID = {info.AgvCode},ProductCode = {info.ProductCode},HolderBarCode = {info.HolderBarCode},ProductType = {info.ProductType},返回时间 = {DateTime.Now.ToString()}";//,产品个数 = {products.Count}
  5528. WriteFile("AGV异常上报-" + DateTime.Now.ToString("yyyy-MM-dd"), Responses);
  5529. }
  5530. public void PostPelletIdStatus(StationInfo infos, string ApiAdress)
  5531. {
  5532. string address = "http://10.197.244.100:10057";
  5533. string url = address + ApiAdress;
  5534. string id = DateTime.Now.ToString("yyyyMMddhhmmssffff");
  5535. string s = $"123 {id}";
  5536. AGVInfo info = new AGVInfo();
  5537. PLCSql.PLCMESSelect(infos.AGVNum.ToString(), "2", ref info); //查询数据
  5538. info.stationName = infos.StationName;
  5539. info.Time = DateTime.Now;
  5540. bool res = WcsApi.Post(url, null, info, out string data, out string msg);
  5541. string str = $"到港上报:{res},信息:{msg},数据:{data}";
  5542. string Responses = $"当前站AGV信息:工站名={info.stationName},mark ={infos.Mark}, AGVID = {info.AgvCode},ProductCode = {info.ProductCode},HolderBarCode = {info.HolderBarCode},ProductType = {info.ProductType},返回时间 = {DateTime.Now.ToString()}";//,产品个数 = {products.Count}
  5543. WriteFile("到港上报-" + DateTime.Now.ToString("yyyy-MM-dd"), Responses);
  5544. }
  5545. public AGVInfo GetStationInfo(int agvNum)
  5546. {
  5547. string mark = "";
  5548. AGVInfo Agvinfo = new AGVInfo();
  5549. //foreach (DataRow dr in GlobalPara.dtSKQPLCs.Rows)
  5550. //{
  5551. // if (dr["工位名称"].ToString() == statiom)
  5552. // {
  5553. // mark = dr["工位地标"].ToString();
  5554. // break;
  5555. // }
  5556. //}
  5557. try
  5558. {
  5559. // while (AGVPosW)
  5560. //{
  5561. //List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  5562. //List<AGVInfoModel> results = listModel.FindAll(o => o.MARKNUM.ToString() == statiom && o.ConnectStatus == true); //停止点有车
  5563. //if (results != null && results.Count > 0)
  5564. //{
  5565. // foreach (AGVInfoModel info in results)
  5566. // {
  5567. //if (info != null)
  5568. //{
  5569. PLCSql.PLCMESSelect(agvNum.ToString(), "2", ref Agvinfo);
  5570. // }
  5571. //}
  5572. // }
  5573. // Thread.Sleep(500);
  5574. //} //AGVpos为false代表未叫车 才进循环
  5575. }
  5576. catch (Exception ex)
  5577. {
  5578. }
  5579. return Agvinfo;
  5580. }
  5581. private void sN修改ToolStripMenuItem_Click(object sender, EventArgs e)
  5582. {
  5583. SNChange sn = new SNChange();
  5584. sn.Show();
  5585. }
  5586. private void sN绑定修改ToolStripMenuItem_Click(object sender, EventArgs e)
  5587. {
  5588. SNShow sn = new SNShow();
  5589. sn.Show();
  5590. }
  5591. }
  5592. }