4. 全局变量与数据类型设计

在 Sysmac Studio 中,全局变量是 NJ/NX 系列控制器与 HMI、上位机、机器人、视觉系统之间交换数据的公共通道。它不同于程序内部的局部变量:局部变量只在某个 POU 内有效,而全局变量在整个项目中可见,可被多个任务、多个程序读写,也能通过 EtherNet/IP 标签数据链接、OPC UA 或数据库网关对外发布。因此,全局变量的设计质量直接决定了程序的可读性、可维护性和通信效率。

本节围绕五个相互关联的问题展开:全局变量如何定义、结构体与数组如何组织批量数据、用户定义数据类型(UDT)如何复用、命名规范如何统一、数据字典如何管理。它们不是五个孤立的知识点,而是一条从“单个变量”到“可复用数据模型”再到“项目级数据资产”的递进链条。

一、全局变量定义:从变量表到属性设置

在 Sysmac Studio 的“全局变量”工作区中,每一行代表一个变量,关键列包括名称、数据类型、初始值、保持属性、网络公开属性、常量属性等。定义时最需要关注的是三个属性:

  • Retain(保持):断电后是否保留数值。用于配方号、累计产量、设备状态等需要掉电记忆的数据。
  • Network Publish(网络公开):决定该变量能否被 EtherNet/IP 或 OPC UA 访问。只有需要对外通信的变量才应公开,避免暴露内部中间量。
  • Constant(常量):定义后不可被程序写入,适合存放设备编号、工位号、版本号等固定参数。

例如,一条包装线需要向 MES 上报产量,可定义 gvl_Line 全局变量表,其中 gProductionCount 为 DINT、Retain 有效、Network Publish 有效;而 gInternalStep 为 INT、仅内部使用、不公开。这样既满足通信需求,又减少网络标签数量。

二、结构体与数组:把相关数据打包

当一组变量总是同时出现时,应使用结构体(Structure)把它们组合成一个整体。例如每个工位的状态包含“运行、报警、产量、节拍”四项,若分散定义,程序里会出现大量相似变量名;若定义结构体 ST_Station,再声明数组 aStation : ARRAY[1..8] OF ST_Station,就能用 aStation[3].nOutput 这样的方式访问第 3 工位产量,逻辑清晰且便于循环处理。

数组适合处理同类批量对象,如 8 个工位、16 个气缸、32 路温度。结构体适合处理同一对象的多个属性。两者结合,就是“对象数组”模型,是产线数据采集最常用的组织方式。需要注意的是,数组下标范围要在定义时明确,Sysmac Studio 默认从 0 开始,但工程上常写成 ARRAY[1..N] 以对应物理工位编号,避免下标与现场编号错位。

全局变量数据模型:从基础类型到对象数组 基础数据类型 BOOL / INT / DINT REAL / STRING / TIME 单个数据的最小单位 结构体 ST_Station bRun : BOOL bAlarm : BOOL nOutput : DINT 对象数组 aStation[1..8] aStation[1] … aStation[8] 每元素含 3 个成员 共 8×3 = 24 个数据点 访问方式对比 分散变量:gSt1_Output、gSt2_Output、gSt3_Output …(命名冗长,循环困难) 对象数组:aStation[i].nOutput(i 循环即可遍历全部工位) 数据字典(Data Dictionary)统一管理 UDT 定义 · 全局变量表 · 命名规范 · 网络公开属性 · 版本记录 所有 POU、HMI、通信映射均引用同一份定义,避免重复与冲突

三、用户定义数据类型(UDT):一次定义,多处复用

结构体在 Sysmac Studio 中通过“数据类型”工作区定义为 UDT(User Defined Type)。UDT 的价值在于复用:定义一次 ST_Station,就可以在全局变量、局部变量、函数块接口、HMI 标签中反复使用。当工位属性需要增加“温度”时,只需在 UDT 中加一个成员,所有引用该类型的变量自动获得新成员,无需逐个修改。

设计 UDT 时有几条实用原则:成员按“状态—参数—统计”分组排列,便于阅读;成员名使用统一前缀(如 b 表示 BOOL、n 表示 INT/DINT、r 表示 REAL、s 表示 STRING);避免在 UDT 中嵌套过深,一般不超过两层;对需要通信的 UDT,成员类型应选择 EtherNet/IP 支持的标准类型,避免使用复杂嵌套导致标签无法映射。

四、变量命名规范:让代码自解释

命名规范不是形式主义,而是多人协作和后期排障的基础。推荐采用“作用域前缀 + 类型前缀 + 业务含义”的结构:

前缀含义示例
g全局变量gProductionCount
a数组aStation
st结构体实例stLineStatus
bBOOLbRun
nINT / DINTnOutput
rREALrTemperature
sSTRINGsRecipeName

例如 gaStation[3].nOutput 可以读作“全局数组 Station 第 3 个元素的整型产量”。命名应避免拼音、避免无意义缩写、避免同一含义多种写法(如 Output、Out、ChanPin 混用)。

五、数据字典管理:项目级数据资产

Sysmac Studio 的数据字典并非一个独立文件,而是由“数据类型定义 + 全局变量表 + 网络公开设置”共同构成的项目级数据视图。管理要点包括:

  1. 集中定义:所有 UDT 和全局变量只在数据字典中定义一次,POU 内通过引用使用,不重复声明。
  2. 版本记录:UDT 变更时在注释中记录变更日期、变更人、变更原因,便于回溯。
  3. 通信隔离:对外通信的变量单独放入 gvl_Comm 变量表,内部变量放入 gvl_Internal,避免网络公开范围失控。
  4. 导入导出:Sysmac Studio 支持将全局变量表导出为 CSV,可用于批量编辑、跨项目复用和文档归档。
实践建议:在项目初期先花时间设计 UDT 和命名规范,再开始写程序。后期修改数据类型的成本远高于前期设计成本。一个可参考的检查顺序是:先确定通信对象需要哪些数据,再设计 UDT,再定义全局变量表,最后编写 POU。
常见问题:若 UDT 成员使用了 EtherNet/IP 不支持的类型(如嵌套结构体中的数组),该变量可能无法作为标签公开。此时应将其拆分为扁平结构,或通过程序映射到支持的类型后再公开。

综上,全局变量与数据类型设计的核心思路是:用基础类型表达单个数据,用结构体表达对象属性,用数组表达批量对象,用 UDT 实现复用,用命名规范保证可读,用数据字典统一管理。这六者共同构成 Sysmac 项目的数据骨架,也是后续数据采集、通信映射和 MES 集成的基础。