ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

S7-1200 PLC串口通讯实战:RS485与Modbus RTU主从站配置

S7-1200 PLC串口通讯实战:RS485与Modbus RTU主从站配置 在自动化项目里真正让我们头疼的往往不是 PROFINET 或者工业以太网反而是设备上遗留的一个 RS485/RS232 串口。很多仪表、变频器、扫码枪、电子秤通讯能力就是“一对 A/B 线”或者“一个 DB9 母头”。要把这类设备接入西门子 S7-1200 PLC绕不开串口通讯相关的硬件选型、接线、协议分析和程序编写。本文围绕“西门子 S7-1200PLC 串口通讯”展开从硬件方案、报文原理到 Modbus RTU 主从站实战整理成一套可直接参考的教程。1. S7-1200 串口通讯定位与场景1.1 为什么现在的 PLC 项目仍然需要串口通讯工业现场常用的通讯方式有 PROFINET、EtherNet/IP、Modbus TCP 等以太网协议但在实际设备层串口通讯依然大量存在。原因并不复杂很多传感器、仪表、变频器本身就是 RS485 接口出厂不带以太网口老设备改造项目里原系统基于串口总线搭建短期内全部更换并不现实串口通讯成本低两线制 RS485 布线简单适合几十米到一千米以内的传输部分定制设备只有自由协议必须通过串口读取。S7-1200 作为中小型 PLC 的主力型号经常被用在单机自动化、小型产线、泵站、环保设备等场景。在这些现场设备厂商通常会要求 PLC 通过串口去读第三方仪表的数据或者把生产数据传给上位机。因此掌握 S7-1200 的串口通讯组态和编写方法是工控工程师的基本功。1.2 S7-1200 提供了哪些串口通讯硬件方案S7-1200 本体集成的是 PROFINET 接口并没有直接引出 RS232 或 RS485 串口。如果需要串口通讯必须通过扩展模块来实现。常见的硬件方案有三种模块接口类型典型应用CM 1241 RS232RS232 单站通讯连接扫码枪、打印机、近距离仪表CM 1241 RS485RS485 总线通讯连接变频器、仪表、PLC 从站CB 1241 RS485RS485 通讯板占用 CPU 信号板插槽节省模块空间其中 CM 1241 属于通讯模块需要安装在 PLC 左侧的模块扩展槽中CB 1241 则是通讯板安装在 CPU 正面的信号板插槽中。选择哪种方案主要看现场安装空间、从站数量和是否需要将来扩容。需要注意的是S7-1200 能扩展的模块数量与 CPU 型号有关实际项目要以所选 CPU 的选型手册为准不能盲目叠加。1.3 S7-1200 串口通讯支持哪些协议S7-1200 的串口模块自身是“透明”的硬件通道真正决定通讯格式的是上层协议。常用协议如下Modbus RTU最通用几乎绝大多数第三方仪表、变频器都支持USS 协议西门子变频器常用协议早期 MM4 系列和 G120 使用较多自由口协议也叫点对点通讯适合自定义报文格式的设备打印机/条码枪的简单输出某些场景只需要把字符串发送给打印设备。很多初学者会在“串口通讯”和“Modbus RTU 通讯”之间画等号这是不准确的。Modbus RTU 只是跑在串口上的一种常见协议S7-1200 也可以通过自由口去实现非标设备需要的自定义协议。2. 串口通讯物理与协议基础2.1 RS232 与 RS485 怎么选RS232 和 RS485 虽然都叫串口但特性差别很大。RS232 是全双工通讯发送和接收分别使用独立线缆但传输距离短通常不超过 15 米而且只能点对点连接一个串口只能接一台设备。S7-1200 使用 CM 1241 RS232适用于扫码枪、打印机这类近距离设备。RS485 是半双工通讯通常使用两根线 A、B 传输数据支持多点挂接在同一总线上可以并联多台设备传输距离可达 1000 米左右实际距离取决于波特率和线缆质量。CM 1241 RS485 就是为这种场景设计的。从项目角度如果设备距离超过几十米或者有多台从站需要并联基本上会选择 RS485。这也是搜索中经常看到“RS485 串口通讯”的原因。大多数变频器和电表、温控器都提供 RS485 接口。2.2 通讯参数PLC 与设备的“共同语言”串口通讯开始之前必须保证通讯参数一致。通讯参数包括波特率、数据位、停止位、校验位。波特率每秒传输的比特数常见有 9600、19200、38400、115200数据位表示一个数据帧中有效数据的位数通常是 8停止位表示一帧结束后的停止位数量常见 1 或 2校验位用于简单纠错常见无校验、偶校验、奇校验。如果两边参数不一致现象往往是通讯完全无响应或者收到乱码。例如 PLC 配置为 9600、8、N、1而仪表配置为 19200、8、E、1仪表不会返回正确的报文。在 TIA Portal 中配置串口时可以通过 MB_COMM_LOAD 指令或者模块属性设置参数。模块属性是基础设置而 Modbus 库指令中的 BAUD、PARITY 参数又会覆盖或决定实际通讯行为写程序时要保持一致。2.3 Modbus RTU 报文格式入门Modbus RTU 的报文结构其实非常简单一个完整请求通常由四部分组成从站地址1 字节表示要访问的从站编号功能码1 字节表示要执行的操作数据区N 字节包含寄存器地址、数量或写入值CRC 校验2 字节用于校验报文是否在传输中出错。例如主站要读取从站 1 的保持寄存器寄存器起始地址为 0读取数量为 2报文大致是01 03 00 00 00 02 CRC_LO CRC_HI其中01是从站地址03是“读保持寄存器”的功能码00 00是寄存器起始地址00 02是读取数量。从站的正常响应会返回功能码、字节数和寄存器数据。如果请求出错从站会返回异常功能码例如83并附带一个异常码。2.4 识别寄存器地址是调试关键在第三方设备手册中我们经常看到类似“40001 保持寄存器”“30001 输入寄存器”“00001 线圈”这样的描述。这些编号对应 Modbus 的不同数据区00001 区域线圈可读写位10001 区域离散输入只读位30001 区域输入寄存器只读字40001 区域保持寄存器可读写字。在 S7-1200 做 Modbus 主站时MB_MASTER 指令的 DATA_ADDR 参数往往可以直接填入设备手册中的寄存器编号例如读取 40001 就填 40001。但要注意不同厂商对地址编号的起始定义存在差异有些手册写成 40001实际协议中的偏移是 0有些手册直接给出协议偏移 0。调试时一定要以设备手册的“Modbus 地址表”为主必要时先用 Modbus 调试工具验证再写 PLC 程序。3. 环境准备与硬件接线3.1 演示环境说明本文中的示例以西门子 S7-1200 CPU 加 CM 1241 RS485 模块为基础编程软件使用 TIA Portal。不同固件版本下指令库的位置和界面会有细微差别但核心思路通用。实际项目请先确认以下信息CPU 型号及固件版本CM 1241 RS485 或 CB 1241 RS485 的订货号TIA Portal 版本对端从站设备的通讯协议和寄存器表。版本需要根据你的项目实际情况调整本文示例用于说明配置思路不能直接照搬到所有版本。3.2 RS485 接线建议RS485 总线建议使用双绞屏蔽线常见颜色是 A 线接设备端子 A 或 -B 线接设备端子 B 或 。不同厂商的标识不完全一致有些写 A/B有些写 D/D-有些写 485/485-接线前务必查阅模块手册和设备说明书。现场经常遇到“A/B 接反”的问题。RS485 是差分信号A/B 接反后不会烧设备但会出现完全收不到数据或者偶尔通讯失败。排查时可以先用一根短接线把 A/B 对调测试不要急着怀疑程序。如果总线上挂接多台设备还需要注意以下几点采用菊花链手拉手接线避免星形接法总线两端建议各加一个 120Ω 终端电阻屏蔽层尽量单端接地避免多点接地形成地环路通讯线不要与动力线走在同一根线槽中减少干扰。3.3 用调试工具提前验证在写 PLC 程序之前强烈建议先用电脑串口或 USB 转 RS485 工具连接现场从站设备再用 Modbus 调试助手发送报文确认设备地址、寄存器地址和返回数据都正确。这一步能省掉大量 PLC 端排错时间。调试助手的读取结果显示正常后再去配置 PLC 组态可以大大降低“设备本身有问题”和“PLC 程序有问题”的混淆概率。4. TIA Portal 中的串口组态与初始化4.1 添加硬件模块打开 TIA Portal 项目在左侧项目树中双击“设备组态”选中 PLC 的机架视图然后从右侧硬件目录中找到“通讯模块”选择对应型号的 CM 1241 RS485拖放到 CPU 左侧的插槽中。添加完成后需要编译硬件组态并下载到 PLC。下载后可以在在线视图中看到模块状态是否正常。4.2 MB_COMM_LOAD通讯口初始化指令S7-1200 使用 Modbus RTU 通讯时首先要对串口进行初始化。TIA Portal 中提供了 MB_COMM_LOAD 指令用于设置波特率、校验方式、协议模式等参数。MB_COMM_LOAD 一般只在 PLC 启动后调用一次或者在通讯参数需要切换时重新调用。它的输入参数中比较关键的几个如下参数含义示例值REQ初始化请求启动脉冲或常开信号PORT串口硬件标识符模块属性中的硬件标识符BAUD波特率9600PARITY校验方式无校验MB_DBModbus 指令背景 DB留空或指定在 SCL 中大致是// 程序段首次扫描或启动时调用一次 MB_COMM_LOAD_DB( REQ : StartInit, PORT : 269, BAUD : 9600, PARITY : 0, MB_DB : 0 );这里的PORT必须是 TIA Portal 为 CM 1241 RS485 分配的唯一硬件标识符不能随意填写。查看方式是在“设备组态”中选中模块在“属性-系统常量”中查看 PORT 标识或在 PLC 变量表里查看系统常量。4.3 MB_MASTER 与 MB_SLAVE 指令在哪完成端口初始化后S7-1200 就可以作为 Modbus 主站或从站工作。做主站调用 MB_MASTER 指令向从站发送读写请求做从站调用 MB_SLAVE 指令等待其他主站读写本地数据。在 TIA Portal 中这些指令通常位于“指令-通信-通信处理-Modbus”分类下。如果项目中找不到可能需要检查 TIA Portal 的库管理或根据软件版本从可选库中添加。MB_MASTER 指令不可以在一个 OB 中无限次调用多个实例去并发读写不同从站除非你非常明确总线时序和实例之间的关系。正常做法是一个通讯端口上只保留一个 MB_MASTER 轮询流程通过修改 MB_ADDR 参数来依次访问不同从站设备。5. 完整实战S7-1200 做主站轮询多台 Modbus 从站5.1 场景设计假设现场有三台第三方仪表均通过 RS485 总线连接到 S7-1200 的 CM 1241 RS485 模块。三台仪表地址分别为 1、2、3都使用 Modbus RTU 协议。PLC 需要周期读取每台仪表的 40001 到 40004 保持寄存器并将数据保存到不同的数据块区域供 HMI 或上位机显示。此时存在一个典型需求轮询。不能让三台设备同时响应 RS485 总线RS485 是半双工总线同一时刻只能有一台设备发送数据。因此 PLC 作为主站必须采用“问一台、等一台、收一台”的方式依次轮询。5.2 定义数据块与变量在项目中新建一个数据块建议命名为“DB_ModbusMaster”。将数据块的访问方式设置为“非优化”或允许符号访问具体看 TIA Portal 版本。内部建议定义以下变量变量名数据类型说明InitDoneBool端口初始化完成标志SlaveIdxInt当前轮询的从站序号1 到 3BusyBool上一帧是否正在处理DoneBool上一帧是否完成ErrorBool上一帧是否错误StatusWordMB_MASTER 返回状态码TriggerBool本次请求触发位RecvBuf1Array[0..3] of Word1 号从站读取的数据RecvBuf2Array[0..3] of Word2 号从站读取的数据RecvBuf3Array[0..3] of Word3 号从站读取的数据这些变量只是示例现场可以根据实际从站数量和寄存器长度调整。5.3 编写轮询状态逻辑Modbus RTU 主站轮询的关键是“上一帧结束后再发起下一帧”。如果不管忙绿标志直接用一个定时器周期触发读操作容易出现请求重叠导致数据错乱或从站无响应。下面用 SCL 示意轮询逻辑。该段代码需要放在周期性执行的 OB 或 FC 中并且要保证一次只调用一个 MB_MASTER 实例。// 如果通讯口还没有初始化完成先调用 MB_COMM_LOAD IF NOT #InitDone THEN MB_COMM_LOAD_DB( REQ : StartInit, PORT : 269, BAUD : 9600, PARITY : 0 ); // 实际项目中应根据 MB_COMM_LOAD 的 DONE 输出置位 InitDone #InitDone : TRUE; END_IF; // 初始化完成后开始轮询 IF #InitDone THEN // 只有上一次通讯不忙时才允许发起新的读写帧 IF NOT #Busy AND NOT #Trigger THEN // 切换到下一个从站 IF #SlaveIdx 3 THEN #SlaveIdx : 1; ELSE #SlaveIdx : #SlaveIdx 1; END_IF; // 根据当前序号选从站地址这里可以使用 CASE 或数组 CASE #SlaveIdx OF 1: #CurrentAddr : 1; 2: #CurrentAddr : 2; 3: #CurrentAddr : 3; END_CASE; // 产生一个上升沿作为 MB_MASTER 的 REQ 信号 #Trigger : TRUE; END_IF; // 调用 MB_MASTER读取当前从站 40001 开始的 4 个保持寄存器 MB_MASTER_DB( REQ : #Trigger, MB_ADDR : #CurrentAddr, MODE : 0, DATA_ADDR: 40001, DATA_LEN : 4, DATA_PTR : #RecvBuf, ERROR #Error, STATUS #Status ); // REQ 只需保持一个扫描周期调用完成后复位 #Trigger : FALSE; // 根据 MB_MASTER 输出更新状态实际项目中请把 DONE、BUSY 输出连接到对应变量 #Busy : #MB_MASTER_DB.BUSY; #Done : #MB_MASTER_DB.DONE; END_IF;这段代码是核心逻辑示意并不代表直接复制到项目即可运行。实际编写时你需要根据 TIA Portal 中建立的背景 DB、MB_MASTER 输出引脚和变量可见性做调整。正确思路是先发第一帧等待 BUSY 从 1 变 0 且 DONE 或 ERROR 输出有效后再改变 MB_ADDR 并置位下一帧的 REQ。这样每一帧都完成了“请求-应答-处理”不会出现多帧并发。5.4 数据保存的常见错误如果轮询读取的是不同从站最好分别保存到不同接收缓冲区。例如 1 号从站读到 RecvBuf12 号从站读到 RecvBuf2。如果所有从站都读到同一个 RecvBuf那么 2 号从站的数据返回后会覆盖 1 号从站尚未被上位机读取的数据。这里回应一个很常见的搜索问题“西门子 1200 PLC 进行 Modbus 轮询读取频率会覆盖其他数据”。大部分原因就是共用了同一个接收数据块或 DATA_PTR 区域而且在两次读取之间没有做数据搬运或锁存。解决办法就是为每个从站划分独立的数据存储区域或者每次读取完成后立即把数据搬运到独立的“保持区”。5.5 运行验证程序下载后可以在 TIA Portal 的监控表中观察接收缓冲区。如果通讯正常RecvBuf 中会不断刷新从站返回的数据。如果一直为零或者不变化可以按后面“常见问题与排查思路”一节逐项排查。如果现场有 HMI也可以直接在 HMI 上绑定接收缓冲区地址显示实时数据。6. 完整实战S7-1200 做 Modbus RTU 从站6.1 什么场景需要 PLC 做从站上位机或第三方控制器需要通过串口读取 S7-1200 内部数据时S7-1200 可以配置为 Modbus RTU 从站。常见场景包括组态软件或上位机通过串口服务器读取 PLC 变量第三方 DCS 或老旧系统中控需要采集 PLC 数据触摸屏通过 Modbus 协议访问 PLC。在实际工程中S7-1200 做从站并不复杂但要注意数据的映射关系。6.2 建立保持寄存器数据区S7-1200 做 Modbus RTU 从站时将 Modbus 的保持寄存器映射到 PLC 的数据块中。通常我们在 PLC 中建立一个数组数组每个元素对应一个 Modbus 保持寄存器。例如新建数据块“DB_SlaveData”定义一个长度为 100 的字数组DB_SlaveData.HoldReg[0..99]上位机如果读取保持寄存器 40001对应到数组下标 0读取 40002对应下标 1。实际项目中要以 TIA Portal 中 MB_SLAVE 指令的行为为准但仍可把这种方式理解为常见的“寄存器偏移从 0 开始”的映射规则。6.3 调用 MB_SLAVEMB_SLAVE 和 MB_MASTER 不同它不能被“偶尔调用”必须每个扫描周期都调用一次否则从站无法及时响应主站请求。在 SCL 中大致是// 该程序段在 OB1 中每个周期执行 MB_SLAVE_DB( MB_ADDR : 1, MB_HOLD_REG : DB_SlaveData.HoldReg, DONE #MBDone, ERROR #MBError, STATUS #MBStatus );其中 MB_ADDR 是本机从站地址示例中是 1。MB_HOLD_REG 指向保持寄存器数据块。上位机作为 Modbus 主站向从站地址 1 发送读取 40001 的报文S7-1200 收到请求后会自动从 DB_SlaveData.HoldReg 对应位置取出数据并返回。6.4 上位机调试验证S7-1200 做从站时可以用调试软件模拟 Modbus 主站向 PLC 写入部分寄存器值再观察 PLC 数据块中的数值变化确认读写路径是否一致。注意上位机与 PLC 之间需要 USB 转 RS485 的硬件连接并将上位机软件的通讯参数设置为与 PLC 侧 MB_COMM_LOAD 中一致的波特率和校验方式。如果两边校验方式不一致上位机会出现“超时”或“无响应”。7. 常见问题与排查思路本节汇总 S7-1200 串口通讯中最常见的问题。很多问题并非 PLC 程序本身出错而是参数、接线或地址映射的问题。问题现象常见原因解决思路完全无通讯PLC 主站报超时接线错误、A/B 接反、从站未上电检查通讯线对调 A/B 测试通讯不稳定时好时坏波特率不匹配、干扰、总线无终端电阻核对通讯参数检查线缆和终端电阻能通讯但读到数据全为 0地址或功能码错误设备未返回有效数据先用调试上位机验证寄存器地址MB_MASTER 返回错误状态从站地址不存在、CRC 错误、超时查看 STATUS 码对照西门子手册多台从站数据互相覆盖所有从站共用同一个 DATA_PTR 接收区每台从站或每种数据类型使用独立存储区上位机连不上 PLC 从站PLC 从站地址和上位机配置不一致核对 MB_SLAVE 的 MB_ADDR 与上位机主站配置调用了库程序但模块没有响应未正确初始化串口或 PORT 标识符错误检查 MB_COMM_LOAD 中的 PORT 是否与硬件系统常量一致解决串口通讯问题建议按以下顺序排查检查接线A/B 是否接反接线是否牢固检查供电从站设备是否正常上电检查参数波特率、校验位、数据位、停止位检查地址从站地址和设备手册中寄存器地址用上位机工具直接发报文确认设备本身响应再用 PLC 侧状态位和返回码缩小范围。实际项目中最容易混淆的是“设备本身正常但 PLC 发送的请求报文不对”。例如设备手册给出 40001 地址但实际请求中的协议地址偏移是 0如果 MB_MASTER 的 DATA_ADDR 填了 40002就会错误地读取到相邻寄存器。遇到这种问题时最好的办法是先用 Modbus 调试工具把正确的报文抓出来再对照 PLC 参数。8. 最佳实践与工程建议8.1 轮询状态机要闭环Modbus RTU 主站程序不要使用简单的定时器“盲发”而应该做成闭环轮询状态机每一帧请求发出后等待“响应完成”或“超时错误”然后再切到下一台设备。这样即使某个从站断电或故障也不会阻塞整个总线太久。在工程上可以设计一个超时定时器例如设置 500ms 或 1000ms。如果一帧请求发出后超过设定时间仍未收到响应就主动结束本次轮询切换到下一台从站同时记录该从站通讯错误。8.2 为每个从站设置独立存储区如前面所说接收缓冲区要按从站隔离。多个从站、多个寄存器区域不要共用同一个数组。推荐数据块设计DB_ComData ├── Station1_Recv: Array[0..9] of Word ├── Station2_Recv: Array[0..9] of Word ├── Station3_Recv: Array[0..9] of Word └── ErrorCode: Array[1..3] of Word这样每个从站的数据保持独立HMI 和上位机读取时也不会被下一次轮询覆盖。8.3 使用状态码做主动告警MB_MASTER 和 MB_SLAVE 都会返回 STATUS 状态码。项目验收时最好把这些状态码传到 HMI 报警画面而不是只保留在 PLC 程序里。当现场设备出现通讯故障时能直接从 HMI 上看到“1 号从站通讯超时”“2 号从站异常响应”比电工拿万用表量线快得多。8.4 关于变频器通讯的补充很多项目会用 S7-1200 串口去连接变频器例如 ABB、施耐德、台达、英威腾等品牌均支持 Modbus RTU也有一些西门子变频器支持 USS 协议。无论连接什么品牌变频器都要先查看变频器手册中的寄存器表。以常见变频器为例运行频率设定、当前频率反馈、运行状态、故障代码等往往对应不同的保持寄存器地址。调试前先将变频器的从站地址、波特率、校验方式设置正确再通过上位机工具验证寄存器地址最后再编写 PLC 轮询程序。对于西门子变频器如果型号支持 USS 协议也可以考虑使用 TIA Portal 中的 USS 指令库。USS 协议本身基于 RS485指令使用方式与 Modbus 主站轮询有些相似但通讯参数和报文结构不一致不能混用。8.5 生产环境变更要谨慎S7-1200 串口通讯涉及现场仪表和 PLC 程序如果在生产设备上调试需要注意以下几点修改 PLC 程序前先备份原工程临时修改从站参数前确认不会影响其他设备运行涉及变频器启停、频率给定等写操作时先测试只读再测试写入更换通讯模块或 CPU 前记录原模块的硬件标识符和组态参数从站设备参数修改要有记录避免调试完忘记恢复。8.6 提高项目的可维护性如果项目里要接入很多种串口设备建议把通讯逻辑封装成通用功能块。功能块的外部接口只暴露“触发读取、从站地址、寄存器地址、寄存器数量、接收数据区”内部实现轮询状态机和超时处理。后续新增设备时不需要修改通讯底层只需要在调用层添加新的从站参数和数据缓冲区。这样既提高了复用性也减少了重复调试时间。9. 总结与后续学习建议本文从 S7-1200 PLC 串口通讯的硬件选型开始介绍了 RS232、RS485 的区别Modbus RTU 的报文结构和参数含义重点演示了 S7-1200 作为 Modbus 主站进行多从站轮询以及作为 Modbus 从站供上位机读取数据的两种常用工作模式。读完后你应该能理解为什么串口通讯需要“双方参数一致”也能看懂 MB_COMM_LOAD、MB_MASTER、MB_SLAVE 三条核心指令的基本用法知道在实际项目中如何设计独立的接收缓冲区避免轮询覆盖数据。后续可以继续学习几个方向深入阅读西门子 S7-1200 通讯模块的系统手册掌握 STATUS 状态码的完整含义尝试用 S7-1200 的 USS 指令库连接西门子变频器学习如何使用自由口协议对接自定义协议设备在项目中逐步积累常用的 Modbus 寄存器地址表形成自己的调试笔记。如果本文对你有帮助可以收藏备用也欢迎在实际调试中回来对照排查。祝调试顺利。
返回列表