CDSCtlrF.cpp 50 KB

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