『7x24小时有问必答』
一、通信概述
Modbus TCP 是一种基于以太网的工业通信协议,S7-1200 PLC 可通过Modbus TCP 客户端功能与语音模块(Modbus TCP 服务器)进行通信,实现语音播报、录音播放等功能控制。

1.1 通信架构

1.png

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
PDB1.DBX0.0 BYTE 20
数据存储区指针

第四步:配置 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 报文格式

2.png
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_STRUCT

END_DATA_BLOCK

// 主程序 OB1 或 FB

FUNCTION_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_Announcement

FUNCTION_BLOCK "FB_Voice_Announcement"

VAR_INPUT

      Enable : Bool;                // 使能

      Announcement_ID : Int;    // 播报编号

      Priority : Int;               // 优先级 1-10

END_VAR

VAR_OUTPUT

      Done : Bool;                   // 完成标志

      Busy : Bool;                   // 忙标志

      Error : Bool;                  // 错误标志

END_VAR

VAR

       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 格式错误
使用 P格式指针

---

九、配置要点总结

配置项
关键要点
通信协议
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 块
功能丰富
支持播放/停止/音量控制等
成本优化
无需额外通信模块
扩展灵活
支持多个语音模块连接
兼容性好
支持多品牌语音模块

配置流程简图

3.png

重要提示

语音模块需支持 Modbus TCP 协议,确认型号和固件IP 地址必须在同一网段,不能冲突端口号默认为 502,如有修改需同步配置使用状态机控制通信,避免多个请求冲突添加错误处理和重试机制,提高系统可靠性语音编号要与烧录内容对应,避免播放错误

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码