2013-07-18 9 views
0

modbus 프로토콜을 사용하는 장치에 연결하고 있습니다. 나는 기계에서 3 개의 가치를 얻을 필요가있다. 첫 번째 값은 데이터 형식 INT16이며 I는 예시적인 바이트 배열 보낼 때Modbus 프로토콜을 사용하여 int32 데이터 형식에 대한 CRC 계산

static byte[] hz = new byte[] { (byte) 0x01, (byte) 0x03, (byte) 0x00, 
     (byte) 0x33, (byte) 0x00, (byte) 0x01 }; 

및 I는 a previous question I asked on the subject로부터 얻어지는 CRC 계산 방법을 사용한다.

// Compute the MODBUS RTU CRC 
private static int ModRTU_CRC(byte[] buf, int len) 
{ 
    int crc = 0xFFFF; 

    for (int pos = 0; pos < len; pos++) { 
    crc ^= (int)buf[pos];   // XOR byte into least sig. byte of crc 

    for (int i = 8; i != 0; i--) { // Loop over each bit 
     if ((crc & 0x0001) != 0) {  // If the LSB is set 
     crc >>= 1;     // Shift right and XOR 0xA001 
     crc ^= 0xA001; 
     } 
     else       // Else LSB is not set 
     crc >>= 1;     // Just shift right 
    } 
    } 

    // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes) 
    return crc; 
    } 

응답을받을 수 있습니다. 그러나 다른 두 값은 int32 데이터 형식이므로이 메서드를 사용하면 응답을 반환하지 않습니다. 문제를 해결하기 위해 나는 Realterm.이라는 프로그램을 사용하여 명령을 실행합니다. 저는 이것을 사용하여 바이트 스트림의 끝 부분에 Modbus 16 CRC를 추가하고 전송합니다. 이것은 세 가지 모두에 대해 작동하며 원하는 응답을 반환합니다. 이 특정 계산 공식으로 작동하지 않는 데이터 형식의 경우입니까? CRC16과 Modbus16의 차이점은 무엇입니까?

답변

1

Modbus16 이고 CRC16입니다. 이 경우 0xFFFF가

  • 비트 순서
  • ,이 경우 0xA001
  • 초기 값에서

    • 비트 폭이 경우 16
    • 다항식 : CRC 계산은 여러 파라미터를 가질 최종 CRC가 XOR로 반전되는지 여부.

    꽤 많은 수의 CRC16이 정의되어 있으며이 매개 변수에 대해 다른 값이 있으며이 중 하나 인 것으로 보입니다. 자세한 내용은 Wikipedia article on Cyclic Redundancy Checks을 참조하십시오.

  • -2

    클래스 Obliczenia {

    short POLYNOM = (short) 0x0A001; 
    short[] TAB = {2,3,8,0x13,0x88,1,0x90,0,0x3c,2,0}; 
    short crc = (short) 0xffff; 
    short CRC_LByte,CRC_HByte; 
        public Obliczenia() { 
        for (short dana : TAB) { 
         crc= CRC16(crc, dana); 
        } 
        System.out.println("KOD CRC="+Integer.toHexString(crc&0xffff)); 
        CRC_LByte=(short)(crc & 0x00ff); 
        CRC_HByte=(short)((crc & 0xff00)/256); 
        System.out.println(" W ramce CRC_LByte="+Integer.toHexString(CRC_LByte)+ " CRC_HByte "+Integer.toHexString(CRC_HByte)); 
    
    } 
    short CRC16(short crct, short data) { 
        crct = (short) (((crct^data) | 0xff00) & (crct | 0x00ff)); 
         for (int i = 0; i < 8; i++) { 
         boolean LSB = ((short) (crct & 1)) == 1; 
         crct=(short) ((crct >>> 1)&0x7fff); 
         if (LSB) { 
          crct = (short) (crct^POLYNOM); 
         } 
        } 
        return crct; 
    } 
    

    }