Modbus协议在工业现场使用比较频繁,为方便手机调试,在android上做了个ModbusTcp主站功能。

1:使用说明
作为主站,需要连接从站,因此需要配置从站IP、端口以及协议中从站地址。
连接成功后这些配置就不能修改。
偏移是需要读取或者写入的起始地址。
长度读取或者写入的总长度。
后边的长度按键是,为写入准备输入数据区数据。一般步骤先设定需要写入的长度,当然根据实际情况可以同时设置偏移量;在点击长度,就会在写入区生成需要写入长度项目,然后设定需要写入的值。

读取按键,按设定的地址和长度以及功能读取器从站数据,读回来的数据,如果是是3、4功能号的,选择了十六进制,就按十六进制展示;否则按十进制展示。
写入按键,从偏移量作为基地址写入从站。
清理按键是清理写入区内输入的内容,清理不会写入到从站。
“----->”传递按键,在有些情况下,可以直接把读取的实际传递到写入区,然后修改部分数据后,直接写入到从站。这样就不需要逐条输入,方便操作。
2:程序说明
页面上在读取展示区和写入输入区是两个ListView组件。读区的item是两个TextView,写入输入区是一个TextView和一个EditText。
ModbusTcp功能直接使用的是Modbus4Android的jar包。核心功能代码如下

private void modbusInit(String ip, int port) {ModbusReq.getInstance().setParam(new ModbusParam().setHost(ip).setPort(port).setEncapsulated(false).setKeepAlive(true).setTimeout(2000).setRetries(0)).init(new OnRequestBack<String>() {@Overridepublic void onSuccess(String s) {Log.d(TAG, "onSuccess " + s);Intent i = new Intent("notifyText");i.putExtra("act", "100");i.putExtra("status", true);i.putExtra("Message", "连接成功");LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}@Overridepublic void onFailed(String msg) {Log.d(TAG, "onFailed " + msg);Intent i = new Intent("notifyText");i.putExtra("act", "0");i.putExtra("status", false);i.putExtra("Message", "连接失败");LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}});}public void readCoil(int slaveid, int start, int len) {ModbusReq.getInstance().readCoil(new OnRequestBack<boolean[]>() {@Overridepublic void onSuccess(boolean[] booleen) {Log.d(TAG, "readCoil onSuccess " + Arrays.toString(booleen));Intent i = new Intent("notifyText");i.putExtra("act", "1");i.putExtra("status", true);i.putExtra("Message", Arrays.toString(booleen));LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}@Overridepublic void onFailed(String msg) {Log.e(TAG, "readCoil onFailed " + msg);Intent i = new Intent("notifyText");i.putExtra("act", "1");i.putExtra("status", false);i.putExtra("Message", "读取线圈失败");LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}}, slaveid, start, len);}public void readDiscreteInput(int slaveid, int start, int len) {ModbusReq.getInstance().readDiscreteInput(new OnRequestBack<boolean[]>() {@Overridepublic void onSuccess(boolean[] booleen) {Log.d(TAG, "readDiscreteInput onSuccess " + Arrays.toString(booleen));Intent i = new Intent("notifyText");i.putExtra("act", "2");i.putExtra("status", true);i.putExtra("Message", Arrays.toString(booleen));LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}@Overridepublic void onFailed(String msg) {Log.e(TAG, "readDiscreteInput onFailed " + msg);Intent i = new Intent("notifyText");i.putExtra("act", "2");i.putExtra("status", false);i.putExtra("Message", "读取线圈失败");LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}}, slaveid, start, len);}public void readHoldingRegisters(int slaveid, int start, int len) {//readHoldingRegistersModbusReq.getInstance().readHoldingRegisters(new OnRequestBack<short[]>() {@Overridepublic void onSuccess(short[] data) {Log.d(TAG, "readHoldingRegisters onSuccess " + Arrays.toString(data));Intent i = new Intent("notifyText");i.putExtra("act", "3");i.putExtra("status", true);i.putExtra("Message", Arrays.toString(data));LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}@Overridepublic void onFailed(String msg) {Log.e(TAG, "readHoldingRegisters onFailed " + msg);Intent i = new Intent("notifyText");i.putExtra("act", "3");i.putExtra("status", false);i.putExtra("Message", "读取线圈失败");LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}}, slaveid, start, len);}public void readInputRegisters(int slaveid, int start, int len) {ModbusReq.getInstance().readInputRegisters(new OnRequestBack<short[]>() {@Overridepublic void onSuccess(short[] data) {Log.d(TAG, "readInputRegisters onSuccess " + Arrays.toString(data));Intent i = new Intent("notifyText");i.putExtra("act", "4");i.putExtra("status", true);i.putExtra("Message", Arrays.toString(data));LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}@Overridepublic void onFailed(String msg) {Log.e(TAG, "readInputRegisters onFailed " + msg);Intent i = new Intent("notifyText");i.putExtra("act", "4");i.putExtra("status", false);i.putExtra("Message", "读取线圈失败");LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}}, slaveid, start, len);}public void writeCoil(int slaveid, int start, boolean value) {ModbusReq.getInstance().writeCoil(new OnRequestBack<String>() {@Overridepublic void onSuccess(String s) {Log.e(TAG, "writeCoil onSuccess " + s);}@Overridepublic void onFailed(String msg) {Log.e(TAG, "writeCoil onFailed " + msg);Intent i = new Intent("notifyText");i.putExtra("act", "5");i.putExtra("status", false);i.putExtra("Message", "msg");LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}}, slaveid, start, value);}public void writeRegister(int slaveid, int start, int value) {ModbusReq.getInstance().writeRegister(new OnRequestBack<String>() {@Overridepublic void onSuccess(String s) {Log.e(TAG, "writeRegister onSuccess " + s);}@Overridepublic void onFailed(String msg) {Log.e(TAG, "writeRegister onFailed " + msg);Intent i = new Intent("notifyText");i.putExtra("act", "6");i.putExtra("status", false);i.putExtra("Message", "msg");LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}}, slaveid, start, value);}public void writeRegisters(int slaveid, int start, short[] value) {ModbusReq.getInstance().writeRegisters(new OnRequestBack<String>() {@Overridepublic void onSuccess(String s) {Log.e(TAG, "writeRegisters onSuccess " + s);}@Overridepublic void onFailed(String msg) {Log.e(TAG, "writeRegisters onFailed " + msg);Intent i = new Intent("notifyText");i.putExtra("act", "16");i.putExtra("status", false);i.putExtra("Message", "msg");LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);}}, slaveid, start, value);}

读函数把成功和失败都用广播播放出去。
写只把失败广播出去。
3:测试效果
程序功能基本满足现场测试需要,方便随时联调。在测试过程中出现程序闪退,经跟踪,闪退异常原因“java.lang.IndexOutOfBoundsException: Index: 99, Size: 10”,是ListView的adapter在更新数据时,老数据操作未完成引起。经修改程序后,未出现闪退情况。

手机端ModbusTcp主站工具及程序相关推荐

  1. 微信PC版本如何打开开发版小程序进行调试,图片上传在PC版小程序上传失败,手机端和开发者工具中均正常的问题解决

    1.小程序开发者工具-设置-通用设置中,将自动预览的启动PC自动预览勾选上 2.预览中选择自动预览即可,这样就可以在PC版的小程序中进行调试了哦. 3.图片上传在pc版的小程序中上传失败的解决办法:去 ...

  2. 手机端刷recovery工具_MIUI/REDMIN手机玩机汇集

    愿你刷机半生归来仍是MIUI 1解锁篇解锁Bootloader 准备工作: 1.手机备份数据 2.手机进入开发者模式 ①进入"设置 -> 我的设备 -> 全部参数"中连 ...

  3. 697小说源码PC端+手机端+火车头采集工具

    关于安装: 整套源码共计4部分: 1.安装及采集等说明书(   文档教程(小说).doc   )2.数据库(   数据库(3000)[backupdata].rar   )3.网站程序(   网站程序 ...

  4. 【uniapp】省市区 三级联动 手机端 picker,支付宝小程序省市区

    效果图 1. 支付宝小程序 不兼容 此方法 template <picker class="pickerList" mode="multiSelector" ...

  5. 手机端刷recovery工具_TWRP_recovery刷入显示解密DATA分区,请刷入密码怎么办?

    安卓刷机,目前最常见的就是使用TWRP_Recovery,而TWRP也是目前最强大安卓第三方 REC项目,支持官方和各种第三方ROM的完美刷入,支持获取完美ROOT等高级玩机功能 但新手玩机也会出现各 ...

  6. 【工具】PC端调试手机端 Html 页面的工具

    一.概述 有一个项目需要在手机端显示一个 web 页面,而每次把应用 launch 后,从手机端看比较麻烦,因此搜罗了几种在 PC 端调试手机端页面的工具. 二.工具 http://fonkie.it ...

  7. springboot后台怎么获取前端传过来的excel_开源商城系统包含后台管理和手机端

    此开源项目是一个基于Spring Boot和Vue.js的web商城系统 包含了商城的后台管理系统 提供了手机端的商城系统 小程序版开发中 app版(基于Flutter)开发中 功能模块 包含了后台管 ...

  8. 云-移动手机端项目总结

    移动端网页的坑坑洼洼 1,flex伸缩布局的坑 flex布局是我在移动端用得最多的一种布局技巧,可成想,在不同的手机浏览器中,它的表现却没那么尽如人意. 先推荐一个可以自动转换css代码的插件(可以兼 ...

  9. 苹果cms手机模板好看的简洁手机端模板免费下载

    苹果cms手机模板主题介绍: 模板名称:苹果cms手机模板好看的简洁手机端模板免费下载 模板程序:苹果cmsv10 模板类型:wap手机端模板 空间支持:php5.6+mysql 模板颜色:白色 模板 ...

最新文章

  1. jetty安装、配置、优化
  2. Mongodb 添加删除分片与非分片表维护
  3. 网页的手机版本是否值得去做?,互联网营销
  4. PIE 支持项目介绍
  5. linux 程序随命令窗口退出一起退出
  6. Mac系统的终端显示git当前分支
  7. linux 开启 自动挂载U盘 权限的设置
  8. 搭建自己的Docker Harbor
  9. PL/SQL详细介绍
  10. 通过Repository Manager 1.3来管理戴尔驱动程序更新
  11. sqlrowset 转化为json_逆向学习 fastjson 反序列化始末
  12. 的谐音歌词_今日新歌,李诞肯定最烦这张谐音梗专辑
  13. 偏见:人工智能辅助决策的隐患
  14. JQ实现图片预览(轮播,放大缩小,拖拽,ajax请求,旋转)
  15. Intel Atom移动处理器惨败,还被用户和经销商起诉
  16. 计算机网络——传输层
  17. MQ消息队列(一)什么是消息队列
  18. python计算年龄的方法_巧算年龄-随心随性无为而为-51CTO博客
  19. 成都市中小学计算机创客,我校荣获2019四川省中小学电脑制作活动机器人暨创客竞赛团体一等奖...
  20. ​计算机视觉传感器系统

热门文章

  1. 一文快速搞懂企业自己要办理哪种增值电信业务经营许可证
  2. 怎么测试唱歌水平的软件,测试一下你的唱功到第几层了?到第五层你已经算是高手了...
  3. Allegro 中手动制作螺丝孔封装
  4. 转载:Elasticsearch面试题汇总与解析
  5. rz gz linux安装,CentOS 安装 rz sz lrzsz
  6. 计算机模型局限性,五力模型及其局限性
  7. python module ‘mitmproxy.proxy‘ has no attribute ‘config‘问题解决
  8. Tomcat+structs攻防环境搭建
  9. 天了噜!豆瓣评分9.3,疯狂综艺榜榜首,《明星大侦探2》“开门红”
  10. 分支语句(if、if-else、if-else if...else、switch)