Modbus:1.Java使⽤Modbus读取Slave端数据(TCP)
最近⼿上接了个Unity3D的项⽬,这个项⽬需要和真机联动,和真机联动我们需要通过Modbus协议。所以Modbus这⼀块的就我来实现,因为项⽬最好会打包为android的,所以就⽤java来做,看了下java中还真有不少相关的库,最后决定⽤Jamod这个库,地址:
在使⽤的过程中发现,Jamod再封装某些对象的时候都是单例的,⽐如说我想在⼀台电脑上模拟出⼀个Slave端出来,但是这个库限定了在同⼀台电脑的同⼀个程序中只能模拟出⼀个,如果我想模拟多个就需要弄出多个程序出来,这显然不符合实际情况,所以我重新了这个库⾥⾯的⼤概整个TCP这⼀块的代码,修改成可以在⼀个程序中实例化出多个出来并且可以再同⼀个程序中绑定同⼀个ip下的多个端⼝,这样就可以做到再同⼀个程序中模拟出多个Slave来,
因为这个项⽬需要再⼀个程序⾥⾯模拟出Slave端和Master端(⽆语啊), 所以这⾥会写的⽐较多,也会写的⽐较详细,⾸先会讲如何读取真机设备上的数据。⾄于有关Modbus协议的问题我这⾥不做说明,不明⽩的可以⾃⼰去看资料,再我写这个随笔的时候,我还没有收到modbus 的真机,所以所有的测试我都是基于模拟器来的,如果到时候有出⼊我会在修改随笔,下⾯开始记录,
模拟器我⽤的是这⼀组,这个不错提供了Master端和Slave端,,可以根据⾃⼰的需求下载相关的模拟器,这⾥先记录读取Slave端数据,所以这⾥要下载Slave模拟器,
这个软件只有windows版本的,所以我是在虚拟机⾥⾯使⽤的,下载之后,直接安装就⾏了,这个Slave和Pull端都需要注册码,试⽤30天,
下⾯开始介绍Java⽅⾯的代码,
这⾥说明下,因为项⽬的需要和需求,所以我这⾥处理的⽐较复杂,但是读取Slave上⾯数据的代码其实是很简单的,都在ModbusUtil类中,
如果你只是简单的使⽤,那么你完全只看这⼀个⽂件就够了,其他的不⽤看,因为这⾥我也是只介绍这些,其他的不说明,
如果你需要读取Slave设备上⾯的数据,Slave设备上的数据分四种类型,模拟器中是这样的:
我个⼈的理解就是:
可以读写的布尔类型(0x)
只能读的布尔类型(1x)
只能读的数字类型(3x)
可以读写的数字类型(4x)
jamod也提供了操作每种不同类型使⽤不同的类,这⾥我列个表
可以读写的布尔类型(0x) 请求类:ReadCoilsRequest 响应类:ReadCoilsResponse
只能读的布尔类型(1x) 请求类:ReadInputDiscretesRequest 响应类:ReadInputDiscretesResponse
只能读的数字类型(3x) 请求类:ReadInputRegistersRequest 响应类:ReadInputRegistersResponse
可以读写的数字类型(4x) 请求类:ReadMultipleRegistersRequest 响应类:ReadMultipleRegistersResponse
写⼊的类都是对应的,但是只有可以写⼊的才有对应的类,这四个读取的类在使⽤的时候基本都是⼀致的,不管哪种再读取的时候三个值⼀定⾮常重要,⼀个是SlaveId, 这⾥设置的值:
⼀定要和模拟器上的对应,
如果不对应是会抛异常的。
第⼆个是每个寄存器对应的地址也⼀定要对应,这⾥:
和这⾥对应
⾄于程序中制定的ip和端⼝就⽐较好处理,ip就⽤模拟器所在机器的ip就⾏了,端⼝默认是502,你也可以修改,jamod也提供了默认端⼝,1 Modbus.DEFAULT_PORT;
端⼝指定:
我的世界java模拟器模拟器⽅⾯:
这样就可以读取到模拟器上⾯的值了,读取的时候,模拟器的连接⼀定要打开,这样才能读取到值,
因为我的项⽬中是程序只对应控制器,每个控制器下有很多的寄存器,所以我的模拟器⾥⾯就开了很多的寄存器,SlaveId都是3,只是寄存器的地址和类型不同,
如:
设置完成之后,打开模拟器上⾯的连接,上⾯红⾊的"No connection"就会消失了。
我这⾥记录的有点乱,不过我记录这些都是为了⽅便我⾃⼰随时可以查看,并且主要我还都是看代码⽅
⾯,如果有不明⽩的可以随时看代码。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论