Netadmin, в понедельник сброшу пример по своему датчику топлива.
Правда у меня пересчет в scada выполняется, но думаю в лоджик на ST можно сделать аналогичное.
изначально это было сделано вообще на трм WhatsApp Image 2024-10-31 at 11.37.10.jpeg но сами понимаете это вариант никакой. мало того что емкость не линейна. так еще и датчик в двух частях емкости. конус и цилиндр.
Готовая функция линейной апроксимации на 10 точек от Petera, можно снять зависимость объёма от уровня или зависимость объёма от давления.
На конус сделать 6-8 точек, выше конуса достаточно 2 точек. Тарировать в конусе и выше можно например, по 5-10 литров.
https://owen.ru/forum/showthread.php?t=35489&page=5
Последний раз редактировалось kondor3000; 16.11.2024 в 14:18.
Спасибо неравнодушным, если что это не корыстный интерес. друг пришел на производства пластика. попросил улучшить визуализацию расхода жидкости. то-есть не как у них было в условных единицах на ТРМ а в литрах. Пока решили на конус забить. он как запас.
Можно тупо бахнуть всю таблицу в массив, и считать по нему:
Код:FUNCTION GRAPH : REAL; VAR_INPUT x :REAL; END_VAR VAR arX: ARRAY[0..49] OF REAL := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]; arY: ARRAY[0..49] OF REAL := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]; i: udint; END_VAR IF x < arX[0] THEN GRAPH := arY[0]; ELSIF x > arX[49] THEN GRAPH := arY[49]; ELSE FOR i:=0 TO 48 DO IF x >= arx[i] AND x <= arx[i+1] THEN GRAPH := LINEAR(x, arx[i], arx[i+1], ary[i], ary[i+1]); END_IF; END_FOR; END_IF; end_function FUNCTION LINEAR : REAL; VAR_INPUT rX, rX1, rX2, rY1, rY2 : REAL; END_VAR IF rX2 = rX1 THEN LINEAR := rY2; ELSE LINEAR := (rX - rX1) * (rY2 - rY1) / (rX2 - rX1) + rY1; END_IF; end_function
Только это подойдёт для одной плотности, если в ёмкость нальют что-то более или менее плотное, то всё коту под хвост.
Хотя для поплавкового ду пойдут. Для давления нет.
Последний раз редактировалось МихаилГл; 16.11.2024 в 14:20.
Попробовал решить задачу измерения объёма в усечённом конусе двумя способами:
1. Выразил объём прямого (полного) конуса через высоту конуса и угол между основанием и образующей (т.е. выразил радиус через высоту и подставил в формулу объёма). Далее взял три точки - начало отсчёта датчика, середину конуса и верхнюю часть конуса - для них известны и уровень и объём. Получил систему из двух уравнений относительно двух переменных - высота конуса до нижней точки измерения датчика и угол между основанием и образующей. Получил квадратное уравнение, решил.
2. Взял точки и при помощи метода наименьших квадратов нашёл полином второй степени. Тут всё просто - в институте на чисметах делал, осталась программка на Pascal. Думаю, что для тех, кто чисметы не изучал - существуют онлайн сервисы аппроксимации МНК.
Какие результаты.
Очень удивился, что лобовое решение при помощи интерполяции по 3 точкам (1-й способ) дал неудовлетворительные результаты - вместо параболы получилась функция гиперболы с перегибом.
А вот аппроксимация дала весьма хорошие результаты.
У меня нет MS Office - работаю в Libre Office, поэтому исходники прикладывать нет смысла, покажу распечатки в pdf - и вывод формулы (как оказалось не нужной) и результаты вычислений по формуле и МНК.
Итого. Как бы поступил лично я.
Нет ничего универсального и эта программа пишется не для всех конусных и не только бункеров, а для конкретного. А для конкретного бункера на диапазоне 35-60 см хорошо применим полином второй степени, коэффициенты для которого получены МНК. Поэтому решение такое:
1. на диапазоне измерений от 35 до 60 см объём вычисляется по аппроксимационному полиному.
2. на диапазоне 60 см и более - по линейной формуле для цилиндра (может придётся разбить на несколько участков)
В примере программы не стал усердствовать с точностью вычислений для цилиндрической части, просто для примера показал с каким-то коэффициентом.
Код:function BunkerVolume: real; var_input rLevel: real; end_var var a: array [0..2] of real := [7.8577289377217835E-002, -3.0897496947466449E-003, 1.4868742368739197E-004]; rVolumeMin: real := 0.152; rVolumeMax: real := 0.429; rResult: real; i: udint; end_var if rLevel < 35.0 then rResult := rVolumeMin; elsif rLevel <=60.0 then rResult := 0; for i := 0 to 2 do rResult := rResult * rLevel + a[2-i]; end_for; elsif rLevel <= 200.0 then rResult := rVolumeMax + 0.0348 * (rLevel - 60.0); end_if; BunkerVolume := rResult; end_function
Последний раз редактировалось FPavel; 17.11.2024 в 00:40.
Надеюсь плотность налитой жидкости не будет являться государственным секретом(тайной), непонятно к чему разговор, в смысле, даже в теплосчётчиках объём воды пересчитывается в массу в зависимости от температуры, но насколько я понял и этого товарищу не надо, в смысле, сверхвысокой точности, коль он измеритель уровня применил с точностью плюс-минус лапоть, в смысле, состоящий из линейки герконов, любой датчик избыточного давления, коих у Овена великое множество, измерит точнее, даже без пересчёта массы в объём, товарищ вроде объём хочет, при использовании тензодатчиков аналогичная ситуация!
И, совсем непонятно зачем датчики применять более чем в 10 раз дороже(наверно куры денег не клюют) датчика избыточного давления и даже дороже датчиков дифференциального давления, для измерения уровня в сосудах под избыточным давлением:
ПД200-ДД.jpg
короче, маразмом попахивает, мне так кажется!
Могу добавить, примерно лет 10 назад покупали четыре датчика дифференциального давления, как раз для этой цели(о которой писал), короче, они примерно в 3 раза были дешевле овенских и к тому же и более надёжные оказались, в смысле, до сих пор работают и проблем с ними не возникало, короче, лучше в 10 раз по совокупности качеств, это по моим подсчётам, марку не буду называть, а то заругают!
Последний раз редактировалось Сергей0308; 17.11.2024 в 11:29.
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.