文章目录

Codesys与西门子PLC的通信配置

发布于 2026-03-30 17:52:12 · 浏览 8 次 · 评论 0 条

Codesys 与西门子 PLC 的通信配置

本文指导如何在基于 Codesys 运行的控制器与西门子 S7-1200/1500 PLC 之间建立 Modbus TCP 通信。该方案适用于跨品牌设备数据交互场景,无需购买额外网关,仅需网络互通即可实现。配置过程分为西门子服务端设置、Codesys 客户端设置及联调验证三个阶段。


第一阶段:环境与网络准备

在开始组态前,确保硬件连接正常且软件版本兼容。本指南基于 TIA Portal V16 及以上版本与 Codesys V3.5 SP16 及以上版本。

  1. 连接 网线将 Codesys 控制器与西门子 PLC 接入同一交换机或直接相连。
  2. 设置 西门子 PLC 的 IP 地址,例如 192.168.1.10
  3. 设置 Codesys 控制器的 IP 地址,例如 192.168.1.20
  4. 确认 两台设备之间可以互相 Ping 通。
  5. 安装 西门子侧所需的 "Modbus TCP Server" 库文件(通常在 TIA Portal 指令树中搜索添加)。
  6. 安装 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 请求并响应数据。

  1. 打开 TIA Portal 项目,展开 项目树中的 "程序块"。
  2. 创建 一个新的全局数据块,命名为 ModbusData,用于存放交互数据。
  3. 定义 变量,例如添加一个 Int 类型变量 SendValue 和一个 Int 类型变量 ReceiveValue
  4. 打开 主程序块(如 Main [OB1])。
  5. 拖入 "Modbus TCP Server" 指令(通常位于 "通信" -> "开放式用户通信" 下)。
  6. 设置 指令参数 MB_HOLD_REG,指向 ModbusData 块的起始地址,例如 P#DB1.DBX0.0 WORD 100
  7. 输入 DISC_IO 参数,若不使用离散量则设置为 0
  8. 设置 MB_ADDR 参数,通常保持默认或根据网络规划设置站号,Modbus TCP 中此项常忽略。
  9. 连接 MB_CONNECT 引脚到一个背景数据块实例,用于管理连接状态。
  10. 编译 项目并下载 到 PLC。
  11. 监控 指令引脚 STATUS,确保返回值为 0 表示监听正常。

若需处理多个客户端请求,复制 该指令实例并分配 不同的连接背景数据块。西门子 PLC 作为服务端,被动等待连接,无需主动发起请求。


第三阶段:Codesys 客户端配置

本阶段在 Codesys 开发环境中完成,目标是主动读取或写入西门子 PLC 的数据。

  1. 启动 Codesys 工程,右键点击 "设备" 树中的主设备。
  2. 选择 "添加设备",在列表中找到 "Modbus TCP Client" 驱动并添加
  3. 点击 新添加的 Modbus 通道,设置 参数 Server Address 为西门子 PLC 的 IP 192.168.1.10
  4. 设置 参数 Server Port502(默认 Modbus 端口)。
  5. 设置 参数 Timeout1000 毫秒,防止网络波动导致程序阻塞。
  6. 右键点击 Modbus 通道下的 "Map" 或 "Variables" 节点。
  7. 选择 "添加变量",输入 变量名 Siemens_Read_Value
  8. 设置 该变量的 Address40001(对应西门子 %MW0)。
  9. 设置 数据类型为 INTWORD,需与西门子侧保持一致。
  10. 重复 上述步骤添加写入变量,例如 Siemens_Write_Value,地址设为 40002
  11. 编写 逻辑代码,将本地变量映射到 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;
  1. 编译 工程,确保无报错。
  2. 登录 设备,激活 配置。

第四阶段:通信流程与数据交互

理解数据流向有助于排查问题。以下流程图展示了请求与响应的完整生命周期:

graph LR A["Codesys 客户端"] -->| "发送读取请求" | B["西门子 PLC 服务端"] B -->| "查询地址数据" | C["数据块 DB"] C -->| "返回数值" | B B -->| "发送响应报文" | A A -->| "更新变量" | D["本地逻辑"]

通信建立后,数据交换遵循主从机制。Codesys 作为主站轮询,西门子作为从站响应。若网络中断,Codesys 侧变量通常会保持最后已知值或变为无效,需在程序中处理超时逻辑。

对于高频数据交互,建议优化轮询间隔。在 Codesys 的 Modbus 通道配置中,调整 Cycle Time 参数。默认值可能为 100 毫秒,若数据变化慢,可增大500 毫秒以减轻网络负载。

若涉及大量数据传输,使用 连续地址块。例如一次性读取 10 个字,而不是分 10 次请求。在 Codesys 变量映射中,定义 数组变量,起始地址设为 40001,长度为 10


第五阶段:故障排查与验证

配置完成后,必须进行功能验证。若通信失败,请按以下顺序检查。

  1. 检查 物理链路,观察 交换机或网口指示灯是否闪烁。
  2. 执行 Ping 命令,确认 本机到 192.168.1.10 通畅。
  3. 查看 西门子 PLC 诊断缓冲区,查找 是否有 "连接拒绝" 或 "端口占用" 错误。
  4. 检查 西门子防火墙设置,确保 502 端口未被阻挡(某些固件版本需手动开放)。
  5. 监控 Codesys 在线变量表,观察 通信状态字。
  6. 验证 数据一致性,修改 西门子侧 SendValue确认 Codesys 侧数值同步变化。

常见错误代码及处理方法如下表所示:

错误现象 可能原因 解决方法
连接超时 IP 地址错误 核对 双方 IP 及子网掩码
地址错误 寄存器地址偏移 检查 公式 $40001 + Offset$ 是否正确
数据类型不匹配 字/字节顺序颠倒 尝试 交换高低字节配置
无响应 服务端未启动 确认 西门子 MB_SERVER 指令已执行

若数据数值正确但大小异常(例如 1 变成 256),说明字节序(Endianness)不一致。在 Codesys 的 Modbus 驱动参数中,找到 Byte SwapWord Swap 选项,勾选取消勾选 进行测试。

对于复杂项目,建议 启用通信看门狗。在 Codesys 程序中编写 计时器逻辑,若特定时间内未收到新数据,触发 报警位。这能防止因通信中断导致设备误动作。

保存 所有配置项目文件,备份 至外部存储介质。通信配置易受网络环境变更影响,保留原始工程便于后期维护。

断开 编程电缆,重启 双方设备,确认 断电后配置依然生效且通信自动恢复。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文