Хорошо... это будет длинно, но сначала мне нужно объяснить некоторые предпосылки.
Эта часть моей программы предназначена для сортировки предметов, движущихся по конвейерной ленте. Я использую 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 и аварийно завершает работу. Другие ошибки, которые я получаю, говорят: «Последовательный порт уже открыт» или «Ошибка ввода-вывода».