MainWindow11.xaml.cs 187 KB

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