From f751863707a5d0ae928123ba2d79ceb6c0e984dd Mon Sep 17 00:00:00 2001 From: sc <2401809606@qq.com> Date: Fri, 21 Nov 2025 02:32:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE=E5=A4=84?= =?UTF-8?q?=E7=90=86=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/DATA_comm.c | 493 ++++++++++++++++++++++++++++++++ applications/DATA_comm.h | 31 ++ applications/DATA_uart.c | 151 ++++++++++ applications/DATA_uart.h | 15 + applications/SC828_DATA_table.c | 231 +++++++++++++++ applications/SC828_DATA_table.h | 35 +++ applications/TMPFS_root.c | 38 +++ applications/Variable.c | 105 +++++++ applications/Variable.h | 89 ++++++ applications/language.c | 415 +++++++++++++++++++++++++++ applications/language.h | 214 ++++++++++++++ 11 files changed, 1817 insertions(+) create mode 100644 applications/DATA_comm.c create mode 100644 applications/DATA_comm.h create mode 100644 applications/DATA_uart.c create mode 100644 applications/DATA_uart.h create mode 100644 applications/SC828_DATA_table.c create mode 100644 applications/SC828_DATA_table.h create mode 100644 applications/TMPFS_root.c create mode 100644 applications/Variable.c create mode 100644 applications/Variable.h create mode 100644 applications/language.c create mode 100644 applications/language.h diff --git a/applications/DATA_comm.c b/applications/DATA_comm.c new file mode 100644 index 0000000..21087cd --- /dev/null +++ b/applications/DATA_comm.c @@ -0,0 +1,493 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-10-20 Administrator the first version + */ +/* DATA_comm.c */ +#include +#include "cjson.h" +#include +#include +#include +#include "data_comm.h" +#include "language.h" +#include "Variable.h" +#include "SC828_DATA_table.h" +#include "DB_SQLite.h" + +#define DBG_TAG "dat_comm" +#define DBG_LVL DBG_LOG +#include + +rt_mq_t proc_mq; + +char cjson_falg=0;//是否解析cjson +char *json_buffer=NULL; + +// + +/** + * 截取两个指定子串之间的内容 + * @param src 源字符串 + * @param start 起始子串 + * @param end 结束子串 + * @param buf 目标缓冲区 + * @param buf_len 缓冲区大小 + * @return 成功返回 0,失败返回 -1 + */ +int extract_between(const char *src, const char *start, const char *end, char *buf, size_t buf_len) +{ + const char *p1, *p2; + size_t len; + + p1 = strstr(src, start); + if (!p1) return -1; + p1 += strlen(start); // 跳过起始子串 + + p2 = strstr(p1, end); + if (!p2) return -1; + + len = p2 - p1; + if (len >= buf_len) len = buf_len - 1; + memcpy(buf, p1, len); + buf[len] = '\0'; + + return 0; +} +// 提取字符串并安全拷贝 +#define GET_STRING(dst, obj, key, size) do { \ + cJSON* _item = cJSON_GetObjectItem(obj, key); \ + if (cJSON_IsString(_item) && _item->valuestring != NULL) { \ + strncpy(dst, _item->valuestring, (size) - 1); \ + (dst)[(size) - 1] = '\0'; \ + } \ +} while(0) +// 提取浮点数 +#define GET_FLOAT_VAR(var, obj, key, default_val)do { \ + cJSON *_item = cJSON_GetObjectItem((obj), (key)); \ + (var) = (_item && cJSON_IsNumber(_item)) ? (float)(_item->valuedouble) : (default_val); \ +} while(0) +// 提取整数(int 类型) +#define GET_INT_VAR(var, obj, key, default_val) do { \ + cJSON* _item = cJSON_GetObjectItem(obj, key); \ + (var) = cJSON_IsNumber(_item) ? (int)_item->valueint : (default_val); \ +} while(0) +#define GET_INT_FROM_ANY(var, obj, key, default_val)do { \ + cJSON *_item = cJSON_GetObjectItem((obj), (key)); \ + if (_item) { \ + if (cJSON_IsNumber(_item)) { \ + (var) = (int)(_item->valueint); \ + } else if (cJSON_IsString(_item) && _item->valuestring) { \ + (var) = atoi(_item->valuestring); \ + } else { \ + (var) = (default_val); \ + } \ + } else { \ + (var) = (default_val); \ + } \ +} while(0) + +// ===== cJSON分析 =====// +void pasre_DAT(const char *api, const char *json_str) +{ + cJSON *root=cJSON_Parse(json_str); + cJSON *dat=cJSON_CreateObject(); + + if(json_buffer) + { + free(json_buffer); + json_buffer=NULL; + } + + if(strlen(json_str)>4) + { + cjson_falg=1; + //判断json解析是否成功 + if(!root) + { + rt_kprintf("JSON parse error :%s\n",cJSON_GetErrorPtr()); + cJSON_Delete(root); + // return "JSON parse error\n"; + } + } + + if (strcmp(api, "SC800") == 0) + {// 处理 SC800 + cJSON_AddItemToObject(dat,"Name",cJSON_CreateString(machine_name)); + cJSON_AddItemToObject(dat,"Station",cJSON_CreateString(machine_ID)); + cJSON_AddItemToObject(dat,"SYSKEY",cJSON_CreateString(machine_ID)); + cJSON_AddItemToObject(dat,"Groups",cJSON_CreateString(machine_ID)); + } + else if (strcmp(api, "SC810") == 0) + { + char Work_[25]; + char Dye_[25]; + char STime_[25]; + char pTime_[10]; + // 字符串赋值 + GET_STRING(Work_, root, "Work", sizeof(Work_)); + GET_STRING(Dye_, root, "Dye", sizeof(Dye_)); + GET_STRING(STime_, root, "STime", sizeof(STime_)); + GET_STRING(pTime_, root, "Time", sizeof(pTime_)); + + // 定义足够大的缓冲区 + char sql[512] = {0}; // 初始化为 0 + // 安全格式化 + rt_snprintf(sql, sizeof(sql), + "INSERT INTO WorkOrder(WorkOrder,DYELOT,ReDye,StartTime,Time)" + "VALUES('%s','%s',0,'%s','%s')", + Work_, Dye_, STime_,pTime_); + if( db_send_command(DB_CMD_EXEC, sql, 500)==RT_EOK) // + { + cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work_)); + cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(0)); + } + } + else if (strcmp(api, "SC811") == 0) + {//工单明细 + char Work_[25]; + char Dye_[25]; + char StepID_[4]; + char SIDS1_[4]; + int StepN_; + int P1_; + int P2_; + int P3_; + int P4_; + int P5_; + int P1S1_; + int P2S1_; + int P3S1_; + int P4S1_; + int P5S1_; + // 字符串赋值 + GET_STRING(Work_, root, "Work", sizeof(Work_)); + GET_STRING(Dye_, root, "Dye", sizeof(Dye_)); + GET_STRING(StepID_, root, "StepID", sizeof(StepID_)); + GET_STRING(SIDS1_, root, "SIDS1", sizeof(SIDS1_)); + //整数 + GET_INT_FROM_ANY(StepN_, root, "Step", 0); + GET_INT_FROM_ANY(P1_, root, "P1", 0); + GET_INT_FROM_ANY(P2_, root, "P2", 0); + GET_INT_FROM_ANY(P3_, root, "P3", 0); + GET_INT_FROM_ANY(P4_, root, "P4", 0); + GET_INT_FROM_ANY(P5_, root, "P5", 0); + GET_INT_FROM_ANY(P1S1_, root, "P1S1",0); + GET_INT_FROM_ANY(P2S1_, root, "P2S1",0); + GET_INT_FROM_ANY(P3S1_, root, "P3S1",0); + GET_INT_FROM_ANY(P4S1_, root, "P4S1",0); + GET_INT_FROM_ANY(P5S1_, root, "P5S1",0); + + // 定义足够大的缓冲区 + char sql[512] = {0}; // 初始化为 0 + + // 安全格式化 + rt_snprintf(sql, sizeof(sql), + "INSERT INTO WorkorderSteps(WorkOrder,DYELOT,ReDye,Step,StepID,P1,P2,P3,P4,P5,StepID_S1,P1_S1,P2_S1,P3_S1,P4_S1,P5_S1)" + "VALUES('%s','%s',0,%d,'%s',%d,%d,%d,%d,%d,'%s',%d,%d,%d,%d,%d)", + Work_, Dye_, StepN_,StepID_,P1_, P2_, P3_, P4_, P5_,SIDS1_,P1S1_,P2S1_,P3S1_,P4S1_,P5S1_ ); + if( db_send_command(DB_CMD_EXEC, sql, 500)==RT_EOK) // + { + cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work_)); + cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(0)); + cJSON_AddItemToObject(dat,"Step",cJSON_CreateNumber(StepN_)); + } + } + else if (strcmp(api, "SC812") == 0) + {//工单设定 + char Work_[25]; + int Pump_; + int Blower_; + int ClothWheel_; + int Swing_; + int Nozzle_; + // 字符串赋值 + GET_STRING(Work_, root, "WorkOrder", sizeof(Work_)); + //整数 + GET_INT_FROM_ANY(Pump_, root, "PumpSpeed", 0); + GET_INT_FROM_ANY(Blower_, root, "Blower", 0); + GET_INT_FROM_ANY(ClothWheel_, root, "ClothWheel", 0); + GET_INT_FROM_ANY(Swing_, root, "Swing", 0); + GET_INT_FROM_ANY(Nozzle_, root, "Nozzle", 0); + + // 定义足够大的缓冲区 + char sql[512] = {0}; // 初始化为 0 + // 安全格式化 + rt_snprintf(sql, sizeof(sql), + "INSERT OR IGNORE INTO WorkOrderSet(WorkOrder,ReDye,PumpSpeed,Blower,ClothWheel,Swing,Nozzle)" + "VALUES('%s',0,%d,%d,%d,%d,%d)", + Work_, Pump_,Blower_,ClothWheel_, Swing_, Nozzle_); + if( db_send_command(DB_CMD_EXEC, sql, 500)==RT_EOK) // + { + cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work_)); + cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(0)); + } + } + else if (strcmp(api, "SC813") == 0) + {//领料单插入 + char Work_[25]; + char Dye_[25]; + char ProductCode_[15]; + char ProductName_[15]; + char Grams_[8]; + int ProductType_; + int StepN_; + //字符 + GET_STRING(Work_, root, "Work", sizeof(Work_)); + GET_STRING(Dye_, root, "Dye", sizeof(Dye_)); + GET_STRING(ProductName_, root, "ProductName", sizeof(ProductName_)); + GET_STRING(ProductCode_, root, "ProductCode", sizeof(ProductCode_)); + GET_STRING(Grams_, root, "Grams", sizeof(Grams_)); + //整数 + GET_INT_FROM_ANY(StepN_, root, "Step", 0); + GET_INT_FROM_ANY(ProductType_, root, "ProductType", 0); + + // 定义足够大的缓冲区 + char sql[512] = {0}; // 初始化为 0 + // 安全格式化 + rt_snprintf(sql, sizeof(sql), + "INSERT OR IGNORE INTO Dyelot(WorkOrder,Dyelot,ReDye,Step,ProductCode,ProductName,ProductType,Grams)" + "VALUES('%s','%s',0,%d,%s,%s,%d,%s)", + Work_, Dye_,StepN_,ProductCode_,ProductName_ ,ProductType_,Grams_); + if( db_send_command(DB_CMD_EXEC, sql, 500)==RT_EOK) // + { + cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work_)); + cJSON_AddItemToObject(dat,"Dye",cJSON_CreateString(Dye_)); + cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(0)); + cJSON_AddItemToObject(dat,"Step",cJSON_CreateNumber(StepN_)); + } + } + else if (strcmp(api, "SC820") == 0) + {//设置系统时间 + char Time_[25]; + + GET_STRING(Time_, root, "Work", sizeof(Time_)); + + cJSON_AddItemToObject(dat,"time",cJSON_CreateString("systime")); + } + else if (strcmp(api, "SC821") == 0) + { + printf("Processing:SC821\n"); + } + else if (strcmp(api, "SC822") == 0) + { + printf("Processing:SC822\n"); + } + else if (strcmp(api, "SC827") == 0) + { + printf("Processing:SC827\n"); + } + else if (strcmp(api, "SC828") == 0) + { + printf("Processing:SC828\n"); + } + else if (strcmp(api, "SC829") == 0) + {//锁定自动 + char NAME_[4]; + char VALUE_[4]; + GET_STRING(NAME_, root, "NAME", sizeof(NAME_)); + GET_STRING(VALUE_, root, "VALUE", sizeof(VALUE_)); + + if (strcmp(NAME_, "LOCK") == 0) { + if (strcmp(VALUE_, "True") == 0) + {MACHINE_LOCK=1;}else{MACHINE_LOCK=0;} + } + if (strcmp(NAME_, "AUTO") == 0) { + if (strcmp(VALUE_, "True") == 0) + {MACHINE_AUTO=1;}else{MACHINE_AUTO=0;} + } + + cJSON_AddItemToObject(dat,"NAME",cJSON_CreateString(NAME_)); + cJSON_AddItemToObject(dat,"VALUE",cJSON_CreateString(VALUE_)); + } + else if (strcmp(api, "SC830") == 0) + {//当前信息 + cJSON_AddItemToObject(dat,"ERR",cJSON_CreateBool(MACHINE_ERR)); + cJSON_AddItemToObject(dat,"LOCK",cJSON_CreateBool(MACHINE_LOCK)); + cJSON_AddItemToObject(dat,"Status",cJSON_CreateString(Message)); + cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work)); + cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(Redye)); + cJSON_AddItemToObject(dat,"Process",cJSON_CreateString(Process)); + cJSON_AddItemToObject(dat,"Step",cJSON_CreateString(Step)); + cJSON_AddItemToObject(dat,"User",cJSON_CreateBool(MACHINE_USER)); + cJSON_AddItemToObject(dat,"InfoS",cJSON_CreateNumber(UserInfoStart)); + cJSON_AddItemToObject(dat,"Info",cJSON_CreateString(Info)); + cJSON_AddItemToObject(dat,"RUN",cJSON_CreateNumber(RUN)); + cJSON_AddItemToObject(dat,"STEPID",cJSON_CreateNumber(STEPID)); + cJSON_AddItemToObject(dat,"CALL",cJSON_CreateBool(MACHINE_CALL)); + cJSON_AddItemToObject(dat,"MST",cJSON_CreateNumber(MST)); + cJSON_AddItemToObject(dat,"MTT",cJSON_CreateNumber(MTT)); + cJSON_AddItemToObject(dat,"MTL",cJSON_CreateNumber(MTL)); + cJSON_AddItemToObject(dat,"MTH",cJSON_CreateNumber(MTH)); + cJSON_AddItemToObject(dat,"MUT",cJSON_CreateNumber(MUT)); + cJSON_AddItemToObject(dat,"STTA",cJSON_CreateNumber(STTA)); + cJSON_AddItemToObject(dat,"STLA",cJSON_CreateNumber(STLA)); + cJSON_AddItemToObject(dat,"STTB",cJSON_CreateNumber(STTB)); + cJSON_AddItemToObject(dat,"STLB",cJSON_CreateNumber(STLB)); + cJSON_AddItemToObject(dat,"STTC",cJSON_CreateNumber(STTC)); + cJSON_AddItemToObject(dat,"STLC",cJSON_CreateNumber(STLC)); + } + else if (strcmp(api, "SC831") == 0) + {//当前步骤信息 + cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work)); + cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(Redye)); + } + else if (strcmp(api, "SC832") == 0) + {//当前细节信息 + cJSON_AddItemToObject(dat,"Pump",cJSON_CreateNumber(Pump));//泵 + cJSON_AddItemToObject(dat,"TC",cJSON_CreateNumber(TC));//温度比例 + cJSON_AddItemToObject(dat,"Fan",cJSON_CreateNumber(Fan));//风机 + cJSON_AddItemToObject(dat,"Pull",cJSON_CreateNumber(Pull));//提布 + cJSON_AddItemToObject(dat,"Swing",cJSON_CreateNumber(Swing));//摆布 + cJSON_AddItemToObject(dat,"STA",cJSON_CreateNumber(STA));//料1 + cJSON_AddItemToObject(dat,"STB",cJSON_CreateNumber(STB));//料2 + cJSON_AddItemToObject(dat,"STC",cJSON_CreateNumber(STC));//料3 + } + else if (strcmp(api, "SC833") == 0) + {//当前领料单信息 + cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work)); + cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(Redye)); + } + else if (strcmp(api, "SC851") == 0) + {//创建数组 + cJSON *Dev = cJSON_CreateArray(); + for (int i = 0; i < DIO_TABLE_SIZE; i++) { + cJSON* item = cJSON_CreateObject(); + // 添加 IO 编号 + cJSON_AddItemToObject(item, "P", cJSON_CreateNumber(dio_table[i].pin)); + // 添加默认值 + cJSON_AddItemToObject(item, "D", cJSON_CreateNumber(dio_table[i].current_state)); + // 添加枚举名称(字符串形式) + //cJSON_AddStringToObject(item, "str_enum_name", lang_get_str(dio_table[i].name)); + // 将当前项添加到数组中 + cJSON_AddItemToArray(Dev, item); + } + cJSON_AddItemToObject(dat,"DIO",Dev); + } + else if (strcmp(api, "SC852") == 0) + {//创建数组 + cJSON *Dev = cJSON_CreateArray(); + for (int i = 0; i < AIO_TABLE_SIZE; i++) { + cJSON* item = cJSON_CreateObject(); + // 添加 IO 编号 + cJSON_AddNumberToObject(item, "P", aio_table[i].pin); + // 添加默认值 + cJSON_AddNumberToObject(item, "A", aio_table[i].current_Value); + // 将当前项添加到数组中 + cJSON_AddItemToArray(Dev, item); + } + cJSON_AddItemToObject(dat,"A",Dev); + } + else if (strcmp(api, "SC853") == 0) + {//创建数组 + cJSON *Dev = cJSON_CreateArray(); + for (int i = 0; i < DATA_TABLE_SIZE; i++) { + cJSON* item = cJSON_CreateObject(); + // 添加 IO 编号 + cJSON_AddNumberToObject(item, "P", data_table[i].pin); + // 添加默认值 + cJSON_AddNumberToObject(item, "M", data_table[i].current_data); + // 将当前项添加到数组中 + cJSON_AddItemToArray(Dev, item); + } + cJSON_AddItemToObject(dat,"M",Dev); + } + else if (strcmp(api, "SC854") == 0) { + + printf("Processing:SC854\n"); + + } + else if (strcmp(api, "SC855") == 0) { + printf("Processing:SC855\n"); + + } + else if (strcmp(api, "SC859") == 0) { + printf("Processing:SC859\n"); + + } + else if (strcmp(api, "SC861") == 0) { + printf("Processing:SC861\n"); + + } + else if (strcmp(api, "SC862") == 0) { + printf("Processing:SC862\n"); + + } + else { + memcpy(DATA_api,"SC999",5); + } + + json_buffer=cJSON_PrintUnformatted(dat); + cJSON_Delete(root); + cJSON_Delete(dat); +} + +void proc_thread_entry(void *parameter) +{ + struct proc_request *req; + while (1) + { + // 接收请求指针 + if (rt_mq_recv(proc_mq, &req, sizeof(req), RT_WAITING_FOREVER) == RT_EOK) + { + if (!req) continue; + memcpy(DATA_api,req->input,5); + extract_between(req->input, "[", "]", DATA_machins, sizeof(DATA_machins)); + + if(strcmp(DATA_machins,machine_ID)==0) + { + char *p=strstr(req->input,"]"); + if(!p){cjson_falg=0;} + else { + p += strlen("]"); + } + + //处理指令分析 + pasre_DAT(DATA_api,p); + + // 回复 + int16_t total_len = strlen(machine_ID) + strlen(json_buffer) + 8; + char t_buffer[total_len]; + snprintf(t_buffer,total_len,"%s[%s]%s\n",DATA_api,machine_ID,json_buffer); + req->output_len = rt_snprintf(req->output, sizeof(req->output),t_buffer); + }else{ + req->output_len=0; + } + + // 通知 UART 线程可以发送了 + if (req->sem) + { + rt_sem_release(req->sem); + } + } + } +} + +int data_comm_init(void) +{ + proc_mq = rt_mq_create("proc_mq", sizeof(struct proc_request*), 5, RT_IPC_FLAG_FIFO); + if (proc_mq == RT_NULL) + { + rt_kprintf("Failed to create message queue!\n"); + return -1; + } + + rt_thread_t tid = rt_thread_create("dat_comm", proc_thread_entry, RT_NULL, + 1024*6, 20, 10); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + LOG_I("Create cJSON thread"); + } + else + { + LOG_D("Failed to create cJSON thread!\n"); + } + + return 0; +} +//INIT_COMPONENT_EXPORT(data_comm_init); diff --git a/applications/DATA_comm.h b/applications/DATA_comm.h new file mode 100644 index 0000000..41edfe6 --- /dev/null +++ b/applications/DATA_comm.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-10-20 Administrator the first version + */ +#ifndef APPLICATIONS_DATA_COMM_H_ +#define APPLICATIONS_DATA_COMM_H_ + +// 最大输入/输出长度 +#define MAX_INPUT_LEN 512 +#define MAX_OUTPUT_LEN 1024*3 + +// 请求结构体 +struct proc_request { + char input[MAX_INPUT_LEN]; + int input_len; + char output[MAX_OUTPUT_LEN]; + int output_len; + struct rt_semaphore *sem; // 指向动态分配的信号量 +}; + +// 消息队列(供外部使用) +extern rt_mq_t proc_mq; + +int data_comm_init(void); + +#endif /* APPLICATIONS_DATA_COMM_H_ */ diff --git a/applications/DATA_uart.c b/applications/DATA_uart.c new file mode 100644 index 0000000..d1cda58 --- /dev/null +++ b/applications/DATA_uart.c @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-10-20 Administrator the first version + * 2025-11-12 Modified Switch to IDLE interrupt mode (no DMA, no ringbuffer) + */ +#include +#include +#include "data_comm.h" + +#define SAMPLE_UART_NAME "uart1" +#define RX_LINE_BUF_SIZE 1024 // 假设 MAX_INPUT_LEN 已定义,如 256 + +static rt_device_t serial; +static struct rt_semaphore rx_sem; + +// 接收回调:注意 size 实际是事件指针(RT-Thread 特性) +static rt_err_t uart_rx_ind(rt_device_t dev, rt_size_t size) +{ + rt_uint32_t event = *(rt_uint32_t *)&size; // 强制解释为事件 + + // if (event & RT_SERIAL_EVENT_RX_IDLE) + { + rt_sem_release(&rx_sem); + } + return RT_EOK; +} + +// 从串口设备读取一行(以 \n 结尾) +static int read_line_from_uart(char *buf, int maxlen) +{ + char ch; + int len = 0; + + while (len < maxlen - 1) + { + // 从串口缓冲区读一个字节(非阻塞,因为由 IDLE 触发说明有数据) + if (rt_device_read(serial, 0, &ch, 1) <= 0) + { + break; // 无数据(理论上不应发生) + } + + buf[len++] = ch; + + if (ch == '\n') + { + buf[len] = '\0'; + return len; + } + } + + // 缓冲区满仍未遇到 \n,强制结束(可选策略) + buf[len] = '\0'; + return len; +} + +void uart_thread_entry(void *parameter) +{ + char input[RX_LINE_BUF_SIZE]; + int len; + + // 初始化信号量 + rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); + + // 查找串口设备 + serial = rt_device_find(SAMPLE_UART_NAME); + if (!serial) + { + rt_kprintf("Cannot find %s\n", SAMPLE_UART_NAME); + return; + } + + // 配置串口:设置内部接收缓冲区大小(必须 >= 最大可能的一行) + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.bufsz = RX_LINE_BUF_SIZE; // 关键:驱动内部 buffer 要够大 + rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config); + + // 打开串口:使用中断接收(INT_RX),不使用 DMA + rt_err_t result = rt_device_open(serial, RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX); + if (result != RT_EOK) + { + rt_kprintf("Failed to open %s with INT, error=%d\n", SAMPLE_UART_NAME, result); + return; + } + + // 设置接收回调(用于接收 IDLE 事件) + rt_device_set_rx_indicate(serial, uart_rx_ind); + + rt_kprintf("UART thread (IDLE mode) running on %s...\n", SAMPLE_UART_NAME); + + while (1) + { + // 等待空闲中断通知 + if (rt_sem_take(&rx_sem, RT_WAITING_FOREVER) == RT_EOK) + { + // 读取完整行 + len = read_line_from_uart(input, sizeof(input)); + if (len <= 0) continue; + + // 构造请求 + struct proc_request *req = rt_malloc(sizeof(struct proc_request)); + if (!req) continue; + + rt_strncpy(req->input, input, sizeof(req->input) - 1); + req->input_len = len; + + req->sem = rt_malloc(sizeof(struct rt_semaphore)); + if (!req->sem) + { + rt_free(req); + continue; + } + rt_sem_init(req->sem, "uart_resp", 0, RT_IPC_FLAG_FIFO); + + // 发送至处理队列 + if (rt_mq_send(proc_mq, &req, sizeof(req)) == RT_EOK) + { + // 等待响应 + if (rt_sem_take(req->sem, RT_WAITING_FOREVER) == RT_EOK) + { + rt_device_write(serial, 0, req->output, req->output_len); + } + } + + // 清理资源 + rt_sem_detach(req->sem); + rt_free(req->sem); + rt_free(req); + } + } +} + +// 启动 UART 线程 +int start_uart_thread(void) +{ + rt_thread_t tid = rt_thread_create("data_uart", + uart_thread_entry, + RT_NULL, + 2048, // 栈大小(2KB 足够) + 25, // 优先级 + 10); // 时间片 + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + return 0; +} diff --git a/applications/DATA_uart.h b/applications/DATA_uart.h new file mode 100644 index 0000000..12e7c93 --- /dev/null +++ b/applications/DATA_uart.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-10-20 Administrator the first version + */ +#ifndef APPLICATIONS_DATA_UART_H_ +#define APPLICATIONS_DATA_UART_H_ + +int start_uart_thread(void); + +#endif /* APPLICATIONS_DATA_UART_H_ */ diff --git a/applications/SC828_DATA_table.c b/applications/SC828_DATA_table.c new file mode 100644 index 0000000..c08b8dc --- /dev/null +++ b/applications/SC828_DATA_table.c @@ -0,0 +1,231 @@ +#include "SC828_DATA_table.h" + +// 系统数据状态表(表格) +IO_State_DATA data_table[] = { + {1001, 0, STR_COMM_COUNTER}, + {1002, 0, STR_COMM_FAULT_COUNTER}, + {1003, 0, STR_CYCLE_TEMP_RISE_SET}, + {1004, 0, STR_TEMP_CONTROL_RATIO}, + {1005, 0, STR_CALCULATED_TEMP}, + {1006, 0, STR_FLOW_COUNTER}, + {1007, 0, STR_GLOBAL_FLOW_COUNTER}, + {1008, 0, STR_NOZZLE_SETTING}, + {1009, 0, STR_MAIN_PUMP_SPEED_SET}, + {1010, 0, STR_FAN_SPEED_SET}, + {1011, 0, STR_TARGET_PH_SET}, + {1012, 0, STR_PH_DEVICE_STATUS} +}; + +// DIO状态表(表格) +IO_State_DIO dio_table[] = { + {2001, 0, STR_EMERGENCY_STOP}, + {2002, 0, STR_TEMP_LOCK}, + {2003, 0, STR_PRESSURE_LOCK}, + {2004, 0, STR_CALL_CONFIRM}, + {2005, 0, STR_MANUAL}, + {2006, 0, STR_FAN_START}, + {2007, 0, STR_FAN_FAULT}, + {2008, 0, STR_MAIN_PUMP_FAULT}, + {2009, 0, STR_ROLL_RESET}, + {2010, 0, STR_FABRIC_FAULT}, + {2011, 0, STR_ELEC_FAULT}, + {2012, 0, STR_MATERIAL_PUMP1}, + {2013, 0, STR_MATERIAL_PUMP2}, + {2014, 0, STR_MATERIAL_PUMP3}, + {2015, 0, STR_MANUAL1}, + {2016, 0, STR_COIL_CAR1}, + {2017, 0, STR_FABRIC_HEAD1}, + {2018, 0, STR_ROLL_FWD1}, + {2019, 0, STR_ROLL_REV1}, + {2020, 0, STR_ROLL_OVERLOAD1}, + {2021, 0, STR_BLOCK_FABRIC1}, + {2022, 0, STR_MATERIAL1_HIGH}, + {2023, 0, STR_MATERIAL1_LOW}, + {2024, 0, STR_MATERIAL1_IN}, + {2025, 0, STR_MATERIAL1_OUT}, + {2026, 0, STR_MATERIAL1_RECIRC}, + {2027, 0, STR_MATERIAL1_BOTTOM}, + {2028, 0, STR_MATERIAL1_FILL}, + {2029, 0, STR_MATERIAL1_HEAT}, + {2030, 0, STR_MATERIAL2_HIGH}, + {2031, 0, STR_MATERIAL2_LOW}, + {2032, 0, STR_MATERIAL2_IN}, + {2033, 0, STR_MATERIAL2_OUT}, + {2034, 0, STR_MATERIAL2_RECIRC}, + {2035, 0, STR_MATERIAL2_BOTTOM}, + {2036, 0, STR_MATERIAL2_FILL}, + {2037, 0, STR_MATERIAL2_HEAT}, + {2038, 0, STR_MATERIAL2_STIR}, + {2039, 0, STR_MANUAL2}, + {2040, 0, STR_COIL_CAR2}, + {2041, 0, STR_FABRIC_HEAD2}, + {2042, 0, STR_ROLL_FWD2}, + {2043, 0, STR_ROLL_REV2}, + {2044, 0, STR_ROLL_OVERLOAD2}, + {2045, 0, STR_BLOCK_FABRIC2}, + {2046, 0, STR_MANUAL3}, + {2047, 0, STR_COIL_CAR3}, + {2048, 0, STR_FABRIC_HEAD3}, + {2049, 0, STR_ROLL_FWD3}, + {2050, 0, STR_ROLL_REV3}, + {2051, 0, STR_ROLL_OVERLOAD3}, + {2052, 0, STR_BLOCK_FABRIC3}, + {2053, 0, STR_MANUAL4}, + {2054, 0, STR_COIL_CAR4}, + {2055, 0, STR_FABRIC_HEAD4}, + {2056, 0, STR_ROLL_FWD4}, + {2057, 0, STR_ROLL_REV4}, + {2058, 0, STR_ROLL_OVERLOAD4}, + {2059, 0, STR_BLOCK_FABRIC4}, + {2060, 0, STR_MANUAL5}, + {2061, 0, STR_COIL_CAR5}, + {2062, 0, STR_FABRIC_HEAD5}, + {2063, 0, STR_ROLL_FWD5}, + {2064, 0, STR_ROLL_REV5}, + {2065, 0, STR_ROLL_OVERLOAD5}, + {2066, 0, STR_BLOCK_FABRIC5}, + {2067, 0, STR_MANUAL6}, + {2068, 0, STR_COIL_CAR6}, + {2069, 0, STR_FABRIC_HEAD6}, + {2070, 0, STR_ROLL_FWD6}, + {2071, 0, STR_ROLL_REV6}, + {2072, 0, STR_ROLL_OVERLOAD6}, + {2073, 0, STR_BLOCK_FABRIC6}, + {2074, 0, STR_MATERIAL3_HIGH}, + {2075, 0, STR_MATERIAL3_LOW}, + {2076, 0, STR_MATERIAL3_IN}, + {2077, 0, STR_MATERIAL3_OUT}, + {2078, 0, STR_MATERIAL3_RECIRC}, + {2079, 0, STR_MATERIAL3_BOTTOM}, + {2080, 0, STR_MATERIAL3_FILL}, + {2081, 0, STR_MATERIAL3_HEAT}, + {2082, 0, STR_MATERIAL3_STIR}, + // --- DIO 输出(3001~3066)--- +{3001, 0, STR_RED}, // 红 +{3002, 0, STR_GREEN}, // 绿 +{3003, 0, STR_YELLOW}, // 黄 +{3004, 0, STR_ALARM}, // 警报 +{3005, 0, STR_HAND_AUTO}, // 手自动 +{3006, 0, STR_CONFIRM}, // 确认 +{3007, 0, STR_PRESSURIZE_VALVE}, // 加压阀 +{3008, 0, STR_DEPRESSURIZE_VALVE}, // 排压阀 +{3009, 0, STR_HEAT_UP_VALVE}, // 升温阀 +{3010, 0, STR_COOL_DOWN_VALVE}, // 降温阀 +{3011, 0, STR_MAIN_PUMP_START}, // 主泵启动 +{3012, 0, STR_FAN_START}, // 风机启动 +{3013, 0, STR_WATER_IN_1}, // 入水1 +{3014, 0, STR_WATER_IN_2}, // 入水2 +{3015, 0, STR_WATER_IN_3}, // 入水3 +{3016, 0, STR_WATER_IN_4}, // 入水4 +{3017, 0, STR_WATER_OUT_1}, // 排水1 +{3018, 0, STR_WATER_OUT_2}, // 排水2 +{3019, 0, STR_WATER_OUT_3}, // 排水3 +{3020, 0, STR_OVERFLOW_VALVE}, // 溢流阀 +{3021, 0, STR_ROLL_FWD_1}, // 布轮正转1 +{3022, 0, STR_ROLL_REV_1}, // 布轮反转1 +{3023, 0, STR_ROLL_FWD_2}, // 布轮正转2 +{3024, 0, STR_ROLL_REV_2}, // 布轮反转2 +{3025, 0, STR_ROLL_FWD_3}, // 布轮正转3 +{3026, 0, STR_ROLL_REV_3}, // 布轮反转3 +{3027, 0, STR_ROLL_FWD_4}, // 布轮正转4 +{3028, 0, STR_ROLL_REV_4}, // 布轮反转4 +{3029, 0, STR_ROLL_FWD_5}, // 布轮正转5 +{3030, 0, STR_ROLL_REV_5}, // 布轮反转5 +{3031, 0, STR_ROLL_FWD_6}, // 布轮正转6 +{3032, 0, STR_ROLL_REV_6}, // 布轮反转6 +{3033, 0, STR_TANK1_PUMP}, // 药缸1泵 +{3034, 0, STR_TANK1_WATER_IN_1}, // 药缸1入水1 +{3035, 0, STR_TANK1_WATER_IN_2}, // 药缸1入水2 +{3036, 0, STR_TANK1_RETURN_WATER}, // 药缸1回水 +{3037, 0, STR_TANK1_HEAT}, // 药缸1加热 +{3038, 0, STR_TANK1_STIRRER}, // 药缸1搅拌器 +{3039, 0, STR_TANK1_STIR_VALVE}, // 药缸1搅拌阀 +{3040, 0, STR_TANK1_FILL_VALVE}, // 药缸1加料阀 +{3041, 0, STR_TANK1_BYPASS_VALVE}, // 药缸1比例旁通阀 +{3042, 0, STR_TANK1_DRAIN_VALVE}, // 药缸1排水阀 +{3043, 0, STR_TANK2_PUMP}, // 药缸2泵 +{3044, 0, STR_TANK2_WATER_IN_1}, // 药缸2入水1 +{3045, 0, STR_TANK2_WATER_IN_2}, // 药缸2入水2 +{3046, 0, STR_TANK2_RETURN_WATER}, // 药缸2回水 +{3047, 0, STR_TANK2_HEAT}, // 药缸2加热 +{3048, 0, STR_TANK2_STIRRER}, // 药缸2搅拌器 +{3049, 0, STR_TANK2_STIR_VALVE}, // 药缸2搅拌阀 +{3050, 0, STR_TANK2_FILL_VALVE}, // 药缸2加料阀 +{3051, 0, STR_TANK2_BYPASS_VALVE}, // 药缸2比例旁通阀 +{3052, 0, STR_TANK2_DRAIN_VALVE}, // 药缸2排水阀 +{3053, 0, STR_TANK3_PUMP}, // 药缸3泵 +{3054, 0, STR_TANK3_WATER_IN_1}, // 药缸3入水1 +{3055, 0, STR_TANK3_WATER_IN_2}, // 药缸3入水2 +{3056, 0, STR_TANK3_RETURN_WATER}, // 药缸3回水 +{3057, 0, STR_TANK3_HEAT}, // 药缸3加热 +{3058, 0, STR_TANK3_STIRRER}, // 药缸3搅拌器 +{3059, 0, STR_TANK3_STIR_VALVE}, // 药缸3搅拌阀 +{3060, 0, STR_TANK3_FILL_VALVE}, // 药缸3加料阀 +{3061, 0, STR_TANK3_BYPASS_VALVE}, // 药缸3比例旁通阀 +{3062, 0, STR_TANK3_DRAIN_VALVE}, // 药缸3排水阀 +{3063, 0, STR_ROLL_REV_12}, // 布轮反转12 +{3064, 0, STR_DRAIN_PUMP}, // 排水泵 +{3065, 0, STR_HEAT_EXCHANGER_CONDENSATE}, // 热交换器冷凝水 +{3066, 0, STR_HEAT_EXCHANGER_COOLING_WATER}, // 交换器排冷却水 +}; + +//AIO状态表 +IO_State_AIO aio_table[] = { + // --- AIO 输入(4001~4022)--- + {4001, 0, STR_AIO_TEMP1}, + {4002, 0, STR_AIO_TEMP2}, + {4003, 0, STR_AIO_TEMP3}, + {4004, 0, STR_AIO_TEMP4}, + {4005, 0, STR_AIO_TEMP5}, + {4006, 0, STR_AIO_FLOW1}, + {4007, 0, STR_AIO_LEVEL1}, + {4008, 0, STR_AIO_LEVEL2}, + {4009, 0, STR_AIO_LEVEL3}, + {4010, 0, STR_AIO_LEVEL4}, + {4011, 0, STR_AIO_MAIN_PRESSURE}, + {4012, 0, STR_AIO_NOZZLE_PRESSURE}, + {4013, 0, STR_AIO_NOZZLE_FLOW}, + {4014, 0, STR_AIO_AIR_FLOW}, + {4015, 0, STR_AIO_POWER}, + {4016, 0, STR_AIO_FABRIC_CYCLE1}, + {4017, 0, STR_AIO_FABRIC_CYCLE2}, + {4018, 0, STR_AIO_FABRIC_CYCLE3}, + {4019, 0, STR_AIO_FABRIC_CYCLE4}, + {4020, 0, STR_AIO_FABRIC_CYCLE5}, + {4021, 0, STR_AIO_FABRIC_CYCLE6}, + {4022, 0, STR_AIO_PH}, +// --- AO 输出(5001~5014)--- + {5001, 0, STR_AIO_HEAT_RATIO}, + {5002, 0, STR_AIO_COOL_RATIO}, + {5003, 0, STR_AIO_MAIN_PUMP_SPEED}, + {5004, 0, STR_AIO_FAN_SPEED}, + {5005, 0, STR_AIO_FILL_RATIO1}, + {5006, 0, STR_AIO_FILL_RATIO2}, + {5007, 0, STR_AIO_FILL_RATIO3}, + {5008, 0, STR_AIO_FABRIC_SWING}, + {5009, 0, STR_AIO_LIFT1}, + {5010, 0, STR_AIO_LIFT2}, + {5011, 0, STR_AIO_LIFT3}, + {5012, 0, STR_AIO_LIFT4}, + {5013, 0, STR_AIO_LIFT5}, + {5014, 0, STR_AIO_LIFT6} +}; + +const unsigned char DIO_TABLE_SIZE = sizeof(dio_table) / sizeof(dio_table[0]); +const unsigned char AIO_TABLE_SIZE = sizeof(aio_table) / sizeof(aio_table[0]); +const unsigned char DATA_TABLE_SIZE = sizeof(data_table) / sizeof(data_table[0]); + +void DATA_Table_Init(){ + for(int i=0;i +#include +#include + +#define DBG_TAG "tmpfs_init" +#define DBG_LVL DBG_LOG +#include + +int init_tmpfs_root(void) +{ + // 挂载 TMPFS 到根目录(注意类型是 "tmp") + if (dfs_mount(RT_NULL, "/", "tmp", 0, RT_NULL) != RT_EOK) { + LOG_E("Failed to mount TMPFS!"); + return -1; + } + LOG_I("TMPFS mounted as root."); + + /* 3. 测试创建目录 */ + if (mkdir("/run", 0777) == 0) { + LOG_I("Created /run directory"); + } else { + LOG_E("mkdir failed, errno=%d", errno); + } + + return 0; +} + +/* 在应用初始化阶段运行(确保系统已就绪) */ +INIT_APP_EXPORT(init_tmpfs_root); diff --git a/applications/Variable.c b/applications/Variable.c new file mode 100644 index 0000000..aaf4a6c --- /dev/null +++ b/applications/Variable.c @@ -0,0 +1,105 @@ +#include +#include + +// ===== 实际定义 ===== + +// 动态数据缓冲区(初始化为 NULL,后续分配) +char *DATA_dat; +char DATA_machins[3]; +char DATA_api[5]; +char *machine_name = "Q109"; +char machine_ID[3] = "23"; + +// 状态标志 +char MACHINE_ERR = 0; +char MACHINE_LOCK = 0; +char MACHINE_AUTO = 0; +char MACHINE_CALL = 0; +char MACHINE_USER = 0; + +// 字符串变量(RAM 中可修改) +char Work[25]; +char Dye[25]; +char Process[50]; +char Message[40]; +char Step[60]; +char Info[30]; + +// 整型变量 +unsigned int Redye = 0; +unsigned int UserInfoStart = 900; +unsigned int RUN = 0; +unsigned int STEPID = 0; + +// 浮点变量 +float MTT = 0.0f; +float MTL = 0.0f; +float MTH = 6.0f; // 默认目标温度 +float MST = 0.0f; +float MUT = 0.0f; +float STTA = 0.0f; +float STLA = 0.0f; +float STTB = 0.0f; +float STLB = 0.0f; +float STTC = 0.0f; +float STLC = 0.0f; + +// 控制输出 +unsigned int Pump = 0; +unsigned int TC = 0; +unsigned int Fan = 0; +unsigned int Pull = 0; +unsigned int Swing = 0; +unsigned int STA = 0; +unsigned int STB = 0; +unsigned int STC = 0; +unsigned int Time = 0; +unsigned int StepN = 0; +unsigned int P6 = 0; +unsigned int P7 = 0; +unsigned int P8 = 0; +unsigned int P9 = 0; +unsigned int P10 = 0; + +// 步骤功能参数 +unsigned int P1 = 0; +unsigned int P2 =0; +unsigned int P3 =0; +unsigned int P4 =0; +unsigned int P5 =0; +unsigned int P1S1 =0; +unsigned int P2S1 =0; +unsigned int P3S1 =0; +unsigned int P4S1 =0; +unsigned int P5S1 =0; +unsigned int P1S2 =0; +unsigned int P2S2 =0; +unsigned int P3S2 =0; +unsigned int P4S2 =0; +unsigned int P5S2 =0; +unsigned int P1S3 =0; +unsigned int P2S3 =0; +unsigned int P3S3 =0; +unsigned int P4S3 =0; +unsigned int P5S3 =0; + +// 步骤编号字符串 +char StepID[4]; +char SIDS1[4]; +char SIDS2[4]; +char SIDS3[4]; + +// ===== 初始化函数 ===== +void init_global_vars(void) { + strcpy(Work, "Work Order"); + strcpy(Dye, "Work Order"); + strcpy(Process, "Process"); + strcpy(Message, "Message"); + strcpy(Step, "STEP"); + strcpy(Info, "user"); + + strcpy(StepID, "000"); + strcpy(SIDS1, "000"); + strcpy(SIDS2, "000"); + strcpy(SIDS3, "000"); +} diff --git a/applications/Variable.h b/applications/Variable.h new file mode 100644 index 0000000..ddbb2f9 --- /dev/null +++ b/applications/Variable.h @@ -0,0 +1,89 @@ +#ifndef APPLICATIONS_Variable_H +#define APPLICATIONS_Variable_H + +#include "stdbool.h" + +// ===== 字符串变量 ===== +extern char *DATA_dat; +extern char DATA_machins[3]; +extern char DATA_api[5]; +extern char *machine_name; +extern char machine_ID[3]; + +// ===== 布尔变量 ===== +extern char MACHINE_ERR; +extern char MACHINE_LOCK; +extern char MACHINE_AUTO; +extern char MACHINE_CALL; +extern char MACHINE_USER; + +// ===== 字符串 ===== +extern char Work[25]; +extern char Dye[25]; +extern char Process[50]; +extern char Message[40]; +extern char Step[60]; +extern char Info[30]; + +// ===== 整数变量 ===== +extern unsigned int Redye; +extern unsigned int UserInfoStart; +extern unsigned int RUN; +extern unsigned int STEPID; +extern unsigned int Pump; +extern unsigned int TC; +extern unsigned int Fan; +extern unsigned int Pull; +extern unsigned int Swing; +extern unsigned int STA; +extern unsigned int STB; +extern unsigned int STC; +extern unsigned int Time; +extern unsigned int StepN; +extern unsigned int P6; +extern unsigned int P7; +extern unsigned int P8; +extern unsigned int P9; +extern unsigned int P10; + +// ===== 浮点数变量 ===== +extern float MTT; +extern float MTL; +extern float MTH; +extern float MST; +extern float MUT; +extern float STTA; +extern float STLA; +extern float STTB; +extern float STLB; +extern float STTC; +extern float STLC; +extern unsigned int P1; +extern unsigned int P2; +extern unsigned int P3; +extern unsigned int P4; +extern unsigned int P5; +extern unsigned int P1S1; +extern unsigned int P2S1; +extern unsigned int P3S1; +extern unsigned int P4S1; +extern unsigned int P5S1; +extern unsigned int P1S2; +extern unsigned int P2S2; +extern unsigned int P3S2; +extern unsigned int P4S2; +extern unsigned int P5S2; +extern unsigned int P1S3; +extern unsigned int P2S3; +extern unsigned int P3S3; +extern unsigned int P4S3; +extern unsigned int P5S3; + +extern char StepID[4]; +extern char SIDS1[4]; +extern char SIDS2[4]; +extern char SIDS3[4]; + +void init_global_vars(void); + +#endif diff --git a/applications/language.c b/applications/language.c new file mode 100644 index 0000000..9f98f20 --- /dev/null +++ b/applications/language.c @@ -0,0 +1,415 @@ +// language.c +#include +#include + +lang_t current_lang = LANG_ZH; + +// 英文字符串 +static const char *text_en[STR_COUNT] = { + [STR_EMERGENCY_STOP] = "Emergency Stop", + [STR_TEMP_LOCK] = "Temperature Lock", + [STR_PRESSURE_LOCK] = "Pressure Lock", + [STR_CALL_CONFIRM] = "Call Confirm", + [STR_MANUAL] = "Manual", + [STR_FAN_START] = "Fan Start", + [STR_FAN_FAULT] = "Fan Fault", + [STR_MAIN_PUMP_FAULT] = "Main Pump Fault", + [STR_ROLL_RESET] = "Roll Reset", + [STR_FABRIC_FAULT] = "Fabric Fault", + [STR_ELEC_FAULT] = "Electrical Fault", + [STR_MATERIAL_PUMP1] = "Material Pump 1 Abnormal", + [STR_MATERIAL_PUMP2] = "Material Pump 2 Abnormal", + [STR_MATERIAL_PUMP3] = "Material Pump 3 Abnormal", + [STR_MANUAL1] = "Manual 1", + [STR_COIL_CAR1] = "Coil Car 1", + [STR_FABRIC_HEAD1] = "Fabric Head 1", + [STR_ROLL_FWD1] = "Roll Forward 1", + [STR_ROLL_REV1] = "Roll Reverse 1", + [STR_ROLL_OVERLOAD1] = "Roll Overload 1", + [STR_BLOCK_FABRIC1] = "Block Fabric 1", + [STR_MATERIAL1_HIGH] = "Material 1 High Level", + [STR_MATERIAL1_LOW] = "Material 1 Low Level", + [STR_MATERIAL1_IN] = "Material 1 In Water", + [STR_MATERIAL1_OUT] = "Material 1 Drain", + [STR_MATERIAL1_RECIRC] = "Material 1 Recirculate", + [STR_MATERIAL1_BOTTOM] = "Material 1 Bottom Level", + [STR_MATERIAL1_FILL] = "Material 1 Fill", + [STR_MATERIAL1_HEAT] = "Material 1 Heat", + [STR_MATERIAL2_HIGH] = "Material 2 High Level", + [STR_MATERIAL2_LOW] = "Material 2 Low Level", + [STR_MATERIAL2_IN] = "Material 2 In Water", + [STR_MATERIAL2_OUT] = "Material 2 Drain", + [STR_MATERIAL2_RECIRC] = "Material 2 Recirculate", + [STR_MATERIAL2_BOTTOM] = "Material 2 Bottom Level", + [STR_MATERIAL2_FILL] = "Material 2 Fill", + [STR_MATERIAL2_HEAT] = "Material 2 Heat", + [STR_MATERIAL2_STIR] = "Material 2 Stir", + [STR_MANUAL2] = "Manual 2", + [STR_COIL_CAR2] = "Coil Car 2", + [STR_FABRIC_HEAD2] = "Fabric Head 2", + [STR_ROLL_FWD2] = "Roll Forward 2", + [STR_ROLL_REV2] = "Roll Reverse 2", + [STR_ROLL_OVERLOAD2] = "Roll Overload 2", + [STR_BLOCK_FABRIC2] = "Block Fabric 2", + [STR_MANUAL3] = "Manual 3", + [STR_COIL_CAR3] = "Coil Car 3", + [STR_FABRIC_HEAD3] = "Fabric Head 3", + [STR_ROLL_FWD3] = "Roll Forward 3", + [STR_ROLL_REV3] = "Roll Reverse 3", + [STR_ROLL_OVERLOAD3] = "Roll Overload 3", + [STR_BLOCK_FABRIC3] = "Block Fabric 3", + [STR_MANUAL4] = "Manual 4", + [STR_COIL_CAR4] = "Coil Car 4", + [STR_FABRIC_HEAD4] = "Fabric Head 4", + [STR_ROLL_FWD4] = "Roll Forward 4", + [STR_ROLL_REV4] = "Roll Reverse 4", + [STR_ROLL_OVERLOAD4] = "Roll Overload 4", + [STR_BLOCK_FABRIC4] = "Block Fabric 4", + [STR_MANUAL5] = "Manual 5", + [STR_COIL_CAR5] = "Coil Car 5", + [STR_FABRIC_HEAD5] = "Fabric Head 5", + [STR_ROLL_FWD5] = "Roll Forward 5", + [STR_ROLL_REV5] = "Roll Reverse 5", + [STR_ROLL_OVERLOAD5] = "Roll Overload 5", + [STR_BLOCK_FABRIC5] = "Block Fabric 5", + [STR_MANUAL6] = "Manual 6", + [STR_COIL_CAR6] = "Coil Car 6", + [STR_FABRIC_HEAD6] = "Fabric Head 6", + [STR_ROLL_FWD6] = "Roll Forward 6", + [STR_ROLL_REV6] = "Roll Reverse 6", + [STR_ROLL_OVERLOAD6] = "Roll Overload 6", + [STR_BLOCK_FABRIC6] = "Block Fabric 6", + [STR_MATERIAL3_HIGH] = "Material 3 High Level", + [STR_MATERIAL3_LOW] = "Material 3 Low Level", + [STR_MATERIAL3_IN] = "Material 3 In Water", + [STR_MATERIAL3_OUT] = "Material 3 Drain", + [STR_MATERIAL3_RECIRC] = "Material 3 Recirculate", + [STR_MATERIAL3_BOTTOM] = "Material 3 Bottom Level", + [STR_MATERIAL3_FILL] = "Material 3 Fill", + [STR_MATERIAL3_HEAT] = "Material 3 Heat", + [STR_MATERIAL3_STIR] = "Material 3 Stir", + [STR_AIO_TEMP1] = "Temp 1", + [STR_AIO_TEMP2] = "Temp 2", + [STR_AIO_TEMP3] = "Temp 3", + [STR_AIO_TEMP4] = "Temp 4", + [STR_AIO_TEMP5] = "Temp 5", + [STR_AIO_FLOW1] = "Flow 1", + [STR_AIO_LEVEL1] = "Level 1", + [STR_AIO_LEVEL2] = "Level 2", + [STR_AIO_LEVEL3] = "Level 3", + [STR_AIO_LEVEL4] = "Level 4", + [STR_AIO_MAIN_PRESSURE] = "Main Pressure", + [STR_AIO_NOZZLE_PRESSURE] = "Nozzle Pressure", + [STR_AIO_NOZZLE_FLOW] = "Nozzle Flow", + [STR_AIO_AIR_FLOW] = "Air Flow", + [STR_AIO_POWER] = "Power", + [STR_AIO_FABRIC_CYCLE1] = "Fabric Cycle 1", + [STR_AIO_FABRIC_CYCLE2] = "Fabric Cycle 2", + [STR_AIO_FABRIC_CYCLE3] = "Fabric Cycle 3", + [STR_AIO_FABRIC_CYCLE4] = "Fabric Cycle 4", + [STR_AIO_FABRIC_CYCLE5] = "Fabric Cycle 5", + [STR_AIO_FABRIC_CYCLE6] = "Fabric Cycle 6", + [STR_AIO_PH] = "PH", + [STR_AIO_HEAT_RATIO] = "Heat Ratio", + [STR_AIO_COOL_RATIO] = "Cool Ratio", + [STR_AIO_MAIN_PUMP_SPEED] = "Main Pump Speed", + [STR_AIO_FAN_SPEED] = "Fan Speed", + [STR_AIO_FILL_RATIO1] = "Fill Ratio 1", + [STR_AIO_FILL_RATIO2] = "Fill Ratio 2", + [STR_AIO_FILL_RATIO3] = "Fill Ratio 3", + [STR_AIO_FABRIC_SWING] = "Fabric Swing", + [STR_AIO_LIFT1] = "Lift 1", + [STR_AIO_LIFT2] = "Lift 2", + [STR_AIO_LIFT3] = "Lift 3", + [STR_AIO_LIFT4] = "Lift 4", + [STR_AIO_LIFT5] = "Lift 5", + [STR_AIO_LIFT6] = "Lift 6", + [STR_RED] = "Red", + [STR_GREEN] = "Green", + [STR_YELLOW] = "Yellow", + [STR_ALARM] = "Alarm", + [STR_HAND_AUTO] = "Manual Auto", + [STR_CONFIRM] = "Confirm", + [STR_PRESSURIZE_VALVE] = "Pressurize Valve", + [STR_DEPRESSURIZE_VALVE] = "Depressurize Valve", + [STR_HEAT_UP_VALVE] = "Heat Up Valve", + [STR_COOL_DOWN_VALVE] = "Cool Down Valve", + [STR_MAIN_PUMP_START] = "Main Pump Start", + [STR_WATER_IN_1] = "Water In 1", + [STR_WATER_IN_2] = "Water In 2", + [STR_WATER_IN_3] = "Water In 3", + [STR_WATER_IN_4] = "Water In 4", + [STR_WATER_OUT_1] = "Water Out 1", + [STR_WATER_OUT_2] = "Water Out 2", + [STR_WATER_OUT_3] = "Water Out 3", + [STR_OVERFLOW_VALVE] = "Overflow Valve", + [STR_ROLL_FWD_1] = "Roll Forward 1", + [STR_ROLL_REV_1] = "Roll Reverse 1", + [STR_ROLL_FWD_2] = "Roll Forward 2", + [STR_ROLL_REV_2] = "Roll Reverse 2", + [STR_ROLL_FWD_3] = "Roll Forward 3", + [STR_ROLL_REV_3] = "Roll Reverse 3", + [STR_ROLL_FWD_4] = "Roll Forward 4", + [STR_ROLL_REV_4] = "Roll Reverse 4", + [STR_ROLL_FWD_5] = "Roll Forward 5", + [STR_ROLL_REV_5] = "Roll Reverse 5", + [STR_ROLL_FWD_6] = "Roll Forward 6", + [STR_ROLL_REV_6] = "Roll Reverse 6", + [STR_TANK1_PUMP] = "Tank 1 Pump", + [STR_TANK1_WATER_IN_1] = "Tank 1 Water In 1", + [STR_TANK1_WATER_IN_2] = "Tank 1 Water In 2", + [STR_TANK1_RETURN_WATER] = "Tank 1 Return Water", + [STR_TANK1_HEAT] = "Tank 1 Heat", + [STR_TANK1_STIRRER] = "Tank 1 Stirrer", + [STR_TANK1_STIR_VALVE] = "Tank 1 Stir Valve", + [STR_TANK1_FILL_VALVE] = "Tank 1 Fill Valve", + [STR_TANK1_BYPASS_VALVE] = "Tank 1 Bypass Valve", + [STR_TANK1_DRAIN_VALVE] = "Tank 1 Drain Valve", + [STR_TANK2_PUMP] = "Tank 2 Pump", + [STR_TANK2_WATER_IN_1] = "Tank 2 Water In 1", + [STR_TANK2_WATER_IN_2] = "Tank 2 Water In 2", + [STR_TANK2_RETURN_WATER] = "Tank 2 Return Water", + [STR_TANK2_HEAT] = "Tank 2 Heat", + [STR_TANK2_STIRRER] = "Tank 2 Stirrer", + [STR_TANK2_STIR_VALVE] = "Tank 2 Stir Valve", + [STR_TANK2_FILL_VALVE] = "Tank 2 Fill Valve", + [STR_TANK2_BYPASS_VALVE] = "Tank 2 Bypass Valve", + [STR_TANK2_DRAIN_VALVE] = "Tank 2 Drain Valve", + [STR_TANK3_PUMP] = "Tank 3 Pump", + [STR_TANK3_WATER_IN_1] = "Tank 3 Water In 1", + [STR_TANK3_WATER_IN_2] = "Tank 3 Water In 2", + [STR_TANK3_RETURN_WATER] = "Tank 3 Return Water", + [STR_TANK3_HEAT] = "Tank 3 Heat", + [STR_TANK3_STIRRER] = "Tank 3 Stirrer", + [STR_TANK3_STIR_VALVE] = "Tank 3 Stir Valve", + [STR_TANK3_FILL_VALVE] = "Tank 3 Fill Valve", + [STR_TANK3_BYPASS_VALVE] = "Tank 3 Bypass Valve", + [STR_TANK3_DRAIN_VALVE] = "Tank 3 Drain Valve", + [STR_ROLL_REV_12] = "Roll Reverse 1-2", + [STR_DRAIN_PUMP] = "Drain Pump", + [STR_HEAT_EXCHANGER_CONDENSATE] = "Heat Exchanger Condensate", + [STR_HEAT_EXCHANGER_COOLING_WATER] = "Heat Exchanger Cooling Water", + [STR_COMM_COUNTER] = "Communication Counter", + [STR_COMM_FAULT_COUNTER] = "Communication Fault Counter", + [STR_CYCLE_TEMP_RISE_SET] = "Cycle Temperature Rise Setpoint", + [STR_TEMP_CONTROL_RATIO] = "Temperature Control Ratio", + [STR_CALCULATED_TEMP] = "Calculated Temperature", + [STR_FLOW_COUNTER] = "Flow Counter", + [STR_GLOBAL_FLOW_COUNTER] = "Global Flow Counter", + [STR_NOZZLE_SETTING] = "Nozzle Setting", + [STR_MAIN_PUMP_SPEED_SET] = "Main Pump Speed Setpoint", + [STR_FAN_SPEED_SET] = "Fan Speed Setpoint", + [STR_TARGET_PH_SET] = "Target pH Setpoint", + [STR_PH_DEVICE_STATUS] = "pH Device Status" +}; + +// 中文字符串(UTF-8 编码) +static const char *text_zh[STR_COUNT] = { +[STR_EMERGENCY_STOP] = "\xE6\x80\xA5\xE5\x81\x9C", // "急停" +[STR_TEMP_LOCK] = "\xE6\xB8\xA9\xE5\xBA\xA6\xE9\x94\x81\xE5\xAE\x9A", // "温度锁定" +[STR_PRESSURE_LOCK] = "\xE5\x8E\x8B\xE5\x8A\x9B\xE9\x94\x81\xE5\xAE\x9A", // "压力锁定" +[STR_CALL_CONFIRM] = "\xE5\x91\xBC\xE5\x8F\xAB\xE7\xa1\xAE\xE8\xAE\xA4", // "呼叫确认" +[STR_MANUAL] = "\xE6\x89\x8B\xE5\x8A\xA8", // "手动" +[STR_FAN_START] = "\xE9\xA3\x8E\xE6\x9C\xBA\xE5\x90\xAF\xE5\x8A\xA8", // "风机启动" +[STR_FAN_FAULT] = "\xE9\xA3\x8E\xE6\x9C\xBA\xE6\x95\x85\xE9\x9A\x9C", // "风机故障" +[STR_MAIN_PUMP_FAULT] = "\xE4\xB8\xBB\xE6\xB3\xB5\xE6\x95\x85\xE9\x9A\x9C", // "主泵故障" +[STR_ROLL_RESET] = "\xE5\xB8\x83\xE8\xBD\xAE\xE9\x87\x8D\xE7\xBD\xAE", // "布轮重置" +[STR_FABRIC_FAULT] = "\xE6\x91\x86\xE5\xB8\x83\xE6\x95\x85\xE9\x9A\x9C", // "摆布故障" +[STR_ELEC_FAULT] = "\xE7\x94\xB5\xE5\x99\xA8\xE6\x95\x85\xE9\x9A\x9C", // "电器故障" +[STR_MATERIAL_PUMP1] = "\xE6\x96\x99\xE6\xB3\xB5\x31\xE5\xBC\x82\xE5\xB8\xB8", // "料泵1异常" +[STR_MATERIAL_PUMP2] = "\xE6\x96\x99\xE6\xB3\xB5\x32\xE5\xBC\x82\xE5\xB8\xB8", // "料泵2异常" +[STR_MATERIAL_PUMP3] = "\xE6\x96\x99\xE6\xB3\xB5\x33\xE5\xBC\x82\xE5\xB8\xB8", // "料泵3异常" +[STR_MANUAL1] = "\xE6\x89\x8B\xE5\x8A\xA8\x31", // "手动1" +[STR_COIL_CAR1] = "\xE7\xBA\xA0\xE8\xBD\xA6\x31", // "缠车1" +[STR_FABRIC_HEAD1] = "\xE5\xB8\x83\xE5\xA4\xB4\x31", // "布头1" +[STR_ROLL_FWD1] = "\xE5\xB8\x83\xE8\xBD\xAE\xE6\xAD\xA3\xE8\xBD\xAC\x31", // "布轮正转1" +[STR_ROLL_REV1] = "\xE5\xB8\x83\xE8\xBD\xAE\xE5\x8F\x8D\xE8\xBD\xAC\x31", // "布轮反转1" +[STR_ROLL_OVERLOAD1] = "\xE5\xB8\x83\xE8\xBD\xAE\xE8\xBF\x87\xE8\xBD\xBD\x31", // "布轮过载1" +[STR_BLOCK_FABRIC1] = "\xE5\xA0\xB5\xE5\xB8\x83\x31", // "堵布1" +[STR_MATERIAL1_HIGH] = "\xE6\x96\x99\x31\xE9\xAB\x98\xE6\xB6\xB2\xE4\xBD\x8D", // "料1高液位" +[STR_MATERIAL1_LOW] = "\xE6\x96\x99\x31\xE4\xBD\x8E\xE6\xB6\xB2\xE4\xBD\x8D", // "料1低液位" +[STR_MATERIAL1_IN] = "\xE6\x96\x99\x31\xE5\x85\xA5\xE6\xB0\xB4", // "料1入水" +[STR_MATERIAL1_OUT] = "\xE6\x96\x99\x31\xE6\x8E\x92\xE6\xB0\xB4", // "料1排水" +[STR_MATERIAL1_RECIRC] = "\xE6\x96\x99\x31\xE5\x9B\x9E\xE6\xB5\x81", // "料1回流" +[STR_MATERIAL1_BOTTOM] = "\xE6\x96\x99\x31\xE5\xBA\x95\xE6\xB6\xB2\xE4\xBD\x8D", // "料1底液位" +[STR_MATERIAL1_FILL] = "\xE6\x96\x99\x31\xE6\xB3\xA8\xE6\x96\x99", // "料1注料" +[STR_MATERIAL1_HEAT] = "\xE6\x96\x99\x31\xE5\x8A\xA0\xE7\x83\xAD", // "料1加热" +[STR_MATERIAL2_HIGH] = "\xE6\x96\x99\x32\xE9\xAB\x98\xE6\xB6\xB2\xE4\xBD\x8D", // "料2高液位" +[STR_MATERIAL2_LOW] = "\xE6\x96\x99\x32\xE4\xBD\x8E\xE6\xB6\xB2\xE4\xBD\x8D", // "料2低液位" +[STR_MATERIAL2_IN] = "\xE6\x96\x99\x32\xE5\x85\xA5\xE6\xB0\xB4", // "料2入水" +[STR_MATERIAL2_OUT] = "\xE6\x96\x99\x32\xE6\x8E\x92\xE6\xB0\xB4", // "料2排水" +[STR_MATERIAL2_RECIRC] = "\xE6\x96\x99\x32\xE5\x9B\x9E\xE6\xB5\x81", // "料2回流" +[STR_MATERIAL2_BOTTOM] = "\xE6\x96\x99\x32\xE5\xBA\x95\xE6\xB6\xB2\xE4\xBD\x8D", // "料2底液位" +[STR_MATERIAL2_FILL] = "\xE6\x96\x99\x32\xE6\xB3\xA8\xE6\x96\x99", // "料2注料" +[STR_MATERIAL2_HEAT] = "\xE6\x96\x99\x32\xE5\x8A\xA0\xE7\x83\xAD", // "料2加热" +[STR_MATERIAL2_STIR] = "\xE6\x96\x99\x32\xE6\x90\x9A\xE6\x8B\x8C", // "料2搅拌" +[STR_MANUAL2] = "\xE6\x89\x8B\xE5\x8A\xA8\x32", // "手动2" +[STR_COIL_CAR2] = "\xE7\xBA\xA0\xE8\xBD\xA6\x32", // "缠车2" +[STR_FABRIC_HEAD2] = "\xE5\xB8\x83\xE5\xA4\xB4\x32", // "布头2" +[STR_ROLL_FWD2] = "\xE5\xB8\x83\xE8\xBD\xAE\xE6\xAD\xA3\xE8\xBD\xAC\x32", // "布轮正转2" +[STR_ROLL_REV2] = "\xE5\xB8\x83\xE8\xBD\xAE\xE5\x8F\x8D\xE8\xBD\xAC\x32", // "布轮反转2" +[STR_ROLL_OVERLOAD2] = "\xE5\xB8\x83\xE8\xBD\xAE\xE8\xBF\x87\xE8\xBD\xBD\x32", // "布轮过载2" +[STR_BLOCK_FABRIC2] = "\xE5\xA0\xB5\xE5\xB8\x83\x32", // "堵布2" +[STR_MANUAL3] = "\xE6\x89\x8B\xE5\x8A\xA8\x33", // "手动3" +[STR_COIL_CAR3] = "\xE7\xBA\xA0\xE8\xBD\xA6\x33", // "缠车3" +[STR_FABRIC_HEAD3] = "\xE5\xB8\x83\xE5\xA4\xB4\x33", // "布头3" +[STR_ROLL_FWD3] = "\xE5\xB8\x83\xE8\xBD\xAE\xE6\xAD\xA3\xE8\xBD\xAC\x33", // "布轮正转3" +[STR_ROLL_REV3] = "\xE5\xB8\x83\xE8\xBD\xAE\xE5\x8F\x8D\xE8\xBD\xAC\x33", // "布轮反转3" +[STR_ROLL_OVERLOAD3] = "\xE5\xB8\x83\xE8\xBD\xAE\xE8\xBF\x87\xE8\xBD\xBD\x33", // "布轮过载3" +[STR_BLOCK_FABRIC3] = "\xE5\xA0\xB5\xE5\xB8\x83\x33", // "堵布3" +[STR_MANUAL4] = "\xE6\x89\x8B\xE5\x8A\xA8\x34", // "手动4" +[STR_COIL_CAR4] = "\xE7\xBA\xA0\xE8\xBD\xA6\x34", // "缠车4" +[STR_FABRIC_HEAD4] = "\xE5\xB8\x83\xE5\xA4\xB4\x34", // "布头4" +[STR_ROLL_FWD4] = "\xE5\xB8\x83\xE8\xBD\xAE\xE6\xAD\xA3\xE8\xBD\xAC\x34", // "布轮正转4" +[STR_ROLL_REV4] = "\xE5\xB8\x83\xE8\xBD\xAE\xE5\x8F\x8D\xE8\xBD\xAC\x34", // "布轮反转4" +[STR_ROLL_OVERLOAD4] = "\xE5\xB8\x83\xE8\xBD\xAE\xE8\xBF\x87\xE8\xBD\xBD\x34", // "布轮过载4" +[STR_BLOCK_FABRIC4] = "\xE5\xA0\xB5\xE5\xB8\x83\x34", // "堵布4" +[STR_MANUAL5] = "\xE6\x89\x8B\xE5\x8A\xA8\x35", // "手动5" +[STR_COIL_CAR5] = "\xE7\xBA\xA0\xE8\xBD\xA6\x35", // "缠车5" +[STR_FABRIC_HEAD5] = "\xE5\xB8\x83\xE5\xA4\xB4\x35", // "布头5" +[STR_ROLL_FWD5] = "\xE5\xB8\x83\xE8\xBD\xAE\xE6\xAD\xA3\xE8\xBD\xAC\x35", // "布轮正转5" +[STR_ROLL_REV5] = "\xE5\xB8\x83\xE8\xBD\xAE\xE5\x8F\x8D\xE8\xBD\xAC\x35", // "布轮反转5" +[STR_ROLL_OVERLOAD5] = "\xE5\xB8\x83\xE8\xBD\xAE\xE8\xBF\x87\xE8\xBD\xBD\x35", // "布轮过载5" +[STR_BLOCK_FABRIC5] = "\xE5\xA0\xB5\xE5\xB8\x83\x35", // "堵布5" +[STR_MANUAL6] = "\xE6\x89\x8B\xE5\x8A\xA8\x36", // "手动6" +[STR_COIL_CAR6] = "\xE7\xBA\xA0\xE8\xBD\xA6\x36", // "缠车6" +[STR_FABRIC_HEAD6] = "\xE5\xB8\x83\xE5\xA4\xB4\x36", // "布头6" +[STR_ROLL_FWD6] = "\xE5\xB8\x83\xE8\xBD\xAE\xE6\xAD\xA3\xE8\xBD\xAC\x36", // "布轮正转6" +[STR_ROLL_REV6] = "\xE5\xB8\x83\xE8\xBD\xAE\xE5\x8F\x8D\xE8\xBD\xAC\x36", // "布轮反转6" +[STR_ROLL_OVERLOAD6] = "\xE5\xB8\x83\xE8\xBD\xAE\xE8\xBF\x87\xE8\xBD\xBD\x36", // "布轮过载6" +[STR_BLOCK_FABRIC6] = "\xE5\xA0\xB5\xE5\xB8\x83\x36", // "堵布6" +[STR_MATERIAL3_HIGH] = "\xE6\x96\x99\x33\xE9\xAB\x98\xE6\xB0\xB4\xE4\xBD\x8D", // "料3高水位" +[STR_MATERIAL3_LOW] = "\xE6\x96\x99\x33\xE4\xBD\x8E\xE6\xB0\xB4\xE4\xBD\x8D", // "料3低水位" +[STR_MATERIAL3_IN] = "\xE6\x96\x99\x33\xE5\x85\xA5\xE6\xB0\xB4", // "料3入水" +[STR_MATERIAL3_OUT] = "\xE6\x96\x99\x33\xE6\x8E\x92\xE6\xB0\xB4", // "料3排水" +[STR_MATERIAL3_RECIRC] = "\xE6\x96\x99\x33\xE5\x9B\x9E\xE6\xB5\x81", // "料3回流" +[STR_MATERIAL3_BOTTOM] = "\xE6\x96\x99\x33\xE5\xBA\x95\xE6\xB0\xB4\xE4\xBD\x8D", // "料3底水位" +[STR_MATERIAL3_FILL] = "\xE6\x96\x99\x33\xE6\xB3\xA8\xE6\x96\x99", // "料3注料" +[STR_MATERIAL3_HEAT] = "\xE6\x96\x99\x33\xE5\x8A\xA0\xE7\x83\xAD", // "料3加热" +[STR_MATERIAL3_STIR] = "\xE6\x96\x99\x33\xE6\x90\x9A\xE6\x8B\x8C", // "料3搅拌" + [STR_AIO_TEMP1] = "\xE6\xB8\xA9\xE5\xBA\xA6\x31", + [STR_AIO_TEMP2] = "\xE6\xB8\xA9\xE5\xBA\xA6\x32", + [STR_AIO_TEMP3] = "\xE6\xB8\xA9\xE5\xBA\xA6\x33", + [STR_AIO_TEMP4] = "\xE6\xB8\xA9\xE5\xBA\xA6\x34", + [STR_AIO_TEMP5] = "\xE6\xB8\xA9\xE5\xBA\xA6\x35", + [STR_AIO_FLOW1] = "\xE6\xB5\x81\xE9\x87\x8F\x31", + [STR_AIO_LEVEL1] = "\xE6\xB6\xB2\xE4\xBD\x8D\x31", + [STR_AIO_LEVEL2] = "\xE6\xB6\xB2\xE4\xBD\x8D\x32", + [STR_AIO_LEVEL3] = "\xE6\xB6\xB2\xE4\xBD\x8D\x33", + [STR_AIO_LEVEL4] = "\xE6\xB6\xB2\xE4\xBD\x8D\x34", + [STR_AIO_MAIN_PRESSURE] = "\xE4\xB8\xBB\xE7\xBC\xB8\xE5\x8E\x8B\xE5\x8A\x9B", + [STR_AIO_NOZZLE_PRESSURE] = "\xE5\x96\xB7\xE5\xA4\xB4\xE5\x8E\x8B\xE5\x8A\x9B", + [STR_AIO_NOZZLE_FLOW] = "\xE5\x96\xB7\xE5\xA4\xB4\xE6\xB5\x81\xE9\x87\x8F", + [STR_AIO_AIR_FLOW] = "\xE7\xA9\xBA\xE6\xB0\x94\xE6\xB5\x81\xE9\x87\x8F", + [STR_AIO_POWER] = "\xE7\x94\xB5\xE8\x83\xBD", + [STR_AIO_FABRIC_CYCLE1] = "\xE8\xA1\x8C\xE5\xB8\x83\xE5\x91\xA8\xE6\x9C\x9F\x31", + [STR_AIO_FABRIC_CYCLE2] = "\xE8\xA1\x8C\xE5\xB8\x83\xE5\x91\xA8\xE6\x9C\x9F\x32", + [STR_AIO_FABRIC_CYCLE3] = "\xE8\xA1\x8C\xE5\xB8\x83\xE5\x91\xA8\xE6\x9C\x9F\x33", + [STR_AIO_FABRIC_CYCLE4] = "\xE8\xA1\x8C\xE5\xB8\x83\xE5\x91\xA8\xE6\x9C\x9F\x34", + [STR_AIO_FABRIC_CYCLE5] = "\xE8\xA1\x8C\xE5\xB8\x83\xE5\x91\xA8\xE6\x9C\x9F\x35", + [STR_AIO_FABRIC_CYCLE6] = "\xE8\xA1\x8C\xE5\xB8\x83\xE5\x91\xA8\xE6\x9C\x9F\x36", + [STR_AIO_PH] = "PH", + [STR_AIO_HEAT_RATIO] = "\xE5\x8D\x87\xE6\xB8\xA9\xE6\xAF\x94\xE4\xBE\x8B", + [STR_AIO_COOL_RATIO] = "\xE9\x99\x8D\xE6\xB8\xA9\xE6\xAF\x94\xE4\xBE\x8B", + [STR_AIO_MAIN_PUMP_SPEED] = "\xE4\xB8\xBB\xE6\xB3\xB5\xE9\x80\x9F\xE5\xBA\xA6", + [STR_AIO_FAN_SPEED] = "\xE9\xA3\x8E\xE6\x9C\xBA\xE9\x80\x9F\xE5\xBA\xA6", + [STR_AIO_FILL_RATIO1] = "\xE5\x8A\xA0\xE6\x96\x99\xE6\xAF\x94\xE4\xBE\x8B\x31", + [STR_AIO_FILL_RATIO2] = "\xE5\x8A\xA0\xE6\x96\x99\xE6\xAF\x94\xE4\xBE\x8B\x32", + [STR_AIO_FILL_RATIO3] = "\xE5\x8A\xA0\xE6\x96\x99\xE6\xAF\x94\xE4\xBE\x8B\x33", + [STR_AIO_FABRIC_SWING] = "\xE6\x91\x86\xE5\xB8\x83", + [STR_AIO_LIFT1] = "\xE6\x8F\x90\xE5\xB8\x83\x31", + [STR_AIO_LIFT2] = "\xE6\x8F\x90\xE5\xB8\x83\x32", + [STR_AIO_LIFT3] = "\xE6\x8F\x90\xE5\xB8\x83\x33", + [STR_AIO_LIFT4] = "\xE6\x8F\x90\xE5\xB8\x83\x34", + [STR_AIO_LIFT5] = "\xE6\x8F\x90\xE5\xB8\x83\x35", + [STR_AIO_LIFT6] = "\xE6\x8F\x90\xE5\xB8\x83\x36", + [STR_RED] = "\xe7\xba\xa2", // 红 + [STR_GREEN] = "\xe7\xbb\xbf", // 绿 + [STR_YELLOW] = "\xe9\xbb\x84", // 黄 + [STR_ALARM] = "\xe8\xad\xa6\xe6\x8a\xa5", // 警报 + [STR_HAND_AUTO] = "\xe6\x89\x8b\xe8\x87\xaa\xe5\x8a\xa8", // 手自动 + [STR_CONFIRM] = "\xe7\xa1\xae\xe8\xae\xa4", // 确认 + [STR_PRESSURIZE_VALVE] = "\xe5\x8a\xa0\xe5\x8e\x8b\xe9\x98\x80", // 加压阀 + [STR_DEPRESSURIZE_VALVE] = "\xe6\x8e\x92\xe5\x8e\x8b\xe9\x98\x80", // 排压阀 + [STR_HEAT_UP_VALVE] = "\xe5\x8d\x87\xe6\xb8\xa9\xe9\x98\x80", // 升温阀 + [STR_COOL_DOWN_VALVE] = "\xe9\x99\x8d\xe6\xb8\xa9\xe9\x98\x80", // 降温阀 + [STR_MAIN_PUMP_START] = "\xe4\xb8\xbb\xe6\xb3\xb5\xe5\x90\xaf\xe5\x8a\xa8", // 主泵启动 + [STR_WATER_IN_1] = "\xe5\x85\xa5\xe6\xb0\xb4\x31", // 入水1 + [STR_WATER_IN_2] = "\xe5\x85\xa5\xe6\xb0\xb4\x32", // 入水2 + [STR_WATER_IN_3] = "\xe5\x85\xa5\xe6\xb0\xb4\x33", // 入水3 + [STR_WATER_IN_4] = "\xe5\x85\xa5\xe6\xb0\xb4\x34", // 入水4 + [STR_WATER_OUT_1] = "\xe6\x8e\x92\xe6\xb0\xb4\x31", // 排水1 + [STR_WATER_OUT_2] = "\xe6\x8e\x92\xe6\xb0\xb4\x32", // 排水2 + [STR_WATER_OUT_3] = "\xe6\x8e\x92\xe6\xb0\xb4\x33", // 排水3 + [STR_OVERFLOW_VALVE] = "\xe6\xba\xa2\xe6\xb5\x81\xe9\x98\x80", // 溢流阀 + [STR_ROLL_FWD_1] = "\xe5\xb8\x83\xe8\xbd\xae\xe6\xad\xa3\xe8\xbd\xac\x31", // 布轮正转1 + [STR_ROLL_REV_1] = "\xe5\xb8\x83\xe8\xbd\xae\xe5\x8f\x8d\xe8\xbd\xac\x31", // 布轮反转1 + [STR_ROLL_FWD_2] = "\xe5\xb8\x83\xe8\xbd\xae\xe6\xad\xa3\xe8\xbd\xac\x32", // 布轮正转2 + [STR_ROLL_REV_2] = "\xe5\xb8\x83\xe8\xbd\xae\xe5\x8f\x8d\xe8\xbd\xac\x32", // 布轮反转2 + [STR_ROLL_FWD_3] = "\xe5\xb8\x83\xe8\xbd\xae\xe6\xad\xa3\xe8\xbd\xac\x33", // 布轮正转3 + [STR_ROLL_REV_3] = "\xe5\xb8\x83\xe8\xbd\xae\xe5\x8f\x8d\xe8\xbd\xac\x33", // 布轮反转3 + [STR_ROLL_FWD_4] = "\xe5\xb8\x83\xe8\xbd\xae\xe6\xad\xa3\xe8\xbd\xac\x34", // 布轮正转4 + [STR_ROLL_REV_4] = "\xe5\xb8\x83\xe8\xbd\xae\xe5\x8f\x8d\xe8\xbd\xac\x34", // 布轮反转4 + [STR_ROLL_FWD_5] = "\xe5\xb8\x83\xe8\xbd\xae\xe6\xad\xa3\xe8\xbd\xac\x35", // 布轮正转5 + [STR_ROLL_REV_5] = "\xe5\xb8\x83\xe8\xbd\xae\xe5\x8f\x8d\xe8\xbd\xac\x35", // 布轮反转5 + [STR_ROLL_FWD_6] = "\xe5\xb8\x83\xe8\xbd\xae\xe6\xad\xa3\xe8\xbd\xac\x36", // 布轮正转6 + [STR_ROLL_REV_6] = "\xe5\xb8\x83\xe8\xbd\xae\xe5\x8f\x8d\xe8\xbd\xac\x36", // 布轮反转6 + [STR_TANK1_PUMP] = "\xe8\x8d\xaf\xe7\xbc\xb8\x31\xe6\xb3\xb5", // 药缸1泵 + [STR_TANK1_WATER_IN_1] = "\xe8\x8d\xaf\xe7\xbc\xb8\x31\xe5\x85\xa5\xe6\xb0\xb4\x31", // 药缸1入水1 + [STR_TANK1_WATER_IN_2] = "\xe8\x8d\xaf\xe7\xbc\xb8\x31\xe5\x85\xa5\xe6\xb0\xb4\x32", // 药缸1入水2 + [STR_TANK1_RETURN_WATER] = "\xe8\x8d\xaf\xe7\xbc\xb8\x31\xe5\x9b\x9e\xe6\xb0\xb4", // 药缸1回水 + [STR_TANK1_HEAT] = "\xe8\x8d\xaf\xe7\xbc\xb8\x31\xe5\x8a\xa0\xe7\x83\xad", // 药缸1加热 + [STR_TANK1_STIRRER] = "\xe8\x8d\xaf\xe7\xbc\xb8\x31\xe6\x90\x85\xe6\x8b\x8c\xe5\x99\xa8", // 药缸1搅拌器 + [STR_TANK1_STIR_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x31\xe6\x90\x85\xe6\x8b\x8c\xe9\x98\x80", // 药缸1搅拌阀 + [STR_TANK1_FILL_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x31\xe5\x8a\xa0\xe6\x96\x99\xe9\x98\x80", // 药缸1加料阀 + [STR_TANK1_BYPASS_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x31\xe6\xaf\x94\xe4\xbe\x8b\xe4\xbe\xa7\xe9\x80\x9a\xe9\x98\x80", // 药缸1比例旁通阀 + [STR_TANK1_DRAIN_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x31\xe6\x8e\x92\xe6\xb0\xb4\xe9\x98\x80", // 药缸1排水阀 + [STR_TANK2_PUMP] = "\xe8\x8d\xaf\xe7\xbc\xb8\x32\xe6\xb3\xb5", // 药缸2泵 + [STR_TANK2_WATER_IN_1] = "\xe8\x8d\xaf\xe7\xbc\xb8\x32\xe5\x85\xa5\xe6\xb0\xb4\x31", // 药缸2入水1 + [STR_TANK2_WATER_IN_2] = "\xe8\x8d\xaf\xe7\xbc\xb8\x32\xe5\x85\xa5\xe6\xb0\xb4\x32", // 药缸2入水2 + [STR_TANK2_RETURN_WATER] = "\xe8\x8d\xaf\xe7\xbc\xb8\x32\xe5\x9b\x9e\xe6\xb0\xb4", // 药缸2回水 + [STR_TANK2_HEAT] = "\xe8\x8d\xaf\xe7\xbc\xb8\x32\xe5\x8a\xa0\xe7\x83\xad", // 药缸2加热 + [STR_TANK2_STIRRER] = "\xe8\x8d\xaf\xe7\xbc\xb8\x32\xe6\x90\x85\xe6\x8b\x8c\xe5\x99\xa8", // 药缸2搅拌器 + [STR_TANK2_STIR_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x32\xe6\x90\x85\xe6\x8b\x8c\xe9\x98\x80", // 药缸2搅拌阀 + [STR_TANK2_FILL_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x32\xe5\x8a\xa0\xe6\x96\x99\xe9\x98\x80", // 药缸2加料阀 + [STR_TANK2_BYPASS_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x32\xe6\xaf\x94\xe4\xbe\x8b\xe4\xbe\xa7\xe9\x80\x9a\xe9\x98\x80", // 药缸2比例旁通阀 + [STR_TANK2_DRAIN_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x32\xe6\x8e\x92\xe6\xb0\xb4\xe9\x98\x80", // 药缸2排水阀 + [STR_TANK3_PUMP] = "\xe8\x8d\xaf\xe7\xbc\xb8\x33\xe6\xb3\xb5", // 药缸3泵 + [STR_TANK3_WATER_IN_1] = "\xe8\x8d\xaf\xe7\xbc\xb8\x33\xe5\x85\xa5\xe6\xb0\xb4\x31", // 药缸3入水1 + [STR_TANK3_WATER_IN_2] = "\xe8\x8d\xaf\xe7\xbc\xb8\x33\xe5\x85\xa5\xe6\xb0\xb4\x32", // 药缸3入水2 + [STR_TANK3_RETURN_WATER] = "\xe8\x8d\xaf\xe7\xbc\xb8\x33\xe5\x9b\x9e\xe6\xb0\xb4", // 药缸3回水 + [STR_TANK3_HEAT] = "\xe8\x8d\xaf\xe7\xbc\xb8\x33\xe5\x8a\xa0\xe7\x83\xad", // 药缸3加热 + [STR_TANK3_STIRRER] = "\xe8\x8d\xaf\xe7\xbc\xb8\x33\xe6\x90\x85\xe6\x8b\x8c\xe5\x99\xa8", // 药缸3搅拌器 + [STR_TANK3_STIR_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x33\xe6\x90\x85\xe6\x8b\x8c\xe9\x98\x80", // 药缸3搅拌阀 + [STR_TANK3_FILL_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x33\xe5\x8a\xa0\xe6\x96\x99\xe9\x98\x80", // 药缸3加料阀 + [STR_TANK3_BYPASS_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x33\xe6\xaf\x94\xe4\xbe\x8b\xe4\xbe\xa7\xe9\x80\x9a\xe9\x98\x80", // 药缸3比例旁通阀 + [STR_TANK3_DRAIN_VALVE] = "\xe8\x8d\xaf\xe7\xbc\xb8\x33\xe6\x8e\x92\xe6\xb0\xb4\xe9\x98\x80", // 药缸3排水阀 + [STR_ROLL_REV_12] = "\xe5\xb8\x83\xe8\xbd\xae\xe5\x8f\x8d\xe8\xbd\xac\x31\x32", // 布轮反转12 + [STR_DRAIN_PUMP] = "\xe6\x8e\x92\xe6\xb0\xb4\xe6\xb3\xb5", // 排水泵 + [STR_HEAT_EXCHANGER_CONDENSATE] = "\xe7\x83\xad\xe4\xba\xa4\xe6\x8d\xa2\xe5\x99\xa8\xe5\x86\xb7\xe5\x87\x9d\xe6\xb0\xb4", // 热交换器冷凝水 + [STR_HEAT_EXCHANGER_COOLING_WATER] = "\xe4\xba\xa4\xe6\x8d\xa2\xe5\x99\xa8\xe6\x8e\x92\xe5\x86\xb7\xe5\x8d\xb4\xe6\xb0\xb4", // 交换器排冷却水 + [STR_COMM_COUNTER] = "\xE9\x80\x9A\xE8\xAE\xAF\xE8\xAE\xA1\xE6\x95\xB0\xE5\x99\xA8", // "通讯计数器" + [STR_COMM_FAULT_COUNTER] = "\xE9\x80\x9A\xE8\xAE\xAF\xE5\xBC\x82\xE5\xB8\xB8\xE8\xAE\xA1\xE6\x95\xB0\xE5\x99\xA8", // "通讯异常计数器" + [STR_CYCLE_TEMP_RISE_SET] = "\xE5\x91\xA8\xE6\x9C\x9F\xE6\xB8\xA9\xE5\x8D\x87\xE8\xAE\xBE\xE5\xAE\x9A", // "周期温升设定" + [STR_TEMP_CONTROL_RATIO] = "\xE6\xB8\xA9\xE6\x8E\xA7\xE6\xAF\x94\xE4\xBE\x8B", // "温控比例" + [STR_CALCULATED_TEMP] = "\xE8\xAE\xA1\xE7\xAE\x97\xE6\xB8\xA9\xE5\xBA\xA6", // "计算温度" + [STR_FLOW_COUNTER] = "\xE6\xB5\x81\xE9\x87\x8F\xE8\xAE\xA1\xE6\x95\xB0\xE5\x99\xA8", // "流量计数器" + [STR_GLOBAL_FLOW_COUNTER] = "\xE5\x85\xA8\xE5\xB1\x80\xE6\xB5\x81\xE9\x87\x8F\xE8\xAE\xA1\xE6\x95\xB0\xE5\x99\xA8", // "全局流量计数器" + [STR_NOZZLE_SETTING] = "\xE5\x96\xB7\xE5\xA4\xB4\xE8\xAE\xBE\xE5\xAE\x9A", // "喷头设定" + [STR_MAIN_PUMP_SPEED_SET] = "\xE4\xB8\xBB\xE6\xB3\xB5\xE9\x80\x9F\xE5\xBA\xA6\xE8\xAE\xBE\xE5\xAE\x9A", // "主泵速度设定" + [STR_FAN_SPEED_SET] = "\xE9\xA3\x8E\xE6\x9C\xBA\xE9\x80\x9F\xE5\xBA\xA6\xE8\xAE\xBE\xE5\xAE\x9A", // "风机速度设定" + [STR_TARGET_PH_SET] = "\xE7\x9B\xAE\xE6\xA0\x87PH\xE8\xAE\xBE\xE5\xAE\x9A", // "目标PH设定" + [STR_PH_DEVICE_STATUS] = "PH\xE8\xAE\xBE\xE5\xA4\x87\xE7\x8A\xB6\xE6\x80\x81" // "PH设备状态" +}; + + + +const char* lang_get_str(str_id_t id) { + if (id >= STR_COUNT) return "???"; + return current_lang == LANG_ZH ? text_zh[id] : text_en[id]; +} + +void lang_set(lang_t lang) { + current_lang = lang; + // 可选:发送消息通知 UI 刷新 +} diff --git a/applications/language.h b/applications/language.h new file mode 100644 index 0000000..8b01c3a --- /dev/null +++ b/applications/language.h @@ -0,0 +1,214 @@ +// language.h +#ifndef APPLICATIONS_LANGUAGE_H +#define APPLICATIONS_LANGUAGE_H + +typedef enum { + STR_EMERGENCY_STOP, + STR_TEMP_LOCK, + STR_PRESSURE_LOCK, + STR_CALL_CONFIRM, + STR_MANUAL, + STR_FAN_START, + STR_FAN_FAULT, + STR_MAIN_PUMP_FAULT, + STR_ROLL_RESET, + STR_FABRIC_FAULT, + STR_ELEC_FAULT, + STR_MATERIAL_PUMP1, + STR_MATERIAL_PUMP2, + STR_MATERIAL_PUMP3, + STR_MANUAL1, + STR_COIL_CAR1, + STR_FABRIC_HEAD1, + STR_ROLL_FWD1, + STR_ROLL_REV1, + STR_ROLL_OVERLOAD1, + STR_BLOCK_FABRIC1, + STR_MATERIAL1_HIGH, + STR_MATERIAL1_LOW, + STR_MATERIAL1_IN, + STR_MATERIAL1_OUT, + STR_MATERIAL1_RECIRC, + STR_MATERIAL1_BOTTOM, + STR_MATERIAL1_FILL, + STR_MATERIAL1_HEAT, + STR_MATERIAL2_HIGH, + STR_MATERIAL2_LOW, + STR_MATERIAL2_IN, + STR_MATERIAL2_OUT, + STR_MATERIAL2_RECIRC, + STR_MATERIAL2_BOTTOM, + STR_MATERIAL2_FILL, + STR_MATERIAL2_HEAT, + STR_MATERIAL2_STIR, + STR_MANUAL2, + STR_COIL_CAR2, + STR_FABRIC_HEAD2, + STR_ROLL_FWD2, + STR_ROLL_REV2, + STR_ROLL_OVERLOAD2, + STR_BLOCK_FABRIC2, + STR_MANUAL3, + STR_COIL_CAR3, + STR_FABRIC_HEAD3, + STR_ROLL_FWD3, + STR_ROLL_REV3, + STR_ROLL_OVERLOAD3, + STR_BLOCK_FABRIC3, + STR_MANUAL4, + STR_COIL_CAR4, + STR_FABRIC_HEAD4, + STR_ROLL_FWD4, + STR_ROLL_REV4, + STR_ROLL_OVERLOAD4, + STR_BLOCK_FABRIC4, + STR_MANUAL5, + STR_COIL_CAR5, + STR_FABRIC_HEAD5, + STR_ROLL_FWD5, + STR_ROLL_REV5, + STR_ROLL_OVERLOAD5, + STR_BLOCK_FABRIC5, + STR_MANUAL6, + STR_COIL_CAR6, + STR_FABRIC_HEAD6, + STR_ROLL_FWD6, + STR_ROLL_REV6, + STR_ROLL_OVERLOAD6, + STR_BLOCK_FABRIC6, + STR_MATERIAL3_HIGH, + STR_MATERIAL3_LOW, + STR_MATERIAL3_IN, + STR_MATERIAL3_OUT, + STR_MATERIAL3_RECIRC, + STR_MATERIAL3_BOTTOM, + STR_MATERIAL3_FILL, + STR_MATERIAL3_HEAT, + STR_MATERIAL3_STIR, + STR_AIO_TEMP1, + STR_AIO_TEMP2, + STR_AIO_TEMP3, + STR_AIO_TEMP4, + STR_AIO_TEMP5, + STR_AIO_FLOW1, + STR_AIO_LEVEL1, + STR_AIO_LEVEL2, + STR_AIO_LEVEL3, + STR_AIO_LEVEL4, + STR_AIO_MAIN_PRESSURE, + STR_AIO_NOZZLE_PRESSURE, + STR_AIO_NOZZLE_FLOW, + STR_AIO_AIR_FLOW, + STR_AIO_POWER, + STR_AIO_FABRIC_CYCLE1, + STR_AIO_FABRIC_CYCLE2, + STR_AIO_FABRIC_CYCLE3, + STR_AIO_FABRIC_CYCLE4, + STR_AIO_FABRIC_CYCLE5, + STR_AIO_FABRIC_CYCLE6, + STR_AIO_PH, + STR_AIO_HEAT_RATIO, + STR_AIO_COOL_RATIO, + STR_AIO_MAIN_PUMP_SPEED, + STR_AIO_FAN_SPEED, + STR_AIO_FILL_RATIO1, + STR_AIO_FILL_RATIO2, + STR_AIO_FILL_RATIO3, + STR_AIO_FABRIC_SWING, + STR_AIO_LIFT1, + STR_AIO_LIFT2, + STR_AIO_LIFT3, + STR_AIO_LIFT4, + STR_AIO_LIFT5, + STR_AIO_LIFT6, + STR_RED, + STR_GREEN, + STR_YELLOW, + STR_ALARM, + STR_HAND_AUTO, + STR_CONFIRM, + STR_PRESSURIZE_VALVE, + STR_DEPRESSURIZE_VALVE, + STR_HEAT_UP_VALVE, + STR_COOL_DOWN_VALVE, + STR_MAIN_PUMP_START, + STR_WATER_IN_1, + STR_WATER_IN_2, + STR_WATER_IN_3, + STR_WATER_IN_4, + STR_WATER_OUT_1, + STR_WATER_OUT_2, + STR_WATER_OUT_3, + STR_OVERFLOW_VALVE, + STR_ROLL_FWD_1, + STR_ROLL_REV_1, + STR_ROLL_FWD_2, + STR_ROLL_REV_2, + STR_ROLL_FWD_3, + STR_ROLL_REV_3, + STR_ROLL_FWD_4, + STR_ROLL_REV_4, + STR_ROLL_FWD_5, + STR_ROLL_REV_5, + STR_ROLL_FWD_6, + STR_ROLL_REV_6, + STR_TANK1_PUMP, + STR_TANK1_WATER_IN_1, + STR_TANK1_WATER_IN_2, + STR_TANK1_RETURN_WATER, + STR_TANK1_HEAT, + STR_TANK1_STIRRER, + STR_TANK1_STIR_VALVE, + STR_TANK1_FILL_VALVE, + STR_TANK1_BYPASS_VALVE, + STR_TANK1_DRAIN_VALVE, + STR_TANK2_PUMP, + STR_TANK2_WATER_IN_1, + STR_TANK2_WATER_IN_2, + STR_TANK2_RETURN_WATER, + STR_TANK2_HEAT, + STR_TANK2_STIRRER, + STR_TANK2_STIR_VALVE, + STR_TANK2_FILL_VALVE, + STR_TANK2_BYPASS_VALVE, + STR_TANK2_DRAIN_VALVE, + STR_TANK3_PUMP, + STR_TANK3_WATER_IN_1, + STR_TANK3_WATER_IN_2, + STR_TANK3_RETURN_WATER, + STR_TANK3_HEAT, + STR_TANK3_STIRRER, + STR_TANK3_STIR_VALVE, + STR_TANK3_FILL_VALVE, + STR_TANK3_BYPASS_VALVE, + STR_TANK3_DRAIN_VALVE, + STR_ROLL_REV_12, + STR_DRAIN_PUMP, + STR_HEAT_EXCHANGER_CONDENSATE, + STR_HEAT_EXCHANGER_COOLING_WATER, + STR_COMM_COUNTER, + STR_COMM_FAULT_COUNTER, + STR_CYCLE_TEMP_RISE_SET, + STR_TEMP_CONTROL_RATIO, + STR_CALCULATED_TEMP, + STR_FLOW_COUNTER, + STR_GLOBAL_FLOW_COUNTER, + STR_NOZZLE_SETTING, + STR_MAIN_PUMP_SPEED_SET, + STR_FAN_SPEED_SET, + STR_TARGET_PH_SET, + STR_PH_DEVICE_STATUS, + STR_COUNT // 自动计数 +} str_id_t; + +typedef enum { + LANG_EN, + LANG_ZH +} lang_t; + +// 外部函数 +const char* lang_get_str(str_id_t id); +void lang_set(lang_t lang); +extern lang_t current_lang; + +#endif