private void dgv_BinaryValues_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            var protocol_id          = dgv_BinaryValues.Rows[e.RowIndex].Cells["protocol_id"].Value.ToString();
            var signalIdentification = dgv_BinaryValues.Rows[e.RowIndex].Cells["identification"].Value.ToString();

            switch (protocol_id)
            {
            // ModbusTCP
            case "1":
                ModbusBinarySignal binarySignal = DBHelper_OnlineValues.GetBinarySignalInfoByIdentification <ModbusBinarySignal>(signalIdentification);
                if (binarySignal != null)
                {
                    frm_AddNewOrUpdateModbusBinarySignal frm_UpdateBinarySignal = new frm_AddNewOrUpdateModbusBinarySignal(binarySignal);
                    frm_UpdateBinarySignal.ShowDialog();
                }
                else
                {
                    if (Resources.frm_OnlineValues__dgv_BinaryValues_CellContentDoubleClick_ != null)
                    {
                        MessageBox.Show(Resources.frm_OnlineValues__dgv_BinaryValues_CellContentDoubleClick_,
                                        Constants.MessageBoxHeader, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                break;

            // SNMP
            case "2":
                MessageBox.Show("SNMP not implemented yet");
                break;
            }
        }
        public frm_AddNewOrUpdateModbusBinarySignal(ModbusBinarySignal signal)
        {
            InitializeComponent();

            InitializeDatabase();

            InitializeControlProperties();

            this.Text        = "Binary Sinyal Güncelle";
            this.btn_OK.Text = "Güncelle";
            binarySignal     = signal;

            UpdateControlsWithSignalInfo();
        }
        public frm_AddNewOrUpdateModbusBinarySignal()
        {
            InitializeComponent();

            InitializeDatabase();

            ID = DBHelper_AddNewOrUpdateModbusBinarySignalForm.GetNextBinarySignalID();

            InitializeControlProperties();

            binarySignal = new ModbusBinarySignal();

            btn_Delete.Hide();
            btn_Delete.Enabled = false;
        }
Пример #4
0
        private object CreateBinarySignal(Device device)
        {
            Signal        signal;
            List <Signal> signals;
            List <Signal> signalsContainName_YeniSinyal;

            switch (device.ID)
            {
            case 1:     // ModbusTCP
                signal = new ModbusBinarySignal();
                break;

            case 2:     // SNMP
                signal = new Signal();
                break;

            default:
                signal = new Signal();
                break;
            }

            signals = dbHelper.GetDeviceBinarySignalsInfo <Signal>(device);

            // Cihaz içerisinde aynı tipteki sinyaller aynı identification'ı alamazlar.
            // 'Yeni Sinyal' isimli başka bir sinyal varsa yeni oluşturulucak sinyalin ismi 'Yeni Sinyalx' olarak değiştiriliyor.
            // x => Sayı
            signalsContainName_YeniSinyal = signals.Where((s) => s.Name.Contains("Yeni Sinyal")).ToList();
            if (signalsContainName_YeniSinyal.Count > 0)
            {
                signal.Name = "Yeni Sinyal" + signalsContainName_YeniSinyal.Count.ToString();
            }

            // Sinyal ID'si oluşturuluyor
            signal.ID = dbHelper.GetNextBinarySignalID();

            // İstasyon ve cihaz bilgileri sinyale atanıyor.
            signal.DeviceName  = device.Name;
            signal.deviceID    = device.ID;
            signal.StationName = TemporaryValues.stations.Find((s) => s.ID == device.StationID).Name;

            // ID sıfırdan büyük ise başarılı bir şekilde veritabanından yeni ID değeri okunmuştur.
            // ID sıfır ise yeni ID değeri alınamamıştır ve sinyal oluşturulmaz.
            return(signal.ID > 0 ? signal : null);
        }
Пример #5
0
        /// <summary>
        /// Reads the binary signals.
        /// </summary>
        /// <param name="_device">The device.</param>
        /// <param name="_numberOfFirstSignal">The number of first signal.</param>
        /// <param name="_totalSignalCount">The total signal count.</param>
        /// <returns></returns>
        /// <exception cref="Exception">ModbusServer Hata: Yanlış tanımlanan adres veya Function Code bulundu</exception>
        private List <ModbusBinarySignal> ReadBinarySignalsValuesFromModbusDevice(ModbusTCPDevice _device, int _numberOfFirstSignal, int _totalSignalCount)
        {
            List <BinarySignal> _valueChangedBinarySignals = new List <BinarySignal>();
            ModbusBinarySignal  _firstSignal = _device.BinarySignals[_numberOfFirstSignal];

            bool[] values = { };
            //ushort wordCount = TotalWordCount(_device.BinarySignals, _numberOfFirstSignal, _totalSignalCount);

            // Function Code'un 1 ve ya 2 olduğunda yapılan işlemler
            try
            {
                if (_firstSignal.FunctionCode == 1 || _firstSignal.FunctionCode == 2)
                {
                    switch (_firstSignal.FunctionCode)
                    {
                    case 1:
                        values = master.ReadCoils(_device.SlaveID, _firstSignal.Address, Convert.ToUInt16(_totalSignalCount));
                        break;

                    case 2:
                        values = master.ReadInputs(_device.SlaveID, _firstSignal.Address, Convert.ToUInt16(_totalSignalCount));
                        break;

                    default:
                        throw new Exception("ModbusTCPMaster Hata: Beklenmedik function code... ");
                    }

                    // Okunan degerler ile  eski degerler karsılastırılıyor. Sinyalin degeri değişmiş ise sinyal OnBinarySignalsValueCanged
                    // eventine gonderilmek üzere _valueChangedSignals listesine ekleniyor.
                    for (int k = 0; k < values.Length; k++)
                    {
                        int currentSignalNo = _numberOfFirstSignal + k;

                        if (_device.BinarySignals[currentSignalNo].IsReversed)
                        {
                            values[k] = !values[k];
                        }

                        if (_device.BinarySignals[currentSignalNo].CurrentValue != values[k])
                        {
                            _device.BinarySignals[currentSignalNo].CurrentValue = values[k];
                            _device.BinarySignals[currentSignalNo].TimeTag      = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                            _valueChangedBinarySignals.Add(_device.BinarySignals[currentSignalNo]);
                        }
                    }
                }

                // Function Code 3 olduğunda yapılan işlemler
                else if (_firstSignal.FunctionCode == 3)
                {
                    ushort numberOfPoints = 0;
                    // Okunacak toplam register sayısı alınır.
                    // Bit okuma varsa max bit_number sayısından toplam okunacak register sayısı alınıyor
                    if (_device.BinarySignals[_numberOfFirstSignal].comparisonType == ModbusBinarySignal.ComparisonType.bit)
                    {
                        numberOfPoints = Convert.ToUInt16(_device.BinarySignals[_numberOfFirstSignal + _totalSignalCount - 1].ComparisonBitNumber / 16 + 1);
                    }
                    // Value okuma varsa word_count sayısından toplam okunacak register sayısı alınıyor
                    else
                    {
                        numberOfPoints = Convert.ToUInt16(_device.BinarySignals[_numberOfFirstSignal].WordCount);
                    }

                    if (numberOfPoints > 0)
                    {
                        ushort[] register = master.ReadHoldingRegisters(_device.SlaveID, _firstSignal.Address, numberOfPoints);

                        for (int k = 0; k < _totalSignalCount; k++)
                        {
                            bool value;
                            int  currentSignalNo = _numberOfFirstSignal + k;

                            // bit okuma yapılacaksa;
                            if (_device.BinarySignals[currentSignalNo].comparisonType == ModbusBinarySignal.ComparisonType.bit)
                            {
                                // Okunacak bitin kaçıncı registerda oldugu hesaplanıyor.
                                int _wordNumber = _device.BinarySignals[currentSignalNo].ComparisonBitNumber / 16;

                                // Okunacak bit ilk registerda yer alıyorsa direk okuma işlemi yapılır.
                                if (_wordNumber == 0)
                                {
                                    value = (register[_wordNumber] & (1 << _device.BinarySignals[currentSignalNo].ComparisonBitNumber)) > 0;
                                }
                                // Okunacak bit ilkregisterda yyer almıyorsa okunacak bitin register içerisinde kaçıncı sırada  oldugu hesaplanır ve okuma işlemi yapılır.
                                else
                                {
                                    int bitNumber = (_device.BinarySignals[currentSignalNo].ComparisonBitNumber) - 16 * _wordNumber;
                                    value = (register[_wordNumber] & (1 << bitNumber)) > 0;
                                }
                            }
                            // value okuma yapılacaksa;
                            else
                            {
                                // Okunan register dizisi unsigned sayıya cevriliyor.
                                double readValue = 0;
                                for (int i = 0; i < register.Length; i++)
                                {
                                    readValue += register[i] * Math.Pow(256, i);
                                }

                                if (readValue == _device.BinarySignals[currentSignalNo].ComparisonValue)
                                {
                                    value = true;
                                }
                                else
                                {
                                    value = false;
                                }
                            }

                            if (_device.BinarySignals[currentSignalNo].IsReversed)
                            {
                                value = !value;
                            }

                            if (_device.BinarySignals[currentSignalNo].CurrentValue != value)
                            {
                                _device.BinarySignals[currentSignalNo].CurrentValue = value;
                                _device.BinarySignals[currentSignalNo].TimeTag      = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                                _valueChangedBinarySignals.Add(_device.BinarySignals[currentSignalNo]);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                if (e.Source.Equals("System"))
                {
                    // System tarafından gönderilen exception mesajı sinyal okuyamama ile ilgili bir exception değilse bu exceptionu üst methoda gönderir
                    if (e.HResult != -2146232800)
                    {
                        throw e;
                    }
                }

                //
                if (_device.Connected)
                {
                    Log.Instance.Error("{0}: {1}-{2} adlı device haberleşme hatası => {3} ", this.GetType().Name, _device.ID, _device.Name, e.Message);
                    _device.Connected = false;
                    OnDeviceConnectionStateChanged(_device);
                    throw e;
                }
            }

            // Function Code tanımsız oldugunda yaplan işlemler
            if (!(_firstSignal.FunctionCode == 1 || _firstSignal.FunctionCode == 2 || _firstSignal.FunctionCode == 3))
            {
                Log.Instance.Error("{0} Hata: Yanlış tanımlanan adres veya geçersiz function Code bulundu", this.GetType().Name);
            }

            // Okuma işlemi bittiğinde _valueChangedSignals listesine sinyal eklenmişse bu sinyallerin database buffera eklenmesi için event çağrılır.
            if (_valueChangedBinarySignals.Count > 0)
            {
                OnAnyBinarySignalValueChanged(_valueChangedBinarySignals);
                _valueChangedBinarySignals.Clear();
            }

            values = null;

            return(_device.BinarySignals);
        }