通过modbus4j读写字符串到PLC
本项目使用modbus4j-3.0.3.jar实现于PLC通讯。
实现与PLC连接并完成读写基本数据类型通讯测试不再赘述,本人参考了云逸的博客https://www.cnblogs.com/ioufev/p/10831289.html
直接进入主题,读写字符串
写入字符串
/**
* 测试程序
*
* @param slaveId
* @param offset
* @param dataType
* @param value
* @return
* @throws ModbusTransportException
* @throws ErrorResponseException
* @throws ModbusInitException
*/
public static boolean writeStrToPlc(int slaveId, int startOffset, String value) throws ModbusTransportException, ErrorResponseException, ModbusInitException {
// 获取master
ModbusMaster tcpMaster = getMaster();
short[] sdata = SetString(value);
// 创建请求对象
WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, sdata);
// 发送请求并获取响应对象
ModbusResponse response = tcpMaster.send(request);
if (response.isException()) {
// log.error(response.getExceptionMessage());
return false;
} else {
return true;
}
}
工具类方法 setString()主要进行了一下数据类型转换
public static short[] SetString(String value) {
byte[] bytesTemp = value.getBytes(StandardCharsets.UTF_8);
byte[] bytes;
if (bytesTemp.length % 2 > 0) {
bytes = Arrays.copyOf(bytesTemp, bytesTemp.length + 1);
} else {
bytes = bytesTemp;
}
return bytesToShort(bytes);
}
/**
* Byte数组转short数组
*
* @param bytes
* @return
*/
public static short[] bytesToShort(byte[] bytes) {
if (bytes == null) {
return null;
}
short[] shorts = new short[bytes.length / 2];
ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
return shorts;
}
读取字符串
/**
*
* @param slaveId
* @param offset
* @param dataType
* @return
* @throws ModbusTransportException
* @throws ErrorResponseException
* @throws ModbusInitException
*/
public static String readHoldingRegisters(int slaveId, int offset, int dataType, int num)
throws ModbusTransportException, ErrorResponseException, ModbusInitException {
// 03 Holding Register类型数据读取
short[] data = new short[num];
for (int i = 0; i < num; i++) {
data[i] = readHoldingRegister(slaveId, offset + i, dataType).shortValue();
}
try {
return GetString(data, 0, num);
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(Modbus4jReadUtils.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
工具类方法getString() 类型转换
/**
*
* @param src
* @param start
* @param len
* @return
*/
public static String GetString(short[] src, int start, int len) throws UnsupportedEncodingException
{
short[] temp = new short[len];
for (int i = 0; i < len; i++)
{
temp[i] = src[i + start];
}
byte[] bytesTemp = shorts2Bytes(temp);
for (int i = 0; i < bytesTemp.length; i++) {
byte b = bytesTemp[i];
}
String str = new String(bytesTemp, "UTF-8");
return str;
}
/**
*
* @param data
* @return
*/
public static byte [] shorts2Bytes(short [] data){
byte[] byteValue = new byte[data.length * 2];
for (int i = 0; i < data.length; i++) {
byteValue[i * 2] = (byte) (data[i] & 0xff);
byteValue[i * 2 + 1] = (byte) ((data[i] & 0xff00) >> 8);
}
return byteValue;
}
PLC本身并不直接支持字符串类型数据。这里只能将字符串进行转换后进行存储,读的时候也是一样,通过读入一段连续的寄存器地址数据,再转成字符串
通过modbus4j读写字符串到PLC相关推荐
- 串口调试助手读写三菱fx3u数据_C#读写三菱Fx PLC 使用Fx 串口协议 读写Fx3U设备
本文将使用一个Github开源的组件库技术来读写三菱 FX PLC,使用的是基于串口的实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地 ...
- Objective-C 【从文件中读写字符串(直接读写/通过NSURL读写)】
------------------------------------------- 从文件中读写字符串(直接读写/通过NSURL读写) #import <Foundation/Foundat ...
- [Java] 读写字符串数据
package test.stream;import java.io.FileInputStream; import java.io.FileNotFoundException; import jav ...
- C#使用Modbus协议读写汇川PLC的M区寄存器(基本接口封装)
C#使用Modbus-TCP协议读取汇川PLC,Modbus读写是按照MW地址来处理的 [寄存器单位是字WORD,占用两个字节,类似于C#中的ushort(UInt16)],实际测试发现字符串是按照字 ...
- C#使用Modbus协议读写汇川PLC的M区寄存器(测试示例),接上篇
对汇川PLC采用Modbus-TCP进行读写寄存器测试示例 新建WinForms应用程序InovancePlcDemo,.net framework 4.5. 重命名窗体名为FormInovanceP ...
- C++文件读写——字符串分割
文章目录 字符串分割 字符串分割 void String_Split(string s, string delim, vector<string> &ans) {string::s ...
- 本地电脑远程至工控现场一台普通PC上(没安装博途软件),实现读写与监控PLC程序
一.前言 (1)对于电气工程师来说,在现场PC上没有安装博图软件时,或者博图版本不匹配时:如何能快速的使用笔记本远程现场PC实现监控修改并下载PLC程序是重要问题 (2)常见的是有几种做法:一是提前购 ...
- python三菱_python 读写三菱PLC数据,使用以太网读写Q系列,L系列,Fx系列的PLC数据...
本文将使用一个gitHub开源的组件技术来读写三菱的plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 里面 ...
- java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接
java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接 0x0 阅读本文章你能会使用java与西门子plc 进行通信 所有环境都为仿真模拟环境, 本测试使用的是西门子plc(s ...
最新文章
- 一步一步Asp.Net MVC系列_权限管理总结(附MVC权限管理系统源码)
- 混合云关键技术能力和发展趋势
- python如何做一个数据库_Python创建一个新的Django项目(连接到MySQL数据库),python,新建,mysql...
- JavaFX UI控件教程(八)之Choice Box
- 如何将hive查询结果导出成txt文件
- jeecg下实现自动默认模糊查询
- 水表读数自动识别,基于DB和CRNN的方法
- Android Canvas简单使用
- MogDB与PostgreSQL分区策略语法测试
- elementui 表格格式化
- mysql返回的数据是什么格式_磁盘格式化后能恢复数据吗?先了解什么是格式化...
- omron欧姆龙NJ/NX程序 全自动锂电池二封机,主站NJ501-1400+威纶通触摸屏。 整机采用EtherCAT总线网络节点控制,松下A6总线控制
- sort和sorted的区别
- silk lobe资源公众号_【好设计资源库】公众号素材获取方式说明
- 苹果M1如何安装Rosetta
- 线段树进阶之lazy思想及Java实现
- AlphaFold2: Highly accurate protein structure prediction with AlphaFold笔记
- 【海码学院】web前端基础入门JavaScript之JavaScript起源和基础语法学习笔记
- 小码哥《恋上数据结构与算法》笔记(十五):哈希表(Hash Table)
- vivado快捷键设置 放大代码_【Vivado那些事】Vivado中常用的快捷键(二)其他常用快捷键...
热门文章
- Web层改进II-用xmlhttp 无声息提交复杂表单
- mysql 中 使用truncate table XXXX 的时候出现 DROP command denied to user 'xxx' for table ' YYY的问题解决
- 旅游网案例:旅游线路名称查询
- 淘宝无货源开店怎么做?淘宝无货源开店裂变教程
- PowerDVD(了解收藏)
- 《数据结构》C语言版 严蔚敏版本 学习笔记
- 《网页制作与网站建设从入门到精通》第一部分 入门篇
- Demographic Prediction. 人口统计预测相关调研
- TouchGTX使用教程Button实现Text文本显示变化【一】
- 【哪些工作会被ChatGPT取代?】我用ChatGPT全自动化生成代码进行了深度分析