PDA

Просмотр полной версии : Скрипт MasterScada



Straik
18.03.2018, 17:32
Добрый день. Очень нужна ваша помощь. У меня не выполняется скрипт, хотя компиляция пройдена успешно. Не могу понять в чем проблема. Заранее большое спасибо.


using System;
using MasterSCADA.Script.FB;
using MasterSCADA.Hlp;
using FB;
using System.Linq;


public partial class ФБ : ScriptBase
{
public override void Execute()
{
//температура на тарелках

double[] Temp = new double[57];
double t1 = 350;double t23 = 320;double t35 = 240;
double t47 = 140;double t56 = 100;
double p1 = 95;double p56 = 10;double pTR1 = 100;double pTR2 = 100;double pTLT = 1;double p360 = 100;
double ro1 = 0.71;double ro2 = 0.76;double ro3 = 0.82;double ro4 = 0.9;double ro5 = 0.99;double roF = 1.1;
double TF = 200;double TR1 = 200;double TR2 = 200;double TLI23 = 320;double TLI35 = 220;double TLI47 = 120;

double F = (double)RawTB;
double eTB = 0.02;
double Part1TB = 18;
double Part2TB = 14;
double Part3TB = 14;
double Part4TB = 7;
double Part5TB = 45;
double ZakTB = 20;
double Zok1TB = 30;
double Zok2TB = 40;
double LTTB = 130;
double LC1TB = 200;
double LC2TB = 400;
double LC3TB = 150;
double TLTTB = 3;
double TLC1TB = 2;
double TLC2TB = 4;
double TLC3TB = 3;
double p1TB = 95;
double p56TB = 10;
double pTR1TB = 100;
double pTR2TB = 100;
double pTLTTB = 1;
double t1TB = 350;
double p360TB = 100;
double t23TB = 320;
double t35TB = 240;
double t47TB = 140;
double t56TB = 100;
double e1 = eTB;
//if (e1 <= 0 || F <= 0 || e1 > 1 )
//{ throw new Exception("Параметры должны быть положительными, а доля отгона не может быть больше 1"); }
double part1 = Part1TB / 100;
double part2 = Part2TB / 100;
double part3 = Part3TB / 100;
double part4 = Part4TB / 100;
double part5 = Part5TB / 100;
//if (part1 <= 0 || part2 <= 0 || part3 <= 0 || part4 <= 0 || part5 <= 0 || part1 + part2 + part3 + part4+part5 > 1)
//{ throw new Exception("Доли фракций должны быть положительными, а их сумма не должна превышать 100%"); }
double ro12 = (part1 + part2) / ((part1 / ro1) + (part2 / ro2)); //средняя плотность бензин+дизель
double ro123 = (part1 + part2 + part3) / ((part1 / ro1) + (part2 / ro2) + (part3 / ro3)); //бензин+нафта+дизель
double ro1234 = (part1 + part2 + part3 + part4) / ((part1 / ro1) + (part2 / ro2) + (part3 / ro3) + (part4 / ro4)); //бензин+нафта+дизель+газойль
double Zak = ZakTB;
double Zok1 = Zok1TB;
double Zok2 = Zok2TB;
// if (Zak <= 0 || Zok1 <= 0 || Zok2 <= 0)
// { throw new Exception("Количество пара должно быть положительным"); }
double LT = LTTB;
double LC1 = LC1TB;
double LC2 = LC2TB;
double LC3 = LC3TB;
//if (LT <= 0 || LC1 <= 0 || LC2 <= 0 || LC3 <= 0)
//{ throw new Exception("Количество орошения должно быть положительным"); }
double TLT = TLTTB;
double TLC1 = TLC1TB;
double TLC2 = TLC2TB;
double TLC3 = TLC3TB;

p1 = p1TB;
p56 = p56TB;
pTR1 = pTR1TB;
pTR2 = pTR2TB;
pTLT = pTLTTB;
p360 = p360TB;
// if (p1 <= 0 || p56 <= 0 || pTR1 <= 0 || pTR2 <= 0 || pTLT <= 0 || p360 <= 0)
// { throw new Exception("Давление должно быть положительным"); }

t1 = t1TB;
t23 = t23TB;
t35 = t35TB;
t47 = t47TB;
t56 = t56TB;


double hz360 = Enth.Enthalpy_OHSteam(360, p360); //расчет энтальпии ПВП
double p22 = Enth.Pressure(p1, p56, 22);
double hzT22 = Enth.Enthalpy_OHSteam(Temp[22], p22);
double p34 = Enth.Pressure(p1, p56, 34);
double hzT34 = Enth.Enthalpy_OHSteam(Temp[34], p34);
double p46 = Enth.Pressure(p1, p56, 46);
double hzT46 = Enth.Enthalpy_OHSteam(Temp[46], p46);

double hzT56 = Enth.Enthalpy_OHSteam(Temp[56], p56);
double hzTLT = Enth.Enthalpy_OHSteam(TLT, pTLT);
double hzTR1 = Enth.Enthalpy_OHSteam(TR1, pTR1);
double hzTR2 = Enth.Enthalpy_OHSteam(TR2, pTR2);

double LSfull = e1 * F * (Enth.Enthalpy_Vapors(TF, roF)) + (1 - e1) * F * (Enth.Enthalpy_Liquids(TF, roF)) + (Zak + Zok2 + Zok1) * hz360 - (Zak + Zok2 + Zok1) * hzT56;
// hvTf пары нефти на входе hlTf нефть на входе
double LS1 = part1 * LSfull / (Enth.Enthalpy_Liquids(Temp[56], ro1));
// hlT56 бензин на выходе
LS1TB = LS1;
double LS2 = part2 * LSfull / (Enth.Enthalpy_Liquids(Temp[47], ro2));
// hlT47 нафта на выходе
LS2TB = LS2;
double LS3 = part3 * LSfull / (Enth.Enthalpy_Liquids(Temp[35], ro3));
// hlT35 дизель на выходе
LS3TB = LS3;
double LS4 = part4 * LSfull / (Enth.Enthalpy_Liquids(Temp[23], ro4));
// hlT23 газойль на выходе
LS4TB = LS4;
double LS5 = part5 * LSfull / (Enth.Enthalpy_Liquids(Temp[1], ro5));
// hlT1 мазут на выходе
LS5TB = LS5;



double Z22 = Zak / 38, //пар по тарелкам
Z34 = Z22,
Z46 = (Zak + Zok2) / 12,
Z56 = (Zok1 + Zak + Zok2) / 6;
double Qlt = LT * ((Enth.Enthalpy_Vapors(Temp[56], ro1)) - (Enth.Enthalpy_Liquids(TLT, ro1))); //тепло верхнего орошения
// hvT23 hlTLT
double Qlc3 = LC3 * (Enth.Enthalpy_Liquids(Temp[47], ro12)-Enth.Enthalpy_Liquids(TLC3,ro12)); //тепло промежуточных орошений
// hlT47 hlTLC3
double Qlc2 = LC2 * (Enth.Enthalpy_Liquids(Temp[35], ro123) - Enth.Enthalpy_Liquids(TLC2, ro123));
// hlT35 hlTLC2
double Qlc1 = LC1 * (Enth.Enthalpy_Liquids(Temp[23], ro1234) - Enth.Enthalpy_Liquids(TLC1, ro1234));
// hlT23 hlTLC1
double LI47 = (LS1 * (Enth.Enthalpy_Vapors(Temp[56], ro1) - Enth.Enthalpy_Vapors(Temp[46], ro1)) + LS2 * (Enth.Enthalpy_Liquids(Temp[47], ro2) - Enth.Enthalpy_Vapors(Temp[46], ro2)) + Z56 * hzT56 - Z46 * hzT46 - Zok2 * hz360 + Qlt+Qlc3) / (Enth.Enthalpy_Vapors(Temp[46], ro12) - Enth.Enthalpy_Liquids(Temp[47], ro12));
// hvT56 hvT46 hlT47 hvT46 hvT46 hlT47
LI47TB = LI47;
double LI35 = (LS1 * (Enth.Enthalpy_Vapors(Temp[56], ro1) - Enth.Enthalpy_Vapors(Temp[34], ro1)) + LS2 * (Enth.Enthalpy_Liquids(Temp[47], ro2) - Enth.Enthalpy_Vapors(Temp[34], ro2)) + LS3 * (Enth.Enthalpy_Liquids(Temp[35], ro3) - Enth.Enthalpy_Vapors(Temp[34], ro3)) + Z56 * hzT56 - Z34 * hzT34 - Zok2 * hz360 - Zok1 * hz360 + Qlt + Qlc2 + Qlc3) / (Enth.Enthalpy_Vapors(Temp[34], ro123) - Enth.Enthalpy_Liquids(Temp[35], ro123));
// hvT56 hvT34 hlT47 hvT34 hlT35 hvT34 hvT34 hlT47
LI35TB = LI35;
double LI23 = (LS1 * (Enth.Enthalpy_Vapors(Temp[56], ro1) - Enth.Enthalpy_Vapors(Temp[22], ro1)) + LS2 * (Enth.Enthalpy_Liquids(Temp[47], ro2) - Enth.Enthalpy_Vapors(Temp[22], ro2)) + LS3 * (Enth.Enthalpy_Liquids(Temp[35], ro3) - Enth.Enthalpy_Vapors(Temp[22], ro3)) + LS4 * (Enth.Enthalpy_Liquids(Temp[23], ro4) - Enth.Enthalpy_Vapors(Temp[22], ro4)) + Z56 * hzT56 - Z22 * hzT22 + Qlt + Qlc1 + Qlc2 + Qlc3) / (Enth.Enthalpy_Vapors(Temp[22], ro1234) - Enth.Enthalpy_Liquids(Temp[23], ro1234));
LI23TB = LI23;
// hvT56 hvT22 hlT47 hvT22 hlT35 hvT22 hlT23 hvT22 hvT22 hlT23

//количество углеводородных паров из отпарных колонн
double LR2 = (LS2 * ((Enth.Enthalpy_Liquids(Temp[47], ro2)) - (Enth.Enthalpy_Liquids(TLI47, ro12))) - Zok2 * (hz360 - hzTR1)) / ((Enth.Enthalpy_Liquids(TLI47, ro12)) - (Enth.Enthalpy_Vapors(TR1, ro1)));
// hlT47 hlTLI47 Т флегмы T на выходе отп hlTLI13 hvTR1
double LR1 = (LS2 * ((Enth.Enthalpy_Liquids(Temp[35], ro3)) - (Enth.Enthalpy_Liquids(TLI35, ro123))) - Zok1 * (hz360 - hzTR2)) / ((Enth.Enthalpy_Liquids(TLI35, ro123)) - (Enth.Enthalpy_Vapors(TR2, ro12)));
// hlT35 hlTLI35 Т флегмы T на выходе отп hlTLI13 hvTR2
LR1TB = LR1;
LR2TB = LR2;

}
}
public class Enth
{
public static double Enthalpy_Vapors(double t, double p420)
{

double h = 0;
double p1515 = p420 + (0.035 / p420); //Перевод относительной плотности нефтепродукта из Советской системы 4-20 в европейскую 15-15
h = ((50.2 + 0.109 * t + 0.00014 * t * t) * (4 - p1515) - 73.8) * 4.184; // Расчет энтальпии по формуле Войнова с переводом из ккал в кдж

return h;
}

public static double Enthalpy_Liquids(double t, double p420)
{

double h = 0;
double p1515 = p420 + (0.035 / p420); //Перевод относительной плотности нефтепродукта из Советской системы 4-20 в европейскую 15-15
h = (1 / (Math.Sqrt(p1515)) * (0.403 * t + 0.000405 * t * t)) * 4.184; // Расчет энтальпии по формуле c переводом из ккал в кдж

return h;
}

public static double Pressure(double p1, double p56, double i) //профиль давления
{
double pi;

pi = p1 - i * (p1 - p56) / 56;

return pi;
}

public static double Enthalpy_OHSteam(double t, double p)
{

double h = 0, TK=0;
TK = (1/(0.00397-0.0004455*(Math.Log10(p))))-273; //расчет температуры конденсации пара
h = (606.5+0.305*TK+0.5*(t-TK)) * 4.184; // Расчет энтальпии по формуле c переводом из ккал в кдж

return h;
}
}

SCADAMaster
18.03.2018, 20:18
Скорее всего он где то падает.
В правом нижнем углу скады, при ошибке появляется красная кнопка - нажмите на нее, и появится окно лога.
Лучше всего - просто подцепиться студией и отладить в ней:
https://insat.ru/blog/fb-skript-c-i-ego-ispolzovanie-v-masterscada-otladka-skriptov/