2、开发环境搭建:安装Codesys开发环境、配置运行时、创建第一个PLC项目并连接仿真器
在工业自动化领域,Codesys 作为一款基于 IEC 61131-3 标准的、与硬件厂商无关的软 PLC 开发平台,其生态覆盖了从逻辑控制到运动控制、从可视化到现场总线的完整开发链路。本章的核心目标是帮助你在 30 分钟内完成从零到一的环境搭建,并成功运行第一个仿真程序。我们将按照“安装开发环境 → 配置运行时 → 创建项目 → 连接仿真器”的路径展开,同时深入剖析 Codesys 的工程架构与运行时机制,为后续的实战开发打下坚实基础。
2.1 核心原理:理解 Codesys 的三层架构
在动手安装之前,必须先理解 Codesys 的软件架构。它并非一个单体应用,而是由三个独立且协同工作的层次构成:开发环境 (IDE)、运行时系统 (Runtime) 和 网关 (Gateway)。这种分层设计是 Codesys 能够实现“一次编写,多处运行”的关键。
- 开发环境 (CODESYS IDE):基于 Visual Studio Shell 的集成开发环境,负责程序编写、编译、调试和可视化设计。它运行在 Windows 或 Linux 主机上,本身不执行任何 PLC 逻辑。
- 运行时系统 (CODESYS Control):这是真正的“软 PLC”内核,运行在目标设备上(如工控机、树莓派、嵌入式控制器)。它负责解析编译后的机器码、调度任务、管理 I/O 映射和通信栈。对于纯软件仿真,我们使用
CODESYS Control Win作为本机运行时。 - 网关 (CODESYS Gateway):作为中间层,负责在 IDE 和 Runtime 之间建立通信会话。它支持 TCP/IP 协议,使得 IDE 可以远程连接位于不同网段的控制器。在安装 IDE 时,网关通常作为默认组件一并安装。
理解这三者的关系至关重要。当你在 IDE 中点击“登录”时,实际流程是:IDE 通过网关向目标 Runtime 发送连接请求,Runtime 验证许可证后建立会话,随后 IDE 将编译后的应用代码下载到 Runtime 中执行。仿真器本质上就是一个运行在本地 PC 上的 Runtime 实例,它模拟了真实 PLC 的指令执行环境,但不涉及真实 I/O 硬件。
2.2 操作流程:从下载到仿真运行的四步法
下面我们以 Windows 10/11 环境为例,详细拆解环境搭建的完整流程。请务必按照顺序操作,避免因组件缺失导致的诡异错误。
步骤一:获取并安装开发环境
- 下载安装包:访问 Codesys 官网(www.codesys.com),进入 Download 区域。选择
CODESYS V3.5系列的最新 SP 版本(如 SP19 Patch 4)。注意区分 32 位与 64 位版本,现代 PC 建议选择 64 位。 - 安装过程:双击安装包,选择“完整安装 (Full Installation)”。这会自动安装 IDE、网关、以及常用的库文件。安装路径建议保持默认,避免中文目录或空格导致的编译异常。
- 设备描述文件:如果你使用的是第三方硬件(如 WAGO、Beckhoff 的 PLC),需要额外安装对应的设备描述文件(.device 文件)。这通常在硬件厂商官网下载,通过 IDE 的“工具 → 设备存储库”导入。
步骤二:安装并激活运行时
对于仿真开发,我们需要安装 CODESYS Control Win V3。这个组件在完整安装中可能不会自动包含,需要单独下载。
- 下载 Control Win:在官网下载中心搜索 “Control Win V3”,下载与 IDE 版本严格对应的安装包。
- 安装与授权:安装后,首次运行需要激活许可证。Codesys 提供 2 小时的免费试用授权,之后需要申请 90 天的开发授权(通过官网注册即可获取,通常即时发放)。
- 验证运行:打开 Windows 服务管理器,确认
CODESYS Control Win V3服务已启动。如果未启动,右键手动启动,并设置为“自动启动”。
步骤三:创建第一个 PLC 项目
- 新建项目:打开 Codesys IDE,点击“新建项目”,选择“标准项目”。在弹出的对话框中,设备选择
CODESYS Control Win V3,PLC 语言选择结构化文本 (ST)。 - 编写逻辑:在左侧设备树中双击
PLC_PRG,在编辑区输入以下代码:PROGRAM PLC_PRG VAR iCounter : INT := 0; bStart : BOOL := FALSE; END_VAR IF bStart THEN iCounter := iCounter + 1; IF iCounter > 100 THEN iCounter := 0; END_IF END_IF - 编译项目:点击菜单栏的“生成”按钮(或按 F11),观察下方“消息”窗口。确保输出 0 个错误,0 个警告。
步骤四:连接仿真器并运行
- 登录:点击“登录”按钮(或按 Alt+F8)。IDE 会通过网关自动发现本机的 Control Win 运行时。
- 启动:点击“启动”按钮(或按 F5)。此时程序开始运行,你可以通过右键点击变量
iCounter,选择“强制”或“写入”来改变bStart的值,观察计数器是否递增。 - 监控:在菜单栏选择“调试 → 监视”,可以打开“监视列表”窗口,实时查看所有变量的当前值。
2.3 案例拆解:仿真环境下的电机启停控制
为了验证环境搭建的正确性,我们设计一个典型的电机启停控制逻辑。该案例将涵盖数字量输入、输出映射以及定时器功能块的使用,这是后续所有实战项目的基础模板。
场景与目标:模拟一个电机控制柜。按下启动按钮(SB1)后,电机接触器(KM1)吸合,运行指示灯亮;按下停止按钮(SB2)后,接触器断开。同时,电机运行超过 10 秒后,自动进入冷却延时状态,5 秒后允许再次启动。
关键输入/输出定义:
| 变量名 | 类型 | 地址映射 | 说明 |
|---|---|---|---|
| Start_Button | BOOL | %IX0.0 | 启动按钮(常开) |
| Stop_Button | BOOL | %IX0.1 | 停止按钮(常闭) |
| Motor_Contactor | BOOL | %QX0.0 | 接触器输出 |
| Run_Light | BOOL | %QX0.1 | 运行指示灯 |
实现逻辑(ST 语言):
PROGRAM MotorControl
VAR
Start_Button : BOOL;
Stop_Button : BOOL;
Motor_Contactor: BOOL;
Run_Light : BOOL;
tonRunTime : TON; // 运行计时
tonCoolDown : TON; // 冷却计时
bCooling : BOOL := FALSE;
END_VAR
// 启动优先:按下启动且不在冷却状态
IF Start_Button AND NOT bCooling THEN
Motor_Contactor := TRUE;
END_IF
// 停止优先:按下停止或运行超时
IF Stop_Button OR tonRunTime.Q THEN
Motor_Contactor := FALSE;
END_IF
// 运行计时器
tonRunTime(IN := Motor_Contactor, PT := T#10S);
Run_Light := Motor_Contactor;
// 冷却状态检测
IF tonRunTime.Q THEN
bCooling := TRUE;
tonCoolDown(IN := TRUE, PT := T#5S);
IF tonCoolDown.Q THEN
bCooling := FALSE;
tonCoolDown(IN := FALSE);
END_IF
END_IF
调试过程与结果:将上述代码下载到仿真器。在监视列表中强制 Start_Button 为 TRUE,观察 Motor_Contactor 立即变为 TRUE。保持 10 秒后,接触器自动断开,且 bCooling 变为 TRUE。此时即使再次强制启动按钮,接触器也不会吸合。5 秒后,bCooling 复位,系统恢复可启动状态。
复盘与经验:此案例验证了定时器功能块(TON)的时序行为。在实际工程中,停止按钮应使用常闭触点(NC),并在程序中使用 NOT Stop_Button 逻辑,以确保断线时能安全停机。仿真器无法模拟真实的触点抖动,因此在实际调试中需增加 10-20ms 的输入滤波。
2.4 常见误区与总结复盘
在初学者搭建环境的过程中,以下三个误区最为常见,需要特别留意。
- 误区一:混淆“仿真”与“模拟”。Codesys 的仿真器(Control Win)是真实执行编译后的机器码,其行为与真实 PLC 完全一致,只是没有物理 I/O。而“模拟”通常指在 IDE 中通过强制变量来模拟输入信号。理解这一点有助于正确分析故障:仿真器运行异常,问题出在逻辑代码;真实设备运行异常,问题可能出在硬件接线或 I/O 映射。
- 误区二:忽略任务配置。在设备树中,“任务配置”决定了程序的执行周期。默认情况下,Codesys 会创建一个优先级为 0 的循环任务,周期为 10ms。如果程序中有多个 POU,但未在任务中调用,这些 POU 将不会执行。很多初学者发现程序不运行,原因就是 POU 没有被添加到任务中。
- 误区三:在线修改的误操作。Codesys 支持在线修改(Online Change),即在运行状态下修改代码并下载。但频繁的在线修改可能导致内存碎片化,在长时间运行的设备上引发偶发故障。建议在开发阶段频繁使用,但在现场调试阶段,尽量在停机状态下进行完整下载。