MainWindow.xaml.cs 200 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Documents;
  9. using System.Windows.Input;
  10. using System.Windows.Media;
  11. using System.Windows.Media.Imaging;
  12. using System.Windows.Navigation;
  13. using System.Windows.Shapes;
  14. using System.Collections.ObjectModel;
  15. using System.ComponentModel;
  16. using System.Threading;
  17. using System.IO.Ports;
  18. using System.Data;
  19. using System.Windows.Media.Animation;
  20. using System.Windows.Threading;
  21. using System.Configuration;
  22. using DAL;
  23. using COM;
  24. using AGV_WPF_Global;
  25. using AGV_WPF_DisMember;
  26. using NS_SoftKey_Win;
  27. using System.Runtime.InteropServices;
  28. using System.Windows.Interop;
  29. using Casun_SoftKey;
  30. using DataServices;
  31. using AGV_WPF.Models;
  32. using System.Diagnostics;
  33. using System.Data.OleDb;
  34. using System.Text.RegularExpressions;
  35. using System.ServiceModel;
  36. using System.ServiceModel.Description;
  37. using Dispatch;
  38. using AGV_WPF.ExtraUI;
  39. using System.Net;
  40. using AGV_WPF.Plugin;
  41. using System.Data.SqlClient;
  42. using Services;
  43. using AGV_WPF.Services;
  44. using System.Collections;
  45. using System.Net.Sockets;
  46. using UseRate;
  47. using DataControl;
  48. using AGV_WPF.TrafficDefine;
  49. using AGV_WPF.Tools;
  50. using AGV_WPF.DataControl;
  51. using AGV_WPF.NewCotent;
  52. using TrafficDll;
  53. using System.IO;
  54. using System.Xml.Serialization;
  55. using AGV_WPF.Model;
  56. using AGV_WPF.DLL;
  57. using WCS.API.WebApiClient;
  58. namespace AGV_WPF
  59. {
  60. /// <summary>
  61. /// MainWindow.xaml 的交互逻辑
  62. /// </summary>
  63. public partial class MainWindow : Window
  64. {
  65. #region 类变量
  66. AGVInfoService agvService = new AGVInfoService();
  67. //#region AGV结构体的定义
  68. public struct AGVStatus_TypStr //AGV状态,可显示到屏
  69. {
  70. public bool WlLink; //无线连接状态
  71. public byte Wlink_Count; //无线连接中断次数
  72. public byte AgvNum; //AGV标号
  73. public byte WorkLine; //生产区
  74. public int MarkNum; //当前地标
  75. public byte MarkFunction; //地标功能
  76. public int TrafficNum; //管制区号
  77. public byte Status; //运行状态
  78. public int LineNum; //当前线路
  79. public byte Speed; //当前速度
  80. public int DockNum; //是否进入停靠区
  81. public byte Direction;//方向
  82. public float Voltage; //电压
  83. public float Current; //电流
  84. };
  85. #region AGV常变量的定义
  86. //常变量的定义
  87. //AGV运行控制
  88. public const bool AGVMODERUN = true;
  89. public const bool AGVMODESTOP = false;
  90. public Int64 TrafficData = 0L;//初试状态运行
  91. //AGV无线连接状态
  92. public const bool AGVWLLINK_OK = true;
  93. public const bool AGVWLLINK_ERROR = false;
  94. //AGV断线踢出管制区的最大次数设定(1次==550毫秒)
  95. public int OffLinkMax = Convert.ToInt32(ConfigurationManager.AppSettings["OffLink_MAX"]);
  96. //实际的AGV数量
  97. public byte AGVNUM_MAX = Convert.ToByte(ConfigurationManager.AppSettings["AGVNUM_MAX"]);
  98. //管制区AGV等待数量
  99. public byte TRAFFIC_CONAREA_WAITAGVNUM_MAX = Convert.ToByte(ConfigurationManager.AppSettings["TRAFFIC_CONAREA_WAITAGVNUM_MAX"]);
  100. //管制区实际数量
  101. public int TRAFFIC_CONAREA;
  102. //停靠区实际数量
  103. public int DOCKAREA_NUM;
  104. //AGV地标功能
  105. public const byte AGVMARKFUN_OVER = 15;
  106. //帧校验结果
  107. public const byte VERIFY_NOERROR = 0;
  108. public const byte VERIFY_HEADERROR = 1;
  109. public const byte VERIFY_ENDERROR = 2;
  110. public const byte VERIFY_FUNERROR = 3;
  111. public const byte VERIFY_BCCERROR = 4;
  112. #endregion
  113. TrafficDll.Traffic traffic_1;
  114. #region AGV信息定义
  115. public string[] MarkFuncOpt;
  116. public string[] StatusOpt;
  117. public string[] SpeedOpt = { "初始化...", "低速", "中速", "高速", "最高速", "减速" };
  118. public Brush[] ColorOpt = { Brushes.DarkOliveGreen, Brushes.Tomato, Brushes.Purple, Brushes.Pink, Brushes.SkyBlue, Brushes.LightBlue, Brushes.GreenYellow, Brushes.Goldenrod };
  119. public string[] WirelessOpt = { "成功", "失败" };
  120. public string[] TrafficStateOpt = { "管制中", "非管制" };
  121. //public AgvStatus[] AgvStatusList;
  122. TrafficManager AgvTrafficManager;//AGV交通管制管理对象
  123. #endregion
  124. #region 串口信息定义
  125. //串口定义
  126. //private COM.SerialPortWrapper SPComControl;
  127. private List<COM.SerialPortWrapper> SPComCOntrolList = null;
  128. public static List<COM.SerialPortWrapper> SPComCOntrolList2 = null;
  129. private CommunicationBase communication;
  130. //用于转发数据的UDP
  131. CommunicationBase m_ReTransportUdp;
  132. //默认分配1页内存,并始终限制不允许超过
  133. private List<byte> buffer = new List<byte>(4096);
  134. private List<List<byte>> bufferList = new List<List<byte>>();
  135. //AGV交通管制命令:10字节
  136. byte[] buf_traffic = { 0x10, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x03 };
  137. //扩容版管制命令:40字节
  138. byte[] buf_trafficctl = { 0x10, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  139. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  140. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  141. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  142. byte[] buf_trafficct2 = { 0x10, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 };
  143. //2019新版 160台车 24字节
  144. byte[] buf_trafficct3 = { 0x10, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  145. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146. 0x00, 0x00, 0x73, 0x03 };
  147. //2019新版 160台车 24字节
  148. byte[] buf_trafficct33 = { 0x10, 0x63, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  149. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  150. 0xFF, 0xFF, 0x73, 0x03 };
  151. //返回交通管制信号
  152. byte[] buf_rettraffic = { 0x10, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x03 };
  153. //返回交通管制信号 19字节
  154. byte[] buf_rettraffic2 = { 0x10, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  155. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03};
  156. List<byte[]> buf_rettrafficList = new List<byte[]>();
  157. //AGV运行控制
  158. byte[] buf_runctl = { 0x10, 0x71, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x03 };
  159. //返回AGV运行控制
  160. byte[] buf_retrun = { 0x10, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x03 };
  161. //虚拟交通管制命令(用于判断是否断线,未接收到数据时虚拟发送数据,使agv状态断线)
  162. byte[] buf_virtualtrafficctl = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  163. //接收数据计数器,用于断线后自动更新数据
  164. byte[] data_total;
  165. public int iReceivedNum = 0;//接收数据的次数
  166. public int iLastReceivedNum = 0;
  167. private string str1061 = "", str1063 = "";
  168. public Int64 SendD1D2 = 0L;//初试状态运行
  169. public byte[] FlagArry;
  170. DispatchSystem7515 ds;
  171. public int IsSendCtrl = 0;
  172. public int CtrlWaitNum = 0;
  173. public bool webOrderFlag = false;//web服务任务标志
  174. public const int offsetNo = 25;
  175. object lockObject = new object();//管制函数调用互斥锁
  176. object checkLock = new object();//读卡检测函数调用互斥锁
  177. int BatteryCode = 2;
  178. #endregion
  179. #region 数据库定义
  180. public static DAL.ZSql TrafficPara = new DAL.ZSql();
  181. public static ExcelDataBase excelDataBase = null;
  182. #endregion
  183. public CheckCardUnit[] chechCardUnits;//读卡检测单元
  184. public CheckCardSystem checkSystem;//读卡检测系统
  185. public BatteryData[] batteryDatas;
  186. #region 动画定义
  187. public AGV_DisMember[] DisMember;
  188. public AGVStatus_TypStr[] AGVStatus;
  189. System.Windows.Shapes.Path[] Dottedline;
  190. System.Windows.Controls.Label[] dislable;
  191. Ellipse[] startellipse;
  192. Ellipse[] endellipse;
  193. //定时器定时刷新界面
  194. DispatcherTimer t = new DispatcherTimer();
  195. DispatcherTimer DataTimer = new DispatcherTimer();
  196. DispatcherTimer BatteryTimer = new DispatcherTimer();
  197. DispatcherTimer SendTimer = new DispatcherTimer();
  198. DispatcherTimer batteryInfoTimer = new DispatcherTimer();//电池信息获取定时器
  199. public ObservableCollection<AGV_DisMember> memberData = new ObservableCollection<AGV_DisMember>();
  200. public ObservableCollection<AgvMember> member = new ObservableCollection<AgvMember>();
  201. public ObservableCollection<TrafficAreaModel> TrafficMember = new ObservableCollection<TrafficAreaModel>();
  202. public List<AgvStatusTimeSpan> useRateTimeList = new List<AgvStatusTimeSpan>();
  203. SocketClient socketclient = null;
  204. Storyboard[] myLineStoryboard;
  205. //AGV编号报警闪烁动画
  206. DoubleAnimationUsingKeyFrames CarWarnningAnimation;
  207. //箭头移动动画
  208. MatrixAnimationUsingPath[] matrixAnimation;
  209. DoubleAnimationUsingPath[] animationX;
  210. DoubleAnimationUsingPath[] animationY;
  211. DoubleAnimationUsingPath[] animationAngle;
  212. Image[] animatedImage;
  213. #endregion
  214. #region 系统定义
  215. public bool IsOpenSystem = false;
  216. private bool disposed;
  217. #endregion
  218. #endregion
  219. #region 窗体创建与销毁
  220. /// <summary>
  221. /// 服务主机对象
  222. /// </summary>
  223. System.ServiceModel.ServiceHost host;
  224. public static MainWindow mainWindow = null;
  225. Traffic traffic;
  226. //DataAnalysis dataControl;//数据解析对象
  227. //DataHandler dataHandler;
  228. AGVInfoService agvser;
  229. int SendIndex = 1;//当前要共享的AGV编号
  230. public MainWindow()
  231. {
  232. agvser = new AGVInfoService();
  233. agvser.InitTraffic();
  234. NameScope.SetNameScope(this, new NameScope());
  235. InitializeComponent();
  236. //dataControl = new DataAnalysis();
  237. //dataHandler = new DataHandler();
  238. //dataControl.AnalysisCompletedEvent += new DataAnalysis.AnalysisCompletedHandler(dataControl_AnalysisCompletedEvent);
  239. mainWindow = this;
  240. //变量初始化
  241. //AgvStatusList = new AgvStatus[AGVNUM_MAX];
  242. batteryDatas = new BatteryData[AGVNUM_MAX];
  243. AGVStatus = new AGVStatus_TypStr[AGVNUM_MAX];
  244. for (int i = 1; i <= AGVNUM_MAX; i++)
  245. {
  246. //GlobalPara.WakeUpAGVNumList.Add(i);
  247. //GlobalPara.SleepAGVNumList.Add(i);
  248. }
  249. AgvTrafficManager = new TrafficManager();
  250. Dottedline = new System.Windows.Shapes.Path[AGVNUM_MAX];
  251. startellipse = new Ellipse[AGVNUM_MAX];
  252. endellipse = new Ellipse[AGVNUM_MAX];
  253. dislable = new System.Windows.Controls.Label[AGVNUM_MAX];
  254. DisMember = new AGV_DisMember[AGVNUM_MAX];
  255. myLineStoryboard = new Storyboard[AGVNUM_MAX];
  256. matrixAnimation = new MatrixAnimationUsingPath[AGVNUM_MAX]; ;
  257. animationX = new DoubleAnimationUsingPath[AGVNUM_MAX];
  258. animationY = new DoubleAnimationUsingPath[AGVNUM_MAX];
  259. animationAngle = new DoubleAnimationUsingPath[AGVNUM_MAX];
  260. CarWarnningAnimation = new DoubleAnimationUsingKeyFrames();
  261. data_total = new byte[AGVNUM_MAX];
  262. animatedImage = new Image[AGVNUM_MAX];
  263. //GlobalPara.Gcontrolcomname = ConfigurationManager.AppSettings["ControlCOMName"];
  264. InitComConfig();
  265. btn_OpenSystem.IsEnabled = true;
  266. btn_CloseSystem.IsEnabled = false;
  267. //casunService = new CasunWebService();
  268. InitLastReadMark();
  269. FlagArry = new byte[37];
  270. str1061 = UdpCommunication.ByteToHexString(buf_traffic);
  271. str1063 = UdpCommunication.ByteToHexString(buf_trafficct3);
  272. InitBuffer();//缓存区初始化
  273. if ((GlobalPara.type == 0 && SPComCOntrolList == null) || (GlobalPara.type == 1 && communication == null))
  274. {
  275. COMInit();
  276. if (GlobalPara.type == 1)
  277. {
  278. if (!communication.IsOpen)
  279. {
  280. communication.Open();
  281. //communication.SendData(buf_trafficctl, null);
  282. for (int i = 0; i < 5; i++)
  283. {
  284. communication.SendData(buf_trafficct3, null);
  285. Thread.Sleep(20);
  286. }
  287. Thread.Sleep(500);
  288. for (int i = 0; i < 5; i++)
  289. {
  290. SendTrafficOrder160();
  291. Thread.Sleep(20);
  292. }
  293. }
  294. }
  295. }
  296. //trafficAgv = new List<byte>();
  297. //traffic = new Traffic(AGVStatus);
  298. //Thread thread = new Thread(new ThreadStart(traffic.CheckStatus));
  299. //thread.Start();
  300. //Thread GetTrafficAgvThread = new Thread(new ThreadStart(getTrafficAgvServer));
  301. //GetTrafficAgvThread.Start();
  302. }
  303. /// <summary>
  304. /// 初始化最后读卡记录
  305. /// </summary>
  306. void InitLastReadMark()
  307. {
  308. if (File.Exists(@"Exception\AGV最后读卡记录.txt"))
  309. {
  310. GlobalPara.lastReadMarkList = File.ReadAllLines(@"Exception\AGV最后读卡记录.txt").ToList();
  311. }
  312. }
  313. void DrvWlConInit()
  314. {
  315. for (int i = 0; i < AGVNUM_MAX; i++)
  316. {
  317. AGVStatus[i].WlLink = false;
  318. AGVStatus[i].AgvNum = Convert.ToByte(i + 1);
  319. AGVStatus[i].WorkLine = 0;
  320. AGVStatus[i].MarkNum = 0;
  321. AGVStatus[i].MarkFunction = 0;
  322. AGVStatus[i].TrafficNum = 0;
  323. AGVStatus[i].Status = 0;
  324. AGVStatus[i].LineNum = 0;
  325. AGVStatus[i].Speed = 0;
  326. AGVStatus[i].DockNum = 0;
  327. }
  328. }
  329. /// <summary>
  330. /// 多串口配置初始化
  331. /// </summary>
  332. public void InitComConfig()
  333. {
  334. //加载串口列表,先取键名,再将键名排序,最后得到键值
  335. List<string> keyNameList = new List<string>();
  336. foreach (string key in ConfigurationManager.AppSettings.AllKeys)
  337. {
  338. if (Regex.IsMatch(key, @"^ControlCOMName[1-9][0-9]*$"))
  339. keyNameList.Add(key);
  340. }
  341. keyNameList.Sort();
  342. for (int i = 0; i < keyNameList.Count; i++)
  343. {
  344. GlobalPara.ComNameList.Add(ConfigurationManager.AppSettings[keyNameList[i]]);
  345. }
  346. for (int i = 0; i < GlobalPara.ComNameList.Count; i++)
  347. {
  348. List<byte> buffer = new List<byte>(4096);//动态申请缓冲,一个串口对应一个
  349. bufferList.Add(buffer);
  350. byte[] returnFrame = { 0x10, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x03 };//返回的帧数据
  351. buf_rettrafficList.Add(returnFrame);
  352. }
  353. }
  354. /// <summary>
  355. /// 检测单元初始化
  356. /// </summary>
  357. public void CheckUnitInit()
  358. {
  359. excelDataBase = new ExcelDataBase(GlobalPara.excelFile);
  360. checkSystem = new CheckCardSystem();
  361. checkSystem.MissReadEvent += new CheckCardSystem.MissReadEventHandler(checkSystem_MissReadEvent);
  362. chechCardUnits = new CheckCardUnit[AGVNUM_MAX];//根据AGV数量加入检测单元
  363. //for (int i = 0; i < AGVNUM_MAX;i++ )
  364. //{
  365. // chechCardUnits[i] = new CheckCardUnit(AgvStatusList[i].AgvNum, AgvStatusList[i].WorkLine, excelDataBase);
  366. // chechCardUnits[i].AgvNum = i + 1;
  367. // checkSystem.Add(chechCardUnits[i]);
  368. //}
  369. }
  370. /// <summary>
  371. /// 检测是否漏读
  372. /// </summary>
  373. /// <param name="o"></param>
  374. /// <param name="e"></param>
  375. void checkSystem_MissReadEvent(object o, MissReadEventArgs e)
  376. {
  377. if (e.info == "漏读")
  378. Console.WriteLine(string.Format("漏读AGV{0},漏读路线{1},漏读站点{2}", e.agvNum, e.route, e.stationNum));
  379. else if (e.info == "多读")
  380. Console.WriteLine(string.Format("AGV{0},路线{1}多读卡", e.agvNum, e.route));
  381. }
  382. /// <summary>
  383. /// Execute startup tasks
  384. /// </summary>
  385. /// <param name="sender">object sending the event</param>
  386. /// <param name="e">event arguments</param>
  387. private void Window_Loaded(object sender, RoutedEventArgs e)
  388. {
  389. RegisterDeviceNotification();//注册加密锁事件插拨通知 //hwh 2016-9-20 修改
  390. MenuBarInit();//菜单栏初始化
  391. StatusBarInit();//状态栏初始化
  392. UpdateImage2Database();//更新或加载图片到数据库
  393. MapInit(@"Image\background.png");//地图初始化
  394. DrvWlConInit();
  395. ControlAreaInit();//控制面板初始化
  396. CustomInit();//自定义参数获取初始化
  397. //DrvWlConInit();//交通管制区初始化
  398. Line_Init();//显示直线初始化
  399. StoryboardInit();//故事板初始化,需在Line_Init();后面
  400. AGVGridInit(AGVNUM_MAX);//界面表格初始化
  401. AGVJoinMapInit();//AGV车辆导航标示和编号加入到地图中
  402. TrafficGridInit();
  403. LoadConfig();
  404. if (GlobalPara.IsEnableReadCheck)
  405. {
  406. //CheckUnitInit();//检测单元初化
  407. }
  408. if (GlobalPara.IsEnableRemote)//启用了远程服务才初始化
  409. {
  410. RemoteServiceInit();
  411. }
  412. if (GlobalPara.IsEnableDataShare)
  413. {
  414. socketclient = new SocketClient(GlobalPara.TryIP, Convert.ToInt32(GlobalPara.LocalTcpPort1));
  415. }
  416. //WcfServiceInit();//服务初始化
  417. LoadPlugins();
  418. Thread.Sleep(500);//延时2秒后开启系统
  419. //this.btn_OpenSystem_Click(sender, e);
  420. }
  421. Server remoteServer;
  422. //CasunWebService casunService;
  423. void RemoteServiceInit()
  424. {
  425. try
  426. {
  427. remoteServer = new Server();
  428. remoteServer.Open(GlobalPara.TryIP, GlobalPara.LocalTcpPort);
  429. }
  430. catch (System.Exception ex)
  431. {
  432. MessageBox.Show(ex.Message + " 416");
  433. }
  434. }
  435. void WcfServiceInit()
  436. {
  437. if (host == null || host.State == CommunicationState.Closed)
  438. {
  439. host = new System.ServiceModel.ServiceHost(typeof(AgvAlarmServiceLibrary.AgvAlarmService));
  440. NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);
  441. string address = string.Format(@"net.tcp://{0}:10000/AgvAlarmService", GlobalPara.WcfServerIP);
  442. host.AddServiceEndpoint(typeof(AgvAlarmServiceLibrary.IAgvAlarmService), binding, address);
  443. if (host.Description.Behaviors.Find<System.ServiceModel.Description.ServiceMetadataBehavior>() == null)
  444. {
  445. ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
  446. behavior.HttpGetEnabled = true;
  447. string httpAddress = string.Format(@"http://{0}:10001/AgvAlarmService", GlobalPara.WcfServerIP);
  448. behavior.HttpGetUrl = new Uri(httpAddress);
  449. host.Description.Behaviors.Add(behavior);
  450. }
  451. }
  452. }
  453. /// <summary>
  454. /// Execute shutdown tasks
  455. /// </summary>
  456. /// <param name="sender">Object sending the event</param>
  457. /// <param name="e">Event arguments</param>
  458. private void Window_Closing(object sender, CancelEventArgs e)
  459. {
  460. // Stop timer
  461. if (null != this.t)
  462. {
  463. this.t.Stop();
  464. this.t.Tick -= this.t_Tick;
  465. }
  466. // Stop timer
  467. if (null != this.DataTimer)
  468. {
  469. this.DataTimer.Stop();
  470. this.DataTimer.Tick -= this.SendDataTimerTick;
  471. }
  472. if (batteryInfoTimer != null)
  473. {
  474. batteryInfoTimer.Stop();
  475. batteryInfoTimer.Tick -= batteryInfoTimer_Tick;
  476. }
  477. if (SendTimer != null)
  478. {
  479. SendTimer.Stop();
  480. SendTimer.Tick -= SendTimer_Tick;
  481. }
  482. if (BatteryTimer != null)
  483. {
  484. BatteryTimer.Stop();
  485. BatteryTimer.Tick -= BatteryTimer_Tick;
  486. }
  487. // Stop Com,Unregister SPComControl data received event
  488. if (null != SPComCOntrolList)
  489. {
  490. for (int i = 0; i < SPComCOntrolList.Count; i++)
  491. {
  492. if (SPComCOntrolList[i] != null)
  493. {
  494. this.SPComCOntrolList[i].Close();
  495. this.SPComCOntrolList[i].OnDataReceived -= this.SPComControl_OnDataReceived;
  496. }
  497. }
  498. }
  499. if (communication != null)
  500. {
  501. communication.Close();
  502. }
  503. if (remoteServer != null)
  504. {
  505. remoteServer.Close();
  506. }
  507. if (m_ReTransportUdp != null)
  508. {
  509. m_ReTransportUdp.Close();
  510. }
  511. //if (dataControl != null)
  512. //{
  513. // dataControl.Dispose();
  514. //}
  515. //clear collection
  516. if (null != memberData)
  517. {
  518. memberData.Clear();
  519. memberData = null;
  520. }
  521. if (host != null)
  522. {
  523. if (host.State == CommunicationState.Opened)
  524. {
  525. if (AgvAlarmServiceLibrary.AgvAlarmService.userCallBackList != null)
  526. {
  527. foreach (AgvAlarmServiceLibrary.ISrvToClientCallBack callback in AgvAlarmServiceLibrary.AgvAlarmService.userCallBackList)
  528. {
  529. callback.NotifyClient("服务端已下线");
  530. }
  531. }
  532. host.Close();
  533. }
  534. }
  535. XmlSerializer serializer2 = new XmlSerializer(GlobalPara.gs_configInfo.GetType());
  536. using (TextWriter tw = new StreamWriter("CConfig.xml"))
  537. {
  538. serializer2.Serialize(tw, GlobalPara.gs_configInfo);
  539. }
  540. //Application.Current.Shutdown();//关闭程序
  541. Process.GetCurrentProcess().Kill();
  542. }
  543. /// <summary>
  544. /// Finalizes an instance of the MainWindow class.
  545. /// This destructor will run only if the Dispose method does not get called.
  546. /// </summary>
  547. ~MainWindow()
  548. {
  549. this.Dispose(false);
  550. }
  551. /// <summary>
  552. /// Dispose resources
  553. /// </summary>
  554. public void Dispose()
  555. {
  556. this.Dispose(true);
  557. // This object will be cleaned up by the Dispose method.
  558. GC.SuppressFinalize(this);
  559. }
  560. /// <summary>
  561. /// Frees all memory associated with the FusionImageFrame.
  562. /// </summary>
  563. /// <param name="disposing">Whether the function was called from Dispose.</param>
  564. protected virtual void Dispose(bool disposing)
  565. {
  566. if (!this.disposed)
  567. {
  568. if (disposing)
  569. {
  570. if (null != this.SPComCOntrolList)
  571. {
  572. for (int i = 0; i < SPComCOntrolList.Count; i++)
  573. {
  574. if (SPComCOntrolList[i] != null)
  575. this.SPComCOntrolList[i].Dispose();
  576. }
  577. }
  578. if (null != TrafficPara)
  579. {
  580. TrafficPara.Dispose();
  581. }
  582. if (communication != null)
  583. {
  584. communication.Dispose();
  585. }
  586. }
  587. }
  588. this.disposed = true;
  589. }
  590. #endregion
  591. #region 初始化
  592. /// <summary>
  593. /// 状态栏初始化设置
  594. /// </summary>
  595. private void StatusBarInit()
  596. {
  597. LaunchTimer();//状态栏本地系统时间
  598. lblusername.Content = GlobalPara.strName;//状态栏用户名
  599. }
  600. /// <summary>
  601. /// 菜单栏权限设置初始化
  602. /// </summary>
  603. private void MenuBarInit()
  604. {
  605. MenuAGVManager.IsEnabled = GlobalPara.IsManager;
  606. MenuSettings.IsEnabled = GlobalPara.IsManager;
  607. MenuSystemManage.IsEnabled = GlobalPara.IsManager;
  608. }
  609. /// <summary>
  610. /// AGV车辆导航标示和编号加入到地图中
  611. /// </summary>
  612. private void AGVJoinMapInit()
  613. {
  614. for (int i = 0; i < dislable.Length; i++)
  615. {
  616. //canvas.Children.Add(dislable[i]);
  617. //实际宽度和显示宽度可能不一样
  618. Canvas.SetTop(dislable[i], -this.dislable[i].ActualHeight);
  619. Canvas.SetLeft(dislable[i], -this.dislable[i].ActualHeight / 2);
  620. this.dislable[i].RenderTransformOrigin = new Point(0.5, 0.5);
  621. Canvas.SetTop(animatedImage[i], -this.animatedImage[i].ActualHeight / 2);
  622. Canvas.SetLeft(animatedImage[i], -this.animatedImage[i].ActualWidth / 2);
  623. this.animatedImage[i].RenderTransformOrigin = new Point(0.5, 0.5);
  624. }
  625. }
  626. /// <summary>
  627. /// 定时器初始化
  628. /// </summary>
  629. private void TimerInit()
  630. {
  631. //界面UI层的定时器
  632. //--------------------------------------------------------------------
  633. //定时器定时刷新界面
  634. t.Interval = TimeSpan.FromMilliseconds(500);//设置执行间隔单位ms毫秒
  635. t.Tick += new EventHandler(t_Tick);//t_Tick是要执行的函数
  636. //---------------------------------------------------------------------
  637. //数据采集层的定时器
  638. //-------------------------------------------------------------------
  639. //PC与串口扩展板每次通信周期550+其他ms
  640. DataTimer.Interval = TimeSpan.FromMilliseconds(GlobalPara.ComCycle);
  641. //DataTimer.Interval = TimeSpan.FromMilliseconds(750);
  642. DataTimer.Tick += new EventHandler(this.SendDataTimerTick);
  643. SendTimer.Interval = TimeSpan.FromMilliseconds(200);
  644. SendTimer.Tick += new EventHandler(SendTimer_Tick);
  645. SendTimer.IsEnabled = true;
  646. BatteryTimer.Interval = TimeSpan.FromMilliseconds(2000);
  647. BatteryTimer.Tick += new EventHandler(BatteryTimer_Tick);
  648. BatteryTimer.IsEnabled = true;
  649. }
  650. void BatteryTimer_Tick(object sender, EventArgs e)
  651. {
  652. if (BatteryCode == 2)
  653. {
  654. BatteryCode = 3;
  655. }
  656. else if (BatteryCode == 3)
  657. {
  658. BatteryCode = 2;
  659. }
  660. SendTrafficOrder160(BatteryCode);
  661. }
  662. void SendTimer_Tick(object sender, EventArgs e)
  663. {
  664. //throw new NotImplementedException();
  665. try
  666. {
  667. lock (GlobalPara.SendBytesList)
  668. {
  669. while (GlobalPara.SendBytesList.Count > 0)
  670. {
  671. byte[] bytes = GlobalPara.SendBytesList[0];
  672. if (GlobalPara.type == 0)
  673. {
  674. //SPComControl.Write(buf_runctl, 0, buf_runctl.Length);
  675. for (int i = 0; i < SPComCOntrolList.Count; i++)
  676. {
  677. {
  678. SPComCOntrolList[i].Write(bytes, 0, bytes.Length);
  679. }
  680. }
  681. }
  682. else if (GlobalPara.type == 1)
  683. {
  684. communication.SendData(bytes, null);
  685. }
  686. if (GlobalPara.SendBytesList.Contains(bytes))
  687. {
  688. GlobalPara.SendBytesList.Remove(bytes);
  689. }
  690. Thread.Sleep(100);
  691. }
  692. }
  693. }
  694. catch (Exception)
  695. {
  696. }
  697. }
  698. /// <summary>
  699. /// 自定义初始化
  700. /// </summary>
  701. private void CustomInit()
  702. {
  703. DAL.ZSql sql1 = new DAL.ZSql();
  704. //地标功能定义
  705. sql1.Open("select CmdFunction from T_Custom where CustomType=1 order by CmdNum");
  706. if (sql1.rowcount > 0)
  707. {
  708. MarkFuncOpt = new string[sql1.rowcount];
  709. for (int i = 0; i < sql1.rowcount; i++)
  710. {
  711. MarkFuncOpt[i] = sql1.Rows[i]["CmdFunction"].ToString();
  712. }
  713. }
  714. else
  715. {
  716. MessageBox.Show("警告:请在“自定义设置”中设置地标功能!");
  717. }
  718. //运行状态定义
  719. sql1.Open("select CmdFunction from T_Custom where CustomType=2 order by CmdNum");
  720. if (sql1.rowcount > 0)
  721. {
  722. StatusOpt = new string[sql1.rowcount];
  723. for (int i = 0; i < sql1.rowcount; i++)
  724. {
  725. StatusOpt[i] = sql1.Rows[i]["CmdFunction"].ToString();
  726. }
  727. }
  728. else
  729. {
  730. MessageBox.Show("警告:请在“自定义设置”中设置AGV运行状态!");
  731. }
  732. sql1.Close();
  733. }
  734. /// <summary>
  735. /// 控制面板中数据初始化
  736. /// </summary>
  737. private void ControlAreaInit()
  738. {
  739. //小车编号加载初始化
  740. for (int i = 0; i < AGVNUM_MAX; i++)
  741. {
  742. cb_AgvNum.Items.Add("AGV" + (i + 1).ToString());
  743. }
  744. //线路加载初始化
  745. DAL.ZSql sql1 = new DAL.ZSql();
  746. sql1.Open("select DISTINCT LineNum from T_Line order by LineNum");
  747. cb_LineNum.ItemsSource = sql1.m_table.DefaultView;
  748. cb_LineNum.DisplayMemberPath = "LineNum";
  749. cb_LineNum.SelectedValuePath = "LineNum";
  750. cb_LineNum.SelectedValue = "0";
  751. //for (int i = 0; i < sql1.m_table.Rows.Count;i++ )
  752. //{
  753. // ushort route = 0;
  754. // if (ushort.TryParse(sql1.m_table.Rows[i]["LineNum"].ToString(), out route))
  755. // {
  756. // casunService.AddRoute(route);
  757. // }
  758. //}
  759. sql1.Close();
  760. }
  761. /// <summary>
  762. /// 状态栏定时器
  763. /// </summary>
  764. private void LaunchTimer()
  765. {
  766. DispatcherTimer innerTimer = new DispatcherTimer(TimeSpan.FromSeconds(1.0),
  767. DispatcherPriority.Loaded, new EventHandler(this.TimerTick), this.Dispatcher);
  768. innerTimer.Start();
  769. }
  770. /// <summary>
  771. /// 状态栏定时器触发函数
  772. /// </summary>
  773. /// <param name="sender"></param>
  774. /// <param name="e"></param>
  775. private void TimerTick(object sender, EventArgs e)
  776. {
  777. lblTime.Content = DateTime.Now.ToString();
  778. tickCount++;
  779. if (tickCount >= 6 * 10)
  780. {
  781. tickCount = 0;
  782. ClearMemory();
  783. }
  784. }
  785. int tickCount = 6 * 10;
  786. #region 内存回收
  787. [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
  788. public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
  789. /// <summary>
  790. /// 释放内存
  791. /// </summary>
  792. public static void ClearMemory()
  793. {
  794. GC.Collect();
  795. GC.WaitForPendingFinalizers();
  796. if (Environment.OSVersion.Platform == PlatformID.Win32NT)
  797. {
  798. SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
  799. }
  800. }
  801. #endregion
  802. /// <summary>
  803. /// 串口初始化
  804. /// </summary>
  805. private void COMInit()
  806. {
  807. int controlcombaudrate = int.Parse(ConfigurationManager.AppSettings["ControlCOMBaudrate"]);
  808. int controlcomdatabits = int.Parse(ConfigurationManager.AppSettings["ControlCOMDataBits"]);
  809. string controlcomstopbits = ConfigurationManager.AppSettings["ControlCOMStopBits"];
  810. string controlcomparity = ConfigurationManager.AppSettings["ControlCOMParity"];
  811. try
  812. {
  813. if (GlobalPara.type == 0)//无线模块通信
  814. {
  815. SPComCOntrolList = new List<COM.SerialPortWrapper>();
  816. for (int i = 0; i < GlobalPara.ComNameList.Count; i++)
  817. {
  818. COM.SerialPortWrapper port = new COM.SerialPortWrapper(GlobalPara.ComNameList[i], controlcombaudrate, controlcomparity, controlcomdatabits, controlcomstopbits);
  819. port.OnDataReceived += new SerialDataReceivedEventHandler(SPComControl_OnDataReceived);
  820. port.ReceivedBytesThreshold = buf_rettraffic.Length;
  821. SPComCOntrolList.Add(port);
  822. }
  823. }
  824. else if (GlobalPara.type == 1)//网络通信
  825. {
  826. communication = new UdpCommunication(GlobalPara.HostIP, GlobalPara.UdpComPort, 10);
  827. GlobalPara.communication = communication;
  828. communication.ReceivedEvent += new CommunicationBase.ReceivedEventHandler(communication_ReceivedEvent);
  829. SPComCOntrolList = new List<COM.SerialPortWrapper>(); SPComCOntrolList2 = new List<COM.SerialPortWrapper>();
  830. for (int i = 0; i < GlobalPara.ComNameList.Count; i++)
  831. {
  832. COM.SerialPortWrapper port = new COM.SerialPortWrapper(GlobalPara.ComNameList[i], controlcombaudrate, controlcomparity, controlcomdatabits, controlcomstopbits);
  833. port.OnDataReceived += new SerialDataReceivedEventHandler(SPComControl_OnDataReceived);
  834. port.ReceivedBytesThreshold = buf_rettraffic.Length;
  835. SPComCOntrolList.Add(port); SPComCOntrolList2.Add(port);
  836. }
  837. }
  838. //转发UDP
  839. m_ReTransportUdp = new UdpCommunication(GlobalPara.TryIP, GlobalPara.RetransportUdpPort, 10);
  840. }
  841. catch (System.Exception ex)
  842. {
  843. MessageBox.Show("新建通信实例失败!");
  844. return;
  845. }
  846. }
  847. bool IsExistDataTable(string tableName)
  848. {
  849. string strCon = ConfigurationManager.AppSettings["ConnString"];
  850. string str = string.Format("select count(1) from sysObjects where xtype='u' and name='{0}'", tableName);
  851. try
  852. {
  853. using (SqlConnection con = new SqlConnection(strCon))
  854. {
  855. con.Open();
  856. using (SqlCommand com = new SqlCommand(str, con))
  857. {
  858. object o = com.ExecuteScalar();
  859. int num = int.Parse(o.ToString());
  860. if (num > 0)
  861. return true;
  862. else
  863. return false;
  864. }
  865. }
  866. }
  867. catch (System.Exception ex)
  868. {
  869. throw new Exception(ex.Message);
  870. }
  871. //return false;
  872. }
  873. void CreateServiceDatabase()
  874. {
  875. if (IsExistDataTable("T_Service"))
  876. return;
  877. string strCon = ConfigurationManager.AppSettings["ConnString"];
  878. string str = string.Format("create table T_Service(ID bigint identity(1,1) not null,background image null,header image null)");
  879. try
  880. {
  881. using (SqlConnection con = new SqlConnection(strCon))
  882. {
  883. con.Open();
  884. using (SqlCommand com = new SqlCommand(str, con))
  885. {
  886. com.ExecuteNonQuery();
  887. }
  888. }
  889. }
  890. catch (System.Exception ex)
  891. {
  892. throw new Exception(ex.Message);
  893. }
  894. }
  895. void AddOrUpdateServiceDatabase(string tableName, object background, object header)
  896. {
  897. string strCon = ConfigurationManager.AppSettings["ConnString"];
  898. try
  899. {
  900. CreateServiceDatabase();
  901. using (SqlConnection con = new SqlConnection(strCon))
  902. {
  903. con.Open();
  904. string str = string.Format("select count(1) from {0}", tableName);
  905. using (SqlCommand com = new SqlCommand(str, con))
  906. {
  907. object o = com.ExecuteScalar();
  908. if (int.Parse(o.ToString()) > 0)//更新
  909. {
  910. str = string.Format("update {0} set background=@background,header=@header where ID=(select top 1 ID from {1})", tableName, tableName);
  911. com.CommandText = str;
  912. com.Parameters.Add("background", SqlDbType.Image);
  913. com.Parameters["background"].Value = background;
  914. com.Parameters.Add("header", SqlDbType.Image);
  915. com.Parameters["header"].Value = header;
  916. com.ExecuteNonQuery();
  917. }
  918. else//添加
  919. {
  920. str = string.Format("insert into {0}(background,header) values(@background,@header)", tableName);
  921. com.CommandText = str;
  922. com.Parameters.Add("background", SqlDbType.Image);
  923. com.Parameters["background"].Value = background;
  924. com.Parameters.Add("header", SqlDbType.Image);
  925. com.Parameters["header"].Value = header;
  926. com.ExecuteNonQuery();
  927. }
  928. }
  929. }
  930. }
  931. catch (System.Exception ex)
  932. {
  933. throw new Exception(ex.Message);
  934. }
  935. }
  936. void UpdateImage2Database()
  937. {
  938. byte[] backgroundBuffer = new byte[1];
  939. byte[] headerBuffer = new byte[1];
  940. string backgroundFile = @"Image\background.png";
  941. string headerFile = @"Image\header.png";
  942. if (System.IO.File.Exists(backgroundFile))
  943. {
  944. System.IO.FileStream file = System.IO.File.Open(backgroundFile, System.IO.FileMode.Open, System.IO.FileAccess.Read);
  945. System.IO.BinaryReader reader = new System.IO.BinaryReader(file);
  946. backgroundBuffer = reader.ReadBytes((int)file.Length);
  947. reader.Close();
  948. file.Close();
  949. }
  950. if (System.IO.File.Exists(headerFile))
  951. {
  952. System.IO.FileStream file = System.IO.File.Open(headerFile, System.IO.FileMode.Open, System.IO.FileAccess.Read);
  953. System.IO.BinaryReader reader = new System.IO.BinaryReader(file);
  954. headerBuffer = reader.ReadBytes((int)file.Length);
  955. reader.Close();
  956. file.Close();
  957. }
  958. AddOrUpdateServiceDatabase("T_Service", backgroundBuffer, headerBuffer);
  959. }
  960. /// <summary>
  961. /// 加载电子地图背景图片
  962. /// </summary>
  963. /// <param name="struri">电子地图图片位置</param>
  964. public void MapInit(string struri)
  965. {
  966. ImageBrush imageBrush = new ImageBrush();
  967. imageBrush.ImageSource = new BitmapImage(new Uri(struri, UriKind.RelativeOrAbsolute));
  968. imageBrush.Stretch = Stretch.Uniform;
  969. //imageBrush.Stretch = Stretch.Fill;
  970. imageBrush.AlignmentX = AlignmentX.Left;
  971. imageBrush.AlignmentY = AlignmentY.Top;
  972. canvas.Background = imageBrush;
  973. }
  974. /// <summary>
  975. /// agv表格绑定数据初始化
  976. /// </summary>
  977. /// <param name="agvnum"></param>
  978. public void AGVGridInit(int agvnum)
  979. {
  980. //AgvMember agvMember = null;
  981. AGV_DisMember agvMember = null;
  982. for (int i = 0; i < agvnum; i++)
  983. {
  984. //agvMember = new AgvMember() ;
  985. agvMember = new AGV_DisMember();
  986. agvMember.txtAGVNum = "AGV" + (i + 1).ToString();
  987. agvMember.PropertyChanged += new PropertyChangedEventHandler(Dis_PropertyChange);
  988. agvMember.AgvLabel = dislable[i];
  989. agvMember.AgvImage = animatedImage[i];
  990. //member.Add(agvMember);
  991. memberData.Add(agvMember);
  992. AgvStatusTimeSpan agv = new AgvStatusTimeSpan();
  993. agv.AgvNum = i + 1;
  994. //agv.StartTime = DateTime.Now;
  995. useRateTimeList.Add(agv);
  996. agv.Insert(agv.AgvNum, agv.StartTime, 0, 0);
  997. }
  998. //dataGrid.DataContext = member;
  999. dataGrid.DataContext = memberData;
  1000. //加载AGV名称设置
  1001. SerialClass mySerial = AgvAliasWindowModel.LoadFile(AgvAliasWindowModel.configFile);
  1002. for (int i = 0; i < AGVNUM_MAX; i++)
  1003. {
  1004. //member[i].txtAgvAliasValue = mySerial.dic[member[i].txtAGVNum];
  1005. memberData[i].txtAgvAlias = mySerial.dic[memberData[i].txtAGVNum];
  1006. }
  1007. }
  1008. public void TrafficGridInit()
  1009. {
  1010. //TrafficAreaModel traffic = new TrafficAreaModel();
  1011. //dataGrid2.DataContext = TrafficMember;
  1012. }
  1013. public static BitmapImage GetImageFromFile(string filePath)
  1014. {
  1015. System.IO.FileStream stream = System.IO.File.Open(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
  1016. byte[] buffer = new byte[stream.Length];
  1017. stream.Read(buffer, 0, buffer.Length);
  1018. stream.Close();
  1019. BitmapImage bmp = new BitmapImage();
  1020. bmp.BeginInit();
  1021. bmp.StreamSource = new System.IO.MemoryStream(buffer);
  1022. bmp.EndInit();
  1023. return bmp;
  1024. }
  1025. /// <summary>
  1026. /// 故事板初始化
  1027. /// </summary>
  1028. private void StoryboardInit()
  1029. {
  1030. //连线动画故事板
  1031. for (int i = 0; i < myLineStoryboard.Length; i++)
  1032. {
  1033. myLineStoryboard[i] = new Storyboard();
  1034. }
  1035. /*
  1036. * 闪烁的间隔秒数更改:
  1037. * 原值:0:100,1:200;
  1038. * 改成:0:200,1:400
  1039. * 修改人:胡文辉
  1040. * 修改时间:2016-12-14
  1041. */
  1042. //报警闪烁关键帧动画
  1043. CarWarnningAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(200))));
  1044. CarWarnningAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(1, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(400))));
  1045. CarWarnningAnimation.RepeatBehavior = RepeatBehavior.Forever;
  1046. for (int i = 0; i < animatedImage.Length; i++)
  1047. {
  1048. animationX[i] = new DoubleAnimationUsingPath();
  1049. animationX[i].Source = PathAnimationSource.X;
  1050. animationY[i] = new DoubleAnimationUsingPath();
  1051. animationY[i].Source = PathAnimationSource.Y;
  1052. animationAngle[i] = new DoubleAnimationUsingPath();
  1053. animationAngle[i].Source = PathAnimationSource.Angle;
  1054. animatedImage[i] = new Image();
  1055. //animatedImage[i].Source = new BitmapImage(new Uri(@"Image\navigation_24.png", UriKind.RelativeOrAbsolute));
  1056. /************************************************************************/
  1057. /* 修改日期:2014.7.25
  1058. * 修改说明:实现了每辆AGV运行箭头的自定义功能,当没图片将采用默认箭头图标
  1059. 修改者:肖丁铭*/
  1060. /************************************************************************/
  1061. string filePath = @"Image\箭头\" + "AGV" + (i + 1).ToString() + ".png";
  1062. if (System.IO.File.Exists(filePath))
  1063. {
  1064. animatedImage[i].Source = GetImageFromFile(filePath);
  1065. }
  1066. else if (System.IO.File.Exists(@"Image\箭头\Default.png"))
  1067. {
  1068. animatedImage[i].Source = GetImageFromFile(@"Image\箭头\Default.png");
  1069. }
  1070. else
  1071. {
  1072. animatedImage[i].Source = new BitmapImage(new Uri(@"Image\navigation_24.png", UriKind.RelativeOrAbsolute));
  1073. }
  1074. animatedImage[i].Width = GlobalPara.AgvIconW;
  1075. animatedImage[i].Height = GlobalPara.AgvIconH;
  1076. /************************************************************************/
  1077. /* 2014.11.26 */
  1078. /************************************************************************/
  1079. Canvas.SetTop(animatedImage[i], -this.animatedImage[i].ActualHeight / 2);
  1080. Canvas.SetLeft(animatedImage[i], -this.animatedImage[i].ActualWidth / 2);
  1081. this.animatedImage[i].RenderTransformOrigin = new Point(0.5, 0.5);
  1082. ////
  1083. canvas.Children.Add(animatedImage[i]);
  1084. TranslateTransform translate = new TranslateTransform();
  1085. RotateTransform rotate = new RotateTransform();
  1086. TransformGroup group = new TransformGroup();
  1087. group.Children.Add(rotate);//先旋转
  1088. group.Children.Add(translate);//再平移
  1089. this.animatedImage[i].RenderTransform = group;
  1090. //文字只平移,不旋转
  1091. TransformGroup group1 = new TransformGroup();
  1092. group1.Children.Add(translate);//平移
  1093. this.dislable[i].RenderTransform = group1;
  1094. this.RegisterName("translate" + (i + 1).ToString(), translate);
  1095. this.RegisterName("rotate" + (i + 1).ToString(), rotate);
  1096. Storyboard.SetTargetName(animationX[i], "translate" + (i + 1).ToString());
  1097. Storyboard.SetTargetName(animationY[i], "translate" + (i + 1).ToString());
  1098. Storyboard.SetTargetName(animationAngle[i], "rotate" + (i + 1).ToString());
  1099. Storyboard.SetTargetProperty(animationX[i], new PropertyPath(TranslateTransform.XProperty));
  1100. Storyboard.SetTargetProperty(animationY[i], new PropertyPath(TranslateTransform.YProperty));
  1101. Storyboard.SetTargetProperty(animationAngle[i], new PropertyPath(RotateTransform.AngleProperty));
  1102. }
  1103. }
  1104. /// <summary>
  1105. /// 小车线路连线初始化
  1106. /// </summary>
  1107. private void Line_Init()
  1108. {
  1109. //AGV编号标签
  1110. for (int i = 0; i < dislable.Length; i++)
  1111. {
  1112. dislable[i] = new System.Windows.Controls.Label();
  1113. //dislable[i].Content = "AGV" + (i + 1).ToString();
  1114. dislable[i].Content = (i + 1).ToString();
  1115. dislable[i].Height = 30;
  1116. //dislable[i].Width = 160;
  1117. dislable[i].FontSize = 12;
  1118. dislable[i].Foreground = Brushes.PaleVioletRed;
  1119. dislable[i].FontWeight = FontWeights.UltraBold;
  1120. }
  1121. //连接虚线
  1122. for (int i = 0; i < Dottedline.Length; i++)
  1123. {
  1124. Dottedline[i] = new System.Windows.Shapes.Path();
  1125. Dottedline[i].StrokeThickness = 2;
  1126. Dottedline[i].Stroke = Brushes.GreenYellow;
  1127. DoubleCollection dc = new DoubleCollection();
  1128. dc.Add(5);
  1129. Dottedline[i].StrokeDashArray = dc;
  1130. }
  1131. //运行段起终点
  1132. for (int i = 0; i < startellipse.Length; i++)
  1133. {
  1134. startellipse[i] = new Ellipse();
  1135. endellipse[i] = new Ellipse();
  1136. startellipse[i].Height = 10;
  1137. startellipse[i].Width = 10;
  1138. endellipse[i].Height = 10;
  1139. endellipse[i].Width = 10;
  1140. }
  1141. }
  1142. //AGVInfoService agvService = null;
  1143. /// <summary>
  1144. /// 缓存区初始化
  1145. /// </summary>
  1146. private void InitBuffer()
  1147. {
  1148. AGVInfoService agvService = new AGVInfoService();
  1149. TrafficAreaService traffic = new TrafficAreaService();
  1150. #region 初始化缓存区,存放AGV运行数据和管制区数据
  1151. agvService.InitAgvBuffer();
  1152. traffic.InitTrafficBuffer();
  1153. //traffic.InitTrafficMarkBuffer();
  1154. #endregion
  1155. }
  1156. #endregion
  1157. public void PostPelletIdStatus(StationInfo infos, string ApiAdress)
  1158. {
  1159. string address = "http://10.197.244.100:10057";
  1160. string url = address + ApiAdress;
  1161. string id = DateTime.Now.ToString("yyyyMMddhhmmssffff");
  1162. string s = $"123 {id}";
  1163. AGVInfo info = GetStationInfo(infos.Mark);
  1164. if (info.AgvCode != 0)
  1165. {
  1166. info.stationName = infos.StationName;
  1167. info.Time = DateTime.Now;
  1168. bool res = WcsApi.Post(url, null, info, out string data, out string msg);
  1169. string str = $"离港上报:{res},信息:{msg},数据:{data}";
  1170. 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}
  1171. WriteFile("离港上报-" + DateTime.Now.ToString("yyyy-MM-dd"), Responses);
  1172. }
  1173. string Responses1 = $"离港记录:工站名={info.stationName},mark ={infos.Mark}, AGVID = {info.AgvCode},ProductCode = {info.ProductCode},HolderBarCode = {info.HolderBarCode},ProductType = {info.ProductType},返回时间 = {DateTime.Now.ToString()}";//,产品个数 = {products.Count}
  1174. WriteFile("MES工位点记录-" + DateTime.Now.ToString("yyyy-MM-dd"), Responses1);
  1175. }
  1176. private static object portLock = new object();
  1177. void WriteFile(string fileName, string context)
  1178. {
  1179. try
  1180. {
  1181. lock (portLock)
  1182. {
  1183. DateTime time = DateTime.Now;
  1184. //MessageBox.Show("线程异常:"+e.ExceptionObject);
  1185. FileStream stream = File.Open(@"Exception\" + fileName + ".txt", FileMode.Append, FileAccess.Write);
  1186. StreamWriter writer = new StreamWriter(stream);
  1187. {
  1188. string msg = string.Format("[{0}]Test:\r\nMessage:{1}\r\n", time.ToString("yyyy-MM-dd HH:mm:ss"), context);
  1189. writer.WriteLine(msg);
  1190. writer.Close();
  1191. stream.Close();
  1192. }
  1193. }
  1194. }
  1195. catch (Exception)
  1196. {
  1197. }
  1198. }
  1199. PLCSqlDLL PLCSql = new PLCSqlDLL();
  1200. public AGVInfo GetStationInfo(string statiom)
  1201. {
  1202. string mark = "";
  1203. AGVInfo Agvinfo = new AGVInfo();
  1204. try
  1205. {
  1206. {
  1207. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  1208. List<AGVInfoModel> temp4 = listModel.FindAll(o => (o.MARKNUM.ToString() == statiom && o.ConnectStatus == true && o.AGVNUM != 0));
  1209. if (temp4 != null && temp4.Count() > 0)
  1210. {
  1211. List<AGVInfoModel> infos = temp4.ToList();
  1212. infos = infos.OrderByDescending(o => o.LastModifyMarkTime).ToList();
  1213. AGVInfoModel info = infos[0];
  1214. if (info != null && info.IsOutFlag)
  1215. {
  1216. PLCSql.PLCMESSelect(info.AGVNUM.ToString(), "2", ref Agvinfo);
  1217. // DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0);
  1218. info.IsReachFlag = false;
  1219. info.IsOutFlag = false;
  1220. }
  1221. }
  1222. // List<AGVInfoModel> results = listModel.FindAll(o => o.MARKNUM.ToString() == statiom && o.ConnectStatus == true); //停止点有车
  1223. }//
  1224. }
  1225. catch (Exception ex)
  1226. {
  1227. }
  1228. return Agvinfo;
  1229. }
  1230. public void LoadConfig()
  1231. {
  1232. string currPath = System.AppDomain.CurrentDomain.BaseDirectory;
  1233. string dataPath = currPath + @"data";
  1234. string dataFile = dataPath + @"\对接配置表.xls";
  1235. try
  1236. {
  1237. string confStr1 = @"Provider=Microsoft.ACE.OLEDB.12.0;";
  1238. string confStr2 = @"Persist Security Info=false;";
  1239. string confStr3 = @"Data Source=" + dataFile + ";";
  1240. string confStr4 = @"Extended Properties=" + "'Excel 12.0;HDR=YES;IMEX=1'";
  1241. string connStr = confStr1 + confStr2 + confStr3 + confStr4;
  1242. OleDbConnection oleDC = new OleDbConnection(connStr);
  1243. OleDbDataAdapter oleDDA1 = new OleDbDataAdapter("Select * From [参数设置$]", oleDC);
  1244. oleDDA1.Fill(GlobalPara.DtWirelessBox);
  1245. if (!Directory.Exists("D:/Logs/对接盒记录"))
  1246. {
  1247. Directory.CreateDirectory("D:/Logs/对接盒记录");
  1248. }
  1249. GlobalPara.logNetDateTimeTrans = new HslCommunication.LogNet.LogNetDateTime("D:/Logs/对接盒记录", HslCommunication.LogNet.GenerateMode.ByEveryDay);
  1250. }
  1251. catch (Exception ex)
  1252. {
  1253. MessageBox.Show(ex.StackTrace);
  1254. }
  1255. }
  1256. public void PLCFlag()
  1257. {
  1258. }
  1259. #region 事件委托触发更新
  1260. Dictionary<int, byte[]> ReceiveDataDic = new Dictionary<int, byte[]>();
  1261. List<byte> tempbuffer = new List<byte>();
  1262. List<string> EmergencyList = new List<string> { "38","39","44"};
  1263. /// <summary>
  1264. /// 串口类SerialPortWrapper的数据接收触发委托函数
  1265. /// </summary>
  1266. /// <param name="sender"></param>
  1267. /// <param name="e"></param>
  1268. void SPComControl_OnDataReceived(object sender, SerialDataReceivedEventArgs e)
  1269. {
  1270. try
  1271. {
  1272. SerialPort port = sender as SerialPort;
  1273. AGVInfoService agvService = new AGVInfoService();
  1274. int index = SPComCOntrolList.FindIndex(c => c.portname == port.PortName);
  1275. // int index1 = SPComCOntrolList.FindIndex(a=>a.portname==port.PortName);
  1276. if (index != -1)
  1277. {
  1278. int n = SPComCOntrolList[index].BytesToRead;
  1279. byte[] RecBuffer = new byte[n];//缓存接收到的数据
  1280. SPComCOntrolList[index].Read(RecBuffer, 0, n);
  1281. // bool flag;
  1282. if (RecBuffer[0] == 0xAA)
  1283. {
  1284. string Mark = RecBuffer[7].ToString();
  1285. ControlAGVStop(Mark, RecBuffer[2]);
  1286. } //急停控制
  1287. else
  1288. {
  1289. string Mark = RecBuffer[DispatcherTool.COM_MARK + 1].ToString();
  1290. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  1291. if (RecBuffer[1] == 0x37)
  1292. {
  1293. {
  1294. if (GlobalPara.plcs.Count > 0)
  1295. {
  1296. List<DataRow> list = GlobalPara.plcs.Keys.ToList();
  1297. DataRow dr = list.Find(o => o["工位地标"].ToString() == Mark);
  1298. if (dr != null && GlobalPara.plcs.ContainsKey(dr))
  1299. {
  1300. if (dr.Table.Columns.Contains("请求出门DB")&&!string.IsNullOrEmpty(dr["请求出门DB"].ToString()))
  1301. {
  1302. GlobalPara.plcs[dr].Write(dr["请求出门DB"].ToString(), true);
  1303. return;
  1304. }
  1305. }
  1306. }
  1307. }
  1308. }
  1309. if (Mark != "36")
  1310. {
  1311. List<AGVInfoModel> results = listModel.FindAll(o => o.MARKNUM.ToString() == Mark && o.ConnectStatus == true && (o.RUNSTATUS_Cur == 0x41|| o.RUNSTATUS_Cur == 0x44)); //停止点有车
  1312. if (results != null && results.Count > 0)
  1313. {
  1314. foreach (AGVInfoModel info in results)
  1315. {
  1316. if (info != null)
  1317. {
  1318. if (info.EmergencyCar == false && EmergencyList.Contains(info.MARKNUM.ToString()))
  1319. {
  1320. WriteFile("线束记录" + DateTime.Now.ToString("yyyy-MM-dd"), "AGVID+" + info.AGVNUM + " 线束信号为:+" + info.EmergencyCar + "无法放行,Mark:+" + info.MARKNUM.ToString() + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  1321. }
  1322. else
  1323. {
  1324. WriteFile("线束记录" + DateTime.Now.ToString("yyyy-MM-dd"), "AGVID+" + info.AGVNUM + " 线束信号为:+" + info.EmergencyCar + "正常放行 , Mark:+" + info.MARKNUM.ToString() + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  1325. communication.SendData(RecBuffer, null);
  1326. if (RecBuffer[1] == 0x37)
  1327. {
  1328. if (!GlobalPara.ReleaseMarkList.Contains(Mark))
  1329. {
  1330. GlobalPara.ReleaseMarkList.Add(Mark);
  1331. WriteFile("点灭放行盒记录" + DateTime.Now.ToString("yyyy-MM-dd"), "工位放行成功,等待点灭,当前放行地标:" + info.MARKNUM + ",车号为:" + info.AGVNUM);
  1332. }
  1333. }
  1334. }
  1335. }
  1336. }
  1337. }
  1338. }
  1339. else //同一放行盒放两个地标
  1340. {
  1341. List<AGVInfoModel> results = listModel.FindAll(o => o.MARKNUM.ToString() == "63" && o.ConnectStatus == true && (o.RUNSTATUS_Cur == 0x41 || o.RUNSTATUS_Cur == 0x44)); //停止点有车
  1342. if (results != null && results.Count > 0)
  1343. {
  1344. RecBuffer[DispatcherTool.COM_MARK + 1] = 0x3F;
  1345. string Mark2 = RecBuffer[DispatcherTool.COM_MARK + 1].ToString();
  1346. RecBuffer[DispatcherTool.COM_CHECK] = DispatcherTool.XOR_Check(RecBuffer, 12); //校验
  1347. WriteFile("63判断放行记录-" + DateTime.Now.ToString("yyyy-MM-dd"), "小车放行记录2:" + Mark2);
  1348. }
  1349. communication.SendData(RecBuffer, null);
  1350. if (RecBuffer[1] == 0x37)
  1351. {
  1352. if (!GlobalPara.ReleaseMarkList.Contains(Mark))
  1353. {
  1354. GlobalPara.ReleaseMarkList.Add(Mark);
  1355. WriteFile("点灭放行盒记录" + DateTime.Now.ToString("yyyy-MM-dd"), "工位放行成功,等待点灭,当前放行地标:" + Mark);
  1356. }
  1357. }
  1358. }
  1359. //List<AGVInfoModel> results1 = listModel.FindAll(o => o.MARKNUM.ToString() == Mark && o.ConnectStatus == true && (o.RUNSTATUS_Cur == 0x40)); //运行
  1360. //if (results1 != null && results1.Count > 0)
  1361. //{
  1362. // if (RecBuffer[1] == 0x37)
  1363. // {
  1364. // MainWindow.ReleaseStopPoint(int.Parse(Mark), 0); //点灭放行盒
  1365. // }
  1366. //}
  1367. // MainWindow.ReleaseStopPoint(RecBuffer[DispatcherTool.COM_MARK+1], 0); //点灭放行盒
  1368. }
  1369. // tempbuffer.RemoveAt(0);
  1370. // info1.StationName = dr["工位名称"].ToString();
  1371. // if (!GlobalPara.UseNewProtrol)
  1372. {
  1373. //if (GlobalPara.DataHandleType == 1)
  1374. //{
  1375. // tempbuffer.AddRange(RecBuffer);
  1376. // byte ver = 0;
  1377. // #region 数据处理
  1378. // while (tempbuffer.Count >= 10)
  1379. // {
  1380. // if (DrvWlConCheck(tempbuffer, 8, out ver))
  1381. // {
  1382. // #region
  1383. // tempbuffer.CopyTo(0, buf_rettraffic, 0, 10);
  1384. // tempbuffer.RemoveRange(0, 10);
  1385. // if (UdpCommunication.ByteToHexString(buf_rettraffic) == str1061)
  1386. // {
  1387. // continue;
  1388. // }
  1389. // #region 数据转发
  1390. // //if (GlobalPara.IsEnableDataShare)
  1391. // {
  1392. // //Action action = new Action(delegate()
  1393. // //{
  1394. // // if (ShareData(tempbuffer.ToArray()).Length > 9)
  1395. // // {
  1396. // // socketclient.socket_send(ShareData(tempbuffer.ToArray()));
  1397. // // }
  1398. // //});
  1399. // //action.BeginInvoke(null, null);
  1400. // }
  1401. // #endregion
  1402. // if (ReceiveDataDic.Keys.Contains(buf_rettraffic[2]))
  1403. // {
  1404. // int agvnum = buf_rettraffic[2];
  1405. // //if (ReceiveDataDic[agvnum] != buf_rettraffic)
  1406. // {
  1407. // ReceiveDataDic[agvnum] = buf_rettraffic;
  1408. // try
  1409. // {
  1410. // //DrvWlCon_AgvStatus(buf_rettraffic.ToList());
  1411. // agvser.UpdateBuffer(buf_rettraffic.ToList());
  1412. // }
  1413. // catch (System.Exception ex)
  1414. // {
  1415. // MessageBox.Show(ex.Message+" 1185");
  1416. // }
  1417. // }
  1418. // }
  1419. // else
  1420. // {
  1421. // ReceiveDataDic.Add(buf_rettraffic[2], buf_rettraffic);
  1422. // try
  1423. // {
  1424. // agvser.UpdateBuffer(buf_rettraffic.ToList());
  1425. // }
  1426. // catch (System.Exception ex)
  1427. // {
  1428. // MessageBox.Show(ex.Message + " 1198");
  1429. // }
  1430. // }
  1431. // #endregion
  1432. // }
  1433. // else
  1434. // {
  1435. // tempbuffer.RemoveAt(0);
  1436. // }
  1437. // }
  1438. // #endregion
  1439. //}
  1440. //else if (GlobalPara.DataHandleType == 0)
  1441. {
  1442. // bufferList[index].AddRange(RecBuffer);
  1443. // byte[] tempbuffer = CheckData(RecBuffer);
  1444. {
  1445. // agvService.UpdateBuffer(RecBuffer.ToList());
  1446. }
  1447. }
  1448. }
  1449. //else
  1450. //{
  1451. // if (GlobalPara.DataHandleType == 0)
  1452. // {
  1453. // tempbuffer.AddRange(RecBuffer);
  1454. // byte ver = 0;
  1455. // #region 数据处理
  1456. // while (tempbuffer.Count >= 19)
  1457. // {
  1458. // if (DrvWlConCheck(tempbuffer, 17, out ver))
  1459. // {
  1460. // #region
  1461. // tempbuffer.CopyTo(0, buf_trafficct3, 0, 19);
  1462. // tempbuffer.RemoveRange(0, 19);
  1463. // if (UdpCommunication.ByteToHexString(buf_trafficct3) == str1063)
  1464. // {
  1465. // continue;
  1466. // }
  1467. // #region 数据转发
  1468. // #endregion
  1469. // if (ReceiveDataDic.Keys.Contains(buf_trafficct3[2]))
  1470. // {
  1471. // int agvnum = buf_trafficct3[2];
  1472. // //if (ReceiveDataDic[agvnum] != buf_rettraffic)
  1473. // {
  1474. // ReceiveDataDic[agvnum] = buf_trafficct3;
  1475. // try
  1476. // {
  1477. // //DrvWlCon_AgvStatus(buf_rettraffic.ToList());
  1478. // agvser.UpdateBuffer(buf_trafficct3.ToList());
  1479. // }
  1480. // catch (System.Exception ex)
  1481. // {
  1482. // MessageBox.Show(ex.Message + " 1251");
  1483. // }
  1484. // }
  1485. // }
  1486. // else
  1487. // {
  1488. // ReceiveDataDic.Add(buf_trafficct3[2], buf_trafficct3);
  1489. // try
  1490. // {
  1491. // agvser.UpdateBuffer(buf_trafficct3.ToList());
  1492. // }
  1493. // catch (System.Exception ex)
  1494. // {
  1495. // MessageBox.Show(ex.Message + " 1264");
  1496. // }
  1497. // }
  1498. // #endregion
  1499. // }
  1500. // else
  1501. // {
  1502. // tempbuffer.RemoveAt(0);
  1503. // }
  1504. // }
  1505. // #endregion
  1506. // }
  1507. // else if (GlobalPara.DataHandleType == 1)
  1508. // {
  1509. // bufferList[index].AddRange(RecBuffer);
  1510. // byte[] tempbuffer = CheckData(RecBuffer);
  1511. // {
  1512. // agvService.UpdateBuffer(tempbuffer.ToList());
  1513. // }
  1514. // }
  1515. //}
  1516. }
  1517. }
  1518. catch (Exception es)
  1519. {
  1520. }
  1521. // SPComCOntrolList[index].Dispose();
  1522. }
  1523. public bool ControlAGVStop(string mark, byte type)
  1524. {
  1525. Boolean flag = false;
  1526. String ReleaseType = "";
  1527. try
  1528. {
  1529. {
  1530. List<AGVInfoModel> listModel = GlobalPara.AgvInfoDic.Values.ToList();
  1531. List<AGVInfoModel> results = listModel.FindAll(o => o.MARKNUM.ToString() == mark && o.ConnectStatus == true); //停止点有车
  1532. if (results != null && results.Count > 0)
  1533. {
  1534. foreach (AGVInfoModel info in results)
  1535. {
  1536. if (info != null)
  1537. {
  1538. switch (type)
  1539. {
  1540. case 0x50:
  1541. DispatcherTool.ControlAGVBy1071(info.AGVNUM, 1); //急停
  1542. ReleaseType = "小车急停"; // WriteFile("工位点记录-" + dr["IP地址"].ToString() + "-" + DateTime.Now.ToString("yyyy-MM-dd"), "(放行地标:" + info.MARKNUM + ",放行路线:0" + ", " + ",车号:" + info.AGVNUM + ",急停) ");
  1543. break;
  1544. case 0x40:
  1545. DispatcherTool.ControlAGVBy1071(info.AGVNUM, 0); //解除急停放行
  1546. ReleaseType = "急停解除";
  1547. break;
  1548. }
  1549. WriteFile("MES站急停小车记录", "AGVID+" + info.AGVNUM + "Type:+" + ReleaseType + " Mark:+" + info.MARKNUM.ToString() + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  1550. // info.AllowReleaseFlag = true;
  1551. flag = true;
  1552. }
  1553. }
  1554. }
  1555. }
  1556. Thread.Sleep(500);
  1557. } //AGVpos为false代表未叫车 才进循环
  1558. catch (Exception ex)
  1559. {
  1560. }
  1561. return flag;
  1562. }
  1563. public void SendDataToServer()
  1564. {
  1565. while (GlobalPara.IsEnableDataShare)
  1566. {
  1567. if (SendIndex == GlobalPara.AgvInfoDic.Count + 1)
  1568. {
  1569. SendIndex = 1;
  1570. }
  1571. if (GlobalPara.AgvInfoDic != null && GlobalPara.AgvInfoDic.Count > 0 && socketclient != null
  1572. && GlobalPara.AgvInfoDic.ContainsKey(SendIndex))
  1573. {
  1574. AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[SendIndex];
  1575. if (agvinfo.MARKNUM != 0)
  1576. {
  1577. bool runflag = true;
  1578. byte status = 0;
  1579. byte[] buf_ShareDate = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 };
  1580. byte temp = (byte)agvinfo.RUNSTATUS;
  1581. switch (temp)
  1582. {
  1583. case 0x40:
  1584. runflag = true;
  1585. status = 0;
  1586. break;
  1587. case 0x41:
  1588. //memberData[i].txtStatusValue = "暂停";
  1589. case 0x42:
  1590. //memberData[i].txtStatusValue = "结束地标停止";
  1591. case 0x43:
  1592. //memberData[i].txtStatusValue = "停止";
  1593. case 0x44:
  1594. //memberData[i].txtStatusValue = "充电中";
  1595. runflag = false;
  1596. status = 0;
  1597. break;
  1598. default:
  1599. runflag = true;
  1600. status = temp;
  1601. break;
  1602. }
  1603. if (status == 0)
  1604. {
  1605. if (runflag)//运行状态
  1606. {
  1607. buf_ShareDate[6] = 0x02;
  1608. }
  1609. else//停止状态
  1610. {
  1611. buf_ShareDate[6] = 0x01;
  1612. }
  1613. buf_ShareDate[9] = 0x00;
  1614. }
  1615. else//有故障
  1616. {
  1617. buf_ShareDate[6] = 0x00;
  1618. buf_ShareDate[9] = (byte)((temp & 0x3f) + 0x01);
  1619. }
  1620. buf_ShareDate[1] = (byte)agvinfo.AGVNUM;
  1621. //修改说明:地标号扩展两位,速度等级的bit8,bit7作为地标号的bit9,bit10
  1622. // buf_ShareDate[2] = Convert.ToByte(buf[3] | ((buf[7] & 0xC0) << 2));//地标
  1623. int mark = agvinfo.MARKNUM;
  1624. buf_ShareDate[2] = (byte)((mark & 0xff00) >> 8);
  1625. buf_ShareDate[3] = (byte)(mark & 0x00ff);
  1626. buf_ShareDate[4] = (byte)agvinfo.ROUTENUM;//路线
  1627. buf_ShareDate[5] = Convert.ToByte(agvinfo.SPEEDLEVEL);//速度
  1628. buf_ShareDate[7] = 0; //电压
  1629. buf_ShareDate[8] = 0; //电流
  1630. //buf_ShareDate[9] = 0; //备用
  1631. buf_ShareDate[10] = 0; //备用
  1632. buf_ShareDate[11] = 0; //备用
  1633. buf_ShareDate[12] = DrvWlConGetBCC(buf_ShareDate, buf_ShareDate.Length - 2);//校验位;
  1634. socketclient.socket_send(buf_ShareDate);
  1635. }
  1636. }
  1637. SendIndex++;
  1638. Thread.Sleep(100);
  1639. }
  1640. }
  1641. /// <summary>
  1642. /// TCP要转发的数据
  1643. /// </summary>
  1644. /// <param name="buf"></param>
  1645. /// <returns></returns>
  1646. public byte[] ShareData(byte[] buf)
  1647. {
  1648. bool runflag = true;
  1649. byte status = 0;
  1650. byte[] buf_ShareDate = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 };
  1651. int agvnum = buf[2];
  1652. if ((agvnum > 0) && (agvnum <= AGVNUM_MAX))
  1653. {
  1654. switch (buf[5])
  1655. {
  1656. case 0x40:
  1657. runflag = true;
  1658. status = 0;
  1659. break;
  1660. case 0x41:
  1661. //memberData[i].txtStatusValue = "暂停";
  1662. case 0x42:
  1663. //memberData[i].txtStatusValue = "结束地标停止";
  1664. case 0x43:
  1665. //memberData[i].txtStatusValue = "停止";
  1666. case 0x44:
  1667. //memberData[i].txtStatusValue = "充电中";
  1668. runflag = false;
  1669. status = 0;
  1670. break;
  1671. default:
  1672. runflag = true;
  1673. status = buf[5];
  1674. break;
  1675. }
  1676. }
  1677. if (status == 0)
  1678. {
  1679. if (runflag)//运行状态
  1680. {
  1681. buf_ShareDate[7] = 0x02;
  1682. }
  1683. else//停止状态
  1684. {
  1685. buf_ShareDate[7] = 0x01;
  1686. }
  1687. buf_ShareDate[8] = 0x00;
  1688. }
  1689. else//有故障
  1690. {
  1691. buf_ShareDate[7] = 0x00;
  1692. buf_ShareDate[8] = (byte)((buf[5] & 0x3f) + 0x01);
  1693. }
  1694. buf_ShareDate[1] = buf[2]; //得到AGV编号,编号从0x01开始
  1695. //if (DrvWlConCheck(buf, 8) == VERIFY_NOERROR) //校验无错
  1696. {
  1697. //修改说明:地标号扩展两位,速度等级的bit8,bit7作为地标号的bit9,bit10
  1698. // buf_ShareDate[2] = Convert.ToByte(buf[3] | ((buf[7] & 0xC0) << 2));//地标
  1699. int mark = (int)buf[3] | ((buf[7] & 0xC0) << 2);
  1700. buf_ShareDate[2] = (byte)((mark & 0xff00) >> 8);
  1701. buf_ShareDate[3] = (byte)(mark & 0x00ff);
  1702. buf_ShareDate[5] = buf[6];//路线
  1703. buf_ShareDate[6] = Convert.ToByte(buf[7] & 0x3F);//速度
  1704. //buf_ShareDate[7] = 0; //电压
  1705. //buf_ShareDate[8] = 0; //电流
  1706. //buf_ShareDate[9] = 0; //备用
  1707. buf_ShareDate[10] = 0; //备用
  1708. buf_ShareDate[11] = 0; //备用
  1709. buf_ShareDate[12] = DrvWlConGetBCC(buf_ShareDate, buf_ShareDate.Length - 2);//校验位;
  1710. return buf_ShareDate;
  1711. }
  1712. }
  1713. /// <summary>
  1714. /// //用于管制逻辑的数据
  1715. /// </summary>
  1716. /// <param name="buf"></param>
  1717. void DrvWlCon_AgvStatus(List<byte> buf)
  1718. {
  1719. byte AgvNum = 0, SpeedGrade = 0;
  1720. int bMarkNum = 0;
  1721. AgvNum = buf[2]; //得到AGV编号,编号从0x01开始
  1722. AGVStatus[AgvNum - 1].Wlink_Count = 0;
  1723. //由于生产区在运行过程中不会改变,故将此放置在AGV的初始化中,不需要每次更新
  1724. AGVStatus[AgvNum - 1].AgvNum = AgvNum;
  1725. AGVStatus[AgvNum - 1].MarkNum = Convert.ToInt16(buf[3] | ((buf[7] & 0xC0) << 2));
  1726. AGVStatus[AgvNum - 1].LineNum = buf[6];
  1727. //| ((buf[8] & 0xFF) << 8)
  1728. if (bMarkNum > 0)
  1729. {
  1730. //AGVStatus[AgvNum - 1].MarkNum = bMarkNum;
  1731. //当前AGV运行速度等级,不会接收到保持现状的0
  1732. //修改时间:2013-11-28
  1733. //修改说明:屏蔽速度等级的bit8,bit7
  1734. SpeedGrade = Convert.ToByte(buf[7] & 0x3F);
  1735. if (SpeedGrade > 0 && SpeedGrade < SpeedOpt.Length)
  1736. {
  1737. AGVStatus[AgvNum - 1].Speed = SpeedGrade;
  1738. }
  1739. //当前地标功能
  1740. if (buf[4] > 0 && buf[4] < MarkFuncOpt.Length)
  1741. {
  1742. AGVStatus[AgvNum - 1].MarkFunction = buf[4];
  1743. }
  1744. //当前AGV运行路线
  1745. //AGVStatus[AgvNum - 1].LineNum = buf[6];
  1746. //新协议增加电压电流
  1747. if (buf.Count == 16)
  1748. {
  1749. ushort uVoltage = (ushort)(buf[8] << 8 | buf[9]);
  1750. ushort temp = (ushort)(buf[10] << 8 | buf[11]);
  1751. ushort uCurrent = (ushort)(temp);
  1752. AGVStatus[AgvNum - 1].Voltage = uVoltage / 10.0f;
  1753. AGVStatus[AgvNum - 1].Current = uCurrent / 10.0f;
  1754. }
  1755. else
  1756. {
  1757. AGVStatus[AgvNum - 1].Voltage = 0;
  1758. AGVStatus[AgvNum - 1].Current = 0;
  1759. }
  1760. }
  1761. //当前AGV状态,由于接收到数据不是按照顺序,中间有间隔,在使用时才验证数据正确性
  1762. AGVStatus[AgvNum - 1].Status = (byte)(buf[5] & 0x7f);//不取最高位
  1763. //方向,取运行状态中最高位
  1764. AGVStatus[AgvNum - 1].Direction = (byte)((buf[5] >> 7) & 1);
  1765. AGVStatus[AgvNum - 1].WlLink = AGVWLLINK_OK;
  1766. }
  1767. /// <summary>
  1768. /// 网口类数据接收触发委托事件
  1769. /// </summary>
  1770. /// <param name="o"></param>
  1771. /// <param name="e"></param>
  1772. void communication_ReceivedEvent(object o, ReceivedEventArgs e)
  1773. {
  1774. try
  1775. {
  1776. IPEndPoint remotePoint = o as IPEndPoint;
  1777. if (e.buffer[0] == 0x10 && e.buffer[1] == 0x37 && e.buffer.Length == 14)
  1778. {
  1779. communication.SendData(e.buffer, null);
  1780. string str = string.Format("收到IP为{0}的盒子放行数据:{1}", remotePoint.Address.ToString(), DispatcherTool.ByteToHexString(e.buffer));
  1781. return;
  1782. }
  1783. if (e != null && e.buffer != null && e.buffer.Length > 10)
  1784. {
  1785. if (!GlobalPara.UseNewProtrol)
  1786. {
  1787. if (GlobalPara.DataHandleType == 1)
  1788. {
  1789. buffer.AddRange(e.buffer);
  1790. byte ver = 0;
  1791. #region 数据处理
  1792. while (buffer.Count >= 10)
  1793. {
  1794. if (DrvWlConCheck(buffer, 8, out ver))
  1795. {
  1796. #region
  1797. byte[] tempBuffer = new byte[10];
  1798. buffer.CopyTo(0, tempBuffer, 0, 10);
  1799. buffer.RemoveRange(0, 10);
  1800. #region 数据转发
  1801. //if (GlobalPara.IsEnableDataShare)
  1802. {
  1803. //Action action = new Action(delegate()
  1804. //{
  1805. // if (ShareData(tempbuffer.ToArray()).Length > 9)
  1806. // {
  1807. // socketclient.socket_send(ShareData(tempbuffer.ToArray()));
  1808. // }
  1809. //});
  1810. //action.BeginInvoke(null, null);
  1811. }
  1812. #endregion
  1813. if (ReceiveDataDic.Keys.Contains(tempBuffer[2]))
  1814. {
  1815. int agvnum = tempBuffer[2];
  1816. //if (ReceiveDataDic[agvnum] != buf_rettraffic)
  1817. {
  1818. ReceiveDataDic[agvnum] = tempBuffer;
  1819. try
  1820. {
  1821. //DrvWlCon_AgvStatus(buf_rettraffic.ToList());
  1822. agvser.UpdateBuffer(tempBuffer.ToList(),remotePoint);
  1823. }
  1824. catch (System.Exception ex)
  1825. {
  1826. MessageBox.Show(ex.Message + " 1561");
  1827. }
  1828. }
  1829. }
  1830. else
  1831. {
  1832. ReceiveDataDic.Add(tempBuffer[2], tempBuffer);
  1833. try
  1834. {
  1835. agvser.UpdateBuffer(tempBuffer.ToList(),remotePoint);
  1836. }
  1837. catch (System.Exception ex)
  1838. {
  1839. MessageBox.Show(ex.Message + " 1574");
  1840. }
  1841. }
  1842. #endregion
  1843. }
  1844. else
  1845. {
  1846. buffer.RemoveAt(0);
  1847. }
  1848. }
  1849. #endregion
  1850. }
  1851. else if (GlobalPara.DataHandleType == 0)//线程中单独处理
  1852. {
  1853. //Thread t = new Thread(new ThreadStart(delegate
  1854. // {
  1855. agvService.UpdateBuffer(e.buffer.ToList(),remotePoint);
  1856. // }));
  1857. //t.IsBackground = true;
  1858. //t.Start();
  1859. }
  1860. }
  1861. else
  1862. {
  1863. if (GlobalPara.DataHandleType == 0)
  1864. {
  1865. buffer.AddRange(e.buffer);
  1866. #region 数据处理
  1867. while (buffer.Count >= 19)
  1868. {
  1869. byte ver = 0;
  1870. if (DrvWlConCheck(buffer, 17, out ver))
  1871. {
  1872. #region
  1873. byte[] tempBuffer = new byte[19];
  1874. buffer.CopyTo(0, tempBuffer, 0, 19);
  1875. buffer.RemoveRange(0, 19);
  1876. #region 数据转发
  1877. //if (GlobalPara.IsEnableDataShare)
  1878. {
  1879. //Action action = new Action(delegate()
  1880. //{
  1881. // if (ShareData(tempbuffer.ToArray()).Length > 9)
  1882. // {
  1883. // socketclient.socket_send(ShareData(tempbuffer.ToArray()));
  1884. // }
  1885. //});
  1886. //action.BeginInvoke(null, null);
  1887. }
  1888. #endregion
  1889. if (ReceiveDataDic.Keys.Contains(tempBuffer[2]))
  1890. {
  1891. int agvnum = tempBuffer[2];
  1892. //if (ReceiveDataDic[agvnum] != buf_rettraffic)
  1893. {
  1894. ReceiveDataDic[agvnum] = tempBuffer;
  1895. try
  1896. {
  1897. //DrvWlCon_AgvStatus(buf_rettraffic.ToList());
  1898. agvser.UpdateBuffer(tempBuffer.ToList(),remotePoint);
  1899. }
  1900. catch (System.Exception ex)
  1901. {
  1902. MessageBox.Show(ex.Message + " 1635");
  1903. }
  1904. }
  1905. }
  1906. else
  1907. {
  1908. ReceiveDataDic.Add(tempBuffer[2], tempBuffer);
  1909. try
  1910. {
  1911. agvser.UpdateBuffer(tempBuffer.ToList(), remotePoint);
  1912. }
  1913. catch (System.Exception ex)
  1914. {
  1915. MessageBox.Show(ex.Message + " 1648");
  1916. }
  1917. }
  1918. #endregion
  1919. }
  1920. else
  1921. {
  1922. buffer.RemoveAt(0);
  1923. }
  1924. }
  1925. #endregion
  1926. }
  1927. else if (GlobalPara.DataHandleType == 1)//线程中单独处理
  1928. {
  1929. agvService.UpdateBuffer(e.buffer.ToList(), remotePoint);
  1930. }
  1931. }
  1932. }
  1933. }
  1934. catch (Exception)
  1935. {
  1936. }
  1937. }
  1938. #region 校验数据
  1939. byte[] CheckData(byte[] buffer)
  1940. {
  1941. byte[] tempBuffer = null;
  1942. if (buffer.Length >= 10)
  1943. {
  1944. if (buffer[0] == 0x10 && (buffer[1] == 0x62 || buffer[1] == 0x72) && buffer[10] == DrvWlConGetBCC(buffer, 10) && buffer[11] == 0x03)
  1945. {
  1946. tempBuffer = new byte[12];
  1947. buffer.CopyTo(tempBuffer, 12);
  1948. return tempBuffer;
  1949. }
  1950. }
  1951. return tempBuffer;
  1952. }
  1953. #endregion
  1954. #region 电池信息
  1955. /// <summary>
  1956. /// 获取电池信息
  1957. /// </summary>
  1958. /// <param name="buffer">字节流</param>
  1959. /// <returns>电池对象</returns>
  1960. BatteryData GetBatteryData(byte[] buffer)
  1961. {
  1962. //电池信息从Buffer中第3字节开始
  1963. BatteryData data = new BatteryData();
  1964. byte temp;
  1965. data.AgvNum = buffer[2];
  1966. data.BMSAlarm = buffer[3];
  1967. data.BMSCommand = buffer[4];
  1968. data.Voltage = (ushort)(buffer[5] | buffer[6] << 8);
  1969. data.Temprature = (sbyte)buffer[7];
  1970. data.SOC = buffer[8];
  1971. data.Month = (ushort)(buffer[9] | buffer[10] << 8);
  1972. data.Date = (ushort)(buffer[11] | buffer[12] << 8);
  1973. data.Current = (ushort)(buffer[13] | buffer[14] << 8);
  1974. data.BatteryId = (ushort)(buffer[15] | buffer[16] << 8);
  1975. data.Cell1Voltage = (ushort)(buffer[17] | buffer[18] << 8);
  1976. data.Cell2Voltage = (ushort)(buffer[19] | buffer[20] << 8);
  1977. data.Cell3Voltage = (ushort)(buffer[21] | buffer[22] << 8);
  1978. data.Cell4Voltage = (ushort)(buffer[23] | buffer[24] << 8);
  1979. data.Cell5Voltage = (ushort)(buffer[25] | buffer[26] << 8);
  1980. data.Cell6Voltage = (ushort)(buffer[27] | buffer[28] << 8);
  1981. data.Cell7Voltage = (ushort)(buffer[29] | buffer[30] << 8);
  1982. temp = buffer[31];
  1983. temp = buffer[32];
  1984. data.Cell1Temp = (sbyte)buffer[33];
  1985. data.Cell2Temp = (sbyte)buffer[34];
  1986. data.Cell3Temp = (sbyte)buffer[35];
  1987. data.Cell4Temp = (sbyte)buffer[36];
  1988. data.Cell5Temp = (sbyte)buffer[37];
  1989. data.Cell6Temp = (sbyte)buffer[38];
  1990. data.Cell7Temp = (sbyte)buffer[39];
  1991. temp = buffer[40];
  1992. return data;
  1993. }
  1994. //long tempTrafficFlag = 0;//管制标志,从Web服务中获取的
  1995. //bool threadRunFlag = false;
  1996. bool batteryInfoFlag = false;//是否需要获取信息标志
  1997. ushort batteryInfo_AgvNum = 1;//需要获取电池信息的AGV编号
  1998. byte[] batterySendBuffer = new byte[10];
  1999. /// <summary>
  2000. /// 获取电池信息定时器
  2001. /// </summary>
  2002. /// <param name="sender"></param>
  2003. /// <param name="e"></param>
  2004. void batteryInfoTimer_Tick(object sender, EventArgs e)
  2005. {
  2006. if (!batteryInfoFlag)
  2007. {
  2008. batteryInfoFlag = true;
  2009. if (batteryInfo_AgvNum > AGVNUM_MAX)
  2010. batteryInfo_AgvNum = 1;
  2011. {
  2012. batterySendBuffer[0] = 0x10;
  2013. batterySendBuffer[1] = 0x81;
  2014. batterySendBuffer[2] = (byte)batteryInfo_AgvNum;
  2015. batterySendBuffer[8] = DrvWlConGetBCC(batterySendBuffer, 8);
  2016. batterySendBuffer[9] = 0x03;
  2017. }
  2018. batteryInfo_AgvNum++;
  2019. }
  2020. }
  2021. #endregion
  2022. /// <summary>
  2023. /// 发送数据定时器
  2024. /// </summary>
  2025. /// <param name="sender"></param>
  2026. /// <param name="e"></param>
  2027. private void SendDataTimerTick(object sender, EventArgs e)
  2028. {
  2029. if (IsSendCtrl == 1)
  2030. {
  2031. #region 发送控制命令
  2032. if (GlobalPara.type == 0)
  2033. {
  2034. //SPComControl.Write(buf_runctl, 0, buf_runctl.Length);
  2035. for (int i = 0; i < SPComCOntrolList.Count; i++)
  2036. {
  2037. {
  2038. SPComCOntrolList[i].Write(buf_runctl, 0, buf_runctl.Length);
  2039. }
  2040. }
  2041. }
  2042. else if (GlobalPara.type == 1)
  2043. {
  2044. communication.SendData(buf_runctl, null);
  2045. }
  2046. CtrlWaitNum++;
  2047. if (CtrlWaitNum > 3)//发送控制命令未接收到时重复发送次数3次
  2048. {
  2049. IsSendCtrl = 0;
  2050. CtrlWaitNum = 0;
  2051. }
  2052. #endregion
  2053. //线程挂起100ms,等待接收数据中断(挂起时,其他线程运行)
  2054. Thread.Sleep(100);
  2055. }
  2056. #region 掉线踢出管制区
  2057. //掉线计数
  2058. AGVInfoModel agv = null;
  2059. for (int i = 1; i <= AGVNUM_MAX; i++)
  2060. {
  2061. if (GlobalPara.AgvInfoDic.Keys.Contains(i))
  2062. {
  2063. agv = GlobalPara.AgvInfoDic[i];
  2064. agv.OffLineCount++;
  2065. if (agv.OffLineCount > OffLinkMax && agv.ConnectStatus)
  2066. {
  2067. //掉线,连接状态显示失败
  2068. agv.ConnectStatus = false;
  2069. if (agv.TRAFFICNUM.Count > 0)
  2070. {
  2071. List<TrafficAreaModel> templist = new List<TrafficAreaModel>();
  2072. templist.AddRange(agv.TRAFFICNUM);
  2073. foreach (TrafficAreaModel traffic in templist)
  2074. {
  2075. //踢出管制区
  2076. //tt.OutTraffic(agv);
  2077. int a1 = agv.ReleaseCount;
  2078. traffic.AGVLEAVE(agv);//管制区有AGV离开
  2079. int a = agv.ReleaseCount;
  2080. if (traffic.listAgvQueue.Count > 0)
  2081. {
  2082. traffic.ReleaseAgv(); //调用放行事件
  2083. }
  2084. agv.TRAFFICNUM.Remove(traffic);//清空之前,先做一些处理。让AGV退出的那些管制区解除管制状态。
  2085. string astr = string.Format("管制状态{0}--{1}", agv.TrafficFlag, agv.ReleaseCount);
  2086. }
  2087. }
  2088. }
  2089. }
  2090. }
  2091. #endregion
  2092. if (!GlobalPara.UseNewProtrol)
  2093. {
  2094. // SendTrafficOrder64();
  2095. SendTrafficOrder160();
  2096. }
  2097. else
  2098. {
  2099. SendTrafficOrder160();
  2100. }
  2101. }
  2102. #region 管制标识位的赋值更新
  2103. void SendOrderBy48()
  2104. {
  2105. //byte [] buf_traffic=new byte[10];
  2106. buf_traffic[0] = 0x10;
  2107. buf_traffic[1] = 0x61;
  2108. buf_traffic[2] = FlagArry[0];
  2109. buf_traffic[3] = FlagArry[1];
  2110. buf_traffic[4] = FlagArry[2];
  2111. buf_traffic[5] = FlagArry[3];
  2112. buf_traffic[6] = FlagArry[4];
  2113. buf_traffic[7] = FlagArry[5];
  2114. buf_traffic[8] = DrvWlConGetBCC(buf_traffic, 8);
  2115. buf_traffic[9] = 0x03;
  2116. if (GlobalPara.type == 0)
  2117. {
  2118. for (int i = 0; i < SPComCOntrolList.Count; i++)
  2119. {
  2120. if (SPComCOntrolList[i] != null)
  2121. {
  2122. SPComCOntrolList[i].Write(buf_traffic, 0, buf_traffic.Length);
  2123. }
  2124. }
  2125. }
  2126. else if (GlobalPara.type == 1)
  2127. {
  2128. communication.SendData(buf_traffic, null);
  2129. }
  2130. Thread.Sleep(10);
  2131. }
  2132. void SendOrderBy200()
  2133. {
  2134. buf_trafficctl[0] = 0x10;
  2135. buf_trafficctl[1] = 0x61;
  2136. buf_trafficctl[2] = FlagArry[0];
  2137. buf_trafficctl[3] = FlagArry[1];
  2138. buf_trafficctl[4] = FlagArry[2];
  2139. buf_trafficctl[5] = FlagArry[3];
  2140. buf_trafficctl[6] = FlagArry[4];
  2141. buf_trafficctl[7] = FlagArry[5];
  2142. buf_trafficctl[8] = FlagArry[6];
  2143. buf_trafficctl[9] = FlagArry[7];
  2144. buf_trafficctl[10] = FlagArry[8];
  2145. buf_trafficctl[11] = FlagArry[9];
  2146. buf_trafficctl[12] = FlagArry[10];
  2147. buf_trafficctl[13] = FlagArry[11];
  2148. buf_trafficctl[14] = FlagArry[12];
  2149. buf_trafficctl[15] = FlagArry[13];
  2150. buf_trafficctl[16] = FlagArry[14];
  2151. buf_trafficctl[17] = FlagArry[15];
  2152. buf_trafficctl[18] = FlagArry[16];
  2153. buf_trafficctl[19] = FlagArry[17];
  2154. buf_trafficctl[20] = FlagArry[18];
  2155. buf_trafficctl[21] = FlagArry[19];
  2156. buf_trafficctl[22] = FlagArry[20];
  2157. buf_trafficctl[23] = FlagArry[21];
  2158. buf_trafficctl[24] = FlagArry[22];
  2159. buf_trafficctl[25] = FlagArry[23];
  2160. buf_trafficctl[26] = FlagArry[24];
  2161. buf_trafficctl[27] = FlagArry[25];
  2162. buf_trafficctl[28] = FlagArry[26];
  2163. buf_trafficctl[29] = FlagArry[27];
  2164. buf_trafficctl[30] = FlagArry[28];
  2165. buf_trafficctl[31] = FlagArry[29];
  2166. buf_trafficctl[32] = FlagArry[30];
  2167. buf_trafficctl[33] = FlagArry[31];
  2168. buf_trafficctl[34] = FlagArry[32];
  2169. buf_trafficctl[35] = FlagArry[33];
  2170. buf_trafficctl[36] = FlagArry[34];
  2171. buf_trafficctl[37] = FlagArry[35];
  2172. buf_trafficctl[38] = FlagArry[36];
  2173. buf_trafficctl[39] = DrvWlConGetBCC(buf_trafficctl, 39);
  2174. if (GlobalPara.type == 0)
  2175. {
  2176. for (int i = 0; i < SPComCOntrolList.Count; i++)
  2177. {
  2178. if (SPComCOntrolList[i] != null)
  2179. {
  2180. SPComCOntrolList[i].Write(buf_trafficctl, 0, buf_trafficctl.Length);
  2181. }
  2182. }
  2183. }
  2184. else if (GlobalPara.type == 1)
  2185. {
  2186. communication.SendData(buf_trafficctl, null);
  2187. }
  2188. Thread.Sleep(10);
  2189. }
  2190. #endregion
  2191. /// <summary>
  2192. /// 更新屏幕定时器
  2193. /// </summary>
  2194. /// <param name="sender"></param>
  2195. /// <param name="e"></param>
  2196. public void t_Tick(object sender, EventArgs e)
  2197. {
  2198. try
  2199. {
  2200. UpdateAgvGrid();
  2201. dataGrid.Items.Refresh();
  2202. UpdateTrafficGrid();
  2203. }
  2204. catch (System.Exception ex)
  2205. {
  2206. MessageBox.Show(ex.Message + " 1949");
  2207. }
  2208. }
  2209. #region 获取所有AGV的管制状态,并发送10 61管制命令给所有agv
  2210. Dictionary<int, bool> TrafficFlagDic = new Dictionary<int, bool>();
  2211. /// <summary>
  2212. /// 初始化
  2213. /// </summary>
  2214. void InitTrafficFlagDic()
  2215. {
  2216. for (int i = 1; i <= AGVNUM_MAX; i++)
  2217. {
  2218. TrafficFlagDic.Add(i, false);
  2219. }
  2220. }
  2221. /// <summary>
  2222. /// 更新AGV的管制状态
  2223. /// </summary>
  2224. /// <param name="agvnum"></param>
  2225. void SetTrafficFlagDic(int agvnum)
  2226. {
  2227. if (TrafficFlagDic.ContainsKey(agvnum))
  2228. {
  2229. TrafficFlagDic[agvnum] = true;
  2230. }
  2231. }
  2232. /// <summary>
  2233. /// 发送管制命令(可达200以上)
  2234. /// </summary>
  2235. void SendTrafficOrder()
  2236. {
  2237. foreach (var agv in GlobalPara.AgvInfoDic.Values)
  2238. {
  2239. int BitIndex = (agv.AGVNUM - 1) % 8;
  2240. int ByteIndex = (agv.AGVNUM - 1) / 8;
  2241. if (agv.TrafficFlag)//管制标识为true,相应位置1
  2242. {
  2243. SendD1D2 |= Convert.ToInt64((long)1 << (agv.AGVNUM - 1));
  2244. //把这个8位的字节中,与AGV编号相对应的bit位置为1
  2245. FlagArry[ByteIndex] |= (byte)((0x01) << BitIndex);
  2246. }
  2247. else
  2248. {
  2249. SendD1D2 &= Convert.ToInt64(~((long)1 << (agv.AGVNUM - 1)));
  2250. //把这个8位的字节中,与AGV编号相对应的bit位置为0,要注意别把其他位的值给覆盖了
  2251. FlagArry[ByteIndex] &= (byte)(~((0x01) << BitIndex));
  2252. }
  2253. }
  2254. if ((bool)chBox_Traffic.IsChecked)//开启了管制才发数据
  2255. {
  2256. #region 管制状态更新(200)
  2257. buf_trafficctl[0] = 0x10;
  2258. buf_trafficctl[1] = 0x61;
  2259. buf_trafficctl[2] = FlagArry[0];
  2260. buf_trafficctl[3] = FlagArry[1];
  2261. buf_trafficctl[4] = FlagArry[2];
  2262. buf_trafficctl[5] = FlagArry[3];
  2263. buf_trafficctl[6] = FlagArry[4];
  2264. buf_trafficctl[7] = FlagArry[5];
  2265. buf_trafficctl[8] = FlagArry[6];
  2266. buf_trafficctl[9] = FlagArry[7];
  2267. buf_trafficctl[10] = FlagArry[8];
  2268. buf_trafficctl[11] = FlagArry[9];
  2269. buf_trafficctl[12] = FlagArry[10];
  2270. buf_trafficctl[13] = FlagArry[11];
  2271. buf_trafficctl[14] = FlagArry[12];
  2272. buf_trafficctl[15] = FlagArry[13];
  2273. buf_trafficctl[16] = FlagArry[14];
  2274. buf_trafficctl[17] = FlagArry[15];
  2275. buf_trafficctl[18] = FlagArry[16];
  2276. buf_trafficctl[19] = FlagArry[17];
  2277. buf_trafficctl[20] = FlagArry[18];
  2278. buf_trafficctl[21] = FlagArry[19];
  2279. buf_trafficctl[22] = FlagArry[20];
  2280. buf_trafficctl[23] = FlagArry[21];
  2281. buf_trafficctl[24] = FlagArry[22];
  2282. buf_trafficctl[25] = FlagArry[23];
  2283. buf_trafficctl[26] = FlagArry[24];
  2284. buf_trafficctl[27] = FlagArry[25];
  2285. buf_trafficctl[28] = FlagArry[26];
  2286. buf_trafficctl[29] = FlagArry[27];
  2287. buf_trafficctl[30] = FlagArry[28];
  2288. buf_trafficctl[31] = FlagArry[29];
  2289. buf_trafficctl[32] = FlagArry[30];
  2290. buf_trafficctl[33] = FlagArry[31];
  2291. buf_trafficctl[34] = FlagArry[32];
  2292. buf_trafficctl[35] = FlagArry[33];
  2293. buf_trafficctl[36] = FlagArry[34];
  2294. buf_trafficctl[37] = FlagArry[35];
  2295. buf_trafficctl[38] = FlagArry[36];
  2296. buf_trafficctl[39] = DrvWlConGetBCC(buf_trafficctl, 39);
  2297. #endregion
  2298. if (GlobalPara.type == 0)
  2299. {
  2300. for (int i = 0; i < SPComCOntrolList.Count; i++)
  2301. {
  2302. if (SPComCOntrolList[i] != null)
  2303. {
  2304. SPComCOntrolList[i].Write(buf_trafficctl, 0, buf_trafficctl.Length);
  2305. }
  2306. }
  2307. }
  2308. else if (GlobalPara.type == 1)
  2309. {
  2310. communication.SendData(buf_trafficctl, null);
  2311. }
  2312. Thread.Sleep(10);
  2313. }
  2314. }
  2315. /// <summary>
  2316. /// 获取多区域管制 2017.2.15 王锴修改
  2317. /// </summary>
  2318. private void getTrafficAgvServer()
  2319. {
  2320. while (true)
  2321. {
  2322. if (traffic != null)
  2323. {
  2324. List<byte> trafficAgv = traffic.GetTrafficAgvNum();
  2325. if (trafficAgv.Count > 0)
  2326. {
  2327. int aa = 0;
  2328. for (int i = 0; i < trafficAgv.Count; i++)
  2329. {
  2330. if (trafficAgv[i] > 0)
  2331. aa = aa | (1 << trafficAgv[i] - 1);
  2332. }
  2333. TrafficData = aa;
  2334. }
  2335. else
  2336. {
  2337. TrafficData = 0;
  2338. }
  2339. }
  2340. Thread.Sleep(50);
  2341. }
  2342. }
  2343. void SendTrafficOrder88()
  2344. {
  2345. {
  2346. long temp = 0;
  2347. temp = SendD1D2 | TrafficData;//组合Web服务的交管和本地的交管数据
  2348. buf_trafficct2[0] = 0x10;
  2349. buf_trafficct2[1] = 0x61;
  2350. buf_trafficct2[2] = Convert.ToByte(temp & 0x00000000000000ff);
  2351. buf_trafficct2[3] = Convert.ToByte((temp & 0x000000000000ffff) >> 8);
  2352. buf_trafficct2[4] = Convert.ToByte((temp & 0x0000000000ffffff) >> 16);
  2353. buf_trafficct2[5] = Convert.ToByte((temp & 0x00000000ffffffff) >> 24);
  2354. buf_trafficct2[6] = Convert.ToByte((temp & 0x000000ffffffffff) >> 32);
  2355. buf_trafficct2[7] = Convert.ToByte((temp & 0x0000ffffffffffff) >> 40);
  2356. buf_trafficct2[8] = DrvWlConGetBCC(buf_trafficct2, 8);
  2357. buf_trafficct2[9] = 0x03;
  2358. if (GlobalPara.type == 0)
  2359. {
  2360. //SPComControl.Write(buf_trafficctl, 0, buf_trafficctl.Length);
  2361. for (int i = 0; i < SPComCOntrolList.Count; i++)
  2362. {
  2363. if (SPComCOntrolList[i] != null)
  2364. {
  2365. SPComCOntrolList[i].Write(buf_trafficct2, 0, buf_trafficct2.Length);
  2366. }
  2367. }
  2368. }
  2369. else if (GlobalPara.type == 1)
  2370. {
  2371. communication.SendData(buf_trafficct2, null);
  2372. }
  2373. Thread.Sleep(5);
  2374. }
  2375. }
  2376. string Str1063 = "";
  2377. byte[] buf_boxAsk = { 0x11, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44 };
  2378. /// <summary>
  2379. /// 发送管制命令(最多16台)
  2380. /// </summary>
  2381. void SendTrafficOrder160(int flag = 1)
  2382. {
  2383. foreach (var agv in GlobalPara.AgvInfoDic.Values)
  2384. {
  2385. if (agv.AGVNUM > AGVNUM_MAX) break;
  2386. int BitIndex = (agv.AGVNUM - 1) % 8;
  2387. int ByteIndex = (agv.AGVNUM - 1) / 8;
  2388. if (agv.TrafficFlag)//管制标识为true,相应位置1
  2389. {
  2390. SendD1D2 |= Convert.ToInt64((long)1 << (agv.AGVNUM - 1));
  2391. //把这个8位的字节中,与AGV编号相对应的bit位置为1
  2392. FlagArry[ByteIndex] |= (byte)((0x01) << BitIndex);
  2393. }
  2394. else
  2395. {
  2396. SendD1D2 &= Convert.ToInt64(~((long)1 << (agv.AGVNUM - 1)));
  2397. //把这个8位的字节中,与AGV编号相对应的bit位置为0,要注意别把其他位的值给覆盖了
  2398. FlagArry[ByteIndex] &= (byte)(~((0x01) << BitIndex));
  2399. }
  2400. }
  2401. if ((bool)chBox_Traffic.IsChecked)//开启了管制才发数据
  2402. {
  2403. #region 管制状态更新
  2404. buf_trafficct3[2] = FlagArry[0];
  2405. buf_trafficct3[3] = FlagArry[1];
  2406. buf_trafficct3[4] = FlagArry[2];
  2407. buf_trafficct3[5] = FlagArry[3];
  2408. buf_trafficct3[6] = FlagArry[4];
  2409. buf_trafficct3[7] = FlagArry[5];
  2410. buf_trafficct3[8] = FlagArry[6];
  2411. buf_trafficct3[9] = FlagArry[7];
  2412. buf_trafficct3[10] = FlagArry[8];
  2413. buf_trafficct3[11] = FlagArry[9];
  2414. buf_trafficct3[12] = FlagArry[10];
  2415. buf_trafficct3[13] = FlagArry[11];
  2416. buf_trafficct3[14] = FlagArry[12];
  2417. buf_trafficct3[15] = FlagArry[13];
  2418. buf_trafficct3[16] = FlagArry[14];
  2419. buf_trafficct3[17] = FlagArry[15];
  2420. buf_trafficct3[18] = FlagArry[16];
  2421. buf_trafficct3[19] = FlagArry[17];
  2422. buf_trafficct3[20] = FlagArry[18];
  2423. buf_trafficct3[21] = (byte)(FlagArry[19] | (flag << 5));
  2424. buf_trafficct3[22] = DrvWlConGetBCC(buf_trafficct3, 22);
  2425. #endregion
  2426. if (GlobalPara.type == 0)
  2427. {
  2428. for (int i = 0; i < SPComCOntrolList.Count; i++)
  2429. {
  2430. if (SPComCOntrolList[i] != null)
  2431. {
  2432. SPComCOntrolList[i].Write(buf_trafficct3, 0, buf_trafficct3.Length);
  2433. }
  2434. }
  2435. }
  2436. else if (GlobalPara.type == 1)
  2437. {
  2438. communication.SendData(buf_trafficct3, null);
  2439. for (int i = 0; i < GlobalPara.DtWirelessBox.Rows.Count; i++)
  2440. {
  2441. IPEndPoint ip = new IPEndPoint(IPAddress.Parse(GlobalPara.DtWirelessBox.Rows[i]["设备IP"].ToString()), 8899);
  2442. communication.SendData(buf_boxAsk, ip);
  2443. }
  2444. if (GlobalPara.Gloal1063Flag)
  2445. {
  2446. if (Str1063 != UdpCommunication.ByteToHexString(buf_trafficct3))
  2447. {
  2448. Str1063 = UdpCommunication.ByteToHexString(buf_trafficct3);
  2449. WriteFile("1063发送记录-" + DateTime.Now.ToString("yyyy-MM-dd"), Str1063);
  2450. }
  2451. }
  2452. }
  2453. Thread.Sleep(10);
  2454. }
  2455. }
  2456. /// <summary>
  2457. /// 发送管制命令(最多64台)
  2458. /// </summary>
  2459. void SendTrafficOrder64()
  2460. {
  2461. foreach (var agv in GlobalPara.AgvInfoDic.Values)
  2462. {
  2463. if (agv.AGVNUM > AGVNUM_MAX) break;
  2464. int BitIndex = (agv.AGVNUM - 1) % 8;
  2465. int ByteIndex = (agv.AGVNUM - 1) / 8;
  2466. if (agv.TrafficFlag)//管制标识为true,相应位置1
  2467. {
  2468. SendD1D2 |= Convert.ToInt64((long)1 << (agv.AGVNUM - 1));
  2469. //把这个8位的字节中,与AGV编号相对应的bit位置为1
  2470. FlagArry[ByteIndex] |= (byte)((0x01) << BitIndex);
  2471. }
  2472. else
  2473. {
  2474. SendD1D2 &= Convert.ToInt64(~((long)1 << (agv.AGVNUM - 1)));
  2475. //把这个8位的字节中,与AGV编号相对应的bit位置为0,要注意别把其他位的值给覆盖了
  2476. FlagArry[ByteIndex] &= (byte)(~((0x01) << BitIndex));
  2477. }
  2478. }
  2479. if ((bool)chBox_Traffic.IsChecked)//开启了管制才发数据
  2480. {
  2481. #region 管制状态更新
  2482. buf_traffic[0] = 0x10;
  2483. buf_traffic[1] = 0x61;
  2484. buf_traffic[2] = FlagArry[0];
  2485. buf_traffic[3] = FlagArry[1];
  2486. buf_traffic[4] = FlagArry[2];
  2487. buf_traffic[5] = FlagArry[3];
  2488. buf_traffic[6] = FlagArry[4];
  2489. buf_traffic[7] = FlagArry[5];
  2490. buf_traffic[8] = DrvWlConGetBCC(buf_traffic, 8);
  2491. buf_traffic[9] = 0x03;
  2492. #endregion
  2493. if (GlobalPara.type == 0)
  2494. {
  2495. for (int i = 0; i < SPComCOntrolList.Count; i++)
  2496. {
  2497. if (SPComCOntrolList[i] != null)
  2498. {
  2499. SPComCOntrolList[i].Write(buf_traffic, 0, buf_traffic.Length);
  2500. }
  2501. }
  2502. }
  2503. else if (GlobalPara.type == 1)
  2504. {
  2505. communication.SendData(buf_traffic, null);
  2506. }
  2507. Thread.Sleep(10);
  2508. }
  2509. }
  2510. #endregion
  2511. #region 属性更新,屏幕刷新
  2512. /// <summary>
  2513. /// 更新屏幕
  2514. /// </summary>
  2515. void UpdateAgvGrid()
  2516. {
  2517. AGVInfoModel agvinfo = null;
  2518. for (int i = 0; i < AGVNUM_MAX; i++)
  2519. {
  2520. if (GlobalPara.AgvInfoDic.Keys.Contains(i + 1))
  2521. {
  2522. agvinfo = GlobalPara.AgvInfoDic[i + 1];
  2523. try
  2524. {
  2525. memberData[i].txtWorkLineValue = "1";
  2526. memberData[i].txtAGVNumValue = agvinfo.AGVNUM.ToString();
  2527. StringBuilder trafficnumsb = new StringBuilder();
  2528. foreach (var t in agvinfo.TRAFFICNUM)
  2529. {
  2530. trafficnumsb.Append(t.TrafficNum.ToString());//管制区号
  2531. trafficnumsb.Append(",");
  2532. }
  2533. memberData[i].txtElectricityValue = agvinfo.Battery_Electricity.ToString("f2");
  2534. memberData[i].txtVoltageValue = agvinfo.Bttery_Voltage.ToString("f2");
  2535. memberData[i].txtPowerValue = agvinfo.Battery_Power.ToString();
  2536. memberData[i].txtTemperatureValue = agvinfo.Battery_Temperature.ToString();
  2537. memberData[i].txtTrafficNumValue = trafficnumsb.ToString();
  2538. memberData[i].txtTrafficStateValue = agvinfo.TrafficFlag ? "管制中" : "无";
  2539. memberData[i].txtLineNumValue = agvinfo.ROUTENUM.ToString();
  2540. memberData[i].txtMarkFunctionValue = MarkFuncOpt[agvinfo.MARKFUN];
  2541. memberData[i].txtSpeedValue = SpeedOpt[agvinfo.SPEEDLEVEL];
  2542. memberData[i].txtMarkNumValue = agvinfo.MARKNUM.ToString();
  2543. memberData[i].txtWLValue = agvinfo.ConnectStatus ? "成功" : "失败";
  2544. if (agvinfo.TRAFFICAGV != null)
  2545. {
  2546. memberData[i].txtTrafficAgvValue = agvinfo.TRAFFICAGV.AGVNUM.ToString();
  2547. memberData[i].txtTrafficAgvListValue = agvinfo.TRAFFICAGV.AGVNUM.ToString();
  2548. }
  2549. else
  2550. {
  2551. memberData[i].txtTrafficAgvValue = "0";
  2552. memberData[i].txtTrafficAgvListValue = "0";
  2553. }
  2554. memberData[i].txtOffLineCountValue = agvinfo.ConnectStatus.ToString();//20141127增加掉线计数
  2555. memberData[i].txtIsMainAgvValue = agvinfo.IsMainAgv ? "主机" : "从机";
  2556. #region 运行状态更新
  2557. switch (GlobalPara.AgvInfoDic[i + 1].RUNSTATUS_Cur)
  2558. {
  2559. case 0x40:
  2560. memberData[i].txtStatusValue = "运行";
  2561. break;
  2562. case 0x43:
  2563. memberData[i].txtStatusValue = "暂停";
  2564. break;
  2565. case 0x42:
  2566. memberData[i].txtStatusValue = "结束地标停止";
  2567. break;
  2568. case 0x41:
  2569. memberData[i].txtStatusValue = "停止";
  2570. break;
  2571. case 0x44:
  2572. memberData[i].txtStatusValue = "充电中";
  2573. break;
  2574. case 0x00:
  2575. memberData[i].txtStatusValue = "无效";
  2576. break;
  2577. default:
  2578. if (agvinfo.RUNSTATUS < StatusOpt.Length)
  2579. {
  2580. memberData[i].txtStatusValue = StatusOpt[agvinfo.RUNSTATUS];
  2581. }
  2582. break;
  2583. }
  2584. //int code = 0;
  2585. //if (agvinfo.ALARMCODE != "")
  2586. //{
  2587. // code = int.Parse(agvinfo.ALARMCODE);
  2588. //}
  2589. //if (code < StatusOpt.Length)
  2590. //{
  2591. // if (code != 0)
  2592. // {
  2593. // memberData[i].txtAlertsValue = StatusOpt[code];
  2594. // }
  2595. // else
  2596. // {
  2597. // memberData[i].txtAlertsValue = "正常";
  2598. // }
  2599. //}
  2600. #endregion
  2601. }
  2602. catch (Exception ex)
  2603. {
  2604. DateTime time = DateTime.Now;
  2605. //MessageBox.Show("线程异常:"+e.ExceptionObject);
  2606. FileStream stream = File.Open(@"Exception\程序异常.txt", FileMode.Append, FileAccess.Write);
  2607. StreamWriter writer = new StreamWriter(stream);
  2608. if (ex != null)
  2609. {
  2610. 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);
  2611. writer.WriteLine(msg);
  2612. writer.Close();
  2613. stream.Close();
  2614. }
  2615. // MessageBox.Show(ex.Message + " 2352");
  2616. }
  2617. }
  2618. }
  2619. }
  2620. /// <summary>
  2621. /// 更新管制区列表
  2622. /// </summary>
  2623. void UpdateTrafficGrid()
  2624. {
  2625. foreach (var traffic in GlobalPara.TrafficBuffer.Values)
  2626. {
  2627. if (traffic.IsTraffic && traffic.MainAgv != null)
  2628. {
  2629. if (!TrafficMember.Contains(traffic))
  2630. {
  2631. try
  2632. {
  2633. TrafficMember.Add(traffic);
  2634. }
  2635. catch (Exception ex)
  2636. {
  2637. throw ex;
  2638. }
  2639. }
  2640. }
  2641. else
  2642. {
  2643. if (TrafficMember.Contains(traffic))
  2644. {
  2645. try
  2646. {
  2647. TrafficMember.Remove(traffic);
  2648. }
  2649. catch (Exception ex)
  2650. {
  2651. throw ex;
  2652. }
  2653. }
  2654. }
  2655. }
  2656. //dataGrid2.Items.Refresh();
  2657. }
  2658. /// <summary>
  2659. /// 界面显示类AGV_DisMember属性更改委托函数
  2660. /// </summary>
  2661. /// <param name="sender"></param>
  2662. /// <param name="e"></param>
  2663. public void Dis_PropertyChange(object sender, PropertyChangedEventArgs e)
  2664. {
  2665. if (e.PropertyName.Equals("txtMarkNum"))
  2666. {
  2667. MarkChangeAction((AGV_DisMember)sender);
  2668. RunLog.WriteLog((AGV_DisMember)sender);
  2669. }
  2670. else if (e.PropertyName.Equals("txtStatus"))
  2671. {
  2672. StatusChangeAction((AGV_DisMember)sender);
  2673. // UpdateStatusForUseRate(sender as AGV_DisMember);//稼动率
  2674. }
  2675. else if (e.PropertyName.Equals("txtWL"))
  2676. {
  2677. WLChangeAction((AGV_DisMember)sender);
  2678. // UpdateStatusForUseRate(sender as AGV_DisMember); //稼动率
  2679. }
  2680. else if (e.PropertyName.Equals("txtTrafficNum"))
  2681. {
  2682. //AlertsChangeAction((AGV_DisMember)sender);
  2683. //UpdateStatusForUseRate(sender as AGV_DisMember);//稼动率
  2684. }
  2685. //UpdateCasunService(sender as AGV_DisMember);
  2686. }
  2687. /// <summary>
  2688. /// 稼动率数据更新
  2689. /// </summary>
  2690. /// <param name="agv"></param>
  2691. void UpdateStatusForUseRate(AGV_DisMember agv)
  2692. {
  2693. if (agv != null)
  2694. {
  2695. int agvNum = int.Parse(agv.txtAGVNum);
  2696. if (agvNum <= useRateTimeList.Count)
  2697. {
  2698. if (agv.txtWL == "成功")
  2699. {
  2700. if (agv.txtStatus == "无效")
  2701. {
  2702. useRateTimeList[agvNum - 1].StatusType = -1;//无效状态
  2703. }
  2704. else
  2705. {
  2706. useRateTimeList[agvNum - 1].StatusType = GlobalPara.AgvInfoDic[agvNum].RUNSTATUS;//0x40运行,0x41暂停,0x42结束地标停止,0x40前的都为报警,暂将0x43当作充电
  2707. }
  2708. }
  2709. else
  2710. {
  2711. useRateTimeList[agvNum - 1].StatusType = 0;//离线状态
  2712. }
  2713. }
  2714. }
  2715. }
  2716. /// <summary>
  2717. /// 地标属性更改时触发的事件
  2718. /// 移除上次动画,显示下一动画
  2719. /// </summary>
  2720. /// <param name="temp1">AGV_DisMember类</param>
  2721. private void MarkChangeAction(AGV_DisMember temp1)
  2722. {
  2723. int iagvnum = string.IsNullOrEmpty(temp1.txtAGVNum) ? 0 : Convert.ToInt16(temp1.txtAGVNum);
  2724. //int iagvnum = Convert.ToInt16(temp1.txtAGVNum.Remove(0, 3));
  2725. /************************************************************************/
  2726. /* 修改日期:2014.9.25
  2727. * 修改者:肖丁铭
  2728. 说明:在此处添加了读卡检测功能*/
  2729. /************************************************************************/
  2730. RoutePoint point = new RoutePoint();
  2731. point.route = int.Parse(temp1.txtLineNum);
  2732. point.currentPoint = int.Parse(temp1.txtMarkNum);
  2733. Console.ForegroundColor = ConsoleColor.Green;
  2734. //Console.WriteLine(string.Format("当前:AGV{0},路线{1},当前地标{2}", iagvnum, point.route, point.currentPoint));
  2735. Action action = new Action(delegate ()
  2736. {
  2737. Console.ResetColor();
  2738. if (iagvnum >= 1 && chechCardUnits != null && chechCardUnits[iagvnum - 1] != null)
  2739. {
  2740. try
  2741. {
  2742. lock (checkLock)
  2743. {
  2744. if (GlobalPara.IsEnableReadCheck)
  2745. chechCardUnits[iagvnum - 1].CheckPoint(point);//检查是否有漏读卡
  2746. }
  2747. }
  2748. catch (System.Exception ex)
  2749. {
  2750. Console.WriteLine(string.Format("类型:{0},{1}", ex.TargetSite, ex.Message));
  2751. }
  2752. }
  2753. });
  2754. action.BeginInvoke(null, null);
  2755. //只在坐标上显示
  2756. if (!GlobalPara.IsEnableRouteView)
  2757. {
  2758. if (iagvnum > 0 && iagvnum <= AGVNUM_MAX)
  2759. {
  2760. Point pStart = new Point();
  2761. string a = "select T_Mark.XPos, T_Mark.YPos FROM T_Mark where Mark=" + temp1.txtMarkNum.ToString() + "";
  2762. TrafficPara.Open("select T_Mark.XPos, T_Mark.YPos FROM T_Mark where Mark=" + temp1.txtMarkNum.ToString() + "");
  2763. if (TrafficPara.Rows.Count > 0)
  2764. {
  2765. pStart.X = Convert.ToDouble(TrafficPara.Rows[0]["XPos"]);
  2766. pStart.Y = Convert.ToDouble(TrafficPara.Rows[0]["YPos"]);
  2767. DrawCarInPoint(pStart, ColorOpt[iagvnum % ColorOpt.Length], iagvnum);
  2768. }
  2769. else return;
  2770. }
  2771. }
  2772. else
  2773. {
  2774. if (iagvnum > 0 && iagvnum <= AGVNUM_MAX)
  2775. {
  2776. Point pStart = new Point(), pEnd = new Point(), pVirtual = new Point();
  2777. if (Convert.ToInt32(temp1.txtDockNum) > 0)
  2778. {
  2779. TrafficPara.Open("Select RouteNum from T_DockSetting where DockNum=" + temp1.txtDockNum + " and AGVNum=" + iagvnum.ToString());
  2780. if (TrafficPara.rowcount > 0)
  2781. {
  2782. temp1.txtLineNum = TrafficPara.Rows[0]["RouteNum"].ToString();
  2783. }
  2784. }
  2785. string sql_str = "select T_Line.MarkOrder, T_Mark.XPos, T_Mark.YPos FROM T_Line LEFT OUTER JOIN T_Mark ON T_Mark.ID = T_Line.MarkID where WorkLine=" + temp1.txtWorkLine + " and Mark=" + temp1.txtMarkNum + " and LineNum=" + temp1.txtLineNum + "";
  2786. TrafficPara.Open("select T_Line.MarkOrder, T_Mark.XPos, T_Mark.YPos FROM T_Line LEFT OUTER JOIN T_Mark ON T_Mark.ID = T_Line.MarkID where WorkLine=(select distinct WorkLine from T_WorkLine where CarID=" + iagvnum + ") and Mark=" + temp1.txtMarkNum + " and LineNum=" + temp1.txtLineNum);
  2787. if (TrafficPara.Rows.Count > 0)
  2788. {
  2789. pStart.X = Convert.ToDouble(TrafficPara.Rows[0]["XPos"]);
  2790. pStart.Y = Convert.ToDouble(TrafficPara.Rows[0]["YPos"]);
  2791. List<Point> pointcollection1 = new List<Point>();
  2792. pointcollection1.Add(pStart);
  2793. int currentOrder = Convert.ToInt16(TrafficPara.Rows[0]["MarkOrder"]) + 1;
  2794. bool isvirtualpoint = true;
  2795. double dMarkdistance = 0;
  2796. while (isvirtualpoint)
  2797. {
  2798. TrafficPara.Open("select XPos,YPos,T_Line.Distance from T_Mark Left join T_Line on T_Mark.ID = T_Line.MarkID where WorkLine=(select distinct WorkLine from T_WorkLine where CarID=" + iagvnum + ") and T_Line.MarkOrder=" + currentOrder.ToString() +
  2799. "and LineNum=" + temp1.txtLineNum + "and T_Mark.VirtualMark=1");
  2800. if (TrafficPara.Rows.Count > 0)
  2801. {
  2802. pVirtual.X = Convert.ToDouble(TrafficPara.Rows[0]["XPos"]);
  2803. pVirtual.Y = Convert.ToDouble(TrafficPara.Rows[0]["YPos"]);
  2804. pointcollection1.Add(pVirtual);
  2805. dMarkdistance += Convert.ToDouble(TrafficPara.Rows[0]["Distance"]);
  2806. currentOrder++;
  2807. }
  2808. else { isvirtualpoint = false; break; }
  2809. }
  2810. TrafficPara.Open("select XPos,YPos,T_Line.Distance from T_Mark Left join T_Line on T_Mark.ID = T_Line.MarkID where WorkLine=(select distinct WorkLine from T_WorkLine where CarID=" + iagvnum + ") and T_Line.MarkOrder=" + currentOrder.ToString() +
  2811. "and LineNum=" + temp1.txtLineNum + "and T_Mark.VirtualMark=0");
  2812. if (TrafficPara.Rows.Count > 0)
  2813. {
  2814. pEnd.X = Convert.ToDouble(TrafficPara.Rows[0]["XPos"]);
  2815. pEnd.Y = Convert.ToDouble(TrafficPara.Rows[0]["YPos"]);
  2816. pointcollection1.Add(pEnd);
  2817. dMarkdistance += Convert.ToDouble(TrafficPara.Rows[0]["Distance"]);
  2818. }
  2819. else return;
  2820. if (pointcollection1.Count >= 2)
  2821. {
  2822. double dAgvspeed = 0;
  2823. TrafficPara.Open("select Speed from T_Speed where SpeedGrade='" + temp1.txtSpeedValue + "'");
  2824. if (TrafficPara.Rows.Count > 0)
  2825. {
  2826. dAgvspeed = Convert.ToDouble(TrafficPara.Rows[0]["Speed"]) / 60.0;
  2827. }
  2828. else return;
  2829. DrawCarLine(pointcollection1, ColorOpt[iagvnum % ColorOpt.Length], iagvnum, dMarkdistance / dAgvspeed);
  2830. }
  2831. }
  2832. }
  2833. }
  2834. TrafficPara.Close();
  2835. }
  2836. private void AlertsChangeAction(AGV_DisMember temp1)
  2837. {
  2838. int iagvnum = string.IsNullOrEmpty(temp1.txtAGVNum) ? 0 : Convert.ToInt16(temp1.txtAGVNum);
  2839. if (iagvnum > 0 && iagvnum <= AGVNUM_MAX)
  2840. {
  2841. dislable[iagvnum - 1].BeginAnimation(OpacityProperty, null);
  2842. dislable[iagvnum - 1].Opacity = 1;
  2843. {
  2844. //将报警记录写入到数据库
  2845. string txttimer = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  2846. if (!temp1.txtAlertsValue.Contains("障碍物") && !temp1.txtAlertsValue.Contains("正常"))//过滤掉障碍物,不会存数据库
  2847. {
  2848. TrafficPara.Open("Insert into T_Ex (CarID,ExTimer,ExType,ExRouteNum,ExMarkNum,ExWorkLine) VALUES (" + iagvnum.ToString() + ",'" + txttimer + "','" + temp1.txtAlertsValue + "'," + temp1.txtLineNum + "," + temp1.txtMarkNum + "," + temp1.txtWorkLine + ")");
  2849. TrafficPara.Close();
  2850. }
  2851. if (contextMenuChangeDisplay.IsChecked)
  2852. {
  2853. dislable[iagvnum - 1].Content = temp1.txtAgvAlias + temp1.txtAlertsValue.Trim();
  2854. }
  2855. else
  2856. {
  2857. dislable[iagvnum - 1].Content = iagvnum.ToString() + temp1.txtAlertsValue.Trim();
  2858. }
  2859. //报警信息字体颜色设置
  2860. if (temp1.txtAlertsValue.Contains("报警") || temp1.txtAlertsValue.Contains("电压") || temp1.txtAlertsValue.Contains("障碍物"))
  2861. {
  2862. if (temp1.txtAlertsValue.Contains("障碍物"))
  2863. {
  2864. dislable[iagvnum - 1].Foreground = Brushes.DeepSkyBlue;
  2865. }
  2866. else if (temp1.txtAlertsValue.Contains("低电压报警"))
  2867. {
  2868. dislable[iagvnum - 1].Foreground = Brushes.DeepSkyBlue;
  2869. }
  2870. else
  2871. {
  2872. dislable[iagvnum - 1].Foreground = Brushes.Red;
  2873. }
  2874. }
  2875. dislable[iagvnum - 1].ToolTip = temp1.txtAlertsValue.Trim();
  2876. myLineStoryboard[iagvnum - 1].Pause(this);
  2877. // dislable[iagvnum - 1].BeginAnimation(OpacityProperty, CarWarnningAnimation);
  2878. //过滤掉频繁出现的报警(将报警信息以服务的形式分发出去)
  2879. if (!temp1.txtAlertsValue.Contains("障碍物") && !temp1.txtAlertsValue.Contains("停止") && !temp1.txtAlertsValue.Contains("急停"))
  2880. {
  2881. AgvAlarmServiceLibrary.AlarmInfo info = new AgvAlarmServiceLibrary.AlarmInfo();
  2882. info.AgvId = iagvnum;
  2883. info.Route = int.Parse(temp1.txtLineNum);
  2884. info.Mark = int.Parse(temp1.txtMarkNum);
  2885. info.WorkLine = int.Parse(temp1.txtWorkLine);
  2886. info.AlarmTime = txttimer;
  2887. info.Area = GlobalPara.areaName;
  2888. info.Type = temp1.txtAlertsValue;
  2889. if (host != null && host.State == CommunicationState.Opened)
  2890. {
  2891. if (AgvAlarmServiceLibrary.AgvAlarmService.userCallBackList != null)
  2892. {
  2893. foreach (AgvAlarmServiceLibrary.ISrvToClientCallBack callback in AgvAlarmServiceLibrary.AgvAlarmService.userCallBackList)
  2894. {
  2895. callback.NotifyClientAlarm(info);
  2896. }
  2897. }
  2898. }
  2899. }
  2900. }
  2901. }
  2902. }
  2903. /// <summary>
  2904. /// 运行状态属性更改时触发的事件
  2905. /// </summary>
  2906. /// <param name="temp1">AGV_DisMember类</param>
  2907. private void StatusChangeAction(AGV_DisMember temp1)
  2908. {
  2909. //int iagvnum = Convert.ToInt16(temp1.txtAGVNum.Remove(0, 3));
  2910. int iagvnum = string.IsNullOrEmpty(temp1.txtAGVNum) ? 0 : Convert.ToInt16(temp1.txtAGVNum);
  2911. if (iagvnum > 0 && iagvnum <= AGVNUM_MAX)
  2912. {
  2913. dislable[iagvnum - 1].BeginAnimation(OpacityProperty, null);
  2914. dislable[iagvnum - 1].Opacity = 1;
  2915. switch (temp1.txtStatus.Trim())
  2916. {
  2917. case "运行":
  2918. myLineStoryboard[iagvnum - 1].Resume(this);
  2919. dislable[iagvnum - 1].ToolTip = "正常";
  2920. if (contextMenuChangeDisplay.IsChecked)
  2921. dislable[iagvnum - 1].Content = temp1.txtAgvAlias;
  2922. else
  2923. //dislable[iagvnum - 1].Content = "AGV" + iagvnum.ToString();
  2924. dislable[iagvnum - 1].Content = iagvnum.ToString();
  2925. dislable[iagvnum - 1].Foreground = Brushes.Black;
  2926. break;
  2927. case "暂停":
  2928. dislable[iagvnum - 1].ToolTip = "暂停";
  2929. /*
  2930. if (Convert.ToInt32(temp1.txtDockNum) > 0)
  2931. {
  2932. dislable[iagvnum - 1].Content = iagvnum.ToString();
  2933. }
  2934. else
  2935. {
  2936. dislable[iagvnum - 1].Content = iagvnum.ToString() + temp1.txtStatus.Trim();
  2937. }*/
  2938. if (contextMenuChangeDisplay.IsChecked)
  2939. {
  2940. dislable[iagvnum - 1].Content = temp1.txtAgvAlias + temp1.txtStatus.Trim();
  2941. }
  2942. else
  2943. {
  2944. dislable[iagvnum - 1].Content = iagvnum.ToString() + temp1.txtStatus.Trim();
  2945. }
  2946. //dislable[iagvnum - 1].Foreground = Brushes.OrangeRed;//橙红色
  2947. dislable[iagvnum - 1].Foreground = Brushes.Black;//正常暂停显示黑色
  2948. myLineStoryboard[iagvnum - 1].Pause(this);
  2949. // dislable[iagvnum - 1].BeginAnimation(OpacityProperty, CarWarnningAnimation);
  2950. break;
  2951. case "结束地标停止":
  2952. dislable[iagvnum - 1].ToolTip = "结束地标停止";
  2953. dislable[iagvnum - 1].Foreground = Brushes.GreenYellow;
  2954. if (contextMenuChangeDisplay.IsChecked)
  2955. {
  2956. dislable[iagvnum - 1].Content = temp1.txtAgvAlias;
  2957. }
  2958. else
  2959. {
  2960. dislable[iagvnum - 1].Content = iagvnum.ToString();
  2961. }
  2962. myLineStoryboard[iagvnum - 1].Pause(this);
  2963. // dislable[iagvnum - 1].BeginAnimation(OpacityProperty, CarWarnningAnimation);
  2964. break;
  2965. case "无效":
  2966. break;
  2967. default:
  2968. {
  2969. //将报警记录写入到数据库
  2970. string txttimer = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  2971. if (!temp1.txtStatus.Contains("障碍物"))//过滤掉障碍物,不会存数据库
  2972. {
  2973. TrafficPara.Open("Insert into T_Ex (CarID,ExTimer,ExType,ExRouteNum,ExMarkNum,ExWorkLine) VALUES (" + iagvnum.ToString() + ",'" + txttimer + "','" + temp1.txtStatus + "'," + temp1.txtLineNum + "," + temp1.txtMarkNum + "," + temp1.txtWorkLine + ")");
  2974. TrafficPara.Close();
  2975. }
  2976. if (contextMenuChangeDisplay.IsChecked)
  2977. {
  2978. dislable[iagvnum - 1].Content = temp1.txtAgvAlias + temp1.txtStatus.Trim();
  2979. }
  2980. else
  2981. {
  2982. dislable[iagvnum - 1].Content = iagvnum.ToString() + temp1.txtStatus.Trim();
  2983. }
  2984. //报警信息字体颜色设置
  2985. if (temp1.txtStatus.Contains("报警") || temp1.txtStatus.Contains("电压") || temp1.txtStatus.Contains("障碍物"))
  2986. {
  2987. if (temp1.txtStatus.Contains("障碍物"))
  2988. {
  2989. dislable[iagvnum - 1].Foreground = Brushes.DeepSkyBlue;
  2990. }
  2991. else if (temp1.txtStatus.Contains("低电压报警"))
  2992. {
  2993. dislable[iagvnum - 1].Foreground = Brushes.DeepSkyBlue;
  2994. }
  2995. else
  2996. {
  2997. dislable[iagvnum - 1].Foreground = Brushes.Red;
  2998. }
  2999. //#region 侧边栏信息提示
  3000. ///*** */
  3001. //IList<AGV_DisMember> alarmlist = temp1.Where(p => p.txtStatus != "无效").Where(p => p.txtStatus != "障碍物").Where(p => p.txtStatus != "运行").Where(p => p.txtStatus != "暂停").Where(p => p.txtStatus != "停止").ToList();
  3002. ////IList<AGV_DisMember> alarmlist = DisMember.Where(p => !p.txtStatus.Contains("无效") || !p.txtStatus.Contains("障碍物") || p.txtStatus.Contains("运行") || p.txtStatus.Contains("暂停") || p.txtStatus.Contains("停止")).ToList();
  3003. //IList<AGV_DisMember> alarmlistFlag = new List<AGV_DisMember>();
  3004. //foreach(var m in alarmlist)
  3005. //{
  3006. // AGV_DisMember a = new AGV_DisMember();
  3007. // a.txtStatus=m.txtStatus;
  3008. // a.txtAGVNum=m.txtAGVNum;
  3009. // alarmlistFlag.Add(a);
  3010. //}
  3011. ////更新侧边栏数据源
  3012. //dataGrid1.DataContext = alarmlistFlag;
  3013. //#endregion
  3014. }
  3015. dislable[iagvnum - 1].ToolTip = temp1.txtStatus.Trim();
  3016. myLineStoryboard[iagvnum - 1].Pause(this);
  3017. // dislable[iagvnum - 1].BeginAnimation(OpacityProperty, CarWarnningAnimation);
  3018. //过滤掉频繁出现的报警(将报警信息以服务的形式分发出去)
  3019. if (!temp1.txtStatus.Contains("障碍物") && !temp1.txtStatus.Contains("停止") && !temp1.txtStatus.Contains("急停"))
  3020. {
  3021. AgvAlarmServiceLibrary.AlarmInfo info = new AgvAlarmServiceLibrary.AlarmInfo();
  3022. info.AgvId = iagvnum;
  3023. info.Route = int.Parse(temp1.txtLineNum);
  3024. info.Mark = int.Parse(temp1.txtMarkNum);
  3025. info.WorkLine = int.Parse(temp1.txtWorkLine);
  3026. info.AlarmTime = txttimer;
  3027. info.Area = GlobalPara.areaName;
  3028. info.Type = temp1.txtStatus;
  3029. if (host != null && host.State == CommunicationState.Opened)
  3030. {
  3031. if (AgvAlarmServiceLibrary.AgvAlarmService.userCallBackList != null)
  3032. {
  3033. foreach (AgvAlarmServiceLibrary.ISrvToClientCallBack callback in AgvAlarmServiceLibrary.AgvAlarmService.userCallBackList)
  3034. {
  3035. callback.NotifyClientAlarm(info);
  3036. }
  3037. }
  3038. }
  3039. }
  3040. break;
  3041. }
  3042. }
  3043. }
  3044. }
  3045. /// <summary>
  3046. /// 无线连接属性更改时触发的事件
  3047. /// </summary>
  3048. /// <param name="temp1">AGV_DisMember类</param>
  3049. private void WLChangeAction(AGV_DisMember temp1)
  3050. {
  3051. //int iagvnum = Convert.ToInt16(temp1.txtAGVNum.Remove(0, 3));
  3052. int iagvnum = string.IsNullOrEmpty(temp1.txtAGVNum) ? 0 : Convert.ToInt16(temp1.txtAGVNum);
  3053. if (temp1.txtWLValue.Equals("失败"))
  3054. {
  3055. // sendOffilineExMsg(temp1);
  3056. canvas.Children.Remove(startellipse[iagvnum - 1]);
  3057. canvas.Children.Remove(endellipse[iagvnum - 1]);
  3058. canvas.Children.Remove(dislable[iagvnum - 1]);
  3059. canvas.Children.Remove(Dottedline[iagvnum - 1]);
  3060. canvas.Children.Remove(animatedImage[iagvnum - 1]);
  3061. myLineStoryboard[iagvnum - 1].Pause(this);
  3062. //清除检测单元中漏读记录
  3063. if (chechCardUnits != null && chechCardUnits[iagvnum - 1] != null)
  3064. {
  3065. chechCardUnits[iagvnum - 1].missPoints.Clear();
  3066. }
  3067. return;
  3068. }
  3069. else
  3070. {
  3071. myLineStoryboard[iagvnum - 1].Resume(this);
  3072. MarkChangeAction(temp1);
  3073. }
  3074. }
  3075. private void TrafficChangeAction(AGV_DisMember temp)
  3076. {
  3077. #region 管制区的管理
  3078. int AGVNUM = Convert.ToInt16(temp.txtAGVNum);
  3079. AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[AGVNUM];
  3080. List<TrafficAreaModel> outTrafficList = new List<TrafficAreaModel>();
  3081. //agvinfo.TRAFFICNUM.CopyTo(currentTrafficList.ToArray(),0);
  3082. outTrafficList.AddRange(agvinfo.PTRAFFICNUM);
  3083. //循环获取新管制区列表中的管制区对象
  3084. foreach (TrafficAreaModel traffic in agvinfo.TRAFFICNUM)
  3085. {
  3086. //更新AGV的管制区对象列表
  3087. if (!agvinfo.TRAFFICNUM.Contains(traffic))
  3088. {
  3089. //添加最新的管制区
  3090. agvinfo.AddTraffic(traffic);
  3091. //currentTrafficList把存在新管制区对象列表的对象,从就管制区列表中删除。
  3092. //这样就管制区对象列表就只有AGV之前经过的管制区对象,现在AGV已经退出这些管制区了。
  3093. //currentTrafficList,到最后就只记录了AGV退出的那些管制区。
  3094. traffic.AGVINTER(agvinfo, false);
  3095. }
  3096. if (outTrafficList.Contains(traffic))
  3097. {
  3098. outTrafficList.Remove(traffic);
  3099. //agvinfo.RemoveTraffic(traffic);//AGV退出该管制区
  3100. traffic.AGVLEAVE(agvinfo);//管制区有AGV离开
  3101. }
  3102. }
  3103. //循环把AGV已经退出的管制区给清除掉。
  3104. foreach (TrafficAreaModel traffic in outTrafficList)
  3105. {
  3106. agvinfo.RemoveTraffic(traffic);//清空之前,先做一些处理。让AGV退出的那些管制区解除管制状态。
  3107. }
  3108. #endregion
  3109. #region 管制逻辑
  3110. /***
  3111. if (agvinfo.TRAFFICNUM.Count == 1)
  3112. {
  3113. #region 车子现在在某独立管制区
  3114. //1:车子在某独立管制区
  3115. foreach (TrafficAreaModel newTraffic in agvinfo.TRAFFICNUM)
  3116. {
  3117. if (agvinfo.PTRAFFICNUM.Count > 1)
  3118. {
  3119. //1.1:AGV前一个管制区是交叉管制区
  3120. foreach (var oldtraffic in agvinfo.PTRAFFICNUM)
  3121. {
  3122. //AGV退出前交叉管制区
  3123. if(oldtraffic!=newTraffic)
  3124. {
  3125. //找出现在这个管制区以外的其他管制区,全部退出
  3126. oldtraffic.OutTraffic(agvinfo);
  3127. if (agvinfo.TRAFFICNUM.Contains(oldtraffic))
  3128. {
  3129. //agvinfo.TRAFFICNUM.Remove(oldtraffic);
  3130. agvinfo.RemoveTraffic(oldtraffic);
  3131. }
  3132. }
  3133. }
  3134. }
  3135. else if (agvinfo.PTRAFFICNUM.Count == 1)
  3136. {
  3137. //1.2:AGV前一个管制区是独立管制区
  3138. foreach (var oldtraffic in agvinfo.PTRAFFICNUM)
  3139. {
  3140. if (oldtraffic != newTraffic)
  3141. {
  3142. //找出现在这个管制区以外的其他管制区,全部退出
  3143. oldtraffic.OutTraffic(agvinfo);
  3144. if (agvinfo.TRAFFICNUM.Contains(oldtraffic))
  3145. {
  3146. //agvinfo.TRAFFICNUM.Remove(oldtraffic);
  3147. agvinfo.RemoveTraffic(oldtraffic);
  3148. }
  3149. }
  3150. else
  3151. {
  3152. newTraffic.InTraffic(agvinfo);
  3153. if (!agvinfo.PTRAFFICNUM.Contains(newTraffic))
  3154. {
  3155. //agvinfo.TRAFFICNUM.Add(newTraffic);
  3156. agvinfo.AddTraffic(newTraffic);
  3157. }
  3158. }
  3159. }
  3160. }
  3161. else
  3162. {
  3163. //1.3:AGV之前是在管制区外面
  3164. newTraffic.InTraffic(agvinfo);
  3165. if (!agvinfo.PTRAFFICNUM.Contains(newTraffic))
  3166. {
  3167. //agvinfo.TRAFFICNUM.Add(newTraffic);
  3168. agvinfo.AddTraffic(newTraffic);
  3169. }
  3170. }
  3171. }
  3172. #endregion
  3173. }
  3174. else if (agvinfo.TRAFFICNUM.Count > 1)
  3175. {
  3176. #region 车子进到了交叉管制区里面,多个管制区
  3177. //2:车子进到了交叉管制区里面,多个管制区
  3178. if (agvinfo.PTRAFFICNUM.Count <= 1)
  3179. {
  3180. //2.1从管制区外面进入交叉管制区
  3181. //2.2从独立管制区进入交叉管制区
  3182. foreach (var traffic in agvinfo.TRAFFICNUM)
  3183. {
  3184. if (!agvinfo.PTRAFFICNUM.Contains(traffic))
  3185. {
  3186. //我进入交叉管制区
  3187. traffic.InMixTraffic(agvinfo);
  3188. //agvinfo.TRAFFICNUM.Add(traffic);
  3189. agvinfo.AddTraffic(traffic);
  3190. //查看交叉管制区有没有车先进入,
  3191. //有则放行那辆先进的车,没有车我则停留在交叉管制区前,直到有第二辆车进来把我放行了
  3192. if (traffic.MainAgv != agvinfo.AGVNUM)
  3193. {
  3194. GlobalPara.AgvInfoDic[traffic.MainAgv].TrafficFlag = false;
  3195. GlobalPara.AgvInfoDic[traffic.MainAgv].TRAFFICAGV = 0;
  3196. }
  3197. }
  3198. }
  3199. }
  3200. else
  3201. {
  3202. //2.3:车子在一个交叉管制区进入到另一个交叉管制区??未知情况
  3203. }
  3204. #endregion
  3205. }
  3206. else
  3207. {
  3208. #region 车子不在任何管制区,已出所有管制区
  3209. //3:车子不在任何管制区,已出所有管制区
  3210. if (agvinfo.PTRAFFICNUM.Count > 0)
  3211. {
  3212. foreach (var t in agvinfo.PTRAFFICNUM)
  3213. {
  3214. t.OutTraffic(agvinfo);
  3215. agvinfo.RemoveTraffic(t);
  3216. }
  3217. if (agvinfo.TRAFFICNUM.Count > 0)
  3218. {
  3219. //agvinfo.TRAFFICNUM.Clear();
  3220. agvinfo.ClearTraffic();
  3221. }
  3222. }
  3223. #endregion
  3224. }
  3225. **/
  3226. #endregion
  3227. }
  3228. private void DrawCarInPoint(Point point, Brush color, int agvnum)
  3229. {
  3230. Point startpoint = point;
  3231. myLineStoryboard[agvnum - 1].Children.Clear();
  3232. Canvas.SetLeft(startellipse[agvnum - 1], startpoint.X - 5);
  3233. Canvas.SetTop(startellipse[agvnum - 1], startpoint.Y - 5);
  3234. startellipse[agvnum - 1].Fill = color;
  3235. canvas.Children.Remove(startellipse[agvnum - 1]);
  3236. canvas.Children.Remove(dislable[agvnum - 1]);
  3237. canvas.Children.Add(startellipse[agvnum - 1]);
  3238. canvas.Children.Add(dislable[agvnum - 1]);
  3239. Canvas.SetTop(dislable[agvnum - 1], startpoint.Y - 5);
  3240. Canvas.SetLeft(dislable[agvnum - 1], startpoint.X - 5);
  3241. }
  3242. /// <summary>
  3243. /// 更新AGV编号和线路
  3244. /// </summary>
  3245. /// <param name="points"></param>
  3246. /// <param name="color"></param>
  3247. /// <param name="agvnum"></param>
  3248. /// <param name="animationtime"></param>
  3249. private void DrawCarLine(List<Point> points, Brush color, int agvnum, double animationtime)
  3250. {
  3251. Point startpoint = points[0];
  3252. Point endpoint = points[points.Count - 1];
  3253. myLineStoryboard[agvnum - 1].Children.Clear();
  3254. Canvas.SetLeft(startellipse[agvnum - 1], startpoint.X - 5);
  3255. Canvas.SetTop(startellipse[agvnum - 1], startpoint.Y - 5);
  3256. Canvas.SetLeft(endellipse[agvnum - 1], endpoint.X - 5);
  3257. Canvas.SetTop(endellipse[agvnum - 1], endpoint.Y - 5);
  3258. endellipse[agvnum - 1].Fill = color;
  3259. startellipse[agvnum - 1].Fill = color;
  3260. canvas.Children.Remove(startellipse[agvnum - 1]);
  3261. canvas.Children.Remove(endellipse[agvnum - 1]);
  3262. canvas.Children.Remove(dislable[agvnum - 1]);
  3263. canvas.Children.Remove(Dottedline[agvnum - 1]);
  3264. canvas.Children.Add(startellipse[agvnum - 1]);
  3265. canvas.Children.Add(endellipse[agvnum - 1]);
  3266. canvas.Children.Add(dislable[agvnum - 1]);
  3267. Canvas.SetTop(dislable[agvnum - 1], -this.dislable[agvnum - 1].ActualHeight);
  3268. Canvas.SetLeft(dislable[agvnum - 1], -this.dislable[agvnum - 1].ActualWidth / 2);
  3269. Canvas.SetTop(animatedImage[agvnum - 1], -this.animatedImage[agvnum - 1].ActualHeight / 2);
  3270. Canvas.SetLeft(animatedImage[agvnum - 1], -this.animatedImage[agvnum - 1].ActualWidth / 2);
  3271. // Create the animation path.
  3272. PathGeometry animationPath = new PathGeometry();
  3273. PathFigure pFigure = new PathFigure();
  3274. pFigure.StartPoint = points[0];
  3275. PolyLineSegment pLineSegment = new PolyLineSegment();
  3276. for (int i = 1; i < points.Count; i++)
  3277. {
  3278. pLineSegment.Points.Add(points[i]);
  3279. }
  3280. pFigure.Segments.Add(pLineSegment);
  3281. animationPath.Figures.Add(pFigure);
  3282. Dottedline[agvnum - 1].Data = animationPath;
  3283. canvas.Children.Add(Dottedline[agvnum - 1]);
  3284. animationX[agvnum - 1].PathGeometry = animationPath;
  3285. animationX[agvnum - 1].Duration = new Duration(TimeSpan.FromMilliseconds(animationtime * 1000));
  3286. animationY[agvnum - 1].PathGeometry = animationPath;
  3287. animationY[agvnum - 1].Duration = animationX[agvnum - 1].Duration;
  3288. animationAngle[agvnum - 1].PathGeometry = animationPath;
  3289. animationAngle[agvnum - 1].Duration = animationX[agvnum - 1].Duration;
  3290. myLineStoryboard[agvnum - 1].Children.Add(animationX[agvnum - 1]);
  3291. myLineStoryboard[agvnum - 1].Children.Add(animationY[agvnum - 1]);
  3292. myLineStoryboard[agvnum - 1].Children.Add(animationAngle[agvnum - 1]);
  3293. myLineStoryboard[agvnum - 1].Begin(this, true);
  3294. }
  3295. #endregion
  3296. #endregion
  3297. #region AGV控制区
  3298. byte DrvWlConGetBCC(byte[] buf, int length) //取异或校验码
  3299. {
  3300. int bcc = 0, i = 0;
  3301. for (i = 0; i < length; i++)
  3302. {
  3303. bcc = bcc ^ (buf[i]);
  3304. }
  3305. return Convert.ToByte(bcc);
  3306. }
  3307. byte DrvWlConGetBCC(List<byte> buf, int length) //取异或校验码
  3308. {
  3309. int bcc = 0, i = 0;
  3310. for (i = 0; i < length; i++)
  3311. {
  3312. bcc = bcc ^ (buf[i]);
  3313. }
  3314. return Convert.ToByte(bcc);
  3315. }
  3316. byte DrvWlConCheck(byte[] buf, byte length) //判断一帧数据正确性
  3317. {
  3318. if ((buf[0]) != 0x10)
  3319. {
  3320. return VERIFY_HEADERROR; //头错误
  3321. }
  3322. else if ((buf[buf.Length - 1]) != 0x03)
  3323. {
  3324. return VERIFY_ENDERROR; //尾错误
  3325. }
  3326. else if ((buf[1]) != 0x62 && (buf[1]) != 0x72) //功能码错误
  3327. {
  3328. return VERIFY_FUNERROR;
  3329. }
  3330. else if (DrvWlConGetBCC(buf, length) != buf[buf.Length - 2])
  3331. {
  3332. return VERIFY_BCCERROR; // 校验错误
  3333. }
  3334. else
  3335. {
  3336. return VERIFY_NOERROR;
  3337. }
  3338. }
  3339. bool DrvWlConCheck(List<byte> buf, byte length, out byte verify) //判断一帧数据正确性
  3340. {
  3341. if ((buf[0]) != 0x10)
  3342. {
  3343. verify = VERIFY_HEADERROR; //头错误
  3344. return false;
  3345. }
  3346. else if ((buf[buf.Count - 1]) != 0x03)
  3347. {
  3348. verify = VERIFY_ENDERROR; //尾错误
  3349. return false;
  3350. }
  3351. else if ((buf[1]) != 0x62 && (buf[1]) != 0x72 && !GlobalPara.UseNewProtrol) //功能码错误
  3352. {
  3353. verify = VERIFY_FUNERROR;
  3354. return false;
  3355. }
  3356. else if (GlobalPara.UseNewProtrol && (buf[1]) != 0x64) //功能码错误
  3357. {
  3358. verify = VERIFY_FUNERROR;
  3359. return false;
  3360. }
  3361. else if (!GlobalPara.UseNewProtrol && DrvWlConGetBCC(buf, length) != buf[10 - 2])//buf[buf.Count - 2])
  3362. {
  3363. verify = VERIFY_BCCERROR; // 校验错误
  3364. return false;
  3365. }
  3366. else if (GlobalPara.UseNewProtrol && DrvWlConGetBCC(buf, length) != buf[24 - 2])//buf[buf.Count - 2])
  3367. {
  3368. verify = VERIFY_BCCERROR; // 校验错误
  3369. return false;
  3370. }
  3371. else
  3372. {
  3373. verify = VERIFY_NOERROR;
  3374. return true;
  3375. }
  3376. }
  3377. #endregion
  3378. #region 界面消息响应
  3379. /// <summary>
  3380. /// 系统打开
  3381. /// </summary>
  3382. /// <param name="sender"></param>
  3383. /// <param name="e"></param>
  3384. private void btn_OpenSystem_Click(object sender, RoutedEventArgs e)
  3385. {
  3386. Stopwatch sw = new Stopwatch();
  3387. if (IsOpenSystem)
  3388. {
  3389. MessageBox.Show("系统已启动!");
  3390. return;
  3391. }
  3392. try
  3393. {
  3394. //AGVInfoModel a = new AGVInfoModel();
  3395. sw.Start();
  3396. TimerInit();//定时器初始化
  3397. sw.Stop();
  3398. Console.WriteLine("定时器初始化总共花费{0}s.", sw.Elapsed.TotalSeconds);
  3399. sw.Restart();
  3400. // InitBuffer();//缓存区初始化
  3401. sw.Stop();
  3402. Console.WriteLine("缓存区初始化总共花费{0}s.", sw.Elapsed.TotalSeconds);
  3403. //AGVGridInit2(AGVNUM_MAX);//初始化AGV绑定列表数据
  3404. sw.Restart();
  3405. //交通管制串口
  3406. if ((GlobalPara.type == 0 && SPComCOntrolList == null) || (GlobalPara.type == 1 && communication == null))
  3407. {
  3408. COMInit();
  3409. }
  3410. if (GlobalPara.type == 0)
  3411. {
  3412. for (int i = 0; i < SPComCOntrolList.Count; i++)
  3413. {
  3414. if (SPComCOntrolList[i] != null && !SPComCOntrolList[i].IsOpen)
  3415. {
  3416. SPComCOntrolList[i].portname = GlobalPara.ComNameList[i];
  3417. try
  3418. {
  3419. SPComCOntrolList[i].Open();
  3420. SPComCOntrolList[i].DiscardInBuffer();
  3421. //SPComCOntrolList[i].Write(buf_trafficctl, 0, buf_trafficctl.Length);
  3422. SPComCOntrolList[i].Write(buf_trafficct3, 0, buf_trafficct3.Length);
  3423. }
  3424. catch (System.Exception ex)
  3425. {
  3426. if (MessageBox.Show(string.Format("{0}打开失败,是否继续?", GlobalPara.ComNameList[i]), "Error", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
  3427. ;
  3428. else
  3429. return;
  3430. }
  3431. }
  3432. }
  3433. }
  3434. else if (GlobalPara.type == 1)
  3435. {
  3436. for (int i = 0; i < SPComCOntrolList2.Count; i++)
  3437. {
  3438. if (SPComCOntrolList2[i] != null && !SPComCOntrolList2[i].IsOpen)
  3439. {
  3440. SPComCOntrolList2[i].portname = GlobalPara.ComNameList[i];
  3441. try
  3442. {
  3443. SPComCOntrolList2[i].Open();
  3444. SPComCOntrolList2[i].DiscardInBuffer();
  3445. //SPComCOntrolList[i].Write(buf_trafficctl, 0, buf_trafficctl.Length);
  3446. //SPComCOntrolList2[i].Write(buf_trafficct3, 0, buf_trafficct3.Length);
  3447. }
  3448. catch (System.Exception ex)
  3449. {
  3450. if (MessageBox.Show(string.Format("{0}打开失败,是否继续?", GlobalPara.ComNameList[i]), "Error", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
  3451. ;
  3452. else
  3453. return;
  3454. }
  3455. }
  3456. }
  3457. if (!communication.IsOpen)
  3458. {
  3459. communication.Open();
  3460. //communication.SendData(buf_trafficctl, null);
  3461. for (int i = 0; i < 5; i++)
  3462. {
  3463. // communication.SendData(buf_trafficct3, null);
  3464. // Thread.Sleep(200);
  3465. }
  3466. }
  3467. }
  3468. if (GlobalPara.IsEnableDataShare)
  3469. {
  3470. Thread t1 = new Thread(new ThreadStart(delegate
  3471. {
  3472. SendDataToServer();
  3473. }));
  3474. t1.IsBackground = true;
  3475. t1.Start();
  3476. }
  3477. sw.Stop();
  3478. Console.WriteLine("操作(1)总共花费{0}s.", sw.Elapsed.TotalSeconds);
  3479. sw.Restart();
  3480. }
  3481. catch (System.Exception ex)
  3482. {
  3483. MessageBox.Show(ex.StackTrace + " 3251");
  3484. return;
  3485. }
  3486. Array.Clear(buf_virtualtrafficctl, 0, buf_virtualtrafficctl.Length);
  3487. if (!t.IsEnabled)
  3488. {
  3489. t.Start();//开始计时,开始循环
  3490. }
  3491. if (!DataTimer.IsEnabled)
  3492. {
  3493. if (SPComCOntrolList != null)
  3494. {
  3495. for (int i = 0; i < SPComCOntrolList.Count; i++)
  3496. {
  3497. if (SPComCOntrolList[i] != null)
  3498. {
  3499. SPComCOntrolList[i].DiscardInBuffer();
  3500. }
  3501. }
  3502. }
  3503. DataTimer.Start();//数据发送Timers
  3504. }
  3505. if (GlobalPara.type == 1)
  3506. {
  3507. if (communication != null && communication.IsOpen)
  3508. {
  3509. imgCOM.Source = new BitmapImage(new Uri("pack://application:,,,/Image/Light_Open_24.png"));
  3510. lblcomstate.Content = "打开";
  3511. lblcomstate.Foreground = Brushes.Green;
  3512. }
  3513. else
  3514. return;
  3515. }
  3516. else if (GlobalPara.type == 0)
  3517. {
  3518. if (SPComCOntrolList != null)
  3519. {
  3520. string str = "";
  3521. int errorNum = 0;
  3522. for (int i = 0; i < SPComCOntrolList.Count; i++)
  3523. {
  3524. if (SPComCOntrolList[i].IsOpen)
  3525. {
  3526. str += string.Format("{0}打开", SPComCOntrolList[i].portname);
  3527. }
  3528. else
  3529. {
  3530. errorNum++;
  3531. str += string.Format("{0}关闭", SPComCOntrolList[i].portname);
  3532. }
  3533. if (i < SPComCOntrolList.Count - 1)
  3534. str += ",";
  3535. }
  3536. lblcomstate.ToolTip = str;
  3537. if (errorNum < SPComCOntrolList.Count)
  3538. {
  3539. imgCOM.Source = new BitmapImage(new Uri("pack://application:,,,/Image/Light_Open_24.png"));
  3540. lblcomstate.Content = "打开";
  3541. lblcomstate.Foreground = Brushes.Green;
  3542. }
  3543. else
  3544. {
  3545. return;
  3546. }
  3547. }
  3548. else
  3549. return;
  3550. }
  3551. else
  3552. {
  3553. return;
  3554. }
  3555. // Thread.Sleep(2000);
  3556. IsOpenSystem = true;
  3557. GlobalPara.IsRealOpenSystem = true;
  3558. imgSystem.Source = new BitmapImage(new Uri("pack://application:,,,/Image/Light_Open_24.png"));
  3559. lblsystemstate.Content = "打开";
  3560. lblsystemstate.Foreground = Brushes.Green;
  3561. btn_OpenSystem.IsEnabled = false;
  3562. btn_CloseSystem.IsEnabled = true;
  3563. sw.Stop();
  3564. Console.WriteLine("操作(2)总共花费{0}s.", sw.Elapsed.TotalSeconds);
  3565. sw.Restart();
  3566. // Thread thread = new Thread(Analzye); thread.IsBackground = true;
  3567. // thread.Start();
  3568. if (ds == null || ds.IsDisposed)
  3569. {
  3570. //Action action = new Action(delegate()
  3571. //{
  3572. // ds = new DispatchSystem();
  3573. // ds.Show();
  3574. //});
  3575. //action.BeginInvoke(null, null);
  3576. // Thread th = new Thread(new ThreadStart(delegate
  3577. // {
  3578. ds = new DispatchSystem7515();
  3579. ds.Show();
  3580. // }));
  3581. // th.IsBackground = true;
  3582. // th.Start();
  3583. }
  3584. sw.Stop();
  3585. Console.WriteLine("打开窗口总共花费{0}s.", sw.Elapsed.TotalSeconds);
  3586. }
  3587. /// <summary>
  3588. /// 系统关闭
  3589. /// </summary>
  3590. /// <param name="sender"></param>
  3591. /// <param name="e"></param>
  3592. private void btn_CloseSystem_Click(object sender, RoutedEventArgs e)
  3593. {
  3594. if (MessageBox.Show(string.Format("{0}将关闭,是否继续?", this.Title), "警告", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No)
  3595. {
  3596. return;
  3597. }
  3598. if (!IsOpenSystem)
  3599. {
  3600. MessageBox.Show("系统已关闭!");
  3601. return;
  3602. }
  3603. if (GlobalPara.type == 0)
  3604. {
  3605. if (SPComCOntrolList != null)
  3606. {
  3607. for (int i = 0; i < SPComCOntrolList.Count; i++)
  3608. {
  3609. try
  3610. {
  3611. if (SPComCOntrolList[i] != null)
  3612. SPComCOntrolList[i].Close();
  3613. }
  3614. catch (System.Exception ex)
  3615. {
  3616. if (MessageBox.Show(string.Format("{0}关闭失败,忽略?", SPComCOntrolList[i].portname), "Error", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
  3617. ;
  3618. else
  3619. return;
  3620. }
  3621. }
  3622. }
  3623. }
  3624. else if (GlobalPara.type == 1)
  3625. {
  3626. if (communication != null)
  3627. communication.Close();
  3628. }
  3629. if (t.IsEnabled)
  3630. {
  3631. t.Stop();
  3632. }
  3633. if (batteryInfoTimer.IsEnabled)
  3634. {
  3635. batteryInfoTimer.Stop();
  3636. }
  3637. if (DataTimer.IsEnabled)
  3638. {
  3639. DataTimer.Stop();
  3640. }
  3641. if (GlobalPara.type == 0)
  3642. {
  3643. for (int i = 0; i < SPComCOntrolList.Count; i++)
  3644. {
  3645. if (!SPComCOntrolList[i].IsOpen)
  3646. {
  3647. imgCOM.Source = new BitmapImage(new Uri("pack://application:,,,/Image/Light_Close_24.png"));
  3648. lblcomstate.Content = "关闭";
  3649. lblcomstate.Foreground = Brushes.Red;
  3650. }
  3651. }
  3652. }
  3653. else if (GlobalPara.type == 1)
  3654. {
  3655. if (!communication.IsOpen)
  3656. {
  3657. imgCOM.Source = new BitmapImage(new Uri("pack://application:,,,/Image/Light_Close_24.png"));
  3658. lblcomstate.Content = "关闭";
  3659. lblcomstate.Foreground = Brushes.Red;
  3660. }
  3661. }
  3662. IsOpenSystem = false;
  3663. //for (int i = 0; i < startellipse.Length; i++)
  3664. //{
  3665. // if (AgvStatusList[i].WirelessStaus)
  3666. // {
  3667. // AgvStatusList[i].WirelessStaus = false;
  3668. // }
  3669. //}
  3670. imgSystem.Source = new BitmapImage(new Uri("pack://application:,,,/Image/Light_Close_24.png"));
  3671. lblsystemstate.Content = "关闭";
  3672. lblsystemstate.Foreground = Brushes.Red;
  3673. btn_OpenSystem.IsEnabled = true;
  3674. btn_CloseSystem.IsEnabled = false;
  3675. if (ds != null && !ds.IsDisposed)
  3676. {
  3677. ds.Close();
  3678. ds.Dispose();
  3679. }
  3680. string address = "http://" + GlobalPara.HostIP + ":3350";
  3681. }
  3682. /// <summary>
  3683. /// 小车控制
  3684. /// </summary>
  3685. /// <param name="sender"></param>
  3686. /// <param name="e"></param>
  3687. private void btnControl_Click(object sender, RoutedEventArgs e)
  3688. {
  3689. int iAgvnum = this.cb_AgvNum.SelectedIndex;
  3690. int iOperation = this.cb_Operation.SelectedIndex - 1;
  3691. int iSpeed = this.cb_Speed.SelectedIndex;
  3692. buf_runctl[0] = 0x10;
  3693. buf_runctl[1] = 0x71;
  3694. buf_runctl[2] = Convert.ToByte(iAgvnum + 1);
  3695. //修改日期:2014-01-02
  3696. //操作设置添加了“保持现状”功能,按位来设置的
  3697. if (iOperation >= 0 && iOperation < 8)
  3698. {
  3699. buf_runctl[3] = Convert.ToByte((1 << iOperation) | 0x00);
  3700. }
  3701. else
  3702. {
  3703. buf_runctl[3] = 0x00;
  3704. }
  3705. byte linenum = string.IsNullOrEmpty(this.cb_LineNum.Text) ? (byte)0 : Convert.ToByte(this.cb_LineNum.Text);
  3706. buf_runctl[4] = Convert.ToByte(iSpeed);
  3707. buf_runctl[5] = linenum;
  3708. buf_runctl[6] = 0x00;
  3709. buf_runctl[7] = 0x00;
  3710. buf_runctl[8] = DrvWlConGetBCC(buf_runctl, 8);
  3711. buf_runctl[9] = 0x03;
  3712. IsSendCtrl = 1;
  3713. }
  3714. private void cb_AgvNum_SelectionChanged(object sender, SelectionChangedEventArgs e)
  3715. {
  3716. //修改日期:2014-01-02
  3717. cb_Speed.SelectedIndex = 0;
  3718. cb_Operation.SelectedIndex = 0;
  3719. cb_LineNum.SelectedIndex = 0;
  3720. }
  3721. #endregion
  3722. #region 菜单栏响应消息
  3723. private void AGVPara_Click(object sender, RoutedEventArgs e)
  3724. {
  3725. AGVParaSetting apsdialog = new AGVParaSetting();
  3726. apsdialog.Show();
  3727. }
  3728. private void COM_Click(object sender, RoutedEventArgs e)
  3729. {
  3730. COMSetting csdialog = new COMSetting();
  3731. csdialog.Show();
  3732. }
  3733. private void PassWord_Click(object sender, RoutedEventArgs e)
  3734. {
  3735. PassWordSetting psdialog = new PassWordSetting();
  3736. psdialog.Show();
  3737. }
  3738. private void UserManage_Click(object sender, RoutedEventArgs e)
  3739. {
  3740. UserManage umdialog = new UserManage();
  3741. umdialog.Show();
  3742. }
  3743. private void Mark_Click(object sender, RoutedEventArgs e)
  3744. {
  3745. AGVManage amdialog = new AGVManage("Mark");
  3746. amdialog.Show();
  3747. }
  3748. private void Route_Click(object sender, RoutedEventArgs e)
  3749. {
  3750. AGVManage amdialog = new AGVManage("Route");
  3751. amdialog.Show();
  3752. }
  3753. private void HostRoute_Click(object sender, RoutedEventArgs e)
  3754. {
  3755. //AGVManage amdialog = new AGVManage("NewTraffic");
  3756. //amdialog.Show();
  3757. TrafficManageNew amdialog = new TrafficManageNew();
  3758. amdialog.Show();
  3759. }
  3760. private void Traffic_Click(object sender, RoutedEventArgs e)
  3761. {
  3762. AGVManage amdialog = new AGVManage("Traffic");
  3763. amdialog.Show();
  3764. }
  3765. private void WorkLine_Click(object sender, RoutedEventArgs e)
  3766. {
  3767. WorkLineManage wmdialog = new WorkLineManage();
  3768. wmdialog.Show();
  3769. }
  3770. private void DockArea_Click(object sender, RoutedEventArgs e)
  3771. {
  3772. DockManage dmdialog = new DockManage();
  3773. dmdialog.Show();
  3774. }
  3775. private void Speed_Click(object sender, RoutedEventArgs e)
  3776. {
  3777. SpeedManage smdialog = new SpeedManage();
  3778. smdialog.Show();
  3779. }
  3780. private void Custom_Click(object sender, RoutedEventArgs e)
  3781. {
  3782. CustomManage cmdialog = new CustomManage();
  3783. cmdialog.Show();
  3784. }
  3785. private void Exception_Click(object sender, RoutedEventArgs e)
  3786. {
  3787. ExceptionManage emdialog = new ExceptionManage();
  3788. emdialog.Show();
  3789. }
  3790. private void MapResee_Click(object sender, RoutedEventArgs e)
  3791. {
  3792. canvas.Scale = 1;
  3793. canvas.Offset = new Point(0, 0);
  3794. }
  3795. private void WiressBox_Click(object sender, RoutedEventArgs e)
  3796. {
  3797. WirelessDockingSystem system = new WirelessDockingSystem();
  3798. system.Show();
  3799. GlobalPara.wirelessDockingSystem = system;
  3800. }
  3801. private void Help_Click(object sender, RoutedEventArgs e)
  3802. {
  3803. Help hdialog = new Help();
  3804. hdialog.Show();
  3805. }
  3806. private void AGVControl1_Click(object sender, RoutedEventArgs e)
  3807. {
  3808. AGVSingleControl ac = new AGVSingleControl();
  3809. ac.Show();
  3810. }
  3811. private void AGVControl2_Click(object sender, RoutedEventArgs e)
  3812. {
  3813. AutoRelease ac = new AutoRelease();
  3814. ac.Show();
  3815. }
  3816. private void AGVControl4_Click(object sender, RoutedEventArgs e)
  3817. {
  3818. AGVMonitor ac = new AGVMonitor();
  3819. ac.Show();
  3820. }
  3821. private void AGVControl_Click(object sender, RoutedEventArgs e)
  3822. {
  3823. MenuItem btn = (MenuItem)sender;
  3824. int ActionCode = 0;
  3825. if (btn.Header.ToString().Contains("休眠"))
  3826. {
  3827. ActionCode = 0x20;
  3828. GlobalPara.IsOneKeySleep = true;
  3829. GlobalPara.isSingleControl = false;
  3830. }
  3831. else if (btn.Header.ToString().Contains("唤醒"))
  3832. {
  3833. ActionCode = 0x30;
  3834. GlobalPara.isSingleControl = false;
  3835. }
  3836. else if (btn.Header.ToString().Contains("启动"))
  3837. {
  3838. ActionCode = 0x40;
  3839. }
  3840. else if (btn.Header.ToString().Contains("停止"))
  3841. {
  3842. ActionCode = 0x50;
  3843. }
  3844. if (btn.Header.ToString().Contains("休眠"))
  3845. {
  3846. GlobalPara.IsOneKeySleep = true;
  3847. }
  3848. for (int i = 0; i < 5; i++)
  3849. {
  3850. DispatcherTool.ControlAllAgv(ActionCode);
  3851. Thread.Sleep(20);
  3852. }
  3853. if (btn.Header.ToString().Contains("休眠"))
  3854. {
  3855. SleepAndWakeUpForm saw = new SleepAndWakeUpForm();
  3856. saw.Show();
  3857. }
  3858. if (btn.Header.ToString().Contains("唤醒"))
  3859. {
  3860. GlobalPara.IsOneKeySleep = false;
  3861. SleepAndWakeUpForm saw = new SleepAndWakeUpForm();
  3862. saw.Show();
  3863. }
  3864. }
  3865. #endregion
  3866. #region 在画布中的鼠标处理
  3867. bool MouseLeftPress = false;
  3868. Point lastpoint = new Point(0, 0);
  3869. bool FullScreen = false;
  3870. Point OffsetPoint = new Point(0, 0);
  3871. private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  3872. {
  3873. MouseLeftPress = true;
  3874. lastpoint.X = e.GetPosition(null).X + OffsetPoint.X;
  3875. lastpoint.Y = e.GetPosition(null).Y + OffsetPoint.Y;
  3876. this.Cursor = Cursors.Hand;
  3877. }
  3878. private void canvas_MouseMove(object sender, MouseEventArgs e)
  3879. {
  3880. if (MouseLeftPress)
  3881. {
  3882. Point newpoint = e.GetPosition(null);
  3883. canvas.Offset = new Point(lastpoint.X - newpoint.X, lastpoint.Y - newpoint.Y);
  3884. }
  3885. }
  3886. private void canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  3887. {
  3888. MouseLeftPress = false;
  3889. this.Cursor = Cursors.Arrow;
  3890. OffsetPoint = canvas.Offset;
  3891. }
  3892. private void canvas_MouseLeave(object sender, MouseEventArgs e)
  3893. {
  3894. MouseLeftPress = false;
  3895. }
  3896. private void canvas_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
  3897. {
  3898. FullScreen = !FullScreen;
  3899. if (FullScreen)
  3900. {
  3901. Panel.SetZIndex(canvas, 30);
  3902. /************************************************************************/
  3903. /* 修改日期:2014.7.25
  3904. * 修改说明:实现了电子地图的全屏显示
  3905. 修改者:肖丁铭*/
  3906. /************************************************************************/
  3907. menu1.Visibility = Visibility.Hidden;
  3908. status1.Visibility = Visibility.Hidden;
  3909. dataGrid1.Visibility = Visibility.Hidden;
  3910. this.WindowStyle = WindowStyle.None;
  3911. this.WindowState = WindowState.Maximized;
  3912. }
  3913. else
  3914. {
  3915. Panel.SetZIndex(canvas, 0);
  3916. canvas.Scale = 1;
  3917. canvas.Offset = new Point(0, 0);
  3918. /************************************************************************/
  3919. /* 修改日期:2014.7.25
  3920. * 修改说明:实现了电子地图的全屏显示
  3921. 修改者:肖丁铭*/
  3922. /************************************************************************/
  3923. this.WindowStyle = WindowStyle.SingleBorderWindow;
  3924. this.WindowState = WindowState.Maximized;
  3925. menu1.Visibility = Visibility.Visible;
  3926. status1.Visibility = Visibility.Visible;
  3927. }
  3928. }
  3929. private void mCanvas_MouseWheel(object sender, MouseWheelEventArgs e)
  3930. {
  3931. Point zoomCenter = e.GetPosition(this.canvas);
  3932. canvas.Scale += e.Delta / 1000.0;
  3933. //最大放大十倍
  3934. if (canvas.Scale > 10)
  3935. {
  3936. canvas.Scale = 10;
  3937. }
  3938. //缩小可以小到3倍
  3939. if (canvas.Scale < 0.3)
  3940. {
  3941. canvas.Scale = 0.3;
  3942. }
  3943. }
  3944. #endregion
  3945. #region 加密狗事件插拨通知
  3946. //加密狗变量定义,类中包含了加密狗的读写密码及其他信息
  3947. SoftKey ytsoftkey = new SoftKey();
  3948. /// <summary>
  3949. /// 注册加密锁事件插拨通知
  3950. /// </summary>
  3951. void RegisterDeviceNotification()
  3952. {
  3953. Win32.DEV_BROADCAST_DEVICEINTERFACE dbi = new
  3954. Win32.DEV_BROADCAST_DEVICEINTERFACE();
  3955. int size = Marshal.SizeOf(dbi);
  3956. dbi.dbcc_size = size;
  3957. dbi.dbcc_devicetype = Win32.DBT_DEVTYP_DEVICEINTERFACE;
  3958. dbi.dbcc_reserved = 0;
  3959. dbi.dbcc_classguid = Win32.GUID_DEVINTERFACE_USB_DEVICE;
  3960. dbi.dbcc_name = 0;
  3961. IntPtr buffer = Marshal.AllocHGlobal(size);
  3962. Marshal.StructureToPtr(dbi, buffer, true);
  3963. WindowInteropHelper helper = new WindowInteropHelper(this);
  3964. IntPtr ptr = helper.Handle;
  3965. IntPtr r = Win32.RegisterDeviceNotification(ptr, buffer,
  3966. Win32.DEVICE_NOTIFY_WINDOW_HANDLE);
  3967. if (r == IntPtr.Zero)
  3968. MessageBox.Show(Win32.GetLastError().ToString() + " 3680");
  3969. }
  3970. void win_SourceInitialized(object sender, EventArgs e)
  3971. {
  3972. HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
  3973. if (hwndSource != null)
  3974. {
  3975. hwndSource.AddHook(new HwndSourceHook(WndProc));
  3976. }
  3977. }
  3978. protected override void OnSourceInitialized(EventArgs e)
  3979. {
  3980. base.OnSourceInitialized(e);
  3981. this.win_SourceInitialized(this, e);
  3982. }
  3983. protected virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
  3984. {
  3985. switch (msg)
  3986. {
  3987. case Win32.WM_DEVICECHANGE:
  3988. OnDeviceChange(msg);
  3989. break;
  3990. }
  3991. return IntPtr.Zero;
  3992. }
  3993. void OnDeviceChange(int msg)
  3994. {
  3995. int wParam = 32772;
  3996. int lParam = 170714116;
  3997. if ((int)wParam == Win32.DBT_DEVICEARRIVAL)
  3998. {
  3999. int devType = Marshal.ReadInt32((int)lParam, 4);
  4000. if (devType == Win32.DBT_DEVTYP_DEVICEINTERFACE)
  4001. {
  4002. Win32.DEV_BROADCAST_DEVICEINTERFACE1 DeviceInfo = (Win32.DEV_BROADCAST_DEVICEINTERFACE1)Marshal.PtrToStructure((IntPtr)lParam, typeof(Win32.DEV_BROADCAST_DEVICEINTERFACE1));
  4003. }
  4004. }
  4005. if ((int)wParam == Win32.DBT_DEVICEREMOVECOMPLETE)
  4006. {
  4007. if (ytsoftkey.CheckKeyByEncstring_New() != 0)
  4008. {
  4009. //this._loading.Visibility = Visibility.Visible;
  4010. }
  4011. }
  4012. }
  4013. #endregion
  4014. #region 界面鼠标单击事件(杂项)
  4015. private void LookUpData_Click(object sender, RoutedEventArgs e)
  4016. {
  4017. try
  4018. {
  4019. string date = string.Format(@"Link\{0}.xls", DateTime.Now.ToString("yyyy-MM-dd"));
  4020. string tempFile = string.Format(@"{0}\{1}.xls", System.IO.Path.GetTempPath(), DateTime.Now.ToString("yyyy-MM-dd"));
  4021. System.IO.File.Copy(date, tempFile, true);
  4022. Process.Start(tempFile);
  4023. }
  4024. catch (System.Exception ex)
  4025. {
  4026. MessageBox.Show(ex.Message + " 3745");
  4027. }
  4028. }
  4029. protected override void OnClosing(CancelEventArgs e)
  4030. {
  4031. if (MessageBox.Show(string.Format("{0}将关闭,是否继续?", this.Title), "警告", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No)
  4032. {
  4033. e.Cancel = true;
  4034. }
  4035. else
  4036. {
  4037. foreach (Iplugin p in PluginLoader.pluginList)
  4038. {
  4039. p.Close();
  4040. }
  4041. foreach (AgvStatusTimeSpan agv in useRateTimeList)
  4042. {
  4043. agv.Close();
  4044. }
  4045. base.OnClosing(e);
  4046. }
  4047. }
  4048. private void OpenAlarmService_Click(object sender, RoutedEventArgs e)
  4049. {
  4050. if (host == null || host.State == CommunicationState.Closed)
  4051. {
  4052. host = new System.ServiceModel.ServiceHost(typeof(AgvAlarmServiceLibrary.AgvAlarmService));
  4053. NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);
  4054. string address = string.Format(@"net.tcp://{0}:10000/AgvAlarmService", GlobalPara.HostIP);
  4055. host.AddServiceEndpoint(typeof(AgvAlarmServiceLibrary.IAgvAlarmService), binding, address);
  4056. if (host.Description.Behaviors.Find<System.ServiceModel.Description.ServiceMetadataBehavior>() == null)
  4057. {
  4058. ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
  4059. behavior.HttpGetEnabled = true;
  4060. string httpAddress = string.Format(@"http://{0}:10001/AgvAlarmService", GlobalPara.HostIP);
  4061. behavior.HttpGetUrl = new Uri(httpAddress);
  4062. host.Description.Behaviors.Add(behavior);
  4063. }
  4064. }
  4065. try
  4066. {
  4067. host.Open();
  4068. MessageBox.Show("成功开启报警服务");
  4069. OpenAlarmService.IsEnabled = false;
  4070. CloseAlarmService.IsEnabled = true;
  4071. }
  4072. catch (System.Exception ex)
  4073. {
  4074. MessageBox.Show(string.Format("{0}", ex.Message), "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  4075. }
  4076. }
  4077. private void CloseAlarmService_Click(object sender, RoutedEventArgs e)
  4078. {
  4079. try
  4080. {
  4081. if (host != null)
  4082. {
  4083. if (host.State == CommunicationState.Opened)
  4084. {
  4085. if (AgvAlarmServiceLibrary.AgvAlarmService.userCallBackList != null)
  4086. {
  4087. foreach (AgvAlarmServiceLibrary.ISrvToClientCallBack callback in AgvAlarmServiceLibrary.AgvAlarmService.userCallBackList)
  4088. {
  4089. callback.NotifyClient("服务端已下线");
  4090. }
  4091. }
  4092. }
  4093. Action action = delegate { host.Close(); };
  4094. //host.Close();
  4095. action.BeginInvoke(null, null);
  4096. MessageBox.Show("成功关闭报警服务");
  4097. OpenAlarmService.IsEnabled = true;
  4098. CloseAlarmService.IsEnabled = false;
  4099. }
  4100. }
  4101. catch (System.Exception ex)
  4102. {
  4103. //Console.WriteLine(ex.Message);
  4104. MessageBox.Show(string.Format("{0}", ex.Message), "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  4105. }
  4106. }
  4107. void LoadPlugins()
  4108. {
  4109. try
  4110. {
  4111. PluginLoader.LoadAllPlugins();
  4112. foreach (Iplugin p in PluginLoader.pluginList)
  4113. {
  4114. p.InitPlugin();
  4115. }
  4116. }
  4117. catch (System.Exception ex)
  4118. {
  4119. MessageBox.Show(ex.Message + " 3851");
  4120. }
  4121. }
  4122. /// <summary>
  4123. /// 配置数据库连接字
  4124. /// </summary>
  4125. /// <param name="key"></param>
  4126. /// <param name="value"></param>
  4127. /// <returns></returns>
  4128. public static bool SetIndexConfigValue(string key, string value)
  4129. {
  4130. string startPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
  4131. string pluginPath = System.IO.Path.Combine(startPath, "plugins");
  4132. string pluginPath1 = System.IO.Path.Combine(pluginPath, "UseRate.dll.config");
  4133. if (!Directory.Exists(pluginPath))
  4134. {
  4135. Directory.CreateDirectory(pluginPath);
  4136. }
  4137. if (!File.Exists(pluginPath1))
  4138. throw new Exception(string.Format("配置文件不存在:{0}", pluginPath));
  4139. ExeConfigurationFileMap ecf = new ExeConfigurationFileMap();
  4140. ecf.ExeConfigFilename = pluginPath1;
  4141. Configuration config = ConfigurationManager.OpenMappedExeConfiguration(ecf, ConfigurationUserLevel.None);
  4142. config.AppSettings.Settings[key].Value = value;
  4143. config.Save();
  4144. return true;
  4145. }
  4146. private void MenuItem_Click(object sender, RoutedEventArgs e)
  4147. {
  4148. using (SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["ConnString"]))
  4149. {
  4150. con.Open();
  4151. string strCon = string.Format("Data Source={0};Initial Catalog={1};Integrated Security={2}", con.DataSource, con.Database, "True");
  4152. SetIndexConfigValue("ConnectStr", strCon);
  4153. con.Close();
  4154. }
  4155. }
  4156. public object GetControl(string ctrlName)
  4157. {
  4158. return FindName(ctrlName);
  4159. }
  4160. /// <summary>
  4161. /// 标题栏鼠标左键按下事件(隐藏或显示侧边栏)
  4162. /// </summary>
  4163. /// <param name="sender"></param>
  4164. /// <param name="e"></param>
  4165. private void Image_MouseDown(object sender, MouseButtonEventArgs e)
  4166. {
  4167. if (dataGrid1.Width > 10)
  4168. {
  4169. dataGrid1.Width = 10;
  4170. }
  4171. else
  4172. {
  4173. dataGrid1.Width = 200;
  4174. }
  4175. }
  4176. #endregion
  4177. void sendOffilineExMsg(AGV_DisMember agvinfo)
  4178. {
  4179. byte[] buf_ShareDate = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 };
  4180. buf_ShareDate[1] = byte.Parse(agvinfo.txtAGVNum);
  4181. int mark = int.Parse(agvinfo.txtMarkNum);
  4182. buf_ShareDate[2] = (byte)((mark & 0xff00) >> 8);
  4183. buf_ShareDate[3] = (byte)(mark & 0x00ff);
  4184. buf_ShareDate[4] = byte.Parse(agvinfo.txtLineNum);
  4185. buf_ShareDate[6] = 0x00;
  4186. buf_ShareDate[7] = 0x03;
  4187. buf_ShareDate[12] = DrvWlConGetBCC(buf_ShareDate, 12);
  4188. socketclient.socket_send(buf_ShareDate);
  4189. }
  4190. public void Clear_Click(object sender, EventArgs e)
  4191. {
  4192. string pwd = Microsoft.VisualBasic.Interaction.InputBox("请输入密码", "提示", "", -1, -1);
  4193. if (pwd == "casun36689")
  4194. {
  4195. if (MessageBox.Show("是否清空所有地标、路线、管制区", "警告", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
  4196. {
  4197. string sql = "truncate table dbo.T_Ex;";
  4198. sql += "truncate table dbo.T_Line;";
  4199. sql += "truncate table dbo.T_Mark;";
  4200. sql += "truncate table dbo.T_Traffic;";
  4201. DAL.ZSql sql1 = new DAL.ZSql();
  4202. sql1.Open(sql);
  4203. sql1.Close();
  4204. MessageBox.Show("清除成功,请重启程序");
  4205. }
  4206. }
  4207. else
  4208. {
  4209. MessageBox.Show("密码错误");
  4210. }
  4211. }
  4212. /// <summary>
  4213. /// 增加最小化出来事件-12-12
  4214. /// </summary>
  4215. /// <param name="sender"></param>
  4216. /// <param name="e"></param>
  4217. private void Window_StateChanged(object sender, EventArgs e)
  4218. {
  4219. //if (this.WindowState == WindowState.Minimized)
  4220. //{
  4221. // this.Hide();
  4222. //}
  4223. //if (this.WindowState == WindowState.Maximized || this.WindowState == WindowState.Normal)
  4224. //{
  4225. // this.Show();
  4226. // this.Activate();
  4227. //}
  4228. }
  4229. /// <summary>
  4230. /// 处理调度的协议
  4231. /// </summary>
  4232. private void Analzye()
  4233. {
  4234. while (true)
  4235. {
  4236. try
  4237. {
  4238. while (GlobalPara.dispatchList.Count > 0)
  4239. {
  4240. byte[] bytes = GlobalPara.dispatchList[0];
  4241. if (bytes != null)
  4242. {
  4243. AnalzyeBytes(bytes);
  4244. Console.WriteLine("调度模块收到数据:" + GlobalPara.ByteToHexString(bytes));
  4245. if (GlobalPara.dispatchList.Contains(bytes))
  4246. {
  4247. GlobalPara.dispatchList.Remove(bytes);
  4248. }
  4249. }
  4250. else
  4251. {
  4252. if (GlobalPara.dispatchList.Contains(bytes))
  4253. {
  4254. GlobalPara.dispatchList.Remove(bytes);
  4255. }
  4256. }
  4257. }
  4258. }
  4259. catch (Exception)
  4260. {
  4261. }
  4262. // Thread.Sleep(50);
  4263. }
  4264. }
  4265. int lastSWAGVNum = -1;
  4266. List<string> BoxMarkList = new List<string>();
  4267. public void AnalzyeBytes(byte[] bytes)
  4268. {
  4269. try
  4270. {
  4271. if (bytes != null && bytes.Length >= 14 && bytes[0] == 0xAA && bytes[1] == 0x11 && bytes[bytes.Length - 1] == 0xAB)
  4272. {
  4273. int agvnum = (int)bytes[5];
  4274. if (GlobalPara.isSingleControl && GlobalPara.SingleSWAGVNum == agvnum && lastSWAGVNum != agvnum)
  4275. {
  4276. lastSWAGVNum = agvnum;
  4277. if (bytes[2] == 0x22)
  4278. {
  4279. MessageBox.Show(agvnum + "号AGV休眠成功!");
  4280. }
  4281. else if (bytes[2] == 0x32)
  4282. {
  4283. MessageBox.Show(agvnum + "号AGV唤醒成功!");
  4284. }
  4285. }
  4286. else if (!GlobalPara.isSingleControl)
  4287. {
  4288. if (bytes[2] == 0x22)
  4289. {
  4290. if (!GlobalPara.SleepAGVNumList.Contains(agvnum))
  4291. {
  4292. GlobalPara.SleepAGVNumList.Add(agvnum);
  4293. }
  4294. if (GlobalPara.WakeUpAGVNumList.Contains(agvnum))
  4295. {
  4296. GlobalPara.WakeUpAGVNumList.Remove(agvnum);
  4297. }
  4298. }
  4299. else if (bytes[2] == 0x32)
  4300. {
  4301. if (!GlobalPara.WakeUpAGVNumList.Contains(agvnum))
  4302. {
  4303. GlobalPara.WakeUpAGVNumList.Add(agvnum);
  4304. }
  4305. if (GlobalPara.SleepAGVNumList.Contains(agvnum))
  4306. {
  4307. GlobalPara.SleepAGVNumList.Remove(agvnum);
  4308. }
  4309. }
  4310. }
  4311. }
  4312. else if (bytes != null && bytes.Length >= 14 && bytes[0] == 0x10 && bytes[1] == 0x37)
  4313. {
  4314. int agvnum = (int)bytes[11];
  4315. if (GlobalPara.AgvInfoDic.ContainsKey(agvnum))
  4316. {
  4317. AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[agvnum];
  4318. if (agvinfo.RUNSTATUS_Cur != 0x43)
  4319. {
  4320. agvinfo.RUNSTATUS_Cur = 0x43;
  4321. agvinfo.ConnectStatus = true;
  4322. agvinfo.OffLineCount = 0;
  4323. }
  4324. for (int i = 0; i < BoxMarkList.Count; i++)
  4325. {
  4326. if (BoxMarkList[i] == (agvinfo.MARKNUM.ToString()))
  4327. {
  4328. DispatcherTool.ReleaseAgvOnStop(agvinfo.MARKNUM, agvinfo.ROUTENUM, 0, 1);
  4329. break;
  4330. }
  4331. }
  4332. }
  4333. else
  4334. {
  4335. // for (int i = 0; i < BoxMarkList.Count; i++)
  4336. {
  4337. //if (BoxMarkList[i] == (agvinfo.MARKNUM.ToString()))
  4338. {
  4339. DispatcherTool.ReleaseAgvOnStop((int)bytes[9], 0, 0, 1);
  4340. // break;
  4341. }
  4342. }
  4343. }
  4344. }
  4345. else if (bytes != null && bytes.Length >= 14 && bytes[0] == 0x10 && bytes[1] == 0x38)
  4346. {
  4347. int agvnum = (int)bytes[11];
  4348. if (GlobalPara.AgvInfoDic.ContainsKey(agvnum))
  4349. {
  4350. AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[agvnum];
  4351. if (agvinfo.RUNSTATUS_Cur != 0x40)
  4352. {
  4353. agvinfo.RUNSTATUS_Cur = 0x40;
  4354. agvinfo.ConnectStatus = true;
  4355. agvinfo.OffLineCount = 0;
  4356. }
  4357. }
  4358. }
  4359. else if (bytes != null && bytes.Length >= 14 && bytes[0] == 0x10 && bytes[1] == 0x55)
  4360. {
  4361. bytes[1] = 0x56;
  4362. byte checkSum = 0x00;
  4363. for (int i = 0; i < 12; i++)
  4364. {
  4365. checkSum ^= bytes[i];
  4366. }
  4367. bytes[12] = checkSum;
  4368. // GlobalPara.communication.SendData(bytes, null);
  4369. }
  4370. }
  4371. catch (Exception ex)
  4372. {
  4373. }
  4374. }
  4375. public static void ReadingStopPoint(int mark, int route, int times = 7)
  4376. {
  4377. byte[] buffer = new byte[14] { 0x10, 0, 0x30, 0x30, 0x30, 0x50, 0x30, 0x30, 0, 0, 0, 0, 0, 0x03 };
  4378. buffer[DispatcherTool.COM_FUNC] = 0x35;
  4379. int Route = 0x3030 + route;
  4380. buffer[DispatcherTool.COM_ROUTE - 1] = (byte)((Route >> 8) & 0xFF);
  4381. buffer[DispatcherTool.COM_ROUTE] = (byte)(Route & 0xFF);
  4382. buffer[DispatcherTool.COM_MARK] = (byte)((mark & 0xff00) >> 8);
  4383. buffer[DispatcherTool.COM_MARK + 1] = (byte)(mark & 0x00ff);
  4384. buffer[DispatcherTool.COM_CHECK] = DispatcherTool.XOR_Check(buffer, 12);
  4385. // if (!GlobalPara.SendBytesList.Contains(buffer))
  4386. {
  4387. for (int j = 0; j < times; j++)
  4388. {
  4389. for (int i = 0; i < SPComCOntrolList2.Count; i++)
  4390. {
  4391. if (SPComCOntrolList2[i] != null)
  4392. {
  4393. SPComCOntrolList2[i].Write(buffer, 0, buffer.Length);
  4394. System.Threading.Thread.Sleep(100);
  4395. }
  4396. }
  4397. }
  4398. }
  4399. }
  4400. public static void ReleaseStopPoint(int mark, int route, string ipAddress = null, int times = 12)
  4401. {
  4402. byte[] buffer = new byte[14] { 0x10, 0, 0x30, 0x30, 0x30, 0x50, 0x30, 0x30, 0, 0, 0, 0, 0, 0x03 };
  4403. buffer[DispatcherTool.COM_FUNC] = 0x38;
  4404. int Route = 0x3030 + route;
  4405. buffer[DispatcherTool.COM_ROUTE - 1] = (byte)((Route >> 8) & 0xFF);
  4406. buffer[DispatcherTool.COM_ROUTE] = (byte)(Route & 0xFF);
  4407. buffer[DispatcherTool.COM_MARK] = (byte)((mark & 0xff00) >> 8);
  4408. buffer[DispatcherTool.COM_MARK + 1] = (byte)(mark & 0x00ff);
  4409. buffer[DispatcherTool.COM_CHECK] = DispatcherTool.XOR_Check(buffer, 12);
  4410. // if (!GlobalPara.SendBytesList.Contains(buffer))
  4411. {
  4412. for (int j = 0; j < times; j++)
  4413. {
  4414. for (int i = 0; i < SPComCOntrolList2.Count; i++)
  4415. {
  4416. if (SPComCOntrolList2[i] != null)
  4417. {
  4418. SPComCOntrolList2[i].Write(buffer, 0, buffer.Length);
  4419. System.Threading.Thread.Sleep(100);
  4420. }
  4421. }
  4422. }
  4423. }
  4424. }
  4425. }
  4426. }