CDSCtlrF.cpp 46 KB

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