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; }
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); }
/// <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); }