MainPro.cpp 93 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483
  1. #include "stdafx.h"
  2. #include "ascprocess.h"
  3. #include "Global.h"
  4. #include "struct.h"
  5. #include "MainPro.h"
  6. #include "rtuprocess.h"
  7. #include "tcpprocess.h"
  8. #include "icpdasprocess.h"
  9. #include "SnmpProcess.h"
  10. #include "upsParadigmProcess.h"
  11. #include "stulzprocess.h"
  12. #include "NoticeQueue.h"
  13. #include "DaiKinProcess.h"
  14. #include "PowerwareProcess.h"
  15. #include "greeprocess.h"
  16. #include "CarelProcess.h"
  17. #include "Client2SrvType.h"
  18. #include "SysLib.h"
  19. #include "Separate.h"
  20. #include "MostDevice.h"
  21. #include "Const.h"
  22. #include "ping.h"
  23. CRITICAL_SECTION g_csDevOnlineReadOneData;
  24. #define DATA_CHANGE_FLAG 0.01//0.00001
  25. #if IS_USER_MUL_THREAD_REQUEST
  26. HANDLE g_hRequestDataThread[MAX_DLL_TYPE] = {0};
  27. CString g_strPort[MAX_DLL_TYPE];
  28. #else
  29. HANDLE g_hRequestDataThread = NULL;
  30. #endif
  31. HANDLE g_hReConnectCommThread = NULL;
  32. INT g_nRequestDataThreadCount = 0;
  33. INT g_nTimingSendFinished = 0;
  34. HANDLE g_hTimingSendSmsThread = NULL;
  35. HANDLE g_hDevOnlineThread = NULL;
  36. HANDLE g_hVoiceNoticeThread = NULL;
  37. HANDLE g_hOutputThread = NULL;
  38. HANDLE g_hGetDatePlanThread = NULL;
  39. INT g_nRtuThreadIndex = RTU_THREAD_START; //预留100个Modbus Rtu设备,每个串口一个处理线程
  40. INT g_nAscThreadIndex = ASC_THREAD_START; //预留100个Modbus Asc设备,每个串口一个处理线程
  41. INT g_nTcpThreadIndex = TCP_THREAD_START; //预留100个Modbus Tcp设备,每个IP一个处理线程
  42. INT g_nSnmpThreadIndex = SNMP_THREAD_START; //预留200个Snmp设备,每个IP一个处理线程
  43. INT g_nMostDeviceIndex = MOSTDEVICE_THREAD_START; //预留100个MostDevice类型有设备,每个IP一个处理线程
  44. INT g_nIcpdasIndex = ICPDAS_THREAD_START; //预留10个泓格设备,每个串口一个处理线程
  45. INT g_nParadigmIndex = PARADIGM_THREAD_START; //预留10个Paradigm设备,每个串口一个处理线程
  46. INT g_nStulzIndex = STULZ_THREAD_START; //预留10个Stulz设备,每个串口一个处理线程
  47. INT g_nDaiKinIndex = DAIKIN_THREAD_START; //预留10个Dinkin设备,每个串口一个处理线程
  48. INT g_nPowerwareIndex = POWERWARE_THREAD_START; //预留10个Powerware设备,每个串口一个处理线程
  49. INT g_nGreeIndex = GREE_THREAD_START; //预留10个Gree设备,每个串口一个处理线程
  50. INT g_nCarelIndex = CAREL_THREAD_START; //预留10个Carel设备,每个串口一个处理线程
  51. INT g_nScantakIndex = SCANTAK_THREAD_START; //预留10个Scantak设备,每个串口一个处理线程
  52. INT g_nDeltaIndex = DELTA_THREAD_START; //预留10个Delta设备,每个串口一个处理线程
  53. typedef struct __TCP_THREAD_STRUCT
  54. {
  55. int nTcpTheadIndex;
  56. CString strUid;
  57. }TcpThreadStruct;
  58. INT g_nTcpThreadStructIndex = 0;
  59. TcpThreadStruct g_tcpThreadStruct[MAX_TCP_THREAD];
  60. DWORD WINAPI RequestDataThreadProc(void *pPara);
  61. DWORD WINAPI ReConnectCommThreadProc(void *Para);
  62. DWORD WINAPI TimingSendSmsThread(void *pPara);
  63. DWORD WINAPI DevOnlineThreadProc(void *pPara);
  64. DWORD WINAPI VoiceNoticeThreadProc(void *pPara);
  65. DWORD WINAPI OutputThreadProc(void *pPara);
  66. DWORD WINAPI GetDatePlanThreadProc(void *pPara);
  67. // 获取实际波特率
  68. INT GetCommRate(int nRate);
  69. // 获取实际数据位
  70. INT GetCommDataBit(int nDataBitIndex);
  71. BOOL FindRtuCommPort(CString strPort);
  72. BOOL FindAscCommPort(CString strPort);
  73. BOOL FindTcpCommPort(CString strPort);
  74. BOOL FindMostDeviceCommPort(CString strPort);
  75. BOOL FindIcpdasCommPort(CString strPort);
  76. BOOL FindParadigmCommPort(CString strPort);
  77. BOOL FindStulzCommPort(CString strPort);
  78. BOOL FindDaiKinCommPort(CString strPort);
  79. BOOL FindPowerwareCommPort(CString strPort);
  80. BOOL FindGreeCommPort(CString strPort);
  81. BOOL FindCarelCommPort(CString strPort);
  82. BOOL FindScanTakCommPort(CString strPort);
  83. BOOL FindDeltaCommPort(CString strPort);
  84. INT StartMain()
  85. {
  86. //INT iCount = GetDevProperty();
  87. for( int i = 0; i < MAX_TCP_THREAD; i++ )
  88. {
  89. // g_tcpThreadStruct存放TCP线程索引和设备uid;
  90. g_tcpThreadStruct[i].nTcpTheadIndex = 0;
  91. g_tcpThreadStruct[i].strUid = "";
  92. }
  93. CDBInterface::GetInstancePtr()->GetDevInfo();
  94. InitializeCriticalSection( &g_csDevOnlineReadOneData );
  95. LoadAscDLL(g_strDirectory);
  96. LoadRtuDll(g_strDirectory);
  97. LoadTcpDll(g_strDirectory);
  98. LoadIcpdasDll(g_strDirectory);
  99. LoadSnmpDll(g_strDirectory);
  100. LoadParadigmDll(g_strDirectory);
  101. LoadStulzDll(g_strDirectory);
  102. LoadDaiKinDll(g_strDirectory);
  103. LoadPowerwareDll(g_strDirectory);
  104. LoadGreeDll(g_strDirectory);
  105. LoadCarelDll(g_strDirectory);
  106. LoadSeparateDll(g_strDirectory);
  107. LoadMostDeviceDll(g_strDirectory);
  108. int iSize = (int)g_pDevicesManager->m_Devices.GetSize();
  109. int iVarCount = 0;
  110. #if IS_USER_MUL_THREAD_REQUEST
  111. int nDllType[MAX_DLL_TYPE] = {0};
  112. for( int i = 0; i < MAX_DLL_TYPE; i++ )
  113. {
  114. nDllType[i] = 0;
  115. g_hRequestDataThread[i] = NULL;
  116. g_strPort[i] = "";
  117. }
  118. #endif
  119. int nBaudRate, nDataBit;
  120. for( int i = 0; i < iSize; i++ )
  121. {
  122. CDevice *pDev = g_pDevicesManager->m_Devices[i];
  123. char chDllName[MAX_PATH] = {0};
  124. char szIniName[MAX_PATH] = {0};
  125. strcpy(chDllName, (char *)(LPCTSTR)pDev->m_strProtocoldllname);
  126. strcpy(szIniName, (char *)(LPCTSTR)pDev->m_strIniName);
  127. StrLower(chDllName,chDllName);
  128. StrLower(szIniName, szIniName);
  129. //LOG4C((LOG_NOTICE, "Devive = %s, IniName = %s", pDev->m_strDeviceName, szIniName));
  130. nBaudRate = GetCommRate( pDev->m_iBaudrate );
  131. nDataBit = GetCommDataBit( pDev->m_iDatabit );
  132. iVarCount += pDev->m_Vars.GetSize();
  133. if( pDev->m_bySpecialdevice == 0 )
  134. {
  135. if (!InitRtuComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  136. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  137. {
  138. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  139. pDev->m_bCommStatus = FALSE;
  140. }
  141. else
  142. {
  143. pDev->m_bCommStatus = TRUE;
  144. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  145. }
  146. if( pDev->m_Vars.GetSize() >= 1 )
  147. {
  148. DWORD dwThreadId;
  149. CString strPort;
  150. strPort.Format("%d", pDev->m_iPort);
  151. if( FALSE == FindRtuCommPort(strPort) )
  152. {
  153. g_strPort[g_nRtuThreadIndex] = strPort;
  154. if( g_hRequestDataThread[g_nRtuThreadIndex] == NULL )
  155. {
  156. MTVERIFY( g_hRequestDataThread[g_nRtuThreadIndex] =
  157. CreateThread(
  158. NULL,
  159. 0,
  160. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  161. (char *)(LPCTSTR)g_strPort[g_nRtuThreadIndex],
  162. 0,
  163. &dwThreadId) );
  164. g_nRtuThreadIndex++;
  165. }
  166. }
  167. }
  168. }
  169. else if( pDev->m_bySpecialdevice == 1 )
  170. {
  171. if (!InitAscComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  172. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  173. {
  174. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  175. pDev->m_bCommStatus = FALSE;
  176. }
  177. else
  178. {
  179. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  180. pDev->m_bCommStatus = TRUE;
  181. }
  182. if( pDev->m_Vars.GetSize() >= 1 )
  183. {
  184. CString strPort;
  185. strPort.Format("%d", pDev->m_iPort);
  186. if( FALSE == FindAscCommPort(strPort) )
  187. {
  188. g_strPort[g_nAscThreadIndex].Format("%d", pDev->m_iPort);
  189. DWORD dwThreadId;
  190. MTVERIFY( g_hRequestDataThread[g_nAscThreadIndex] =
  191. CreateThread(
  192. NULL,
  193. 0,
  194. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  195. (char *)(LPCTSTR)g_strPort[g_nAscThreadIndex],
  196. 0,
  197. &dwThreadId) );
  198. g_nAscThreadIndex++;
  199. }
  200. }
  201. }
  202. else if( pDev->m_bySpecialdevice == 2 )
  203. {
  204. if (!InitTcpNet(pDev->m_iDevideaddr, pDev->m_iIpport, (char *)(LPCTSTR)pDev->m_strIp))
  205. {
  206. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  207. pDev->m_bCommStatus = FALSE;
  208. }
  209. else
  210. {
  211. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  212. pDev->m_bCommStatus = TRUE;
  213. }
  214. if( pDev->m_Vars.GetSize() >= 1 )
  215. {
  216. DWORD dwThreadId;
  217. MTVERIFY( g_hRequestDataThread[g_nTcpThreadIndex] =
  218. CreateThread(
  219. NULL,
  220. 0,
  221. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  222. (char *)(LPCTSTR)pDev->m_strUid,
  223. 0,
  224. &dwThreadId) );
  225. g_tcpThreadStruct[g_nTcpThreadStructIndex].nTcpTheadIndex = g_nTcpThreadIndex;
  226. g_tcpThreadStruct[g_nTcpThreadStructIndex].strUid = pDev->m_strUid;
  227. g_nTcpThreadStructIndex++;
  228. g_nTcpThreadIndex++;
  229. }
  230. }
  231. else if( pDev->m_bySpecialdevice == 3 )
  232. {
  233. int iPingResult = 0;
  234. // ping 10 次,如果都是timeout, 认为设备已断线
  235. for( int iPingIndex = 0; iPingIndex < 10; iPingIndex++ )
  236. {
  237. if( Ping(2000, pDev->m_strIp) == 0 )
  238. {
  239. iPingResult = 0;
  240. break;
  241. }
  242. else
  243. {
  244. iPingResult = 1;
  245. }
  246. }
  247. if( 1 == iPingResult ) // 设备已断线
  248. {
  249. pDev->m_bCommStatus = FALSE;
  250. }
  251. else
  252. {
  253. pDev->m_bCommStatus = TRUE;
  254. }
  255. if( pDev->m_Vars.GetSize() >= 1 )
  256. {
  257. DWORD dwThreadId;
  258. MTVERIFY( g_hRequestDataThread[g_nSnmpThreadIndex] =
  259. CreateThread(
  260. NULL,
  261. 0,
  262. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  263. (char *)(LPCTSTR)pDev->m_strUid,
  264. 0,
  265. &dwThreadId) );
  266. g_nSnmpThreadIndex++;
  267. }
  268. }
  269. else if( pDev->m_bySpecialdevice == 4 )
  270. {
  271. if ( strcmp(chDllName, "icpdas.dll") == 0 )
  272. {
  273. if (!InitIcpdasComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  274. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  275. {
  276. LOG4C((LOG_NOTICE, "device name:%s, port:%d, addr=%d, baudrate=%d, databit=%d, stopbit=%d, paritybit=%d open com lost!",
  277. pDev->m_strDeviceName, pDev->m_iPort, pDev->m_iDevideaddr, nBaudRate, nDataBit, pDev->m_iStopbit, pDev->m_iParitybit));
  278. pDev->m_bCommStatus = FALSE;
  279. }
  280. else
  281. {
  282. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  283. pDev->m_bCommStatus = TRUE;
  284. }
  285. CString strPort;
  286. strPort.Format("%d", pDev->m_iPort);
  287. if( FALSE == FindIcpdasCommPort(strPort) )
  288. {
  289. g_strPort[g_nIcpdasIndex].Format("%d", pDev->m_iPort);
  290. if( pDev->m_Vars.GetSize() >= 1 )
  291. {
  292. //LOG4C((LOG_NOTICE, "create thread by hg module port = com%s", g_strPort[g_nIcpdasIndex] ));
  293. DWORD dwThreadId;
  294. MTVERIFY( g_hRequestDataThread[g_nIcpdasIndex] =
  295. CreateThread(
  296. NULL,
  297. 0,
  298. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  299. (char *)(LPCTSTR)g_strPort[g_nIcpdasIndex],
  300. 0,
  301. &dwThreadId) );
  302. g_nIcpdasIndex++;
  303. }
  304. }
  305. }
  306. else if ( strcmp(chDllName, "upsparadigm.dll") == 0 )
  307. {
  308. if (!InitParadigmComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  309. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  310. {
  311. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  312. pDev->m_bCommStatus = FALSE;
  313. }
  314. else
  315. {
  316. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  317. pDev->m_bCommStatus = TRUE;
  318. }
  319. CString strPort;
  320. strPort.Format("%d", pDev->m_iPort);
  321. if( FALSE == FindParadigmCommPort(strPort) )
  322. {
  323. g_strPort[g_nParadigmIndex].Format("%d", pDev->m_iPort);
  324. if( pDev->m_Vars.GetSize() >= 1 )
  325. {
  326. DWORD dwThreadId;
  327. MTVERIFY( g_hRequestDataThread[g_nParadigmIndex] =
  328. CreateThread(
  329. NULL,
  330. 0,
  331. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  332. (char *)(LPCTSTR)g_strPort[g_nParadigmIndex],
  333. 0,
  334. &dwThreadId) );
  335. g_nParadigmIndex++;
  336. }
  337. }
  338. }
  339. else if ( strcmp(chDllName, "stulz.dll") == 0 )
  340. {
  341. if (!InitStulzComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  342. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  343. {
  344. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  345. pDev->m_bCommStatus = FALSE;
  346. }
  347. else
  348. {
  349. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  350. pDev->m_bCommStatus = TRUE;
  351. }
  352. CString strPort;
  353. strPort.Format("%d", pDev->m_iPort);
  354. if( FALSE == FindStulzCommPort(strPort) )
  355. {
  356. g_strPort[g_nStulzIndex].Format("%d", pDev->m_iPort);
  357. if( pDev->m_Vars.GetSize() >= 1 )
  358. {
  359. DWORD dwThreadId;
  360. MTVERIFY( g_hRequestDataThread[g_nStulzIndex] =
  361. CreateThread(
  362. NULL,
  363. 0,
  364. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  365. (char *)(LPCTSTR)g_strPort[g_nStulzIndex],
  366. 0,
  367. &dwThreadId) );
  368. g_nStulzIndex++;
  369. }
  370. }
  371. }
  372. else if ( strcmp(chDllName, "daikin.dll") == 0 )
  373. {
  374. if( !InitDaiKinComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  375. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000) )
  376. {
  377. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  378. pDev->m_bCommStatus = FALSE;
  379. }
  380. else
  381. {
  382. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  383. pDev->m_bCommStatus = TRUE;
  384. }
  385. CString strPort;
  386. strPort.Format("%d", pDev->m_iPort);
  387. if( FALSE == FindDaiKinCommPort(strPort) )
  388. {
  389. g_strPort[g_nDaiKinIndex].Format("%d", pDev->m_iPort);
  390. if( pDev->m_Vars.GetSize() >= 1 )
  391. {
  392. DWORD dwThreadId;
  393. MTVERIFY( g_hRequestDataThread[g_nDaiKinIndex] =
  394. CreateThread(
  395. NULL,
  396. 0,
  397. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  398. (char *)(LPCTSTR)g_strPort[g_nDaiKinIndex],
  399. 0,
  400. &dwThreadId) );
  401. g_nDaiKinIndex++;
  402. }
  403. }
  404. }
  405. else if ( strcmp(chDllName, "powerware.dll") == 0 )
  406. {
  407. if( !InitPowerwareComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  408. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000) )
  409. {
  410. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  411. pDev->m_bCommStatus = FALSE;
  412. }
  413. else
  414. {
  415. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  416. pDev->m_bCommStatus = TRUE;
  417. }
  418. CString strPort;
  419. strPort.Format("%d", pDev->m_iPort);
  420. if( FALSE == FindPowerwareCommPort(strPort) )
  421. {
  422. g_strPort[g_nPowerwareIndex].Format("%d", pDev->m_iPort);
  423. if( pDev->m_Vars.GetSize() >= 1 )
  424. {
  425. DWORD dwThreadId;
  426. MTVERIFY( g_hRequestDataThread[g_nPowerwareIndex] =
  427. CreateThread(
  428. NULL,
  429. 0,
  430. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  431. (char *)(LPCTSTR)g_strPort[g_nPowerwareIndex],
  432. 0,
  433. &dwThreadId) );
  434. g_nPowerwareIndex++;
  435. }
  436. }
  437. }
  438. else if ( strcmp(chDllName, "gree.dll") == 0 )
  439. {
  440. if (!InitGreeComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  441. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  442. {
  443. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  444. pDev->m_bCommStatus = FALSE;
  445. }
  446. else
  447. {
  448. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  449. pDev->m_bCommStatus = TRUE;
  450. }
  451. CString strPort;
  452. strPort.Format("%d", pDev->m_iPort);
  453. if( FALSE == FindGreeCommPort(strPort) )
  454. {
  455. g_strPort[g_nGreeIndex].Format("%d", pDev->m_iPort);
  456. if( pDev->m_Vars.GetSize() >= 1 )
  457. {
  458. DWORD dwThreadId;
  459. MTVERIFY( g_hRequestDataThread[g_nGreeIndex] =
  460. CreateThread(
  461. NULL,
  462. 0,
  463. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  464. (char *)(LPCTSTR)g_strPort[g_nGreeIndex],
  465. 0,
  466. &dwThreadId) );
  467. g_nGreeIndex++;
  468. }
  469. }
  470. }
  471. else if ( strcmp(chDllName, "carel.dll") == 0 )
  472. {
  473. if (!InitCarelComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  474. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  475. {
  476. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  477. pDev->m_bCommStatus = FALSE;
  478. }
  479. else
  480. {
  481. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  482. pDev->m_bCommStatus = TRUE;
  483. }
  484. CString strPort;
  485. strPort.Format("%d", pDev->m_iPort);
  486. if( FALSE == FindCarelCommPort(strPort) )
  487. {
  488. g_strPort[g_nCarelIndex].Format("%d", pDev->m_iPort);
  489. if( pDev->m_Vars.GetSize() >= 1 )
  490. {
  491. DWORD dwThreadId;
  492. MTVERIFY( g_hRequestDataThread[g_nCarelIndex] =
  493. CreateThread(
  494. NULL,
  495. 0,
  496. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  497. (char *)(LPCTSTR)g_strPort[g_nCarelIndex],
  498. 0,
  499. &dwThreadId) );
  500. g_nCarelIndex++;
  501. }
  502. }
  503. }
  504. else if( strcmp( chDllName, "scantak_3c.dll" ) == 0 )
  505. {
  506. if (!InitSeparateComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  507. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  508. {
  509. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  510. pDev->m_bCommStatus = FALSE;
  511. }
  512. else
  513. {
  514. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  515. pDev->m_bCommStatus = TRUE;
  516. }
  517. CString strPort;
  518. strPort.Format("%d", pDev->m_iPort);
  519. if( FALSE == FindScanTakCommPort(strPort) )
  520. {
  521. g_strPort[g_nScantakIndex].Format("%d", pDev->m_iPort);
  522. if( pDev->m_Vars.GetSize() >= 1 )
  523. {
  524. DWORD dwThreadId;
  525. MTVERIFY( g_hRequestDataThread[g_nScantakIndex] =
  526. CreateThread(
  527. NULL,
  528. 0,
  529. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  530. (char *)(LPCTSTR)g_strPort[g_nScantakIndex],
  531. 0,
  532. &dwThreadId) );
  533. g_nScantakIndex++;
  534. }
  535. }
  536. }
  537. else if( strcmp( chDllName, "delta.dll" ) == 0 )
  538. {
  539. if (!InitSeparateComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  540. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  541. {
  542. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  543. pDev->m_bCommStatus = FALSE;
  544. }
  545. else
  546. {
  547. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  548. pDev->m_bCommStatus = TRUE;
  549. }
  550. CString strPort;
  551. strPort.Format("%d", pDev->m_iPort);
  552. if( FALSE == FindDeltaCommPort(strPort) )
  553. {
  554. g_strPort[g_nDeltaIndex].Format("%d", pDev->m_iPort);
  555. if( pDev->m_Vars.GetSize() >= 1 )
  556. {
  557. DWORD dwThreadId;
  558. MTVERIFY( g_hRequestDataThread[g_nDeltaIndex] =
  559. CreateThread(
  560. NULL,
  561. 0,
  562. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  563. (char *)(LPCTSTR)g_strPort[g_nDeltaIndex],
  564. 0,
  565. &dwThreadId) );
  566. g_nDeltaIndex++;
  567. }
  568. }
  569. }
  570. else if ( strcmp(szIniName, "upsuh31.ini") == 0 ||
  571. strcmp(szIniName, "emerson_cm.ini") == 0 ||
  572. strcmp(szIniName, "dme3000.ini") == 0 ||
  573. strcmp(szIniName, "paradigm200a_rectifier.ini") == 0 ||
  574. strcmp(szIniName, "paradigm200a_inverter.ini") == 0 ||
  575. strcmp(szIniName, "paradigm200b.ini") == 0 ||
  576. strcmp(szIniName, "hipulseigmnet.ini") == 0 ||
  577. strcmp(szIniName, "hipulsecdt.ini") == 0 ||
  578. strcmp(szIniName, "prostar.ini") == 0 ||
  579. strcmp(szIniName, "joton.ini") == 0 ||
  580. strcmp(szIniName, "hiross.ini") == 0 ||
  581. strcmp(szIniName, "upslink.ini") == 0 ||
  582. strcmp(szIniName, "upsapcsilcon.ini") == 0 ||
  583. strcmp(szIniName, "ul33.ini") == 0 ||
  584. strcmp(szIniName, "hipulse_u.ini") == 0 ||
  585. strcmp(szIniName, "kehua.ini") == 0 ||
  586. strcmp(szIniName, "secups.ini") == 0 ||
  587. strcmp(szIniName, "upsuh11.ini") == 0 ||
  588. strcmp(szIniName, "weibo.ini") == 0 ||
  589. strcmp(szIniName, "sda_ii.ini") == 0 ||
  590. strcmp(szIniName, "daikin.ini") == 0 ||
  591. strcmp(szIniName, "scantak_3c.ini") == 0 ||
  592. strcmp(szIniName, "delta.ini") == 0 ||
  593. strcmp(szIniName, "m84c5z.ini") == 0 ||
  594. strcmp(szIniName, "upsnxr.ini") == 0 ||
  595. strcmp(szIniName, "batteryadu.ini") == 0 ||
  596. strcmp(szIniName, "upsmonitorlan.ini") == 0 ||
  597. strcmp(szIniName, "sk6000.ini") == 0 ||
  598. strcmp(szIniName, "batteryadu2000.ini") == 0 ||
  599. strcmp(szIniName, "santak_shiwei.ini") == 0 ||
  600. strcmp(szIniName, "santak_q4.ini") == 0 ||
  601. strcmp(szIniName, "ups_nxl.ini") == 0 ||
  602. strcmp(szIniName, "twoul33.ini") == 0 ||
  603. strcmp(szIniName, "oumai.ini") == 0 ||
  604. strcmp(szIniName, "santak_3a3120ks.ini") == 0 ||
  605. strcmp(szIniName, "tmaster.ini") == 0 )
  606. {
  607. //LOG4C((LOG_NOTICE, "Enter InitMostDeviceComm szIniName = %s", szIniName));
  608. if (!InitMostDeviceComm(g_strDirectory, szIniName, pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  609. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  610. {
  611. LOG4C((LOG_NOTICE, "device name:%s open com%d lost!", pDev->m_strDeviceName,pDev->m_iPort));
  612. pDev->m_bCommStatus = FALSE;
  613. }
  614. else
  615. {
  616. LOG4C((LOG_NOTICE, "device name:%s open com%d success!", pDev->m_strDeviceName,pDev->m_iPort));
  617. pDev->m_bCommStatus = TRUE;
  618. }
  619. //LOG4C((LOG_NOTICE, "Leave InitMostDeviceComm szIniName = %s", szIniName));
  620. CString strPort;
  621. strPort.Format("%d", pDev->m_iPort);
  622. if( FALSE == FindMostDeviceCommPort(strPort) )
  623. {
  624. g_strPort[g_nMostDeviceIndex].Format("%d", pDev->m_iPort);
  625. if( pDev->m_Vars.GetSize() >= 1 )
  626. {
  627. DWORD dwThreadId;
  628. MTVERIFY( g_hRequestDataThread[g_nMostDeviceIndex] =
  629. CreateThread(
  630. NULL,
  631. 0,
  632. (LPTHREAD_START_ROUTINE)RequestDataThreadProc,
  633. (char *)(LPCTSTR)g_strPort[g_nMostDeviceIndex],
  634. 0,
  635. &dwThreadId) );
  636. g_nMostDeviceIndex++;
  637. }
  638. }
  639. }
  640. else if ( 0 == strcmp(szIniName, "stu2000.dll") )
  641. {
  642. }
  643. }
  644. }
  645. LOG4C((LOG_NOTICE, "iVarCount = %d", iVarCount));
  646. // 每MAX_SINGLE_TCP_VAR_NUM个变量,建立一个监听端口
  647. #if 0
  648. int nSocketIndex = 1;
  649. if( iVarCount > MAX_SINGLE_TCP_VAR_NUM )
  650. {
  651. while( iVarCount / (nSocketIndex * MAX_SINGLE_TCP_VAR_NUM) != 0 )
  652. {
  653. if( NULL == g_pServerSocket[nSocketIndex] )
  654. {
  655. g_pServerSocket[nSocketIndex] = new CServerSocket();
  656. CString strPort;
  657. strPort.Format("%d", SOCKET_SERVER_PORT + nSocketIndex);
  658. LOG4C((LOG_NOTICE, "Create Port %s success", strPort));
  659. g_pServerSocket[nSocketIndex]->SvrStart(strPort);
  660. nSocketIndex++;
  661. }
  662. }
  663. }
  664. #else
  665. int nSocketIndex = 1;
  666. if( NULL == g_pServerSocket[nSocketIndex] )
  667. {
  668. g_pServerSocket[nSocketIndex] = new CServerSocket();
  669. CString strPort;
  670. strPort.Format("%d", SOCKET_SERVER_PORT + nSocketIndex);
  671. LOG4C((LOG_NOTICE, "Create Port %s success", strPort));
  672. g_pServerSocket[nSocketIndex]->SvrStart(strPort);
  673. }
  674. #endif
  675. if( g_hDevOnlineThread == NULL )
  676. {
  677. DWORD dwThreadId;
  678. MTVERIFY( g_hDevOnlineThread =
  679. CreateThread(
  680. NULL,
  681. 0,
  682. (LPTHREAD_START_ROUTINE)DevOnlineThreadProc,
  683. 0,
  684. 0,
  685. &dwThreadId) );
  686. }
  687. if( g_hReConnectCommThread == NULL )
  688. {
  689. DWORD dwThreadId;
  690. MTVERIFY( g_hReConnectCommThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReConnectCommThreadProc, NULL, 0, &dwThreadId) );
  691. }
  692. if( g_hTimingSendSmsThread == NULL )
  693. {
  694. DWORD dwThreadId;
  695. if( g_nSendSms==1 || g_nSendNotice==1 )
  696. {
  697. MTVERIFY( g_hTimingSendSmsThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TimingSendSmsThread, NULL, 0, &dwThreadId) );
  698. }
  699. }
  700. if( g_hVoiceNoticeThread == NULL )
  701. {
  702. DWORD dwThreadId;
  703. MTVERIFY( g_hVoiceNoticeThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)VoiceNoticeThreadProc, NULL, 0, &dwThreadId) );
  704. }
  705. if( g_hOutputThread == NULL )
  706. {
  707. if( 1 == g_nOutputEnable )
  708. {
  709. DWORD dwThreadId;
  710. MTVERIFY( g_hOutputThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)OutputThreadProc, NULL, 0, &dwThreadId) );
  711. }
  712. }
  713. if( g_hGetDatePlanThread == NULL )
  714. {
  715. DWORD dwThreadId;
  716. MTVERIFY( g_hGetDatePlanThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)GetDatePlanThreadProc, NULL, 0, &dwThreadId) );
  717. }
  718. return 0;
  719. }
  720. void EndMain()
  721. {
  722. #if IS_USER_MUL_THREAD_REQUEST
  723. for( int i = 0; i < MAX_DLL_TYPE; i++ )
  724. {
  725. if (NULL != g_hRequestDataThread[i])
  726. {
  727. MTVERIFY( WaitForSingleObject( g_hRequestDataThread[i], INFINITE ) != WAIT_FAILED );
  728. MTVERIFY( CloseHandle( g_hRequestDataThread[i] ) );
  729. g_hRequestDataThread[i] = NULL;
  730. }
  731. }
  732. #else
  733. if (NULL != g_hRequestDataThread)
  734. {
  735. MTVERIFY( WaitForSingleObject( g_hRequestDataThread, INFINITE ) != WAIT_FAILED );
  736. MTVERIFY( CloseHandle( g_hRequestDataThread ) );
  737. g_hRequestDataThread = NULL;
  738. }
  739. #endif
  740. if( NULL != g_hDevOnlineThread )
  741. {
  742. MTVERIFY( WaitForSingleObject( g_hDevOnlineThread, INFINITE ) != WAIT_FAILED );
  743. MTVERIFY( CloseHandle( g_hDevOnlineThread ) );
  744. g_hDevOnlineThread = NULL;
  745. }
  746. if( NULL != g_hReConnectCommThread )
  747. {
  748. MTVERIFY( WaitForSingleObject( g_hReConnectCommThread, INFINITE ) != WAIT_FAILED );
  749. MTVERIFY( CloseHandle( g_hReConnectCommThread ) );
  750. g_hReConnectCommThread = NULL;
  751. }
  752. if( g_hTimingSendSmsThread != NULL )
  753. {
  754. MTVERIFY( WaitForSingleObject( g_hTimingSendSmsThread, INFINITE ) != WAIT_FAILED );
  755. MTVERIFY( CloseHandle( g_hTimingSendSmsThread ) );
  756. g_hTimingSendSmsThread = NULL;
  757. }
  758. if( g_hVoiceNoticeThread != NULL )
  759. {
  760. MTVERIFY( WaitForSingleObject( g_hVoiceNoticeThread, INFINITE ) != WAIT_FAILED );
  761. MTVERIFY( CloseHandle( g_hVoiceNoticeThread ) );
  762. g_hVoiceNoticeThread = NULL;
  763. }
  764. if( 1 == g_nOutputEnable )
  765. {
  766. if( NULL != g_hOutputThread )
  767. {
  768. MTVERIFY( WaitForSingleObject( g_hOutputThread, INFINITE ) != WAIT_FAILED );
  769. MTVERIFY( CloseHandle( g_hOutputThread ) );
  770. g_hOutputThread = NULL;
  771. }
  772. }
  773. if( NULL != g_hGetDatePlanThread )
  774. {
  775. MTVERIFY( WaitForSingleObject( g_hGetDatePlanThread, INFINITE ) != WAIT_FAILED );
  776. MTVERIFY( CloseHandle( g_hGetDatePlanThread ) );
  777. g_hGetDatePlanThread = NULL;
  778. }
  779. DeleteCriticalSection( &g_csDevOnlineReadOneData );
  780. }
  781. // 各种协议的重连线程;
  782. //
  783. BOOL ModbusRtuReConnectProc(CDevice *pDev)
  784. {
  785. BOOL bResult = FALSE;
  786. char chMsg[80] = {0};
  787. SETBASEPARAM SetBasePara = {0};
  788. SetBasePara.nAddr = pDev->m_iDevideaddr;
  789. // 循环所有变量
  790. int nVarSize = pDev->m_Vars.GetSize();
  791. nVarSize = nVarSize<10 ? nVarSize : 10;
  792. for( int j = 0; j < nVarSize; j++ )
  793. {
  794. //if( j > 0 ) break;
  795. CBaseVar *pBaseVar = pDev->m_Vars[j];
  796. if( pBaseVar->m_bReadOnly == 1 ) continue;
  797. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  798. SetBasePara.nRegNum = pBaseVar->m_iRegisterNum;
  799. SetBasePara.nStartAddr = pBaseVar->m_nRegStartAddr;
  800. SetBasePara.FuncCode = pBaseVar->m_iFuncID;
  801. if( pBaseVar->m_nVarTypeID >= SPECIAL_VAR_TYPE_MIN_ID && pBaseVar->m_nVarTypeID <= SPECIAL_VAR_TYPE_MAX_ID ) // 特殊变量
  802. {
  803. if (RtuRequestSpecData(SetBasePara, pBaseVar->m_iDataLen, pDev->m_iPort, pDev->m_iDevideaddr,
  804. (char *)(LPCTSTR)pBaseVar->m_strVarUID, pBaseVar->m_nVarID, pBaseVar->m_nVarTypeID) == 0)
  805. {
  806. bResult = TRUE;
  807. break;
  808. }
  809. }
  810. else
  811. {
  812. if (pRTU_DLLInit(pDev->m_iPort, pDev->m_iDevideaddr, SetBasePara, pBaseVar->m_iDataLen, chMsg)==0)//初始化设备DLL
  813. {
  814. bResult = TRUE;
  815. break;
  816. }
  817. }
  818. }
  819. return bResult;
  820. }
  821. BOOL ModbusAscReConnectProc(CDevice *pDev)
  822. {
  823. BOOL bResult = FALSE;
  824. char chMsg[80] = {0};
  825. SETBASEPARAM SetBasePara = {0};
  826. SetBasePara.nAddr = pDev->m_iDevideaddr;
  827. // 循环所有变量
  828. int nVarSize = pDev->m_Vars.GetSize();
  829. nVarSize = nVarSize<10 ? nVarSize : 10;
  830. for( int j = 0; j < nVarSize; j++ )
  831. {
  832. //if( j > 0 ) break;
  833. CBaseVar *pBaseVar = pDev->m_Vars[j];
  834. if( pBaseVar->m_bReadOnly == 1 ) continue;
  835. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  836. SetBasePara.nRegNum = pBaseVar->m_iRegisterNum;
  837. SetBasePara.nStartAddr = pBaseVar->m_nRegStartAddr;
  838. SetBasePara.FuncCode = pBaseVar->m_iFuncID;
  839. if( pBaseVar->m_nVarTypeID >= SPECIAL_VAR_TYPE_MIN_ID && pBaseVar->m_nVarTypeID <= SPECIAL_VAR_TYPE_MAX_ID ) // 特殊变量
  840. {
  841. if (AscRequestSpecData((char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, pBaseVar->m_nVarTypeID) == 0)
  842. {
  843. bResult = TRUE;
  844. break;
  845. }
  846. }
  847. else
  848. {
  849. if(pASCDLLInit(pDev->m_iPort, pDev->m_iDevideaddr, SetBasePara, pBaseVar->m_iDataLen, chMsg)==0)//初始化设备DLL
  850. {
  851. bResult = TRUE;
  852. break;
  853. }
  854. }
  855. }
  856. return bResult;
  857. }
  858. BOOL SnmpReConnectProc(CDevice *pDev)
  859. {
  860. BOOL bResult = FALSE;
  861. char chMsg[80] = {0};
  862. // 循环所有变量
  863. int nVarSize = pDev->m_Vars.GetSize();
  864. nVarSize = nVarSize<10 ? nVarSize : 10;
  865. for( int j = 0; j < nVarSize; j++ )
  866. {
  867. //if( j > 0 ) break;
  868. CBaseVar *pBaseVar = pDev->m_Vars[j];
  869. if( pBaseVar->m_bReadOnly == 1 ) continue;
  870. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  871. if( pSnmpDllGetValue )
  872. {
  873. //TRACE("变量值id=%d\r\n", pBaseVar->m_nVarID);
  874. int nRet = pSnmpDllGetValue((char *)(LPCTSTR)pDev->m_strIp,
  875. (char *)(LPCTSTR)pBaseVar->m_strFields,
  876. (char *)(LPCTSTR)pBaseVar->m_strSnmpoi,
  877. chMsg);
  878. if( nRet == 0 )
  879. {
  880. bResult = TRUE;
  881. break;
  882. }
  883. }
  884. }
  885. return bResult;
  886. }
  887. BOOL IcpdasReConnectProc(CDevice *pDev)
  888. {
  889. BOOL bResult = FALSE;
  890. char chMsg[80] = {0};
  891. SETBASEPARAM SetBasePara = {0};
  892. SetBasePara.nAddr = pDev->m_iDevideaddr;
  893. // 循环所有变量
  894. int nVarSize = pDev->m_Vars.GetSize();
  895. nVarSize = nVarSize<10 ? nVarSize : 10;
  896. for( int j = 0; j < nVarSize; j++ )
  897. {
  898. //if( j > 0 ) break;
  899. CBaseVar *pBaseVar = pDev->m_Vars[j];
  900. if( pBaseVar->m_bReadOnly == 1 ) continue;
  901. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  902. SetBasePara.nRegNum = pBaseVar->m_iRegisterNum;
  903. SetBasePara.nStartAddr = pBaseVar->m_nRegStartAddr;
  904. SetBasePara.FuncCode = pBaseVar->m_iFuncID;
  905. if (IcpdasRequestData(j, SetBasePara, pBaseVar->m_iDataLen, pDev->m_iPort, pDev->m_iDevideaddr,
  906. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char *)(LPCTSTR)pBaseVar->m_strRs232cmd) == 0)
  907. {
  908. bResult = TRUE;
  909. break;
  910. }
  911. }
  912. return bResult;
  913. }
  914. BOOL ParadigmReConnectProc(CDevice *pDev)
  915. {
  916. BOOL bResult = FALSE;
  917. char chMsg[80] = {0};
  918. // 循环所有变量
  919. int nVarSize = pDev->m_Vars.GetSize();
  920. nVarSize = nVarSize<10 ? nVarSize : 10;
  921. for( int j = 0; j < nVarSize; j++ )
  922. {
  923. //if( j > 0 ) break;
  924. CBaseVar *pBaseVar = pDev->m_Vars[j];
  925. if( pBaseVar->m_bReadOnly == 1 ) continue;
  926. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  927. if (ParadigmRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  928. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char*)(LPCTSTR)pBaseVar->m_strRs232cmd) == 0)
  929. {
  930. bResult = TRUE;
  931. break;
  932. }
  933. }
  934. return bResult;
  935. }
  936. BOOL StulzReConnectProc(CDevice *pDev)
  937. {
  938. BOOL bResult = FALSE;
  939. char chMsg[80] = {0};
  940. SETBASEPARAM SetBasePara = {0};
  941. SetBasePara.nAddr = pDev->m_iDevideaddr;
  942. // 循环所有变量
  943. int nVarSize = pDev->m_Vars.GetSize();
  944. nVarSize = nVarSize<10 ? nVarSize : 10;
  945. for( int j = 0; j < nVarSize; j++ )
  946. {
  947. //if( j > 0 ) break;
  948. CBaseVar *pBaseVar = pDev->m_Vars[j];
  949. if( pBaseVar->m_bReadOnly == 1 ) continue;
  950. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  951. SetBasePara.nRegNum = pBaseVar->m_iRegisterNum;
  952. SetBasePara.nStartAddr = pBaseVar->m_nRegStartAddr;
  953. SetBasePara.FuncCode = pBaseVar->m_iFuncID;
  954. if (StulzRequestData(SetBasePara, pBaseVar->m_iDataLen, pDev->m_iPort, pDev->m_iDevideaddr,
  955. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char*)(LPCTSTR)pBaseVar->m_strRs232cmd) == 0)
  956. {
  957. bResult = TRUE;
  958. break;
  959. }
  960. }
  961. return bResult;
  962. }
  963. BOOL DaiKinReConnectProc(CDevice *pDev)
  964. {
  965. BOOL bResult = FALSE;
  966. char chMsg[80] = {0};
  967. // 循环所有变量
  968. int nVarSize = pDev->m_Vars.GetSize();
  969. nVarSize = nVarSize<10 ? nVarSize : 10;
  970. for( int j = 0; j < nVarSize; j++ )
  971. {
  972. //if( j > 0 ) break;
  973. CBaseVar *pBaseVar = pDev->m_Vars[j];
  974. if( pBaseVar->m_bReadOnly == 1 ) continue;
  975. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  976. if (DaiKinRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  977. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char*)(LPCTSTR)pBaseVar->m_strRs232cmd) == 0)
  978. {
  979. bResult = TRUE;
  980. break;
  981. }
  982. }
  983. return bResult;
  984. }
  985. BOOL PowerwareReConnectProc(CDevice *pDev)
  986. {
  987. BOOL bResult = FALSE;
  988. char chMsg[80] = {0};
  989. // 循环所有变量
  990. int nVarSize = pDev->m_Vars.GetSize();
  991. nVarSize = nVarSize<10 ? nVarSize : 10;
  992. for( int j = 0; j < nVarSize; j++ )
  993. {
  994. //if( j > 0 ) break;
  995. CBaseVar *pBaseVar = pDev->m_Vars[j];
  996. if( pBaseVar->m_bReadOnly == 1 ) continue;
  997. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  998. if (PowerwareRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  999. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char*)(LPCTSTR)pBaseVar->m_strRs232cmd) == 0)
  1000. {
  1001. bResult = TRUE;
  1002. break;
  1003. }
  1004. }
  1005. return bResult;
  1006. }
  1007. BOOL GreeReConnectProc(CDevice *pDev)
  1008. {
  1009. BOOL bResult = FALSE;
  1010. char chMsg[80] = {0};
  1011. SETBASEPARAM SetBasePara = {0};
  1012. SetBasePara.nAddr = pDev->m_iDevideaddr;
  1013. // 循环所有变量
  1014. int nVarSize = pDev->m_Vars.GetSize();
  1015. nVarSize = nVarSize<10 ? nVarSize : 10;
  1016. for( int j = 0; j < nVarSize; j++ )
  1017. {
  1018. //if( j > 0 ) break;
  1019. CBaseVar *pBaseVar = pDev->m_Vars[j];
  1020. if( pBaseVar->m_bReadOnly == 1 ) continue;
  1021. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  1022. SetBasePara.nRegNum = pBaseVar->m_iRegisterNum;
  1023. SetBasePara.nStartAddr = pBaseVar->m_nRegStartAddr;
  1024. SetBasePara.FuncCode = pBaseVar->m_iFuncID;
  1025. if (GreeRequestData(SetBasePara, pBaseVar->m_iDataLen, pDev->m_iPort, pDev->m_iDevideaddr,
  1026. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char*)(LPCTSTR)pBaseVar->m_strRs232cmd) == 0)
  1027. {
  1028. bResult = TRUE;
  1029. break;
  1030. }
  1031. }
  1032. return bResult;
  1033. }
  1034. BOOL CarelReConnectProc(CDevice *pDev)
  1035. {
  1036. BOOL bResult = FALSE;
  1037. char chMsg[80] = {0};
  1038. // 循环所有变量
  1039. int nVarSize = pDev->m_Vars.GetSize();
  1040. nVarSize = nVarSize<10 ? nVarSize : 10;
  1041. for( int j = 0; j < nVarSize; j++ )
  1042. {
  1043. //if( j > 0 ) break;
  1044. CBaseVar *pBaseVar = pDev->m_Vars[j];
  1045. if( pBaseVar->m_bReadOnly == 1 ) continue;
  1046. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  1047. if (CarelRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  1048. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID,
  1049. (char*)(LPCTSTR)pBaseVar->m_strRs232cmd) == 0)
  1050. {
  1051. bResult = TRUE;
  1052. break;
  1053. }
  1054. }
  1055. return bResult;
  1056. }
  1057. BOOL SeparateReConnectProc(CDevice *pDev)
  1058. {
  1059. BOOL bResult = FALSE;
  1060. char chMsg[80] = {0};
  1061. char szIniName[MAX_PATH] = {0};
  1062. strcpy(szIniName, (char *)(LPCTSTR)pDev->m_strIniName);
  1063. StrLower(szIniName, szIniName);
  1064. // 循环所有变量
  1065. int nVarSize = pDev->m_Vars.GetSize();
  1066. nVarSize = nVarSize<10 ? nVarSize : 10;
  1067. for( int j = 0; j < nVarSize; j++ )
  1068. {
  1069. //if( j > 0 ) break;
  1070. CBaseVar *pBaseVar = pDev->m_Vars[j];
  1071. if( pBaseVar->m_bReadOnly == 1 ) continue;
  1072. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  1073. if (SeparateRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  1074. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID,
  1075. (char*)(LPCTSTR)pBaseVar->m_strRs232cmd,
  1076. szIniName) == 0)
  1077. {
  1078. bResult = TRUE;
  1079. break;
  1080. }
  1081. }
  1082. return bResult;
  1083. }
  1084. BOOL MostDeviceReConnectProc(CDevice *pDev)
  1085. {
  1086. BOOL bResult = FALSE;
  1087. char chMsg[80] = {0};
  1088. char szIniName[MAX_PATH] = {0};
  1089. strcpy(szIniName, (char *)(LPCTSTR)pDev->m_strIniName);
  1090. StrLower(szIniName, szIniName);
  1091. // 循环所有变量
  1092. int nVarSize = pDev->m_Vars.GetSize();
  1093. nVarSize = nVarSize<10 ? nVarSize : 10;
  1094. for( int j = 0; j < nVarSize; j++ )
  1095. {
  1096. //if( j > 1 ) break;
  1097. CBaseVar *pBaseVar = pDev->m_Vars[j];
  1098. if( pBaseVar->m_bReadOnly == 1 ) continue;
  1099. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  1100. if (MostDeviceRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  1101. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID,
  1102. (char*)(LPCTSTR)pBaseVar->m_strRs232cmd,
  1103. szIniName) == 0)
  1104. {
  1105. bResult = TRUE;
  1106. break;
  1107. }
  1108. }
  1109. return bResult;
  1110. }
  1111. //
  1112. int GetTcpThreadStructIndex(CString strUid)
  1113. {
  1114. int nRet = -1;
  1115. for( int i = 0; i < MAX_TCP_THREAD; i++ )
  1116. {
  1117. if( g_tcpThreadStruct[i].strUid.Compare(strUid) == 0 )
  1118. {
  1119. nRet = i;
  1120. break;
  1121. }
  1122. }
  1123. return nRet;
  1124. }
  1125. DWORD WINAPI ReConnectCommThreadProc(void *Para)
  1126. {
  1127. do
  1128. {
  1129. int iSize = (int)g_pDevicesManager->m_Devices.GetSize();
  1130. int nBaudRate, nDataBit;
  1131. for( int i = 0; i < iSize; i++ )
  1132. {
  1133. CDevice *pDev = g_pDevicesManager->m_Devices[i];
  1134. char chDllName[MAX_PATH] = {0};
  1135. char szIniName[MAX_PATH] = {0};
  1136. strcpy(chDllName, (char *)(LPCTSTR)pDev->m_strProtocoldllname);
  1137. strcpy(szIniName, (char *)(LPCTSTR)pDev->m_strIniName);
  1138. StrLower(chDllName,chDllName);
  1139. StrLower(szIniName, szIniName);
  1140. nBaudRate = GetCommRate( pDev->m_iBaudrate );
  1141. nDataBit = GetCommDataBit( pDev->m_iDatabit );
  1142. if( pDev->m_bySpecialdevice == 0 )
  1143. {
  1144. if( pDev->m_bCommStatus == FALSE )
  1145. {
  1146. if (!InitRtuComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1147. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  1148. {
  1149. pDev->m_bCommStatus = FALSE;
  1150. }
  1151. else
  1152. {
  1153. EnterCriticalSection( &g_csRtuReadOneData );
  1154. pDev->m_bCommStatus = ModbusRtuReConnectProc(pDev);
  1155. if( pDev->m_bCommStatus == TRUE )
  1156. {
  1157. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1158. pDev->m_dwOnlineTick = GetTickCount();
  1159. }
  1160. LeaveCriticalSection( &g_csRtuReadOneData );
  1161. }
  1162. }
  1163. }
  1164. else if( pDev->m_bySpecialdevice == 1 )
  1165. {
  1166. if( pDev->m_bCommStatus == FALSE )
  1167. {
  1168. if (!InitAscComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1169. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  1170. {
  1171. pDev->m_bCommStatus = FALSE;
  1172. }
  1173. else
  1174. {
  1175. EnterCriticalSection( &g_csAscReadOneData );
  1176. pDev->m_bCommStatus = ModbusAscReConnectProc(pDev);
  1177. if( pDev->m_bCommStatus == TRUE )
  1178. {
  1179. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1180. pDev->m_dwOnlineTick = GetTickCount();
  1181. }
  1182. LeaveCriticalSection( &g_csAscReadOneData );
  1183. }
  1184. }
  1185. }
  1186. else if( pDev->m_bySpecialdevice == 2 )
  1187. {
  1188. if( pDev->m_bCommStatus == FALSE )
  1189. {
  1190. int iPingResult = 0;
  1191. // ping 10 次,如果都是timeout, 认为设备已断线
  1192. for( int iPingIndex = 0; iPingIndex < 10; iPingIndex++ )
  1193. {
  1194. if( Ping(2000, pDev->m_strIp) == 0 )
  1195. {
  1196. iPingResult = 0;
  1197. break;
  1198. }
  1199. else
  1200. {
  1201. iPingResult = 1;
  1202. }
  1203. }
  1204. if( 1 == iPingResult ) // 设备已断线
  1205. {
  1206. }
  1207. else
  1208. {
  1209. if (!InitTcpNet(pDev->m_iDevideaddr, pDev->m_iIpport, (char *)(LPCTSTR)pDev->m_strIp))
  1210. {
  1211. EnterCriticalSection( &g_csTcpReadOneData );
  1212. pDev->m_bCommStatus = FALSE;
  1213. LeaveCriticalSection( &g_csTcpReadOneData );
  1214. }
  1215. else
  1216. {
  1217. EnterCriticalSection( &g_csTcpReadOneData );
  1218. pDev->m_dwOnlineTick = GetTickCount();
  1219. pDev->m_bCommStatus = TRUE;
  1220. LeaveCriticalSection( &g_csTcpReadOneData );
  1221. int nIndex = GetTcpThreadStructIndex( pDev->m_strUid );
  1222. if( nIndex != -1 )
  1223. {
  1224. if( g_hRequestDataThread[ g_tcpThreadStruct[nIndex].nTcpTheadIndex ] != NULL )
  1225. {
  1226. ResumeThread( g_hRequestDataThread[ g_tcpThreadStruct[nIndex].nTcpTheadIndex ] );
  1227. }
  1228. }
  1229. }
  1230. }
  1231. }
  1232. }
  1233. else if( pDev->m_bySpecialdevice == 3 )
  1234. {
  1235. // 循环所有变量
  1236. if( pDev->m_bCommStatus == FALSE )
  1237. {
  1238. int iPingResult = 0;
  1239. // ping 10 次,如果都是timeout, 认为设备已断线
  1240. for( int iPingIndex = 0; iPingIndex < 10; iPingIndex++ )
  1241. {
  1242. if( Ping(2000, pDev->m_strIp) == 0 )
  1243. {
  1244. iPingResult = 0;
  1245. break;
  1246. }
  1247. else
  1248. {
  1249. iPingResult = 1;
  1250. }
  1251. }
  1252. if( 1 == iPingResult ) // 设备已断线
  1253. {
  1254. }
  1255. else
  1256. {
  1257. EnterCriticalSection( &g_csIcpdasReadOneData );
  1258. pDev->m_dwOnlineTick = GetTickCount();
  1259. pDev->m_bCommStatus = TRUE;
  1260. LeaveCriticalSection( &g_csIcpdasReadOneData );
  1261. }
  1262. }
  1263. }
  1264. else if( pDev->m_bySpecialdevice == 4 )
  1265. {
  1266. if ( strcmp(chDllName, "icpdas.dll") == 0 )
  1267. {
  1268. if( pDev->m_bCommStatus == FALSE )
  1269. {
  1270. if (!InitIcpdasComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1271. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  1272. {
  1273. pDev->m_bCommStatus = FALSE;
  1274. }
  1275. else
  1276. {
  1277. EnterCriticalSection( &g_csIcpdasReadOneData );
  1278. pDev->m_bCommStatus = IcpdasReConnectProc(pDev);
  1279. if( pDev->m_bCommStatus == TRUE )
  1280. {
  1281. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1282. pDev->m_dwOnlineTick = GetTickCount();
  1283. }
  1284. LeaveCriticalSection( &g_csIcpdasReadOneData );
  1285. }
  1286. }
  1287. }
  1288. else if ( strcmp(chDllName, "upsparadigm.dll") == 0 )
  1289. {
  1290. if( pDev->m_bCommStatus == FALSE )
  1291. {
  1292. if (!InitParadigmComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1293. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  1294. {
  1295. pDev->m_bCommStatus = FALSE;
  1296. }
  1297. else
  1298. {
  1299. EnterCriticalSection( &g_csParadigmReadOneData );
  1300. pDev->m_bCommStatus = ParadigmReConnectProc(pDev);
  1301. if( pDev->m_bCommStatus == TRUE )
  1302. {
  1303. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1304. pDev->m_dwOnlineTick = GetTickCount();
  1305. }
  1306. LeaveCriticalSection( &g_csParadigmReadOneData );
  1307. }
  1308. }
  1309. }
  1310. else if ( strcmp(chDllName, "stulz.dll") == 0 )
  1311. {
  1312. if( pDev->m_bCommStatus == FALSE )
  1313. {
  1314. if (!InitStulzComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1315. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  1316. {
  1317. pDev->m_bCommStatus = FALSE;
  1318. }
  1319. else
  1320. {
  1321. EnterCriticalSection( &g_csStulzReadOneData );
  1322. pDev->m_bCommStatus = StulzReConnectProc(pDev);
  1323. if( pDev->m_bCommStatus == TRUE )
  1324. {
  1325. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1326. pDev->m_dwOnlineTick = GetTickCount();
  1327. }
  1328. LeaveCriticalSection( &g_csStulzReadOneData );
  1329. }
  1330. }
  1331. }
  1332. else if ( strcmp(chDllName, "daikin.dll") == 0 )
  1333. {
  1334. if( pDev->m_bCommStatus == FALSE )
  1335. {
  1336. if( !InitDaiKinComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1337. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000) )
  1338. {
  1339. pDev->m_bCommStatus = FALSE;
  1340. }
  1341. else
  1342. {
  1343. EnterCriticalSection( &g_csDaiKinReadOneData );
  1344. pDev->m_bCommStatus = DaiKinReConnectProc(pDev);
  1345. if( pDev->m_bCommStatus == TRUE )
  1346. {
  1347. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1348. pDev->m_dwOnlineTick = GetTickCount();
  1349. }
  1350. LeaveCriticalSection( &g_csDaiKinReadOneData );
  1351. }
  1352. }
  1353. }
  1354. else if ( strcmp(chDllName, "powerware.dll") == 0 )
  1355. {
  1356. if( pDev->m_bCommStatus == FALSE )
  1357. {
  1358. if( !InitPowerwareComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1359. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000) )
  1360. {
  1361. pDev->m_bCommStatus = FALSE;
  1362. }
  1363. else
  1364. {
  1365. EnterCriticalSection( &g_csPowerwareReadOneData );
  1366. pDev->m_bCommStatus = PowerwareReConnectProc(pDev);
  1367. if( pDev->m_bCommStatus == TRUE )
  1368. {
  1369. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1370. pDev->m_dwOnlineTick = GetTickCount();
  1371. }
  1372. LeaveCriticalSection( &g_csPowerwareReadOneData );
  1373. }
  1374. }
  1375. }
  1376. else if ( strcmp(chDllName, "gree.dll") == 0 )
  1377. {
  1378. if (pDev->m_bCommStatus == FALSE)
  1379. {
  1380. if (!InitGreeComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1381. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  1382. {
  1383. pDev->m_bCommStatus = FALSE;
  1384. }
  1385. else
  1386. {
  1387. EnterCriticalSection(&g_csGreeReadOneData);
  1388. pDev->m_bCommStatus = GreeReConnectProc(pDev);
  1389. if( pDev->m_bCommStatus == TRUE )
  1390. {
  1391. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1392. pDev->m_dwOnlineTick = GetTickCount();
  1393. }
  1394. LeaveCriticalSection(&g_csGreeReadOneData);
  1395. }
  1396. }
  1397. }
  1398. else if ( strcmp(chDllName, "carel.dll") == 0 )
  1399. {
  1400. if (pDev->m_bCommStatus == FALSE)
  1401. {
  1402. if (!InitCarelComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1403. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  1404. {
  1405. pDev->m_bCommStatus = FALSE;
  1406. }
  1407. else
  1408. {
  1409. EnterCriticalSection(&g_csCarelReadOneData);
  1410. pDev->m_bCommStatus = CarelReConnectProc(pDev);
  1411. if( pDev->m_bCommStatus == TRUE )
  1412. {
  1413. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1414. pDev->m_dwOnlineTick = GetTickCount();
  1415. }
  1416. LeaveCriticalSection(&g_csCarelReadOneData);
  1417. }
  1418. }
  1419. }
  1420. else if ( strcmp(chDllName, "scantak_3c.dll") == 0 )
  1421. {
  1422. if (pDev->m_bCommStatus == FALSE)
  1423. {
  1424. if (!InitSeparateComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1425. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  1426. {
  1427. pDev->m_bCommStatus = FALSE;
  1428. }
  1429. else
  1430. {
  1431. EnterCriticalSection(&g_csSeparateReadOneData);
  1432. pDev->m_bCommStatus = SeparateReConnectProc(pDev);
  1433. if( pDev->m_bCommStatus == TRUE )
  1434. {
  1435. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1436. pDev->m_dwOnlineTick = GetTickCount();
  1437. }
  1438. LeaveCriticalSection(&g_csSeparateReadOneData);
  1439. }
  1440. }
  1441. }
  1442. else if ( strcmp(chDllName, "delta.dll") == 0 )
  1443. {
  1444. if (pDev->m_bCommStatus == FALSE)
  1445. {
  1446. if (!InitSeparateComm(pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1447. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  1448. {
  1449. pDev->m_bCommStatus = FALSE;
  1450. }
  1451. else
  1452. {
  1453. EnterCriticalSection(&g_csSeparateReadOneData);
  1454. pDev->m_bCommStatus = SeparateReConnectProc(pDev);
  1455. if( pDev->m_bCommStatus == TRUE )
  1456. {
  1457. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1458. pDev->m_dwOnlineTick = GetTickCount();
  1459. }
  1460. LeaveCriticalSection(&g_csSeparateReadOneData);
  1461. }
  1462. }
  1463. }
  1464. else if ( strcmp(szIniName, "upsuh31.ini") == 0 ||
  1465. strcmp(szIniName, "emerson_cm.ini") == 0 ||
  1466. strcmp(szIniName, "dme3000.ini") == 0 ||
  1467. strcmp(szIniName, "paradigm200a_rectifier.ini") == 0 ||
  1468. strcmp(szIniName, "paradigm200a_inverter.ini") == 0 ||
  1469. strcmp(szIniName, "paradigm200b.ini") == 0 ||
  1470. strcmp(szIniName, "hipulseigmnet.ini") == 0 ||
  1471. strcmp(szIniName, "hipulsecdt.ini") == 0 ||
  1472. strcmp(szIniName, "prostar.ini") == 0 ||
  1473. strcmp(szIniName, "joton.ini") == 0 ||
  1474. strcmp(szIniName, "hiross.ini") == 0 ||
  1475. strcmp(szIniName, "upslink.ini") == 0 ||
  1476. strcmp(szIniName, "upsapcsilcon.ini") == 0 ||
  1477. strcmp(szIniName, "ul33.ini") == 0 ||
  1478. strcmp(szIniName, "hipulse_u.ini") == 0 ||
  1479. strcmp(szIniName, "kehua.ini") == 0 ||
  1480. strcmp(szIniName, "secups.ini") == 0 ||
  1481. strcmp(szIniName, "upsuh11.ini") == 0 ||
  1482. strcmp(szIniName, "weibo.ini") == 0 ||
  1483. strcmp(szIniName, "sda_ii.ini") == 0 ||
  1484. strcmp(szIniName, "daikin.ini") == 0 ||
  1485. strcmp(szIniName, "scantak_3c.ini") == 0 ||
  1486. strcmp(szIniName, "delta.ini") == 0 ||
  1487. strcmp(szIniName, "m84c5z.ini") == 0 ||
  1488. strcmp(szIniName, "upsnxr.ini") == 0 ||
  1489. strcmp(szIniName, "batteryadu.ini") == 0 ||
  1490. strcmp(szIniName, "upsmonitorlan.ini") == 0 ||
  1491. strcmp(szIniName, "sk6000.ini") == 0 ||
  1492. strcmp(szIniName, "batteryadu2000.ini") == 0 ||
  1493. strcmp(szIniName, "santak_shiwei.ini") == 0 ||
  1494. strcmp(szIniName, "santak_q4.ini") == 0 ||
  1495. strcmp(szIniName, "ups_nxl.ini") == 0 ||
  1496. strcmp(szIniName, "twoul33.ini") == 0 ||
  1497. strcmp(szIniName, "oumai.ini") == 0 ||
  1498. strcmp(szIniName, "santak_3a3120ks.ini") == 0 ||
  1499. strcmp(szIniName, "tmaster.ini") == 0 )
  1500. {
  1501. if (pDev->m_bCommStatus == FALSE)
  1502. {
  1503. if (!InitMostDeviceComm(g_strDirectory, szIniName, pDev->m_iDevideaddr, pDev->m_iPort, nBaudRate,
  1504. nDataBit, pDev->m_iStopbit, pDev->m_iParitybit, 1000))
  1505. {
  1506. pDev->m_bCommStatus = FALSE;
  1507. }
  1508. else
  1509. {
  1510. EnterCriticalSection(&g_csMostDeviceReadOneData);
  1511. pDev->m_bCommStatus = MostDeviceReConnectProc(pDev);
  1512. if( pDev->m_bCommStatus == TRUE )
  1513. {
  1514. LOG4C((LOG_NOTICE, "device name:%s open com success!", pDev->m_strDeviceName));
  1515. pDev->m_dwOnlineTick = GetTickCount();
  1516. }
  1517. LeaveCriticalSection(&g_csMostDeviceReadOneData);
  1518. }
  1519. }
  1520. }
  1521. }
  1522. }
  1523. Sleep(100); //chn add
  1524. }while( WaitForSingleObject( g_hRunObject, 1250L ) == WAIT_TIMEOUT );
  1525. return 0;
  1526. }
  1527. DWORD WINAPI DevOnlineThreadProc(void *pPara)
  1528. {
  1529. do
  1530. {
  1531. // 循环所有设备
  1532. int nDeviceSize = g_pDevicesManager->m_Devices.GetSize();
  1533. for( int i = 0; i < nDeviceSize; i++ )
  1534. {
  1535. CDevice *pDev = g_pDevicesManager->m_Devices[i];
  1536. // 循环所有变量
  1537. int nVarSize = pDev->m_Vars.GetSize();
  1538. for( int j = 0; j < nVarSize; j++ )
  1539. {
  1540. CBaseVar *pBaseVar = pDev->m_Vars[j];
  1541. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID ) // 内存变量,判断设备是否在线
  1542. {
  1543. if( pDev->m_bySpecialdevice == 2 || pDev->m_bySpecialdevice == 3 ) // 网络设备
  1544. {
  1545. int iPingResult = 0;
  1546. // ping 10 次,如果都是timeout, 认为设备已断线
  1547. for( int iPingIndex = 0; iPingIndex < 10; iPingIndex++ )
  1548. {
  1549. if( Ping(2000, pDev->m_strIp) == 0 )
  1550. {
  1551. iPingResult = 0;
  1552. break;
  1553. }
  1554. else
  1555. {
  1556. iPingResult = 1;
  1557. }
  1558. }
  1559. if( 1 == iPingResult ) // 设备已断线
  1560. {
  1561. if( pDev->m_bySpecialdevice == 2 )
  1562. {
  1563. int nIndex = GetTcpThreadStructIndex( pDev->m_strUid );
  1564. if( nIndex != -1 )
  1565. {
  1566. if( g_hRequestDataThread[ g_tcpThreadStruct[nIndex].nTcpTheadIndex ] != NULL )
  1567. {
  1568. //LOG4C((LOG_NOTICE, "Enter SuspendThread."));
  1569. SuspendThread( g_hRequestDataThread[ g_tcpThreadStruct[nIndex].nTcpTheadIndex ] );
  1570. //LOG4C((LOG_NOTICE, "Leave SuspendThread."));
  1571. }
  1572. }
  1573. //LOG4C((LOG_NOTICE, "Enter CloseTcpNet."));
  1574. CloseTcpNet(pDev->m_iDevideaddr, pDev->m_iIpport, (char *)(LPCTSTR)pDev->m_strIp);
  1575. //LOG4C((LOG_NOTICE, "Leave CloseTcpNet."));
  1576. }
  1577. //if( pDev->m_bCommStatus == TRUE )
  1578. {
  1579. //LOG4C((LOG_NOTICE, "devname = %s ping timeout", pDev->m_strDeviceName));
  1580. EnterCriticalSection( &g_csDevOnlineReadOneData );
  1581. pBaseVar->m_dbData = 1;
  1582. pBaseVar->m_nStatus = 1;
  1583. pDev->m_bCommStatus = FALSE;
  1584. LeaveCriticalSection( &g_csDevOnlineReadOneData );
  1585. }
  1586. }
  1587. else
  1588. {
  1589. EnterCriticalSection( &g_csDevOnlineReadOneData );
  1590. pBaseVar->m_dbData = 0;
  1591. pBaseVar->m_nStatus = 0;
  1592. pDev->m_bCommStatus = TRUE;
  1593. LeaveCriticalSection( &g_csDevOnlineReadOneData );//g_csRtuReadOneData
  1594. }
  1595. }
  1596. else // 串口设备
  1597. {
  1598. if( pDev->m_dwOnlineTick <= 0 )
  1599. {
  1600. pDev->m_dwOnlineTick = GetTickCount();
  1601. }
  1602. if( GetTickCount() - pDev->m_dwOnlineTick > 3 * 60 * 1000 && pDev->m_dwOnlineTick > 0 )
  1603. {
  1604. LOG4C((LOG_NOTICE, "%s %d, 串口通信故障!", pDev->m_strDeviceName,pDev->m_bySpecialdevice));
  1605. //if( pDev->m_bCommStatus == TRUE )
  1606. {
  1607. EnterCriticalSection( &g_csDevOnlineReadOneData );
  1608. pBaseVar->m_dbData = 1;
  1609. pBaseVar->m_nStatus = 1;
  1610. pDev->m_bCommStatus = FALSE;
  1611. LeaveCriticalSection( &g_csDevOnlineReadOneData );
  1612. }
  1613. }
  1614. else if( GetTickCount() - pDev->m_dwOnlineTick < 3 * 60 * 1000 && pDev->m_dwOnlineTick > 0 )
  1615. {
  1616. //LOG4C((LOG_NOTICE, "%s, 串口通信正常!", pDev->m_strDeviceName));
  1617. EnterCriticalSection( &g_csDevOnlineReadOneData );
  1618. pBaseVar->m_dbData = 0;
  1619. pBaseVar->m_nStatus = 0;
  1620. pDev->m_bCommStatus = TRUE;
  1621. LeaveCriticalSection( &g_csDevOnlineReadOneData );
  1622. }
  1623. }
  1624. break;
  1625. }
  1626. }
  1627. Sleep(10); // 每个设备之间,延时10ms
  1628. }
  1629. }while( WaitForSingleObject( g_hRunObject, 100L ) == WAIT_TIMEOUT );
  1630. return 0;
  1631. }
  1632. int ModbusRtuProcessProc(CDevice *pDev)
  1633. {
  1634. char chMsg[80] = {0};
  1635. SETBASEPARAM SetBasePara = {0};
  1636. SetBasePara.nAddr = pDev->m_iDevideaddr;
  1637. // 循环所有变量
  1638. int nVarSize = pDev->m_Vars.GetSize();
  1639. for( int j = 0; j < nVarSize; j++ )
  1640. {
  1641. CBaseVar *pBaseVar = pDev->m_Vars[j];
  1642. if( pBaseVar->m_bReadOnly == 1 ) continue;
  1643. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  1644. // 记住上一次读到的数值
  1645. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  1646. SetBasePara.nRegNum = pBaseVar->m_iRegisterNum;
  1647. SetBasePara.nStartAddr = pBaseVar->m_nRegStartAddr;
  1648. SetBasePara.FuncCode = pBaseVar->m_iFuncID;
  1649. if( pBaseVar->m_nVarTypeID >= SPECIAL_VAR_TYPE_MIN_ID && pBaseVar->m_nVarTypeID <= SPECIAL_VAR_TYPE_MAX_ID ) // 特殊变量
  1650. {
  1651. //TRACE("变量值id=%d\r\n", pBaseVar->m_nVarID);
  1652. int nRet = RtuRequestSpecData(SetBasePara, pBaseVar->m_iDataLen, pDev->m_iPort, pDev->m_iDevideaddr,
  1653. (char *)(LPCTSTR)pBaseVar->m_strVarUID, pBaseVar->m_nVarID, pBaseVar->m_nVarTypeID);
  1654. if (nRet == 0)
  1655. {
  1656. }
  1657. else if (nRet == 30005)//Modbus rtu设备lrc校验失败
  1658. {
  1659. pDev->m_dwOnlineTick = GetTickCount();
  1660. }
  1661. else
  1662. {
  1663. //Sleep(200);
  1664. continue;
  1665. }
  1666. }
  1667. else
  1668. {
  1669. int nRet = pRTU_DLLInit(pDev->m_iPort, pDev->m_iDevideaddr, SetBasePara, pBaseVar->m_iDataLen, chMsg);
  1670. if (nRet == 0)//初始化设备DLL
  1671. {
  1672. RtuSingleResponseData((char *)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, chMsg );
  1673. }
  1674. else if (nRet == 30005)//Modbus rtu设备lrc校验失败
  1675. {
  1676. pDev->m_dwOnlineTick = GetTickCount();
  1677. }
  1678. else
  1679. {
  1680. //LOG4C((LOG_NOTICE, "变量(%s),请求失败,错误代码=%d\n", pBaseVar->m_strDesc, nRet));
  1681. }
  1682. }
  1683. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  1684. {
  1685. }
  1686. else
  1687. {
  1688. pBaseVar->m_bIsChange = TRUE;
  1689. }
  1690. Sleep(1);
  1691. }
  1692. return 0;
  1693. }
  1694. int ModbusAscProcessProc(CDevice *pDev)
  1695. {
  1696. char chMsg[80] = {0};
  1697. SETBASEPARAM SetBasePara = {0};
  1698. SetBasePara.nAddr = pDev->m_iDevideaddr;
  1699. // 循环所有变量
  1700. int nVarSize = pDev->m_Vars.GetSize();
  1701. for( int j = 0; j < nVarSize; j++ )
  1702. {
  1703. CBaseVar *pBaseVar = pDev->m_Vars[j];
  1704. if( pBaseVar->m_bReadOnly == 1 ) continue;
  1705. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  1706. // 记住上一次读到的数值
  1707. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  1708. SetBasePara.nRegNum = pBaseVar->m_iRegisterNum;
  1709. SetBasePara.nStartAddr = pBaseVar->m_nRegStartAddr;
  1710. SetBasePara.FuncCode = pBaseVar->m_iFuncID;
  1711. if( pBaseVar->m_nVarTypeID >= SPECIAL_VAR_TYPE_MIN_ID && pBaseVar->m_nVarTypeID <= SPECIAL_VAR_TYPE_MAX_ID ) // 特殊变量
  1712. {
  1713. //TRACE("变量值id=%d\r\n", pBaseVar->m_nVarID);
  1714. int nRet = AscRequestSpecData((char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, pBaseVar->m_nVarTypeID);
  1715. if( nRet==0 )
  1716. {
  1717. }
  1718. else if (nRet == 20005)//Modbus asc设备lrc校验失败
  1719. {
  1720. pDev->m_dwOnlineTick = GetTickCount();
  1721. }
  1722. else
  1723. {
  1724. continue;
  1725. }
  1726. }
  1727. else
  1728. {
  1729. int nRet = pASCDLLInit(pDev->m_iPort, pDev->m_iDevideaddr, SetBasePara, pBaseVar->m_iDataLen, chMsg);//初始化设备DLL
  1730. if( nRet==0 )
  1731. {
  1732. //TRACE("变量值id=%d\r\n", pBaseVar->m_nVarID);
  1733. AscSingleResponseData((char *)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, chMsg);
  1734. }
  1735. else if (nRet == 20005)//Modbus asc设备lrc校验失败
  1736. {
  1737. pDev->m_dwOnlineTick = GetTickCount();
  1738. }
  1739. else if (nRet == 30005)//Modbus rtu设备lrc校验失败
  1740. {
  1741. pDev->m_dwOnlineTick = GetTickCount();
  1742. }
  1743. }
  1744. //if( pBaseVar->m_strName=="Leak2_Alarm" )
  1745. //{
  1746. // CString s;
  1747. // s.Format( "Leak2_Alarm=%d",pBaseVar->m_dbData );
  1748. // LOG4C((LOG_NOTICE, s));
  1749. //}
  1750. //if( pBaseVar->m_strName=="Leak2_Pos" )
  1751. //{
  1752. // CString s;
  1753. // s.Format( "Leak2_Pos=%d",pBaseVar->m_dbData );
  1754. // LOG4C((LOG_NOTICE, s));
  1755. //}
  1756. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  1757. {
  1758. }
  1759. else
  1760. {
  1761. pBaseVar->m_bIsChange = TRUE;
  1762. }
  1763. Sleep(1);
  1764. }
  1765. return 0;
  1766. }
  1767. int ModbusTcpProcessProc(CDevice *pDev)
  1768. {
  1769. char chMsg[80] = {0};
  1770. // 循环所有变量
  1771. int nVarSize = pDev->m_Vars.GetSize();
  1772. for( int j = 0; j < nVarSize; j++ )
  1773. {
  1774. CBaseVar *pBaseVar = pDev->m_Vars[j];
  1775. if( pBaseVar->m_bReadOnly == 1 ) continue;
  1776. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  1777. // 记住上一次读到的数值
  1778. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  1779. if( WaitForSingleObject( g_hRunObject, 5L ) == WAIT_OBJECT_0 )
  1780. {
  1781. MTVERIFY( SetEvent(pDev->m_hSemNet) );
  1782. }
  1783. #if 0
  1784. if( WaitForSingleObject(g_hSemNet, 0) == WAIT_OBJECT_0 ) // 有信号才发送数据
  1785. {
  1786. char chRegNum[4] = {0};
  1787. char chStartAddr[4] = {0};
  1788. char chFuncCode[4] = {0};
  1789. if (TcpRequestData(pDev->m_iIpport,
  1790. pDev->m_iDevideaddr,
  1791. (char *)(LPCTSTR)pDev->m_strIp,
  1792. pBaseVar->m_iRegisterNum,
  1793. pBaseVar->m_nRegStartAddr,
  1794. pBaseVar->m_iFuncID) == 0)
  1795. {
  1796. //TRACE("变量值id=%d\r\n", pBaseVar->m_nVarID);
  1797. int nRet = TcpSingleResponseData((char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID);
  1798. if( nRet == 0 )
  1799. {
  1800. g_nIndex--;
  1801. if( g_nIndex != 0 )
  1802. {
  1803. //TRACE("ModbusTcp数据不同步!\r\n");
  1804. }
  1805. //TRACE(">>>>>>>>>>结束请求一次数据\r\n");
  1806. SetEvent( g_hSemNet );
  1807. //TRACE("变量ID=%d, 请求寄存器地址:%d, 变量值=%.1f\r\n", pReadSnVar->iVarid, atoi(chStartAddr), g_TcpReadOneData.dbData);
  1808. //
  1809. }
  1810. else
  1811. {
  1812. g_nIndex--;
  1813. //TRACE("ModbusTcp响应数据错误!\r\n");
  1814. SetEvent( g_hSemNet );
  1815. }
  1816. }
  1817. else
  1818. {
  1819. //TRACE("没有读到数据\r\n");
  1820. }
  1821. }
  1822. #else
  1823. #if 0
  1824. char chRegNum[4] = {0};
  1825. char chStartAddr[4] = {0};
  1826. char chFuncCode[4] = {0};
  1827. if( WaitForSingleObject(pDev->m_hSemNet, 0) == WAIT_OBJECT_0 ) // 有信号才发送数据
  1828. {
  1829. if (TcpRequestData(pDev->m_iIpport,
  1830. pDev->m_iDevideaddr,
  1831. (char *)(LPCTSTR)pDev->m_strIp,
  1832. pBaseVar->m_iRegisterNum,
  1833. pBaseVar->m_nRegStartAddr,
  1834. pBaseVar->m_iFuncID) == 0)
  1835. {
  1836. int nRet = TcpSingleResponseData((char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID);
  1837. }
  1838. }
  1839. #else
  1840. char chRegNum[4] = {0};
  1841. char chStartAddr[4] = {0};
  1842. char chFuncCode[4] = {0};
  1843. if( WaitForSingleObject(pDev->m_hSemNet, 0) == WAIT_OBJECT_0 ) // 有信号才发送数据
  1844. {
  1845. g_nIndex++;
  1846. ResetEvent( pDev->m_hSemNet );
  1847. if (TcpRequestData(pDev->m_iIpport,
  1848. pDev->m_iDevideaddr,
  1849. (char *)(LPCTSTR)pDev->m_strIp,
  1850. pBaseVar->m_iRegisterNum,
  1851. pBaseVar->m_nRegStartAddr,
  1852. pBaseVar->m_iFuncID) == 0)
  1853. {
  1854. int nRet = TcpSingleResponseData((char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID);
  1855. if( nRet == 0 )
  1856. {
  1857. g_nIndex--;
  1858. if( g_nIndex != 0 )
  1859. {
  1860. //TRACE("ModbusTcp数据不同步!\r\n");
  1861. }
  1862. //TRACE(">>>>>>>>>>结束请求一次数据\r\n");
  1863. SetEvent( pDev->m_hSemNet );
  1864. //TRACE("变量ID=%d, 请求寄存器地址:%d, 变量值=%.1f\r\n", pReadSnVar->iVarid, atoi(chStartAddr), g_TcpReadOneData.dbData);
  1865. //
  1866. }
  1867. else if( nRet == 20405 )
  1868. {
  1869. pDev->m_dwOnlineTick = GetTickCount();
  1870. }
  1871. else
  1872. {
  1873. g_nIndex--;
  1874. //TRACE("ModbusTcp响应数据错误!\r\n");
  1875. SetEvent( pDev->m_hSemNet );
  1876. }
  1877. }
  1878. else
  1879. {
  1880. SetEvent( pDev->m_hSemNet );
  1881. }
  1882. }
  1883. #endif
  1884. #endif
  1885. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  1886. {
  1887. //LOG4C((LOG_NOTICE, "var desc = %s IsChange = false", pBaseVar->m_strDesc));
  1888. }
  1889. else
  1890. {
  1891. //LOG4C((LOG_NOTICE, "var desc = %s IsChange = true", pBaseVar->m_strDesc));
  1892. pBaseVar->m_bIsChange = TRUE;
  1893. }
  1894. Sleep(1);
  1895. }
  1896. return 0;
  1897. }
  1898. int SnmpProcessProc(CDevice *pDev)
  1899. {
  1900. char chMsg[1024] = {0};
  1901. // 循环所有变量
  1902. int nVarSize = pDev->m_Vars.GetSize();
  1903. for( int j = 0; j < nVarSize; j++ )
  1904. {
  1905. CBaseVar *pBaseVar = pDev->m_Vars[j];
  1906. if( pBaseVar->m_bReadOnly == 1 ) continue;
  1907. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  1908. // 记住上一次读到的数值
  1909. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  1910. if( pSnmpDllGetValue )
  1911. {
  1912. //TRACE("变量值id=%d\r\n", pBaseVar->m_nVarID);
  1913. int nRet = pSnmpDllGetValue((char *)(LPCTSTR)pDev->m_strIp,
  1914. (char *)(LPCTSTR)pBaseVar->m_strFields,
  1915. (char *)(LPCTSTR)pBaseVar->m_strSnmpoi,
  1916. chMsg);
  1917. if( nRet == 0 )
  1918. {
  1919. ParseSnmpData(
  1920. (char *)(LPCTSTR)pDev->m_strUid,
  1921. pBaseVar->m_nVarID,
  1922. chMsg);
  1923. }
  1924. }
  1925. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  1926. {
  1927. }
  1928. else
  1929. {
  1930. pBaseVar->m_bIsChange = TRUE;
  1931. }
  1932. Sleep(1);
  1933. }
  1934. return 0;
  1935. }
  1936. int IcpdasProcessProc(CDevice *pDev)
  1937. {
  1938. char chMsg[80] = {0};
  1939. SETBASEPARAM SetBasePara = {0};
  1940. SetBasePara.nAddr = pDev->m_iDevideaddr;
  1941. // 循环所有变量
  1942. int nVarSize = pDev->m_Vars.GetSize();
  1943. for( int j = 0; j < nVarSize; j++ )
  1944. {
  1945. CBaseVar *pBaseVar = pDev->m_Vars[j];
  1946. if( pBaseVar->m_bReadOnly == 1 ) continue;
  1947. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  1948. // 记住上一次读到的数值
  1949. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  1950. SetBasePara.nRegNum = pBaseVar->m_iRegisterNum;
  1951. SetBasePara.nStartAddr = pBaseVar->m_nRegStartAddr;
  1952. SetBasePara.FuncCode = pBaseVar->m_iFuncID;
  1953. int nRet = IcpdasRequestData(j, SetBasePara, pBaseVar->m_iDataLen, pDev->m_iPort, pDev->m_iDevideaddr,
  1954. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char *)(LPCTSTR)pBaseVar->m_strRs232cmd);
  1955. if( nRet==0 )
  1956. {
  1957. }
  1958. else if( nRet == 20805 )
  1959. {
  1960. pDev->m_dwOnlineTick = GetTickCount();
  1961. }
  1962. else
  1963. {
  1964. continue;
  1965. }
  1966. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  1967. {
  1968. }
  1969. else
  1970. {
  1971. pBaseVar->m_bIsChange = TRUE;
  1972. }
  1973. Sleep(1);
  1974. }
  1975. return 0;
  1976. }
  1977. int ParadigmProcessProc(CDevice *pDev)
  1978. {
  1979. char chMsg[80] = {0};
  1980. // 循环所有变量
  1981. int nVarSize = pDev->m_Vars.GetSize();
  1982. for( int j = 0; j < nVarSize; j++ )
  1983. {
  1984. CBaseVar *pBaseVar = pDev->m_Vars[j];
  1985. if( pBaseVar->m_bReadOnly == 1 ) continue;
  1986. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  1987. // 记住上一次读到的数值
  1988. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  1989. int nRet = ParadigmRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  1990. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char*)(LPCTSTR)pBaseVar->m_strRs232cmd);
  1991. if( nRet == 0)
  1992. {
  1993. }
  1994. else
  1995. {
  1996. continue;
  1997. }
  1998. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  1999. {
  2000. }
  2001. else
  2002. {
  2003. pBaseVar->m_bIsChange = TRUE;
  2004. }
  2005. Sleep(1);
  2006. }
  2007. return 0;
  2008. }
  2009. int StulzProcessProc(CDevice *pDev)
  2010. {
  2011. char chMsg[80] = {0};
  2012. SETBASEPARAM SetBasePara = {0};
  2013. SetBasePara.nAddr = pDev->m_iDevideaddr;
  2014. // 循环所有变量
  2015. int nVarSize = pDev->m_Vars.GetSize();
  2016. for( int j = 0; j < nVarSize; j++ )
  2017. {
  2018. CBaseVar *pBaseVar = pDev->m_Vars[j];
  2019. if( pBaseVar->m_bReadOnly == 1 ) continue;
  2020. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  2021. // 记住上一次读到的数值
  2022. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  2023. SetBasePara.nRegNum = pBaseVar->m_iRegisterNum;
  2024. SetBasePara.nStartAddr = pBaseVar->m_nRegStartAddr;
  2025. SetBasePara.FuncCode = pBaseVar->m_iFuncID;
  2026. int nRet = StulzRequestData(SetBasePara, pBaseVar->m_iDataLen, pDev->m_iPort, pDev->m_iDevideaddr,
  2027. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char*)(LPCTSTR)pBaseVar->m_strRs232cmd);
  2028. if( nRet==0 )
  2029. {
  2030. }
  2031. else if( nRet == 20805 )
  2032. {
  2033. pDev->m_dwOnlineTick = GetTickCount();
  2034. }
  2035. else
  2036. {
  2037. continue;
  2038. }
  2039. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  2040. {
  2041. }
  2042. else
  2043. {
  2044. pBaseVar->m_bIsChange = TRUE;
  2045. }
  2046. Sleep(1);
  2047. }
  2048. return 0;
  2049. }
  2050. int DaiKinProcessProc(CDevice *pDev)
  2051. {
  2052. char chMsg[80] = {0};
  2053. // 循环所有变量
  2054. int nVarSize = pDev->m_Vars.GetSize();
  2055. for( int j = 0; j < nVarSize; j++ )
  2056. {
  2057. CBaseVar *pBaseVar = pDev->m_Vars[j];
  2058. if( pBaseVar->m_bReadOnly == 1 ) continue;
  2059. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  2060. // 记住上一次读到的数值
  2061. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  2062. int nRet = DaiKinRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  2063. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char*)(LPCTSTR)pBaseVar->m_strRs232cmd);
  2064. if( nRet == 0)
  2065. {
  2066. }
  2067. else if( nRet == 21405 )
  2068. {
  2069. pDev->m_dwOnlineTick = GetTickCount();
  2070. }
  2071. else
  2072. {
  2073. continue;
  2074. }
  2075. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  2076. {
  2077. }
  2078. else
  2079. {
  2080. pBaseVar->m_bIsChange = TRUE;
  2081. }
  2082. Sleep(1);
  2083. }
  2084. return 0;
  2085. }
  2086. int PowerwareProcessProc(CDevice *pDev)
  2087. {
  2088. char chMsg[80] = {0};
  2089. // 循环所有变量
  2090. int nVarSize = pDev->m_Vars.GetSize();
  2091. for( int j = 0; j < nVarSize; j++ )
  2092. {
  2093. CBaseVar *pBaseVar = pDev->m_Vars[j];
  2094. if( pBaseVar->m_bReadOnly == 1 ) continue;
  2095. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  2096. // 记住上一次读到的数值
  2097. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  2098. int nRet = PowerwareRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  2099. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char*)(LPCTSTR)pBaseVar->m_strRs232cmd);
  2100. if( nRet == 0)
  2101. {
  2102. }
  2103. else if( nRet == 21605 )
  2104. {
  2105. pDev->m_dwOnlineTick = GetTickCount();
  2106. }
  2107. else
  2108. {
  2109. continue;
  2110. }
  2111. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  2112. {
  2113. }
  2114. else
  2115. {
  2116. pBaseVar->m_bIsChange = TRUE;
  2117. }
  2118. Sleep(1);
  2119. }
  2120. return 0;
  2121. }
  2122. int GreeProcessProc(CDevice *pDev)
  2123. {
  2124. char chMsg[80] = {0};
  2125. SETBASEPARAM SetBasePara = {0};
  2126. SetBasePara.nAddr = pDev->m_iDevideaddr;
  2127. // 循环所有变量
  2128. int nVarSize = pDev->m_Vars.GetSize();
  2129. for( int j = 0; j < nVarSize; j++ )
  2130. {
  2131. if( WaitForSingleObject( g_hRunObject, 5L ) == WAIT_OBJECT_0 ) return 0;
  2132. CBaseVar *pBaseVar = pDev->m_Vars[j];
  2133. if( pBaseVar->m_bReadOnly == 1 ) continue;
  2134. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  2135. // 记住上一次读到的数值
  2136. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  2137. SetBasePara.nRegNum = pBaseVar->m_iRegisterNum;
  2138. SetBasePara.nStartAddr = pBaseVar->m_nRegStartAddr;
  2139. SetBasePara.FuncCode = pBaseVar->m_iFuncID;
  2140. int nRet = GreeRequestData(SetBasePara, pBaseVar->m_iDataLen, pDev->m_iPort, pDev->m_iDevideaddr,
  2141. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID, (char*)(LPCTSTR)pBaseVar->m_strRs232cmd);
  2142. if( nRet == 0)
  2143. {
  2144. }
  2145. else if( nRet == 21805 )
  2146. {
  2147. pDev->m_dwOnlineTick = GetTickCount();
  2148. }
  2149. else
  2150. {
  2151. continue;
  2152. }
  2153. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  2154. {
  2155. }
  2156. else
  2157. {
  2158. pBaseVar->m_bIsChange = TRUE;
  2159. }
  2160. Sleep(1);
  2161. }
  2162. return 0;
  2163. }
  2164. int CarelProcessProc(CDevice *pDev)
  2165. {
  2166. char chMsg[80] = {0};
  2167. // 循环所有变量
  2168. int nVarSize = pDev->m_Vars.GetSize();
  2169. for( int j = 0; j < nVarSize; j++ )
  2170. {
  2171. if( WaitForSingleObject( g_hRunObject, 5L ) == WAIT_OBJECT_0 ) return 0;
  2172. CBaseVar *pBaseVar = pDev->m_Vars[j];
  2173. if( pBaseVar->m_bReadOnly == 1 ) continue;
  2174. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  2175. // 记住上一次读到的数值
  2176. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  2177. int nRet = CarelRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  2178. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID,
  2179. (char*)(LPCTSTR)pBaseVar->m_strRs232cmd);
  2180. if( nRet == 0)
  2181. {
  2182. }
  2183. else if( nRet == 22205 )
  2184. {
  2185. pDev->m_dwOnlineTick = GetTickCount();
  2186. }
  2187. else
  2188. {
  2189. continue;
  2190. }
  2191. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  2192. {
  2193. }
  2194. else
  2195. {
  2196. pBaseVar->m_bIsChange = TRUE;
  2197. }
  2198. Sleep(1);
  2199. }
  2200. return 0;
  2201. }
  2202. int SeparateProcessProc(CDevice *pDev)
  2203. {
  2204. char chMsg[80] = {0};
  2205. char szIniName[MAX_PATH] = {0};
  2206. strcpy(szIniName, (char *)(LPCTSTR)pDev->m_strIniName);
  2207. StrLower(szIniName, szIniName);
  2208. // 循环所有变量
  2209. int nVarSize = pDev->m_Vars.GetSize();
  2210. for( int j = 0; j < nVarSize; j++ )
  2211. {
  2212. if( WaitForSingleObject( g_hRunObject, 5L ) == WAIT_OBJECT_0 ) return 0;
  2213. CBaseVar *pBaseVar = pDev->m_Vars[j];
  2214. if( pBaseVar->m_bReadOnly == 1 ) continue;
  2215. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  2216. // 记住上一次读到的数值
  2217. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  2218. int nRet = SeparateRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  2219. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID,
  2220. (char*)(LPCTSTR)pBaseVar->m_strRs232cmd,
  2221. szIniName);
  2222. if( nRet == 0)
  2223. {
  2224. }
  2225. else if( nRet == 50205 )
  2226. {
  2227. pDev->m_dwOnlineTick = GetTickCount();
  2228. }
  2229. else
  2230. {
  2231. continue;
  2232. }
  2233. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  2234. {
  2235. }
  2236. else
  2237. {
  2238. pBaseVar->m_bIsChange = TRUE;
  2239. }
  2240. Sleep(1);
  2241. }
  2242. return 0;
  2243. }
  2244. int MostDeviceProcessProc(CDevice *pDev)
  2245. {
  2246. char chMsg[80] = {0};
  2247. char szIniName[MAX_PATH] = {0};
  2248. strcpy(szIniName, (char *)(LPCTSTR)pDev->m_strIniName);
  2249. StrLower(szIniName, szIniName);
  2250. // 循环所有变量
  2251. int nVarSize = pDev->m_Vars.GetSize();
  2252. for( int j = 0; j < nVarSize; j++ )
  2253. {
  2254. if( WaitForSingleObject( g_hRunObject, 0 ) == WAIT_OBJECT_0 ) return 0;
  2255. CBaseVar *pBaseVar = pDev->m_Vars[j];
  2256. if( pBaseVar->m_bReadOnly == 1 ) continue;
  2257. if( pBaseVar->m_nVarTypeID == ONLINE_VAR_ID || HIGH_PRIORITY_ONLINE_ID == pBaseVar->m_nVarTypeID ) continue; // 内存变量,在DevOnlineThread处理
  2258. // 记住上一次读到的数值
  2259. pBaseVar->m_dbLastData = pBaseVar->m_dbData;
  2260. int nRet = MostDeviceRequestData(pDev->m_iPort, pDev->m_iDevideaddr,
  2261. (char*)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID,
  2262. (char*)(LPCTSTR)pBaseVar->m_strRs232cmd,
  2263. szIniName);
  2264. if( nRet == 0)
  2265. {
  2266. }
  2267. else if( nRet == 50205 )
  2268. {
  2269. pDev->m_dwOnlineTick = GetTickCount();
  2270. }
  2271. else
  2272. {
  2273. Sleep(1);
  2274. continue;
  2275. }
  2276. if( abs(pBaseVar->m_dbData - pBaseVar->m_dbLastData) < DATA_CHANGE_FLAG )
  2277. {
  2278. }
  2279. else
  2280. {
  2281. pBaseVar->m_bIsChange = TRUE;
  2282. }
  2283. Sleep(1);
  2284. }
  2285. return 0;
  2286. }
  2287. DWORD WINAPI RequestDataThreadProc(void *pPara)
  2288. {
  2289. #if IS_USER_MUL_THREAD_REQUEST
  2290. CString strName;
  2291. strName = CString((char *)pPara);
  2292. strName.MakeLower();
  2293. #endif
  2294. do
  2295. {
  2296. // 循环所有设备
  2297. int nDeviceSize = g_pDevicesManager->m_Devices.GetSize();
  2298. for( int i = 0; i < nDeviceSize; i++ )
  2299. {
  2300. CDevice *pDev = g_pDevicesManager->m_Devices[i];
  2301. char chDllName[MAX_PATH] = {0};
  2302. strcpy(chDllName, (char *)(LPCTSTR)pDev->m_strProtocoldllname);
  2303. StrLower(chDllName,chDllName);
  2304. char szIniName[MAX_PATH] = {0};
  2305. strcpy(szIniName, (char *)(LPCTSTR)pDev->m_strIniName);
  2306. StrLower(szIniName, szIniName);
  2307. char szUid[MAX_PATH] = {0};
  2308. strcpy(szUid, (char *)(LPCTSTR)pDev->m_strUid);
  2309. StrLower(szUid, szUid);
  2310. char szPort[MAX_PATH] = {0};
  2311. CString strPort;
  2312. strPort.Format("%d", pDev->m_iPort);
  2313. strcpy(szPort, (char *)(LPCTSTR)strPort);
  2314. StrLower(szPort, szPort);
  2315. #if 0
  2316. if( pDev->m_bCommStatus == FALSE )
  2317. {
  2318. Sleep(1);
  2319. continue;
  2320. }
  2321. #endif
  2322. if( pDev->m_bySpecialdevice == 0 )
  2323. {
  2324. #if IS_USER_MUL_THREAD_REQUEST
  2325. if( strName.Compare(szPort) != 0 ) continue;
  2326. #endif
  2327. ModbusRtuProcessProc(pDev);
  2328. }
  2329. else if( pDev->m_bySpecialdevice == 1 )
  2330. {
  2331. #if IS_USER_MUL_THREAD_REQUEST
  2332. if( strName.Compare(szPort) != 0 ) continue;
  2333. #endif
  2334. ModbusAscProcessProc(pDev);
  2335. }
  2336. else if( pDev->m_bySpecialdevice == 2 )
  2337. {
  2338. #if IS_USER_MUL_THREAD_REQUEST
  2339. if( strName.Compare(szUid) ) continue;
  2340. #endif
  2341. ModbusTcpProcessProc(pDev);
  2342. }
  2343. else if( pDev->m_bySpecialdevice == 3 )
  2344. {
  2345. #if IS_USER_MUL_THREAD_REQUEST
  2346. if( strName.Compare(szUid) ) continue;
  2347. #endif
  2348. SnmpProcessProc(pDev);
  2349. }
  2350. else if( pDev->m_bySpecialdevice == 4 )
  2351. {
  2352. if ( strcmp(chDllName, "icpdas.dll") == 0 )
  2353. {
  2354. #if IS_USER_MUL_THREAD_REQUEST
  2355. if( strName.Compare(szPort) != 0 ) continue;
  2356. #endif
  2357. IcpdasProcessProc(pDev);
  2358. }
  2359. else if ( strcmp(chDllName, "upsparadigm.dll") == 0 )
  2360. {
  2361. #if IS_USER_MUL_THREAD_REQUEST
  2362. if( strName.Compare(szPort) != 0 ) continue;
  2363. #endif
  2364. ParadigmProcessProc(pDev);
  2365. }
  2366. else if ( strcmp(chDllName, "stulz.dll") == 0 )
  2367. {
  2368. #if IS_USER_MUL_THREAD_REQUEST
  2369. if( strName.Compare(szPort) != 0 ) continue;
  2370. #endif
  2371. StulzProcessProc(pDev);
  2372. }
  2373. else if ( strcmp(chDllName, "daikin.dll") == 0 )
  2374. {
  2375. #if IS_USER_MUL_THREAD_REQUEST
  2376. if( strName.Compare(szPort) != 0 ) continue;
  2377. #endif
  2378. DaiKinProcessProc(pDev);
  2379. }
  2380. else if ( strcmp(chDllName, "powerware.dll") == 0 )
  2381. {
  2382. #if IS_USER_MUL_THREAD_REQUEST
  2383. if( strName.Compare(szPort) != 0 ) continue;
  2384. #endif
  2385. PowerwareProcessProc(pDev);
  2386. }
  2387. else if ( strcmp(chDllName, "gree.dll") == 0 )
  2388. {
  2389. #if IS_USER_MUL_THREAD_REQUEST
  2390. if( strName.Compare(szPort) != 0 ) continue;
  2391. #endif
  2392. GreeProcessProc(pDev);
  2393. }
  2394. else if ( strcmp(chDllName, "carel.dll") == 0 )
  2395. {
  2396. #if IS_USER_MUL_THREAD_REQUEST
  2397. if( strName.Compare(szPort) != 0 ) continue;
  2398. #endif
  2399. CarelProcessProc(pDev);
  2400. }
  2401. else if ( strcmp(chDllName, "scantak_3c.dll") == 0 )
  2402. {
  2403. #if IS_USER_MUL_THREAD_REQUEST
  2404. if( strName.Compare(szPort) != 0 ) continue;
  2405. #endif
  2406. SeparateProcessProc(pDev);
  2407. }
  2408. else if ( strcmp(chDllName, "delta.dll") == 0 )
  2409. {
  2410. #if IS_USER_MUL_THREAD_REQUEST
  2411. if( strName.Compare(szPort) != 0 ) continue;
  2412. #endif
  2413. //TRACE("变量值id=%d\r\n", pBaseVar->m_nVarID);
  2414. SeparateProcessProc(pDev);
  2415. }
  2416. else if ( strcmp(szIniName, "upsuh31.ini") == 0 ||
  2417. strcmp(szIniName, "emerson_cm.ini") == 0 ||
  2418. strcmp(szIniName, "dme3000.ini") == 0 ||
  2419. strcmp(szIniName, "paradigm200a_rectifier.ini") == 0 ||
  2420. strcmp(szIniName, "paradigm200a_inverter.ini") == 0 ||
  2421. strcmp(szIniName, "paradigm200b.ini") == 0 ||
  2422. strcmp(szIniName, "hipulseigmnet.ini") == 0 ||
  2423. strcmp(szIniName, "hipulsecdt.ini") == 0 ||
  2424. strcmp(szIniName, "prostar.ini") == 0 ||
  2425. strcmp(szIniName, "joton.ini") == 0 ||
  2426. strcmp(szIniName, "hiross.ini") == 0 ||
  2427. strcmp(szIniName, "upslink.ini") == 0 ||
  2428. strcmp(szIniName, "upsapcsilcon.ini") == 0 ||
  2429. strcmp(szIniName, "ul33.ini") == 0 ||
  2430. strcmp(szIniName, "hipulse_u.ini") == 0 ||
  2431. strcmp(szIniName, "kehua.ini") == 0 ||
  2432. strcmp(szIniName, "secups.ini") == 0 ||
  2433. strcmp(szIniName, "upsuh11.ini") == 0 ||
  2434. strcmp(szIniName, "weibo.ini") == 0 ||
  2435. strcmp(szIniName, "sda_ii.ini") == 0 ||
  2436. strcmp(szIniName, "daikin.ini") == 0 ||
  2437. strcmp(szIniName, "scantak_3c.ini") == 0 ||
  2438. strcmp(szIniName, "delta.ini") == 0 ||
  2439. strcmp(szIniName, "m84c5z.ini") == 0 ||
  2440. strcmp(szIniName, "upsnxr.ini") == 0 ||
  2441. strcmp(szIniName, "batteryadu.ini") == 0 ||
  2442. strcmp(szIniName, "upsmonitorlan.ini") == 0 ||
  2443. strcmp(szIniName, "sk6000.ini") == 0 ||
  2444. strcmp(szIniName, "batteryadu2000.ini") == 0 ||
  2445. strcmp(szIniName, "santak_shiwei.ini") == 0 ||
  2446. strcmp(szIniName, "santak_q4.ini") == 0 ||
  2447. strcmp(szIniName, "ups_nxl.ini") == 0 ||
  2448. strcmp(szIniName, "twoul33.ini") == 0 ||
  2449. strcmp(szIniName, "oumai.ini") == 0 ||
  2450. strcmp(szIniName, "santak_3a3120ks.ini") == 0 ||
  2451. strcmp(szIniName, "tmaster.ini") == 0 )
  2452. {
  2453. #if IS_USER_MUL_THREAD_REQUEST
  2454. if( strName.Compare(szPort) != 0 ) continue;
  2455. #endif
  2456. //LOG4C((LOG_NOTICE, "Enter MostDeviceProcessProc szIniName = %s", szIniName));
  2457. MostDeviceProcessProc(pDev);
  2458. //LOG4C((LOG_NOTICE, "Leave MostDeviceProcessProc szIniName = %s", szIniName));
  2459. }
  2460. }
  2461. }
  2462. }while( WaitForSingleObject( g_hRunObject, 5L ) == WAIT_TIMEOUT );
  2463. return 0;
  2464. }
  2465. DWORD WINAPI TimingSendSmsThread(void *pPara)
  2466. {
  2467. char chTel[MAX_TEL_LENGTH] = {0};
  2468. char chMobile[MAX_TEL_LENGTH] = {0};
  2469. char chFax[MAX_TEL_LENGTH] = {0};
  2470. char chEmail[MAX_EMAIL_LENGTH] = {0};
  2471. list<string> list_tel, list_mobile, list_fax, list_email;
  2472. list<string>::iterator it_tel, it_mobile, it_fax, it_email;
  2473. int nUserCount = CDBInterface::GetInstancePtr()->GetUserInfoList(list_tel, list_mobile, list_fax, list_email);
  2474. if( 0 == nUserCount )
  2475. {
  2476. return 0;
  2477. }
  2478. if( 0 == list_tel.size() )
  2479. {
  2480. return 0;
  2481. }
  2482. do
  2483. {
  2484. CTime ctNow = CTime::GetCurrentTime();
  2485. int nWeek, nHour, nMinute;
  2486. nWeek = ctNow.GetDayOfWeek();
  2487. nHour = ctNow.GetHour();
  2488. nMinute = ctNow.GetMinute();
  2489. #if 0 //每天发一次
  2490. if( nHour == g_nTimingHours
  2491. && nMinute == g_nTimingMinutes && g_nTimingEnable == 1
  2492. && g_nTimingSendFinished == 0 )
  2493. {
  2494. g_nTimingSendFinished = 1;
  2495. char szResultMsg[MAX_EQUIP_DESC + 1] = {0};
  2496. int nResult = -1;
  2497. memset(szResultMsg, 0, sizeof(szResultMsg));
  2498. for( it_tel = list_tel.begin(), it_mobile = list_mobile.begin(), it_fax = list_fax.begin(), it_email = list_email.begin();
  2499. it_tel != list_tel.end(), it_mobile != list_mobile.end(), it_fax != list_fax.end(), it_email != list_email.end(); )
  2500. {
  2501. strcpy(chTel, (*it_tel++).c_str());
  2502. strcpy(chMobile, (*it_mobile++).c_str());
  2503. strcpy(chFax, (*it_fax++).c_str());
  2504. strcpy(chEmail, (*it_email++).c_str());
  2505. if( g_nSendSms==1 )
  2506. {
  2507. if( strcmp(chMobile, "") != 0 )
  2508. {
  2509. CString strMobileTel;
  2510. strMobileTel.Format("%s",chMobile );
  2511. if( strMobileTel.GetLength()!=11 ) continue; //判断是不是手机号码 只根据长度
  2512. nResult = pSmsDllSendSms(chMobile, (char *)(LPCTSTR)g_strHintSysRun, szResultMsg);
  2513. if( nResult != 0 ) // 发送失败
  2514. {
  2515. }
  2516. }
  2517. }
  2518. if( g_nSendNotice == 1 )
  2519. {
  2520. //LOG4C((LOG_NOTICE, "nWeek = %d, nHour = %d, nMinute = %d", nWeek, nHour, nMinute));
  2521. if( strcmp(chTel, "") != 0 )
  2522. {
  2523. LOG4C((LOG_NOTICE, "nWeek = %d, nHour = %d, nMinute = %d, g_strHintSysRun = %s", nWeek, nHour, nMinute, g_strHintSysRun));
  2524. // 继续加入语音发送list
  2525. EnterCriticalSection( &g_csVarNotice );
  2526. InsertSendNoticeList("0.0.0.0", 1, chTel, (char *)(LPCTSTR)g_strHintSysRun);
  2527. LeaveCriticalSection( &g_csVarNotice );
  2528. }
  2529. #if 0 //移动电话 不打电话
  2530. if( strcmp(chMobile, "") != 0 )
  2531. {
  2532. //LOG4C((LOG_NOTICE, "nWeek = %d, nHour = %d, nMinute = %d, g_strHintSysRun = %s", nWeek, nHour, nMinute, g_strHintSysRun));
  2533. // 继续加入语音发送list
  2534. EnterCriticalSection( &g_csVarNotice );
  2535. InsertSendNoticeList("0.0.0.0", 1, chMobile, (char *)(LPCTSTR)g_strHintSysRun);
  2536. LeaveCriticalSection( &g_csVarNotice );
  2537. }
  2538. #endif
  2539. }
  2540. }
  2541. }
  2542. else
  2543. {
  2544. if( !( nHour == g_nTimingHours && nMinute == g_nTimingMinutes ) )
  2545. {
  2546. g_nTimingSendFinished = 0;
  2547. }
  2548. }
  2549. #else //每星期发一次
  2550. if( nWeek == g_nTimingWeeks && nHour == g_nTimingHours
  2551. && nMinute == g_nTimingMinutes && g_nTimingEnable == 1
  2552. && g_nTimingSendFinished == 0 )
  2553. {
  2554. g_nTimingSendFinished = 1;
  2555. char szResultMsg[MAX_EQUIP_DESC + 1] = {0};
  2556. int nResult = -1;
  2557. memset(szResultMsg, 0, sizeof(szResultMsg));
  2558. for( it_tel = list_tel.begin(), it_mobile = list_mobile.begin(), it_fax = list_fax.begin(), it_email = list_email.begin();
  2559. it_tel != list_tel.end(), it_mobile != list_mobile.end(), it_fax != list_fax.end(), it_email != list_email.end(); )
  2560. {
  2561. strcpy(chTel, (*it_tel++).c_str());
  2562. strcpy(chMobile, (*it_mobile++).c_str());
  2563. strcpy(chFax, (*it_fax++).c_str());
  2564. strcpy(chEmail, (*it_email++).c_str());
  2565. if( g_nSendSms==1 )
  2566. {
  2567. if( strcmp(chMobile, "") != 0 )
  2568. {
  2569. CString strMobileTel;
  2570. strMobileTel.Format("%s",chMobile );
  2571. if( strMobileTel.GetLength()!=11 ) continue; //判断是不是手机号码 只根据长度
  2572. nResult = pSmsDllSendSms(chMobile, (char *)(LPCTSTR)g_strHintSysRun, szResultMsg);
  2573. if( nResult != 0 ) // 发送失败
  2574. {
  2575. }
  2576. }
  2577. }
  2578. if( g_nSendNotice == 1 )
  2579. {
  2580. //LOG4C((LOG_NOTICE, "nWeek = %d, nHour = %d, nMinute = %d", nWeek, nHour, nMinute));
  2581. if( strcmp(chTel, "") != 0 )
  2582. {
  2583. LOG4C((LOG_NOTICE, "nWeek = %d, nHour = %d, nMinute = %d, g_strHintSysRun = %s", nWeek, nHour, nMinute, g_strHintSysRun));
  2584. // 继续加入语音发送list
  2585. EnterCriticalSection( &g_csVarNotice );
  2586. InsertSendNoticeList("0.0.0.0", 1, chTel, (char *)(LPCTSTR)g_strHintSysRun,0);
  2587. LeaveCriticalSection( &g_csVarNotice );
  2588. }
  2589. #if 0 //移动电话 不打电话
  2590. if( strcmp(chMobile, "") != 0 )
  2591. {
  2592. //LOG4C((LOG_NOTICE, "nWeek = %d, nHour = %d, nMinute = %d, g_strHintSysRun = %s", nWeek, nHour, nMinute, g_strHintSysRun));
  2593. // 继续加入语音发送list
  2594. EnterCriticalSection( &g_csVarNotice );
  2595. InsertSendNoticeList("0.0.0.0", 1, chMobile, (char *)(LPCTSTR)g_strHintSysRun);
  2596. LeaveCriticalSection( &g_csVarNotice );
  2597. }
  2598. #endif
  2599. }
  2600. }
  2601. }
  2602. else
  2603. {
  2604. if( !( nWeek == g_nTimingWeeks && nHour == g_nTimingHours && nMinute == g_nTimingMinutes ) )
  2605. {
  2606. g_nTimingSendFinished = 0;
  2607. }
  2608. }
  2609. #endif
  2610. }while( WaitForSingleObject( g_hRunObject, 1250L ) == WAIT_TIMEOUT );
  2611. for( it_tel = list_tel.begin(), it_mobile = list_mobile.begin(), it_fax = list_fax.begin(), it_email = list_email.begin();
  2612. it_tel != list_tel.end(), it_mobile != list_mobile.end(), it_fax != list_fax.end(), it_email != list_email.end(); )
  2613. {
  2614. list_tel.erase(it_tel++);
  2615. list_mobile.erase(it_mobile++);
  2616. list_fax.erase(it_fax++);
  2617. list_email.erase(it_email++);
  2618. }
  2619. return 0;
  2620. }
  2621. DWORD WINAPI VoiceNoticeThreadProc(void *pPara)
  2622. {
  2623. do
  2624. {
  2625. // 循环所有设备
  2626. int nDeviceSize = g_pDevicesManager->m_Devices.GetSize();
  2627. for( int i = 0; i < nDeviceSize; i++ )
  2628. {
  2629. CDevice *pDev = g_pDevicesManager->m_Devices[i];
  2630. char chDllName[MAX_PATH] = {0};
  2631. strcpy(chDllName, (char *)(LPCTSTR)pDev->m_strProtocoldllname);
  2632. StrLower(chDllName,chDllName);
  2633. char szIniName[MAX_PATH] = {0};
  2634. strcpy(szIniName, (char *)(LPCTSTR)pDev->m_strIniName);
  2635. StrLower(szIniName, szIniName);
  2636. char szUid[MAX_PATH] = {0};
  2637. strcpy(szUid, (char *)(LPCTSTR)pDev->m_strUid);
  2638. StrLower(szUid, szUid);
  2639. char szPort[MAX_PATH] = {0};
  2640. CString strPort;
  2641. strPort.Format("%d", pDev->m_iPort);
  2642. strcpy(szPort, (char *)(LPCTSTR)strPort);
  2643. StrLower(szPort, szPort);
  2644. // 循环所有变量
  2645. int nVarSize = pDev->m_Vars.GetSize();
  2646. for( int j = 0; j < nVarSize; j++ )
  2647. {
  2648. CBaseVar *pBaseVar = pDev->m_Vars[j];
  2649. CString strTime;
  2650. CTime tm;
  2651. tm = CTime::GetCurrentTime();
  2652. strTime = tm.Format("%Y-%m-%d %H:%M:%S");
  2653. int iIndex = 0;
  2654. // 变量的正常范围
  2655. if( pBaseVar->m_nVarTypeID != SNMP_NPM_TYPE &&
  2656. pBaseVar->m_nVarTypeID != SNMP_STRING_ID )
  2657. {
  2658. if( (int)pBaseVar->m_dbData < pBaseVar->m_nReserved2 ||
  2659. (int)pBaseVar->m_dbData > pBaseVar->m_nReserved3 )
  2660. {
  2661. Sleep(1);
  2662. continue;
  2663. }
  2664. }
  2665. #if 0
  2666. if( 1 == g_nSnmpEnable )
  2667. {
  2668. if( 0 == pBaseVar->m_dwCollectTick )
  2669. {
  2670. CString strSetValue;
  2671. strSetValue.Format("%.1f", pBaseVar->m_dbData);
  2672. CString strObjID;
  2673. strObjID.Format("%s.%d", g_strSnmpObjOid, pBaseVar->m_nVarID);
  2674. pSnmpDllSetValue(
  2675. g_strSnmpIP,
  2676. g_strSnmpField,
  2677. (char *)(LPCTSTR)strObjID,
  2678. "str",
  2679. 1,
  2680. 300,
  2681. (char *)(LPCTSTR)strSetValue
  2682. );
  2683. }
  2684. }
  2685. #endif
  2686. DWORD iTickCount = GetTickCount();
  2687. if( TRUE == pBaseVar->m_bIsChange )
  2688. {
  2689. g_pServerSocket[1]->AutoSendDataToAllClient( pBaseVar );
  2690. if( TRUE == pBaseVar->m_bRealTimeflag )
  2691. {
  2692. CDBInterface::GetInstancePtr()->EditSummaryRecord(
  2693. (char *)(LPCTSTR)pDev->m_strDeviceName, // 设备名称
  2694. (char *)(LPCTSTR)strTime, // 发生时间
  2695. "", // 备注
  2696. (char *)(LPCTSTR)pBaseVar->m_strDesc, // 变量描述
  2697. pBaseVar->m_dbData, // 变量值
  2698. (char *)(LPCTSTR)pDev->m_strUid, // 设备Uid
  2699. (char *)(LPCTSTR)pBaseVar->m_strName); // 变量名称
  2700. EnterCriticalSection( &g_csRtuReadOneData );
  2701. pBaseVar->m_bIsChange = FALSE;
  2702. LeaveCriticalSection( &g_csRtuReadOneData );
  2703. }
  2704. if( TRUE == pBaseVar->m_bIsSave )
  2705. {
  2706. WriteSummaryLog(
  2707. (char *)(LPCTSTR)pDev->m_strDeviceName, // 设备名称
  2708. (char *)(LPCTSTR)strTime, // 发生时间
  2709. "", // 备注
  2710. 0, // 现没有用到
  2711. (char *)(LPCTSTR)pBaseVar->m_strDesc, // 变量描述
  2712. pBaseVar->m_dbData, // 变量值
  2713. (char *)(LPCTSTR)pDev->m_strUid, // 设备Uid
  2714. (char *)(LPCTSTR)pBaseVar->m_strName); // 变量名称
  2715. }
  2716. }
  2717. else if ((( iTickCount - pBaseVar->m_dwCollectTick) > pBaseVar->m_nCollectFreq * 1000) && pBaseVar->m_bIsSave )
  2718. {
  2719. if( TRUE == pBaseVar->m_bRealTimeflag )
  2720. {
  2721. CDBInterface::GetInstancePtr()->EditSummaryRecord(
  2722. (char *)(LPCTSTR)pDev->m_strDeviceName, // 设备名称
  2723. (char *)(LPCTSTR)strTime, // 发生时间
  2724. "", // 备注
  2725. (char *)(LPCTSTR)pBaseVar->m_strDesc, // 变量描述
  2726. pBaseVar->m_dbData, // 变量值
  2727. (char *)(LPCTSTR)pDev->m_strUid, // 设备Uid
  2728. (char *)(LPCTSTR)pBaseVar->m_strName); // 变量名称
  2729. }
  2730. if( TRUE == pBaseVar->m_bIsSave )
  2731. {
  2732. WriteSummaryLog(
  2733. (char *)(LPCTSTR)pDev->m_strDeviceName, // 设备名称
  2734. (char *)(LPCTSTR)strTime, // 发生时间
  2735. "", // 备注
  2736. 0, // 现没有用到
  2737. (char *)(LPCTSTR)pBaseVar->m_strDesc, // 变量描述
  2738. pBaseVar->m_dbData, // 变量值
  2739. (char *)(LPCTSTR)pDev->m_strUid, // 设备Uid
  2740. (char *)(LPCTSTR)pBaseVar->m_strName); // 变量名称
  2741. EnterCriticalSection(&g_csRtuReadOneData);
  2742. pBaseVar->m_dwCollectTick = GetTickCount();
  2743. LeaveCriticalSection(&g_csRtuReadOneData);
  2744. }
  2745. }
  2746. if( pBaseVar->m_bReserved2 == TRUE )
  2747. {
  2748. VarAlarmNotice(pDev, pBaseVar);
  2749. }
  2750. }
  2751. }
  2752. }while( WaitForSingleObject( g_hRunObject, 5L ) == WAIT_TIMEOUT );
  2753. return 0;
  2754. }
  2755. DWORD WINAPI OutputThreadProc(void *pPara)
  2756. {
  2757. CString strClock, strTh;
  2758. strClock.Format("%s", g_strOutputClock);
  2759. strTh.Format("%s", g_strOutputFileName);
  2760. //LOG4C((LOG_NOTICE, "%s", strClock));
  2761. //LOG4C((LOG_NOTICE, "%s", strTh));
  2762. CStdioFile fClock;
  2763. CStdioFile fTh;
  2764. bool bfClockResult = false;
  2765. bool bfThResult = false;
  2766. bfClockResult = fClock.Open(strClock, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite);
  2767. bfThResult = fTh.Open(strTh, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite);
  2768. do
  2769. {
  2770. CString strTime;
  2771. CTime tm;
  2772. tm = CTime::GetCurrentTime();
  2773. strTime = tm.Format("%H:%M");
  2774. strTime += "\n";
  2775. if( bfClockResult )
  2776. {
  2777. //fClock.SetLength(0);
  2778. fClock.SeekToBegin();
  2779. fClock.Write(strTime.GetBuffer(), strTime.GetLength());
  2780. }
  2781. if( false == bfThResult )
  2782. {
  2783. Sleep(10);
  2784. continue;
  2785. }
  2786. int iDeviceIndex = -1, iVarIndex = -1;
  2787. char szVarName[MAX_UID + 1] = {0};
  2788. int iSeekPos = 0;
  2789. fTh.SeekToBegin();
  2790. for( int iLineIndex1 = 0; iLineIndex1 < g_nOutputLineCount1; iLineIndex1++ )
  2791. {
  2792. SplitStr(g_strOutputLine1, ',', iLineIndex1, szVarName);
  2793. BOOL bFind = FindVar( g_strOutputLineUid1, szVarName, iDeviceIndex, iVarIndex );
  2794. if( bFind )
  2795. {
  2796. CDevice *pDev = g_pDevicesManager->m_Devices[iDeviceIndex];
  2797. CBaseVar *pBaseVar = pDev->m_Vars[iVarIndex];
  2798. CString strVarData;
  2799. if( 0 == iLineIndex1 )
  2800. {
  2801. strVarData.Format("%.1f ", pBaseVar->m_dbData);
  2802. fTh.Write(strVarData, strVarData.GetLength());
  2803. }
  2804. else if( 1 == iLineIndex1 )
  2805. {
  2806. strVarData.Format("%.1f%s \r\n", pBaseVar->m_dbData, pBaseVar->m_strUnit);
  2807. fTh.Write(strVarData, strVarData.GetLength());
  2808. }
  2809. iSeekPos += strVarData.GetLength();
  2810. }
  2811. }
  2812. for( int iLineIndex2 = 0; iLineIndex2 < g_nOutputLineCount2; iLineIndex2++ )
  2813. {
  2814. SplitStr(g_strOutputLine2, ',', iLineIndex2, szVarName);
  2815. BOOL bFind = FindVar( g_strOutputLineUid2, szVarName, iDeviceIndex, iVarIndex );
  2816. if( bFind )
  2817. {
  2818. CDevice *pDev = g_pDevicesManager->m_Devices[iDeviceIndex];
  2819. CBaseVar *pBaseVar = pDev->m_Vars[iVarIndex];
  2820. CString strVarData;
  2821. if( 0 == iLineIndex2 )
  2822. {
  2823. strVarData.Format("%.1f ", pBaseVar->m_dbData);
  2824. fTh.Write(strVarData, strVarData.GetLength());
  2825. }
  2826. else if( 1 == iLineIndex2 )
  2827. {
  2828. strVarData.Format("%.1f%s \r\n", pBaseVar->m_dbData, pBaseVar->m_strUnit);
  2829. fTh.Write(strVarData, strVarData.GetLength());
  2830. }
  2831. iSeekPos += strVarData.GetLength();
  2832. }
  2833. }
  2834. for( int iLineIndex3 = 0; iLineIndex3 < g_nOutputLineCount3; iLineIndex3++ )
  2835. {
  2836. SplitStr(g_strOutputLine3, ',', iLineIndex3, szVarName);
  2837. BOOL bFind = FindVar( g_strOutputLineUid3, szVarName, iDeviceIndex, iVarIndex );
  2838. if( bFind )
  2839. {
  2840. CDevice *pDev = g_pDevicesManager->m_Devices[iDeviceIndex];
  2841. CBaseVar *pBaseVar = pDev->m_Vars[iVarIndex];
  2842. CString strVarData;
  2843. if( 0 == iLineIndex3 )
  2844. {
  2845. strVarData.Format("%.1f ", pBaseVar->m_dbData);
  2846. fTh.Write(strVarData, strVarData.GetLength());
  2847. }
  2848. else if( 1 == iLineIndex3 )
  2849. {
  2850. strVarData.Format("%.1f%s \r\n", pBaseVar->m_dbData, pBaseVar->m_strUnit);
  2851. fTh.Write(strVarData, strVarData.GetLength());
  2852. }
  2853. iSeekPos += strVarData.GetLength();
  2854. }
  2855. }
  2856. }while( WaitForSingleObject( g_hRunObject, 100L ) == WAIT_TIMEOUT );
  2857. if( bfClockResult )
  2858. {
  2859. fClock.Close();
  2860. }
  2861. if( bfThResult )
  2862. {
  2863. fTh.Close();
  2864. }
  2865. return 0;
  2866. }
  2867. DWORD WINAPI GetDatePlanThreadProc(void *pPara)
  2868. {
  2869. do
  2870. {
  2871. static int nStaticHours = -1;
  2872. CTime time = CTime::GetCurrentTime();
  2873. int nHours = time.GetHour();
  2874. if( nStaticHours!=nHours )
  2875. {
  2876. LOG4C((LOG_NOTICE, _T("GetDatePlanThreadProc")));
  2877. nStaticHours = nHours;
  2878. // 循环所有设备
  2879. int nDeviceSize = g_pDevicesManager->m_Devices.GetSize();
  2880. for( int i = 0; i < nDeviceSize; i++ )
  2881. {
  2882. CDevice *pDev = g_pDevicesManager->m_Devices[i];
  2883. // 循环所有变量
  2884. int nVarSize = pDev->m_Vars.GetSize();
  2885. for( int j = 0; j < nVarSize; j++ )
  2886. {
  2887. CBaseVar *pBaseVar = pDev->m_Vars[j];
  2888. EnterCriticalSection(&g_csRtuReadOneData);
  2889. pBaseVar->m_bExistDatePlan = CDBInterface::GetInstancePtr()->IsExistDatePlan((char *)(LPCTSTR)pDev->m_strUid, pBaseVar->m_nVarID);
  2890. LeaveCriticalSection(&g_csRtuReadOneData);
  2891. }
  2892. }
  2893. }
  2894. }while( WaitForSingleObject( g_hRunObject, 10 * 1000L ) == WAIT_TIMEOUT );
  2895. return 0;
  2896. }
  2897. BOOL FindRtuCommPort(CString strPort)
  2898. {
  2899. BOOL bResult = FALSE;
  2900. for( int i = RTU_THREAD_START; i < g_nRtuThreadIndex; i++ )
  2901. {
  2902. if( g_strPort[i].Compare(strPort) == 0 )
  2903. {
  2904. bResult = TRUE;
  2905. break;
  2906. }
  2907. }
  2908. return bResult;
  2909. }
  2910. BOOL FindAscCommPort(CString strPort)
  2911. {
  2912. BOOL bResult = FALSE;
  2913. for( int i = ASC_THREAD_START; i < g_nAscThreadIndex; i++ )
  2914. {
  2915. if( g_strPort[i].Compare(strPort) == 0 )
  2916. {
  2917. bResult = TRUE;
  2918. break;
  2919. }
  2920. }
  2921. return bResult;
  2922. }
  2923. BOOL FindTcpCommPort(CString strPort)
  2924. {
  2925. BOOL bResult = FALSE;
  2926. for( int i = TCP_THREAD_START; i < g_nTcpThreadIndex; i++ )
  2927. {
  2928. if( g_strPort[i].Compare(strPort) == 0 )
  2929. {
  2930. bResult = TRUE;
  2931. break;
  2932. }
  2933. }
  2934. return bResult;
  2935. }
  2936. BOOL FindMostDeviceCommPort(CString strPort)
  2937. {
  2938. BOOL bResult = FALSE;
  2939. for( int i = MOSTDEVICE_THREAD_START; i < g_nMostDeviceIndex; i++ )
  2940. {
  2941. if( g_strPort[i].Compare(strPort) == 0 )
  2942. {
  2943. bResult = TRUE;
  2944. break;
  2945. }
  2946. }
  2947. return bResult;
  2948. }
  2949. BOOL FindIcpdasCommPort(CString strPort)
  2950. {
  2951. BOOL bResult = FALSE;
  2952. for( int i = ICPDAS_THREAD_START; i < g_nIcpdasIndex; i++ )
  2953. {
  2954. if( g_strPort[i].Compare(strPort) == 0 )
  2955. {
  2956. bResult = TRUE;
  2957. break;
  2958. }
  2959. }
  2960. return bResult;
  2961. }
  2962. BOOL FindParadigmCommPort(CString strPort)
  2963. {
  2964. BOOL bResult = FALSE;
  2965. for( int i = PARADIGM_THREAD_START; i < g_nParadigmIndex; i++ )
  2966. {
  2967. if( g_strPort[i].Compare(strPort) == 0 )
  2968. {
  2969. bResult = TRUE;
  2970. break;
  2971. }
  2972. }
  2973. return bResult;
  2974. }
  2975. BOOL FindStulzCommPort(CString strPort)
  2976. {
  2977. BOOL bResult = FALSE;
  2978. for( int i = STULZ_THREAD_START; i < g_nStulzIndex; i++ )
  2979. {
  2980. if( g_strPort[i].Compare(strPort) == 0 )
  2981. {
  2982. bResult = TRUE;
  2983. break;
  2984. }
  2985. }
  2986. return bResult;
  2987. }
  2988. BOOL FindDaiKinCommPort(CString strPort)
  2989. {
  2990. BOOL bResult = FALSE;
  2991. for( int i = DAIKIN_THREAD_START; i < g_nDaiKinIndex; i++ )
  2992. {
  2993. if( g_strPort[i].Compare(strPort) == 0 )
  2994. {
  2995. bResult = TRUE;
  2996. break;
  2997. }
  2998. }
  2999. return bResult;
  3000. }
  3001. BOOL FindPowerwareCommPort(CString strPort)
  3002. {
  3003. BOOL bResult = FALSE;
  3004. for( int i = POWERWARE_THREAD_START; i < g_nPowerwareIndex; i++ )
  3005. {
  3006. if( g_strPort[i].Compare(strPort) == 0 )
  3007. {
  3008. bResult = TRUE;
  3009. break;
  3010. }
  3011. }
  3012. return bResult;
  3013. }
  3014. BOOL FindGreeCommPort(CString strPort)
  3015. {
  3016. BOOL bResult = FALSE;
  3017. for( int i = GREE_THREAD_START; i < g_nGreeIndex; i++ )
  3018. {
  3019. if( g_strPort[i].Compare(strPort) == 0 )
  3020. {
  3021. bResult = TRUE;
  3022. break;
  3023. }
  3024. }
  3025. return bResult;
  3026. }
  3027. BOOL FindCarelCommPort(CString strPort)
  3028. {
  3029. BOOL bResult = FALSE;
  3030. for( int i = CAREL_THREAD_START; i < g_nCarelIndex; i++ )
  3031. {
  3032. if( g_strPort[i].Compare(strPort) == 0 )
  3033. {
  3034. bResult = TRUE;
  3035. break;
  3036. }
  3037. }
  3038. return bResult;
  3039. }
  3040. BOOL FindScanTakCommPort(CString strPort)
  3041. {
  3042. BOOL bResult = FALSE;
  3043. for( int i = SCANTAK_THREAD_START; i < g_nScantakIndex; i++ )
  3044. {
  3045. if( g_strPort[i].Compare(strPort) == 0 )
  3046. {
  3047. bResult = TRUE;
  3048. break;
  3049. }
  3050. }
  3051. return bResult;
  3052. }
  3053. BOOL FindDeltaCommPort(CString strPort)
  3054. {
  3055. BOOL bResult = FALSE;
  3056. for( int i = DELTA_THREAD_START; i < g_nDeltaIndex; i++ )
  3057. {
  3058. if( g_strPort[i].Compare(strPort) == 0 )
  3059. {
  3060. bResult = TRUE;
  3061. break;
  3062. }
  3063. }
  3064. return bResult;
  3065. }
  3066. // 获取实际波特率
  3067. INT GetCommRate(int nRate)
  3068. {
  3069. int nBaudRate = 9600;
  3070. switch( nRate )
  3071. {
  3072. case 0:
  3073. nBaudRate = 1200;
  3074. break;
  3075. case 1:
  3076. nBaudRate = 2400;
  3077. break;
  3078. case 2:
  3079. nBaudRate = 4800;
  3080. break;
  3081. case 3:
  3082. nBaudRate = 9600;
  3083. break;
  3084. case 4:
  3085. nBaudRate = 14400;
  3086. break;
  3087. case 5:
  3088. nBaudRate = 19200;
  3089. break;
  3090. case 6:
  3091. nBaudRate = 38400;
  3092. break;
  3093. case 7:
  3094. nBaudRate = 57600;
  3095. break;
  3096. case 8:
  3097. nBaudRate = 115200;
  3098. break;
  3099. case 9:
  3100. nBaudRate = 128000;
  3101. break;
  3102. case 10:
  3103. nBaudRate = 256000;
  3104. break;
  3105. }
  3106. return nBaudRate;
  3107. }
  3108. // 获取实际数据位
  3109. INT GetCommDataBit(int nDataBitIndex)
  3110. {
  3111. int nDataBit = 8;
  3112. switch( nDataBitIndex )
  3113. {
  3114. case 0:
  3115. nDataBit = 7;
  3116. break;
  3117. case 1:
  3118. nDataBit = 8;
  3119. break;
  3120. }
  3121. return nDataBit;
  3122. }