博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Modbus java slave app
阅读量:4876 次
发布时间:2019-06-11

本文共 2809 字,大约阅读时间需要 9 分钟。

文章实现 Modbus slave app , 用 serial rtu 传输, 代码只实现监听功能(本人测试可行), 要实现写功能,可研究一下代码中 updateProcessImage 方法。完整代码(先阅读 README.md ) :http://git.oschina.net/jlpostbox/demo-modbus

public static void main(String[] args) throws Exception {        String commPortId = "COM2";        int baudRate = 9600;        int flowControlIn = 0;        int flowControlOut = 0;        int dataBits = 8;        int stopBits = 1;        int parity = 0;        SerialPortWrapperImpl wrapper = new SerialPortWrapperImpl(commPortId, baudRate, flowControlIn, flowControlOut, dataBits, stopBits, parity);        ModbusFactory modbusFactory = new ModbusFactory();        final ModbusSlaveSet listener = modbusFactory.createRtuSlave(wrapper);        // Add a few slave process images to the listener.        listener.addProcessImage(getModscanProcessImage(1));         new Thread(new Runnable() {            @Override            public void run() {                try {                    listener.start();                }                catch (ModbusInitException e) {                    e.printStackTrace();                }            }        }).start();    }static class BasicProcessImageListener implements ProcessImageListener {        @Override        public void holdingRegisterWrite(int offset, short oldValue, short newValue) {            System.out.println("HR at " + offset + " was set from " + oldValue + " to " + newValue);        }    }    static BasicProcessImage getModscanProcessImage(int slaveId) {        //创建10个可读写的数字类型,与主机对应        BasicProcessImage processImage = new BasicProcessImage(slaveId);        processImage.setInvalidAddressValue(Short.MIN_VALUE);        processImage.setHoldingRegister(0,(short) 8);        processImage.setHoldingRegister(1,(short) 8);        processImage.setHoldingRegister(2,(short) 8);        processImage.setHoldingRegister(3,(short) 8);        processImage.setHoldingRegister(4,(short) 8);        processImage.setHoldingRegister(5,(short) 8);        processImage.setHoldingRegister(6,(short) 8);        processImage.setHoldingRegister(7,(short) 8);        processImage.setHoldingRegister(8,(short) 8);        processImage.setHoldingRegister(9,(short) 8);        // Add an image listener.        processImage.addListener(new BasicProcessImageListener());        return processImage;    }

 开发中遇到一个问题,short的取值是 -32768~32767 , 而对方发过来的是 0~65535 , 这样当发过来是32757~65535,java这边收到的是 -32768~ -1 , 我们就得利用Java位运算符,完成Unsigned转换

public int getUnsignedByte (byte data){      //将data字节型数据转换为0~255 (0xFF 即BYTE)。  return data&0x0FF;} public int getUnsignedByte (short data){      //将data字节型数据转换为0~65535 (0xFFFF 即 WORD)。  return data&0x0FFFF;}       public long getUnsignedIntt (int data){     //将int数据转换为0~4294967295 (0xFFFFFFFF即DWORD)。  return data&0x0FFFFFFFFl;}

 

转载于:https://www.cnblogs.com/leohe/p/7285313.html

你可能感兴趣的文章
SQL注入学习总结(四):SQL注入中的绕过
查看>>
Ajax笔记
查看>>
Nginx配置文件详细说明
查看>>
python遇到的问题汇总
查看>>
DBGRID 拖动滚动条 和 鼠标滚轮的问题
查看>>
快速排序、冒泡排序
查看>>
多个Tomcat同时启动的解决方案
查看>>
opencv
查看>>
VC/MFC非模态对话框实例
查看>>
编译器错误 CS0714和CS0715
查看>>
bzoj 3522 [Poi2014]Hotel 树形dp
查看>>
Deepin-安装laravel
查看>>
Linux 系统启动过程
查看>>
华为机试之广度优先遍历
查看>>
IE内核浏览器localStorage的一个大坑
查看>>
洛谷P4551最长异或路径(Trie树)
查看>>
Linux服务器iops性能测试-iozone
查看>>
C# 切图
查看>>
LeetCode 169. Majority Element解题方法
查看>>
python面试题
查看>>