手机端ModbusTcp主站工具及程序

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>() {
                    @Override
                    public 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);
                    }

                    @Override
                    public 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[]>() {
            @Override
            public 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);
            }

            @Override
            public 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[]>() {
            @Override
            public 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);
            }
            @Override
            public 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) {
        //readHoldingRegisters
        ModbusReq.getInstance().readHoldingRegisters(new OnRequestBack<short[]>() {
            @Override
            public 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);
            }

            @Override
            public 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[]>() {
            @Override
            public 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);
            }
            @Override
            public 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>() {
            @Override
            public void onSuccess(String s) {
                Log.e(TAG, "writeCoil onSuccess " + s);
            }

            @Override
            public 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>() {
            @Override
            public void onSuccess(String s) {
                Log.e(TAG, "writeRegister onSuccess " + s);
            }

            @Override
            public 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>() {
            @Override
            public void onSuccess(String s) {
                Log.e(TAG, "writeRegisters onSuccess " + s);
            }

            @Override
            public 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在更新数据时,老数据操作未完成引起。经修改程序后,未出现闪退情况。

用户可以根据需求在驱动库里选择相对应的通讯驱动程序,配置相应的通讯握手参数,自由定义需要控制和采集的变量名、通讯地址、数据类型和初始值。功能说明及图片展示: 1.安装完成首次进入将会显示三页功能简要展示页面。 2.点击“立即使用”按钮,进入登录界面(公测账户为admin,密码admin)。 3.登录成功进入APP主页,此时主页所有状态为初始未配置状态。 4.在主页状态下向右滑动,可打开功能模块选择列表。 5.点击“WIFI连接”进入连接现场设备网络页面,如果此时用户已通过手机WIFI页面连接现场设备,则直接跳过此步骤。 6.连接成功后返回功能模块选择列表,点击“参数设置”进入通讯相关参数配置页面(首先进入驱动配置页面),目前驱动库中只有支持Modbus TCP的驱动,后续会持续更新,用户通过在驱动库列表中长按操作将选中的驱动挑选至已选列表中,如果要取消,可以在已选列表中通过同样的长按操作完成。 7.配置要访问的设备通讯参数,与主页的操作逻辑一致,在驱动配置页面向右滑动打开配置功能列表,点击“通讯参数配置”进入通讯参数配置页,然后点击右上角的加号,此时软件会根据已选的驱动类型自动添加一条相对应的通讯参数,用户可以通过双击的方式打开修改列表,然后在列表的某一条参数处通过长按的方式进入最终的修改对话框,修改完成后,可以通过长按的方式选定当前需要的参数配置信息到已选区域。 8.通讯参数配置完成后,向右滑动进入配置功能列表,点击“IO参数配置”进入地址段的分配,点击右上角的加号,在弹出的对话框中根据实际需求分配响应的起始地址以及地址数量,分配完成后,可在屏幕右侧边缘向左滑动调出隐藏功能菜单,通过功能菜单可查看和修改配置地址段的功能对应的IO点信息。 9.所有配置完成后,可返回主页,此时主页显示当前配置的信息,其中“控制操作”功能可以通过按钮发送布尔值,操作逻辑为当前值为0时发送1,当前值为1时发送0,而“参数设置”功能通过对子项长按可以设置调出输入框设置相应的参数值。
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cetclyb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值