Ok..ce sera long mais je dois d'abord expliquer quelques notions de base.Multithreading et ports série
Cette partie de mon logiciel est destinée à trier des articles qui descendent d'une bande transporteuse. J'utilise Modbus pour la bande transporteuse. Modbus ouvrira les portes à une heure précise pour laisser passer un objet à travers la porte. Les articles passeront par certaines portes en fonction du poids.
Je surveille un capteur pour déterminer quand un article est sur une balance. Lorsque le capteur est bloqué, l'article est pesé et envoyé à la porte appropriée. Les minuteries sont réglées pour ouvrir/fermer la porte.
Mon code fonctionnera pour ceci..le problème est, il ne fonctionnera pas pour plusieurs articles. Je veux dire par là qu'une porte est ouverte, le détecteur n'est pas surveillé tant que la porte n'est pas fermée. Donc, pendant que l'article A est sur le chemin de la porte, l'article B ne sera pas pesé sur l'échelle quand il bloque le capteur. Je pourrais avoir jusqu'à 8 articles sur la ligne à la fois. Voici le code que je suis maintenant en cours d'exécution:
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
}
}
Ce code fonctionne très bien, je dois juste être en mesure de rendre compte de plusieurs éléments sur la ligne. Des suggestions ????
J'ai aussi essayé les éléments suivants:
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();
}
Quand je l'ai fait, j'ai commencé les deux fils lorsque le bouton de démarrage a été pressé. Je reçois toutes sortes d'exceptions et le programme finit par lancer SEHException et se bloque. Les autres erreurs que je reçois disent "Port série déjà ouvert" ou "Erreur E/S".
Le problème est que les blocs de fil à grande échelle pendant DetermineGate(), SetOpenDelay() et SetDuration()? Je ne comprends pas encore complètement votre code. Il semble que ce soit encore très procédural même si vous utilisez des threads - il semble que les threads attendent toujours les uns des autres. Est-ce que c'est ce qui se passe? –
FYI, voici un excellent lien sur le multithreading en C#: http://www.yoda.arachsys.com/csharp/threads/index.shtml –
Ceci est ma première fois multithreading.J'en avais besoin là où mon interface graphique ne serait pas bloquée. Je ne suis pas sûr de ce que vous entendez par "les blocs d'échelle de fil" Les fils sont en attente les uns des autres .. mais quand j'ai essayé de le réparer, j'ai juste eu un tas d'erreurs (voir mon édition). J'ai besoin de ce logiciel pour pouvoir faire fonctionner une bande transporteuse. Il devrait tenir compte des éléments passant par le capteur à un taux de dire ... 1 article toutes les 3 secondes. Donc, toutes les portes doivent s'ouvrir/se fermer lorsque l'objet arrive à sa porte. Je sais que cela semble déroutant ... comprenez-vous ce que j'essaie d'accomplir? Merci pour le lien – CSharpDev