/// <summary> /// /// </summary> /// <param name="address">адрес подчиненого</param> /// <param name="function">запрашиваемая функция</param> /// <param name="data">передаваемые данные</param> public void RequestCustomFunction(byte address, byte function, byte[] data) { if (!_waitResponse) { _counterRepeat = 0; int i = 0; _bufferTransmit = new byte[(data == null ? 0 : data.Length) + 5]; _addressSlave = address; _bufferTransmit[i++] = address; _bufferTransmit[i++] = function; _bufferTransmit[i++] = data == null ? (byte)0 : (byte)data.Length; if (data != null) { foreach (byte b in data) { _bufferTransmit[i++] = b; } } _bufferTransmit[i++] = (byte)CRC.GetCRC(_bufferTransmit, _bufferTransmit.Length - 2); _bufferTransmit[i] = (byte)(CRC.GetCRC(_bufferTransmit, _bufferTransmit.Length - 2) >> 8); _requestFunction = function; RepeatRequest(); } else { throw new BusyException(); } }
/// <summary> /// запрос на чтение двоичного содержания регистров подчиненого /// </summary> /// <param name="address">Адрес подчиненого</param> /// <param name="regAddress">начальный адрес регистров</param> /// <param name="numberReg">количество регистров </param> public void ReadHoldingRegisters(byte address, short regAddress, short numberReg) { if (!_waitResponse) { _counterRepeat = 0; int i = 0; _bufferTransmit = new byte[8]; _addressSlave = address; _bufferTransmit[i++] = address; _bufferTransmit[i++] = 0x03; _bufferTransmit[i++] = (byte)(regAddress >> 8); _bufferTransmit[i++] = (byte)(regAddress); _bufferTransmit[i++] = (byte)(numberReg >> 8); _bufferTransmit[i++] = (byte)(numberReg); _bufferTransmit[i++] = (byte)CRC.GetCRC(_bufferTransmit, 6); _bufferTransmit[i] = (byte)(CRC.GetCRC(_bufferTransmit, 6) >> 8); _requestFunction = 3; RepeatRequest(); } else { throw new BusyException(); } }
/// <summary> /// Запрос на запись двоичного содержания регистров подчиненого /// </summary> /// <param name="address">дрес подчиненого</param> /// <param name="regAddress">начальный адрес регистров</param> /// <param name="data">Массив новых значений регистров</param> /// <param name="numberReg">количество регистров</param> public void PresetMultipleRegisters(byte address, short regAddress, short[] data, short numberReg) { if (!_waitResponse) { _counterRepeat = 0; int i = 0; _bufferTransmit = new byte[numberReg * 2 + 9]; _addressSlave = address; _bufferTransmit[i++] = address; _bufferTransmit[i++] = 0x10; _bufferTransmit[i++] = (byte)(regAddress >> 8); _bufferTransmit[i++] = (byte)(regAddress); _bufferTransmit[i++] = (byte)(numberReg >> 8); _bufferTransmit[i++] = (byte)(numberReg); _bufferTransmit[i++] = (byte)(numberReg * 2); int index = 0; while (index != numberReg) { _bufferTransmit[i++] = (byte)(data[index] >> 8); _bufferTransmit[i++] = (byte)(data[index++]); } _bufferTransmit[i++] = (byte)CRC.GetCRC(_bufferTransmit, _bufferTransmit.Length - 2); _bufferTransmit[i] = (byte)(CRC.GetCRC(_bufferTransmit, _bufferTransmit.Length - 2) >> 8); _requestFunction = 0x10; RepeatRequest(); } else { throw new BusyException(); } }