протоколу ModBus RTU с ним пообщаться. Для этих целей мной был написан следующий класс
Код: Выделить всё
public class ModBus {
private static Byte CRCHigh;//Переменная контрольной суммы
private static Byte CRCLow;//Переменная контрольной суммы
public static byte[] ModbusCommand8(byte id, byte command, byte startAddress, byte length)
{
byte[] data = new byte[8];
//Адрес устройства
data[0] = id;
//Код функции Modbus
data[1] = command;
//Начальный адрес регистра
byte[] _adr = BitConverter.getBytes(startAddress);
data[2]=_adr[1] ;//[1] младший
data[3] =_adr[0];//[0] старший
//Колличество регистров которое необходимо считать
byte[] _length = BitConverter.getBytes(length);
data[4]=_length[1];//[1]
data[5] =_length[0];//[0]
//Контрольная сумма CRC
myCRC(data, 6);
data[6] = CRCLow;//[1]
data[7] = CRCHigh;//[0]
try {Thread.sleep( 200 );}
catch (InterruptedException e){}
return data;
}
//Метод расчёта контрольной суммы CRC-16
public static void myCRC(byte[] message, int length)
{
char CRCFull = (char)0xFFFF;
for (int i = 0; i < length; i++)
{
CRCFull = (char)(CRCFull ^ message[i]);
for (int j = 0; j < 8; j++)
{
if ((CRCFull & 0x0001) == 0)
CRCFull = (char)(CRCFull >> 1);
else
{
CRCFull = (char)((CRCFull >> 1) ^ 0xA001);
}
}
}
CRCHigh = (byte)((CRCFull >> 8) & 0xFFFF);
CRCLow = (byte)(CRCFull & 0xFFFF);
}
}
Код: Выделить всё
public void Move (Byte slaveAddress){
arrModbusCommand =modBus.ModbusCommand8( slaveAddress,(byte) 6,(byte)5,(byte)1 );
try {serialPort.writeBytes( arrModbusCommand );}
catch (SerialPortException ex){ }
}
public void Stop (Byte slaveAddress){
arrModbusCommand =modBus.ModbusCommand8( slaveAddress,(byte)06,(byte)5,(byte)0 );
try {serialPort.writeBytes( arrModbusCommand );}
catch (SerialPortException ex){ }
}
А вот следующий метод работает не нормально т.е вообще не работает
Код: Выделить всё
public void SetSpeed(Byte slaveAddress){
arrModbusCommand =modBus.ModbusCommand16( slaveAddress,(byte) 16,(byte)16385,(byte)100 );
System.out.println( Arrays.toString( arrModbusCommand ) );
try {serialPort.writeBytes( arrModbusCommand );}
catch (SerialPortException ex){ }
}
регистр 16385 значение скорости например 100, но скорость не меняется я понимаю, что проблема скорей всего в конвертации
значения 16385 в byte но не понимаю как его конвертировать чтобы все заработало) если кто писал что-то на Java проги для общения
с устройствами по ModBus RTU помогите советом или лучше куском кода)))
ссыль на pdf описания контроллера http://onitex.ru/files/Documentation/OS ... M42RA.pdf список команд с 33 страницы начинается
P.S если я все правильно понимаю то мне надо значение 16385 преобразовать в 2-а байта и засунуть вот сюда
byte[] _adr = BitConverter.getBytes(startAddress);
data[2]=_adr[1] ;//[1] младший
data[3] =_adr[0];//[0] старший
Но я не понимаю как это сделать. Представление в виде HEX 4001 результатов не дало.