zoukankan      html  css  js  c++  java
  • 私.Modbus测试_ZC01_TCP方式

    ZC:这个例子是使用TCP来交互midbus协议数据,我在这个例子里面没有查找到 dll或so文件,运行过程中也没有提示需要dll或so文件  也没有说缺少函数之类的,应该是 没有用到 dll或so文件的。

    ZC:这是使用 TCP的方式来传输 modbus协议数据包的,想追一下源码 看看到底是不是 socket,追到 ModbusMaster.class的 调用函数sendImpl(...)就追不下去了。后一想 通过Debug来追,就来到了 TcpMaster.class中 在函数openConnection(...)中 可以看到 transport就是 socket的输入输出流,继续跟下去 在下面的 发送过程中 调用到了“transport.write(data);”  其实就是 使用socket在发送数据

    1、modbus tcp通讯modbus4j使用说明-java编程-Leftso(左搜).html(http://www.leftso.com/blog/83.html

    2、我的测试代码:

     2.1、包:(1)源码:"...C_IDEJava_3rdmodbus_java3_最新的(20181125)modbus4j-master.zip",(2)jar:"...C_IDEJava_3rdmodbus_java2_新一点的Mango Automationm2m2-modbus-1.8.0.zip"的lib文件夹中有

      测试工具:ModbusSlave:"...C__Self私ModbusSlaveModbus ToolsModbus Slavembslave.exe"

     2.2、

    package com.modbus4j303;
    
    import com.serotonin.modbus4j.BatchRead;
    import com.serotonin.modbus4j.BatchResults;
    import com.serotonin.modbus4j.ModbusFactory;
    import com.serotonin.modbus4j.ModbusMaster;
    import com.serotonin.modbus4j.code.DataType;
    import com.serotonin.modbus4j.exception.ErrorResponseException;
    import com.serotonin.modbus4j.exception.ModbusInitException;
    import com.serotonin.modbus4j.exception.ModbusTransportException;
    import com.serotonin.modbus4j.ip.IpParameters;
    import com.serotonin.modbus4j.locator.BaseLocator;
    
    public class Modbus4jUtils
    {
        /**
         * 工厂。
         */
        static ModbusFactory modbusFactory;
        static {
            if (modbusFactory == null) {
                modbusFactory = new ModbusFactory();
            }
        }
    
        /**
         * 获取master
         * 
         * @return
         * @throws ModbusInitException
         */
        public static ModbusMaster getMaster() throws ModbusInitException {
            IpParameters params = new IpParameters();
            params.setHost("localhost");
            params.setPort(502);
            //
            // modbusFactory.createRtuMaster(wapper); //RTU 协议
            // modbusFactory.createUdpMaster(params);//UDP 协议
            // modbusFactory.createAsciiMaster(wrapper);//ASCII 协议
            ModbusMaster master = modbusFactory.createTcpMaster(params, false);// TCP 协议
            master.init();
    
            return master;
        }
    
        /**
         * 读取[01 Coil Status 0x]类型 开关数据 // ZC: Coil线圈
         * 
         * @param slaveId
         *            slaveId
         * @param offset
         *            位置
         * @return 读取值
         * @throws ModbusTransportException
         *             异常
         * @throws ErrorResponseException
         *             异常
         * @throws ModbusInitException
         *             异常
         */
        public static Boolean readCoilStatus(int slaveId, int offset)
                throws ModbusTransportException, ErrorResponseException, ModbusInitException {
            // 01 Coil Status
            BaseLocator<Boolean> loc = BaseLocator.coilStatus(slaveId, offset);
            Boolean value = getMaster().getValue(loc);
            return value;
        }
    
        /**
         * 读取[02 Input Status 1x]类型 开关数据
         * 
         * @param slaveId
         * @param offset
         * @return
         * @throws ModbusTransportException
         * @throws ErrorResponseException
         * @throws ModbusInitException
         */
        public static Boolean readInputStatus(int slaveId, int offset)
                throws ModbusTransportException, ErrorResponseException, ModbusInitException {
            // 02 Input Status
            BaseLocator<Boolean> loc = BaseLocator.inputStatus(slaveId, offset);
            Boolean value = getMaster().getValue(loc);
            return value;
        }
    
        /**
         * 读取[03 Holding Register类型 2x]模拟量数据
         * 
         * @param slaveId
         *            slave Id
         * @param offset
         *            位置
         * @param dataType
         *            数据类型,来自com.serotonin.modbus4j.code.DataType
         * @return
         * @throws ModbusTransportException
         *             异常
         * @throws ErrorResponseException
         *             异常
         * @throws ModbusInitException
         *             异常
         */
        public static Number readHoldingRegister(int slaveId, int offset, int dataType)
                throws ModbusTransportException, ErrorResponseException, ModbusInitException {
            // 03 Holding Register类型数据读取
            BaseLocator<Number> loc = BaseLocator.holdingRegister(slaveId, offset, dataType);
            Number value = getMaster().getValue(loc);
            return value;
        }
    
        /**
         * 读取[04 Input Registers 3x]类型 模拟量数据
         * 
         * @param slaveId
         *            slaveId
         * @param offset
         *            位置
         * @param dataType
         *            数据类型,来自com.serotonin.modbus4j.code.DataType
         * @return 返回结果
         * @throws ModbusTransportException
         *             异常
         * @throws ErrorResponseException
         *             异常
         * @throws ModbusInitException
         *             异常
         */
        public static Number readInputRegisters(int slaveId, int offset, int dataType)
                throws ModbusTransportException, ErrorResponseException, ModbusInitException {
            // 04 Input Registers类型数据读取
            BaseLocator<Number> loc = BaseLocator.inputRegister(slaveId, offset, dataType);
            Number value = getMaster().getValue(loc);
            return value;
        }
    
        /**
         * 批量读取使用方法
         * 
         * @throws ModbusTransportException
         * @throws ErrorResponseException
         * @throws ModbusInitException
         */
        public static void batchRead() throws ModbusTransportException, ErrorResponseException, ModbusInitException {
    
            BatchRead<Integer> batch = new BatchRead<Integer>();
    
            batch.addLocator(0, BaseLocator.holdingRegister(1, 1, DataType.FOUR_BYTE_FLOAT));
            batch.addLocator(1, BaseLocator.inputStatus(1, 0));
    
            ModbusMaster master = getMaster();
    
            batch.setContiguousRequests(false);
            BatchResults<Integer> results = master.send(batch);
            System.out.println(results.getValue(0));
            System.out.println(results.getValue(1));
        }
    
        /**
         * 测试
         * 
         * @param args
         */
        public static void main(String[] args)
        {
            try {
                // 01测试
                Boolean v011 = readCoilStatus(1, 0);
                Boolean v012 = readCoilStatus(1, 1);
                Boolean v013 = readCoilStatus(1, 6);
                System.out.println("v011:" + v011);
                System.out.println("v012:" + v012);
                System.out.println("v013:" + v013);
                // 02测试
                Boolean v021 = readInputStatus(1, 0);
                Boolean v022 = readInputStatus(1, 1);
                Boolean v023 = readInputStatus(1, 2);
                System.out.println("v021:" + v021);
                System.out.println("v022:" + v022);
                System.out.println("v023:" + v023);
    
                // 03测试
                Number v031 = readHoldingRegister(1, 1, DataType.FOUR_BYTE_FLOAT);// 注意,float
                Number v032 = readHoldingRegister(1, 3, DataType.FOUR_BYTE_FLOAT);// 同上
                System.out.println("v031:" + v031);
                System.out.println("v032:" + v032);
    
                // 04测试
                Number v041 = readInputRegisters(1, 1, DataType.FOUR_BYTE_FLOAT);//
                Number v042 = readInputRegisters(1, 3, DataType.FOUR_BYTE_FLOAT);//
                System.out.println("v041:" + v041);
                System.out.println("v042:" + v042);
                // 批量读取
                batchRead();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    3、

    4、

    5、

  • 相关阅读:
    计算机网络基础
    OA项目(MVC项目)
    修改XML的节点内容
    项目实战-电商(网上书城)
    DataTables ajax bootstrap 分页/搜索/排序/常见问题
    DNS服务器解析域名的过程
    bootstrap 模态框
    QuickChm 制作chm文档 chm文档脚本错误,乱码
    poi 读取word文档
    commons -lang(2) RandomStringUtils RandomUtils
  • 原文地址:https://www.cnblogs.com/codeskilla/p/10016127.html
Copyright © 2011-2022 走看看