//------------------------------------------------------------------------------------------------------ /// <summary> /// Читает визитную карточку NGK-устройства /// </summary> /// <param name="host"></param> /// <param name="error"></param> /// <param name="addressSlave"></param> /// <param name="card"></param> public static void Read_IRs_CallingCard( ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out OperationResult error, Byte addressSlave, out CallingCard card) { ushort[] registers; Modbus.OSIModel.Message.Result result; String msg; UInt16 startAddress = 0x0000; // Адрес начального входного регистра визитной карточки UInt16 length = 7; result = host.ReadInputRegisters(addressSlave, startAddress, length, out registers); if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError) { if (registers.Length != 7) { msg = String.Format( "Ответ БИ содержит количесво прочитанных регистров {0}, должно быть 7", registers.Length); card = null; error = new OperationResult(OPERATION_RESULT.FAILURE, msg); } else { // Рассчитываем контрольную сумму. List<Byte> arr = new List<Byte>(); // Получаем массив байт (без регистра с CRC16) for (int i = 0; i < (registers.Length - 1); i++) { arr.AddRange(Modbus.Convert.ConvertToBytes(registers[i])); } // Рассчитываем CRC16 и сравниваем с прочитанным Byte[] crc16calc_b = Modbus.OSIModel.DataLinkLayer.CRC16.CalcCRC16(arr.ToArray()); UInt16 crc16calc = 0; crc16calc = crc16calc_b[1]; // Hi_byte crc16 crc16calc = (UInt16)(crc16calc << 8); crc16calc |= crc16calc_b[0]; // Lo_byte crc16 // Проверяем контрольную сумму (прочитанную и рассчитаную) if (registers[registers.Length - 1] == crc16calc) { // Контрольная сумма сошлась, получаем данные визтной карты card = new CallingCard(); // Получаем тип устройства try { card.TypeOfDevice = (TYPE_NGK_DEVICE)Enum.Parse(typeof(TYPE_NGK_DEVICE), registers[0].ToString()); } catch { msg = String.Format( "Неизвестный тип устройства, код типа устройства: {0}", registers[0]); error = new OperationResult(OPERATION_RESULT.FAILURE, msg); return; } // Получаем версию ПО card.SofwareVersion = ((float)registers[1]) / 100; // Получаем версию Аппаратуры card.HardwareVersion = ((float)registers[2]) / 100; // Получаем серийный номер card.SerialNumber = 0; card.SerialNumber = registers[3]; card.SerialNumber |= (card.SerialNumber << 16); card.SerialNumber |= registers[4]; card.SerialNumber |= (card.SerialNumber << 16); card.SerialNumber |= registers[5]; error = new OperationResult(OPERATION_RESULT.OK, String.Empty); } else { msg = "Конрольная сумма визитной краточки не совпала с рассчётной"; card = null; error = new OperationResult(OPERATION_RESULT.FAILURE, msg); } } } else { // При выполнени чтения устройства возникли проблемы... card = null; error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); } return; }
//---------------------------------------------------------------------------- /// <summary> /// Читает визитную карточку устройства /// </summary> /// <param name="result">Результат выполения операции чтения визитной карточки устройства</param> /// <param name="deviceInfo">Визитная карточка устройства</param> public void ReadCallingCard( out OperationResult result, out CallingCard deviceInfo) { this.LockGUI(); this.Cursor = Cursors.WaitCursor; NGK.MeasuringDeviceTech.Classes.MeasuringDevice.CallingCardOfDevice.Read_IRs_CallingCard( ref _Host, out result, 1, out deviceInfo); this.Cursor = Cursors.Default; this.UnLockGUI(); return; }
//------------------------------------------------------------------------------------------------------ /// <summary> /// Читает визитную карточку NGK-устройства /// </summary> /// <param name="host"></param> /// <param name="error"></param> /// <param name="addressSlave"></param> /// <param name="card"></param> public static void Read_IRs_CallingCard( ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out OperationResult error, Byte addressSlave, out CallingCard card) { ushort[] registers; Modbus.OSIModel.Message.Result result; String msg; UInt16 startAddress = 0x0000; // Адрес начального входного регистра визитной карточки UInt16 length = 7; result = host.ReadInputRegisters(addressSlave, startAddress, length, out registers); if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError) { if (registers.Length != 7) { msg = String.Format( "Ответ БИ содержит количесво прочитанных регистров {0}, должно быть 7", registers.Length); card = null; error = new OperationResult(OPERATION_RESULT.FAILURE, msg); } else { // Рассчитываем контрольную сумму. List <Byte> arr = new List <Byte>(); // Получаем массив байт (без регистра с CRC16) for (int i = 0; i < (registers.Length - 1); i++) { arr.AddRange(Modbus.Convert.ConvertToBytes(registers[i])); } // Рассчитываем CRC16 и сравниваем с прочитанным Byte[] crc16calc_b = Modbus.OSIModel.DataLinkLayer.CRC16.CalcCRC16(arr.ToArray()); UInt16 crc16calc = 0; crc16calc = crc16calc_b[1]; // Hi_byte crc16 crc16calc = (UInt16)(crc16calc << 8); crc16calc |= crc16calc_b[0]; // Lo_byte crc16 // Проверяем контрольную сумму (прочитанную и рассчитаную) if (registers[registers.Length - 1] == crc16calc) { // Контрольная сумма сошлась, получаем данные визтной карты card = new CallingCard(); // Получаем тип устройства try { card.TypeOfDevice = (TYPE_NGK_DEVICE)Enum.Parse(typeof(TYPE_NGK_DEVICE), registers[0].ToString()); } catch { msg = String.Format( "Неизвестный тип устройства, код типа устройства: {0}", registers[0]); error = new OperationResult(OPERATION_RESULT.FAILURE, msg); return; } // Получаем версию ПО card.SofwareVersion = ((float)registers[1]) / 100; // Получаем версию Аппаратуры card.HardwareVersion = ((float)registers[2]) / 100; // Получаем серийный номер card.SerialNumber = 0; card.SerialNumber = registers[3]; card.SerialNumber |= (card.SerialNumber << 16); card.SerialNumber |= registers[4]; card.SerialNumber |= (card.SerialNumber << 16); card.SerialNumber |= registers[5]; error = new OperationResult(OPERATION_RESULT.OK, String.Empty); } else { msg = "Конрольная сумма визитной краточки не совпала с рассчётной"; card = null; error = new OperationResult(OPERATION_RESULT.FAILURE, msg); } } } else { // При выполнени чтения устройства возникли проблемы... card = null; error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); } return; }