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