Android通过ModbusTCP连接PLC

shunzaa

发布于 2022.10.03 19:32 阅读 1680 评论 0

        本文介绍Android通过局域网连接PLC,PLC端开启了Modbus TCP Server。Android可修改数据块中的值实现控制硬件的功能。

        项目中使用了modbus4Android(https://github.com/zgkxzx/Modbus4Android)。

第一步:引入jar


                在Module的build.gradle中引入lib(免费资源,或者直接在github中下载): 

                modbus4android

        implementation files('libs\\modbus4Android-1.2.jar')


第二步:创建连接

       

/**
     * 初始化plc链接
     * @param modbusIp
     * @param modbusPort
     */
    public static void initModubusTCP(String modbusIp,Integer modbusPort){
        ModbusReq.getInstance().setParam(new ModbusParam()
                .setHost("192.168.124.189")
                .setPort(502)
                .setEncapsulated(false)
                .setKeepAlive(true)
                .setTimeout(2000)
                .setRetries(0))
                .init(new OnRequestBack<String>() {
                    @Override
                    public void onSuccess(String s) {
                        Log.d("modbus", "onSuccess " + s);
                    }
 
                    @Override
                    public void onFailed(String msg) {
                        Log.d("modbus", "onFailed " + msg);
                    }
                });
    }

第三步:读取线圈数据


        读取slaveId = 1;数据地址为VB10001开始,向后5位的数据;

ModbusReq.getInstance().readDiscreteInput(new OnRequestBack<boolean[]>() {
                @Override
                public void onSuccess(boolean[] booleen) {
                    Log.d("modbus", "readDiscreteInput onSuccess " + Arrays.toString(booleen));
                }
 
                @Override
                public void onFailed(String msg) {
                    Log.e("modbus", "readDiscreteInput onFailed " + msg);
                }
            },1,1,5);


第四步:写(单个)线圈


向slaveId = 1,PLC地址为VB10001,中写入开关量:false(0)

ModbusReq.getInstance().writeCoil(new OnRequestBack<String>() {
                @Override
                public void onSuccess(String s) {
                    Log.e("modbus", "writeCoil onSuccess " + s);
                }
 
                @Override
                public void onFailed(String msg) {
                    Log.e("modus", "writeCoil onFailed " + msg);
                }
            },1,1,false);


其它读写类型可参考modbus4android中的readme文件。