コード例 #1
0
ファイル: CallingCardOfDevice.cs プロジェクト: serialbus/NGK
        //------------------------------------------------------------------------------------------------------
        /// <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;
        }
コード例 #2
0
ファイル: FormMainConnection.cs プロジェクト: serialbus/NGK
 //----------------------------------------------------------------------------
 /// <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;
 }
コード例 #3
0
        //------------------------------------------------------------------------------------------------------
        /// <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;
        }