Trends

趋势 – 将 CODESYS 实时数据连接到 PLCVisu(Generate Code 使用文档)

本指南介绍如何通过 “Generate Code(生成代码)” 按钮将 PLC(例如 CODESYS 项目)中的实时数据连接到 PLCVisu 的趋势模块。目标是将测量值(例如温度、压力、液位)周期性地写入数据库,并在趋势查看器中进行可视化。

目标

  • 将 CODESYS 中的 实时数据 自动写入一个 趋势数据库
  • 在 HMI(例如 WAGO WP400)上实时可视化这些数据
  • 借助 PLCVisu 的代码生成器实现最小配置工作量

分步指南

1. 生成代码

在趋势界面中点击 “Generate Code” 按钮。系统将自动复制生成的代码,可直接粘贴到你的 CODESYS 项目中。

(* DECLARATION SECTION *)
trendsFBlinetrend1Instance: PLCVisu.trendsFB; (* 当前趋势的功能块实例 *)
slinetrend1Columns:STRING(4096):= 'dataset1';
slinetrend1Values:STRING(4096);
(* CODE SECTION *)
(* 初始化实例参数:文件路径 + 最大记录数 *)
trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', {{max_records}});
(* 写入一条记录 *)
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING({{dataset1_value}}));
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"');
trendsFBlinetrend1Instance.write('',slinetrend1Columns, slinetrend1Values);
(* 写入分隔行 – 可选,用于在前端界面中分段显示 *)
(* trendsFBlinetrend1Instance.writeFinish(''); *)

可选功能:
使用 writeFinish('') 可在趋势图中插入视觉上的分隔线(例如用于标记批次切换)。

2. 插入传感器数值

GVL.MySensor 替换为你的真实 PLC 变量,例如:

REAL_TO_STRING(GVL.TemperatureSensor1)

注意事项:

  • 变量必须为 REAL 类型
  • 如为其他类型,请使用相应转换函数:
    • INT_TO_STRING(...) → 整数类型
    • BOOL_TO_STRING(...) → 布尔类型

3. 建立 CODESYS 与 PLCVisu 的连接

为了让 PLCVisu 正确读取 PLC 数据,需执行以下操作:

CODESYS 中:

  1. 打开符号配置(Symbol Configuration)
  2. 勾选需要暴露的 GVL 全局变量
  3. 启用 “可供外部访问(For External Access)”
  4. 如需 OPC UA,导出符号文件

PLCVisu 中:

  • 在项目中配置连接地址:
    • PLCVisu://localhost → 本地测试
    • opc.tcp://<IP>:4840 → OPC UA 协议
  • 使用 Tag-Browser 进行数据映射

4. 初始化数据库

trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', 10000);
  • 在内部趋势目录中创建(或打开)数据库文件
  • 10000 定义循环缓冲区的最大记录数
  • 需在写入前 初始化一次,例如在 Init 周期中执行

5. 循环写入数值

以下代码将在每个周期中写入当前传感器值:

slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING(GVL.TemperatureSensor1));
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"');
trendsFBlinetrend1Instance.write('', 'dataset1', slinetrend1Values);

典型用途:

  • 在一个周期性任务(例如每 1 秒)中执行
  • 或通过一个定时器功能块来实现

总览:CODESYS ↔ PLCVisu 趋势数据流

步骤 说明
Generate Code 生成基础代码结构
插入传感器值 使用 *_TO_STRING(...) 转换 GVL 变量
激活连接 设置符号配置 + 配置 PLCVisu 数据源
.init() 初始化数据库并设置缓冲区大小
.write() 在周期内写入实时数据
可选: .writeFinish 创建视觉分隔线(如:批次结束)

故障排查

问题 可能原因
趋势中未显示数据 缺少 .init() 调用,或变量为空
.write() 出错 字符串格式错误(例如缺少引号)
数据库未创建 路径错误或缺少写入权限
无法连接至 PLC 未启用符号配置或 IP 地址错误

建议

  • 将生成的代码作为模板使用,并根据需要修改变量名(如 dataset1)和路径
  • 若有多个信号:添加多个 .write() 语句或使用多个 datasetX
  • 建议从单个 REAL 类型变量开始测试,以便快速验证 UI 显示效果
datasetX
.write()
dataset1
.write()
.init()
*_TO_STRING(...)
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING(GVL.TemperatureSensor1)); slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"'); trendsFBlinetrend1Instance.write('', 'dataset1', slinetrend1Values);
10000
trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', 10000);
opc.tcp://<IP>:4840
PLCVisu://localhost
BOOL_TO_STRING(...)
INT_TO_STRING(...)
REAL
REAL_TO_STRING(GVL.TemperatureSensor1)
GVL.MySensor
writeFinish('')
(* DECLARATION SECTION *) trendsFBlinetrend1Instance: PLCVisu.trendsFB; (* 当前趋势的功能块实例 *) slinetrend1Columns:STRING(4096):= 'dataset1'; slinetrend1Values:STRING(4096); (* CODE SECTION *) (* 初始化实例参数:文件路径 + 最大记录数 *) trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', {{max_records}}); (* 写入一条记录 *) slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING({{dataset1_value}})); slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"'); trendsFBlinetrend1Instance.write('',slinetrend1Columns, slinetrend1Values); (* 写入分隔行 – 可选,用于在前端界面中分段显示 *) (* trendsFBlinetrend1Instance.writeFinish(''); *)