CDSCtlrF.cpp 50 KB

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