前言
上一篇我们已经完成了 CoDeSys 工程的创建,这次要进入核心环节 —— 编写 PLC 程序!本次将用结构化文本(ST 语言)实现 “输入值 + 2 输出” 的功能,全程拆解变量声明、功能块创建、程序代码编写的完整流程,每个步骤都配详细说明,新手也能轻松跟上~
一、核心目标
本次编写的程序包含两部分:
- 主程序 PLC_PRG:声明计数器变量、功能块实例,调用 FB1 并接收输出结果;
- 功能块 FB1:接收输入值,加 2 后输出给 PLC_PRG。
最终实现逻辑:输入值11 → FB1(+2)→ 输出结果13,同时 PLC_PRG 中的计数器变量自动累加。
二、第一步:在 PLC_PRG 中声明变量(两种方式可选)
PLC_PRG 是工程默认创建的主程序,所有变量需在声明区(VAR-END_VAR 之间)定义,支持手动声明和自动声明两种方式,下面分别讲解:
方式 1:手动声明变量(推荐新手先掌握)
- 打开 PLC_PRG 编辑器:在设备视窗的设备树中,找到「应用」下的「PLC_PRG」,双击打开 ST 语言编辑器;
- 认识编辑器布局:编辑器上半部分是「声明部分」(用于定义变量),下半部分是「实现部分」(用于写执行代码),中间有可调分割线;
- 手动声明变量:
- 将光标移到VAR和END_VAR之间,按回车插入空行;
- 依次声明 3 个变量,语法格式:变量名: 数据类型;(注意冒号后有空格,结尾必须加封号):
- 注释用//开头,会被编译器忽略,仅用于说明变量功能,建议养成写注释的习惯。
- FB1未创建报错
- 注释用//开头,会被编译器忽略,仅用于说明变量功能,建议养成写注释的习惯。
方式 2:自动声明变量(高效快捷,推荐熟练后使用)
如果不想手动写声明,可直接在实现部分写代码,系统会自动补全声明,步骤如下:
- 直接在 PLC_PRG 的「实现部分」输入代码(先不用管变量是否声明):
- 输入完成后按回车,系统会弹出「自动声明」对话框 —— 未声明的变量(ivar、fbinst、erg)会自动识别;
- 配置变量信息:
- 变量名:系统已自动识别,无需修改;
- 类型:分别选择INT(ivar、erg)、FB1(fbinst);
- 初始值:默认留空即可(计数器 ivar 无需初始值,会自动从 0 开始);
- 注释:可输入变量说明(如 “计数器变量”),无需加//,系统会以 XML 格式自动添加到声明区,方便后续文档生成;
- 点击「确定」,系统会自动在声明区补全所有变量声明,注释也会同步添加,效率超高!
ivar := ivar + 1; fbinst(in:=11, out=>erg); |
三、第二步:编写 PLC_PRG 的实现代码(主程序逻辑)
变量声明完成后,在编辑器的「实现部分」(分割线下方)输入执行代码,实现计数器累加和功能块调用:
1. 代码编写
直接复制以下代码到实现部分,每行都附详细注释:
2. 代码语法说明
- 赋值运算符::=表示 “将右边的值赋给左边变量”(ST 语言特有,区别于 C 语言的=);
- 功能块调用格式:实例名(输入参数:=值, 输出参数=>接收变量),输入用:=,输出用=>,参数之间用逗号分隔;
- 注释://后面的内容为单行注释,编译器不执行,用于说明代码功能,必须加在代码行末尾或单独一行。
四、第三步:创建功能块 FB1(核心逻辑实现)
功能块(FB)是可复用的编程单元,本次 FB1 的功能是 “输入值 + 2 输出”,创建步骤如下:
1. 新建功能块 FB1
- 点击顶部菜单栏【工程】→【添加对象】,打开「添加对象」对话框;
- 左侧选择「POU」(编程对象),右侧配置:
- POU 名称:输入FB1(必须与 PLC_PRG 中声明的实例类型一致);
- 类型:选中「功能块」(Function Block);
- 实现语言:选择「结构化文本 (ST)」;
- 点击「打开」,系统会自动创建 FB1 的编辑窗口。
2. 声明 FB1 的变量(输入 / 输出 / 内部变量)
功能块的变量分为输入(VAR_INPUT)、输出(VAR_OUTPUT)、内部变量(VAR)三类,需分别声明:
- 语法说明:
- VAR_INPUT:仅用于接收外部输入的变量,不能在功能块内部修改;
- VAR_OUTPUT:用于向外部输出结果的变量,由功能块内部赋值;
- VAR:功能块内部使用的变量,外部无法访问,这里给 ivar 赋初始值 2(:=是赋值运算符)。
3. 编写 FB1 的实现代码(核心逻辑)
在 FB1 编辑器的「实现部分」输入以下代码,实现 “输入值 + 2” 的功能:
out := in + ivar; // in(外部输入) + ivar(内部固定值2),结果赋给out输出 |
- 逻辑解读:当 PLC_PRG 调用 FB1 时,传入in=11,FB1 内部计算11+2=13,再通过out变量将 13 返回给 PLC_PRG 的erg变量。
编译无报错
五、完整代码汇总
1. 主程序 PLC_PRG 完整代码
PROGRAM PLC_PRG VAR ivar: INT; // 计数器变量,每次执行自增1 fbinst: FB1; // FB1功能块实例 erg: INT; // 接收FB1输出的结果变量 END_VAR // 计数器自增 ivar := ivar + 1; // 调用FB1,输入11,输出结果存入erg fbinst(in:=11, out=>erg); |
2. 功能块 FB1 完整代码
FUNCTION_BLOCK FB1 VAR_INPUT in: INT; // 输入变量 END_VAR VAR_OUTPUT out: INT; // 输出变量 END_VAR VAR ivar: INT := 2; // 内部固定值2 END_VAR // 核心计算逻辑:输入值+2输出 out := in + ivar; |
六、关键语法 & 注意事项(新手必看)
- 变量声明规则:
- 变量名区分大小写(ivar和Ivar是两个不同变量);
- 数据类型必须匹配(如 FB1 的输入变量是 INT,PLC_PRG 传入的 11 也是整数,不能传字符串);
- 功能块实例的类型必须与功能块名称一致(fbinst: FB1不能写成fbinst: fb1)。
- ST 语言基础语法:
- 赋值用:=,不能用=(=在 ST 中是比较运算符);
- 语句结尾必须加封号;,否则编译报错;
- 注释用//(单行注释),多行注释用(* ... *)。
- 功能块与主程序的关系:
- 功能块是可复用的 “模块”,可以被多个主程序调用;
- 调用功能块时,输入参数用:=赋值,输出参数用=>接收结果;
- 功能块的内部变量(如 FB1 的 ivar)仅在内部生效,外部无法修改。
- 编译检查:
- 代码编写完成后,点击工具栏的「编译」按钮(图标为锤子);
- 如果有语法错误,编辑器会在下方提示错误位置和原因,按提示修改即可。
七、下一步:程序下载与监控
代码编写完成后,就可以将程序下载到 PLC(或软件自带的模拟运行系统)中运行了!下一篇我们将详细讲解:
- 如何通过 Gateway Server 连接设备;
- 程序下载与运行操作;
- 在线监控变量变化(查看 ivar 的计数过程和 erg 的输出结果)。