Advertisement
agmike

Схема ВР292 в ТРС

Sep 17th, 2014
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.50 KB | None | 0 0
  1. /*
  2. V tm 0 0.1   # соединение с ТМ
  3. V mk 0 0.1   # МК
  4. C tm mk 7mm
  5.  
  6. # КДР
  7. V kdr 0 1
  8. C mk_kdr mk kdr 3.5mm 0
  9. C kdr_at kdr at 1mm 0
  10.  
  11. # срывной клапан
  12. V sk 0 0.01
  13. C mk_sk mk sk 0.8mm 0
  14. C sk_tc sk tc 6mm 0
  15. C mk_at_sk tm at 16mm 0
  16.  
  17. # МК - ЗК - ЗР
  18. V zk 0 0.4
  19. V zr 0 0.4
  20. C mk_zk mk zk 1 0
  21. C zk zr 9mm
  22.  
  23. # ТЦ
  24. V tc 0 0.4
  25. C zk_tc zk tc 4mm 0    # ЗК - ТЦ (служебное)
  26. C tc_at tc at 1 0      # ТЦ - Ат (отпуск)
  27. C zk_tc_e zk tc 1 0    # ЗК - ТЦ (экстренное)
  28. */
  29.  
  30. include "splibrary.gs"
  31.  
  32.  
  33. class SPAO_VR292 isclass SPAirObject
  34. {
  35.     define public int ModeK = 0;
  36.     define public int ModeD = 1;
  37.     define public int ModeUV = 2;
  38.     public int Mode = ModeD;
  39.  
  40.     int vTM;
  41.     int vMK;
  42.     int cMK_KDR;
  43.     int cKDR_AT;
  44.     int vSK;
  45.     int cMK_SK;
  46.     int cSK_TC;
  47.     int cMK_AT_SK;
  48.     int cMK_ZK;
  49.     int vZK;
  50.     int vTC;
  51.     int cZK_TC;
  52.     int cTC_AT;
  53.     int cZK_TC_E;
  54.  
  55.     public float OZX = 6.0f;
  56.     public float GZX = 6.0f;
  57.     public float OZFriction = 5.0f;
  58.     public float GZFriction = 16.0f;
  59.    
  60.     define float OZIdleFriction = 5.0f;
  61.     define float OZMovingFriction = 2.0f;
  62.     define float GZIdleFriction = 16.0f;
  63.     define float GZMovingFriction = 8.0f;
  64.    
  65.     define float OZSpeed = 5.0f;
  66.     define float OZGZSpeed = 2.0f;
  67.  
  68.     define float OZLeftBufferForce = 80.0f;
  69.     define float OZLeftBuffer = 3.0f;
  70.     define float OZRightBufferForce = 15.0f;
  71.     define float OZRightBuffer = 17.5f;
  72.  
  73.     define float SKChargePressure = 20.0f;
  74.     define float SKInitialOpenPressure = 110.0f;
  75.     define float SKFullPressure = 20.0f;
  76.     define float SKRatio = 2.0f;
  77.  
  78.     public void Init(SPAirScheme scheme)
  79.     {
  80.         inherited(scheme);
  81.         vTM = scheme.GetNodeId("tm");
  82.         vMK = scheme.GetNodeId("mk");
  83.         cMK_KDR = scheme.GetLinkId("mk_kdr");
  84.         cKDR_AT = scheme.GetLinkId("kdr_at");
  85.         vSK = scheme.GetNodeId("sk");
  86.         cMK_SK = scheme.GetLinkId("mk_sk");
  87.         cSK_TC = scheme.GetLinkId("sk_tc");
  88.         cMK_AT_SK = scheme.GetLinkId("mk_at_sk");
  89.         cMK_ZK = scheme.GetLinkId("mk_zk");
  90.         vZK = scheme.GetNodeId("zk");
  91.         vTC = scheme.GetNodeId("tc");
  92.         cZK_TC = scheme.GetLinkId("zk_tc");
  93.         cTC_AT = scheme.GetLinkId("tc_at");
  94.         cZK_TC_E = scheme.GetLinkId("zk_tc_e");
  95.     }
  96.  
  97.     public void Update(float dt)
  98.     {
  99.         float openMK_KDR = 0.0f;
  100.         float openKDR_AT = 0.0f;
  101.         float openMK_SK = 0.0f;
  102.         float openSK_TC = 0.0f;
  103.         float openMK_AT_SK = 0.0f;
  104.         float openMK_ZK = 0.0f;
  105.         float openZK_TC = 0.0f;
  106.         float openTC_AT = 0.0f;
  107.         float openZK_TC_E = 0.0f;
  108.  
  109.         // updating holes
  110.         float ozgz_x = OZX - GZX;
  111.  
  112.         bool hole_a1_kdr =               ozgz_x < 4.0;
  113.         bool hole_t_zk = 3.5 < ozgz_x;
  114.         bool hole_s_mk = 5.0 < ozgz_x;
  115.  
  116.         bool hole_mk_zk_3d175 = 1.0 < OZX and OZX < 4.0;
  117.         bool hole_mk_zk_d200 =              OZX <= 1.0;
  118.  
  119.         bool hole_tc3_t = 5.5 < GZX and GZX < 11.0;
  120.         bool hole_tc3_sk = 12.0 <= GZX;
  121.         bool hole_tc2_at = 0.0 <= GZX and GZX < 5.0;
  122.         bool hole_a1_at = 0.0 <= GZX and GZX < 5.0;
  123.         bool hole_kdr_s = 0.0 <= GZX and GZX <= 10.0;
  124.         bool hole_tc_e = 15.0 <= GZX;
  125.         bool hole_kdr_at_o = 11.0 <= GZX;
  126.  
  127.         float tmPressure = scheme.GetPressure(vTM);
  128.         float mkPressure = scheme.GetPressure(vMK);
  129.         float skPressure = scheme.GetPressure(vSK);
  130.         float zkPressure = scheme.GetPressure(vZK);
  131.         float tcPressure = scheme.GetPressure(vTC);
  132.  
  133.         // updating air flow through holes)
  134.  
  135.         if (hole_tc3_sk and Mode != ModeUV)
  136.             openSK_TC = 1.0f;
  137.  
  138.         float skPressureDelta = tmPressure - (skPressure + SKRatio * tcPressure);
  139.         if (skPressureDelta > SKChargePressure) {
  140.             openMK_SK = 1.0f;
  141.             if (skPressureDelta > SKInitialOpenPressure) {
  142.                 openMK_AT_SK = (skPressureDelta - SKInitialOpenPressure) / SKFullPressure;
  143.                 if (openMK_AT_SK > 1.0f)
  144.                     openMK_AT_SK = 1.0f;
  145.             }
  146.         }
  147.  
  148.         if (hole_tc_e) {
  149.             if (Mode == ModeK)
  150.                 openZK_TC_E = SPHelper.Hole(5.5f);
  151.             else
  152.                 openZK_TC_E = SPHelper.Hole(2.5f);
  153.         }
  154.  
  155.         if (hole_mk_zk_3d175)
  156.             openMK_ZK = SPHelper.Hole(3 * 1.25f);
  157.         else if (hole_mk_zk_d200)
  158.             openMK_ZK = SPHelper.Hole(2.0f);
  159.  
  160.         if (hole_tc2_at) {
  161.             if (Mode == ModeK)
  162.                 openTC_AT = SPHelper.Hole(3.0f);
  163.             else
  164.                 openTC_AT = SPHelper.Hole(2.5f);
  165.         }
  166.  
  167.         if (hole_t_zk and hole_tc3_t)
  168.             openZK_TC = (ozgz_x - 3.5f) / 4.0f;
  169.         if (hole_s_mk and hole_kdr_s)
  170.             openMK_KDR = 1.0f;
  171.  
  172.         if (hole_a1_at and hole_a1_kdr or hole_kdr_at_o)
  173.             openKDR_AT = 1.0f;
  174.  
  175.         // setting holes
  176.  
  177.         scheme.SetFlowRate(cMK_KDR, openMK_KDR);
  178.         scheme.SetFlowRate(cKDR_AT, openKDR_AT);
  179.         scheme.SetFlowRate(cMK_SK, openMK_SK);
  180.         scheme.SetFlowRate(cSK_TC, openSK_TC);
  181.         scheme.SetFlowRate(cMK_AT_SK, openMK_AT_SK);
  182.         scheme.SetFlowRate(cMK_ZK, openMK_ZK);
  183.         scheme.SetFlowRate(cZK_TC, openZK_TC);
  184.         scheme.SetFlowRate(cTC_AT, openTC_AT);
  185.         scheme.SetFlowRate(cZK_TC_E, openZK_TC_E);
  186.  
  187.         // updating positions
  188.         float ozDelta = zkPressure - mkPressure;
  189.  
  190.         if (ozDelta > OZFriction)
  191.             ozDelta = ozDelta - OZFriction;
  192.         else if (ozDelta < -OZFriction)
  193.             ozDelta = ozDelta + OZFriction;
  194.         else
  195.             ozDelta = 0.0f;
  196.  
  197.         float zSpeed = OZSpeed;
  198.         float ozxNew = OZX + ozDelta * OZSpeed * dt;
  199.  
  200.         // collsion between oz and gz
  201.         float ozMax = GZX + 7.5f;
  202.         if (ozxNew < GZX or ozxNew > ozMax) {
  203.             zSpeed = OZGZSpeed;
  204.             if (ozDelta > GZFriction) {
  205.                 ozDelta = ozDelta - GZFriction;
  206.                 ozxNew = OZX + ozDelta * OZGZSpeed * dt;
  207.                 if (ozxNew < ozMax)
  208.                     ozxNew = ozMax;
  209.             }
  210.             else if (ozDelta < -GZFriction) {
  211.                 ozDelta = ozDelta + GZFriction;
  212.                 ozxNew = OZX + ozDelta * OZGZSpeed * dt;
  213.                 if (ozxNew > GZX)
  214.                     ozxNew = GZX;
  215.             }
  216.             else {
  217.                 ozDelta = 0.0f;
  218.                 if (ozxNew > ozMax)
  219.                     ozxNew = ozMax;
  220.                 else if (ozxNew < GZX)
  221.                     ozxNew = GZX;
  222.             }
  223.         }
  224.  
  225.         if (ozxNew < OZLeftBuffer) {
  226.             ozxNew = OZLeftBuffer;
  227.             if (ozDelta < -OZLeftBufferForce) {
  228.                 ozxNew = OZX + (ozDelta + OZLeftBufferForce) * zSpeed * dt;
  229.                 if (ozxNew > OZLeftBuffer)
  230.                     ozxNew = OZLeftBuffer;
  231.                 else if (ozxNew < 0.0f)
  232.                     ozxNew = 0.0f;
  233.             }
  234.         }
  235.         else if (ozxNew > OZRightBuffer) {
  236.             ozxNew = OZRightBuffer;
  237.             if (ozDelta > OZRightBufferForce) {
  238.                 ozxNew = OZX + (ozDelta - OZRightBufferForce) * zSpeed * dt;
  239.                 if (ozxNew < OZRightBuffer)
  240.                     ozxNew = OZRightBuffer;
  241.                 else if (ozxNew > 24.0f)
  242.                     ozxNew = 24.0f;
  243.             }
  244.         }
  245.  
  246.         GZFriction = GZIdleFriction;
  247.         if (ozxNew > ozMax) {
  248.             GZX = ozxNew - 7.5f;
  249.             GZFriction = GZMovingFriction;
  250.         }
  251.         else if (ozxNew < GZX) {
  252.             GZX = ozxNew;
  253.             GZFriction = GZMovingFriction;
  254.         }
  255.        
  256.         OZFriction = OZIdleFriction;
  257.         if (ozxNew != OZX) {
  258.             OZFriction = OZMovingFriction;
  259.             OZX = ozxNew;
  260.         }
  261.     }
  262.    
  263.     public Soup GetProperties()
  264.     {
  265.         Soup sp = inherited();
  266.         sp.SetNamedTag("mode", Mode);
  267.         sp.SetNamedTag("OZX", OZX);
  268.         sp.SetNamedTag("GZX", GZX);
  269.         sp.SetNamedTag("oz-friction", OZFriction);
  270.         sp.SetNamedTag("gz-friction", GZFriction);
  271.         return sp;
  272.     }
  273.    
  274.     public void SetProperties(Soup sp)
  275.     {
  276.         inherited(sp);
  277.         Mode = sp.GetNamedTagAsInt("mode", Mode);
  278.         OZX = SPHelper.GetFloat(sp, "OZX", OZX);
  279.         GZX = SPHelper.GetFloat(sp, "GZX", GZX);
  280.         OZFriction = SPHelper.GetFloat(sp, "oz-friction", OZFriction);
  281.         GZFriction = SPHelper.GetFloat(sp, "gz-friction", GZFriction);
  282.     }
  283. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement