Besoin d'aide avec JSL pour la formule de température à compensation de pressionBonjour,
Je recherche un exemple ou des conseils sur la façon de commencer à écrire du JSL pour la température compensée en pression suivante :
- Créez une interface utilisateur pour sélectionner une colonne de température et une colonne de pression. Demandez également à l'utilisateur de saisir une pression de référence, un facteur de conversion et un facteur de pureté.
- Calculez la température compensée en pression pour chaque ligne à l'aide de plusieurs instructions IF et expressions mathématiques à l'aide des données de l'interface utilisateur.
- Créez une nouvelle colonne et remplissez-la avec la température compensée en pression calculée ci-dessus.
Toute aide est appréciée !
Ingénierie Qualité et ProcédésRe : Besoin d'aide avec JSL pour la formule de température compensée en pression@txnelson @Craige_Hales
Merci beaucoup à vous deux !C'est exactement ce dont j'avais besoin.Ce n'est peut-être pas optimal, mais j'ai fini par créer des colonnes intermédiaires avec des formules pour dériver la température compensée en pression (pct).Je ne voulais pas plusieurs colonnes intermédiaires dans ma table de données, j'ai donc supprimé la formule du pct et supprimé les colonnes intermédiaires.Si jamais j'ajoute plus de lignes de données, je devrai réexécuter le script.
J'ai collé le code que j'ai trouvé ci-dessous (mais notez que j'ai dû changer toutes les constantes / coefficients puisque c'est pour mon travail)
//Script for creating a pressure compensated temperature tag
//Rev 1 8/25/20
names default to here(1);
/*dtList = New Table("Example Data",
new column("Temperature"),
new column("Pressure")
);*/
dtList = CurrentDataTable();
dlg = Column Dialog(
temperatureCol = ColList( "Temperature", Max Col( 1 ), Modeling Type( {"Continuous", "Multiple Response"} ) ),
pressureCol = ColList( "Pressure", Max Col( 1 ), Modeling Type( {"Continuous", "Multiple Response"} ) ),
Line Up( 2,
Text Box( "Reference Pressure" ), refPressure = EditNumber( . ),
Text Box( "Conversion Factor" ), conFactor = EditNumber( 1 ),
Text Box( "Purity Factor" ), purFactor = EditNumber( 1 ),
Text Box( "Pressure Units"), unitsP = comboBox( {"Gauge","Absolute"}),
Text Box( "PComp Tag Name"), pcompTag = EditText( "PComp Tag" )
),
Text Box("
**Reference Pressure is the base pressure and must be in the same units as the pressure tag.
**Pressure Units is a logical to indicate if the pressure being measured is absolute or gauge. For most
situations, the pressure will be measure in terms of gauge. However, vacuum pipestills typically use absolute.
**PComp Tag Name will be the column name of the new Pressure Compensate Temperature tag.
"),
);
show(dlg);
//Absolute needs to be 0 and Gauge needs to be 1. The combo box has Absolute as 2 and Gauge as 1,
If( dlg["unitsP"] == 1, dlg["unitsP"] = 1, dlg["unitsP"] = 0 );
//Write("unitsP equals: ", dlg["unitsP"]);
Eval( // run the code below
Eval Expr( // convert the Expr(...) below into a hard coded value
// eval(evalexpr(expr(...))) is a pattern for getting values from the dlg INTO
// A FORMULA. if you follow this pattern, the formula will be self contained.
dtList << New Column( "PA",
formula( // random formula that uses all the variables AND shows an if() stmt
Expr( dlg["purFactor"] ) *
(Expr( dlg["unitsP"] ) + Expr( dlg["pressureCol"][1] ) * Expr( dlg["purFactor"] ) / 12)
)
)
)
);
Eval( // run the code below
Eval Expr(
dtList << New Column( "PB",
formula( // random formula that uses all the variables AND shows an if() stmt
Expr( dlg["refPressure"] ) * Expr( dlg["conFactor"] ) / 12 + Expr( dlg["unitsP"] )
)
)
)
);
Eval(
Eval Expr(
dtList << New Column( "TA",
formula( // random formula that uses all the variables AND shows an if() stmt
Expr( dlg["temperatureCol"][1] ) + 400
)
)
)
);
New Column( "AA",
formula(
If( :PA >= 1.1111 ,
(4 - LOG10(:PA)) / (2000 - 25*LOG10(:PA)) - 0.0001
, // else
(3- LOG10(:PA)) / (2000 - 25*LOG10(:PA)) - 0.0001
)
)
);
New Column( "AB",
formula(
If( :PB >= 1.1111 ,
(4 - LOG10(:PB)) / (2000 - 25*LOG10(:PB)) - 0.0001
, // else
(3 - LOG10(:PB)) / (2000 - 100*LOG10(:PB)) - 0.0001
)
)
);
New Column( "DEN",
formula(
:AB / :AA * ((1.1 / :TA) - 0.0001) + 0.0001
)
);
New Column( "TB",
formula(
1.1 / :DEN - 400
)
);
Column("TB") << delete formula;
Column("TB") << Set Name( dlg["pcompTag"] );
dtList << delete columns( {"PA","PB","TA","AA","AB","DEN"} );Re : Besoin d'aide avec JSL pour la formule de température compensée en pressionSalut,
Que veux-tu dire par " Température compensée en pression" ? Des détails plus précis seraient plus faciles pour le support
Re : Besoin d'aide avec JSL pour la formule de température compensée en pressionCool! Je ne suis pas sûr d'avoir déjà utilisé la boîte de dialogue de colonne, mais cela semble parfait pour ce travail.
Après avoir exécuté l'exemple de Jim, essayez un code comme celui-ci pour ajouter une colonne de formules à votre table.
Eval( // run the code below
Eval Expr( // convert the Expr(...) below into a hard coded value
// eval(evalexpr(expr(...))) is a pattern for getting values from the dlg INTO
// A FORMULA. if you follow this pattern, the formula will be self contained.
dtList << New Column( "adjusted",
formula( // random formula that uses all the variables AND shows an if() stmt
If( Expr( dlg["refPressure"] ) > Expr( dlg["pressureCol"][1] ),
Expr( dlg["temperatureCol"][1] ) + // first item of list
Expr( dlg["pressureCol"][1] ) + //
Expr( dlg["conFactor"] ) + // simple value
Expr( dlg["purFactor"] ) + //
Expr( dlg["refPressure"] )// do the ususal stuff...
, // else refPressure <= pressureCol...
Expr( dlg["temperatureCol"][1] ) + // first item of list
Expr( dlg["pressureCol"][1] ) + //
Expr( dlg["conFactor"] ) + // simple value
Expr( dlg["purFactor"] ) + //
Sqrt( Expr( dlg["refPressure"] ) )// do something extra for low ref
)
)
)
)
);Il se passe plusieurs choses ici.
- formula() n'évalue pas son argument, vous devez donc lui donner de l'aide
- Je me rabats sur la technique eval(evalexpr(expr(...))). Il existe d'autres moyens.
- vous avez dit que vous aviez besoin d'un if(...) alors j'en ai fait un. Vous pouvez utiliser n'importe quel JSL qui produit un nombre simple pour un résultat. Le résultat d'un if() est la dernière valeur qu'il calcule.
- si vous devez utiliser une variable plus d'une fois dans votre formule, regardez la formule ci-dessus.
- Clairement ma formule n'est pas celle que vous recherchez !
- Pour les formules simples, vous n'avez pas besoin de tout le matériel evalexpr. formule(:pression * :température) fonctionne bien. Mais dans cet exemple, vous ne connaissez pas les noms des colonnes ; à la place, vous connaissez le nom d'une variable qui contient le nom de la colonne.
pour référence, le dlg renvoie cette liste :
// this is what the dlg returns; the columns are a list of 1 item
// and the parameters are simple values:
//
// {temperatureCol = {:Temperature}, pressureCol = {:Pressure},
// Text Box, refPressure = 3, Text Box, conFactor = 33,
// Text Box, purFactor = 333, Button( 1 )}Enfin, assurez-vous de regarder la formule que vous avez créée à l'aide de l'éditeur de formules pour vous assurer qu'elle correspond vraiment à ce que vous attendez !
Click the + next to the column name to open the formula in the editorClick the + next to the column name to open the formula in the editorClick the + next to the column name to open the formula in the editorCliquez sur le + à côté du nom de la colonne pour ouvrir la formule dans l'éditeur
Re : Besoin d'aide avec JSL pour la formule de température compensée en pression- Lire le guide de script dans la bibliothèque de documentation JMP téléchargée lors de l'installation de JMP
- Je peux vous aider un peu avec l'interface utilisateur, mais " Calculez la température compensée en pression pour chaque ligne à l'aide de plusieurs instructions IF et d'expressions mathématiques à l'aide des données de l'interface utilisateur. "est trop vague pour vraiment vous guider.

Voici le JSL pour ce qui précède.Vous aurez juste besoin de prendre les informations de la fenêtre et de les intégrer à vos formules.Lisez les sections de la documentation sur Column Dialog() et sur New Column()
names default to here(1);
dtList = New Table("Example Data",
new column("Temperature"),
new column("Pressure")
);
dlg = Column Dialog(
temperatureCol = ColList( "Temperature", Min Col( 1 ), Max Col( 2 ), Data Type( "Numeric" ) ),
pressureCol = ColList( "Pressure", Max Col( 1 ), Modeling Type( {"Continuous", "Multiple Response"} ) ),
Line Up( 2,
Text Box( "Reference Pressure" ), refPressure = EditNumber( . ),
Text Box( "Conversion Factor" ), conFactor = EditNumber( . ),
Text Box( "Purity Factor" ), purFactor = EditNumber( . )
));
show(dlg);