También te recomiendo modularizar tu código en varias rutinas independientes, para evitar que una sola funcion tenga todo el código, por ejemplo,
podrias crear una funcion ProcesarRPM() fuera de PlcMain() para agrupar el procesamiento de RPM en un lugar por separado.
Esto independiza el codigo y tambien lo emprolija, asi a futuro te es mas facil modificarlo sin afectar a otras partes.
Deberias separar tambien la parte que obtenes o modificas datos en el HMI.
Es posible poner rutinas en archivos separados tambien.
A modo de ejemplo, te modifiqué el codigo para que tengas una idea:
PlcMain()
PlcMain()
{
// Inicializar rutinas Virtual-HMI.
VirtualHmiInit()
new Select
new RPM
// new x
//new y
// Activar contador, cuenta por flanco ascendente.
Count1Enable(COUNT_EDGE_RISING)
//
// Inicializar Servidor ModBus RTU.
//
// Velocidad 9600 bps, formato 8E1 y direccion ModBus RTU 1.
//
// Interfaz: RS-232 (consulte hoja de datos de dispositivo)
//
// A partir de este momento, el servidor esta activo.
//
if(MbRtuServInit(1, 9600, SERIAL_8E1, MB_RTU_INTERFACE_RS232) < 0)
{
// Error, pausar programa en este punto.
while(true)
{
DelayMS(2000)
LedToggle()
}
}
//
// Loop Principal.
//
Count1Reset()
for(;;)
{
RPM = FloatToInt(Count1GetEventRPM())
// Cargar regustro Rpm
MbRtuServLoadRegister(42001, RPM())
// Leer Holding Register en direccion 42020.
MbRtuServGetRegister(42020, Select)
// Procesar RPM
ProcesarRPM(Select, RPM)
// Pausar ejecucion
DelayMS(250)
}
// Retorno.
return 0
}
ProcesarRPM()
ProcesarRPM(Select, RPM)
{
switch (Select)
{
case 1:
{
if (RPM<180)
{
DoutSetOn(DOUT1)
}
if (RPM()>200)
{
DoutSetOn(DOUT2)
}
else
{
DoutSetOn(DOUT3)
}
}
case 2:
{ if (RPM()<200)
{
DoutSetOn(DOUT1)
}
if (RPM()>200)
{
DoutSetOn(DOUT2)
}
else
{
DoutSetOn(DOUT3)
}
}
case 3:
{ if (RPM()<220)
{
DoutSetOn(DOUT1)
}
if (RPM()>200)
{
DoutSetOn(DOUT2)
}
else
{
DoutSetOn(DOUT3)
}
}
case 4:
{ if (RPM()<240)
{
DoutSetOn(DOUT1)
}
if (RPM()>200)
{
DoutSetOn(DOUT2)
}
else
{
DoutSetOn(DOUT3)
}
}
default:
{
DoutSetOn(DOUT1)
}
}
}