注意事项:
前导字节-一般在传输帧信息前,都要有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