CDSCtlrF.cpp 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284
  1. //---------------------------------------------------------------------------
  2. #include <DateUtils.hpp>
  3. #pragma hdrstop
  4. #include "CDSCtlrF.h"
  5. #include "VMSCommLibF.h"
  6. //---------------------------------------------------------------------------
  7. #define MEMMOVE(x) memmove(x+1, x, sizeof(x)-sizeof(x[0]))
  8. #define MEMZERO(x) memset((char *)&x[0], 0x00, sizeof(x[0]))
  9. //---------------------------------------------------------------------------
  10. #pragma package(smart_init)
  11. String g_sMerge = "MERGE INTO TB_VMS_CTLR_STTS L \r\n"
  12. "USING (SELECT :p01 AS VMS_CTLR_NMBR, \r\n"
  13. " :p02 AS UPDT_DT, \r\n"
  14. " :p03 AS CMNC_STTS_CD, \r\n"
  15. " :p04 AS PWER_STTS_CD, \r\n"
  16. " :p05 AS MODL_STTS_CD, \r\n"
  17. " :p06 AS CBOX_DOOR_STTS_CD, \r\n"
  18. " :p07 AS FAN_STTS_CD, \r\n"
  19. " :p08 AS HETR_STTS_CD, \r\n"
  20. " :p09 AS CBOX_TMPR, \r\n"
  21. " :p10 AS BRGH_VAL, \r\n"
  22. " :p11 AS COMM_STTS_CD, \r\n"
  23. " :p12 AS MODL_STTS, \r\n"
  24. " :p13 AS PWER_STTS \r\n"
  25. " FROM DUAL) M \r\n"
  26. " ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR) \r\n"
  27. "WHEN MATCHED THEN \r\n"
  28. " UPDATE SET L.UPDT_DT = M.UPDT_DT, \r\n"
  29. " L.CMNC_STTS_CD = M.CMNC_STTS_CD, \r\n"
  30. " L.PWER_STTS_CD = M.PWER_STTS_CD, \r\n"
  31. " L.MODL_STTS_CD = M.MODL_STTS_CD, \r\n"
  32. " L.CBOX_DOOR_STTS_CD = M.CBOX_DOOR_STTS_CD, \r\n"
  33. " L.FAN_STTS_CD = M.FAN_STTS_CD, \r\n"
  34. " L.HETR_STTS_CD = M.HETR_STTS_CD, \r\n"
  35. " L.CBOX_TMPR = M.CBOX_TMPR, \r\n"
  36. " L.BRGH_VAL = M.BRGH_VAL, \r\n"
  37. " L.COMM_STTS_CD = M.COMM_STTS_CD, \r\n"
  38. " L.MODL_STTS = M.MODL_STTS, \r\n"
  39. " L.PWER_STTS = M.PWER_STTS \r\n"
  40. "WHEN NOT MATCHED THEN \r\n"
  41. " INSERT (VMS_CTLR_NMBR, \r\n"
  42. " UPDT_DT, \r\n"
  43. " CMNC_STTS_CD, \r\n"
  44. " PWER_STTS_CD, \r\n"
  45. " MODL_STTS_CD, \r\n"
  46. " CBOX_DOOR_STTS_CD, \r\n"
  47. " FAN_STTS_CD, \r\n"
  48. " HETR_STTS_CD, \r\n"
  49. " CBOX_TMPR, \r\n"
  50. " BRGH_VAL, \r\n"
  51. " COMM_STTS_CD, \r\n"
  52. " MODL_STTS, \r\n"
  53. " PWER_STTS ) \r\n"
  54. " VALUES (M.VMS_CTLR_NMBR, \r\n"
  55. " M.UPDT_DT, \r\n"
  56. " M.CMNC_STTS_CD, \r\n"
  57. " M.PWER_STTS_CD, \r\n"
  58. " M.MODL_STTS_CD, \r\n"
  59. " M.CBOX_DOOR_STTS_CD, \r\n"
  60. " M.FAN_STTS_CD, \r\n"
  61. " M.HETR_STTS_CD, \r\n"
  62. " M.CBOX_TMPR, \r\n"
  63. " M.BRGH_VAL, \r\n"
  64. " M.COMM_STTS_CD, \r\n"
  65. " M.MODL_STTS, \r\n"
  66. " M.PWER_STTS ) \r\n";
  67. String g_sUpdate= "UPDATE TB_VMS_CTLR_STTS \r\n"
  68. " SET UPDT_DT = :p02, \r\n"
  69. " CMNC_STTS_CD = :p03, \r\n"
  70. " PWER_STTS_CD = :p04, \r\n"
  71. " MODL_STTS_CD = :p05, \r\n"
  72. " CBOX_DOOR_STTS_CD = :p06, \r\n"
  73. " FAN_STTS_CD = :p07, \r\n"
  74. " HETR_STTS_CD = :p08, \r\n"
  75. " CBOX_TMPR = :p09, \r\n"
  76. " BRGH_VAL = :p10, \r\n"
  77. " COMM_STTS_CD = :p11, \r\n"
  78. " MODL_STTS = :p12, \r\n"
  79. " PWER_STTS = :p13 \r\n"
  80. " WHERE VMS_CTLR_NMBR = :p01 \r\n";
  81. //---------------------------------------------------------------------------
  82. TCDSCtlr::TCDSCtlr()
  83. {
  84. InitializeCriticalSection(&FCS);
  85. pPackQueue = new TThreadList();
  86. FDispLog = false;
  87. FSLog = NULL;
  88. FCLog = NULL;
  89. FSession = NULL;
  90. Server.Init();
  91. Client.Init();
  92. dwConnectCnt = 0;
  93. //LOGIN_IPADDR = "";
  94. }
  95. //---------------------------------------------------------------------------
  96. TCDSCtlr::~TCDSCtlr()
  97. {
  98. SAFE_DELETE(pPackQueue); /* 패킷 버퍼 */
  99. SAFE_DELETE(FSLog);
  100. SAFE_DELETE(FCLog);
  101. DeleteCriticalSection(&FCS);
  102. }
  103. //---------------------------------------------------------------------------
  104. void TCDSCtlr::Lock()
  105. {
  106. EnterCriticalSection(&FCS);
  107. }
  108. //---------------------------------------------------------------------------
  109. void TCDSCtlr::UnLock()
  110. {
  111. LeaveCriticalSection(&FCS);
  112. }
  113. //---------------------------------------------------------------------------
  114. void TCDSCtlr::InitCtrlMode()
  115. {
  116. VMS_CONTROL_MODE *AInfo = CTRLMODE;
  117. AInfo->SaveFlag = true;
  118. AInfo->pTimer = Now();
  119. }
  120. //---------------------------------------------------------------------------
  121. void TCDSCtlr::InitEVehicle()
  122. {
  123. VMS_EVEHICLE_INFO *AInfo = EVEHICLE;
  124. AInfo->Count = 0;
  125. for (int ii = 0; ii < VMS_MAX_EVEHICLE; ii++)
  126. {
  127. AInfo->Unit[ii].SRVC_ID = "";
  128. AInfo->Unit[ii].IXR_CNT = 0;
  129. AInfo->Unit[ii].SRVC_TM = "";
  130. AInfo->Unit[ii].END_YN = "";
  131. }
  132. }
  133. //---------------------------------------------------------------------------
  134. void TCDSCtlr::InitEvent()
  135. {
  136. VMS_EVENT_INFO *AInfo = EVENT;
  137. AInfo->Count = 0;
  138. for (int ii = 0; ii < VMS_MAX_EVENT; ii++)
  139. {
  140. AInfo->Unit[ii].LINK_ID = "";
  141. AInfo->Unit[ii].IFSC_ID = "";
  142. AInfo->Unit[ii].VMS_IFSC_ID = "";
  143. AInfo->Unit[ii].VMS_IFSC_NM = "";
  144. AInfo->Unit[ii].DSPL_STRT_NODE_NM = "";
  145. AInfo->Unit[ii].DSPL_END_NODE_NM = "";
  146. AInfo->Unit[ii].DETR_ID = "";
  147. AInfo->Unit[ii].DSPL_PRRT = "";
  148. AInfo->Unit[ii].INCD_OCRR_ID = "";
  149. AInfo->Unit[ii].STRT_LCTN_NM = "";
  150. AInfo->Unit[ii].END_LCTN_NM = "";
  151. AInfo->Unit[ii].OCRR_LCTN_NM = "";
  152. AInfo->Unit[ii].VMS_INCD_TYPE_NM = "";
  153. AInfo->Unit[ii].VMS_INCD_TYPE_CD = "";
  154. AInfo->Unit[ii].VMS_INCD_DETL_NM = "";
  155. AInfo->Unit[ii].VMS_INCD_DETL_TYPE_CD = "";
  156. AInfo->Unit[ii].CMTR_GRAD_NM = "";
  157. AInfo->Unit[ii].CMTR_GRAD_CD = "";
  158. AInfo->Unit[ii].INCD_CLSR_LANE = "";
  159. AInfo->Unit[ii].INCD_STRT_DT = "";
  160. AInfo->Unit[ii].INCD_END_PRAR_DT = "";
  161. }
  162. }
  163. //---------------------------------------------------------------------------
  164. void TCDSCtlr::InitIncident()
  165. {
  166. VMS_EVENT_INFO *AInfo = INCIDENT;
  167. AInfo->Count = 0;
  168. for (int ii = 0; ii < VMS_MAX_EVENT; ii++)
  169. {
  170. AInfo->Unit[ii].LINK_ID = "";
  171. AInfo->Unit[ii].IFSC_ID = "";
  172. AInfo->Unit[ii].VMS_IFSC_ID = "";
  173. AInfo->Unit[ii].VMS_IFSC_NM = "";
  174. AInfo->Unit[ii].DSPL_STRT_NODE_NM = "";
  175. AInfo->Unit[ii].DSPL_END_NODE_NM = "";
  176. AInfo->Unit[ii].DETR_ID = "";
  177. AInfo->Unit[ii].DSPL_PRRT = "";
  178. AInfo->Unit[ii].INCD_OCRR_ID = "";
  179. AInfo->Unit[ii].STRT_LCTN_NM = "";
  180. AInfo->Unit[ii].END_LCTN_NM = "";
  181. AInfo->Unit[ii].OCRR_LCTN_NM = "";
  182. AInfo->Unit[ii].VMS_INCD_TYPE_NM = "";
  183. AInfo->Unit[ii].VMS_INCD_TYPE_CD = "";
  184. AInfo->Unit[ii].VMS_INCD_DETL_NM = "";
  185. AInfo->Unit[ii].VMS_INCD_DETL_TYPE_CD = "";
  186. AInfo->Unit[ii].CMTR_GRAD_NM = "";
  187. AInfo->Unit[ii].CMTR_GRAD_CD = "";
  188. AInfo->Unit[ii].INCD_CLSR_LANE = "";
  189. AInfo->Unit[ii].INCD_STRT_DT = "";
  190. AInfo->Unit[ii].INCD_END_PRAR_DT = "";
  191. }
  192. }
  193. //---------------------------------------------------------------------------
  194. void TCDSCtlr::InitSchedule()
  195. {
  196. IsEVehIngForm = false;
  197. IsEVehEndForm = false;
  198. VMS_SCHEDULE_INFO *AInfo = SCHEDULE;
  199. AInfo->Count = 0;
  200. for (int ii = 0; ii < VMS_MAX_SCHEDULE; ii++)
  201. {
  202. AInfo->Unit[ii].VMS_SCH_TYPE = "";
  203. AInfo->Unit[ii].VMS_SCH_FORM_TYPE = 0;
  204. AInfo->Unit[ii].PHASE = 0;
  205. AInfo->Unit[ii].VMS_FORM_ID = "";
  206. AInfo->Unit[ii].FRST_VMS_IFSC_ID = "";
  207. AInfo->Unit[ii].SECD_VMS_IFSC_ID = "";
  208. AInfo->Unit[ii].THIR_VMS_IFSC_ID = "";
  209. AInfo->Unit[ii].FOUR_VMS_IFSC_ID = "";
  210. AInfo->Unit[ii].FRST_IMG_IFSC_ID = "";
  211. AInfo->Unit[ii].SECD_IMG_IFSC_ID = "";
  212. AInfo->Unit[ii].THIR_IMG_IFSC_ID = "";
  213. AInfo->Unit[ii].FOUR_IMG_IFSC_ID = "";
  214. AInfo->Unit[ii].DSPL_HH = 0;
  215. AInfo->Unit[ii].VMS_IFSC_ID = "";
  216. AInfo->Unit[ii].DSPL_CNGS_YN = true;
  217. AInfo->Unit[ii].EVENT = NULL;
  218. }
  219. }
  220. //---------------------------------------------------------------------------
  221. void TCDSCtlr::InitDownLoadInfo()
  222. {
  223. VMS_DOWNLOAD_INFO *AInfo = DOWNLOAD;
  224. AInfo->Enable = vms_download_disable;
  225. AInfo->SaveFlag = true;
  226. AInfo->dTimer = Now();
  227. AInfo->Count = 0;
  228. }
  229. //---------------------------------------------------------------------------
  230. bool TCDSCtlr::ChangedState(INT_VMS_STATE *DSTATE, INT_VMS_STATE *RSTATE)
  231. {
  232. if (DSTATE->OprMode != RSTATE->OprMode) return true;
  233. //if (DSTATE->Comm != RSTATE->Comm) return true;
  234. if (DSTATE->Wcomm != RSTATE->Wcomm) return true;
  235. if (DSTATE->DoorStatus != RSTATE->DoorStatus) return true;
  236. if (DSTATE->ModulePowerStatus != RSTATE->ModulePowerStatus) return true;
  237. if (DSTATE->BodyTemp != RSTATE->BodyTemp) return true;
  238. if (DSTATE->LuminanceStatus != RSTATE->LuminanceStatus) return true;
  239. if (DSTATE->FanStatus != RSTATE->FanStatus) return true;
  240. if (DSTATE->HeaterStatus != RSTATE->HeaterStatus) return true;
  241. if (DSTATE->ExternalLightStatus != RSTATE->ExternalLightStatus) return true;
  242. if (DSTATE->AlarmLightStatus != RSTATE->AlarmLightStatus) return true;
  243. if (DSTATE->SpeakerStatus != RSTATE->SpeakerStatus) return true;
  244. //if (!memcmp(DSTATE->ControllerCurrentTime, RSTATE->ControllerCurrentTime, INT_VMS_MAX_DATETIME)) return true;
  245. if (DSTATE->Voltage != RSTATE->Voltage) return true;
  246. if (DSTATE->ModuleState != RSTATE->ModuleState) return true;
  247. if (DSTATE->ModuleVertical != RSTATE->ModuleVertical) return true;
  248. if (DSTATE->ModuleHorizontal != RSTATE->ModuleHorizontal) return true;
  249. if (memcmp(DSTATE->ModuleStatus, RSTATE->ModuleStatus, INT_VMS_MAX_MODULE_BIT)) return true;
  250. if (DSTATE->PowerCount != RSTATE->PowerCount) return true;
  251. if (memcmp(DSTATE->PowerStatus, RSTATE->PowerStatus, INT_VMS_MAX_POWER_BIT)) return true;
  252. if (DSTATE->ScheduledMessageOperatingTime != RSTATE->ScheduledMessageOperatingTime) return true;
  253. if (DSTATE->ModuleOperatingTemperature != RSTATE->ModuleOperatingTemperature) return true;
  254. if (DSTATE->FanOperatingTemperature != RSTATE->FanOperatingTemperature) return true;
  255. if (DSTATE->HeaterOperatingTemperature != RSTATE->HeaterOperatingTemperature) return true;
  256. if (DSTATE->ExternalLightOperatingLuminance != RSTATE->ExternalLightOperatingLuminance) return true;
  257. if (DSTATE->ModuleBasicFailureRate != RSTATE->ModuleBasicFailureRate) return true;
  258. if (DSTATE->MaximumRetry != RSTATE->MaximumRetry) return true;
  259. if (DSTATE->ResponseTimeOut != RSTATE->ResponseTimeOut) return true;
  260. if (DSTATE->BlinkingCycleTime != RSTATE->BlinkingCycleTime) return true;
  261. return false;
  262. }
  263. //---------------------------------------------------------------------------
  264. void TCDSCtlr::InitDownloadFileInfo()
  265. {
  266. memset((char*)&FormDownload, 0x00, sizeof(VMS_DOWNLOAD_DATA));
  267. FOR_STL(TDownloadForm*, pInfo, FDownloadLists)
  268. {
  269. pInfo->AlreadyDownload = false; // 최초 접속시 모든 폼을 다운로드 할 수 있도록 플래그를 설정
  270. }
  271. }
  272. //---------------------------------------------------------------------------
  273. //---------------------------------------------------------------------------
  274. TCDSCtlrManager *CDSCtlrManager = NULL;
  275. //---------------------------------------------------------------------------
  276. TCDSCtlrManager::TCDSCtlrManager()
  277. {
  278. Total = 0;
  279. Error = 0;
  280. Normal = 0;
  281. Module = 0;
  282. FCtlrStts5Min = -1;
  283. }
  284. //---------------------------------------------------------------------------
  285. TCDSCtlrManager::~TCDSCtlrManager()
  286. {
  287. FLists.RemoveAll();
  288. }
  289. //---------------------------------------------------------------------------
  290. int TCDSCtlrManager::LoadCtlrInfo(TADOConnection *ADbConn)
  291. {
  292. String sQry;
  293. TADOQuery *pADO = NULL;
  294. DWORD dwTick = GetTickCount();
  295. SELSTART;
  296. sQry = "SELECT A.*, \r\n"
  297. " B.VMS_WDTH, B.VMS_HGHT, \r\n"
  298. " B.ROW_NUM, B.COL_NUM, \r\n"
  299. " B.MODL_ROW_NUM, B.MODL_COL_NUM, \r\n"
  300. " B.POWR_ROW_NUM, B.POWR_COL_NUM \r\n"
  301. " FROM TB_VMS_CTLR A, \r\n"
  302. " TB_VMS_TYPE B \r\n"
  303. " WHERE A.VMS_TYPE_CD = B.VMS_TYPE_CD \r\n"
  304. " AND A.DEL_YN = 'N' \r\n";
  305. BYTE OnOff;
  306. int nOnTime, nOffTime, nCurrTime;
  307. nCurrTime = Now().FormatString("hhnn").ToIntDef(0);
  308. try
  309. {
  310. CtlrItr it;
  311. for(it=FLists.FObjects.begin(); it != FLists.FObjects.end(); ++it)
  312. {
  313. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  314. pObj->Used = false;
  315. }
  316. FLists.Lock();
  317. try
  318. {
  319. pADO = new TADOQuery(NULL);
  320. pADO->Connection = ADbConn;
  321. SQLText(pADO, sQry, true);
  322. SQLOpen(pADO);
  323. for( ; !pADO->Eof; pADO->Next())
  324. {
  325. AnsiString CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
  326. TCDSCtlr* pObj = FLists.Find(CTLR_NMBR);
  327. if (!pObj)
  328. {
  329. pObj = new TCDSCtlr();
  330. pObj->CTLR_NMBR = CTLR_NMBR;
  331. pObj->CTLR_NMBR_ID.printf("%10.010d", pObj->CTLR_NMBR.ToIntDef(0));
  332. FLists.Push(pObj->CTLR_NMBR, pObj);
  333. }
  334. pObj->Used = true;
  335. memset((char*)&pObj->DSTATE, 0x00, sizeof(pObj->DSTATE));
  336. memset((char*)&pObj->RSTATE, 0x00, sizeof(pObj->RSTATE));
  337. pObj->CTLR_ID = pADO->FieldByName("VMS_CTLR_ID")->AsString.Trim();
  338. pObj->NM = pADO->FieldByName("VMS_NM")->AsString.Trim();
  339. pObj->CTLR_IP = pADO->FieldByName("VMS_CTLR_IP")->AsString.Trim();
  340. pObj->LOGIN_IPADDR = pObj->CTLR_IP;
  341. pObj->CTLR_PORT = pADO->FieldByName("VMS_CTLR_PORT")->AsInteger;
  342. pObj->GROUP_NO = 0;
  343. pObj->CTLR_LOCAL_NO = pADO->FieldByName("VMS_CTLR_LOCAL_NO")->AsInteger;
  344. pObj->TYPE_CD = pADO->FieldByName("VMS_TYPE_CD")->AsString.Trim();
  345. pObj->DEL_YN = pADO->FieldByName("DEL_YN")->AsString.Trim();
  346. pObj->WIDTH = pADO->FieldByName("VMS_WDTH")->AsString.Trim().ToIntDef(576);
  347. pObj->HEIGHT = pADO->FieldByName("VMS_HGHT")->AsString.Trim().ToIntDef(320);
  348. pObj->ROW_NUM = pADO->FieldByName("ROW_NUM")->AsInteger;
  349. pObj->COL_NUM = pADO->FieldByName("COL_NUM")->AsInteger;
  350. pObj->MODL_ROW_NUM = pADO->FieldByName("MODL_ROW_NUM")->AsInteger;
  351. pObj->MODL_COL_NUM = pADO->FieldByName("MODL_COL_NUM")->AsInteger;
  352. pObj->POWR_ROW_NUM = pADO->FieldByName("POWR_ROW_NUM")->AsInteger;
  353. pObj->POWR_COL_NUM = pADO->FieldByName("POWR_COL_NUM")->AsInteger;
  354. pObj->OPER_MODE = pADO->FieldByName("OPER_MODE")->AsString.Trim(); // N VARCHAR2(7) Y 'A' 운영 모드
  355. if (pObj->OPER_MODE != "A" && pObj->OPER_MODE != "F" && pObj->OPER_MODE != "B")
  356. {
  357. pObj->OPER_MODE = "A";
  358. }
  359. pObj->VMS_MAX_PHSE_NUM = pADO->FieldByName("VMS_MAX_PHSE_NUM")->AsInteger; // N NUMBER(2) Y 14 VMS 최대 표출면 개수
  360. pObj->DEF_PHSE_CHNG_CYCL = pADO->FieldByName("DEF_PHSE_CHNG_CYCL")->AsInteger; // N NUMBER(3) Y 5 기본메시지주기
  361. pObj->PANL_ON_TIME = pADO->FieldByName("PANL_ON_TIME")->AsString.Trim(); // N VARCHAR2(4) Y '0400' 전광판 ON TIME
  362. pObj->PANL_OFF_TIME = pADO->FieldByName("PANL_OFF_TIME")->AsString.Trim(); // N VARCHAR2(4) Y '0200' 전광판 OFF TIME
  363. if (pObj->PANL_ON_TIME == "9999" || pObj->PANL_ON_TIME.Length() != 4) pObj->PANL_ON_TIME = "0000";
  364. if (pObj->PANL_OFF_TIME == "9999" || pObj->PANL_OFF_TIME.Length() != 4) pObj->PANL_OFF_TIME = "0000";
  365. pObj->PANL_PWER_MODE = pADO->FieldByName("PANL_PWER_MODE")->AsInteger; // N NUMBER(3) Y 2 전광판 전원 모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
  366. pObj->FAN_MODE = pADO->FieldByName("FAN_MODE")->AsInteger; // N NUMBER(3) Y 2 FAN 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
  367. pObj->FAN_RUN_TMPR = pADO->FieldByName("FAN_RUN_TMPR")->AsInteger; // N NUMBER(3) Y 30 팬 동작 온도
  368. pObj->HETR_MODE = pADO->FieldByName("HETR_MODE")->AsInteger; // N NUMBER(3) Y 2 히터 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
  369. pObj->HETR_RUN_TMPR = pADO->FieldByName("HETR_RUN_TMPR")->AsInteger; // N NUMBER(3) Y 0 히터 동작 온도
  370. pObj->BRGH_MODE = pADO->FieldByName("BRGH_MODE")->AsInteger; // N NUMBER(3) Y 2 휘도 모드(0x00:주간,0x01:야간,0x00:자동,0x09:알수없음)
  371. pObj->BRGH_CURR_STEP = pADO->FieldByName("BRGH_CURR_STEP")->AsInteger; // N NUMBER(3) Y 40 휘도 현재 단계(0~100)
  372. pObj->BRGH_WEEK_STEP = pADO->FieldByName("BRGH_WEEK_STEP")->AsInteger; // N NUMBER(3) Y 64 휘도 주간 단계(0~100)
  373. pObj->BRGH_NGHT_STEP = pADO->FieldByName("BRGH_NGHT_STEP")->AsInteger; // N NUMBER(3) Y 48 휘도 야간 단계(0~100)
  374. pObj->OLD_PANL_PWER_MODE = pObj->PANL_PWER_MODE;
  375. pObj->OLD_FAN_MODE = pObj->FAN_MODE;
  376. pObj->OLD_FAN_RUN_TMPR = pObj->FAN_RUN_TMPR;
  377. pObj->OLD_HETR_MODE = pObj->HETR_MODE;
  378. pObj->OLD_HETR_RUN_TMPR = pObj->HETR_RUN_TMPR;
  379. pObj->OLD_BRGH_MODE = pObj->BRGH_MODE;
  380. pObj->OLD_BRGH_CURR_STEP = pObj->BRGH_CURR_STEP;
  381. pObj->OLD_BRGH_WEEK_STEP = pObj->BRGH_WEEK_STEP;
  382. pObj->OLD_BRGH_NGHT_STEP = pObj->BRGH_NGHT_STEP;
  383. pObj->MODL_ERR_RATE = pADO->FieldByName("MODL_ERR_RATE")->AsInteger; // N NUMBER(3) Y 10 VMS 모듈 오류 율
  384. pObj->CMNC_FAIL_RATE = pADO->FieldByName("CMNC_FAIL_RATE")->AsInteger; // N NUMBER(3) Y 60 VMS 통신 오류 기본 값
  385. pObj->PROTOCOL_VER = pADO->FieldByName("PROTOCOL_VER")->AsInteger;
  386. pObj->MODULE.PowerOnTime = Now().FormatString("yyyymmdd") + pObj->PANL_ON_TIME;
  387. pObj->MODULE.PowerOffTime = Now().FormatString("yyyymmdd") + pObj->PANL_OFF_TIME;
  388. pObj->MODULE.Retry = 0;
  389. OnOff = vms_req_board_power_on;
  390. nOnTime = pObj->PANL_ON_TIME.ToIntDef(0);
  391. nOffTime = pObj->PANL_OFF_TIME.ToIntDef(0);
  392. if (nOnTime != nOffTime)
  393. {
  394. if (nOnTime > nOffTime)
  395. {
  396. // 0100(off), 0500(on)
  397. if (nCurrTime >= nOffTime && nCurrTime < nOnTime)
  398. {
  399. OnOff = vms_req_board_power_off;
  400. }
  401. }
  402. else
  403. if (nOffTime > nOnTime)
  404. {
  405. // 2300(off), 0500(on)
  406. if (nCurrTime >= nOffTime || nCurrTime < nOnTime)
  407. {
  408. OnOff = vms_req_board_power_off;
  409. }
  410. }
  411. }
  412. pObj->MODULE.OnOff = OnOff;
  413. pObj->MODULE.IsOnOff = true;
  414. if (pObj->OPER_MODE == "A")
  415. pObj->DSTATE.OprMode = 'A';
  416. else
  417. if (pObj->OPER_MODE == "B")
  418. pObj->DSTATE.OprMode = 'B';
  419. else
  420. pObj->DSTATE.OprMode = 'F';
  421. pObj->DSTATE.ScheduledMessageOperatingTime = (short)pObj->DEF_PHSE_CHNG_CYCL; /* 필수 계획된 메시지의 동작시간(초) */
  422. pObj->DSTATE.ModuleOperatingTemperature = (short)pObj->MODL_ERR_RATE; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
  423. pObj->DSTATE.FanOperatingTemperature = (short)pObj->FAN_RUN_TMPR; /* 필수 Fan 동작 기준 온도값(℃) */
  424. pObj->DSTATE.HeaterOperatingTemperature = (short)pObj->HETR_RUN_TMPR; /* 필수 Heater 동작 기준 온도값(℃) */
  425. pObj->DSTATE.ModuleBasicFailureRate = (short)pObj->MODL_ERR_RATE; /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
  426. pObj->DSTATE.ExternalLightOperatingLuminance = 0; /* 선택 외부전등 동작 기준 휘도값 */
  427. pObj->DSTATE.MaximumRetry = 3; /* 선택 최대 재시도 횟수(회) */
  428. pObj->DSTATE.ResponseTimeOut = 30; /* 선택 최대응답대기시간 (초) */
  429. pObj->DSTATE.BlinkingCycleTime = 100; /* 선택 점멸시간 주기 ( 1/10초단위) */
  430. pObj->DSTATE.VMS_CTLR_NMBR = CTLR_NMBR.ToIntDef(0);
  431. memcpy(&pObj->RSTATE, &pObj->DSTATE, sizeof(pObj->RSTATE));
  432. pObj->RSTATE.Comm = vms_comm_error;
  433. pObj->RSTATE.Wcomm = vms_wcomm_error;
  434. #if 0
  435. pObj->LUMINANCE.SchTime = Now().FormatString("yyyymmdd");
  436. pObj->LUMINANCE.Value = 0;
  437. pObj->LUMINANCE.Retry = 0;
  438. #endif
  439. pObj->FSLog = new TITSLog(g_sLogDir + "Comm\\"+pObj->CTLR_ID + "\\", pObj->CTLR_ID+"S", g_AppCfg.sLogDay);
  440. pObj->FCLog = new TITSLog(g_sLogDir + "Comm\\"+pObj->CTLR_ID + "\\", pObj->CTLR_ID+"C", g_AppCfg.sLogDay);
  441. pObj->FSLog->FLogCfg = g_LogCfg;
  442. pObj->FCLog->FLogCfg = g_LogCfg;
  443. if (COMM_CheckAddress(pObj->CTLR_IP.c_str()) &&
  444. pObj->pPackQueue &&
  445. pObj->FSLog &&
  446. pObj->FCLog )
  447. {
  448. pObj->Server.useFlag = use_enable;
  449. pObj->Server.thrState = thr_run;
  450. pObj->Client.useFlag = use_enable;
  451. pObj->Client.thrState = thr_run;
  452. }
  453. pObj->SCHEDULE = new VMS_SCHEDULE_INFO;
  454. pObj->SCHEDULE->Count = 0;
  455. pObj->InitSchedule(); //스케줄정보
  456. pObj->EVEHICLE = new VMS_EVEHICLE_INFO;
  457. pObj->EVEHICLE->Count = 0;
  458. pObj->InitEVehicle(); // 긴급차량우선신호
  459. pObj->EVEHICLE->IsOcurr = false;
  460. pObj->EVEHICLE->IsEnd = false;
  461. pObj->EVEHICLE->dtOcurr = Now()-1;
  462. pObj->EVEHICLE->IsDownload = false;
  463. pObj->EVEHICLE->dtDownload = Now()-1;
  464. pObj->EVEHICLE->IsEVechFirst = false;
  465. pObj->INCIDENT = new VMS_EVENT_INFO;
  466. pObj->INCIDENT->Count = 0;
  467. pObj->InitIncident(); //돌발정보
  468. pObj->EVENT = new VMS_EVENT_INFO;
  469. pObj->EVENT->Count = 0;
  470. pObj->InitEvent(); //이벤트(공사/행사)정보
  471. pObj->FMaxCngsForm = VMS_MAX_CNGS_FORM;
  472. pObj->DOWNLOAD = new VMS_DOWNLOAD_INFO;
  473. pObj->InitDownLoadInfo();
  474. pObj->CTRLMODE = new VMS_CONTROL_MODE;
  475. pObj->InitCtrlMode();
  476. //pObj->VMS_MAX_PHSE_NUM = INT_VMS_MAX_FORM;
  477. #if 0
  478. if (pObj->VMS_MAX_PHSE_NUM > INT_VMS_MAX_FORM)
  479. pObj->VMS_MAX_PHSE_NUM = INT_VMS_MAX_FORM;
  480. #else
  481. //TODO: 도로공사 프로토콜(최대 10개)
  482. if (pObj->VMS_MAX_PHSE_NUM > MAX_VMS_SCENARIO_FORM)
  483. pObj->VMS_MAX_PHSE_NUM = MAX_VMS_SCENARIO_FORM;
  484. #endif
  485. pObj->CTRLMODE->MaxDisplayForm = pObj->VMS_MAX_PHSE_NUM;
  486. pObj->CTRLMODE->Control = pObj->DSTATE.OprMode;
  487. //VMS제공폼을 관리할 관리자 생성(VMS개별적으로 생성함)
  488. pObj->pForms = new TVmsFormManager();
  489. pObj->pForms->FormWidth = pObj->WIDTH;
  490. pObj->pForms->FormHeight= pObj->HEIGHT;
  491. pObj->FLocalFormDir = g_sFtpFormDir + pObj->CTLR_NMBR + "\\";
  492. ForceDirectories(pObj->FLocalFormDir.c_str());
  493. pObj->FFtpFormDir = AnsiString(FTP_FORM) + "\\" + pObj->CTLR_NMBR + "\\"; // 제어기에 내려보낼때 사용할 폼이저장되어 있는 경로
  494. pObj->FIsFtpDownload = true;
  495. }
  496. }
  497. catch(EDatabaseError &E)
  498. {
  499. DBERROR(String(E.ClassName()), E.Message, sQry);
  500. return -1;
  501. }
  502. catch(Exception &e)
  503. {
  504. DBERROR(String(e.ClassName()), e.Message, sQry);
  505. return -1;
  506. }
  507. }
  508. __finally
  509. {
  510. FLists.UnLock();
  511. SQLFree(pADO);
  512. }
  513. SELEND(FLists.Size(), dwTick);
  514. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  515. TIMEDELAY(FLists.Size(), dwTick);
  516. }
  517. if (LoadCtlrStts(ADbConn) < 0)
  518. {
  519. return -1;
  520. }
  521. return FLists.Size();
  522. }
  523. //---------------------------------------------------------------------------
  524. int TCDSCtlrManager::LoadCtlrStts(TADOConnection *ADbConn)
  525. {
  526. String sQry;
  527. TADOQuery *pADO = NULL;
  528. int nSelCnt = 0;
  529. DWORD dwTick = GetTickCount();
  530. SELSTART;
  531. sQry = "SELECT A.* \r\n"
  532. " FROM TB_VMS_CTLR_STTS A, \r\n"
  533. " TB_VMS_CTLR B \r\n"
  534. " WHERE B.DEL_YN = 'N' \r\n"
  535. " AND A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR \r\n";
  536. try
  537. {
  538. try
  539. {
  540. pADO = new TADOQuery(NULL);
  541. pADO->Connection = ADbConn;
  542. SQLText(pADO, sQry, true);
  543. SQLOpen(pADO);
  544. for( ; !pADO->Eof; pADO->Next())
  545. {
  546. AnsiString CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsAnsiString;
  547. TCDSCtlr *pObj = FLists.Find(CTLR_NMBR);
  548. if (!pObj) continue;
  549. nSelCnt++;
  550. AnsiString MODL_STTS_CD = pADO->FieldByName("MODL_STTS_CD")->AsString.Trim();
  551. AnsiString DOOR_STTS_CD = pADO->FieldByName("CBOX_DOOR_STTS_CD")->AsString.Trim();
  552. AnsiString FAN_STTS_CD = pADO->FieldByName("FAN_STTS_CD")->AsString.Trim();
  553. AnsiString HETR_STTS_CD = pADO->FieldByName("HETR_STTS_CD")->AsString.Trim();
  554. int CBOX_TMPR = pADO->FieldByName("CBOX_TMPR")->AsInteger;
  555. int BRGH_VAL = pADO->FieldByName("BRGH_VAL")->AsInteger;
  556. AnsiString COMM_STTS_CD = pADO->FieldByName("COMM_STTS_CD")->AsString.Trim();
  557. pObj->DSTATE.ModulePowerStatus = MODL_STTS_CD == "MOS0" ? vms_module_power_on : vms_module_power_off;
  558. pObj->DSTATE.DoorStatus = DOOR_STTS_CD == "CDS0" ? vms_door_close : vms_door_open;
  559. pObj->DSTATE.FanStatus = FAN_STTS_CD == "PAS0" ? vms_fan_on : vms_fan_off;
  560. pObj->DSTATE.HeaterStatus = HETR_STTS_CD == "HTS0" ? vms_heater_on : vms_heater_off;
  561. pObj->DSTATE.BodyTemp = (short)CBOX_TMPR;
  562. pObj->DSTATE.LuminanceStatus = (BYTE)BRGH_VAL;
  563. pObj->DSTATE.Wcomm = COMM_STTS_CD == "CMS0" ? vms_wcomm_normal : vms_comm_error;
  564. #if 0
  565. memcpy(&pObj->RSTATE, &pObj->DSTATE, sizeof(pObj->RSTATE));
  566. #endif
  567. }
  568. }
  569. catch(EDatabaseError &E)
  570. {
  571. DBERROR(String(E.ClassName()), E.Message, sQry);
  572. return -1;
  573. }
  574. catch(Exception &e)
  575. {
  576. DBERROR(String(e.ClassName()), e.Message, sQry);
  577. return -1;
  578. }
  579. }
  580. __finally
  581. {
  582. SQLFree(pADO);
  583. }
  584. SELEND(nSelCnt, dwTick);
  585. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  586. TIMEDELAY(nSelCnt, dwTick);
  587. }
  588. return nSelCnt;
  589. }
  590. //---------------------------------------------------------------------------
  591. void TCDSCtlrManager::InitProvide(TCDSCtlr *AObj/*=NULL*/)
  592. {
  593. try
  594. {
  595. //FLists.Lock();
  596. CtlrItr it;
  597. for(it=FLists.FObjects.begin(); it != FLists.FObjects.end(); ++it)
  598. {
  599. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  600. if (AObj == NULL || pObj == AObj)
  601. {
  602. pObj->FProvide = true;
  603. }
  604. }
  605. }
  606. __finally
  607. {
  608. //FLists.UnLock();
  609. }
  610. }
  611. //---------------------------------------------------------------------------
  612. int TCDSCtlrManager::SaveCtlrStts(TADOConnection *ADbConn, void *AData)
  613. {
  614. int nSelCnt = 0;
  615. AnsiString sQry;
  616. TADOQuery *pADO = NULL;
  617. bool bSaveIpAddr = false;
  618. bool bSaveHist = false;
  619. CTLR_STTS *pStts = (CTLR_STTS*)AData;
  620. if (!pStts) return -1;
  621. TCDSCtlr *pObj = (TCDSCtlr*)pStts->ObjPtr;
  622. if (!pObj) return -2;
  623. //DWORD dwTick = GetTickCount();
  624. //JOBSTART;
  625. // 상태정보를 수집하면 실시간으로 업데이트 하고 운영단말로 전송하자
  626. if (pStts->Type == 0) // 상태정보를 수신한 경우
  627. {
  628. // 제어기가 최초로 접속한 경우에는 상태정보를 바로 알수 없기 때문에 기존의 상태정보를 업데이트 하지 않기위해
  629. // 제거이가 상태정보를 수신한 경우에만 상태정보를 업데이트하도록 한다.
  630. memcpy(&pObj->DSTATE, &pObj->RSTATE, sizeof(pObj->DSTATE));
  631. }
  632. else
  633. {
  634. //통신 연결 또는 종료
  635. bSaveHist = true;
  636. }
  637. pObj->DSTATE.Comm = pObj->Server.commState == comm_open ? vms_comm_normal : vms_comm_error;
  638. TDateTime tmStts = Now();
  639. if (SecondOfTheDay(pObj->tmStts) >= SecondOfTheDay(tmStts))
  640. {
  641. //연결이 종료 되었다가 바로 접속되는 경우가 있어서 이력저장할때 Primary Key 중복에러가 발생한다.
  642. tmStts = IncSecond(pObj->tmStts, 1);
  643. }
  644. pObj->tmStts = tmStts;
  645. String UPDT_DT = pObj->tmStts.FormatString("yyyymmddhhnnss");
  646. if (pObj->DSTATE.Comm == vms_comm_normal)
  647. {
  648. if (pObj->CTLR_IP != pObj->LOGIN_IPADDR)
  649. {
  650. pObj->CTLR_IP = pObj->LOGIN_IPADDR;
  651. bSaveIpAddr = true;
  652. }
  653. }
  654. #if 0
  655. // 여기서는 데이터베이스에 저장하지 말고 그냥 클라이언트로 실시간 정보만 전달하도록 하자
  656. // 1분마다 주기적으로 데이터베이스는 업데이트 한다.
  657. String sQry = (g_AppCfg.UpdateMode == 0) ? g_sUpdate : g_sMerge;
  658. try
  659. {
  660. pADO = new TADOQuery(NULL);
  661. pADO->Connection = ADbConn;
  662. try
  663. {
  664. SQLText(pADO, sQry, false);
  665. int VMS_CTLR_NMBR = pObj->CTLR_NMBR.ToIntDef(0);
  666. String CMNC_STTS_CD = pObj->DSTATE.Comm == vms_comm_normal ? "CMS0" : "CMS1";
  667. String MODL_STTS_CD = pObj->DSTATE.ModulePowerStatus == vms_module_power_on ? "MOS0" : "MOS1";
  668. String CBOX_DOOR_STTS_CD = pObj->DSTATE.DoorStatus == vms_door_close ? "CDS0" : "CDS1";
  669. String FAN_STTS_CD = pObj->DSTATE.FanStatus == vms_fan_on ? "PAS0" : "PAS1";
  670. String HETR_STTS_CD = pObj->DSTATE.HeaterStatus == vms_heater_on ? "HTS0" : "HTS1";
  671. String COMM_STTS_CD = pObj->DSTATE.Wcomm == vms_wcomm_normal ? "CMS0" : "CMS1";
  672. int CBOX_TMPR = (int)(pObj->DSTATE.BodyTemp);
  673. int BRGH_VAL = (int)(pObj->DSTATE.LuminanceStatus);
  674. String PWER_STTS_CD = pObj->DSTATE.PowerCtrlStatus == vms_module_power_on ? "MOS0" : "MOS1";
  675. String MODL_STTS = "";
  676. String PWER_STTS = "";
  677. if (pObj->DSTATE.ModulePowerStatus == 0x02) MODL_STTS_CD = "MOS2";
  678. if (pObj->DSTATE.DoorStatus == 0x02) CBOX_DOOR_STTS_CD = "CDS2";
  679. if (pObj->DSTATE.FanStatus == 0x02) FAN_STTS_CD = "PAS2";
  680. if (pObj->DSTATE.HeaterStatus == 0x02) HETR_STTS_CD = "HTS2";
  681. if (CMNC_STTS_CD != "CMS0" || COMM_STTS_CD != "CMS0") //통신이 종료된 경우 상태정보를 업데이트 하지 않는다.
  682. {
  683. MODL_STTS_CD = "MOS2";
  684. PWER_STTS_CD = "MOS2";
  685. CBOX_DOOR_STTS_CD = "CDS2";
  686. FAN_STTS_CD = "PAS2";
  687. HETR_STTS_CD = "HTS2";
  688. CBOX_TMPR = 0;
  689. BRGH_VAL = 0;
  690. COMM_STTS_CD = "CMS2";
  691. MODL_STTS = "";
  692. PWER_STTS = "";
  693. }
  694. SQLBind(pADO, "p01", VMS_CTLR_NMBR);
  695. SQLBind(pADO, "p02", UPDT_DT);
  696. SQLBind(pADO, "p03", CMNC_STTS_CD);
  697. SQLBind(pADO, "p04", PWER_STTS_CD);
  698. SQLBind(pADO, "p05", MODL_STTS_CD);
  699. SQLBind(pADO, "p06", CBOX_DOOR_STTS_CD);
  700. SQLBind(pADO, "p07", FAN_STTS_CD);
  701. SQLBind(pADO, "p08", HETR_STTS_CD);
  702. SQLBind(pADO, "p09", CBOX_TMPR);
  703. SQLBind(pADO, "p10", BRGH_VAL);
  704. SQLBind(pADO, "p11", COMM_STTS_CD);
  705. SQLBind(pADO, "p12", MODL_STTS);
  706. SQLBind(pADO, "p13", PWER_STTS);
  707. nSelCnt = SQLExec(pADO);
  708. bSaveHist = false;
  709. if (bSaveHist)
  710. {
  711. sQry = "INSERT INTO TB_VMS_CTLR_STTS_HS ( \r\n"
  712. " CRTN_DT, \r\n"
  713. " VMS_CTLR_NMBR, \r\n"
  714. " CMNC_STTS_CD, \r\n"
  715. " PWER_STTS_CD, \r\n"
  716. " MODL_STTS_CD, \r\n"
  717. " CBOX_DOOR_STTS_CD, \r\n"
  718. " FAN_STTS_CD, \r\n"
  719. " HETR_STTS_CD, \r\n"
  720. " CBOX_TMPR, \r\n"
  721. " BRGH_VAL, \r\n"
  722. " COMM_STTS_CD) \r\n"
  723. " SELECT UPDT_DT, \r\n"
  724. " VMS_CTLR_NMBR, \r\n"
  725. " CMNC_STTS_CD, \r\n"
  726. " PWER_STTS_CD, \r\n"
  727. " MODL_STTS_CD, \r\n"
  728. " CBOX_DOOR_STTS_CD, \r\n"
  729. " FAN_STTS_CD, \r\n"
  730. " HETR_STTS_CD, \r\n"
  731. " CBOX_TMPR, \r\n"
  732. " BRGH_VAL, \r\n"
  733. " COMM_STTS_CD \r\n"
  734. " FROM TB_VMS_CTLR_STTS \r\n"
  735. " WHERE VMS_CTLR_NMBR = :p01 \r\n";
  736. SQLText(pADO, sQry, false);
  737. SQLBind(pADO, "p01", VMS_CTLR_NMBR);
  738. SQLExec(pADO);
  739. }
  740. }
  741. catch(EDatabaseError &E)
  742. {
  743. DBERROR(String(E.ClassName()), E.Message, sQry);
  744. return -1;
  745. }
  746. catch(Exception &e)
  747. {
  748. DBERROR(String(e.ClassName()), e.Message, sQry);
  749. return -1;
  750. }
  751. }
  752. __finally
  753. {
  754. SQLFree(pADO);
  755. }
  756. #endif
  757. //상태정보를 클라이언트로 전송
  758. INT_VMS_STATE_RES Res;
  759. memset((char*)&Res, 0x00, sizeof(Res));
  760. Res.Total = CDSCtlrManager->Total;
  761. Res.Error = CDSCtlrManager->Error;
  762. Res.Normal= CDSCtlrManager->Normal;
  763. Res.Module= CDSCtlrManager->Module;
  764. Res.Count = 1;
  765. memcpy((char*)&Res.Unit[0], (char*)&pObj->DSTATE, sizeof(INT_VMS_STATE));
  766. CComm_VmsStateNotify(&Res);
  767. //JOBEND(dwTick);
  768. //if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  769. // TIMEDELAY(nSelCnt, dwTick);
  770. //}
  771. if (bSaveIpAddr)
  772. {
  773. SaveCtlrIpAddr(ADbConn, AData);
  774. }
  775. return nSelCnt;
  776. }
  777. //---------------------------------------------------------------------------
  778. int TCDSCtlrManager::SaveCtlrIpAddr(TADOConnection *ADbConn, void *AData)
  779. {
  780. int nSelCnt = 0;
  781. AnsiString sQry;
  782. TADOQuery *pADO = NULL;
  783. CTLR_STTS *pStts = (CTLR_STTS*)AData;
  784. if (!pStts) return -1;
  785. TCDSCtlr *pObj = (TCDSCtlr*)pStts->ObjPtr;
  786. if (!pObj) return -2;
  787. return 1;
  788. DWORD dwTick = GetTickCount();
  789. UPDSTART;
  790. sQry = "UPDATE TB_VMS_CTLR \r\n"
  791. " SET VMS_CTLR_IP = :p02 \r\n"
  792. " WHERE VMS_CTLR_NMBR = :p01 \r\n";
  793. try
  794. {
  795. pADO = new TADOQuery(NULL);
  796. pADO->Connection = ADbConn;
  797. try
  798. {
  799. SQLText(pADO, sQry, false);
  800. int VMS_CTLR_NMBR = pObj->CTLR_NMBR.ToIntDef(0);
  801. String VMS_CTLR_IP = pObj->CTLR_IP;
  802. SQLBind(pADO, "p01", VMS_CTLR_NMBR);
  803. SQLBind(pADO, "p02", VMS_CTLR_IP);
  804. nSelCnt = SQLExec(pADO);
  805. }
  806. catch(EDatabaseError &E)
  807. {
  808. DBERROR(String(E.ClassName()), E.Message, sQry);
  809. return -1;
  810. }
  811. catch(Exception &e)
  812. {
  813. DBERROR(String(e.ClassName()), e.Message, sQry);
  814. return -1;
  815. }
  816. }
  817. __finally
  818. {
  819. SQLFree(pADO);
  820. }
  821. UPDEND(nSelCnt, dwTick);
  822. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  823. TIMEDELAY(nSelCnt, dwTick);
  824. }
  825. return nSelCnt;
  826. }
  827. //---------------------------------------------------------------------------
  828. int TCDSCtlrManager::SaveCtlrSttsAll(TADOConnection *ADbConn)
  829. {
  830. int nSelCnt = 0;
  831. AnsiString sQry;
  832. TADOQuery *pADO = NULL;
  833. DWORD dwTick = GetTickCount();
  834. UPDSTART;
  835. // 1분주기 상태정보 업데이트, 5분마다 이력정보를 입력한다.
  836. bool bSaveHist = false;
  837. int nCurrMin = StrToInt(Now().FormatString("nn"));
  838. if ((nCurrMin % 5) == 0) //매 5분마다 무조건 입력
  839. {
  840. if (FCtlrStts5Min != nCurrMin)
  841. {
  842. bSaveHist = true;
  843. FCtlrStts5Min = nCurrMin;
  844. }
  845. }
  846. sQry = (g_AppCfg.UpdateMode == 0) ? g_sUpdate : g_sMerge;
  847. String UPDT_DT = Now().FormatString("yyyymmddhhnnss");
  848. try
  849. {
  850. pADO = new TADOQuery(NULL);
  851. pADO->Connection = ADbConn;
  852. try
  853. {
  854. SQLText(pADO, sQry, false);
  855. CtlrItr it;
  856. for(it=FLists.FObjects.begin(); it != FLists.FObjects.end(); ++it)
  857. {
  858. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  859. if (pObj->Server.useFlag != use_enable) continue;
  860. pObj->DSTATE.Comm = pObj->Server.commState == comm_open ? vms_comm_normal : vms_comm_error;
  861. int VMS_CTLR_NMBR = pObj->CTLR_NMBR.ToIntDef(0);
  862. String CMNC_STTS_CD = pObj->DSTATE.Comm == vms_comm_normal ? "CMS0" : "CMS1";
  863. String MODL_STTS_CD = pObj->DSTATE.ModulePowerStatus == vms_module_power_on ? "MOS0" : "MOS1";
  864. String CBOX_DOOR_STTS_CD = pObj->DSTATE.DoorStatus == vms_door_close ? "CDS0" : "CDS1";
  865. String FAN_STTS_CD = pObj->DSTATE.FanStatus == vms_fan_on ? "PAS0" : "PAS1";
  866. String HETR_STTS_CD = pObj->DSTATE.HeaterStatus == vms_heater_on ? "HTS0" : "HTS1";
  867. String COMM_STTS_CD = pObj->DSTATE.Wcomm == vms_wcomm_normal ? "CMS0" : "CMS1";
  868. int CBOX_TMPR = (int)(pObj->DSTATE.BodyTemp);
  869. int BRGH_VAL = (int)(pObj->DSTATE.LuminanceStatus);
  870. String PWER_STTS_CD = pObj->DSTATE.PowerCtrlStatus == vms_module_power_on ? "MOS0" : "MOS1";
  871. String MODL_STTS = "";
  872. String PWER_STTS = "";
  873. if (pObj->DSTATE.ModulePowerStatus == 0x02) MODL_STTS_CD = "MOS2";
  874. if (pObj->DSTATE.DoorStatus == 0x02) CBOX_DOOR_STTS_CD = "CDS2";
  875. if (pObj->DSTATE.FanStatus == 0x02) FAN_STTS_CD = "PAS2";
  876. if (pObj->DSTATE.HeaterStatus == 0x02) HETR_STTS_CD = "HTS2";
  877. if (CMNC_STTS_CD != "CMS0" || COMM_STTS_CD != "CMS0") //통신이 종료된 경우 상태정보를 업데이트 하지 않는다.
  878. {
  879. MODL_STTS_CD = "MOS2";
  880. PWER_STTS_CD = "MOS2";
  881. CBOX_DOOR_STTS_CD = "CDS2";
  882. FAN_STTS_CD = "PAS2";
  883. HETR_STTS_CD = "HTS2";
  884. CBOX_TMPR = 0;
  885. BRGH_VAL = 0;
  886. COMM_STTS_CD = "CMS2";
  887. MODL_STTS = "";
  888. PWER_STTS = "";
  889. }
  890. //PostMessage((HWND)g_AppCfg.lMainWinHandle, WM_PANEL_REFRESH, 2, (LPARAM)clAqua);
  891. SQLBind(pADO, "p01", VMS_CTLR_NMBR);
  892. SQLBind(pADO, "p02", UPDT_DT);
  893. SQLBind(pADO, "p03", CMNC_STTS_CD);
  894. SQLBind(pADO, "p04", PWER_STTS_CD);
  895. SQLBind(pADO, "p05", MODL_STTS_CD);
  896. SQLBind(pADO, "p06", CBOX_DOOR_STTS_CD);
  897. SQLBind(pADO, "p07", FAN_STTS_CD);
  898. SQLBind(pADO, "p08", HETR_STTS_CD);
  899. SQLBind(pADO, "p09", CBOX_TMPR);
  900. SQLBind(pADO, "p10", BRGH_VAL);
  901. SQLBind(pADO, "p11", COMM_STTS_CD);
  902. SQLBind(pADO, "p12", MODL_STTS);
  903. SQLBind(pADO, "p13", PWER_STTS);
  904. nSelCnt += SQLExec(pADO);
  905. //PostMessage((HWND)g_AppCfg.lMainWinHandle, WM_PANEL_REFRESH, 2, (LPARAM)clLime);
  906. }
  907. UPDEND(nSelCnt, dwTick);
  908. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  909. TIMEDELAY(nSelCnt, dwTick);
  910. }
  911. if (bSaveHist)
  912. {
  913. int nInsCnt = 0;
  914. dwTick = GetTickCount();
  915. INSSTART;
  916. #if 0
  917. sQry = "INSERT INTO TB_VMS_CTLR_STTS_HS ( \r\n"
  918. " CRTN_DT, \r\n"
  919. " VMS_CTLR_NMBR, \r\n"
  920. " CMNC_STTS_CD, \r\n"
  921. " PWER_STTS_CD, \r\n"
  922. " MODL_STTS_CD, \r\n"
  923. " CBOX_DOOR_STTS_CD, \r\n"
  924. " FAN_STTS_CD, \r\n"
  925. " HETR_STTS_CD, \r\n"
  926. " CBOX_TMPR, \r\n"
  927. " BRGH_VAL, \r\n"
  928. " COMM_STTS_CD, \r\n"
  929. " MODL_STTS, \r\n"
  930. " PWER_STTS ) \r\n"
  931. " SELECT UPDT_DT, \r\n"
  932. " VMS_CTLR_NMBR, \r\n"
  933. " CMNC_STTS_CD, \r\n"
  934. " PWER_STTS_CD, \r\n"
  935. " MODL_STTS_CD, \r\n"
  936. " CBOX_DOOR_STTS_CD, \r\n"
  937. " FAN_STTS_CD, \r\n"
  938. " HETR_STTS_CD, \r\n"
  939. " CBOX_TMPR, \r\n"
  940. " BRGH_VAL, \r\n"
  941. " COMM_STTS_CD, \r\n"
  942. " MODL_STTS, \r\n"
  943. " PWER_STTS \r\n"
  944. " FROM TB_VMS_CTLR_STTS \r\n"
  945. " WHERE UPDT_DT = :p01 \r\n";
  946. #else
  947. sQry = "INSERT INTO TB_VMS_CTLR_STTS_HS ( \r\n"
  948. " CRTN_DT, \r\n"
  949. " VMS_CTLR_NMBR, \r\n"
  950. " CMNC_STTS_CD, \r\n"
  951. " PWER_STTS_CD, \r\n"
  952. " MODL_STTS_CD, \r\n"
  953. " CBOX_DOOR_STTS_CD, \r\n"
  954. " FAN_STTS_CD, \r\n"
  955. " HETR_STTS_CD, \r\n"
  956. " CBOX_TMPR, \r\n"
  957. " BRGH_VAL, \r\n"
  958. " COMM_STTS_CD) \r\n"
  959. " SELECT UPDT_DT, \r\n"
  960. " VMS_CTLR_NMBR, \r\n"
  961. " CMNC_STTS_CD, \r\n"
  962. " PWER_STTS_CD, \r\n"
  963. " MODL_STTS_CD, \r\n"
  964. " CBOX_DOOR_STTS_CD, \r\n"
  965. " FAN_STTS_CD, \r\n"
  966. " HETR_STTS_CD, \r\n"
  967. " CBOX_TMPR, \r\n"
  968. " BRGH_VAL, \r\n"
  969. " COMM_STTS_CD \r\n"
  970. " FROM TB_VMS_CTLR_STTS \r\n"
  971. " WHERE UPDT_DT = :p01 \r\n";
  972. #endif
  973. SQLText(pADO, sQry, false);
  974. SQLBind(pADO, "p01", UPDT_DT);
  975. nInsCnt = SQLExec(pADO);
  976. INSEND(nInsCnt, dwTick);
  977. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  978. TIMEDELAY(nInsCnt, dwTick);
  979. }
  980. }
  981. }
  982. catch(EDatabaseError &E)
  983. {
  984. DBERROR(String(E.ClassName()), E.Message, sQry);
  985. return -1;
  986. }
  987. catch(Exception &e)
  988. {
  989. DBERROR(String(e.ClassName()), e.Message, sQry);
  990. return -1;
  991. }
  992. }
  993. __finally
  994. {
  995. SQLFree(pADO);
  996. }
  997. SendCtlrSttsAll();
  998. return nSelCnt;
  999. }
  1000. //---------------------------------------------------------------------------
  1001. int TCDSCtlrManager::SendCtlrSttsAll()
  1002. {
  1003. int nSelCnt = 0;
  1004. INT_VMS_STATE_RES Res;
  1005. INT_VMS_STATE *pVms;
  1006. memset((char*)&Res, 0x00, sizeof(Res));
  1007. Res.Total = CDSCtlrManager->Total;
  1008. Res.Error = CDSCtlrManager->Error;
  1009. Res.Normal= CDSCtlrManager->Normal;
  1010. Res.Module= CDSCtlrManager->Module;
  1011. CtlrItr it;
  1012. for(it=FLists.FObjects.begin(); it != FLists.FObjects.end(); ++it)
  1013. {
  1014. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1015. if (pObj->Server.useFlag != use_enable) continue;
  1016. pVms = &Res.Unit[Res.Count++];
  1017. memcpy((char*)pVms, (char*)&pObj->DSTATE, sizeof(INT_VMS_STATE));
  1018. if (Res.Count >= (BYTE)INT_VMS_MAX_STATE)
  1019. {
  1020. CComm_VmsStateNotify(&Res);
  1021. memset((char*)&Res, 0x00, sizeof(Res));
  1022. Res.Total = CDSCtlrManager->Total;
  1023. Res.Error = CDSCtlrManager->Error;
  1024. Res.Normal= CDSCtlrManager->Normal;
  1025. Res.Module= CDSCtlrManager->Module;
  1026. }
  1027. nSelCnt++;
  1028. }
  1029. if (Res.Count > 0)
  1030. {
  1031. CComm_VmsStateNotify(&Res);
  1032. }
  1033. return nSelCnt;
  1034. }
  1035. //---------------------------------------------------------------------------
  1036. int TCDSCtlrManager::SaveCtlrParam(TADOConnection *ADbConn, void *AData)
  1037. {
  1038. int nSelCnt = 0;
  1039. AnsiString sQry;
  1040. TADOQuery *pADO = NULL;
  1041. CTLR_STTS *pStts = (CTLR_STTS*)AData;
  1042. if (!pStts) return -1;
  1043. TCDSCtlr *pObj = (TCDSCtlr*)pStts->ObjPtr;
  1044. if (!pObj) return -2;
  1045. DWORD dwTick = GetTickCount();
  1046. UPDSTART;
  1047. sQry = "UPDATE TB_VMS_CTLR "
  1048. " SET PANL_PWER_MODE = :p02, "
  1049. " FAN_MODE = :p03, "
  1050. " FAN_RUN_TMPR = :p04, "
  1051. " HETR_MODE = :p05, "
  1052. " HETR_RUN_TMPR = :p06, "
  1053. " BRGH_MODE = :p07, "
  1054. " BRGH_CURR_STEP = :p08, "
  1055. " BRGH_WEEK_STEP = :p09, "
  1056. " BRGH_NGHT_STEP = :p10 "
  1057. " WHERE VMS_CTLR_NMBR = :p01 ";
  1058. try
  1059. {
  1060. pADO = new TADOQuery(NULL);
  1061. pADO->Connection = ADbConn;
  1062. try
  1063. {
  1064. SQLText(pADO, sQry, false);
  1065. int VMS_CTLR_NMBR = pObj->CTLR_NMBR.ToIntDef(0);
  1066. SQLBind(pADO, "p01", VMS_CTLR_NMBR);
  1067. SQLBind(pADO, "p02", pObj->PANL_PWER_MODE);
  1068. SQLBind(pADO, "p03", pObj->FAN_MODE);
  1069. SQLBind(pADO, "p04", pObj->FAN_RUN_TMPR);
  1070. SQLBind(pADO, "p05", pObj->HETR_MODE);
  1071. SQLBind(pADO, "p06", pObj->HETR_RUN_TMPR);
  1072. SQLBind(pADO, "p07", pObj->BRGH_MODE);
  1073. SQLBind(pADO, "p08", pObj->BRGH_CURR_STEP);
  1074. SQLBind(pADO, "p09", pObj->BRGH_WEEK_STEP);
  1075. SQLBind(pADO, "p10", pObj->BRGH_NGHT_STEP);
  1076. nSelCnt = SQLExec(pADO);
  1077. }
  1078. catch(EDatabaseError &E)
  1079. {
  1080. DBERROR(String(E.ClassName()), E.Message, sQry);
  1081. return -1;
  1082. }
  1083. catch(Exception &e)
  1084. {
  1085. DBERROR(String(e.ClassName()), e.Message, sQry);
  1086. return -1;
  1087. }
  1088. }
  1089. __finally
  1090. {
  1091. SQLFree(pADO);
  1092. }
  1093. //파라미터정보를 클라이언트로 전송
  1094. INT_VMS_PARAM_RES Res;
  1095. INT_VMS_PARAM *pData;
  1096. memset((char*)&Res, 0x00, sizeof(Res));
  1097. Res.Total = CDSCtlrManager->Total;
  1098. Res.Error = CDSCtlrManager->Error;
  1099. Res.Normal= CDSCtlrManager->Normal;
  1100. Res.Module= CDSCtlrManager->Module;
  1101. Res.Count = 1;
  1102. pData = &Res.Unit[0];
  1103. pData->VMS_CTLR_NMBR = pObj->CTLR_NMBR.ToIntDef(0);
  1104. pData->led = (BYTE)pObj->PANL_PWER_MODE; // 0x00 : 꺼짐, 0x01 : 켜짐, 0x02 : 자동, 0x09 : 알수없음
  1105. pData->fan = (BYTE)pObj->FAN_MODE; // 0x00 : 꺼짐, 0x01 : 켜짐, 0x02 : 자동, 0x09 : 알수없음
  1106. pData->fanTmpr = (BYTE)pObj->FAN_RUN_TMPR; // Fan 동작온도(0x00~0x3f)
  1107. pData->hetr = (BYTE)pObj->HETR_MODE; // 0x00 : 꺼짐, 0x01 : 켜짐, 0x02 : 자동, 0x09 : 알수없음
  1108. pData->hetrTmpr = (BYTE)pObj->HETR_RUN_TMPR; // Heater 동작온도(0x00~0x3f)
  1109. pData->brgh = (BYTE)pObj->BRGH_MODE; // 0x00 : 주간, 0x01 : 야간, 0x02 : 자동, 0x09 : 수동
  1110. pData->brghVal = (BYTE)pObj->BRGH_CURR_STEP; // 현재휘도값 (0 ~ 100)
  1111. pData->brghDay = (BYTE)pObj->BRGH_WEEK_STEP; // 주간 휘도값(0 ~ 100)
  1112. pData->brghNight = (BYTE)pObj->BRGH_NGHT_STEP; // 야간 휘도값(0 ~ 100)
  1113. memcpy(pData->time, pObj->ParamResTime.c_str(), INT_VMS_MAX_DATETIME); // 현재 제어기 시간
  1114. CComm_VmsParamNotify(&Res);
  1115. UPDEND(nSelCnt, dwTick);
  1116. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  1117. TIMEDELAY(nSelCnt, dwTick);
  1118. }
  1119. return nSelCnt;
  1120. }
  1121. //---------------------------------------------------------------------------