2. WinCC项目结构与多语言支持机制
在WinCC中做多语言,第一步不是急着去翻译文本,而是先弄清楚“文本到底存在哪里、由谁引用、切换语言时谁去替换”。如果对项目结构没有整体认识,很容易出现“画面翻译了、面板没翻译”“报警文本漏了”“运行语言切换后部分文字仍是中文”这类问题。本节围绕WinCC项目树、画面、面板、脚本与文本库之间的关系,说明多语言资源的入口与引用链路。
一、项目树:多语言资源的物理容器
WinCC项目在磁盘上是一个目录结构,在工程界面中表现为项目树。与多语言直接相关的节点主要有以下几类:
- 画面(Graphics Designer):存放 .pdl 画面文件,画面中静态文本、按钮标题、I/O域标签等都可能需要翻译。
- 面板(Faceplate):以 .fpt 形式存在,被画面实例化引用。面板内部文本属于面板类型定义,翻译入口与画面不同。
- 文本库(Text Library):集中存放可被画面、面板、脚本引用的多语言文本条目,是“一处定义、多处引用”的核心。
- 报警记录(Alarm Logging):报警消息文本、消息块文本,独立于画面文本库。
- 变量管理(Tag Management):变量注释、变量名描述等也可能参与多语言显示。
- 全局脚本(Global Script):C脚本或VBS脚本中直接书写的字符串,不会被文本库自动接管,需要单独处理。
理解项目树的关键在于:不同节点有各自独立的文本存储位置和翻译入口。文本库不是万能的,它只覆盖“引用型文本”,不覆盖脚本硬编码字符串和部分系统内部文本。
二、画面、面板与文本库的引用关系
画面中的文本有两种存在方式。一种是直接输入在对象属性里的“静态文本”,例如按钮上写的“启动”。另一种是通过文本库引用,例如在对象属性中选择“文本库条目”,运行时根据当前语言去文本库取对应译文。前者翻译时需要在画面编辑器中逐条处理,后者只需在文本库中维护一次。
面板的情况更特殊。面板类型定义中的文本,在实例化到画面后,实例通常继承类型定义的文本。如果面板内部使用了文本库引用,那么翻译文本库即可;如果面板内部是静态文本,则需要在面板类型编辑器中翻译,而不是在画面实例上翻译。这一点是实际工程中最容易混淆的地方。
脚本中的字符串则完全独立。例如C脚本中 SetText(lpszPictureName,"btnStart","启动") 这样的写法,字符串“启动”不会出现在文本库中,也不会随语言切换自动变化。正确做法是改用文本库引用或使用 GetText() 类函数按语言取词。
三、文本库:多语言资源的集中入口
文本库是WinCC多语言工程的核心。它按“文本ID + 各语言译文”的方式组织条目。每条文本有一个唯一ID,可以附加注释说明用途。画面对象、面板、部分系统组件通过引用这个ID来取词,运行时根据当前语言返回对应译文。
文本库的典型使用流程是:先在文本库中建立条目并填写中文、英文等译文,然后在画面对象属性中选择“文本库”作为文本来源,绑定对应ID。这样,当运行语言从中文切换到英文时,画面对象会自动显示英文译文,无需修改画面本身。
需要注意的是,文本库条目的ID一旦被引用,就不应随意删除或改变含义。否则会导致画面显示错位或空白。工程中建议按功能区域对文本ID分段编号,例如报警类用1000段、画面按钮用2000段、面板用3000段,便于维护。
四、脚本中的多语言处理
脚本是容易被忽略的多语言盲区。C脚本和VBS脚本中直接书写的字符串不会自动进入文本库,也不会随语言切换而变化。如果脚本需要输出多语言文本,应使用文本库引用或按语言分支处理。
例如,不推荐的写法是:
SetText(lpszPictureName, "btnStart", "启动");
推荐的思路是改为从文本库取词,或根据当前语言变量选择不同字符串。VBS中可结合 HMIRuntime.Tags("@CurrentLanguage").Read 获取当前语言,再决定显示内容。更规范的做法是把脚本要用的文本也纳入文本库,通过ID引用,保持与画面一致。
五、定位多语言资源的实操路径
当项目需要新增一种语言或排查翻译遗漏时,可以按以下路径逐层检查:
- 打开文本库,确认所有需要翻译的条目已建立,并检查各语言列是否填写完整。
- 打开画面,检查对象属性中文本来源是“静态文本”还是“文本库引用”。静态文本需要单独翻译。
- 打开面板类型,检查面板内部文本是否已翻译,注意面板实例不会覆盖类型定义文本。
- 打开报警记录,检查消息块和消息文本是否已按语言填写。
- 搜索全局脚本中的字符串常量,确认没有硬编码的中文或英文文本。
- 在运行系统中切换语言,逐画面观察按钮、标签、报警、面板显示是否同步变化。
六、常见误区与判断依据
第一个误区是认为“翻译了文本库就万事大吉”。实际上,只有引用了文本库的文本才会自动切换。画面中直接输入的静态文本、面板类型中的静态文本、脚本中的字符串,都不会因为文本库翻译而改变。
第二个误区是在画面实例上翻译面板文本。面板实例的文本通常继承自面板类型定义,修改实例往往无效或会在更新类型时丢失。正确位置是面板类型编辑器。
第三个误区是忽略报警文本。报警记录有独立的文本管理,消息块中的文本需要单独翻译,不能指望文本库覆盖。
判断多语言是否配置完整,最直接的方法是在运行系统中切换语言,逐项检查画面、面板、报警和脚本输出。如果某处文字不随语言变化,就回到对应的存储位置去处理。理解项目树各节点与文本存储位置的对应关系,是高效完成WinCC多语言工程的基础。