Ok ... esto será largo, pero primero necesito explicar algunos antecedentes.Puertos multiproceso y en serie
Esta parte de mi software es para clasificar artículos que corren por una cinta transportadora. Estoy usando Modbus para la cinta transportadora. Modbus abrirá puertas en un momento específico para permitir que un artículo atraviese la puerta. Los artículos pasarán por ciertas puertas basadas en el peso.
Estoy monitoreando un sensor para determinar cuándo un artículo está en una balanza. Cuando el sensor está bloqueado, el artículo se pesa y se envía a la puerta correspondiente. Los temporizadores están configurados para abrir/cerrar la puerta.
Mi código funcionará para esto ... el problema es que no funcionará para varios elementos. Con eso quiero decir, mientras una puerta está abierta, el sensor no está siendo monitoreado hasta que la puerta esté cerrada. Por lo tanto, mientras el elemento A está en camino a la puerta, el elemento B no se pesará en la báscula cuando bloquee el sensor. Podría tener hasta 8 artículos en la línea a la vez. Aquí está el código que estoy corriendo ahora:
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
}
}
Este código funciona bien, sólo hay que ser capaz de dar cuenta de varios elementos en la línea. ¿Alguna sugerencia?
También he intentado lo siguiente:
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();
}
Cuando hice esto, empecé a ambos hilos cuando se pulsa el botón de inicio. Recibo todo tipo de excepciones y el programa finalmente arroja SEHException y se cuelga. Los otros errores que recibo dicen "Puerto serie ya abierto" o "Error de E/S".
es el problema de que las secuencias de roscado escala durante DetermineGate(), SetOpenDelay() y SetDuration()? Todavía no entiendo completamente tu código. Parece que sigue siendo muy de procedimiento aunque esté utilizando subprocesos: parece que los subprocesos siempre están esperando el uno al otro. ¿Esto es lo que está pasando? –
FYI, aquí hay un gran enlace en multiprocesamiento en C#: http://www.yoda.arachsys.com/csharp/threads/index.shtml –
Esta es mi primera vez multiproceso.Lo necesitaba donde mi GUI no se cerraría. No estoy seguro de lo que quiere decir con "bloques de escala de hilo". Los hilos están esperando uno al otro ... pero cuando traté de solucionarlo, acabo de recibir un montón de errores (vea mi edición). Necesito este software para poder ejecutar una cinta transportadora. Debe tener en cuenta los elementos que pasan por el sensor a una velocidad de, por ejemplo, 1 elemento cada 3 segundos. Entonces todas las puertas deben abrirse/cerrarse cuando el artículo llegue a su puerta. Sé que esto suena confuso ... ¿entiendes lo que estoy tratando de lograr? Gracias por el enlace – CSharpDev