Browse Source

添加数据处理资源

master
sc 2 months ago
parent
commit
f751863707
  1. 493
      applications/DATA_comm.c
  2. 31
      applications/DATA_comm.h
  3. 151
      applications/DATA_uart.c
  4. 15
      applications/DATA_uart.h
  5. 231
      applications/SC828_DATA_table.c
  6. 35
      applications/SC828_DATA_table.h
  7. 38
      applications/TMPFS_root.c
  8. 105
      applications/Variable.c
  9. 89
      applications/Variable.h
  10. 415
      applications/language.c
  11. 214
      applications/language.h

493
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 <rtthread.h>
#include "cjson.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#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 <rtdbg.h>
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);

31
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_ */

151
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 <rtthread.h>
#include <rtdevice.h>
#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;
}

15
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_ */

231
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<DIO_TABLE_SIZE;i++)
{
dio_table[i].current_state = 0;
}
for(int i=0;i<AIO_TABLE_SIZE;i++)
{
aio_table[i].current_Value = 0;
}
for(int i=0;i<DATA_TABLE_SIZE;i++)
{
data_table[i].current_data = 0;
}
}

35
applications/SC828_DATA_table.h

@ -0,0 +1,35 @@
#ifndef APPLICATIONS_SC828_DATA_Table_H
#define APPLICATIONS_SC828_DATA_Table_H
#include "stdbool.h"
#include "language.h"
// IO状态结构体(可扩展)
typedef struct {
int pin; // PLCID
unsigned char current_state; // 当前电平:0=低,1=高
str_id_t name; // 名称(可选,用于调试)
} IO_State_DIO;
typedef struct {
int pin; // PLCID
unsigned char current_Value; // 当前状态
str_id_t name; // 名称(可选,用于调试)
} IO_State_AIO;
typedef struct {
int pin; // PLCID
int current_data; // 当前状态
str_id_t name; // 名称(可选,用于调试)
} IO_State_DATA;
extern IO_State_DIO dio_table[];
extern IO_State_AIO aio_table[];
extern IO_State_DATA data_table[];
extern const unsigned char DIO_TABLE_SIZE;
extern const unsigned char AIO_TABLE_SIZE;
extern const unsigned char DATA_TABLE_SIZE;
void DATA_Table_Init(void);//
#endif

38
applications/TMPFS_root.c

@ -0,0 +1,38 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2025-11-21 Administrator the first version
*/
#include <rtthread.h>
#include <dfs_fs.h>
#include <dfs_posix.h>
#define DBG_TAG "tmpfs_init"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
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);

105
applications/Variable.c

@ -0,0 +1,105 @@
#include <rtthread.h>
#include <string.h>
// ===== 实际定义 =====
// 动态数据缓冲区(初始化为 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");
}

89
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

415
applications/language.c

@ -0,0 +1,415 @@
// language.c
#include <rtthread.h>
#include <language.h>
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 刷新
}

214
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
Loading…
Cancel
Save