1. 从零开始:为什么你需要掌握Modbus Poll与PLC的通信?
如果你正在和工业自动化设备打交道,尤其是像AS300或者AS200系列这样的PLC,那你肯定绕不开一个词:Modbus。这几乎是工业现场设备之间“对话”的普通话。而Modbus Poll,就是咱们工程师手里一个非常趁手的“对讲机”,专门用来主动呼叫和监听PLC这些“从站”设备的状态。
我刚开始接触这块的时候,也觉得有点头大。PLC手册里一堆地址,什么X、Y、M、D,Modbus Poll里又要填功能码、起始地址,两边好像对不上号,一连接就报错。后来在项目里摸爬滚打,调试了不知道多少台AS300系列PLC之后,我才发现,只要搞懂其中的“翻译规则”,一切都会变得非常简单。这篇文章,我就想把我这些年调试AS300/200系列PLC的经验,用最直白的话分享给你,让你能快速上手,把Modbus Poll这个工具真正用起来,去读取数据、写入命令,完成调试和诊断。
简单来说,这个场景就是:你的电脑上运行着Modbus Poll软件(主站/Master),通过网络(通常是网线)连接到一台AS300或AS200 PLC(从站/Slave)。你的目标是,让Modbus Poll能正确地读取到PLC内部的各种开关量状态(比如某个输入点X是否接通)、模拟量数值(比如温度传感器读到多少度),或者向PLC写入控制命令(比如让某个输出点Y闭合)。整个过程的核心钥匙,就是地址映射——把PLC编程软件(如汇川的AutoShop)里看到的地址,转换成Modbus Poll能识别的协议地址。接下来,我们就一步步解开这把锁。
2. 动手前的准备:软件、硬件与网络配置
工欲善其事,必先利其器。在开始通信之前,咱们得先把环境搭好,这能避免一大半“连不上”的坑。
2.1 硬件与网络连接
首先确保你的物理连接是正确的:
- PLC型号确认:确认你的PLC是AS300系列(如AS332T)或AS200系列。它们都支持标准的Modbus TCP协议,这是我们通信的基础。
- 网线直连:最简单的方式,是用一根普通的网线,一头插在PLC的以太网口上,另一头直接插到你的电脑网口。AS300系列通常自带一个或两个以太网口。
- IP地址设置:这是最关键的一步!PLC和你的电脑必须在同一个网段内。
- 设置电脑IP:打开你电脑的网络设置,手动设置一个IPv4地址。例如,如果PLC的默认IP是
192.168.1.10,那么你可以把电脑的IP设为192.168.1.100,子网掩码设为255.255.255.0。网关可以先不设。 - 确认PLC的IP:你需要知道PLC当前的IP地址。如果你手头有PLC的程序,可以在AutoShop软件的项目配置里查看。如果不知道,可能需要通过串口等方式先连接上PLC进行查看或修改。记住,通信双方IP不能冲突。
- 设置电脑IP:打开你电脑的网络设置,手动设置一个IPv4地址。例如,如果PLC的默认IP是
注意:很多现场调试时,会使用小型交换机或者将PLC和电脑都接入同一个局域网。原理一样,保证IP互通即可。用ping命令测试一下通不通,是排查网络问题的好习惯。
2.2 软件安装与准备
- Modbus Poll安装:在网上搜索“Modbus Poll”就能找到它的官网或下载资源。这是一个共享软件,有试用期,但对于学习和调试完全够用。安装过程很简单,一路下一步就行。
- PLC编程软件:你需要有汇川的AutoShop软件。这不仅用于编程,更重要的是,我们需要用它来确认PLC的Modbus TCP从站功能已经启用,并且查看我们需要的变量在PLC中的确切地址。
- 打开AutoShop,连接上你的PLC。
- 通常在“项目”或“参数”设置中,能找到“Modbus配置”或“通信配置”。确保“Modbus TCP服务器”功能是使能的。AS300系列通常默认就是开启的,端口号一般是502(这是Modbus TCP的标准端口)。
好了,现在你的电脑和PLC已经在物理和网络逻辑上连好了,软件也各就各位。接下来,我们进入核心环节:理解地址规则。
3. 核心密码本:AS300/200 PLC的Modbus地址映射规则
为什么Modbus Poll直接填PLC的地址(如X1.0)会报错?因为两者使用的“编号系统”不同。PLC内部有一套自己的寻址方式,而Modbus协议使用的是统一的“寄存器地址”。我们的工作,就是做一个翻译。
Modbus协议主要访问四种类型的数据区,对应不同的功能码:
- 线圈(Coils):可读可写,对应开关量输出。功能码01(读),05(写单个),15(写多个)。
- 离散输入(Discrete Inputs):只读,对应开关量输入。功能码02。
- 保持寄存器(Holding Registers):可读可写,通常对应字(Word)类型数据,如模拟量、计数器值、数据寄存器D。功能码03(读),06(写单个),16(写多个)。
- 输入寄存器(Input Registers):只读,通常用于模拟量输入。功能码04。
对于AS300/200系列PLC,其内部软元件与Modbus地址的映射关系是固定的。这里有一个超级重要的公式和转换表,请你务必理解:
Modbus地址 = PLC内部地址编号 + 偏移量基数
这个“偏移量基数”是Modbus协议规定的,对于不同类型的数据区,起始基数不同。而“PLC内部地址编号”需要从PLC的地址中提取出来。下面这个表是我根据手册和实测总结的,你可以把它当成“密码本”:
| PLC软元件类型 | PLC地址示例 | 内部地址编号计算 | 对应Modbus数据类型 | Modbus偏移量基数 | 最终Modbus Poll填入的地址(十进制) |
|---|---|---|---|---|---|
| X(输入继电器) | X0, X1.5 | 将点号前的数字转为十进制。如X1.5,编号为1。 | 离散输入 | 0 | 内部编号 + 0。例:读X1,地址填1。 |
| Y(输出继电器) | Y0, Y10.3 | 同上。如Y10.3,编号为10。 | 线圈 | 0 | 内部编号 + 0。例:写Y10,地址填10。 |
| M(辅助继电器) | M0, M100 | 直接取数字。如M100,编号为100。 | 线圈 | 0 | 内部编号 + 0。例:读/写M100,地址填100。 |
| SM(特殊继电器) | SM0, SM400 | 直接取数字。如SM400,编号为400。 | 线圈 | 0 | 内部编号 + 0。例:读SM400,地址填400。 |
| D(数据寄存器) | D0, D1000 | 直接取数字。如D1000,编号为1000。 | 保持寄存器 | 0 | 内部编号 + 0。例:读D1000,地址填1000。 |
| T(定时器当前值) | T0, T10 | 直接取数字。如T10,编号为10。 | 保持寄存器 | 0 | 内部编号 + 0。例:读T10的当前值,地址填10。 |
| C(计数器当前值) | C0, C5 | 直接取数字。如C5,编号为5。 | 保持寄存器 | 0 | 内部编号 + 0。例:读C5的当前值,地址填5。 |
看到这里你可能发现了,对于AS300/200,大部分常用地址的转换就是“直接取数字”,因为它的偏移量基数是0。这其实简化了很多工作!但这里有一个特例,也是新手最容易栽跟头的地方:输入寄存器(AI)和保持寄存器(AO)的地址范围。
有些PLC手册会提到,Modbus的输入寄存器地址从30001开始,保持寄存器从40001开始。请注意,那是“协议地址”的表示方法,不是Modbus Poll里要填的数字!在Modbus Poll中,我们通常填写的是“从0开始的偏移地址”。
例如,你想读取AIW0(第一个模拟量输入通道的值)。在Modbus协议中,它可能被映射到输入寄存器区,地址是30001。但在Modbus Poll里:
- 功能码选择
04: Read Input Registers。 - 地址栏填
0。(因为 30001 - 30001 = 0) 同理,如果你想写入AQW0(第一个模拟量输出通道),它对应保持寄存器40001。在Modbus Poll里: - 功能码选择
03: Read Holding Registers或06: Preset Single Register(写单个)。 - 地址栏填
0。(因为 40001 - 40001 = 0)
简单记忆:在Modbus Poll里,对于AS300/200的D、T、C、A等寄存器,直接填你在PLC里用的那个数字编号就行,从0开始。这个规则让我们的调试工作变得异常简单。
4. 实战演练:一步步用Modbus Poll连接并读写数据
理论说再多,不如动手试一次。我们假设PLC的IP是192.168.1.10,电脑IP是192.168.1.100。
4.1 建立连接与从站配置
- 打开Modbus Poll,它会自动创建一个空的查询窗口(Slave1)。
- 点击菜单栏的
Connection->Connect...,或者直接按快捷键F3,弹出连接设置框。 - 在这里进行关键配置:
- Connection: 选择
TCP/IP。 - IP Address: 填入PLC的IP地址
192.168.1.10。 - Port: 填入
502。 - Slave ID: 这个在Modbus TCP中通常填
1或者PLC中设置的从站ID(AS300系列Modbus TCP服务器通常固定为1)。如果不对,可以尝试1-247之间的值。 - 其他参数保持默认,点击“OK”。
- Connection: 选择
如果连接成功,软件标题栏的“红色指示灯”会变成“绿色”,并且底部的状态栏会显示“Connected”。如果失败,请回头检查网络ping通、IP设置、PLC Modbus服务器使能以及防火墙(有时需要关闭电脑防火墙试试)这几项。
4.2 读取一个开关量输入(X点)
假设你想监控输入点X1的状态。
- 在连接成功的窗口里,你会看到一个表格。默认可能已经有4行数据。我们双击第一行的“Address”单元格。
- 在弹出的“Edit Register”对话框中:
- Address: 填入
1。(根据我们的密码本,X1的内部编号是1) - Quantity: 填入
1,表示只读1个点。 - Function: 选择
02: Read Discrete Inputs。(因为X是只读的离散输入) - Scan Rate: 设置扫描间隔,比如1000ms,表示每秒读一次。
- Address: 填入
- 点击OK。你会发现表格中第一行显示地址为“1”,值(Value)列会实时显示
0或1(或True/False)。此时,你可以去拨动PLC上接在X1端子的开关,观察这个值是否会随之变化。如果变化,恭喜你,读取成功了!
4.3 读取一个数据寄存器(D值)
假设你想读取D100里面的数据,这是一个16位的整数。
- 在表格第二行双击,编辑寄存器。
- Address: 填入
100。(直接取数字) - Quantity: 可以填
1,读1个寄存器(16位)。如果你想一次读多个连续的D寄存器,比如D100-D103,就填4。 - Function: 选择
03: Read Holding Registers。(D寄存器是可读可写的保持寄存器) - 点击OK。在Value列,你会看到D100中的数值,默认是十进制显示。你可以在单元格上右键,选择“Format”来切换显示格式,比如十六进制、有符号整数、浮点数等。这里有个重点:如果一个32位的长整数或浮点数占用两个连续的D寄存器(例如D100和D101),你需要一次性读取2个寄存器,并在显示格式中选择“Float”或“Long”才能看到正确的值。
4.4 写入一个输出点(Y点)或M点
现在我们来尝试控制。假设你想控制输出点Y10。
- 编辑一个新的寄存器行。
- Address: 填入
10。(Y10的内部编号是10) - Function: 选择
01: Read Coils。先读一下当前状态。 - 连接成功后,在对应行的“Value”单元格上双击,你会发现它可以在
0和1之间切换。双击切换值的同时,Modbus Poll会自动发出一个05: Write Single Coil的命令,将新值写入PLC。观察PLC上Y10对应的指示灯是否亮灭。写入M点(如M200)的操作一模一样,因为M也映射到线圈区。
4.5 写入一个数据寄存器(D值)
向D寄存器写入数据也很直观。
- 比如针对上面读取D100的那一行,你直接在Value单元格里双击,输入一个新的十进制数字,比如
1234,然后按回车。 - Modbus Poll会自动发出
06: Preset Single Register的命令,将1234写入PLC的D100中。你可以立刻看到Value值更新,也可以在PLC的监控软件里确认D100的值是否变成了1234。
通过以上几步,你已经完成了最基本的读和写操作。Modbus Poll的强大之处在于,你可以在一个窗口里同时监控和操作数十个甚至上百个不同地址、不同类型的变量,这对于调试和诊断来说效率极高。
5. 避坑指南:那些年我踩过的常见错误
看起来流程很顺?但在实际现场,总会遇到些幺蛾子。我把几个最常见的错误和解决方法列出来,希望能帮你节省时间。
连接失败(Connection refused/Timeout)
- 首要检查:电脑和PLC之间能否ping通?这是硬件和网络层问题。
- 检查PLC设置:确认AutoShop里PLC的Modbus TCP服务器功能确实打开了。有些项目为了安全可能会关闭此功能。
- 检查端口:确认端口是502。有些系统可能修改了默认端口。
- 关闭防火墙:临时关闭电脑的Windows Defender防火墙或任何第三方安全软件,排除干扰。
- Slave ID错误:虽然Modbus TCP不太依赖Slave ID,但有些PLC固件可能校验。尝试1-10之间的值。
读回的数据全是0,或者是不变的错误值
- 地址转换错误:这是最可能的原因!再次核对“密码本”。你是不是把X点地址填到了保持寄存器功能码下?或者把D地址填错了?
- 功能码选错:想读X(输入)却选了读线圈(01),肯定读不到。牢记:X用02,Y/M用01,D/T/C用03。
- PLC变量未使用:在PLC程序中,如果你从未使用过某个D寄存器或M点,它可能一直保持初始值(通常是0)。在AutoShop里强制或写入一下这个地址,再观察Modbus Poll能否读到变化。
- 字节顺序问题:当你读取32位数据(浮点数、长整数)时,如果发现数值完全不对,比如一个温度值读出来是天文数字,这很可能是字节顺序(Byte Order)问题。PLC内部存储多字节数据时,有“高字节在前”或“低字节在前”的区别。在Modbus Poll中,右键点击对应的寄存器行,选择“Format”,在底部可以看到“Swap 16-bit words”和“Swap bytes”等选项。你需要尝试不同的组合(常见的是 CDAB 或 ABCD 顺序),直到显示正确的数值。这个需要结合你已知的一个正确数值来反复测试。
写入成功但PLC无动作
- PLC程序逻辑覆盖:你通过Modbus写了一个Y点,但PLC的梯形图程序在每个扫描周期都根据逻辑条件重新计算并覆盖了这个Y点的状态。所以你的写入可能只在瞬间生效,马上又被程序改回去了。测试时,可以在PLC程序中暂时屏蔽对该点的控制逻辑,或者使用一个程序里未使用的M点来测试写入功能。
- 输出映射问题:确认你写的Y点地址,确实物理上连接了外部设备。写一个未接线或未配置的Y点,PLC灯可能会亮,但外部设备没反应。
通信不稳定,时断时续
- 扫描速率过快:在Modbus Poll里把Scan Rate设得太大(比如10ms),会给PLC造成很大的通信负荷,可能导致PLC处理不过来而丢包。对于一般调试,设置500ms到1000ms足够了。
- 网络干扰:工业现场电磁环境复杂,确保网线质量良好,远离动力线缆。
调试本身就是一个发现问题、解决问题的过程。遇到报错不要慌,按照“网络层->连接层->地址/功能码层->数据层”的顺序逐一排查,大部分问题都能定位。每次成功解决一个通信问题,你对这套系统的理解就会加深一层。最后,养成好习惯:在Modbus Poll里把配置好的连接和寄存器列表保存成.mp项目文件,下次调试同型号PLC时直接打开,效率翻倍。