Многопоточность и последовательные порты

Хорошо... это будет длинно, но сначала мне нужно объяснить некоторые предпосылки.

Эта часть моей программы предназначена для сортировки предметов, движущихся по конвейерной ленте. Я использую Modbus для конвейерной ленты. Modbus открывает ворота в определенное время, чтобы пропустить предмет через ворота. Предметы будут проходить через определенные ворота в зависимости от веса.

Я слежу за датчиком, чтобы определить, когда товар находится на весах. Когда датчик заблокирован, товар взвешивается и отправляется к соответствующим воротам. Таймеры настроены на открытие/закрытие ворот.

Мой код будет работать для этого... проблема в том, что он не будет работать для нескольких элементов. Под этим я подразумеваю, что пока ворота открыты, датчик не контролируется до тех пор, пока ворота не будут закрыты. Таким образом, пока предмет А находится на пути к воротам, предмет Б не будет взвешиваться на весах, когда он блокирует датчик. Я мог иметь до 8 предметов на линии одновременно. Вот код, который я запускаю сейчас:

private void SensorThread_DoWork(object sender, DoWorkEventArgs e)
{
    if (SensorThread.CancellationPending == true)
        e.Cancel = true;
    else
    {
        ReadSensor();
    }    
}

private void SensorThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //if sensor is blocked
    if (sensorstatus == 0)
    {
        //the timers just start the thread
        scaleTimer.Start();
    }
    else
    {
        sensorTimer.Start();
    }
}

private void ScaleThread_DoWork(object sender, DoWorkEventArgs e)
{
  if (ScaleThread.CancellationPending == true)
    {
        e.Cancel = true;
    }
    else
    {
        ReadScale();
        //SaveWeight();
        prevgate = gate;
        gate = DetermineGate();
        SetOpenDelay();
        SetDuration();
    }
  }

private void ScaleThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //if gate = 0, this means the weight of meat on scale 
    //is not in any weight range. Meat runs off the end.
    if (gate == 0)
    {
        txtStatus.Invoke(new UpdateStatusCallback(UpdateStatus), new object[] { meatweight.ToString() + 
                                                                                "lbs is out of range"});
        sensorTimer.Start();
    }
    else
    {
      //open gate
      //then close gate
    }
  }

Этот код отлично работает, мне просто нужно иметь возможность учитывать несколько элементов в строке. Какие-либо предложения????

Я также пробовал следующее:

private void SensorThread_DoWork(object sender, DoWorkEventArgs e)
{
    if (SensorThread.CancellationPending == true)
        e.Cancel = true;
    else
    {
        ReadSensor();
    }    
}    

private void SensorThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  sensorTimer.Start();
}

  private void ScaleThread_DoWork(object sender, DoWorkEventArgs e)
{
  if (ScaleThread.CancellationPending == true)
    {
        e.Cancel = true;
    }
    else
    {   
        //sensor blocked
        if (sensorstatus == 0)
        {
          ReadScale();
          //SaveWeight();
          prevgate = gate;
          gate = DetermineGate();
          SetOpenDelay();
          SetDuration();

          //if gate = 0, this means the weight of meat on scale 
          //is not in any weight range. Meat runs off the end.
          if (gate == 0)
          {
            txtStatus.Invoke(new UpdateStatusCallback(UpdateStatus), new object[] { meatweight.ToString() + 
                                                                                "lbs is out of range"});
          }
          else
          {
            //open gate
            //close gate
          }
    }
}

private void ScaleThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   scaleTimer.Start();
}

Когда я делал это, я запускал оба потока при нажатии кнопки запуска. Я получаю все виды исключений, и программа в конечном итоге выдает SEHException и аварийно завершает работу. Другие ошибки, которые я получаю, говорят: «Последовательный порт уже открыт» или «Ошибка ввода-вывода».

6
задан dsolimano 25 September 2013 в 16:30
поделиться