초기화

This commit is contained in:
2026-07-15 18:37:19 +09:00
commit 94abc5461d
1268 changed files with 380198 additions and 0 deletions
+97
View File
@@ -0,0 +1,97 @@
#ifndef CONFIG_H
#define CONFIG_H
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
// --- 펌웨어 버전 식별 ---
#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