安卓 通过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();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2020-12-19 记录一下 小游戏模板里面遇到ANR
2020-12-19 Android使用MediaPlayer实现音乐播放