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의 차이점은 무엇입니까?