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 中:
- 打开符号配置(Symbol Configuration)
- 勾选需要暴露的 GVL 全局变量
- 启用 “可供外部访问(For External Access)”
- 如需 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(''); *)