注意事项:
- 前导字节-一般在传输帧信息前,都要有0~4个FE不等,所以这里要注意,对于主站来说,直接发送4个FE作为前导字节即可。而从站回复,就不一定了,根据厂家不同而不同,有些没有FE的,也有4个FE的,所以对于接受程序,一定要慎重
- 传输次序-所有的数据项都是先传低字节,再传高字节,这里的数据项,主要涉及到地址域和数据域,因为其他都是1个字节
- 差错控制-通信偶校验
- 数据与传输运算方式:主站加0x33,从站减0x33(为嘛这么定义,可能是考虑BCD码吧)
DL645-2007的地址域发送命令是AAAAAAAAAAAA,DL645-1997的地址域发送命令是999999999999
1:DL645计算校验和的方法(字符串)
package com.example.modbusrtu.config;public class DL645ChecksumCalculator {public static void main(String[] args) {String data2 = "68 AA AA AA AA AA AA 68 11 04 33 33 34 33";System.out.println("Checksum for data2: " + calculateChecksum(data2));}public static String calculateChecksum(String hexData) {String[] hexArray = hexData.split(" ");int[] data = new int[hexArray.length];for (int i = 0; i < hexArray.length; i++) {data[i] = Integer.parseInt(hexArray[i], 16);}int sum = 0;for (int b : data) {sum += b;}int checksum = sum % 256;return String.format("%02X", checksum);}
}
1:DL645计算校验和的方法(byte数组)
package com.example.modbusrtu.config;public class Dl645Checksum {public static void main(String[] args) {byte[] request = new byte[] {(byte) 0x68, (byte) 0xAA, (byte) 0xAA, (byte) 0xAA, (byte) 0xAA, (byte) 0xAA, (byte) 0xAA, (byte) 0x68, (byte) 0x11, (byte) 0x04, (byte) 0x33, (byte) 0x33,(byte) 0x34, (byte) 0x33};int checksum = calculateChecksum(request);System.out.println( (byte)(checksum & 0xFF));}public static int calculateChecksum(byte[] data) {int sum = 0;for (int i = 0; i < data.length; i++) {int count = Integer.parseInt(String.valueOf(data[i]& 0xFF));System.out.println(Integer.valueOf(data[i]& 0xFF));sum