Codesys 与西门子 PLC 的通信配置
本文指导如何在基于 Codesys 运行的控制器与西门子 S7-1200/1500 PLC 之间建立 Modbus TCP 通信。该方案适用于跨品牌设备数据交互场景,无需购买额外网关,仅需网络互通即可实现。配置过程分为西门子服务端设置、Codesys 客户端设置及联调验证三个阶段。
第一阶段:环境与网络准备
在开始组态前,确保硬件连接正常且软件版本兼容。本指南基于 TIA Portal V16 及以上版本与 Codesys V3.5 SP16 及以上版本。
- 连接 网线将 Codesys 控制器与西门子 PLC 接入同一交换机或直接相连。
- 设置 西门子 PLC 的 IP 地址,例如
192.168.1.10。 - 设置 Codesys 控制器的 IP 地址,例如
192.168.1.20。 - 确认 两台设备之间可以互相
Ping通。 - 安装 西门子侧所需的 "Modbus TCP Server" 库文件(通常在 TIA Portal 指令树中搜索添加)。
- 安装 Codesys 侧所需的 "Modbus TCP Client" 库文件(在库管理器中勾选安装)。
通信建立的核心在于地址映射。西门子 PLC 的数据区(如 M 区)需要转换为 Modbus 协议识别的保持寄存器地址。以下是常用的地址对应关系:
| 西门子数据类型 | 西门子地址示例 | 对应 Modbus 地址 | 功能码 |
|---|---|---|---|
| M 区字 | %MW0 |
40001 |
03 / 06 |
| M 区字 | %MW10 |
40011 |
03 / 06 |
| DB 区字 | DB1.DBD0 |
40001 (需映射) |
03 / 06 |
注意:Modbus 地址
40001对应西门子起始字地址0。计算公式为$Modbus 地址 = 40001 + 西门子字地址$。
第二阶段:西门子 PLC 服务端配置
本阶段在 TIA Portal 中完成,目标是让西门子 PLC 监听 Modbus 请求并响应数据。
- 打开 TIA Portal 项目,展开 项目树中的 "程序块"。
- 创建 一个新的全局数据块,命名为
ModbusData,用于存放交互数据。 - 定义 变量,例如添加一个
Int类型变量SendValue和一个Int类型变量ReceiveValue。 - 打开 主程序块(如
Main [OB1])。 - 拖入 "Modbus TCP Server" 指令(通常位于 "通信" -> "开放式用户通信" 下)。
- 设置 指令参数
MB_HOLD_REG,指向ModbusData块的起始地址,例如P#DB1.DBX0.0 WORD 100。 - 输入
DISC_IO参数,若不使用离散量则设置为0。 - 设置
MB_ADDR参数,通常保持默认或根据网络规划设置站号,Modbus TCP 中此项常忽略。 - 连接
MB_CONNECT引脚到一个背景数据块实例,用于管理连接状态。 - 编译 项目并下载 到 PLC。
- 监控 指令引脚
STATUS,确保返回值为0表示监听正常。
若需处理多个客户端请求,复制 该指令实例并分配 不同的连接背景数据块。西门子 PLC 作为服务端,被动等待连接,无需主动发起请求。
第三阶段:Codesys 客户端配置
本阶段在 Codesys 开发环境中完成,目标是主动读取或写入西门子 PLC 的数据。
- 启动 Codesys 工程,右键点击 "设备" 树中的主设备。
- 选择 "添加设备",在列表中找到 "Modbus TCP Client" 驱动并添加。
- 点击 新添加的 Modbus 通道,设置 参数
Server Address为西门子 PLC 的 IP192.168.1.10。 - 设置 参数
Server Port为502(默认 Modbus 端口)。 - 设置 参数
Timeout为1000毫秒,防止网络波动导致程序阻塞。 - 右键点击 Modbus 通道下的 "Map" 或 "Variables" 节点。
- 选择 "添加变量",输入 变量名
Siemens_Read_Value。 - 设置 该变量的
Address为40001(对应西门子%MW0)。 - 设置 数据类型为
INT或WORD,需与西门子侧保持一致。 - 重复 上述步骤添加写入变量,例如
Siemens_Write_Value,地址设为40002。 - 编写 逻辑代码,将本地变量映射到 Modbus 变量。
在 Codesys 的 PLC_PRG 中,使用结构化文本(ST)进行数据搬运。以下代码示例展示了如何读取状态并写入控制命令:
PROGRAM PLC_PRG
VAR
LocalStatus : INT;
LocalCommand : INT;
ModbusReadVar : INT AT %IW0; (* 映射到 Modbus 输入寄存器 *)
ModbusWriteVar : INT AT %QW0; (* 映射到 Modbus 保持寄存器 *)
END_VAR
(* 读取西门子数据到本地 *)
LocalStatus := ModbusReadVar;
(* 将本地命令写入西门子 *)
ModbusWriteVar := LocalCommand;
- 编译 工程,确保无报错。
- 登录 设备,激活 配置。
第四阶段:通信流程与数据交互
理解数据流向有助于排查问题。以下流程图展示了请求与响应的完整生命周期:
通信建立后,数据交换遵循主从机制。Codesys 作为主站轮询,西门子作为从站响应。若网络中断,Codesys 侧变量通常会保持最后已知值或变为无效,需在程序中处理超时逻辑。
对于高频数据交互,建议优化轮询间隔。在 Codesys 的 Modbus 通道配置中,调整 Cycle Time 参数。默认值可能为 100 毫秒,若数据变化慢,可增大 至 500 毫秒以减轻网络负载。
若涉及大量数据传输,使用 连续地址块。例如一次性读取 10 个字,而不是分 10 次请求。在 Codesys 变量映射中,定义 数组变量,起始地址设为 40001,长度为 10。
第五阶段:故障排查与验证
配置完成后,必须进行功能验证。若通信失败,请按以下顺序检查。
- 检查 物理链路,观察 交换机或网口指示灯是否闪烁。
- 执行
Ping命令,确认 本机到192.168.1.10通畅。 - 查看 西门子 PLC 诊断缓冲区,查找 是否有 "连接拒绝" 或 "端口占用" 错误。
- 检查 西门子防火墙设置,确保
502端口未被阻挡(某些固件版本需手动开放)。 - 监控 Codesys 在线变量表,观察 通信状态字。
- 验证 数据一致性,修改 西门子侧
SendValue,确认 Codesys 侧数值同步变化。
常见错误代码及处理方法如下表所示:
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| 连接超时 | IP 地址错误 | 核对 双方 IP 及子网掩码 |
| 地址错误 | 寄存器地址偏移 | 检查 公式 $40001 + Offset$ 是否正确 |
| 数据类型不匹配 | 字/字节顺序颠倒 | 尝试 交换高低字节配置 |
| 无响应 | 服务端未启动 | 确认 西门子 MB_SERVER 指令已执行 |
若数据数值正确但大小异常(例如 1 变成 256),说明字节序(Endianness)不一致。在 Codesys 的 Modbus 驱动参数中,找到 Byte Swap 或 Word Swap 选项,勾选 或取消勾选 进行测试。
对于复杂项目,建议 启用通信看门狗。在 Codesys 程序中编写 计时器逻辑,若特定时间内未收到新数据,触发 报警位。这能防止因通信中断导致设备误动作。
保存 所有配置项目文件,备份 至外部存储介质。通信配置易受网络环境变更影响,保留原始工程便于后期维护。
断开 编程电缆,重启 双方设备,确认 断电后配置依然生效且通信自动恢复。

暂无评论,快来抢沙发吧!