引言
大家好,之前需要更新的MQTT通讯【2】因为硬件不足还不能发布出来,但最近在项目中涉及到西门子和欧姆龙之间的modbus TCP通讯,想到modbus TCP通讯是个非常常见并广泛使用的通讯协议,今天就结合最近做的测试给大家好好讲解一下,先提示一下,这边只给大家讲解如何实现,至于报文是什么,如何用socket来编写功能块或dll这边不会讲解,这块我会根据私信的小伙伴数量来考虑要不要出一篇如何用ST语言来编写modbus TCP功能块的博客。
硬件
先请出我们今天测试的主角,他们分别是西门子200smart(IP地址192.168.250.200),西门子1200(IP地址192.168.250.100),欧姆龙NX102(IP地址192.168.250.1),电脑ThinkPad T14(IP地址192.168.250.188),电脑天选3(IP地址192.168.250.88),设置他们的IP在同一网段,
测试内容
我们将测试以下三大内容:
(1)使用modbus TCP的仿真软件实现modbus TCP通讯;
(2)使用仿真软件分别实现与西门子200smart及欧姆龙NX102的通讯;
(3)实现西门子200smart和欧姆龙NX102的通讯,西门子1200和NX102的通讯;
仿真软件的modbus TCP通讯
我们先分别在两台电脑上开启modbus服务器和客户端,这边以ThinkPad这台电脑为服务器如下图
天选3这台电脑当成客户端,去连接服务器,如下图
接下来我做读写线圈,读写保存寄存器测试,输入寄存器,输入线圈测试
输入线圈测试(只读)
客户端:
服务器:
结果:读取成功!
输出线圈测试(读写)
客户端:
服务器:
结果:读写成功!
输入寄存器(只读)
客户端:
服务器:
结果:读取成功!
保持寄存器(读写)
客户端:
服务器:
结果:读写成功!
仿真软件和PLC的通讯
与西门子的通讯
首先我们先去modbus TCP的输入线圈,输出线圈,保持寄存器和输入寄存器分别对应了西门子200smart的那些存储区,通过查询帮助我可以发现,分别对应I区,Q区,V区,AIW区,有了这前提我们可以开始做测试,先做西门子为服务器的测试。
西门子为服务器的测试
我们要在200smart中使用MBUS_SERVER 指令,并写入以下程序;
下载进PLC中,打开modbus客户端,输入IP地址,端口号,连接,并进行Q区和V区的读写测试
Q区测试
客户端
服务器
结果:读写成功!
V区测试
客户端
服务器
结果:读写成功!
与欧姆龙的通讯
欧姆龙为服务器的测试
欧姆龙PLC本身并没有包含modbus功能块,这就导致我们需要寻求欧姆龙官方技术提供的modbus TCP功能块,里面包含客户端和服务器功能块(版权原因这边就不给大家展示了);当然我们也能自己利用ST语言编写功能块,这对于一般的上位机工程师来说并不难,只需要了解ST的编写规范和socket的通讯方式,以及modbus TCP的报文,这块之后有时间会发篇博客来详细的说明,大家可以敬请期待一下。
好的,要实现服务器通讯,我们要在NX102中写入如下程序:
接下来我们利用仿真软件对寄存器和线圈进行读写测试
寄存器读写测试
客户端
服务器
结果:读写成功!
线圈读写测试
客户端
服务器
结果:读写成功!
欧姆龙为客户端的测试
在欧姆龙里我们要写入连接、读写相应功能码的程序;这边的话由于版权原因我只给大家读取寄存器的程序。
读取寄存器测试
客户端
服务器
结果:读取成功!
写入寄存器测试
客户端
服务器
结果:写入成功!
读取线圈测试
客户端
服务器
结果:写入成功!
欧姆龙和西门子的通讯
欧姆龙和西门子200smart的通讯
本次测试中西门子将作为服务器,欧姆龙作为客户端,在对应的PLC写入相应的程序,程序如上面程序。
线圈读写

寄存器读写
选择前十个寄存器采取读取,后十个采取写入
结果:欧姆龙和西门子200smart通讯成功,读写成功!
欧姆龙和西门子1200的通讯
这边在西门子中我们写入如下程序:
并建立两个DB块,一个是读写的数据,一个是服务器参数


我们将欧姆龙里程序的服务器IP改一下,连接成功后,进行读写测试,将前五个字读取,后五个字写入,看一下最后效果



结果:欧姆龙和西门子1200通讯成功,读写成功!