|
一、通信概述 Modbus TCP 是一种基于以太网的工业通信协议,S7-1200 PLC 可通过Modbus TCP 客户端功能与语音模块(Modbus TCP 服务器)进行通信,实现语音播报、录音播放等功能控制。 1.1 通信架构 1.2 常见语音模块品牌 品牌 | 型号 | 特点 | 支持协议 | | 唯创知音 | WT588F/WTV 系列 | 性价比高 | Modbus TCP/RTU | | 九芯电子 | NV065/NV080 系列 | 功能丰富 | Modbus TCP/RTU | | 宇凡微 | YF-S101 系列 | 工业级 | Modbus TCP | | 奥泰斯 | ATS-Voice 系列 | 高音质 | Modbus TCP | | 西门子 | 无官方语音模块 | - | 需第三方 |
1.3 通信特点 特性 | 说明 | 通信类型 | Modbus TCP(基于 TCP/IP) | 数据交换 | 功能码 03/04/06/16 | 传输距离 | 标准 100 米(可扩展) | 通信周期 | 100ms ~ 1s 可调 | 端口号 | 默认 502 | 连接数 | S7-1200 最多支持 8 个 Modbus TCP 连接 |
--- 二、硬件与软件要求 2.1 软件要求 软件 | 最低版本 | 推荐版本 | 说明 | TIA Portal(博途) | V15.1 | V17/V18/V19 | S7-1200 组态 | S7-1200 固件 | V2.0 | V4.0+ | 支持 Modbus TCP | 语音模块配置软件 | 根据品牌 | 最新版本 | 语音内容烧录 | MB_CLIENT 库 | V2.0+ | 最新版本 | TIA Portal 内置 |
2.2 硬件要求 设备 | 型号 | 说明 | | S7-1200 | CPU 1212C/1214C/1215C/1217C | 带 PROFINET 接口 | | 语音模块 | 支持 Modbus TCP 的语音模块 | 需确认协议支持 | | 网线 | CAT5e 及以上 | 标准工业以太网线 | | 交换机 | 可选 | 多设备连接时使用 | | 扬声器 | 根据功率选择 | 3W/5W/10W 等 |
2.3 S7-1200 Modbus TCP 连接限制 S7-1200 型号 | 最大 Modbus TCP 连接数 | 说明 | CPU 1211C | 8 个 | 共享通信资源 | CPU 1212C | 8 个 | 共享通信资源 | CPU 1214C | 8 个 | 共享通信资源 | CPU 1215C | 8 个 | 共享通信资源 | CPU 1217C | 8 个 | 共享通信资源 |
--- 三、配置步骤(TIA Portal 侧) 第一步:创建 TIA Portal 项目 打开TIA Portal软件 点击「创建新项目」,输入项目名称 选择「添加新设备」 第二步:添加 S7-1200 CPU 添加 PLC: 选择「控制器」→「SIMATIC S7-1200」→「CPU」 选择具体型号和固件版本 配置 PROFINET 接口: 进入「设备视图」→ 点击 CPU 上的 PROFINET 接口 在「属性」→「以太网地址」中设置: IP 地址:如 192.168.0.1 子网掩码:255.255.255.0 第三步:添加 Modbus TCP 通信块 打开程序块: 展开「程序块」→「系统块」 找到「Communication」→「Modbus TCP」 添加 MB_CLIENT 块: 拖拽「MB_CLIENT」到 OB1 或 FB/FC 中 系统会自动生成背景数据块(如 DB3) 配置 MB_CLIENT 参数: 参数 | 设置值 | 说明 | | CONNECT | 新建连接 | 指向 Modbus TCP 连接配置 | | MB_MODE | 0/1/2/3 | 0=保持,1=读取,2=写入,3=写多个 | | MB_ADDR | 1 | Modbus 从站地址 | | MODE | 0/1 | 0=保持寄存器,1=输入寄存器 | | DATA_ADDR | 0 | 起始寄存器地址 | | DATA_LEN | 10 | 读取/写入的数据长度 | | DATA_PTR | | 数据存储区指针 |
第四步:配置 Modbus TCP 连接 创建连接配置: 在「程序块」→「系统块」→「Modbus TCP」 右键「添加新连接」 配置连接参数: 参数 | 设置值 | 说明 | | 连接 ID | | 唯一连接标识 | | IP 地址 | 192.168.0.2 | 语音模块 IP | | 端口号 | 502 | Modbus TCP 默认端口 | | 连接类型 | TCP | 选择 TCP 连接 | | 主动建立连接 | 是 | PLC 作为客户端主动连接 |
第五步:创建数据块 创建 DB 块: 右键「程序块」→「添加新块」→「数据块」 命名为「Voice_Data」 定义变量: 变量名称 | 数据类型 | 地址 | 说明 | Voice_Control | Word | DB1.DBW0 | 语音控制字 | Voice_Number | Word | DB1.DBW2 | 语音编号 | Voice_Status | Word | DB1.DBW4 | 语音状态 | Module_Status | Word | DB1.DBW6 | 模块状态 | Read_Data | Array[0..9] Of Word | DB1.DBW10 | 读取数据区 | Write_Data | Array[0..9] Of Word | DB1.DBW30 | 写入数据区 |
第六步:编写通信程序 // 主程序 OB1 或 FB// 调用 MB_CLIENT 块"MB_Client_Instance"( CONNECT := 'Modbus_TCP_Connection', // 连接配置 MB_MODE := MB_Mode, // 功能模式 MB_ADDR := 1, // 从站地址 MODE := 0, // 0=保持寄存器 DATA_ADDR := 0, // 起始地址 DATA_LEN := 10, // 数据长度 DATA_PTR := P#"Voice_Data".Read_Data[0], // 数据指针 REQ := Read_Req, // 读取请求 BUSY => MB_Busy, // 忙标志 MODE => MB_Mode_Status, // 模式状态 DONE => MB_Done, // 完成标志 ERROR => MB_Error, // 错误标志 STATUS => MB_Status // 状态代码);第七步:编译并下载 编译项目: 点击「编译」→「编译全部」 检查是否有错误 下载 PLC 程序: 连接 S7-1200 PLC 下载程序到 PLC 将 PLC 切换到RUN 模式 --- 四、语音模块侧配置 4.1 网络参数配置 参数 | 设置值 | 说明 | | IP 地址 | 192.168.0.2 | 与 PLC 同一网段 | | 子网掩码 | 255.255.255.0 | 子网掩码 | | 网关 | 192.168.0.1 | 可选 | | 端口号 | 502 | Modbus TCP 默认端口 | | 从站地址 | 1 | Modbus 从站 ID |
4.2 语音内容烧录 使用配置软件: 连接语音模块(USB/串口) 打开语音模块配置软件 录制/导入语音: 录制语音文件或导入 WAV/MP3 为每个语音文件分配编号(0-255 或 0-65535) 烧录语音: 将语音文件烧录到模块 Flash 验证烧录结果 4.3 Modbus 寄存器映射(典型) 寄存器地址 | 功能 | 读写 | 说明 | 40001 | 控制命令 | 写 | 播放/停止/暂停 | 40002 | 语音编号 | 写 | 要播放的语音编号 | 40003 | 音量设置 | 写 | 0-31 级音量 | 40004 | 模块状态 | 读 | 忙/闲/故障 | 40005 | 当前语音 | 读 | 正在播放的编号 | 40006 | 固件版本 | 读 | 模块版本信息 |
--- 五、数据交换格式详解 5.1 控制命令(写寄存器) 命令值 | 功能 | 说明 | 0x0001 | 播放 | 播放指定编号语音 | 0x0002 | 停止 | 停止当前播放 | 0x0003 | 暂停 | 暂停播放 | 0x0004 | 继续 | 继续播放 | 0x0005 | 循环播放 | 循环指定语音 | 0x0006 | 单曲循环 | 单曲循环播放 | 0x0007 | 随机播放 | 随机播放所有语音 | 0x0008 | 音量 + | 增加音量 | 0x0009 | 音量 - | 减小音量 | 0x000A | 复位 | 模块复位 |
5.2 状态反馈(读寄存器) 状态值 | 含义 | 说明 | 0x0000 | 空闲 | 无播放任务 | 0x0001 | 播放中 | 正在播放语音 | 0x0002 | 暂停 | 暂停状态 | 0x0003 | 故障 | 模块故障 | 0x0004 | 无语音 | 指定编号无语音 | 0x0005 | 存储满 | Flash 存储已满 |
5.3 Modbus TCP 报文格式 5.4 典型读写示例读取模块状态: 请求:00 01 00 00 00 06 01 03 00 03 00 01响应:00 01 00 00 00 05 01 03 02 00 01写入播放命令: 请求:00 02 00 00 00 09 01 06 00 00 00 01响应:00 02 00 00 00 06 01 06 00 00 00 01--- 六、编程示例 6.1 完整控制程序(SCL) // 数据块 DB1 "Voice_Control_Data"DATA_BLOCK "Voice_Control_Data"STRUCT // 控制命令 Play_Request : Bool; // DB1.DBX0.0 播放请求 Stop_Request : Bool; // DB1.DBX0.1 停止请求 Pause_Request : Bool; // DB1.DBX0.2 暂停请求 Voice_Number : Word; // DB1.DBW2 语音编号 Volume_Level : Word; // DB1.DBW4 音量等级 // 状态反馈 Module_Busy : Bool; // DB1.DBX6.0 模块忙 Module_Fault : Bool; // DB1.DBX6.1 模块故障 Current_Voice : Word; // DB1.DBW8 当前语音编号 Module_Status : Word; // DB1.DBW10 模块状态 // 通信状态 Comm_Ready : Bool; // DB1.DBX12.0 通信就绪 Comm_Error : Bool; // DB1.DBX12.1 通信错误 Error_Code : Word; // DB1.DBW14 错误代码END_STRUCTEND_DATA_BLOCK// 主程序 OB1 或 FBFUNCTION_BLOCK "FB_Voice_Control"VAR // MB_CLIENT 实例 "MB_Client_Read" : MB_CLIENT; "MB_Client_Write" : MB_CLIENT; // 连接配置 "Modbus_TCP_Connection" : TCON_Modbus; // 临时变量 Read_Req : Bool; Write_Req : Bool; MB_Busy : Bool; MB_Done : Bool; MB_Error : Bool; MB_Status : Word; // 状态机 Step : Int := 0; Timer : TON_TIME;END_VAR// 连接配置初始化"Modbus_TCP_Connection".connectionId := W161;"Modbus_TCP_Connection".connectionType := W161; // TCP"Modbus_TCP_Connection".activeEstablish := TRUE;"Modbus_TCP_Connection".remoteAddress := P#"192.168.0.2:502";// 状态机控制CASE Step OF 0: // 初始化 "Voice_Control_Data".Comm_Ready := FALSE; Step := 1; 1: // 读取模块状态 IF NOT MB_Busy THEN Read_Req := TRUE; "MB_Client_Read"( CONNECT := 'Modbus_TCP_Connection', MB_MODE := 1, // 读取 MB_ADDR := 1, // 从站地址 MODE := 0, // 保持寄存器 DATA_ADDR := 3, // 状态寄存器地址 DATA_LEN := 4, // 读取 4 个寄存器 DATA_PTR := P#"Voice_Control_Data".Module_Status, REQ := Read_Req, BUSY => MB_Busy, DONE => MB_Done, ERROR => MB_Error, STATUS => MB_Status ); IF MB_Done THEN Read_Req := FALSE; "Voice_Control_Data".Comm_Ready := TRUE; Step := 2; END_IF; IF MB_Error THEN "Voice_Control_Data".Comm_Error := TRUE; "Voice_Control_Data".Error_Code := MB_Status; END_IF; END_IF; 2: // 等待控制命令 IF "Voice_Control_Data".Play_Request THEN Write_Req := TRUE; "MB_Client_Write"( CONNECT := 'Modbus_TCP_Connection', MB_MODE := 2, // 写入 MB_ADDR := 1, MODE := 0, DATA_ADDR := 0, // 控制寄存器地址 DATA_LEN := 2, // 写入 2 个寄存器 DATA_PTR := P#"Voice_Control_Data".Voice_Number, REQ := Write_Req, BUSY => MB_Busy, DONE => MB_Done, ERROR => MB_Error, STATUS => MB_Status ); IF MB_Done THEN Write_Req := FALSE; "Voice_Control_Data".Play_Request := FALSE; Step := 1; END_IF; END_IF; IF "Voice_Control_Data".Stop_Request THEN // 写入停止命令 "Voice_Control_Data".Voice_Number := 0; Write_Req := TRUE; Step := 1; END_IF; ELSE Step := 0;END_CASE;// 状态解析"Voice_Control_Data".Module_Busy := ("Voice_Control_Data".Module_Status = 1);"Voice_Control_Data".Module_Fault := ("Voice_Control_Data".Module_Status = 3);6.2 语音播报功能块 // 功能块 FB_Voice_AnnouncementFUNCTION_BLOCK "FB_Voice_Announcement"VAR_INPUT Enable : Bool; // 使能 Announcement_ID : Int; // 播报编号 Priority : Int; // 优先级 1-10END_VARVAR_OUTPUT Done : Bool; // 完成标志 Busy : Bool; // 忙标志 Error : Bool; // 错误标志END_VARVAR State : Int := 0; Timer : TON_TIME;END_VAR// 状态机CASE State OF 0: // 等待使能 IF Enable AND NOT "Voice_Control_Data".Module_Busy THEN "Voice_Control_Data".Voice_Number := WORD(Announcement_ID); "Voice_Control_Data".Play_Request := TRUE; State := 1; Busy := TRUE; END_IF; 1: // 等待播放完成 Timer(IN := TRUE, PT := T5S); // 假设语音最长 5 秒 IF Timer.Q OR NOT "Voice_Control_Data".Module_Busy THEN State := 0; Busy := FALSE; Done := TRUE; Timer(IN := FALSE); END_IF; ELSE State := 0;END_CASE;6.3 报警语音联动 // 报警语音处理IF "Alarm_Fault" THEN "FB_Voice_Announcement"( Enable := TRUE, Announcement_ID := 10, // 故障报警语音编号 Priority := 10, Done => Voice_Done, Busy => Voice_Busy, Error => Voice_Error );END_IF;IF "Alarm_Warning" THEN "FB_Voice_Announcement"( Enable := TRUE, Announcement_ID := 20, // 警告语音编号 Priority := 5, Done => Voice_Done, Busy => Voice_Busy, Error => Voice_Error );END_IF;// 生产计数播报IF "Part_Count" MOD 100 = 0 AND "Part_Count" > 0 THEN "FB_Voice_Announcement"( Enable := TRUE, Announcement_ID := 30, // 计数播报编号 Priority := 3, Done => Voice_Done, Busy => Voice_Busy, Error => Voice_Error );END_IF;--- 七、通信状态监控与诊断 7.1 MB_CLIENT 状态代码 状态代码 | 含义 | 解决方案 | | 无错误 | 正常 | | 连接超时 | 检查网络连接 | | 连接拒绝 | 检查 IP 和端口 | | 无连接 | 连接未建立 | | 连接断开 | 检查网络稳定性 | | 数据错误 | 检查寄存器地址 | | 功能码错误 | 检查功能码配置 | | 从站无响应 | 检查从站状态 |
7.2 语音模块 LED 状态 LED | 颜色/状态 | 含义 | | POWER | 绿色常亮 | 电源正常 | | RUN | 绿色闪烁 | 运行正常 | | NET | 绿色 | 网络连接正常 | | NET | 红色 | 网络故障 | | PLAY | 绿色 | 正在播放 | | PLAY | 熄灭 | 空闲状态 |
7.3 TIA Portal 在线监控 在 TIA Portal 中查看 CPU 的「在线与诊断」 查看「通信」→「Modbus TCP」连接状态 查看通信错误信息 --- 八、常见问题与解决方案 问题现象 | 可能原因 | 解决方案 | 无法连接语音模块 | IP 地址不在同一网段 | 检查并统一 IP 网段 | 通信超时 | 端口号错误 | 确认端口为 502 | 语音不播放 | 语音编号错误 | 检查语音编号是否存在 | 连接显示错误 | 语音模块未上电 | 检查电源连接 | 数据读取失败 | 寄存器地址错误 | 查阅语音模块手册 | 频繁通信中断 | 网线质量差 | 更换高质量网线 | 多个请求冲突 | 未做互锁处理 | 添加状态机控制 | 音量过小 | 音量设置过低 | 调整音量寄存器 | 语音内容错误 | 烧录内容错误 | 重新烧录语音 | MB_CLIENT 报错 | 连接配置错误 | 检查 CONNECT 参数 | 从站地址错误 | MB_ADDR 配置错误 | 确认从站地址 | 数据指针错误 | DATA_PTR 格式错误 | |
--- 九、配置要点总结 配置项 | 关键要点 | 通信协议 | Modbus TCP(非 PROFINET IO) | IP 地址 | 同一网段,不能冲突 | 端口号 | 默认 502 | 从站地址 | 确认语音模块 Modbus 地址 | 连接配置 | MB_CLIENT 的 CONNECT 参数正确 | 数据指针 | 使用 P格式(如 PDB1.DBX0.0 BYTE 20) | 功能码 | 03=读保持,06=写单寄存器,16=写多寄存器 | 寄存器地址 | 根据语音模块手册配置 | 状态机控制 | 避免多个请求同时发送 | 错误处理 | 添加通信错误处理和重试机制 | 网络连接 | 使用 CAT5e 及以上标准网线 |
--- 十、推荐参考资料 资料名称 | 来源 | S7-1200 Modbus TCP 通信手册 | 西门子工业支持中心 | MB_CLIENT 功能块使用说明 | TIA Portal 帮助文档 | 语音模块 Modbus 协议手册 | 语音模块厂家 | Modbus TCP 协议规范 | Modbus 组织官网 |
--- 十一、总结 S7-1200 与语音模块的 Modbus TCP 通信是工业自动化中语音提示/报警的常用方案,具有以下优势: 优势 | 说明 | 标准协议 | Modbus TCP 是开放标准,兼容性好 | 配置简单 | TIA Portal 内置 MB_CLIENT 块 | 功能丰富 | 支持播放/停止/音量控制等 | 成本优化 | 无需额外通信模块 | 扩展灵活 | 支持多个语音模块连接 | 兼容性好 | 支持多品牌语音模块 |
配置流程简图 重要提示 语音模块需支持 Modbus TCP 协议,确认型号和固件IP 地址必须在同一网段,不能冲突端口号默认为 502,如有修改需同步配置使用状态机控制通信,避免多个请求冲突添加错误处理和重试机制,提高系统可靠性语音编号要与烧录内容对应,避免播放错误 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |