trensim.comSimulación Ferroviaria
   

Implementación de controles: control de aceleración máxima.

Foro destinado a la discusión de aspectos relacionados con la creación de scripts en RailWorks.

Moderador: Moderadores

Implementación de controles: control de aceleración máxima.

Notapor 444.518 » Mar Feb 07, 2012 10:56 am

Gran cantidad del material de tracción que poseemos ( tanto 'freeware' como 'payware' ), vienen completamente 'desnudos' de 'scripts'. Es una pena que buenos modelos carezcan de determinados controles y características. Pero esto los transforma en potenciales 'sujetos del pruebas' para trasteos variados :mrgreen:

Después de trastear con controles de potencia, he desarrollado un control de aceleración máxima, que corta el regulador en caso de soprepasar una aceleración máxima dada. Este 'script' es de simulación, no de material. Personalmente me he inclinado a escribir todo lo relacionado con controles físicos en el 'script' de simulación y todo lo relacionado con el funcionamiento de controles sobre nodos y objetos en el 'script' del material. Aquí va:
Código: Seleccionar todo
function Setup ()

end


function Update (inteval)

regulador = Call( "*:GetControlValue", "Regulator", 0 ) -- carga el valor del regulador

-- Control de aceleracion
if Call ( "*:GetAcceleration", 0 ) > 0.5 then -- llama al valor de aceleracion y establece la maxima aceleracion en 0.5 m/s^2
regulador = regulador - 0.01 -- baja el regulador un 1 por ciento
end

Call( "*:SetControlValue", "Regulator", 0, regulador ) -- aplica el regulador con el nuevo valor

end



Este 'script' es muy apropiado para el uso en locomotoras de gran potencia (BR101, por ejemplo) en tracción de pasajeros, proporcionando un control adecuado de confort. También impide que en maniobras, la locomotora aislada se nos descontrole.
He usado el valor de la variable del sistema 'Acceleration' en vez del control 'Accelerometer' por dos razones. La primera porque el dato del sistema es muy fácil de manejar y se encuentra en todos los vehículos. Y la segunda, porque el valor del control 'Accelerometer' no ofrece un valor real, si no un equivalente a la fuerza de tracción del vehículo en kN.
Un saludo, J.
Imagen
El problema de tener una mente abierta, es que la gente se empeña en llegar y tratar de poner cosas dentro.
-- Terry Pratchett
Avatar de Usuario
444.518
 
Mensajes: 1251
Registrado: Mar Jun 28, 2011 7:05 pm
Ubicación: Hospital de Móstoles

Re: Implementación de controles: DRA

Notapor 444.518 » Mar Feb 07, 2012 11:44 am

El 'DRA' o Driver reminder appliance es un sistema que poseen los actuales trenes británicos y es obligario usarse cuando se sale o se entra de la cabina, cuando pasamos una señal amarilla o en la aproximación de una señal roja o parada en estación. Al activar el DRA se corta el regulador y se memoriza su valor, que es de nuevo aplicado cuando el DRA se desactiva. Hay varios trenes en RW3 con este sistema (170, 156, 67 adv, 150). Ayer le implementé este sistema a una Class 90 (además del anterior de control de aceleración), con resultados bastante buenos. Para activar el DRA he usado el control de la campana 'Bell', activable tanto desde teclado con la tecla 'B' como desde el 'HUD F4'. Fue necesario añadir el control al 'blueprint' de la locomotora, pero fue fácil. Copié el control 'Bell' de una locomotora estadounidense y se lo pegué a la Class 90. El 'script' (una vez más en simulación), queda así:

Código: Seleccionar todo
function Setup ()

draflag = 0 -- flag que indica la posición inicial del DRA. 0 es apagado.

end

function Update (inteval)


regulador = Call( "*:GetControlValue", "Regulator", 0 ) -- llama al valor del regulador


dra = Call( "*:GetControlValue", "Bell", 0 ) -- llama al valor del DRA

if dra == 1 and draflag == 0 then -- si el dra se enciende y antes estaba apagado
recuerdoregulador = regulador --guarda el valor del regulador
regulador = 0 -- regulador a cero
draflag = 1 -- flag de activo a uno
end

if dra == 1 and draflag == 1 then -- si el dra siguen encendido
regulador = 0 -- regulador a cero
end

if dra == 0 and draflag == 1 then -- si el dra es apagado y antes estaba encendido
regulador = recuerdoregulador -- aplica el valor del regulador antes de activar el dra
draflag = 0 -- pone la bandera del dra a cero para iniciar el sistema
end


Call( "*:SetControlValue", "Regulator", 0, regulador ) -- aplica el regulador si hay cambios

end


El control 'Bell' se debe poner en posición '1' de activo en 'default', para así encontrar siempre aplicado el DRA al acceder a la cabina.
Un saludo, J.
Imagen
El problema de tener una mente abierta, es que la gente se empeña en llegar y tratar de poner cosas dentro.
-- Terry Pratchett
Avatar de Usuario
444.518
 
Mensajes: 1251
Registrado: Mar Jun 28, 2011 7:05 pm
Ubicación: Hospital de Móstoles

Re: Implementación de controles: control de aceleración máxi

Notapor 2TE116 » Mar Feb 07, 2012 9:56 pm

muy interesante. en el primer caso estos controles son reales en las locomotoras? y el del segundo caso me parece muy interesante y realista. compartirás estas mejoras? o simplemente con copiar los comandos en el blueprint adecuado vale?

un saludo
Diversifiquemos los ferrocarriles...
Avatar de Usuario
2TE116
 
Mensajes: 1240
Registrado: Mar Sep 09, 2008 10:23 pm
Ubicación: Las Matas Clasificación

Re: Implementación de controles: control de aceleración máxi

Notapor 444.518 » Mar Feb 07, 2012 11:52 pm

El 'script' de aceleración máxima es poco más o menos una 'demo' de como se puede tratar un regulador para mantenerlo bajo control. Mi idea es utilizar una versión mejorada del mismo con objeto de hacer un regulador automático, tal y como funciona en diversos trenes de cercanias y metro. Con solo activar un control, el sistema se encarga de arrancar de velocidad cero, regulando la potencía con una aceleración máxima determinada hasta alcanzar la velocidad deseada. Para hacer esto hay que reformar el 'blueprint' del vehículo, virtualizando algunos controles, y mapear el teclado con esos nuevos controles. Con esto se consigue la gestión de los controles del vehículo de manera diferente al que utiliza el sistema, tratando estos controles desde un 'script'. Ya estoy en ello, aunque con otro tipo de control de tracción 8)

El DRA... Pues tiene un candidato muy, pero que muy apropiado para recibir este sistema: el Class 158. Un tren tipo 'sprinter' desprovisto de cualquier programación de 'script'. Tras la actualización, le pasaremos por talleres :wink:
Un saludo, J.
Imagen
El problema de tener una mente abierta, es que la gente se empeña en llegar y tratar de poner cosas dentro.
-- Terry Pratchett
Avatar de Usuario
444.518
 
Mensajes: 1251
Registrado: Mar Jun 28, 2011 7:05 pm
Ubicación: Hospital de Móstoles

Re: Implementación de controles: control de aceleración máxi

Notapor EBICAB900 » Mié Feb 08, 2012 3:38 pm

Interesante. Este control de aceleración podría más bien implementarse para tener la opción de aceleración reducida? Como por ejemplo en el civia, que a parte de tener velocidad prefijada también lleva la opción de aceleración reducida
EBICAB900
 
Mensajes: 30
Registrado: Jue Jul 21, 2011 11:40 am

Re: Implementación de controles: control de aceleración máxi

Notapor 444.518 » Mié Feb 08, 2012 4:28 pm

EBICAB900 escribió:Interesante. Este control de aceleración podría más bien implementarse para tener la opción de aceleración reducida? Como por ejemplo en el civia, que a parte de tener velocidad prefijada también lleva la opción de aceleración reducida

Una pequeña modificación de este 'script', con un control virtual manejando la cantidad de aceleración que deseamos, sirve perfectamente para lo que indicas. Controlando automáticamente el regulador a través de controles virtuales es posible indicar al tren la velocidad máxima y la aceleración máxima que debe usar. Incluso ahora mismo estoy pensando en que se puede usar el control del inversor, podiendole muescas, como control de aceleración:

Código: Seleccionar todo
regulador = Call( "*:GetControlValue", "Regulator", 0 )
controlaceleracion = Call( "*:GetControlValue", "Reverser", 0 )
--
if controlaceleracion < 0 then
controldeaceleración = controldeaceleracion * ( -1 )
end

if Call( "*:GetAcceleration", 0 ) > controldeaceleracion then
regulador = regulador - 0.01
end

Call( "*:SetControlValue", "Regulator", 0, regulador )

end

Poniendo 21 muescas, el inversor puede proporcionar la aceleración máxima deseada del vehículo en metros por segundo al cuadrado, siendo el valor más grande 1 m/s2 y el valor más pequeño 0.1 m/s2, con intérvalos de 0.1 m/s2 por cada muesca. El problema se presenta cuando el vehículo va hacia atrás, porque el 'core' del simulador no reconoce valores negativos en la variable 'Acceleration'. Aunque para eso también puede haber solución :mrgreen:
Un saludo, J.
Imagen
El problema de tener una mente abierta, es que la gente se empeña en llegar y tratar de poner cosas dentro.
-- Terry Pratchett
Avatar de Usuario
444.518
 
Mensajes: 1251
Registrado: Mar Jun 28, 2011 7:05 pm
Ubicación: Hospital de Móstoles


Volver a LUA Scripting RW

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados