Шестаков В.С. Расчет на ЭВМ нефтегазового оборудования. Учебное пособие для МНГ-2015 (811778), страница 22
Текст из файла (страница 22)
В блок начальных значений добавлять выражения Т=0 и x =0 здесь не требуется, так как решение продолжается после первой подзадачи, в которойэти переменные вычислены (они переданы из первой подзадачи черезблок ввода данных 1).Разработка программы на ЭВМДля упрощения отладки программу разбиваем на отдельные подпрограммы по условию: каждая функция выполняется отдельной подпрограммой. В этой задаче можно выделить подпрограммы ввода, вывода, расчета до и после перекрытия выхлопного отверстия.
Передачу данных между подпрограммами выполним через аргументы. Наименования переменных применим такие же, что используются в математической модели. Для пояснений в программу введем комментарии.При разработке программы, кроме реализации алгоритма расчета,приходится решать вопрос ввода и вывода данных. В среде Excel изпрограммы необходимо обеспечить вывод данных на лист.Первым этапом при составлении программы разрабатываетсяформа ввода и вывода.
К примеру, для этой задачи форма можетиметь вид, представленный на стр. 138. Было решено выводить нетолько конечные, но и промежуточные результаты в таблице. Затем повыведенным данным средствами Excel построен график. При выводе втаблицу пришлось решать следующие вопросы:- формирования вывода в таблицу (первый ряд данных долженвыводиться в строку, следующую за заголовком, а каждый новый рядданных должен выводиться в новую строку);- уменьшения числа выводимых данных по сравнению с расчетными (шаг расчета для получения высокой точности принимаетсянебольшим, и если выводить все результаты, то получим очень большие таблицы промежуточных данных);- очистки таблицы перед выводом результатов (это необходимоделать, так как при решении в зависимости от данных может менятьсяколичество выводимых строк).Для очистки таблицы в программу включена процедура «Очистка».
Она получена путем записи макроса следующим образом:- на панели инструментов выполнен щелчок мышью по кнопке«Запись макроса»;120- в диалоговой панели введено наименование «Очистка» и выполнен щелчок по кнопке «ОК»;- выделен диапазон ячеек "A12:F45" (навели курсор мыши наячейку А12, нажали левую кнопку и протянули до ячейки F45);- нажата клавиша «Delete»;- снято выделение диапазона щелчком мыши;- выполнен щелчок по кнопке «Остановить запись».Организация вывода в таблицу. Уменьшить число выводимыхстрок можно различным образом.
В приведенном примере реализовантакой вариант. В программе задано выводить 9 строк при разгоне, приторможении будет меньше, так как продолжительность торможенияменьше, чем при разгоне. Решение проводится в два этапа. На первомэтапе определяется время перемещения на первом и на втором участках без вывода результатов в таблицу. Для вывода в таблицу в программе включены дополнительные переменные:iv – для вычисления текущей строки вывода и использования ее в методе Cells;dTv – для вычисления интервала времени, через который осуществляется вывод данных в таблицу;Tv – для вычисления времени с начала расчетов, при достижении которого осуществляется вывод строки таблицы;kviv – для организации двух циклов расчета.Вывод в таблицу выполнен следующим образом:iv=12 - это первая строка на листе Excel под заголовком таблицы,Tv=0 – обнуление вспомогательного времени для вывода строк.For kviv = 1 To 2 - организован цикл двойного решения задачи движения ударника до перекрытия выхлопного отверстия, при первом цикле (kviv=1) расчет выполняется без вывода в таблицу строк данных,так как оператор сравнения If (T >=Tv) And (kviv = 2) будет выдаватьFalse.
После окончания первого цикла определяется шаг вывода строкпо времени dTv=Т/10 (10 взято из соображения, чтобы таблица поместилась на странице Excel). При выполнении второго цикла расчетов(kviv=2) осуществляется вызов подпрограммы Вывод1 для выводастроки в таблицу в момент, когда текущее значение времени T превысит вспомогательное время вывода Tv (оператор сравнения If (T>=Tv) And (kviv = 2) в этом случае выдаст True).Sub Вывод1(iv, Tv, T, v, x, dTv - вывод строки данных (оформлен самостоятельной процедурой), в ней сразу же после вывода строки данныхвыполняется увеличение номера строки на единицу iv=iv+1, чтобы121следующий вывод был в новой строке, а также увеличение значениявспомогательного времени Tv=Tv+dTv, которое используется в операторе сравнения If (T >=Tv).Обратите внимание на место расположения вызова процедурывывода, в первом варианте программы вызов был после всех формул,в результате график начинался не с нуля по времени, а шага dT.
Впроцедуре Расчет2 после цикла выполняется еще один вызов процедуры вывода строки. Это сделано для того, чтобы вывести результатпосле остановки ударника. Если не вводить эту строку, то последнеезначение может быть пропущено.В данном примере в программе использована передача данныхмежду подпрограммами через аргументы процедур.
В предыдущемпримере (см. п. 4.3) передача данных выполнялась глобальными переменными. Передача данных через аргументы предпочтительнее, таккак в этом случае в подпрограмме только один вход и выход. Чтобынайти, в каком месте произошло вычисление какой-либо переменной,не нужно будет просматривать все процедуры в поиске соответствующего оператора присваивания или ввода. Например, в процедуреРасчет1мырешилипроверитьввыраженииFdv = Po * S, где задается значение переменной Ро. Просматриваяучасток выше этого выражения, мы не найдем в этой процедуре оператора, которым задано значение этой переменной, но обнаружим, чтопеременная указана в заголовке процедуры в аргументах.
Далее рассматриваем оператор вызова. Он находится в основной процедуре«Ударник» и имеет вид Call Расчет1(M, Po, L1, S, f, k, dT, T, v, x, iv,Tv, dTv). Выше этого оператора вызова находится оператор вызовадругой процедуры «Ввод», в аргументах которого также присутствуетрассматриваемая переменная. Просматривая процедуру «Ввод», мыобнаружим оператор присваивания, которым из ячейки "F4" листа"Ударник" передается значение переменной Ро. Имя листа указано воператоре With Worksheets("Ударник").
Далее искать другой оператор,которым также могло бы быть задано значение переменной Ро, ненужно, так как в переменной сохраняется последнее введенное в неезначение. Если нас не устраивает по каким-либо причинам в программе значение переменной Ро, то для его изменения следует перейти к листу "Ударник" и изменить число в ячейке "F4".В результате реализации алгоритма и добавления элементов длявывода получена следующая программа:122Option Explicit'Расчет максимального хода ударникаSub Ударник()‘Основная процедура вызывается щелчком по кнопкеDim M As Single, Po As Single, L1 As Single, S As Single, f As SingleDim k As Single dT As Single, dTv As Single, T As Single, v As SingleDim iv As Integer, x As Single, Tv As SingleОчистка'Вызов процедуры очистки таблицыCall Ввод(M, Po, L1, S, f, k, dT) 'Вызов процедуры ввода данныхCall Расчет1(M, Po, L1, S, f, k, dT, T, v, x, iv, Tv, dTv)Call Расчет2(M, Po, L1, S, f, k, dT, T, v, x, iv, Tv, dTv)Call Вывод2(iv, T, x) 'Вызов процедуры вывода конечных результатовEnd Sub.Sub Ввод(M, Po, L1, S, f, k, dT) 'Ввод данных с листаWith Worksheets("Ударник") ' Указание листа для ввода из ячеекM = .Range("F3").Value' Ввод массы из ячейки "F3"Po = .Range("F4").Value' Ввод давления сжатого воздуха из "F4"' Ввод хода до выхлопного отверстияL1 = .Range("F5").Value' Ввод площади ударникаS = .Range("F6").Value' Ввод коэф.
для расчета усилия Fcf = .Range("F7").Valuek = .Range("F8").Value' Ввод коэф. для расчета усилия Fc' Ввод шага интегрированияdT = .Range("F9").Value' Завершение оператора WithEnd WithEnd Sub.' Расчет до перекрытия выхлопного отверстияSub Расчет1(M, Po, L1, S, f, k, dT, T, V, X, iv, Tv, dTv)Dim Kviv As Integer, Fdv As Single, Fc As Single' Цикл для организации вывода в табл.For Kviv = 1 To 2v=0: x=0: T=0Tv = 0' Время для вывода в табл.' Задание строки начала вывода таблицыiv = 12While x < L1' Движущее усилиеFdv = Po * SFc = f * M + k * v ^ 2' Усилие сопротивления' Скоростьv = v + (Fdv - Fc) * dT / Mx = x + v * dT' Перемещение ударникаT = T + dT' Время с начала движенияIf (T>=Tv) And (Kviv=2) Then Вывод1 iv, Tv, T, v, x, dTv ‘Вывод стр.WenddTv = T / 10 'Расчет шага по времени для вывода в таблицу результатов123Next KvivEnd Sub.' Расчет после перекрытия выхлопного отверстияSub Расчет2(M, Po, L1, S, f, k, dT, T, v, x, iv, Tv, dTv)Dim Fdv As Single, Fc As SingleWhile V >= 0Fdv = Po * SFc = f * M + k * v ^ 2v = v + (-Fdv - Fc) * dT / Mx = x + v * dTT = T + dTIf (T >= Tv) Then Вывод1 iv, Tv, T, v, x, dTv ‘Вызов вывода строкиWendВывод1 iv, Tv, T, v, x, dTvEnd Sub.Sub Вывод1(iv, Tv, T, v, x, dTv)' Вывод строки данных в таблицуWith Worksheets("Ударник").Cells(iv, 1).Value = iv – 11 ' Порядковый номер строк в таблице.Cells(iv, 2).Value = T' Время с начала движения.Cells(iv, 3).Value = v' Текущая скорость.Cells(iv, 4).Value = x' Текущее перемещение с начала движенияiv = iv + 1‘ Изменение номера строки для последующего выводаTv = Tv +dTv‘Изменение времени для вывода следующей строкиEnd WithEnd Sub.Sub Вывод2(iv, T, x) 'Вывод конечных результатовiv = 35‘Номер строки вывода на листе ExcelWith Worksheets("Ударник").Cells(iv, 1).Value = "1.
Время перемещения, с".Cells(iv, 6).Value = T.Cells(iv + 1, 1).Value = "2. Максимальная ход, м/с".Cells(iv + 1, 6).Value = xEnd WithEnd SubSub Очистка()‘Процедура очистки таблицыRange("A12:F45").Select‘Задание диапазонаSelection.ClearContents‘ОчисткаRange("A12").Select‘ Снятие выделения с диапазонаEnd Sub124ACDEРасчет максимального хода ударникаИсходные данные1.
Масса ударника m, кг2. Давление сжатого воздуха Ро, Па3. Ход до выхлопного отверстия L1, м4. Площадь ударника S, м5. Коэффициент для расчета усилия сопротивления f6. Коэффициент для расчета усилия сопротивления k5. Шаг интегрирования по времени, сF1010000000.40.010.10.050.00010.0000.0040.0070.0110.0140.0180.0210.0280.0320.0390.0430.0460.0500.0530.003.607.1010.7014.1917.6921.2828.2624.6517.5314.0310.526.923.420.000.010.030.060.100.160.230.400.500.650.700.740.780.7930.0025.0020.00Скорость, м/сПройденноерасстояние, м12345679101213141516Скорость, м/сРезультаты расчетовN111213141516171820212324252627BВремя с начала движения, с1234567891015.0010.005.000.000.0000.0200.0400.060-5.00В ре мя, с28 17 0.057 -0.08 0.8029 1. Время перемещения, с0.056630 2.