#include "soe.h" CSOE::CSOE() { m_save = 0; m_load = 0; } CSOE::~CSOE() { } void CSOE::PushSOE(unionCP56Time& st, int order, BOOLEAN value, BYTE qds, int uid, int point) { m_soes[m_save].st.year = st.year; m_soes[m_save].st.month = st.month; m_soes[m_save].st.dayofmonth = st.dayofmonth; m_soes[m_save].st.dayofweek = st.dayofweek; m_soes[m_save].st.hour = st.hour; m_soes[m_save].st.minute = st.minute; m_soes[m_save].st.millisecond = st.millisecond; if (order < 0 || order >= DATABASE_YX_NUM) { m_soes[m_save].order = -1; } else { m_soes[m_save].order = order; } m_soes[m_save].value = value; m_soes[m_save].uid = uid; m_soes[m_save].point = point; m_soes[m_save].qds = qds; #if 0 m_soes[m_save].bl = ((qds & 0x10) == 0x10); m_soes[m_save].sb = ((qds & 0x20) == 0x20); m_soes[m_save].nt = ((qds & 0x40) == 0x40); m_soes[m_save].iv = ((qds & 0x80) == 0x80); #endif m_save++; m_save = m_save % DATABASE_SOE_NUM; } void CSOE::DumpSOE(void) { FILE* pf; char text[64]; BOOLEAN bNewFile = FALSE; if (m_load == m_save) return; snprintf(text, sizeof(text), FILE_SOE_LOG, (int)system32.now.month, (int)system32.now.dayofmonth); pf = fopen(text, "rb+"); if (pf == NULL) { pf = fopen(text, "wb+"); bNewFile = TRUE; } if (pf == NULL) return; if (bNewFile) { fseek(pf, 0, SEEK_SET); fprintf(pf, "时间;数据库点号;值;单元号;单元类型;单元描述;测点单元序号;测点描述\n"); } fseek(pf, 0, SEEK_END); //打开Unit.sta静态文件 char pathName[512]; FILE* static_unit; struUnitStatic unit; snprintf(pathName, sizeof(pathName), "%s/%s", configpath, FILE_UNIT_STATIC); static_unit = fopen(pathName, "rb"); //打开yx.sta静态摁键 FILE* static_yx; struYXStatic yx; snprintf(pathName, sizeof(pathName), "%s/%s", configpath, FILE_DATABASE_YX_STATIC); static_yx = fopen(pathName, "rb"); while (m_load != m_save) { //fwrite(&m_soes[m_load], sizeof(struSOE), 1, pf); memset(&unit, 0, sizeof(unit)); if (static_unit != NULL && fseek(static_unit, sizeof(struUnitStatic)*m_soes[m_load].uid, SEEK_SET) == 0) { fread(&unit, sizeof(struUnitStatic), 1, static_unit); unit.name[31] = '\0'; unit.model[15] = '\0'; } memset(&yx, 0, sizeof(yx)); if (static_yx != NULL && fseek(static_yx, sizeof(struYXStatic)*m_soes[m_load].order, SEEK_SET) == 0) { fread(&yx, sizeof(struYXStatic), 1, static_yx); yx.name[63] = '\0'; } fprintf(pf, "%04d/%02d/%02d %02d:%02d:%02d.%03d;%d;%s;%d;%s;%s;%d;%s\n", \ m_soes[m_load].st.year+2000, m_soes[m_load].st.month, m_soes[m_load].st.dayofmonth, m_soes[m_load].st.hour, m_soes[m_load].st.minute, m_soes[m_load].st.millisecond / 1000, m_soes[m_load].st.millisecond %1000, m_soes[m_load].order, m_soes[m_load].value ? "ON" : "OFF", m_soes[m_load].uid, unit.model, unit.name, m_soes[m_load].point, yx.name); m_load++; m_load = m_load % DATABASE_SOE_NUM; } fclose(pf); if (static_unit) fclose(static_unit); if (static_yx) fclose(static_yx); } BOOLEAN CSOE::GetSOE(LONG& pos, unionCP56Time& st, int& order, BOOLEAN& value, BYTE& qds) { struSOE* pSOE; if (pos < 0 || pos >= DATABASE_SOE_NUM) pos = 0; while (pos != m_save) { pSOE = &m_soes[pos]; if (pSOE->order >= 0 && pSOE->order < DATABASE_YX_NUM) break; pos++; pos = pos % DATABASE_SOE_NUM; } if (pos == m_save) return FALSE; st.year = pSOE->st.year; st.month = pSOE->st.month; st.dayofmonth = pSOE->st.dayofmonth; st.dayofweek = pSOE->st.dayofweek; st.hour = pSOE->st.hour; st.minute = pSOE->st.minute; st.millisecond = pSOE->st.millisecond; st.IV = pSOE->st.IV; st.SU = pSOE->st.SU; order = pSOE->order; value = pSOE->value; qds = pSOE->qds;//((pSOE->bl << 4) | (pSOE->sb << 5) | (pSOE->nt << 6) | (pSOE->iv << 7)); return TRUE; } BOOLEAN CSOE::GetSOE(LONG& pos, unionCP56Time& st, int& order, BOOLEAN& value, BYTE& qds, int& uid, int& point) { struSOE* pSOE; if (pos < 0 || pos >= DATABASE_SOE_NUM) pos = 0; while (pos != m_save) { pSOE = &m_soes[pos]; if (pSOE->order >= 0 && pSOE->order < DATABASE_YX_NUM) break; pos++; pos = pos % DATABASE_SOE_NUM; } if (pos == m_save) return FALSE; st.year = pSOE->st.year; st.month = pSOE->st.month; st.dayofmonth = pSOE->st.dayofmonth; st.dayofweek = pSOE->st.dayofweek; st.hour = pSOE->st.hour; st.minute = pSOE->st.minute; st.millisecond = pSOE->st.millisecond; st.IV = pSOE->st.IV; st.SU = pSOE->st.SU; order = pSOE->order; uid = pSOE->uid; point = pSOE->point; value = pSOE->value; qds = pSOE->qds;//((pSOE->bl << 4) | (pSOE->sb << 5) | (pSOE->nt << 6) | (pSOE->iv << 7)); return TRUE; }