打赏

安卓 通过modbus 控制plc

modbus是一种串行通信协议,通过modbus从而达到控制plc的目的,现在的主流 也俨然成为了工业领域的通信标准。

modbus是一对一:一主一从 主发从回     一对多也可以但是也是一对一的模式 同时不能多个;如果支持广播 那么就是一对多  主发送 从不响应那种了 这种情况通信查询国标GBT 19582-2

一主多从通信,主机通过从机ID号来区分要通信的从机设备。从机ID范围为1~247,0为广播地址,248~255为用户自定义地址

modbus分为有线和无线,我大概是需要用到无线 

现在的4种通信形式分别为:RTU、ASCII、TCP、Plus

我学习tcp形式

TCP是一种网络协议,而Modbus/TCP就是基于网络协议上的一种应用层协议。其报文格式是十六进制的,由报头(2字节的帧序号+2字节的协议类型+2字节的数据长度+1字节的Slave ID)+数据两部分组成。由于该通信方式是基于TCP/IP这种可靠协议上,所以通信不需要有额外的校验机制。

安卓使用modbus tcp 简单通过网络查询到的使用方法

注意:PLC端需要开启Modbus TCP Server

具体内容:https://github.com/zgkxzx/Modbus4Android

引入

创建连接

/**
     * 初始化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文件

 

最后一定记得回收

ModbusReq.getInstance().destory()

 

返回值代表的情况

 

 

modbus 可以添加物理设备去实现无线替换有线的情况

具体内容:https://it.sohu.com/a/662678507_120409421

 

测试工具MThings

具体内容:https://blog.51cto.com/u_12935/7851883

更多内容:https://blog.csdn.net/shi_xiaobin/article/details/127443774

 

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);
    }

 在最后记得回收

ModbusReq.getInstance().destory()

三:
ModbusParam modbusParam = new ModbusParam();
modbusParam.setHost("192.168.0.105");
modbusParam.setPort(502);
modbusParam.setEncapsulated(false);
modbusParam.setKeepAlive(true);
modbusParam.setTimeout(2000);
modbusParam.setRetries(0);
ModbusReq.getInstance().setParam(modbusParam).init(new OnRequestBack<String>() {
        @Override
        public void onSuccess(String s) {
            Log.d(TAG, "onSuccess " + s);
        }

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

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

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

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

                    @Override
                    public void onFailed(String msg) {
                        Log.e(TAG, "readHoldingRegisters onFailed " + msg);
                    }
                }, 1, 2, 8);
 ModbusReq.getInstance().readInputRegisters(new OnRequestBack<short[]>() {
                    @Override
                    public void onSuccess(short[] data) {
                        Log.d(TAG, "readInputRegisters onSuccess " + Arrays.toString(data));
                    }

                    @Override
                    public void onFailed(String msg) {
                        Log.e(TAG, "readInputRegisters onFailed " + msg);
                    }
                }, 1, 2, 8);
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);
                    }
                },1,1,true);
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);
                    }
                },1,1,234);
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);
                    }
                },1,2,new short[]{211,52,34});
ModbusReq.getInstance().destroy();

 

posted @ 2023-12-19 09:12  张学涛  阅读(221)  评论(0编辑  收藏  举报