わかりました..これは長くなりますが、最初に背景を説明する必要があります.
私のソフトウェアのこの部分は、コンベア ベルトを下っていくアイテムを分類するためのものです。コンベアベルトにはModbusを使用しています。Modbus は特定の時間にゲートを開き、アイテムがゲートを通過できるようにします。アイテムは重量に基づいて特定のゲートを通過します。
アイテムがはかりに載っていることを判断するためにセンサーを監視しています。センサーがブロックされると、アイテムは計量され、適切なゲートに送られます。ゲートの開閉にはタイマーが設定されています。
私のコードはこれで機能します..問題は、複数のアイテムでは機能しないことです。つまり、ゲートが開いている間は、ゲートが閉じられるまでセンサーは監視されません。そのため、アイテム A がゲートに向かう途中で、アイテム B がセンサーをブロックしても、アイテム 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 をスローしてクラッシュします。私が得る他のエラーは、「シリアルポートはすでに開いています」または「I / Oエラー」と言います。