//感兴趣的或者需要交流的可以加qq群,大家一起讨论。群号:192656750感兴趣的或者需要交流的可以加qq群,大家一起讨论。群号:192656750

资料下载地址:https://download.csdn.net/download/u013150916/9848441

package com.yunkouan.wincc.modbus;
import java.util.Arrays;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import org.junit.Test;
import com.serotonin.io.serial.SerialParameters;
import com.serotonin.modbus4j.BasicProcessImage;
import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.ModbusSlaveSet;
import com.serotonin.modbus4j.ProcessImage;
import com.serotonin.modbus4j.ProcessImageListener;
import com.serotonin.modbus4j.base.ReadFunctionGroup;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.code.RegisterRange;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.IllegalDataAddressException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.locator.BaseLocator;
import com.serotonin.modbus4j.locator.StringLocator;
import com.serotonin.modbus4j.msg.ModbusResponse;
import com.serotonin.modbus4j.msg.ReadCoilsRequest;
import com.serotonin.modbus4j.msg.ReadCoilsResponse;
import com.serotonin.modbus4j.msg.ReadDiscreteInputsRequest;
import com.serotonin.modbus4j.msg.ReadDiscreteInputsResponse;
import com.serotonin.modbus4j.msg.ReadExceptionStatusRequest;
import com.serotonin.modbus4j.msg.ReadExceptionStatusResponse;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;
import com.serotonin.modbus4j.msg.ReadInputRegistersRequest;
import com.serotonin.modbus4j.msg.ReadInputRegistersResponse;
import com.serotonin.modbus4j.msg.ReportSlaveIdRequest;
import com.serotonin.modbus4j.msg.ReportSlaveIdResponse;
import com.serotonin.modbus4j.msg.WriteCoilRequest;
import com.serotonin.modbus4j.msg.WriteCoilResponse;
import com.serotonin.modbus4j.msg.WriteCoilsRequest;
import com.serotonin.modbus4j.msg.WriteCoilsResponse;
import com.serotonin.modbus4j.msg.WriteMaskRegisterRequest;
import com.serotonin.modbus4j.msg.WriteMaskRegisterResponse;
import com.serotonin.modbus4j.msg.WriteRegisterRequest;
import com.serotonin.modbus4j.msg.WriteRegisterResponse;
import com.serotonin.modbus4j.msg.WriteRegistersRequest;
import com.serotonin.modbus4j.msg.WriteRegistersResponse;
import com.sun.org.apache.bcel.internal.generic.StackInstruction;
import com.yunkouan.wincc.util.ConversionUtil;public class MasterTest {public static void main(String[] args) throws Exception {//TCP传输方式
//          ModbusMaster master = getTcpMaster();//RTU传输方式ModbusMaster master = getRtuMaster();//ASCII传输模式
//          ModbusMaster master = getAsiiMaster();
//          ModbusMaster master = modbusFactory.createUdpMaster(ipParameters);try {//初始化//设置超时时间master.setTimeout(500);//设置重连次数master.setRetries(1);master.init();//设置从站IDint slaveId = 1;//测试校验
//          Timer timer = new Timer();
//          timer.schedule(new TimerTask() {
//
//              @Override
//              public void run() {
//                  //RTU
//                  ModbusMaster master = getRtuMaster();
//                  //ASCIIModbusMaster master = getAsiiMaster();
//                  try {
//                      master.init();
//                      readCoilTest(master, 1, 0, 10);
//                  } catch (ModbusInitException e) {
//                      e.printStackTrace();
//                  } finally {
//                      master.destroy();
//                  }
//              }
//          }, 100, 1000);//------------------读---------------//读取开关量状态   01
//            readCoilTest(master, slaveId, 0, 5);//读取外部设备输入开关量状态  02
//            readDiscreteInputTest(master, slaveId, 0, 10);//读取保持寄存器数据 03
//            readHoldingRegistersTest(master, slaveId, 0, 10);//读取外围设备输入的数据 04
//            readInputRegistersTest(master, slaveId, 0, 10);//------------------写---------------//开关量写单个数据 05
//            writeCoilTest(master, slaveId, 9, true);//开关量写入多个数据 15
//            writeCoilsTest(master, slaveId, 0, new boolean[] {true, true, true, true, true});//写入单个模拟量数据 06
//            writeRegisterTest(master, slaveId, 0, 100);//写入多个模拟量数据 16
//            writeRegistersTest(master, slaveId, 0, new short[] {1, 10, 100, 1000, 10000, (short) 65534});//批量读取
//             bathRead(master, slaveId);//根据类型写writeValue(master);//异常
//             readExceptionStatusTest(master, slaveId);}finally {master.destroy();}}/*** @Description: 根据类型写数据* @param master* @throws ModbusTransportException* @throws ErrorResponseException */public static void writeValue(ModbusMaster master) throws ModbusTransportException, ErrorResponseException {//       BaseLocator<?> createLocator = StringLocator.createLocator(1, 1, DataType.TWO_BYTE_INT_UNSIGNED, 1, 2);//        BaseLocator<Number> hr1 = BaseLocator.holdingRegister(1, 0, DataType.TWO_BYTE_INT_UNSIGNED);
//      BaseLocator<Number> hr1 = BaseLocator.holdingRegister(1, 0, DataType.TWO_BYTE_INT_UNSIGNED_SWAPPED);
//      BaseLocator<Number> hr1 = BaseLocator.holdingRegister(1, 0, DataType.TWO_BYTE_INT_UNSIGNED);
//      BaseLocator<Number> hr1 = BaseLocator.holdingRegister(1, 0, DataType.FOUR_BYTE_INT_UNSIGNED);//测试高低位0x12345678
//      BaseLocator<Number> hr1 = BaseLocator.holdingRegister(1, 0, DataType.FOUR_BYTE_INT_UNSIGNED);
//      BaseLocator<Number> hr1 = BaseLocator.holdingRegister(1, 0, DataType.FOUR_BYTE_INT_UNSIGNED_SWAPPED);BaseLocator<Number> hr1 = BaseLocator.inputRegister(1, 0, DataType.FOUR_BYTE_INT_UNSIGNED_SWAPPED);
//      BaseLocator<Number> hr2 = BaseLocator.holdingRegister(1, 0, DataType.TWO_BYTE_INT_UNSIGNED);//测试浮点数
//      BaseLocator<Number> hr2 = BaseLocator.holdingRegister(1, 0, DataType.FOUR_BYTE_INT_UNSIGNED);
//      master.setValue(hr2, 0x3F800000);master.setValue(hr1, 0x12345678);}/*** @Description: 批量读取    可以批量读取不同寄存器中数据* @param master* @param slaveId* @throws ModbusTransportException* @throws ErrorResponseException */public static void bathRead(ModbusMaster master, int slaveId)throws ModbusTransportException, ErrorResponseException {BatchRead<Number> batch = new BatchRead<Number>();//****************批量读取不同寄存器中的单个数据********************//读取线圈状态开关量
//          batch.addLocator(1, BaseLocator.coilStatus(slaveId, 0));//读取输入状态 开关量
//          batch.addLocator(2, BaseLocator.inputStatus(slaveId, 0));//读取保持寄存器数据//根据设置的数据类型读取
//          batch.addLocator(3, BaseLocator.holdingRegister(slaveId, 0, DataType.TWO_BYTE_INT_UNSIGNED));//读取整形中16位中某一位的布尔值
//          batch.addLocator(3.1, BaseLocator.holdingRegisterBit(slaveId, 0, 0));//读取输入寄存器数据//根据设置的数据类型读取
//          batch.addLocator(4, BaseLocator.inputRegister(slaveId, 0, DataType.TWO_BYTE_INT_UNSIGNED));//读取整形中16位中某一位的布尔值
//          batch.addLocator(4.1, BaseLocator.inputRegisterBit(slaveId, 0, 0));//高低字节颠倒batch.addLocator(1, BaseLocator.holdingRegister(slaveId, 0, DataType.FOUR_BYTE_INT_UNSIGNED_SWAPPED));//高低字节不颠倒
//          batch.addLocator(1, BaseLocator.holdingRegister(slaveId, 0, DataType.FOUR_BYTE_INT_UNSIGNED));//读取浮点数
//          batch.addLocator(1, BaseLocator.holdingRegister(slaveId, 0, DataType.FOUR_BYTE_FLOAT));BatchResults<Number> results = master.send(batch);
//           System.out.println("批量读取1:--" + results.getValue(1));
//           System.out.println("批量读取2:--" + results.getValue(2));
//           System.out.println("批量读取3:--" + results.getValue(3));
//           System.out.println("批量读取3.1:--" + results.getValue(3.1));
//           System.out.println("批量读取3.2:--" + results.getValue(3.2));
//           System.out.println("批量读取4:--" + results.getValue(4));
//           System.out.println("批量读取4.1:--" + results.getValue(4.1));//高低字节颠倒System.out.println(Long.toHexString((long) results.getValue(1)));}/*** @Description: 读取开关量* @param master 主站实例 * @param slaveId 从站ID* @param start 起始位* @param len 读取的长度*/public static void readCoilTest(ModbusMaster master, int slaveId, int start, int len) {try {ReadCoilsRequest request = new ReadCoilsRequest(slaveId, start, len);ReadCoilsResponse response = (ReadCoilsResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + response.getExceptionMessage());elseSystem.out.println("功能码:1--" + Arrays.toString(response.getBooleanData()));}catch (ModbusTransportException e) {e.printStackTrace();}}/*** @Description: 读取外围设备输入的开关量* @param master 主站实例* @param slaveId 从站ID* @param start 起始位* @param len 长度*/public static void readDiscreteInputTest(ModbusMaster master, int slaveId, int start, int len) {try {ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, start, len);ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + response.getExceptionMessage());elseSystem.out.println("功能码:2--" + Arrays.toString(response.getBooleanData()));}catch (ModbusTransportException e) {e.printStackTrace();}}/*** @Description: 读取保持寄存器数据* @param master 主站实例* @param slaveId 从站ID* @param start 起始位* @param len 长度*/public static void readHoldingRegistersTest(ModbusMaster master, int slaveId, int start, int len) {try {ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, start, len);ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + response.getExceptionMessage());elseSystem.out.println("功能码:3--" + Arrays.toString(response.getShortData()));}catch (ModbusTransportException e) {e.printStackTrace();}}/*** @Description: 读取外围设备输入的数据* @param master 主站实例* @param slaveId 从站ID* @param start 起始位* @param len 长度*/public static void readInputRegistersTest(ModbusMaster master, int slaveId, int start, int len) {try {ReadInputRegistersRequest request = new ReadInputRegistersRequest(slaveId, start, len);ReadInputRegistersResponse response = (ReadInputRegistersResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + response.getExceptionMessage());elseSystem.out.println("功能码:4--" + Arrays.toString(response.getShortData()));}catch (ModbusTransportException e) {e.printStackTrace();}}/*** @Description: 写开关量数据* @param master * @param slaveId 从站ID* @param offset 偏移量* @param value 写入的值*/public static void writeCoilTest(ModbusMaster master, int slaveId, int offset, boolean value) {try {WriteCoilRequest request = new WriteCoilRequest(slaveId, offset, value);WriteCoilResponse response = (WriteCoilResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + response.getExceptionMessage());elseSystem.out.println("功能码:1,写入单个数据成功!");}catch (ModbusTransportException e) {e.printStackTrace();}}/*** @Description: 保持寄存器,写入单个数据* @param master* @param slaveId 从站ID* @param offset 偏移量* @param value */public static void writeRegisterTest(ModbusMaster master, int slaveId, int offset, int value) {try {WriteRegisterRequest request = new WriteRegisterRequest(slaveId, offset, value);WriteRegisterResponse response = (WriteRegisterResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + response.getExceptionMessage());elseSystem.out.println("功能码:3,写入单个模拟量数据成功!");}catch (ModbusTransportException e) {e.printStackTrace();}}/*** @Description: 读取异常状态* @param master* @param slaveId */public static void readExceptionStatusTest(ModbusMaster master, int slaveId) {try {ReadExceptionStatusRequest request = new ReadExceptionStatusRequest(slaveId);ReadExceptionStatusResponse response = (ReadExceptionStatusResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + response.getExceptionMessage());elseSystem.out.println(response.getExceptionStatus());}catch (ModbusTransportException e) {e.printStackTrace();}}public static void reportSlaveIdTest(ModbusMaster master, int slaveId) {try {ReportSlaveIdRequest request = new ReportSlaveIdRequest(slaveId);ReportSlaveIdResponse response = (ReportSlaveIdResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + response.getExceptionMessage());elseSystem.out.println(Arrays.toString(response.getData()));}catch (ModbusTransportException e) {e.printStackTrace();}}/*** @Description: 保持寄存器写多个数据* @param master* @param slaveId 从站ID* @param start 起始位置* @param values 数值*/public static void writeCoilsTest(ModbusMaster master, int slaveId, int start, boolean[] values) {try {WriteCoilsRequest request = new WriteCoilsRequest(slaveId, start, values);WriteCoilsResponse response = (WriteCoilsResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + response.getExceptionMessage());elseSystem.out.println("功能码:1,写入多个数据成功!");}catch (ModbusTransportException e) {e.printStackTrace();}}/*** @Description: 保持寄存器写入多个模拟量数据* @param master* @param slaveId 从站ID* @param start modbus起始位置* @param values 数据*/public static void writeRegistersTest(ModbusMaster master, int slaveId, int start, short[] values) {try {WriteRegistersRequest request = new WriteRegistersRequest(slaveId, start, values);WriteRegistersResponse response = (WriteRegistersResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + response.getExceptionMessage());elseSystem.out.println("功能码:3,写入多个模拟量数据成功!");}catch (ModbusTransportException e) {e.printStackTrace();}}public static void writeMaskRegisterTest(ModbusMaster master, int slaveId, int offset, int and, int or) {try {WriteMaskRegisterRequest request = new WriteMaskRegisterRequest(slaveId, offset, and, or);WriteMaskRegisterResponse response = (WriteMaskRegisterResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + response.getExceptionMessage());elseSystem.out.println("Success");}catch (ModbusTransportException e) {e.printStackTrace();}}/*** @return * @Description: 获取AsiiMaster*/public static ModbusMaster getAsiiMaster(){SerialParameters serialParameters = new SerialParameters();// 设定MODBUS通讯的串行口serialParameters.setCommPortId("COM4");// 设置端口波特率serialParameters.setBaudRate(9600);//硬件之间输入流应答控制 serialParameters.setFlowControlIn(0);//硬件之间输出流应答控制 serialParameters.setFlowControlOut(0);//设定数据位的位数  RTU:8位    ASCII:7位serialParameters.setDataBits(7);//停止位的位数,如果无奇偶校验为2,有奇偶校验为1serialParameters.setParity(2);//停止位的位数,如果无奇偶校验为2,有奇偶校验为1serialParameters.setStopBits(1);// 设置端口名称serialParameters.setPortOwnerName("ASCII");// 创建ModbusMaster工厂实例return new ModbusFactory().createAsciiMaster(serialParameters);}/*** @Description: 获取AsiiSalve* @return */public static ModbusSlaveSet getAsciiSalve(){SerialParameters serialParameters = new SerialParameters();// 设定MODBUS通讯的串行口serialParameters.setCommPortId("COM4");// 设置端口波特率serialParameters.setBaudRate(9600);//硬件之间输入流应答控制 serialParameters.setFlowControlIn(0);//硬件之间输出流应答控制 serialParameters.setFlowControlOut(0);//设定数据位的位数  RTU:8位    ASCII:7位serialParameters.setDataBits(7);//奇偶校验位  无校验:0 奇校验:1 偶校验:2serialParameters.setParity(2);//停止位的位数,如果无奇偶校验为2,有奇偶校验为1serialParameters.setStopBits(1);// 设置端口名称serialParameters.setPortOwnerName("ASCII"); // 创建ModbusMaster工厂实例return new ModbusFactory().createAsciiSlave(serialParameters);}/*** @return * @Description: 获取RTUMaster*/public static ModbusMaster getRtuMaster(){SerialParameters serialParameters = new SerialParameters();
//      TestSerialPortWrapper portWrapper = new TestSerialPortWrapper("COM4", 9600, 0, 0, 8, 1, 2);// 设定MODBUS通讯的串行口serialParameters.setCommPortId("COM4");// 设置端口波特率serialParameters.setBaudRate(9600);//硬件之间输入流应答控制 serialParameters.setFlowControlIn(0);//硬件之间输出流应答控制 serialParameters.setFlowControlOut(0);//设定数据位的位数  RTU:8位    ASCII:7位serialParameters.setDataBits(8);//奇偶校验位  无校验:0 奇校验:1 偶校验:2serialParameters.setParity(2);//停止位的位数,如果无奇偶校验为2,有奇偶校验为1serialParameters.setStopBits(1);// 设置端口名称serialParameters.setPortOwnerName("RTU");// 创建ModbusMaster工厂实例return new ModbusFactory().createRtuMaster(serialParameters);}/*** @Description: 创建TcpMaster* @return */public static ModbusMaster getTcpMaster() {IpParameters ipParameters = new IpParameters();//设置IPipParameters.setHost("localhost");//设置端口 默认为502ipParameters.setPort(502);// 创建ModbusMaster工厂实例   return new ModbusFactory().createTcpMaster(ipParameters, true);}/*** @Description: IO盒测试* @throws ModbusInitException* @throws ModbusTransportException* @throws ErrorResponseException */@Testpublic void konnadTest() throws ModbusInitException, ModbusTransportException, ErrorResponseException{IpParameters params = new IpParameters();params.setHost("172.16.16.205");params.setPort(502);//获取主站ModbusMaster master = new ModbusFactory().createTcpMaster(params, false);master.init();//读取MAC地址ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(1, 0, 3);ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);System.out.println("MAC地址" + ConversionUtil.getHexString(response.getData()));//        WriteRegisterRequest request1 = new WriteRegisterRequest(1, 1056, 0);
//        ModbusResponse response1 = master.send(request1);
//        if (response1.isException())
//            System.out.println("Exception response: message=" + response1.getExceptionMessage());
//        else
//            System.out.println("功能码:3,写入多个模拟量数据成功!");//写数据 DO0的状态  0x0400  I/O盒实际为DO1
//        WriteRegisterRequest request1 = new WriteRegisterRequest(1, 1024, 1);
//        master.send(request1);//写数据 DO1上电的状态  0x0411
//        WriteRegistersRequest request2 = new WriteRegistersRequest(1, 1040, new short[] {1, 1} );
//        master.send(request2);//读取 0x0411状态  为上电后的状态
//        ReadHoldingRegistersRequest request3 = new ReadHoldingRegistersRequest(1, 1040, 7);
//        ReadHoldingRegistersResponse response3 = (ReadHoldingRegistersResponse) master.send(request3);
//        System.out.println(Arrays.toString(response3.getShortData()));}/*** @Description: 创建modbus服务端  从站*/@Testpublic void createSalve(){//创建modbus工厂ModbusFactory modbusFactory = new ModbusFactory();//创建TCP服务端final ModbusSlaveSet salve = modbusFactory.createTcpSlave(false);//创建ASCII服务端
//      final ModbusSlaveSet salve = getAsciiSalve();//向过程影像区添加数据salve.addProcessImage(getModscanProcessImage(1));new Thread(new Runnable() {@Overridepublic void run() {try {salve.start();}catch (ModbusInitException e) {e.printStackTrace();}}}).start();while (true) {synchronized (salve) {try {salve.wait(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}for (ProcessImage processImage : salve.getProcessImages())try {updateProcessImage((BasicProcessImage) processImage);} catch (IllegalDataAddressException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/*** @Description: 创建寄存器* @param slaveId* @return */public static BasicProcessImage getModscanProcessImage(int slaveId) {BasicProcessImage processImage = new BasicProcessImage(slaveId);processImage.setInvalidAddressValue(Short.MIN_VALUE);//创建可读写开关量区processImage.setCoil(0, true);processImage.setCoil(1, false);processImage.setCoil(2, true);processImage.setCoil(3, true);processImage.setCoil(5, true);processImage.setCoil(6, true);processImage.setCoil(7, true);processImage.setCoil(8, true);processImage.setCoil(9, true);//创建只读开关量区processImage.setInput(0, false);processImage.setInput(1, false);processImage.setInput(2, true);processImage.setInput(3, false);processImage.setInput(4, true);processImage.setInput(5, true);processImage.setInput(6, true);processImage.setInput(7, true);processImage.setInput(8, true);processImage.setInput(9, true);//创建模拟量保持寄存器processImage.setHoldingRegister(0, (short) 1);processImage.setHoldingRegister(1, (short) 10);processImage.setHoldingRegister(2, (short) 100);processImage.setHoldingRegister(3, (short) 1000);processImage.setHoldingRegister(4, (short) 10000);processImage.setHoldingRegister(5, (short) 10000);processImage.setHoldingRegister(6, (short) 10000);processImage.setHoldingRegister(7, (short) 10000);processImage.setHoldingRegister(8, (short) 10000);processImage.setHoldingRegister(9, (short) 10000);//创建模拟量只读寄存器processImage.setInputRegister(0, (short) 10000);processImage.setInputRegister(1, (short) 1000);processImage.setInputRegister(2, (short) 100);processImage.setInputRegister(3, (short) 10);processImage.setInputRegister(4, (short) 1);processImage.setInputRegister(5, (short) 1);processImage.setInputRegister(6, (short) 1);processImage.setInputRegister(7, (short) 1);processImage.setInputRegister(8, (short) 1);processImage.setInputRegister(9, (short) 1);processImage.addListener(new BasicProcessImageListener());return processImage;}/*** @Description: 客户端修改本地寄存器的数据* @author-lsh* @date 2017年9月13日 下午5:47:30*/public static class BasicProcessImageListener implements ProcessImageListener {@Overridepublic void coilWrite(int offset, boolean oldValue, boolean newValue) {System.out.println("Coil at " + offset + " was set from " + oldValue + " to " + newValue);}@Overridepublic void holdingRegisterWrite(int offset, short oldValue, short newValue) {// Add a small delay to the processing.//            try {//                Thread.sleep(500);//            }//            catch (InterruptedException e) {//                // no op//            }System.out.println("HR at " + offset + " was set from " + oldValue + " to " + newValue);}}/*** @Description: 更新寄存器的数据* @param processImage* @throws IllegalDataAddressException */static void updateProcessImage(BasicProcessImage processImage) throws IllegalDataAddressException {processImage.setInput(0, !processImage.getInput(0));processImage.setInput(1, !processImage.getInput(1));//         processImage.setNumeric(RegisterRange.INPUT_REGISTER, 20, DataType.FOUR_BYTE_FLOAT, ir1Value += 0.01);//
//          short hr1Value = processImage.getNumeric(RegisterRange.HOLDING_REGISTER, 80, DataType.TWO_BYTE_BCD)
//                  .shortValue();
//          processImage.setNumeric(RegisterRange.HOLDING_REGISTER, 80, DataType.TWO_BYTE_BCD, hr1Value + 1);}@Testpublic void StringTest(){String a = "abc123456789";char[] charArray = a.toCharArray();System.err.println(Arrays.toString(charArray));}
}

modbus4j,rtu,ascii,tcp/ip传输模式相关推荐

  1. Java实现使用Modbus4j+seroUtils读取Mudbus RTU/ASCII Over TCP/IP连接设备数据

    使用Modbus4j+seroUtils读取风速风向仪数据,现有设备IP,端口号,从机地址,寄存器读取开始地址,读取的寄存器数量.没有上述jar包可以自行搜索,网上资源挺多 /*** @author ...

  2. TIA 博途模拟Modbus TCP/IP通信

    使用西门子TIA + PLCSIM 模拟配置PLC的Modbus通信. (本次使用的TIA版本为v15.1,S7-PLCSIM Advanced V2.0 SP1) 在TIA中创建新项目选择PLC 1 ...

  3. 网络:TCP/IP各层的协议

    教程书上虽然介绍了这些协议,但是就单个协议分别介绍的,很容易忘了这个协议属于那一层,以及属于底层哪个协议. 上图TCP/IP各层的协议很多,一张图就可以记住了. 应用层协议 0.  运行 在TCP\U ...

  4. 网络分层,网络协议TCP/IP模型,OSI模型

    TCP\IP模型是多种协议的综合,4层模型(也有说5层的). 其中最重要的就是分层结构和主要协议. 1.应用层(SMTP,HTTP,FTP) 2.传输层(TCP,UDP) 3.网络互联层(IPv4,I ...

  5. 详解OSI七层模型和TCP/IP模型

    详解OSI七层模型 1. 详解OSI七层模型 1.1 详解每层结构 1.2 交换机和路由器的区别 1.3 集线器与路由器在功能上有什么不同 2. 详解TCP/IP模型 2.1 详解每层结构 2.2 O ...

  6. 计算机网络(OSI、TCP/IP、网络协议、常见网络设备工作原理)

    目录 OSI模型 TCP/IP模型 网络协议 IP协议 IP数据报格式 IP数据报分片 IPv4地址 NAT协议 ARP/RARP协议 ARP RARP DHCP协议 ICMP协议 ICMP差错报告报 ...

  7. TCP/IP 网络协议基础入门

    文章目录 1.TCP/IP简介 IP 地址 域名 MAC 地址 端口号 封装和分用 2.链路层介绍 控制帧的传输 差错控制 反馈重发 计时器 序号 流量控制 以太网 PPP(点对点协议) SLIP 与 ...

  8. 关于TCP/IP协议簇

    TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个网络间实现信息传输的协议簇.TCP/IP协议严格来说 ...

  9. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)...

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器 定义:       这里 ...

最新文章

  1. SAP QM启用了Physical Sample Management后检验批有哪些特殊地方?
  2. 书籍:Python机器学习蓝图第2版 Python Machine Learning Blueprints 2nd - 2019.pdf
  3. python实现:旋转矩阵转换为四元数
  4. 重磅!《Android 全埋点技术白皮书》开源所有项目源码!
  5. 机器学习实战-PCA算法-26
  6. java list 排序_java list排序
  7. 用sql的select语句从数据库中获取数据
  8. 条件include_10_函数原型、条件编译与重复定义错误 | C语言入门
  9. 读书日当天冲上销量榜Top1和Top3,来听听携程人写书背后的故事
  10. 标记重复值删除重复值
  11. 李健清华计算机专业,计算机DeepWeb数据库的分类研究李健
  12. 【硬件木马项目】第二篇:硬件木马检测方法的种类及原理
  13. 神经网络算法的关键参数,神经网络计算工作原理
  14. 2022-2028年版全球及中国涂料市场销售运营模式及发展前景预测报告
  15. Python 常用写法
  16. 商务领航的网关问题解决
  17. 北大计算机图灵班,北大首期“图灵班”开班
  18. 华为鸿蒙dba,人生中最重要的决策|读在职博士DBA
  19. 奥运排行榜详解 (25分
  20. 张亚飞《.Net for Flash FMS》读后笔记一

热门文章

  1. OPPOR9s无人直播刷机包安装图文教程
  2. sinx/x的极限为什么是1_在sinx/x中当x→0时极限为什么为1
  3. 天翼云盘快速下载,免登陆下载办法-附解析源码
  4. 个人支付接口开通(教程)
  5. 基于MATLAB GUI的数字信号处理音频FIR去噪滤波器设计
  6. 7个实用又鲜为人知的PPT技巧
  7. 利用cocos2dx 3.2开发消灭星星(三)常用的飘字效果
  8. 携程网页版国内机票数据
  9. 一次内存和显存的优化
  10. 超简单的MVP模式案例