Advertisement
agmike

Схема ВР483М в ТРС

Dec 8th, 2012
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.16 KB | None | 0 0
  1. /*
  2. ## двухкамерный резервуар ##
  3.  
  4. V tm 0 0.1
  5. V zr 0 0.1
  6. V tc 0 0.1
  7. V rk 0 6
  8. V zk 0 6
  9.  
  10. ## магистральная часть ##
  11.  
  12. V mk 0 0.5     # MK
  13. C tm mk 12mm   #
  14.  
  15. V s1 0 0.1     # камера в седле C1
  16. V kdr 0 0.1    # КДР
  17. V k 0 0.01      # режимная камера
  18.  
  19. C s1 mk 0.3mm   # радиальный канал в седле С1
  20.  
  21. C mk_s1_p mk s1 2mm 0  # 2d1.0 в хвостовике плунжера (соединяют МК с ЗК при отпуске)
  22.  
  23. C kp s1 zk 3.6mm 0  # клапан плунжера (соединяет ЗК и С1 при торможении)
  24.  
  25. C s1_zk_p s1 zk 0.7mm 0  # верхнее отверстие в плунжере (соединяет С1 с ЗК или К)
  26. C s1_k_p  s1 k  0.7mm 0  
  27.  
  28. C k_zk_p k zk 0.7mm 0  # нижнее отверстие в плунжере (соединяет ЗК и К)
  29.  
  30. C chm mk s1 12mm 0  # челночная манжета (соединяет МК с С1 при торможении)
  31.  
  32. C dr s1 kdr 4mm 0  # клапан доп. разрядки
  33.  
  34. C ak kdr at 0.9mm 0  # атмосферный клапан
  35.  
  36. C km mk zk 0.9mm 0  # клапан мягкости
  37.  
  38. C rd rk k 0.6mm 0  # режимная диафрагма (соединение РК с К)
  39.  
  40. ## главная часть ##
  41.  
  42. C tm_zr tm zr 1.3mm 0  #  дроссельное отверстие для зарядки ЗР
  43.  
  44. C rk_zk rk zk 0.5mm 1  #  дроссельное отверстие, соединяющее ЗК и РК
  45.  
  46. C zr_tc zr tc 1 0       #  отверстие (4d3.0 или d1.7) для наполнения ТЦ
  47. C kdr_tc kdr tc 12mm 1  #  канал КДР - ТЦ - Ат
  48. C tc_at tc at 2.3mm 1   #  ниппель в уравнительном поршне для соединения ТЦ с атмосферой
  49.  
  50. C vk rk at 1.5mm 0  # выпускной вентиль (выпуск воздуха из РК и отпуск тормоза)
  51. */
  52.  
  53. include "splibrary.gs"
  54.  
  55. class SPAO_VR483M isclass SPAirObject
  56. {
  57.     define public int ModeR = 0;
  58.     define public int ModeG = 1;
  59.     public int Mode = ModeR;
  60.  
  61.     define public int LoadModeP = 0;
  62.     define public int LoadModeS = 1;
  63.     define public int LoadModeG = 2;
  64.     public int LoadMode = LoadModeG;
  65.  
  66.     float kmOpenPressure = Math.Rand(300.0f, 400.0f);
  67.     bool chmOpen = false;
  68.     float mdPosition = 4.5f;
  69.     float gpPosition = 0.0f;
  70.     float upPosition = 5.0f;
  71.  
  72.     int vTM;
  73.     int vRK;
  74.     int vZK;
  75.     int vZR;
  76.     int vTC;
  77.     int vMK;
  78.     int vS1;
  79.     int vKDR;
  80.     int vK;
  81.     int cMK_S1_P;
  82.     int cKP;
  83.     int cS1_ZK_P;
  84.     int cS1_K_P;
  85.     int cK_ZK_P;
  86.     int cChM;
  87.     int cDR;
  88.     int cAK;
  89.     int cKM;
  90.     int cRD;
  91.     int cTM_ZR;
  92.     int cRK_ZK;
  93.     int cZR_TC;
  94.     int cKDR_TC;
  95.     int cTC_AT;
  96.    
  97.     define float chmOpenSensivity = 150.0f;
  98.     define float chmCloseSensivity = 10.0f;
  99.     define float chmMinOpenDelta = 10.0f;
  100.     define float chmFullOpenDelta = 60.0f;
  101.    
  102.     define float mdReleaseMax = 10.0f;
  103.     define float mdBrakeFirstStage = 5.0f;
  104.     define float mdBrakeSecondStage = 10.0f;
  105.     define float mdBrakeThirdStage = 20.0f;
  106.     define float mdBrakeMax = 30.0f;
  107.     define float mdSpeed = 3.0f;
  108.    
  109.     define float rdRatioRK = 0.4f;
  110.     define float rdRatioK = 0.6f;
  111.     define float rdOpenPressure = rdRatioK * 350.0f + rdRatioRK * 250.0f;
  112.     define float rdFullOpenDelta = 20.0f;
  113.    
  114.     define float okSensivity = 2.0f;
  115.    
  116.     define float gpSpeed = 7.0f / 1.0f;
  117.     define float gpMaxPressure = 60.0f;
  118.     define float gpMaxPosition = 23.0f;
  119.     define float gpSpring = gpMaxPressure / gpMaxPosition;
  120.     define float gpSensivity = 2.0f;
  121.     define float gpMaxAddVolume = 0.3f;
  122.    
  123.     define float rkBaseVolume = 6.0f;
  124.     define float upMinPosition = 5.0f;
  125.     define float upMaxPosition = 23.0f;
  126.     define float upPositionRange = upMaxPosition - upMinPosition;
  127.     define float upMinPressure = 40.0f;
  128.     define float upMaxPressureG = 430.0f;
  129.     define float upMaxPressureP = 170.0f;
  130.     define float upPressureSP = 120.0f;
  131.     define float tkSensivity = 0.3f;
  132.     define float tkApplyFullOpenDelta = 2.0f;
  133.     define float tkReleaseFullOpenDelta = 0.5f;
  134.  
  135.     public void Init(SPAirScheme scheme)
  136.     {
  137.         inherited(scheme);
  138.         vTM = scheme.GetNodeId("tm");
  139.         vRK = scheme.GetNodeId("rk");
  140.         vZK = scheme.GetNodeId("zk");
  141.         vZR = scheme.GetNodeId("zr");
  142.         vTC = scheme.GetNodeId("tc");
  143.  
  144.         vMK = scheme.GetNodeId("mk");
  145.         vS1 = scheme.GetNodeId("s1");
  146.         vKDR = scheme.GetNodeId("kdr");
  147.         vK = scheme.GetNodeId("k");
  148.  
  149.         cMK_S1_P = scheme.GetLinkId("mk_s1_p");
  150.         cKP = scheme.GetLinkId("kp");
  151.         cS1_ZK_P = scheme.GetLinkId("s1_zk_p");
  152.         cS1_K_P = scheme.GetLinkId("s1_k_p");
  153.         cK_ZK_P = scheme.GetLinkId("k_zk_p");
  154.         cChM = scheme.GetLinkId("chm");
  155.         cDR = scheme.GetLinkId("dr");
  156.         cAK = scheme.GetLinkId("ak");
  157.         cKM = scheme.GetLinkId("km");
  158.         cRD = scheme.GetLinkId("rd");
  159.  
  160.         cTM_ZR = scheme.GetLinkId("tm_zr");
  161.         cRK_ZK = scheme.GetLinkId("rk_zk");
  162.         cZR_TC = scheme.GetLinkId("zr_tc");
  163.         cKDR_TC = scheme.GetLinkId("kdr_tc");
  164.         cTC_AT = scheme.GetLinkId("tc_at");
  165.     }
  166.  
  167.     public void Update(float dt)
  168.     {
  169.         float openMK_S1_P = 0.0f;
  170.         float openKP = 0.0f;
  171.         float openS1_ZK_P = 0.0f;
  172.         float openS1_K_P = 0.0f;
  173.         float openK_ZK = 0.0f;
  174.         float openChM = 0.0f;
  175.         float openDR = 0.0f;
  176.         float openAK = 0.0f;
  177.         float openKM = 0.0f;
  178.         float openRD = 0.0f;
  179.         float openTM_ZR = 0.0f;
  180.         float openRK_ZK = 0.0f;
  181.         float openZR_TC = 0.0f;
  182.         float openKDR_TC = 0.0f;
  183.         float openTC_AT = 0.0f;
  184.  
  185.         float kdrPressure = scheme.GetPressure(vKDR);
  186.         float mkPressure = scheme.GetPressure(vMK);
  187.         float zkPressure = scheme.GetPressure(vZK);
  188.         float s1Pressure = scheme.GetPressure(vS1);
  189.         float kPressure = scheme.GetPressure(vK);
  190.         float tmPressure = scheme.GetPressure(vTM);
  191.         float zrPressure = scheme.GetPressure(vZR);
  192.         float rkPressure = scheme.GetPressure(vRK);
  193.         float tcPressure = scheme.GetPressure(vTC);
  194.  
  195.         // клапан мягкости
  196.         if (kdrPressure < 40.0f and zkPressure >= kmOpenPressure)
  197.             openKM = 1.0f;
  198.  
  199.         // челночная манжета
  200.         float chmPressure = mkPressure - s1Pressure;
  201.         if (chmPressure > chmOpenSensivity)
  202.             chmOpen = true;
  203.         else if (chmPressure < chmCloseSensivity)
  204.             chmOpen = false;
  205.         if (chmOpen) {
  206.             openChM = (chmPressure - chmMinOpenDelta) / chmFullOpenDelta;
  207.             if (openChM > 1.0f)
  208.                 openChM = 1.0f;
  209.         }
  210.  
  211.         // магистральная диафрагма
  212.         float mdTargetPosition = 4.5f;
  213.         float mdPressure = zkPressure - mkPressure;
  214.  
  215.         // расчет положения МД
  216.         if (mdPressure >= mdBrakeMax)
  217.             mdTargetPosition = 0.0f;
  218.         else if (mdPressure < -mdReleaseMax)
  219.             mdTargetPosition = 11.0f;
  220.         else if (mdPressure >= mdBrakeThirdStage) {
  221.             float a = (mdPressure - mdBrakeThirdStage) / (mdBrakeMax - mdBrakeThirdStage);
  222.             mdTargetPosition = 1.5f * a;
  223.         }
  224.         else if (mdPressure >= mdBrakeSecondStage) {
  225.             float a = (mdPressure - mdBrakeSecondStage) / (mdBrakeThirdStage - mdBrakeSecondStage);
  226.             mdTargetPosition = 1.5f * a + (1.0f - a) * 3.0f;
  227.         }
  228.         else if (mdPressure >= mdBrakeFirstStage) {
  229.             float a = (mdPressure - mdBrakeFirstStage)/ (mdBrakeSecondStage - mdBrakeFirstStage);
  230.             mdTargetPosition = 3.0f * a + (1.0f - a) * 4.5f;
  231.         }
  232.         else if (mdPressure < 0.0f) {
  233.             float a = -mdPressure / mdReleaseMax;
  234.             mdTargetPosition = 11.0f * a + (1.0f - a) * 4.5f;
  235.         }
  236.  
  237.         float mdPositionDelta = mdTargetPosition - mdPosition;
  238.         if (mdPositionDelta >= 0.0f) {
  239.             mdPosition = mdPosition + mdSpeed * Math.Sqrt(mdPositionDelta) * dt;
  240.             if (mdPosition > mdTargetPosition)
  241.                 mdPosition = mdTargetPosition;
  242.         }
  243.         else {
  244.             mdPosition = mdPosition - mdSpeed * Math.Sqrt(-mdPositionDelta) * dt;
  245.             if (mdPosition < mdTargetPosition)
  246.                 mdPosition = mdTargetPosition;
  247.         }
  248.  
  249.         // открытие клапанов МД
  250.         if (mdPosition < 4.5f) {
  251.             openDR = (4.5f - mdPosition) / 1.5f;
  252.             if (mdPosition < 3.0f) {
  253.                 openDR = 1.0f;
  254.                 openAK = 1.0f;
  255.                 if (mdPosition < 1.5f) {
  256.                     openKP = (1.5f - mdPosition) / 1.5f;
  257.                 }
  258.             }
  259.         }
  260.         // 483M
  261.         else if (mdPosition >= 9.75f) {
  262.             openS1_K_P = 1.0f;
  263.             if (mdPosition >= 10.0f) {
  264.                 openK_ZK = 1.0f;
  265.                 if (mdPosition >= 10.5f) {
  266.                     openMK_S1_P = 1.0f;
  267.                 }
  268.             }
  269.         }
  270.         openS1_ZK_P = 1.0f - openS1_K_P;
  271.  
  272.         // режимная камера (Р и Г режим отпуска)
  273.         if (Mode == ModeR) {
  274.             float rdPressure = rdRatioK * kPressure + rdRatioRK * rkPressure;
  275.             float rdDelta = rdPressure - rdOpenPressure;
  276.             if (rdDelta > 0.0f) {
  277.                 openRD = rdDelta / rdFullOpenDelta;
  278.                 if (openRD > 1.0f)
  279.                     openRD = 1.0f;
  280.             }
  281.         }
  282.  
  283.         // главная часть
  284.  
  285.         // ОК зарядки ЗР
  286.         if (tmPressure - zrPressure > okSensivity)
  287.             openTM_ZR = 1.0f;
  288.        
  289.         // положение главного поршня
  290.         float gpSpringPressure = 15.0f + gpPosition * gpSpring;
  291.         float gpPressure = rkPressure - (zkPressure + gpSpringPressure);
  292.         if (gpPressure > gpSensivity) {
  293.             gpPosition = gpPosition + gpSpeed * (gpPressure - gpSensivity) * dt;
  294.             if (gpPosition > gpMaxPosition)
  295.                 gpPosition = gpMaxPosition;
  296.         }
  297.         else if (gpPressure < -gpSensivity) {
  298.             gpPosition = gpPosition + gpSpeed * (gpPressure + gpSensivity) * dt;
  299.             if (gpPosition < 0.0f)
  300.                 gpPosition = 0.0f;
  301.         }
  302.  
  303.         // увеличение объема РК из-за движения главного поршня
  304.         float rkVolume = scheme.GetVolume(vRK);
  305.         float rkAir = rkPressure * rkVolume;
  306.         rkVolume = rkBaseVolume + gpPosition * gpMaxAddVolume / gpMaxPosition;
  307.         rkPressure = rkAir / rkVolume;
  308.         scheme.SetPressureVolume(vRK, rkPressure, rkVolume);
  309.  
  310.         // положение уравнительного поршня
  311.         float upPressure = tcPressure - upMinPressure;
  312.         if (upPressure > 0.0f) {
  313.             if (LoadMode == LoadModeG)
  314.                 upPosition = upMinPosition + upPositionRange * (upPressure / upMaxPressureG);
  315.             else if (LoadMode == LoadModeS) {
  316.                 float pressureG = 0.0f;
  317.                 float pressureS = upPressure;
  318.                 if (pressureS > upPressureSP) {
  319.                     pressureG = upPressure - upPressureSP;
  320.                     pressureS = upPressureSP;
  321.                 }
  322.                 upPosition = upMinPosition + upPositionRange * (pressureS / upMaxPressureP + pressureG / upMaxPressureG);
  323.             }
  324.             else
  325.                 upPosition = upMinPosition + upPositionRange * (upPressure / upMaxPressureP);
  326.             if (upPosition > upMaxPosition)
  327.                 upPosition = upMaxPosition;
  328.         }
  329.         else
  330.             upPosition = upMinPosition;
  331.  
  332.         // каналы, управляемые главным поршнем
  333.         if (gpPosition < 5.0f) {
  334.             openRK_ZK = 1.0f;
  335.             openKDR_TC = 1.0f;
  336.         }
  337.  
  338.         // тормозной клапан
  339.         float tkDelta = gpPosition - upPosition;
  340.         if (tkDelta > tkSensivity) {
  341.             float tkHole = 12.0f;
  342.             if (gpPosition > 15.0f)
  343.                 tkHole = 1.7f;
  344.             float open = (tkDelta - tkSensivity) / tkApplyFullOpenDelta;
  345.             if (open > 1.0f)
  346.                 open = 1.0f;
  347.             openZR_TC = open * SPHelper.Hole(tkHole);
  348.         }
  349.         else if (tkDelta < -tkSensivity) {
  350.             openTC_AT = (-tkDelta - tkSensivity) / tkReleaseFullOpenDelta;
  351.         }
  352.  
  353.         scheme.SetFlowRate(cMK_S1_P, openMK_S1_P);
  354.         scheme.SetFlowRate(cKP, openKP);
  355.         scheme.SetFlowRate(cS1_ZK_P, openS1_ZK_P);
  356.         scheme.SetFlowRate(cS1_K_P, openS1_K_P);
  357.         scheme.SetFlowRate(cK_ZK_P, openK_ZK);
  358.         scheme.SetFlowRate(cChM, openChM);
  359.         scheme.SetFlowRate(cDR, openDR);
  360.         scheme.SetFlowRate(cAK, openAK);
  361.         scheme.SetFlowRate(cKM, openKM);
  362.         scheme.SetFlowRate(cRD, openRD);
  363.         scheme.SetFlowRate(cTM_ZR, openTM_ZR);
  364.         scheme.SetFlowRate(cRK_ZK, openRK_ZK);
  365.         scheme.SetFlowRate(cZR_TC, openZR_TC);
  366.         scheme.SetFlowRate(cKDR_TC, openKDR_TC);
  367.         scheme.SetFlowRate(cTC_AT, openTC_AT);
  368.     }
  369.    
  370.     public Soup GetProperties()
  371.     {
  372.         Soup sp = inherited();
  373.         sp.SetNamedTag("mode", Mode);
  374.         sp.SetNamedTag("load-mode", LoadMode);
  375.         sp.SetNamedTag("km-open-pressure", kmOpenPressure);
  376.         sp.SetNamedTag("chm-open", chmOpen);
  377.         sp.SetNamedTag("md-position", mdPosition);
  378.         sp.SetNamedTag("gp-position", gpPosition);
  379.         sp.SetNamedTag("up-position", upPosition);
  380.         return sp;
  381.     }
  382.    
  383.     public void SetProperties(Soup sp)
  384.     {
  385.         inherited(sp);
  386.         Mode = SPHelper.GetInt(sp, "mode", Mode);
  387.         LoadMode = SPHelper.GetInt(sp, "load-mode", LoadMode);
  388.         kmOpenPressure = SPHelper.GetFloat(sp, "km-open-pressure", kmOpenPressure);
  389.         chmOpen = SPHelper.GetBool(sp, "chm-open", chmOpen);
  390.         mdPosition = SPHelper.GetFloat(sp, "md-position", mdPosition);
  391.         gpPosition = SPHelper.GetFloat(sp, "gp-position", gpPosition);
  392.         upPosition = SPHelper.GetFloat(sp, "up-position", upPosition);
  393.     }
  394. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement