#ifndef CONFIG_H #define CONFIG_H #include #include #include // --- 펌웨어 버전 식별 --- #define FIRMWARE_VERSION "d-apply-v2" // --- Wi-Fi 및 MQTT 설정 --- extern const char* ssid; extern const char* password; extern const char* mqtt_server; extern const char* mqtt_user; extern const char* mqtt_password; extern const char* clientName; // --- PLC Modbus 주소 및 크기 설정 --- #define PLC_SLAVE_ID 1 // PLC 국번 (Modbus ID) // 임시 비트(Coil) 방식 상수 #define M_IN_START_ADDR 1600 // M01000 시작 비트 주소 (100 * 16) #define M_IN_COILS 208 // M01000 ~ M0112F (208개 비트) #define M_IN_WORDS 13 // 내부 버퍼 호환용 워드 크기 유지 #define M_OUT_START_ADDR 3200 // M02000 시작 비트 주소 (200 * 16) #define M_OUT_COILS 192 // M02000 ~ M0211F (192개 비트, D Apply M211C~F 포함하도록 확장) #define M_OUT_WORDS 12 // 내부 버퍼 호환용 워드 크기 유지 // --- D 워드 원격 제어 Apply 비트 (M211C~M211F, 그룹 0~3 대응) --- // PLC 래더는 이 A접이 ON인 동안에만 D203x→실제 설정값 DMOV를 수행한다. // 모멘터리(P접)는 PLC에서 어려워 게이트웨이가 기존 M 모멘터리 엔진으로 ON→OFF 펄스를 생성한다. #define D_APPLY_BIT_BASE 188 // M211C = M2000 기준 offset 188 (그룹 0), 189/190/191 = 그룹 1/2/3 #define D_IN_START_ADDR 2000 // D2000 시작 주소 #define D_IN_WORDS 20 // D2000 ~ D2018 (20 워드, 10 그룹) #define D_OUT_START_ADDR 2030 // D2030 시작 주소 (PLC 메모리 맵 매핑 수정) #define D_OUT_WORDS 8 // D2030 ~ D2036 (8 워드, 4 그룹) // --- 통신 버퍼 (Old/New Double Buffering) --- extern uint16_t M_In_New[M_IN_WORDS]; extern uint16_t M_In_Old[M_IN_WORDS]; extern uint16_t M_Out_New[M_OUT_WORDS]; extern uint16_t M_Out_Old[M_OUT_WORDS]; extern uint16_t M_Out_Pending_Write[M_OUT_WORDS]; extern uint16_t M_Out_Pending_Clear[M_OUT_WORDS]; extern uint16_t D_In_New[D_IN_WORDS]; extern uint16_t D_In_Old[D_IN_WORDS]; extern uint16_t D_Out_New[D_OUT_WORDS]; extern uint16_t D_Out_Old[D_OUT_WORDS]; extern uint8_t D_Out_Pending_Groups; // --- 시스템 상태 및 오류 통계 제어 변수 --- enum SystemState { STATE_INIT, STATE_READ, STATE_WRITE }; extern SystemState currentState; extern unsigned long lastStateChange; extern const unsigned long SLOT_DURATION; // 0.5초 (500ms) extern const unsigned long INIT_DURATION; // 5초 (5000ms) extern bool readExecuted; extern bool writeExecuted; extern unsigned long lastInitReadTime; extern int modbusErrorCount; extern const int MODBUS_MAX_RETRY; // PLC 재부팅 감지 임계값 (10회) extern bool plcOnline; extern unsigned long lastMqttRetry; extern bool initSequenceStarted; extern bool force_write_M_once; extern bool force_write_D_once; extern bool full_sync_pending; extern char pending_command_id[40]; extern bool pending_command_active; extern bool pending_command_type_is_m; extern unsigned long pending_command_time; // 명령 수신 시점 저장용 타임스탬프 // --- D Apply 펄스 상태 (D 쓰기 성공 후 M211C~F ON→OFF 완료 시점에 PLC_APPLIED 발행) --- // 기존 M 모멘터리 엔진을 재사용하되, D 명령의 ACK를 Apply OFF 완료까지 지연시키기 위한 최소 상태. extern bool d_apply_pending; // D 쓰기는 끝났고 Apply 펄스 완료를 기다리는 중 extern uint16_t d_apply_word_mask; // Apply 대상 M211C~F 비트가 속한 워드의 비트 마스크 extern int d_apply_word_idx; // Apply 비트가 속한 워드 인덱스 (M211C~F는 모두 word 11) // 함수 선언 void setup_buffers(); void snapshot_pending_command_buffers(bool is_m_command); void rollback_pending_command_buffers(); #endif // CONFIG_H