Table des matières

Table des matières 2

Définition du langage de script 25

Concepts généraux 26

Scripts et synoptiques 26

Commentaires 27

Clause événementielle 27

Données 28

Variables 28

Structures 29

Tableaux 29

Tableaux associatifs 30

Listes 31

Piles et Files 34

Arbres étiquettés 35

Itérateur 40

Événement 41

Variables externes 42

Variables de modules 42

Variables d’objets 43

Classes et objets 43

Allocation dynamique 47

Portée et Durée de vie 48

Widget et DC 48

Device et Module 53

Données échangées 55

Méthodes 55

Visibilité des devices et modules 56

Publication des données de device et module interne 57

Constantes 58

 Constantes 58

Constantes applicatives 59

Instructions 60

Instructions de base 60

Bloc 60

Affectation 60

Instruction conditionnelle 60

Instruction AuCasOu 60

Boucle While … Do 61

Boucle Do … While 61

Boucle For 61

Instruction de retour 61

Définition de fond de synoptique 62

Include 62

Define 62

Définition de fonction 62

Opérateurs 64

Fonctions Prédéfinies 67

Fonction Message 67

Fonction MessageBox 67

Fonction Trace 69

Les fonctions Tron et Troff 69

Fonction Beep 70

Fonction Rect 70

Fonction Text 71

Fonction Int 71

Fonction Float 71

Fonction String 71

Fonction Not 72

Fonction Mod 72

Fonction Range 72

Fonction RGB 72

Fonction Now 73

Fonction GetTickCount 73

Fonction Random 73

Fonction Gauss 73

Fonction TestAndSet 74

Fonction DateExpand 74

Fonction DateConvert 75

Fonction WeekDateExpand 76

Fonction WeekDateConvert 77

Fonction StrLen 78

Fonction SubStr 78

Fonction StrTrim 79

Fonction StrUpper 79

Fonction StrLower 79

Fonction Format 79

Fonction Scan 84

Fonction ParseStr 84

Fonction ParseArray 84

Fonction Evaluate 85

Fonction CheckSum 86

Fonction FileOpen 86

Fonction FileWriteln 87

Fonction EOF 88

Fonction FileReadln 88

Fonction FileDelete 88

Fonction FindFirstFile 88

Fonction FindNextFile 89

Fonction FindClose 89

Fonction ParseForm 90

Fonction RegistOpen 91

Fonction RegistGet 92

Fonction RegistPut 92

Fonction RegistStringPut 92

Fonction RegistClose 92

Fonction DdeOpen 92

Fonction DdeGet 93

Fonction DdePut 94

Fonction DdeExecute 94

Fonction DdeClose 95

Fonction FindWindow 95

Fonction ShowWindow 95

Fonction SetFocus 96

Fonction Shutdown 96

Fonction Exit 96

Fonction Close 97

Fonction Execute 97

Fonction LineList 97

Fonction RangeList 98

Fonction RangeOf 98

Fonction EquipmentList 98

Fonction ItemList 98

Fonction ModuleList 99

Fonction IsLineOpen 99

Fonction SpcAnomalyList 99

Fonction SpcAnomalyOf 99

Fonction SetTraces 99

Fonction TraceIt 99

Fonction Count 99

Fonction Delete 100

Fonction Find 100

Fonction Push 100

Fonction Pull 101

Fonction SetStack 101

Fonction SetQueue 101

Fonction FetchItem 101

Fonction StrSpn 101

Fonction Str2DateTime 102

Fonction Str2Date 102

Fonction Str2Time 103

Fonction Str2Weekday 103

Fonction ShiftList 103

Fonction ShiftDesc 103

Fonction ShiftOf 104

Fonction ShiftName 105

Fonction GetShift 105

Fonction CycleTime 105

Fonction HMS 106

Fonction LinePeriod 106

Fonction Monitor 107

Fonction SetBlob 107

Fonction CopyBlob 108

Fonction BlobLen 108

Fonction GetBlob 108

Fonction PutBlob 110

Fonction DumpBlob 110

Function ValueType 111

Function GetWindowSize 111

Function GetUser 111

Function GetScriptDirectiory() 111

Fonction GetPrivilege 111

Fonction Sqrt 111

Fonction Power 112

Fonction StrSubstitute 112

Fonction FileDialog 112

Fonction ColorDialog 112

Fonction FontDialog 112

Fonction DateDialog 112

Fonction GetVKeybd 112

Fonction Cypher 112

Fonction ReadImage 113

Fonction WriteImage 113

Fonction SetImage 113

Fonction echoScreenCopy() 113

Fonction CurrentDay 113

Fonction CurrentHour 113

Fonction CurrentShift 113

Fonction CurrentWeek 113

Fonction CurrentMonth 113

Fonction CurrentYear 113

Fonction BarCode 113

Fonction GetPasswordFromUser 113

Fonction GetTextFromUser 113

Fonction GetFreeMemory 113

Fonction GetDiskSpace 113

Fonction SetImageButton 113

Fonction AddImage 113

Fonction Link 113

Fonction Call 114

Fonction ShadowRect 114

Fonction SpcCardList 114

Fonction SpcCardOf 114

Fonction SpcCardName 114

Fonction GetSystemColor 114

Fonction ShowFullScreen 114

Fonctions trigonométriques 114

Fonction d'itérateur 114

Fonction PopupMenu 114

Fonction StrDump 115

Fonction SetTitle 115

Fonction Wstring 115

Fonction Qsort 115

Fonctions Pdf 117

Fonctions Graphiques 119

Fonction DcDrawLine 119

Fonction DcDrawText 119

Fonction DcDrawRect 120

Fonction DcSetFont 120

Fonction DcSetPen 120

Fonction DcSetBrush 121

Fonction DcSetTextForegroung 121

Fonction DcSetTextBackground 121

Fonction DcGetTextExtent 122

Fonction DcDrawRotatedText 122

Fonction DcGetSize 122

Fonction DcDrawLabel 122

Fonction DcDrawPolygon 123

Fonction dcDrawButton 123

Fonction de déclaration de dégradés 123

DLL 124

Objets 126

Auto-verrouillage 126

Base‑produit 127

Fonction New 127

Fonction Add 128

Fonction Read 128

Fonction Write 129

Fonction Delete 129

Fonction SetIndex 129

Fonctions Query et Next 130

Fonction Previous 130

Itérateur Select 131

Fonction Open 131

Fonction Close 132

Fonction List 132

Fonction Purge 132

Fonction DefectTag 132

Fonction Records 132

Fonctions Lots 132

Fonction Columns 133

Fonction SelectDialog 133

Fonction ModelList 133

Fonction MReqList 133

Fonction NewBlob 134

Fonction SetDomain 134

Fonction WriteBlob 135

Fonction ReadBlob 138

Table de données 139

Fonction New 139

Fonction Add 140

Fonction Read 140

Fonction Write 141

Fonction Delete 141

Fonction SetIndex 141

Fonctions Query et Next 142

Fonction Previous 142

Itérateur Select 143

Fonction SQLSelect 143

Fonction SQLExec 144

Fonction SQLInsert 144

Fonction Open 145

Fonction Close 145

Fonction List 145

Fonction Purge 146

Fonction Records 146

Fonction Columns 146

Fonction SelectDialog 146

Base‑procédé 148

Variables Poste 148

Fonction Add 148

Fonction Get 149

Fonctions Query et Next 149

Base‑Alarme 150

Fonction Raise 150

Fonction Drop 150

Fonction Get 151

Fonctions Query et Next 151

Fonction Unlock 151

Fonction GetCount 151

Fonction GetDesc 152

Fonction EquipmentTag 152

Base‑Maintenance 153

Fonction New 154

Fonction Find 155

Fonction FindRecord 155

Fonction Link 155

Fonction Pulse 156

Fonction PulseEvent 156

Fonction Count 157

Fonction CountEvent 157

Fonction GetProperties 158

Fonction SetProperties 158

Fonction GetCount 159

Fonction Add 159

Fonction Read 159

Fonction Write 160

Fonctions Query et Next 160

Fonction GetRecord 160

Fonction LogAdd 161

Fonction Reset 161

Fonctions LogQuery et LogNext 161

Fonction Unlock 162

Carte de contrôle 163

L’événement Update 164

Fonction Add 164

Fonction AddXS 165

Base‑Séquence 166

Variable Value 168

Fonction OpenTime 169

Fonction CloseTime 169

Fonction GetOpenTime 169

Fonction OpenSeq 170

Fonction Create 170

Fonction Close 171

Fonction Pulse 171

Fonction SetDefault 172

Fonction GetProperties 173

Fonction SetProperties 173

Fonction GetCount 174

Fonction GetDescCount 174

Fonction New 174

Fonction Add 175

Fonction Read 175

Fonction Write 176

Fonction Delete 176

Fonctions Query et Next 176

Fonctions First et Next 177

Fonction AddDesc 177

Fonction FindDesc 179

Fonction ReadDesc 179

Fonction WriteDesc 180

Fonction Unlock 180

Liaison série 181

Evénements Receive 181

Fonction Get 181

Fonction Put 182

Liaison ethernet 183

Fonction Status 184

Evénements Connect 184

Evénements Disconnect 184

Evénements Receive 185

Ensemble Received 185

Ensemble Connected 185

Ensemble Disconnected 185

Fonction Get 186

Fonction Put 187

Fonction Size 187

Fonction Open et Close 187

Function Accept 188

Objet graphique 189

Les objets graphiques définis sont 189

Les composants Sisal sont 190

Variables X, Y, W et H 191

Variable Visible 191

Variable Enable 191

Fonction SetFocus 191

Fonction Invalidate 192

Objet Statique 193

Variable Text 194

Objet Edit 195

Variable Text 196

Variable lastKey 196

Evénement Key 196

Evénement Change 196

Evénement GetFocus et KillFocus 196

Objet Bouton 198

Evénement Click 199

Objet Boite à liste 200

Evénement SelChange 201

Fonction AddString 201

Fonction ClearList 201

Fonction DirectoryList 201

Fonction FindExactString 201

Fonction GetCount 202

Fonction GetSel 202

Fonction GetSelCount 202

Fonction GetSelIndex 202

Fonction GetString 202

Fonction GetTopIndex 202

Fonction SetTopIndex 203

Fonction SetCaretIndex 203

Fonction SetSelIndex 203

Objet Boite combinée 204

L’événement SelChange 205

Fonction AddString 205

Fonction ClearList 205

Fonction DirectoryList 205

Fonction Findtring 205

Fonction GetCount 206

Fonction GetSel 206

Fonction GetSelCount 206

Fonction GetSelIndex 206

Fonction GetString 206

Fonction GetTopIndex 207

Fonction SetTopIndex 207

Fonction SetCaretIndex 207

Fonction SetSelection 207

Objet Boite à cocher 208

L’événement Click 208

Fonction SetCheck 208

Fonction GetCheck 208

Objet Bouton-radio 209

L’événement Click 209

Fonction SetCheck 209

Fonction GetCheck 209

Objet boite à onglet 210

L’événement SelChange 210

Fonction GetSel 211

Fonction SetSel 211

Objet Image 212

Objet ImageList 213

Variable Image 213

Fonction GetCount 213

Fonction GetHandle 213

Objet TreeView 214

Fonction AddChild 215

Fonction InsertItem 215

Fonction GetRoot 216

Fonction DeleteAllItem 216

Fonction DeleteItem 216

Fonction GetParent 216

Fonction GetChild 216

Fonction GetNext 216

Fonction GetPrevious 216

Fonction SetText 217

Fonction GetText 217

Fonction SetData 217

Fonction GetData 217

Fonction Expand 217

Fonction Collapse 217

Fonction GetSelection 217

Fonction GetPath 218

Fonction SetImageList 218

Fonction SetState 219

Fonction GetState 219

Evénement SelChange 219

Evénement ItemExpand 220

Objets StackView et QueueView 221

Function SetWindow 221

Function Push 221

Fonction Pull 222

Fonctions SetValue et GetValue 222

Fonctions SetLabel et GetLabel 222

Fonction DeleteAll 222

Fonction Show 222

Fonction GetImage 223

Fonction Find 223

Fonction GetCount 223

Fonctions ForEach, Next et Current 223

Fonctions First et Last 224

Fonctions GetXClick et GetYClick 224

Objet Sprite 225

Fonction Create 225

Fonction CreateShape 226

Fonction Delete 226

Fonction Move 226

Fonctions SetValue et GetValue 227

Fonctions SetLabel et GetLabel 227

Fonction DeleteAll 227

Fonction Show 227

Fonction GetImage 227

Fonctions GetX et GetY 228

Fonction Find 228

Fonction GetCount 228

Fonctions ForEach, Next et Current 228

Fonctions First et Last 229

Fonction DragTo 229

Fonction Moving 229

Fonction Animate 229

Fonctions GetXClick et GetYClick 230

Objet Canvas 231

Fonction SetPaintFunction 231

Événement Click 232

Événement RClick 232

Événement Drag 233

Objet Graphic 234

Fonction SetViewport 234

Fonctions SetXScale et SetYScale 234

Fonction Create 235

Fonction Delete 235

Fonction Write 236

Fonctions Read 236

Fonctions SetValue et GetValue 236

Fonctions SetLabel et GetLabel 237

Fonctions SetColor et GetColor 237

Fonctions SetPenStyle et GetPenStyle 237

Fonctions SetWidth et GetWidth 237

Fonction DeleteAll 237

Fonction Find 237

Fonction GetCount 238

Fonctions ForEach, Next et Current 238

Fonctions First et Last 238

Fonctions GetXClick et GetYClick 238

Objet HtmlView 239

Objet Printout 240

Fonction SetPrintPageFunction 240

Fonction Print 242

Fonction Preview 242

Fonction GetPageSizePixels 242

Fonction GetPageSizeMM 242

Fonction SetBin 242

Fonction GetBin 243

Fonction SetOrientation 243

Fonction GetOrientation 243

Variables MinPage et MaxPage 243

Variable PageFrom et PageTo 243

Composant Suivi de production 244

Fonction Select 245

Fonction Stop 246

Composant Pareto des défauts produits 247

Fonction Select 248

Fonction Stop 249

Composant Histogramme de mesure 250

Fonction Select 251

Fonction Stop 252

Fonction MeasureList 252

Composant Suivi du procédé 253

Fonction Select 254

Fonctio Stop 254

Composant Pareto des modes de marche 255

Fonction Select 256

Fonction Stop 256

Composant Carte de contrôle 257

Fonction Select 259

Fonction Stop 259

Fonction NbMeasure 259

Composant Carte de contrôle active 260

Composant Journal d’alarme 262

Composant Pareto des alarmes 263

Fonction Select 264

Fonction Stop 264

Composant Vue des séquences 266

Fonction Select 268

Fonction Stop 269

Fonction CreateSeq 269

Fonction DeleteSeq 269

Fonction SetSeqDesc 269

Fonction GetSeqDesc 270

Fonction SetSeqBegin 270

Fonction GetSeqBegin 270

Fonction SetSeqDuration et GetSeqDuration 270

Fonction SetSeqPlanned et GetSeqPlanned 270

Fonction SetSeqRealized et getSeqRealized 270

Fonction RecordSeq 271

Fonction GetSeqCount 271

Fonction GetSelSeq 271

Fonction GetDrag 271

Fonction GetProductivity 272

Fonction GetDurations 272

Fonction GetQantities 272

Fonction SetProvLevel 272

Fonction SetSelProv 273

Fonction SetProvCount 273

Fonction GetProvCount 273

Fonction EquipmentName 273

Fonction SeqCount 273

Fonction SeqEquipment 274

Fonction SeqDate 274

Fonction SeqDuration 274

Fonction SeqUptime 274

Fonction SeqDesc 275

Fonction SeqName 275

Fonction SeqPlanned 275

Fonction SeqRealized 275

Fonction SeqImpact 275

Fonction SetSeqImpact 275

Événement ComputDone 276

Fonction Reopen 276

Fonction SetMode 276

Événement Click 276

Événement Drag 276

Composant Tableau 278

Fonction AddColumn 278

Fonction RemoveColumn 279

Fonction NbColumn 279

Fonction Label 279

Fonction Width 279

Fonction Position 279

Fonction SetPosition 280

Fonction Mark 280

Événement SelChange 280

Fonction GetSelection 280

Fonction SetValueFunction 280

Fonction SetEditFunction 281

Animation 283

Objet Vue3d 284

Fonction LookAt 284

Fonction Create 285

Fonction Add 285

Fonction Delete 286

Fonction Move 286

Fonction Scale 286

Fonction Rotate 287

Fonctions SetColor et GetColor 287

Fonctions SetValue et GetValue 287

Fonctions SetLabel et GetLabel 287

Fonction DeleteAll 288

Fonction Show 288

Fonctions GetModel et SetModel 288

Fonction GetPosition, GetScale et GetRotation 288

Fonction Find 289

Fonction GetCount 289

Ensemble AllItems 289

Fonctions First et Last 289

Fonction DragTo 289

Fonction Moving 290

Fonctions GetXClick et GetYClick 290

Tableau d’objets 291

Fonction GetSelCol 292

Fonction GetSelRow 292

Fonction GetNbCol 292

Fonction GetNbRow 292

Environnement 293

Configuration générale 294

Clé Line 294

Clé Server 294

Clé Users 294

Clé Const 295

Clé Communication 299

Fichier d’environnement 301

Rubrique Range 301

Rubrique Equipment 301

Caractéristiques des Dll de communication 303

Applicom 303

Modbus 305

OPC 305

Simulation 306

Rubrique de poste 306

Rubrique Frame 308

Rubrique Module 309

Rubrique de base‑produit 310

Paramétrage des Blobs 313

Blob Void 314

Blob String et Html 314

Blob List 314

Blob Vector 314

Blob Array 315

Blob Graph 315

Blob Curve 315

Rubrique Défauts de base‑produit 316

Rubrique de base procédé 316

Rubrique de base d’alarme 317

Rubrique de base de Maintenance 317

Rubrique de base de Séquence 318

Rubrique de base horloge 322

Rubrique d’échange 323

Rubrique de contexte 323

Rubrique de temps d’ouverture et de fermeture 324

Rubrique d'équipe 326

Modèle de requête 327

Modèle de requête par défaut 328

Description d’un modèle de requête 329

Descripteur de définition 329

Descripteur de gamme 329

Descripteur de modèle 330

Descripteur de base-produit 331

Descripteur d’attribut 331

Expression 332

Sélection 335

Requêtes multi_base 335

Lien exact 335

Lien au plus proche 336

Générateur de rapport 339

Exécutables 340

Localisation 341

Serveur Web 343

Architecture générale 344

Intégration à Sisal 345

Extension de Sisal 347

Déclaration Object 347

Déclaration de variable 348

Instruction et fonction 348

Instruction de retour 348

Définition de fond de synoptique 350

Fonctions Prédéfinies 350

Fonction Message 350

Fonction Echo 350

Fonction Header 350

Fonction MessageBox 350

Fonction Beep 351

Fonctions Rect et Text 351

Cookies 352

Champs HTTP 354

Formulaire 355

Authentification 357

Bibliothèque d’échange 359

Annexe 1 – Paramètrage Bus de terrain 361

Index 362



Définition du langage de script

Le langage de script est un langage qui intègre tous les concepts couramment rencontrés lors de la mise en oeuvre d’un moyen de suivi de production. Il permet en particulier de réaliser le dialogue avec les équipements matériels et les automates.

Ce langage définit des variables, des événements, des fonctions, des classes, des objets, des définitions, des boucles, des tests et tous les opérateurs arithmétiques et de chaîne de caractère.

Dans ce document, les exemples sont donnés en italique.

Dans ce document les règles syntaxiques sont données en gras.

Concepts généraux

Le langage de script est mis en oeuvre dans les scripts de serveur et les synoptiques.

Un serveur exécute un script en tache de fond, il dialogue avec les équipements externes (automates...), enregistre des informations dans les différentes bases de données (produit, procédé, alarme), et attend tout événement ou commande pouvant provenir d’un client ou d’un autre serveur distant.

Un client est un exécutable qui offre une Interface Homme Machine (IHM) qui permet aux utilisateurs d’être informés et de piloter les équipements. Un client va pouvoir afficher des écrans applicatifs standards et des écrans applicatifs spécifiques, appelés synoptiques. L’utilisateur n’a normalement accès qu’à une seule application Cliente. Suivant son niveau de privilège, il disposera de un (SDI) ou plusieurs écrans à la fois (MDI) dans l’affichage du client.

Un synoptique est un écran Windows qui permet de définir des objets Windows et/ou des animations de l’écran. Cela permet de réaliser des synoptiques proprement dits ou des écrans de paramétrage et de pilotage.

Sisal peut fonctionner en réseau (ethernet TCP/IP), dans ce cas un client ou un serveur peut dialoguer avec un serveur distant sur le réseau.

Scripts et synoptiques

Un script de serveur ou synoptique de client, on dira un script, est un texte qui permet de définir des entités, des événements et les traitements à appliquer à ces entités lorsqu’un de ces événements se produit.

Un script se compose de plusieurs parties :

La syntaxe est identique pour les scripts et les synoptiques, hormis la possibilité pour le synoptique de décrire des objets d’un type particulier : les objets de dialogue.

Commentaires

Les commentaires peuvent être écrits à tout endroit dans le script sous deux formes : à partir du symbole "//" jusqu’à la fin de ligne ou entre le symbole "/*" et le symbole "*/".

Clause événementielle

Une clause événementielle permet d’associer à un ou plusieurs événements un traitement à effectuer.

On EVENEMENT { , EVENEMENT} Do ACTION

Un événement est un signal généré par une variable dont la valeur a changé. Cette variable peut être une variable externe, un événement défini par un objet , ou même un événement déclaré; dans ce cas on dit qu’il s’agit d’un déclencheur de la clause. L’action associée est un ensemble d’instructions qui sont exécutées lorsque l’événement est déclenché.

A un instant donné une clause peut être en cours d’exécution ou pas. Si elle n’est pas en cours d’exécution et qu’un événement se produit, Sisal va la mettre en exécution dès que possible. Si elle est déjà en exécution quand un événement se produit, Sisal va attendre qu’elle ait terminé son exécution avant de pouvoir en relancer une nouvelle.

ATTENTION ce point est important, une clause ne peut être relancée qu’après sa terminaison normale, elle n’est pas interrompue pour être relancée.

Pour connaître les événements qui se produisent, Sisal balaye périodiquement l’ensemble des déclencheurs pour voir si leur valeur a été modifiée. Si c’est le cas Sisal marque la clause comme devant être exécutée le plus tôt possible. Si deux événements de la clause se produisent en même temps, Sisal ne déclenchera qu’une seule fois la clause.

Un événement déclenché par un objet marque directement la clause comme devant être exécutée au plus tôt. Là aussi on n’interrompt pas la clause en cours d’exécution.

Données

Les données recouvrent l’ensemble des variables ou mots d’états externes ou internes qui peuvent être lus ou écrits. Une donnée est définie par un nom symbolique unique dans la portée de la donnée.

Un nom de données comprend au plus 32 caractères alphabétiques, numériques ou le caractère "_"  et commence obligatoirement par un caractère alphabétique. La casse (majuscule ou minuscule) n’est pas significative pour des données déclarées dans un script.

Exemple : Chaine_De_Montage, L312, ....

Variables

Les variables sont des données définies dans le script. Une variable n’a pas de type prédéfini, elle peut contenir tour à tour :



Les variables sont définies par la déclaration VAR.

VAR variable1 ; variable2 ; variable3 ;

Si cette déclaration est dans le script mais en dehors d’une fonction ou d’un objet de script, cette variable est globale et son contenu est conservé pendant toute la durée d’exécution du script. Si cette déclaration est faite dans une fonction ou un synoptique, cette variable est dite locale et sa valeur n’est conservée que pendant l’exécution de la fonction ou du synoptique.

Structures

Sisal permet de déclarer des structures de données. Une structure est un ensemble de variables, ou membres, identifiées par un nom de membre. Cette structure doit être déclarée dans une partie Var d’un script ou d’un synoptique.

Struct Begin { Variable ;} End

Par exemple la déclaration suivante décrit une structure ayant quatre membres :

MonProduit Struct Begin

Date ;

Identification ;

Couple ;

Pression ;

end ;

On peut référencer un membre d’une structure en utilisant la notation pointée.

MonProduit.Couple = 133.5 ;

Message( "Produit fait le "  , MonProduit.Date) ;

On peut aussi référencer un membre d'une structure par son rang (0 à N-1) dans la structure, en utilisant la fonction système field.

MonProduit.Field( 2) = 133.5; // Couple est le troisieme champ de la strucure

Tableaux

Sisal permet de déclarer des tableaux de données. Un tableau est un ensemble de variables réunies et accédées par un numéro. Cette structure doit être déclarée dans une partie Var d’un script ou d’un synoptique.

Array[ Dimension {, Dimension} ] { Structure} ;

Un tableau peut être un tableau de structure ou de tableau. Dans tous les cas il ne devra avoir au plus que 3 dimensions (une déclaration de structure compte pour une dimension).

Les exemples suivants montrent différentes déclarations de tableaux :

MonoDim Array[ 5] ; // Tableau de cinq éléments ( de 0 à 4) de variable

BiDim Array[ 3, 3] ; // Matrice à deux dimensions

Encours Array[ 100] of Struct Begin // Tableau de structure

Record ; // Numéro d’enregistrement

Date ; // Date de création

Gamme ; // Gamme fonctionnelle associèe

end ;

Le référencement d’une variable de tableau se fait en indiquant le rang de la variable entre crochets.

MonoDim[ 3] = 0 ;

BiDim[ i, j] = i+j ;

Encours[ 25].Date = Now() ;

Tableaux associatifs

Sisal permet de déclarer des tableaux asociatifs de données. Un tableau est un ensemble d'enregistrements réunis et accédés par une valeur quelconque. Cette structure doit être déclarée dans une partie Var d’un script ou d’un synoptique.

Map { Structure} ;

Par construction, à chaque valeur de clé est associé un seul enregistrement.

L'exemple suivant montre un tableau qui enregistre pour chaque produit deux caractéristiques température et pression. Les enregistrements sont accédés par l'identification du produit :

Encours Map of struct begin

Temperature; Pression;

End;

Le référencement d’une variable de tableau se fait en indiquant le rang de la variable entre crochets.

Encours[ "AZ25332"].Temperature = 50; // Création de cet enregistrement et valorisation d'un seul champ

If Encours[ "BY32767"].Pression > 25 then ….

On peut référencer un enregistrement qui n'a pas été créé, dans ce cas il existe mais toutes les valeurs rendues sont indéfinies.

Des fonctions système spécifiques permettent de gérer un tableau associatif.

La fonction find permet de tester l'existence d'un enregistrement dans un tableau associatif.

Find( TabAss, Cle): Booléen

La fonction permet de compter le nombre d'enregistrement d'un tableau associatif

Count( TabAss): Entier

La fonction Delete permet de supprimer un enregistrement d'un tableau associatif

Delete( TabAss, Cle): Booléen

Et la boucle For permet de balayer tous les produits contenus dans un tableau associatif.

For Variable In TabAss do INSTRUCTION

Par exemple, recherchons tous les produits dont la température est supérieure à 165°.

For produit In Encours do

If Encours[ produit].Temperature > 165 then …

Listes

Sisal permet de déclarer des listes de données. Une liste est équivalente à un tableau à une seule dimension mais qui peut être redimensionné. Une liste peut-être spécialisée et optimisée pour certains types de données. Cette structure doit être déclarée dans une partie Var d’un script ou d’un synoptique.



List;

List of Structure;



Les listes d'entiers (List of int1) et de chaines de caractères (List of string) sont optimisés par Sisal afin d'en accéler le traitement. On peut définir une liste de constante avec la syntaxe suivante.

{ item [, item] }

Les exemples suivants montrent différentes déclarations de liste :

MaListe List; // Liste de valeurs quelconques

MesEnreg List of int; // Liste d'entier chaque entier est un numèro d'enregistrement

MesReferences List of string; // Liste de références

Le référencement d’un élément d'une liste se fait en indiquant le rang de la variable entre crochets.

MaListe[ 3] = 0;

MesProduits.Read( MesEnreg[i]);

Encours[ 25].Date = Now() ;

Le premier élément de la liste est accédé par 0 et le dernier par la taille de la liste moins 1. Rang peut être négatif, dans ce cas il désigne l'élément accédé par la taille de la liste moins le rang.

DerniereValeur = MaListe[-1]; // -1 désigne toujours la dernière valeur de la liste sauf quand elle est vide

Si on essaye de lire une donnée à un rang inférieur à 0 ou supérieur à la taille de la liste moins un, on obtient la valeur nulle.

Si on essaye d'affecter une valeur à un rang supérieur à la taille moins un, la taille de la liste est rallongée, les nouveaux éléments sont indéfinis (ou valorisé à 0 pour des entiers et à la chaîne vide pour des chaînes).

Si on essaye d'accéder à un rang < 0 (après prise en compte de la convention « valeur négative => taille - valeur ») une exception système est levée.

On peut affecter une variable liste par une autre variable ou une liste de constante.

MaListe = { 1, 2, 3, 5, 8, 13};

MaListe = MesEnregs;

MesReferences = { « XY412 », « ZK42 », « 45C18 »};

Des méthodes et des fonctions système spécifiques permettent de gérer les listes.

La méthode Add ou la fonction List_Add permet de rajouter une donnée dans la structure après un certain rang.

List.Add( Value {, rang}) : status

List_Add( List, Value {, rang]) : status

Le paramètre rang peut être négatif, dans ce cas il désigne l'élément en partant de la fin de liste, par défaut pour la méthode Add rang vaut -1 donc désigne le dernier élément, et rajouter un élément après le dernier élément équivaut à rajouter un élément à la liste.

La méthode Insert ou la fonction List_Insert permet d'insérer une donnée dans la liste avant un certain rang.

List.Insert( Value {, rang}) : status

List_Insert( List, Value {, rang}) : status

Le paramètre rang peut être négatif, dans ce cas il désigne l'élément en partant de la fin de liste, par défaut pour la méthode Insert rang vaut 0 donc désigne le premier élément, et rajouter un élément avant le premier élément équivaut à rajouter un élément en début de liste.

La méthode Remove ou la fonction List_Remove permet de retirer une donnée de la structure.

List.Remove( {rang}) : status

List_Remove( list { , rang}) : status

Par défaut rang vaut 0, donc cela équivaut à retirer la tête de liste.

La méthode Size ou la fonction Count permet de compter le nombre d'enregistrement d'une pile ou d'une file.

List.Size() : Entier

Count( List) : Entier

La méthode Find ou la fonction LIST_Find permettent de retrouver une élément d'une liste par sa valeur.

List.Find( value) : rang

List_Find( list, value) : rang

Si la valeur n'est pas retrouvé dans la liste la méthode retourne null.

On peut itérer sur les éléments d'une liste

Par exemple

For i in MaListe do Message( Value(I));

affiche toutes les valeurs de MaListe. Dans ce cas I est un itérateur et pour obtenir la valeur pointée par lui il faut utiliser la fonction système Value.

Piles et Files

Sisal permet de déclarer des piles et des files de données. Ces structures de données disposent de deux fonctions Push et Pull qui permettent respectivement d'introduire une donnée et de retirer une donnée.

La différence de fonctionnement entre les deux structures réside dans le fait qu'avec une pile le premier sorti est le dernier arrivé (LIFO), alors qu'avec une file le premier sorti est le premier arrivé (FIFO).

Cette structure doit être déclarée dans une partie Var d’un script ou d’un synoptique.

Stack;

Queue;

L'exemple suivant montre l'utilisation des deux structures.

Attendus Queue;

Stock Stack;

Push( Attendus, " AZ25332"); Push( Stock, " BY32767");


If Count( Attendus) then ProduitAttendu = Pull( Attendus);

PrisAuStock = Pull( Stock);

If PrisAuStock then …

Des fonctions système spécifiques permettent de gérer les piles et files.

La fonction Push permet de rajouter une donnée dans la structure.

Push( StackOrQueue, donnée)

La fonction Pull permet de retirer une donnée de la structure.

Pull( StackOrQueue) : donnee

Si la structure est vide la valeur rendue est indéfinie.

La fonction Count permet de compter le nombre d'enregistrement d'une pile ou d'une file.

Count(StackOrQueue): Entier

Dans les autres cas de référencement d'une variable Pile ou File, la donnée accédée est la prochaine donnée à être extraite. On peut par exemple modifier sa valeur.

If EnCours == "AZ3855314" then EnCours = "AZ385514";

Il n'est par contre pas possible de consulter les autres données enregistrées, ni d'itérer sur chacune d'entre elles.

Arbres étiquettés

Sisal permet de déclarer des arbres étiquettés de données1. Un arbre étiquetté2 est une structure de données rangées en arbre et donc chaque feuille ou branche est étiquettée, c'est à dire définie par un nom. Le gros intérêt de l'arbre étiquetté est de pouvoir lire ou générer un fichier XML ( eXtended Markup Language) directement à partir de et vers son contenu; ce qui représente un très gros avantage lors de l'exploitation de données structurées provenant d'internet.

Cette structure doit être déclarée dans une partie Var d’un script ou d’un synoptique.

LTree;

Une définition rigoureuse d'un arbre étiquetté est de dire qu'un arbre étiquetté est soit une valeur simple de Sisal identifié par un nom, soit une suite d'arbre étiquetté identifié chacun par un nom.

Cette définition étant récursive, une valeur simple sera défini par un nom composé; de même on peut définir un sous-arbre étiquetté par un nom composé.

Par exemple ce petit fichier xml définit

<Measure>

<Offset>12.45</Offset>

<Strength >37.2</Strength >

</Measure>

un sous-arbre " Measure " et deux valeurs " Measure.Offset> et " Measure.Strength ".

Donc pour définir une valeur ou un sous-arbre d'un arbre étiquetté, on utilisera la notation pointée constituée de la suite de chaque étiquette de chaque branche et feuille permettant d'accéder à la valeur recherchée, on appelera cela le chemin d'accés.

L'exemple suivant définit un arbre étiquetté.

MyXml Ltree;

L'accés aux données associées à une branche ou une feuille, on utilisera les fonctions systèmes reservées (cf. Value et Set Value)

Si dans un sous-arbre plusieurs éléments ont le même nom (on appelle cela des valeurs multiples), Sisal peut les différencier par le chemin en postfixant celui-ci d'une sélection de tableau; par exemple, si on a l'arbre étiquetté suivant:

<Curve>

<Point> <x>1.0</x> <y>12.55</y> </Point>

<Point> <x>2.0</x> <y>13.18</y> </Point>

<Point> <x>3.0</x> <y>11.42.55</y> </Point>

</Curve>

On pourra définir Value( MyXml, "Curve.Point[0].x") pour accéder à la première abscisse et Value( MyXml, "Curve.Point[2].y") pour accéder à la dernière ordonnée.

Des fonctions système spécifiques permettent de gérer les arbres étiquetés.

La fonction Add permet d'ajouter des éléments à un arbre étiqueté.

Add( ArbEt, Chemin {, Valeur}): Arbet

Cette fonction rend un sous-arbre de l'arbre principale auquel on pourra rajouter d'autres sous-arbres.

Par exemple pour recréer l'exemple précédent:

Var MyTree Ltree;

MySubTree;

...

MySubTree = Add( MyTree, " Measure ");

Add( MySubTree, " Offset ", " 12.45 ");

Add( MySubTree, " Strength ", " 37.2 ");

La fonction find1 permet de tester l'existence d'un chemin dans un arbre étiquetté.

Find( ArbEt, Chemin): Booléen

Par exemple

if Find( MyTree, " Measure ") then ...



La fonction SubTree permet d'accéder à un sous-arbre d'un arbre, si le sous-arbre n'existe pas la fonction rend indéfinie.

SubTree( ArbEt, Chemin): Arbet

Le sous-arbre2 n'est pas une copie du sous-arbre de l'arbre initial, mais référence bien une partie de l'arbre initial. Toute modification du sous-arbre entraînera une modification de l'arbre initial.

Les fonctions Up, Next et First permettent de passer d'un sous-arbre à l'autre. La fonction Up renvoie au sous-arbre père, la fonction Next renvoie au sous-arbre frère et la fonction First renvoie au premier sous-arbre.

Up( Arbet) : Arbet

Next( Arbet): Arbet

First( Arbet): Arbet

Toutes ces fonctions rendent un sous-arbre lorsque cela est possible et indéfini dans le cas contraire.

Par exemple pour accéder à tous les éléments d'un sous-arbre

Var MyXml Ltree; MySub;

...

MySub = First( SubTree( MyXml, " Measure "));

while MySub Do begin

Message( Path( MySub):" = ":Value(MySub));

MySub = Next( MySub);

end



La fonction Count permet de compter le nombre d'élément d'un arbre étiqueté c'est à dire le nombre de sous-arbres ou de feuilles définis au niveau de cet arbre.

Count( ArbEt {, Chemin}): Entier

Par exemple

if Count( MySub) != 2 then Message( "Is no good");

Lorsqu'un chemin est transmis en paramètre, la fonction rend le nombre d'élément ayant le même chemin; par exemple pour connaître le nombre de points de notre courbe, on peut faire

Nb = Count( MyTree, "Curve.Point");

if Nb then

For i = 0 to Nb do

Message( Value( MyTree, "Curve.Point[":i:"]"));

La fonction ParseArray permet de répartir les valeurs multiples d'un arbre étiquetté dans les cellules d’un tableau.

ParseArray( Arbet, Chemin {, souschemin}, tableau) : Nombre

Le premier paramètre est l'arbre étiquetté contenant les valeurs multiples, le deuxième la chaîne contenant le chemin définissant ces valeurs multiples, le troisième optionnel la suite du chemin permettant d'acéder aux valeurs terminales et le dernier le tableau qui contiendra chacun des sous‑champs. La fonction rend le nombre de valeurs qui ont été rangées dans le tableau.

Si le tableau est trop petit les derniers sous‑champs ne sont pas écrits dans le tableau. Si le tableau contient plus de cellules que de sous champs, les derniers éléments du tableau sont indéfinis.

Exemple :

Var i, Nb, Tab[ 10];

Begin

Nb = ParseArray( MyTree, "Curve.Point", "x", Tab);

for i = 0 to nb do Message( Tab[i]);

end

Rangera successivement dans le tableau Curve.Point[0].x,

Curve.Point[1].x, ...



La fonction Delete permet de supprimer un enregistrement d'un arbre étiquetté ou de le vider.

Delete( ArbEt {, chemin}): Booléen

La fonction GetXml permet de charger un arbre étiquetté à partir d'une chaine de caractère; la fonction rend vrai si l'analyse s'est bien passée, faux s'il y a eu au moins une erreur.

GetXml( ArbEt, Chaine): booléen

Si la chaine contient des valeurs vides , par exemple "<x> </x>" ou "<x/>", les éléments correspondants seront créés mais leurs valeurs sera indéfinie.

Attention le chargement n'efface pas le contenu précédent de l'arbre, on rajoute des branches et des feuilles à l'arbre existant; pour n'avoir que le contenu de défini dans la chaine, il faut vider l'arbre.

Par exemple

Delete( MyXml);

GetXml( MyXml, " <alfa><bravo>Bravo</bravo><charlie/></alfa> ");



La fonction PutXml permet de former une chaine XML à partir du contenu de l'arbre étiquetté.

PutXml( ArbEt): Chaine

Si l'arbre contient des éléments indéfinis, la chaine contiendra des attributs vides du genre "<x/>".

La fonction ReadXml permet de charger un arbre étiquetté à partir d'un fichier texte.

ReadXml( arbet, fichier): booléen

La fonction attend en paramètre un arbre étiquetté et un chemin d'accés à un fichier; elle retourne vrai si cela s'est bien passé.

Par exemple

if ReadXml( MyXml, "C:\Test.xml")

then Message( "Measure ":Value( MyXml, "Measure.Offset"));

La fonction WriteXml permet d'enregistrer dans un fichier le contenu d'un arbre étiquetté.

WriteXml( arbet, fichier {, entete}) : booléen

La fonction attend en paramètre un arbre étiquetté, un chemin d'accés à un fichier et optionnellement une chaine de caractère qui sera écrite en tête de fichier (cette option permet de construire des fichiers conforme au standard Xml en définissant le niveau de standard (<?xml..) et intégrant des commentaires éventuels (<!-- ...).

Par exemple

WriteXml( MyXml,

"C:\\Test.xml",

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

La fonction Label permet de connaître l'étiquette associé au chemin sélectionné; cela est plus particulièrement utile pour les itérateurs d'arbre étiquetté.

Label( ArbEt[ chemin]) : Chaine

De même la fonction Path permet de connaître le chemin de l'élément sélectionné; cela est plus particulièrement utile pour les itérateurs d'arbre étiquetté.

Path( ArbEt[ chemin]) : Chaine

Par exemple

Label( MyXml[" Measure.Offset "]) -> " Offset "

Path( MyXml[" Measure.Offset "]) -> " Measure.Offset "

Les fonctions Value et SetValue permettent respectivement de lire et de modifier la valeur associée à une feuille ou une branche de l'arbre.

Value( Arbet {, chemin}): valeur

SetValue( Arbet, chemin, valeur): status

Les fonctions attendent en paramètre une arbre ou un sous-arbre ou un itérateur d'arbre, et si requis un chemin complémentaire qui peut être la chaîne vide. La fonction Value retourne la valeur enregistrée dans cet élément de l'arbre si elle existe, indéfinie si elle existe pas. La fonction SetValue attend en troisième paramètre la valeur à affecter; si l'élément n'existe pas il est créé et la fonction retourne 1, si l'élément existe la fonction retourne 0, dans les autres cas la fonction rend indéfini. Par exemple:

X = Value( MyXml, « X »);

if X then SetValue( MyXml, « X », X+1);

Et la boucle For permet de balayer tous les éléments définis dans un arbre étiqueté.

For Variable In ArbEt do INSTRUCTION

Par exemple, recherchons toutes les mesures.

For mesure In Subtree( MyXml, “Measure”) do

If Label( mesure) == “Strength” then ...

La fonction EachNode permet de définir un itérateur permettant d'accéder à chacun des sous-arbres et des feuilles d'un sous-arbre.

For Variable In EachNode( Arbet {, chemin}) do INSTRUCTION

Par exemple pour afficher tous les noeuds d'un arbre

For MyNode in EachNode( MyXml) do

Message( Name( MyNode): " = " :MyNode);

Itérateur

Un itérateur est une variable permettant d'accéder successivement à tous les éléments d'un ensemble caractérisé par une propriété.

Par exemple l'ensemble des enregistrements d'un base de données modifiés entre telle et telle date, ou l'ensemble des connexions ayant reçues des données.

MonIter = MesProduits.Select( MonIndex, Now()-86400, Now()) ;

Ces itérateurs sont gérés implicitement dans les boucles For, mais peuvent être utilisées unitairement grâce aux fonctions système good et inc. Good( iterateur) indique que l'itérateur pointe sur un élément valide en rendant 1 et 0 autrement, et Inc( iterateur) permet de passer à l'élément suivant.

Par exemple

MonIter = MesProduits.Select( MonIndex, Now()-86400, Now()) ;

while good( MonIter) do begin

MesProduits.Read( MonIter) ;

Message( MesProduits.Date) ;

inc( MonIter) ;

end

Événement

Une variable globale peut être déclaré comme un événement.

Variable Event ;

A partir de ce moment là, cet événement peut être utilisé comme déclencheur de clause.

MonEvenement Event ;

...

On MonEvenement do Message( « Mon evenement ! ») ;

Comme un événement ne peut être utilisé que comme déclencheur de clause événementielle, cet événement est obligatoirement défini de manière globale.

Cet événement sera déclenché par l'appel de la fonction système Raise.

Raise( Event)1

Raise( MonEvenement) ;

Variables externes

Les variables externes sont des variables appartenant à des équipements externes ou à des modules. Les équipements externes sont par exemple les automates reliés au serveur par un réseau de communication. Les équipements externes sont définis dans les fichiers décrivant l’environnement de fonctionnement du serveur. Une variable externe sera dans ce cas une adresse mémoire de l’automate.

Une variable externe n’a pas besoin d’être déclarée dans un script, il suffit de la référencer par le nom de l’équipement suivi d’un point suivi du nom de la variable ( notation pointée).

Par défaut les variables externes appartiennent à la ligne associée au script (voir définition d’un script ou d’un synoptique). S’il est nécessaire d’accéder à une autre ligne on fait précéder le nom de variable externe du nom de la ligne suivi d’un point.

[ NomDeLigne.]NomDEquipement.NomDElements

Exemple :

Server( L964 ) Begin

// Référence l’adresse Marche de l’automate Chargement de la ligne // L964 Chargement.Marche = 0 ; // Référence l’adresse Température de l’automate Four de la ligne

// Cuisson

TempératureCourante = Cuisson.Four.Température ;

End

Toute variable externe doit être définie dans l’environnement.

Variables de modules

Les modules sont des entités permanentes, par exemple des bases de données dédiées à un fonctionnement particulier. Tout module doit être défini dans l’environnement. Chaque type de module définit un certain nombre de variables spécifiques accessibles à partir de tout script. Ces variables sont accédées dans le script par la notation pointée.

NomDeModule.NomDeVariable

Par exemple, le module MesProduits a été défini dans l’environnement.

Var NombreDEnregistrement ;

NombreDEnregistrement = MesProduits.Nombre ;

Message( "Nombre d’enregistrement : " +N ombreDEnregistrement) ;

Variables d’objets

Les objets sont des entités fonctionnelles qui regroupent des variables, des fonctions et des événements pendant l’exécution d’un script ou d’un synoptique.

Par exemple un module est un objet permanent ; par contre une liaison série ou un objet graphique sont des objets créés au lancement du script ou du synoptique, ...

Un élément d’un objet sera accédé en utilisant la notation pointée. Par exemple

On MonObjet.LEvénement Do  ...

MonObjet.LaVariable = 1 ;

MonObjet.LaFonction() ;

Classes et objets

Sisal permet de déclarer des classes et des objets. Une classe est une structure comprenant des données et des méthodes, un objet est une variable Sisal dont les caractéristiques sont définies par une classe; on dit que tel objet est de telle classe, ou un objet est une instance d'une classe.

Les classes sont définies par la déclaration TYPE, les objets sont définis comme les autres variables par la déclaration VAR. Une classe peut hériter de la définition d'une autre classe1, on dit alors de cette classe qu'il s'agit de la classe parent.

Type

NomDeClasse Class [ClasseParent] begin

{ Constante; | Membre; | Methode;}

end


La déclaration d'une constante

NomDeConstante Const ValeurConstante;


La déclaration d'un membre

NomDeMembre [Static] [ Classe | Structe | List | ...];


La déclaration d'une méthode

[Function] NomDeMethode ( [ Parametre [ = ValeurConstante] {, Parametre [= ValeurConstante]}]);

[Function] Create( [ Parametre [ = ValeurConstante] {, Parametre [= ValeurConstante]}]);

[Function] Delete();


Une méthode peut définir des paramètres par défaut, lors de l'appel d'une méthode les paramètres non renseignés sont remplacés par la valeur par défaut correspondante.

La méthode Create (mot réservé) est exécutée à la création de l'objet ;

La méthode Delete (mot réservé) est obligatoirement sans paramètres et est exécutée juste avant la destruction d'un objet. La destruction d'un objet a lieu lorsque la dernière référence à cet objet est supprimée ; par exemple pour un objet global ce sera avant l'arrêt du serveur ou du synoptique, pour un objet local à une fonction ce sera à la sortie de la fonction à la condition que cet objet n'ait pas été référencé dans une structure globale conservant une référence sur cet objet ( par exemple si on fait MaListeGlobal.Add( MonObjetLocal)).

Plus loin dans le code on pourra avoir la définition de la méthode.

Function NomDeClasse.NomDeMethode( [ Parametre {, Parametre }])

[ Var { variable;}]

[ Begin { instructions; } end]

;

Par exemple définissons les classes Point et Figure:Type

Point Class begin

Pi const 3.141592;

X; Y;

Est() begin return « Point »; end;

Distance() begin return sqrt( x*x + y*y);

end;


Figure Class Point begin

Forme;

Create( forma) begin Forme = forma end;

Est() begin return « Figure »; end;

end;

La déclaration « Figure class point begin... » indique qu'une figure est un point donc elle dispose en standard des champs X et Y et des deux méthodes Est et Distance. On remarque aussi que la méthode Est est redéfinie, c'est ce que l'on appelle une méthode virtuelle.

On va pouvoir déclarer des objets.

Var

MonPoint Point;

MaFigure Figure;


...

Begin

MaFigure.X = 4; MaFigure.Y = 3; MaFigure.Forme = "Carré";

Message( MaFigure.Est():" est à ":MaFigure.Distance());

End


Cet exemple va afficher « Figure est à 5 », essayons de comprendre pourquoi.

La notation pointée permet d'accéder aux membres et méthodes d'un objet.

Une méthode est une fonction toujours intrinsèquement lié à un objet, cet objet est en fait le premier paramètre d'appel de la fonction, on peut le référencer sous l'identifiant « this »1.

Dans le corps de la méthode les membres et méthodes de l'objet sont accédés directement sans les préfixer par la notation pointé.

Donc « MaFigure.X » valorise le champ X de l'objet MaFigure.

« MaFigure.Distance() » effectue l'appel de la méthode Distance de Point car Figure.Distance n'est pas déclarée et donc on recherche successivement les parents jusqu'à tomber sur une déclaration.

MaFigure.Est() effectue l'appel de Figure.Est car MaFigure est une instance de Figure, et la méthode Est a été redéclarée dans Figure. Ce n'est pas simplement l'écrasement de la déclaration de Point.Est par Figure.Est, car ce sont des méthodes virtuelles c'est à dire que si dans un traitement quelconque on vient à traiter une figure comme une simple fonction, dans un paramètre de fonction par exemple, alors la méthode appelée est celle qui correspond au type effectif de la variable.

Par exemple

Function EnVrai( UnPoint Figure)

begin

return UnPoint.Est();

end

...

Var MaFigure Figure;

...

Message( EnVrai( MaFigure));

Dans ce cas EnVrai retourne « Figure », car bien que on ait déclaré en paramètre un point, ce qui a été transmis en paramètre lors de l'appel est en fait une figure.

Enfin si dans une méthode on souhaite appeler une méthode virtuelle d'une classe ascendante on préfixe le nom de la méthode du nom de la classe ascendante (par exemple Point.Est();).

Pere class

begin

nom ;

create( n_om) ;

end


Fils class pere

begin

age;

create( n_om, a_ge);

end


Fils.create( n_om, a_ge)

begin

pere.create( n_om); // Ici on appele le create du pere

age = a_ge;

end



Allocation dynamique

La définition du type d'une variable est nécessaire car elle permet à Sisal de connaître les méthodes et attributs disponibles. Dans certains cas cependant on ne connaît pas à la compilation la variable effectivement traitée et/ou une partie de ses caractéristiques ( par exemple la taille d'un tableau).

Sisal permet de déclarer une variable d'un certain type sans l'allouer, on déclare la variable comme si il s'agissait d'une variable de ce type.

Variable AS Type;

Par exemple

MonPoint As Point ;

MonTableau as Array[1] ;

MonTableauDePoint Array[100] as Point;

...

echo( "MonPoint.est ":MonPoint.est());

Au démarrage MonPoint n'est pas créé, mais on peut avoir du code relatif à celui-ci. A l’exécution cette instruction provoquera un erreur (/ErrSys/ Object access) car à ce moment là MonPoint n'est pas un point.

Pour que ce point existe et effectivement pouvoir l'utiliser il faut l'allouer.

New Type ;

Par l’exécution de la primitive new on créée une nouvelle instance de ce type, par exemple.

MonPoint = new Figure( « cercle ») ;

echo( "MonPoint.est ":MonPoint.est());

On créée une instance de figure ; Figure est une classe dérivée de Point ; On peut donc considérer cette instance Figure comme une instance Point et l'affecter à une variable de type Point.

Derrière on pourra appeler sur MonPoint les méthodes de Point mais pas celles de Figure.

Portée et Durée de vie

Les variables globales, externes, de modules ou d’objets sont uniques et permanentes. Elles peuvent être lues et mises à jour par chacun des scripts.

Les variables locales à une fonction sont définies uniquement à l’intérieur de la fonction et ont une durée de vie égale à la durée d’exécution de la fonction.

Les variables locales à un serveur ou à un synoptique sont permanentes, mais dupliquées pour chacune des clauses événementielles, elles ne sont accessibles qu’à l’intérieur de la clause événementielle.

Les variables associées à un objet, les membres sont définies lors de la déclaration de l'objet et ont une durée de vie égale à la durée de vie de l'objet.

Widget et DC

Sisal prédéfinit deux classes particulières ; Widget (mot réservé) et DC (mot réservé). Ces classes sont particulières car gérées directement par Sisal1.

Un DC (Device Context) est créé par Sisal chaque fois qu'un widget doit être peint, il contient l'ensemble des caractéristiques ( taille de la zone d'affichage, pinceau, peinture, épaisseur des traits,..) de l'ustensile utilisé pour peindre ( écran, imprimante,...).

Un widget est un objet d'interface homme-machine (windows-gadget), qui peut être utilisé dans une vue de synoptique ; c'est un objet qui définit à minima la méthode Create2 et qui dispose en plus des méthodes permettant de le placer et de le peindre dans le synoptique.

La méthode Place (mot réservé) permet de calculer comment sont placés les sous-ensemble de l'objet en fonction de la taille et du positionnement transmis en paramètre. La méthode place êrùet en pârticulier de mémoriser le placement du widget.

La méthode Paint (mot réservé) permet de peindre le widget lorsque Sisal a besoin de repeindre le widget.

widget class sys 1 begin

x; y; w; h;

alfa;

Create( libel, x, y, w, h);

Place( x, y, w, h);

Paint( mydc DC);

end;



rond class widget begin

color;

create( libel, x, y, w, h, color);

Paint( mydc dc);

end;


Function rond.create( libel_, x_, y_, w_, h_, color_)

begin

color = color_;

place( x_, y_, w_, h_);

end


Function rond.paint( mydc dc)

begin

mydc.setbrush( color);

mydc.drawRectangle( x, y, w, h);

end


Object

w0 widget, "", 10, 10, 20, 20;

r1 rond, "", 50, 10, 20, 20, RGB( 0, 255, 0);

Afin de pouvoir être placé et modifié dans un canevas avec l'outil de conception intégré1, une classe widget doit définir la méthode Print() qui rend le corps de la déclaration à inclure dans le source du synoptique.

Function rond.print()

begin

return "\"", ":x:", ":y:", ":w:", ":h:", ":color;

end

En mode édition, le canevas fait apparaître sur le widget sélectionné des poignées aux 4 coins du widget ( soit { x, y}, { x+w, y}, { x, y+h}, { x+w, y+h} ; l'utilisateur peut tirer sur ces poignées pour modifier la taille du widget.

Certains widgets offrent des poignées supplémentaires, par exemple lorsque l'on veut représenter un tuyau parcourant le canevas, on les représente alors par une liste de points ( { { 0, 0}, { 10, 5}, { 5, 10}, { 10, 10}}) ; ces poignées internes peuvent être déplacées à la condition que le canevas puisse les connaître et les modifier, c'est le rôle des méthodes getHandles() et setHandles().

tuyau class widget begin

handles list; // Liste des poignees internes

create( libel, x, y, w, h, hnd list);

Paint( mydc dc);

Print();

GetHandles();

SetHandles( hnd list);

end;


Function tuyau.create( libel_, x_, y_, w_, h_, hnd)

begin

handles = hnd;

place( x_, y_, w_, h_);

end


Function tuyau.paint( mydc dc)

var prime list;seconde list;

begin

mydc.setbrush( rgb( 255, 128, 64));

for iter in handles do begin

if prime == {} then prime = value( iter);

else begin

seconde = value( iter);

mydc.DrawLine( prime[0], prime[1], seconde[0], seconde[1]);

prime = seconde;

end

end

end


Function tuyau.getHandles()

begin

return handles;

end


Function tuyau.setHandles( hnd list)

begin

handles = hnd;

end


Object

w0 widget, "", 10, 10, 20, 20;

r1 tuyau, "", 50, 10, 20, 20, { { 0, 0}, { 10, 5}, { 5, 10}, { 10, 10}};



Device et Module

En standard Sisal interagit avec le monde extérieure à l'aide des équipements standards (field bus) et des modules standards (base produits, horloge, …). Les équipements sont définis dans la rubrique [equipment] et les modules dans la rubrique [Module] du fichier de configuration.

Afin de pouvoir s'adapter à toute sorte d'environnement, Sisal permet de définir des classes et des objets s’interfaçant au monde extérieur, ce sont les devices et les modules.

La déclaration de ces classes est faite dans la nouvelle rubrique [Include] du fichier de configuration, en déclarant un nouveau fichier d'inclusion ; ces fichiers définissent une ou plusieurs classes héritées des classes Device (mot réservé) et Module (mot réservé).

[Include]

inc1 = Poste_robotise.sch

inc2 = Compteur_electrique.sch

Les fichiers d’inclusion pourraient définir :

Poste_robotise class device lib "robot_412" begin

create( gamme, adresse string) integer alias "prob_create";

update( tick date) Dword alias "prob_update";

end;



compteur_electrique class device lib "compteur_s10c4" begin

create( adresse string) integer alias "extdvc_create";

get() alias « extdvc_get » ;

remise_a_zero() ;

consommation _totale float sys 2;

end;

Un module est un objet d'une classe qui dérive de la classe Module et donc dispose de la méthode Unlock(), cette méthode permet à Sisal de libérer la ressource à la fin de l'exécution d'une clause ; elle est définie par défaut dans la classe module.

Un device est un objet d'une classe qui dérive de la classe Device et donc dispose des méthodes Update( datation) et Unlock() ; la méthode Update permet à Sisal de réactiver périodiquement un device et de savoir si ce dernier a levé un ou plusieurs événements.

Un device ou un module peuvent être déclarés dans la rubrique [Module] du fichier de configuration, les paramètres de la déclaration seront les paramètres d'appel de la méthode Create.

Un device ou un module peuvent être déclarés dans la rubrique [Equipment] du fichier de configuration ; ils sont alors considérés comme des équipements de production et sont associés à une gamme de production (cf.Rubrique Equipment). La gamme de production est toujours le premier paramètre de l'objet et donc le premier paramètre d'appel du Create.

Par exemple

[Equipment]

PR_chargement = Poste_robotise; fChargement , fRessort; « 192.168.0.1 » ;

PR_dechargement = Poste_robotise; fCollage | fDechargement; « 192.168.0.2 » ;


[Module]

CE_Eclairage = « 192.168.0.1 » ;

CE_Chauffage = « 192.168.0.2 » ;



Dans cet exemple on voit que le device Compteur_electrique est complètement géré par une bibliothèque externe à Sisal (compteur_sc104.dll sous windows et libsisal_compteur_sc104.so sous linux) ; on dit qu'il s'agit d'un équipement « extérieur » car toutes ces valeurs et ses traitements sont gérés à l'extérieur de sisal1, sisal ne connaît que l'interface.

Inversement dans le fichier d'inclusion on peut définir un équipement ou un module complètement défini en langage de script sisal ; dans ce cas là on dit qu'il s'agit d'un équipement ou d'un module « interne ».

Cette librairie extérieure n'est pas fournie par Sisal mais par le fabricant du compteur électrique ou un fournisseur tiers ; cette librairie est définie par une interface standardisée (cf.annexe) et en particulier les données échangées sont typées ( entier, flottant, chaîne ce caractère et date).

Données échangées

La librairie extérieure définit des données identifiées dans l'interface par l'attribut Sys (par exemple consommation_totale est le premier attribut « sys 0 » défini dans l'interface). Toutes ces variables pourront être échangées avec les méthodes get (mot réservé) et put (mot réservé) que doit définir la librairie.

La librairie extérieure peut définir des événements et des itérateurs1., ce typage est fait au vol par Sisal mais doit donc être précisé dans l'interface (par exemple la valeur consommation_totale est de type flottant).

Méthodes

La librairie extérieure définit des méthodes pouvant être appelées par Sisal, une librairie pouvant gérer plusieurs classes, le lien entre une méthode d'une classe et sa fonction est faite par l'attribut alias qui définit le nom de la fonction dans la librairie, en l'absence de l'attribut alias sisal recherche la fonction de nom le nom de la méthode.

Une librairie extérieure peut définir plusieurs classes, lorsque sisal veut créer un équipement ou un module à la librairie, il appelle la méthode create définie dans sa classe. Cette méthode rend un identifiant d'objet maintenu par la librairie extérieure. Chaque fois que sisal a besoin de référencer cet objet il transmettra cet identifiant, en particulier pour demander sa destruction avec la méthode delete (mot réservé).

La méthode update (mot réservé) est appelée régulièrement par sisal pour chaque objet, cette méthode effectue le travail qu'elle a à faire et rend un compte-rendu indiquant à sisal si des événements ont été levés depuis le dernier appel à Update.

Ce compte-rendu est pour les équipements et modules externes2, un champ de bits (d'au moins 32bits), chaque bit correspond à un événement interne associé à une attribut ou événement identifié par son « sys » . Dans notre exemple, si au cours d'un update on constate que la consommation totale a changée, la méthode update retournera 0x04, c'est à dire 2 à la puissance 2 (sysid de consommation_totale).

La méthode unlock est très importante car elle permet de faire fonctionner le mécanisme implicite de protection des données. Cette méthode est définie dans les classes racines (device et module) ;Si vous êtes amenés à la redéfinir, il faut impérativement qu'elle intègre alors un appel à la méthode de la classe racine1.

mon_module class module begin

unlock() ; // Redéfinition et donc masquage de module.unlock()

end ;


monmodule.unlock()

begin

module.unlock() ; // Appel du deverrouillage systeme

end



La méthode print (mot réservé) est utile (mais pas nécessaire) car elle est utilisée par le débogueur pour afficher les données caractéristiques d'un équipement ou d'un module.

Les méthodes save et restore sont appelées respectivement à l'arrêt de sisal pour que l'objet puisse sauvegarder ses données propres dans un contexte commun et au démarrage de sisal pour que chaque objet déclaré dans le fichier de configuration puisse retrouver ses données propres lors de la dernière sauvegarde du contexte.

Visibilité des devices et modules

La configuration générale d'une application sisal est définie dans le fichier de configuration général Sisal.ini.

Dans ce fichier on peut avoir plusieurs déclarations dans la rubrique [MonApplication/Line], chaque ligne est ce que l'on appelle un topic. Par exemple un serveur qui gère la domotique de plusieurs bâtiments aura autant de topics que de bâtiments gérés. Les équipements et modules déclarés dans ce module ont une visibilité générale préfixé par le nom du topic ( topic1.monmodule.monattribut), l'ensemble de tous les équipements et modules des topics définissent l'environnement.

Dans ce même fichier de configuration, on peut déclarer un ou plusieurs serveurs dans la rubrique [MonApplication/Server], généralement on en a un seul mais pour des raisons de simplifications on peut décider d'en avoir plusieurs. A chacun de ces serveurs est associés un environnement d’exécution que l'on appelle une librairie. Par définition, cette librairie ne peut pas publier le contenu de ses données (variables globales), si elle doit communiquer avec une autre librairie elle doit utiliser des éléments définis dans l'environnement.

L'introduction des devices et modules a nécessité d'associer un environnement d'exécution sisal à chaque topic, cette environnement d'exécution a une fonction principale exécutée périodiquement la méthode update sur chacun des devices et modules, et des fonctions accessoires de sauvegarde save et de restauration restore.

Donc maintenant sur un environnement simple de sisal on a généralement deux environnements d'exécution un sur le topic et un sur le server1.

Publication des données de device et module interne

Les équipements et modules internes peuvent utiliser des données propres que l'on ne souhaite pas diffuser à l'extérieur, elles sont alors déclarées normalement ; par contre les données que l'on veut rendre visible à l'extérieur de la libraire doivent être suffixées par le mot-réservé « public ».






Constantes

Le langage de script permet d’inclure les constantes suivantes :

 Constantes

Forme

Exemple

Nombre

Entier

123


Hexadécimale

0xA28


Flottant

123E‑45


Equipement

Cellule2

Chaîne de caractère

Standard

"Exemple"


Spéciale

#13

Gamme

Fonction

fChargement

Null

Indéfinie

Null

Le nom d'un equipement dans un script équivaut à saisir la constante numérique correspondant à son rang dans le fichier de configuration.

Exemple:

MesAlarmes.Raise( Cellule2, 123);

Une chaîne de caractère est toute suite de caractère comprise entre deux """, si la chaîne doit contenir un """ ou un "\", il faut faire précéder ces caractères d’un "\".

Exemple:

" C:\\Program Files\\Veymont\\L964.ini "

Une chaîne de caractère spéciale permet de mettre des caractères spéciaux dans une chaîne de caractère en faisant suivre le caractère " # " de la valeur numérique du caractère à saisir.

Le nom d'une fonction de la gamme fonctionnelle du fichier de configuration équivaut à une constante gamme contenant une seule fonction sélectionnée.

GammeDeTest = fTestBranchement | fTestFonctionnel

| fTestAutonomie;

La constante "Null" permet de rendre indéfinie une variable :

MaVariable = Null ;

Constantes applicatives

Le langage de script définit les constantes applicatives suivantres :

Identifiant

Commentraire

_APPLICATION_

Nom de l'application activée lors du lancement de cet exécutable,

Sisal_Server -app GEMSA_T1

Le nom d'appplication définit le bloc de configuration décrit dans Sisal.ini, si il n'est pas défini le nom d'application est défini par le champ Alias de Sisal.ini

_INCLUDE_

Nom du fichier d'inclusion associé lors du lancement de cet exécutable,

Sisal_Client -inc Configuration_T1.sch

Le fichier d'inclusion, s'il est défini au lancemnt sera automatiquement inclus à tout synoptique lancé par ce Sisal_Client ; cela est utile si on veut définir dans le envirronement un paramétrag » différent à chaque lancement.

_FILENAME_

Nom du fichier executable de ce script ou de ce synoptique



Instructions

Le langage comprend les instructions classiques qui permettent d’effectuer tous les algorithmes structurés.

Instructions de base

Les instructions de base permettent d’évaluer des expressions (cf. Opérateurs), toute expression produit une valeur non typée. L’instruction se termine par le " ; " .

Alpha = Bravo + 10 ;

Verine( 108, 42, 10, 10, Red) ;

Bloc

Toute instruction peut être remplacée par un bloc d’instructions qui s’exécutent séquentiellement.

Begin INSTRUCTION { INSTRUCTION } End

Affectation

L’affectation permet d’affecter à une variable ou à un attribut d’un objet une valeur.

NomDeVariable = Expression ;

Instruction conditionnelle

L’instruction conditionnelle permet d’exécuter des instructions en fonction d’une condition.

If CONDITION Then INSTRUCTION [ Else INSTRUCTION]

If Dechargement.DefautProduit Then Refuse = Refuse + 1 ; Else Bon = Bon+1 ;

Instruction AuCasOu

L’instruction AuCasOu permet d’exécuter des instructions d'une liste d'instructions en fonction de la valeur d'une expression.

Case EXPRESSION Of

{ CONSTANTE : INSTRUCTION }

[ Else INSTRUCTION]

L'expression associée au case est évaluée, puis le résultat est comparé à chacune des constantes énumérées; à la première égalité entre le résultat de ll'expression et la constante l'instruction associée est exécutée.

Case ed.LastKey() of

0x10 : NbLigne = NbLigne+1;

0x13: Null; // Retour chariot aucune action

else NbChar = NbChar + 1;

Boucle While … Do

L’instruction de boucle While-Do permet de répéter une instruction tant qu’une certaine condition est vérifiée. L'instruction peut ne pas être exécutée.

While CONDITION Do INSTRUCTION

While Dechargement.Temperature > 55 Do Delai = Delai + 1 ;

Boucle Do … While

L’instruction de boucle Do-While permet de répéter une liste d'instructions tant qu’une certaine condition est vérifiée. La liste d'instruction est exécutée au moins une fois.

Do INSTRUCTION { INSTRUCTIOn} While CONDITION;

Do Wait; While Delai > GetTickCount();

Boucle For

L’instruction de boucle For permet de répéter une instruction sur une incrémentation de compteur

For Var = EXPRESSION To EXPRESSION do INSTRUCTION

For Indice = 0 to 9 do Table[Indice] = 0;

Instruction de retour

L’instruction de retour permet à une fonction de rendre une valeur. Cette instruction est optionnelle, par défaut une fonction rend la valeur indéfinie.

Return EXPRESSION ;

Return Ecart_type ;

Définition de fond de synoptique

[Obsolète: Utiliser la declaration d'objet graphique Background]

Dans un script de définition de synoptique, l’instruction Background permet de définir le fond d’écran qui sera affiché. Le paramètre associé est le nom de fichier contenant le dessin. Différents formats graphiques sont acceptés : .BMP, ...

Background NOMDEFICHIER ;

Background "Synoptic.bmp"  ;

Include

L'instruction Include permet d'inclure un fichier dans le flot de compilation d'un script.

Inlude "NomDeFichier";

Cela est particulièrement utile pour déclarer dans un fichier des définitions de constantes ou de Dll partagées entre plusieurs scripts.

Par exemple:

Include "Odbc.sch";

Define

L’instruction Define permet de définir des chaînes de caractère constante qui apparaîtront dans le script. Par exemple cela permet de définir des dimensions de tableaux et de les modifier quand c'est nécessaire à un seul endroit.

Define Nom Texte_jusqu_a_la_fin_de_la_ligne

Exemple :

Define NbLigne 10

Tab Array[ NbLigne];

.

For i = 1 to NbLigne-1 do

Définition de fonction

Les fonctions permettent de définir des traitements particuliers partageables en plusieurs endroits. Une fonction a des paramètres qui sont définis à chaque appel.

Function Nom( [PARAM {,PARAM}]) [VAR] Begin INSTRUCTION {,INSTRUCTION} End

Une fonction doit être déclarée avant tout appel. Le nombre de paramètres de l’appel doit être exactement le même que celui de la déclaration. Même dans le cas ou la fonction n’a aucun paramètre, un appel de fonction se caractérise par le nom de la fonction suivi de parenthèse ouvrante, les paramètres optionnels et de parenthèse fermante.

Par définition une fonction rend une valeur, cette valeur est précisée par l’instruction RETURN ; par défaut d ‘exécution de l’instruction RETURN, la fonction rend une valeur indéfinie.

Les paramètres peuvent être transmis par valeur (la fonction ne peut pas modifier ces arguments d’appel dans la fonction appelante), ou par adresse (la fonction peut modifier ces arguments dans la fonction appelante). Pour transmettre des paramètres par adresse il suffit de faire précéder son nom dans la déclaration de fonction d’un &.

Function PressionExcessive( &P_Atmosphérique, Temperature)

Begin

P_Atmosphérique = Constante * Temperature ;

If P_Atmosphérique > 10000 Then Return 1 ;

Else Return 0 ;

End

...

If PressionExcessive( MaPression, Four.Temperature) Then Message( "  Pression trop élevée : "  + MaPression) ;

Opérateurs

Les opérateurs permettent d’évaluer les expressions, c’est à dire d’effectuer les calculs. Une condition est une expression qui rend une valeur numérique, nulle ou non nulle.

Le tableau suivant décrit les opérateurs. Quand dans un champ Remarques on exprime des limitations d’usage, cela signifie que quand ces conditions ne sont pas respectées l’opérateur rend une valeur indéfinie ; une condition indéfinie équivaut à une valeur nulle dans les tests. Les opérateurs s’évaluent de gauche à droite en respectant les priorités associées (1 la plus haute priorité, 12 la plus basse) :

Noms

Opérateur

Priorité

Remarques

Parenthèse

()

1

Permet d’effecteur des sous‑calculs, 10*( 4+ 2)

Appel de fonction

NomDeFonction ( Paramètre { , Paramètre} )

1

Cf. Fonction

Champ de bit

Expression : Expression

2

Permet de déclarer un champ de bit constant.1

Multiplication

*

2

Multiplication2

Division

/

2

Division3

Addition

+

3

Addition de valeurs numériques,

Concaténation de chaînes de caractères,




Rajout d’une durée en seconde à une date




Soustraction

3

Soustraction de valeurs numériques,

Soustraction d’une durée en seconde à une date




Décalage gauche

<<

4

L’opérande de droite doit être entier (n),

Décalage vers la gauche d’un champ de bit,




Suppression des n caractères de gauche pour une chaîne de caractère.




Décalage Droite

>>

4

L’opérande de droite doit être entier (n),

Décalage vers la droite d’un champ de bit,




Suppression des n caractères de droite pour une chaîne de caractère.




Concaténation de chaînes de caractères

:

5

Force les opérandes en chaîne de caractères avant de les concaténer.

Supérieur

>

6

Comparaison supérieure stricte

Supérieur ou égal

>=

6

Comparaison supérieure ou égale

Inférieur

<

6

Comparaison inférieure stricte

Inférieur ou égal

<=

6

Comparaison inférieure ou égale

Egalité

==

7

Egalité des opérandes

Différence

!=

7

Différence des opérandes

Et binaire

&

8

Ne s’applique qu’à des entiers

Ou Exclusif binaire

^

9

Ne s’applique qu’à des entiers

Ou binaire

|

10

Ne s’applique qu’à des entiers

Et

And

11

Et logique

Ou

Or

12

Ou logique



Fonctions Prédéfinies

Les fonctions prédéfinies permettent d’effectuer des traitements particuliers, principalement des appels aux fonctions du système d’exploitation

Fonction Message

La fonction Message permet d’envoyer un message à destination de l’opérateur sur la ligne de message dans un synoptique ou sur l’écran de trace pour un serveur.

Message( EXPRESSION {, EXPRESSION})

Message( EXPRESSION, Msg) : Msg

La première syntaxe est réservée aux scripts de serveur, elle permet de concaténer une suite d’expressions avant rajout à la trace du serveur.

Exemple :

Message( " Attention il reste " , Compte, "  composants ") ;

La seconde syntaxe est réservée aux synoptiques. Elle permet d’envoyer sur la ligne de message, différents messages qui sont affichées successivement toutes les trois secondes pendant toutes leurs durées de vie ( une minute). Au premier appel de message, Sisal retourne un identifiant de message qui pourra être conservé afin de pouvoir le modifier ou le supprimer ultérieurement.

Exemple :

Msg = Message( " Démarrage en cours ");

...

Message( "  ", Msg); // Suppression du message

Fonction MessageBox

La fonction MessageBox permet d’afficher à l’utilisateur une boîte de message.

MessageBox( Message, Titre, Mode)  : Status

MessageBox attend le message et le titre à afficher dans la boîte de message, et un mode de fonctionnement.

Ce mode de fonctionnement est un ou des constantes suivantes1, toutes les combinaisons ne sont pas possibles.

Mode

Valeurs

Type de boîte de message

ID_OK

0x04

à un seul bouton OK

ID_OK | ID_ABORT

0x14

à deux boutons OK et Annuler



à trois boutons Abandon, Réessayer et Ignorer

ID_YES | ID_NO | ID_ABORT

0x1A

à trois boutons Oui, Non, Annuler

ID_YES | ID_NO

0x0A

à deux boutons Oui et Non



à deux boutons Réessayer et Annuler



Combiné à l’indicateur graphique suivant pour indiquer quelle icône afficher dans la boîte de message.

Indicateur graphique

Valeurs

Icône affichée


0

Aucune

ICON_HAND

0x200

La main d’arrêt

ICON_QUESTION

0x400

Le point d’interrogation

ICON_EXCLAMATION

0x100

Le point d’exclamation

ICON_ASTERISK

0x800

L’astérisque



La fonction rend une valeur entière indiquant le bouton cliqué par l’utilisateur.

Constantes symboliques

Valeur de retour

Bouton cliqué

0


Aucun, un problème s’est produit pendant l’exécution.

ID_OK

0x04

OK

ID_ABORT

0x10

Annuler



Abandon



Réessayer



Ignorer

ID_YES


Oui

ID_NO


Non



Attention les Boites de message sont des composants standards de Windows, en particulier elles arrêtent tout traitement dans le programme pendant leur affichage, et toute prise en compte d’événement par Sisal.

Fonction Trace

La fonction Trace permet d’enregistrer dans le fichier de trace (VmtServer.trc, VmtClient.trc ou VmtCom.trc suivant le cas) une trace datée.

Trace( valeur)

Les fonctions Tron et Troff

Les fonctions Tron et Troff permettent respectivement d’activer ou d’inhiber la trace d’entité dans un script serveur. Ces entités doivent être définies dans un fichier d’environnement actif.

Tron( Item) ;

Troff( Item) ;

Chaque fois que le contenu d’une entité tracée est modifié, l’écran de trace affichera /NomDeLEntite/ NouvelleValeur.

Le menu trace du serveur permet de changer les conditions de traces de toutes les entités définies.

Exemple

Tron( Chargement.Etat) ;

Troff( Chargement.Etat) ;

Fonction Beep

La fonction Beep permet d’émettre un son pour attirer l’attention de l’utilisateur

Beep( Expression)

En fonction de la valeur de Expression, le son émis sera un des sons systèmes suivants :

Valeur

Son

0

System default,

16

System hand,

32

System question,

48

System exclamation

64

System asterisk.



Exemple :

Beep( 16) ;

Fonction Int

La fonction int transforme la valeur passée en paramètre en entier.

Int ( valeur) : Entier

Si la valeur ne peut pas être convertie en entier, la fonction rend 0.

Fonction Float

La fonction transforme la valeur passée en paramètre en nombre flottant.

Float( valeur) : Flottant

Si la valeur ne peut pas être convertie en flottant , la fonction rend le plus grand nombre flottant.

Fonction String

La fonction String transforme la valeur passée en paramètre en chaîne de caractère.

String( valeur) : string

Fonction Not

La fonction Not permet d’inverser la condition logique d’une expression. Elle rend le résultat suivant en fonction du type de l’expression.

Not( Value) ;

Type d’expression

Valeur de l’expression

Résultats

Entière

0

1

Entière

!= 0

0

Gamme


Chaque élément est inversé (non binaire)

Indéfini


1

Autre


0



Fonction Mod

La fonction Mod rend le modulo de ses deux opérandes, c’est à dire le reste entier de la division.

Mod( x, y) ;

Fonction Range

La fonction Range permet de définir une gamme composée d’un élément au plus.

Range( 0) donne une gamme vide, Range(1) donne une gamme dont le premier élément est sélectionné, ... ainsi de suite jusqu’au nombre maximum d’éléments dans une gamme définie par la constante " Range Size " ( un RangeSize de 4 (octets) permet de définir 32 éléments).

Range( indice) : Gamme

Exemple :

Montage = Range( P21) | Range( P22) | Range( P23) ;

Fonction RGB

La fonction RGB permet de définir une couleur à partir de ses trois composantes Rouge, Verte et Bleu. L’intensité de chaque composante doit être comprise entre 0 et 255.

RGB( Rouge, Vert, Bleu) : Couleur

Exemple :

Blanc = RGB( 255, 255, 255) ;

Noir = RGB( 0, 0, 0) ;

Rouge = RGB( 255, 0, 0) ;

Vert = RGB( 0, 255, 0) ;

Bleu = RGB( 0, 0, 255) ;



Fonction Now

La fonction NOW rend la date et l’heure instantanée. Elle n’attend pas de paramètre.

Now() : Datation

Message( " Il est exactement " + Now()) ;

Fonction GetTickCount

Windows maintient une horloge au millième de seconde démarré à zéro lors du démarrage de la machine. Cette donnée est lue par la fonction GetTickCount() qui rend un nombre entier de milliseconde.

GetTickCount() : Durée

Exemple, une attente de dix secondes

Delai = GetTickCount() + 10000 ; while Delai>GetTickCount() do Wait ;

Attention : Ce compteur devient négatif au bout de 24 jours et 20 heures (2^31 ms), il repasse à zéro au bout d’environ 50 jours. Il faut en tenir compte dans ses calculs de délai.

Fonction Random

La fonction RANDOM rend une valeur aléatoire entière comprise entre 0 et la valeur du paramètre moins 1.

Random( Expression) : Nombre

Fonction Gauss

La fonction GAUSS rend une valeur de la loi normale réduite, une valeur flottante aléatoire de valeur moyenne 0 et d’écart type 1. Elle n’attend pas de paramètre.

Gauss() : flottant

Fonction TestAndSet

La fonction TestAndSet permet de réserver une ressource à une clause événementielle.

TestAndSet( Variable) : Booléen

Cette fonction attend en paramètre une variable qui contient soit zéro, soit un. Si la variable contient zéro la fonction la met à un et rend un ( la ressource est maintenant disponible pour l’appelant), dans les autres cas la fonction rend zéro et laisse inchangée la variable (la ressource n’a pas pu être réservé par l’appelant). Lorsque une clause a réservé une variable elle se doit de la libérer le plus tôt possible en la mettant à zéro.

Exemple

While TestAndSet( Semaphore) == 0 do Wait ;

Fichier = FileOpen( " C :\Message.txt ", " wt ") ;

FileWriteln( Fichier, " Action en cours ") ;

FileClose( Fichier) ;

Semaphore = 0 ;

Cette fonction est nécessaire dans les cas où on a un risque d’accès simultané à une ressource par plusieurs clauses qui s’exécutent en parallèle. Un test suivi d’une affectation ne suffisent pas, car une clause peut être suspendue à la fin de son quantum de temps entre le test et l’affectation.

Fonction DateExpand

La fonction DateExpand permet de convertir une date en ces constituants élémentaires.

DateExpand( ValeurDate, &an, &mois, &jour, &heure, &min, &sec, &jourdan, &jourdesemaine) : Status

La fonction attend en premier paramètre une valeur date, et pour les paramètres successifs des variables qui contiendront les valeurs calculés à l’issue de l’exécution de la fonction. Tous les paramètres sont optionnels en partant des derniers, hormis ValeurDate et an.

Paramètre

Description

an

Rend le numéro de l’année entre 1970 et 2038

mois

Numéro de mois ( 1 ‑ 12)

jour

Jour dans le mois ( 1 ‑ 31)

heure

Heure ( 0 ‑ 23)

min

Minute (0 ‑ 59)

sec

Seconde ( 0 ‑ 59)

jourdan

Numéro de jour dans l’année (1‑366)

jourdesemaine

Numéro de jour dans la semaine ( 1 Lundi ‑ 7 Dimanche)



La fonction rend le nombre de variable valorisée, ou indéfinie en cas de défaut dans les paramètres.

L’exemple suivant permet de constituer le nom d’un fichier spécifique à chaque jour.

Var an; mois; jour;

NomDeFichier

Begin

DateExpand( Now(), an, mois, jour);

NomDeFichier = Format( " %d%02d%02d.trc ", an, mois, jour);

end

Fonction DateConvert

La fonction DateConvert permet de constituer une date à partir de ses constituants élémentaires.

DateConvert( an, mois, jour, heure, min, sec): Date

Paramètre

Description

an

Année ( 1970 ‑ 2038)

mois

Numéro de mois ( 1 ‑ 12)

jour

Jour dans le mois ( 1 ‑ 31)

heure

Heure ( 0 ‑ 23)

min

Minute (0 – 59)

sec

Seconde ( 0 – 59)



Les paramètres hormis le premier sont optionnels, dans ce cas ils sont considérés avoir la valeur la plus petite autorisée.

L’exemple suivant détermine la date du premier jour du mois courant.

Var an; mois; LePremierDuMois;

Begin

DateExpand( Now(), an, mois);

LePremierDuMois = DateConvert( an, mois);

end

Fonction WeekDateExpand

La fonction WeekDateExpand permet de convertir une valeur date en ses constituants élémentaires de date par semaine. Une date par semaine est constitué d’une année, d’un numéro de semaine et d’un jour dans la semaine et est notée par exemple 1999‑W45‑5 (le W est optionnel).

WeekdateExpand( valeurdate, &an, &semaine, &jourdesemaine, &heure, &min, &sec): status

Sisal applique strictement le calcul de semaine défini par l’ISO, c’est à dire que l’on peut avoir des jours de l’année qui sont noté dans l’année précédente ou dans l’année suivante.

Par exemple:

Date grégorienne

Date de semaine

1/1/1999

1998‑W53‑5

6/12/1999

1999‑W49‑1

1/1/2000

1999‑W52‑6





La fonction attend en premier paramètre une valeur date, et pour les paramètres successifs des variables qui contiendront les valeurs calculées à l’issue de l’exécution de la fonction. Tous les paramètres sont optionnels en partant des derniers, hormis ValeurDate et an.

Paramètre

Description

an

Rend le numéro de l’année entre 1970 et 2038

semaine

Numéro de semaine ( 1 ‑ 53)

JourDeSemaine

Jour dans la semaine ( 1 Lundi ‑ 7 Dimanche)

heure

Heure ( 0 ‑ 23)

min

Minute (0 ‑ 59)

sec

Seconde ( 0 – 59)



La fonction rend le nombre de variable valorisée, ou indéfini en cas de défaut dans les paramètres.

L’exemple suivant nous donne le numéro de semaine courante dans la variable semaine.

Var an; semaine;

Begin

WeekDateExpand( Now(), an, semaine);

end



Fonction WeekDateConvert

La fonction WeekDateConvert permet de constituer une date à partir de ses constituants élémentaires en date de semaine.

WeekDateConvert( an, semaine, jour, heure, min, sec): Date

Paramètre

Description

An

Année ( 1970 ‑ 2038)

Semaine

Numéro de semaine ( 1 ‑ 53)

Jour

Jour dans la semaine ( Lundi 1 ‑ Dimanche 7)

Heure

Heure ( 0 ‑ 23)

Min

Minute (0 ‑ 59)

Sec

Seconde ( 0 ‑ 59)



Les paramètres hormis le premier sont optionnels, dans ce cas ils sont considérés avoir la valeur la plus petite autorisée.

L’exemple suivant détermine la date du premier jour de la semaine courante.

Var an; semaine; Lundi;

Begin

WeekDateExpand( Now(), an, semaine);

Lundi = WeekDateConvert( an, semaine);

end



Fonction StrLen

La fonction StrLen rend la longueur de la chaîne de caractère passée en paramètre.

StrLen( string) : Nombre

Exemple :

Cinq = StrLen( " Sisal ") ;

Fonction SubStr

La fonction SubStr permet d’extraire une sous chaîne d’une chaîne de caractère.

SubStr( string, debut, longueur) : string

Le premier paramètre est la chaîne source, le deuxième l’origine de la sous chaîne et le troisième la longueur de la sous chaîne. La fonction rend la sous chaîne extraite.

Exemple :

Mont = SubStr( " Veymont Technologie ", 3, 4) ;

Debut = SubStr( " Debut et fin ", 0, 5) ;

Fin = SubStr( " Debut et fin ", StrLen( " Debut et fin ")‑3, 3) ;

Fonction StrTrim

La fonction StrTrim permet de retirer d'une chaîne de caractères tous les espaces et tabulations qui se trouvent en début ou en fin de chaîne

StrTrim( string): string

Le paramètre est la chaîne source. La fonction rend la chaîne correspondante.

Exemple

Serie = StrTrim( " X456 W107 ");

Serie contiendra "X456 W107".



Fonction StrUpper

La fonction StrUpper permet de convertire une chaîne de caractère ne majuscule.

StrUpper( string) : string

Le paramètre est la chaîne source, la fonction rend la chaîne en majuscule

Exemple

Serie = StrUpper( " x456 w107 ");

Serie contiendra " X456 W107 "

Fonction StrLower

La fonction StrLower permet de convertir une chaîne de caractère en minuscule.

StrLower( string) : string

Exemple

Serie = StrLower( " X456 W107 ");

Serie contiendra " x456 w107 "

Fonction Format

La fonction FORMAT permet de formater une chaîne de caractère suivant un format particulier. Le format utilisé est le format standard du langage C. Cette implémentation limite à 8 le nombre d’expression à formater simultanément.

Format( FormatChaine, Expression1, Expression2, Expression3, ..., Expression8) : ChaineRésultat

Exemple :

Message( Format( " Il fait chaud : %d °C ", Four.Temperature)) ;

La chaîne de format contient du texte qui est recopié tel que dans la chaîne résultante et des marques de conversions correspondant à chaque paramètre à convertir. Si le nombre de paramètre est inférieur au nombre de marques de conversions, le résultat est imprévisible et pourra même être catastrophique.

Les marques de conversions ont la syntaxe suivante

% [drapeaux] [largeur] [.précision] [F|N|h|l|L] type_char

Chaque marque de conversion commence par le caractère " % ". Après ce caractère on a les indicateurs optionnels ou non suivants

Indicateur

Requis ou optionnel

Signification

Drapeaux

Optionnel

Justification de la sortie, signe, décimales,... cf. Drapeaux

Largeur

Optionnel

Le nombre minimum de caractère imprimé, le remplissage complémentaire est fait par des blancs ou des zéros.

précision

Optionnel

Précise le nombre maximum de caractères à imprimer, pour les entiers précise le nombre minimum de chiffres à imprimer.

Type_char

Requis

Type de conversion



Les drapeaux peuvent être :

Flags


Le résultat est cadré à gauche, remplissage à droite par des espaces. Si omis, le résultat est cadré à droite, remplissage à gauche avec des zéros ou des espaces.

+

Les résultats sont signés et commencent donc toujours par ‘+’ ou ‘‑‘.

Espace

Si la valeur n’est pas négative, le résultat commence par un espace plutôt qu’un plus ; les valeurs négatives commencent toujours par un moins

#

Précise que l’argument doit être converti en utilisant une autre forme.



L’indicateur de largeur précise la largeur minimum d’un champ.

L’absence d’indicateur de largeur ou son insuffisance ne provoque pas la troncation du champ. Si le résultat d’une conversion est plus grand que le champ, le champ est rallongé afin de pouvoir contenir le résultat de la conversion.

Largeur


N

Au moins n caractères sont imprimés. Si la valeur de sortie a moins de n caractères, la sortie est complétée avec des espaces ( à droite si le drapeau ‑ a été précisé, à gauche autrement).

0n

Au moins n caractères sont imprimés. Si la valeur de sortie a moins de n caractères, la sortie est complétée avec des zéros à gauche.



L’indicateur de précision précise le nombre maximum de caractères (ou le nombre minimum de chiffre) à imprimer. Un indicateur de précision commence toujours par un point ‘.’ pour le différencier d’un éventuel indicateur de largeur.

Précision

Description

Aucun

La précision par défaut est utilisée. C’est à dire :

1 pour les types d, i, o, u, x, X

6 pour les types e, E et f

.0

Pour les types d, i, o, u et x la précision par défaut est utilisée1 pour les types e, E et f le point décimal n’est pas utilisé

.n

n caractères ou n décimales sont imprimés. Si la valeur résultante a plus de n caractères, la sortie peut être tronquée ou arrondis (cela dépend du type de conversion).



Suivant le type de conversion l’indicateur de précision ‘.n’ a les effets suivants.

Type

Description

d, i, o, u, x, X

Au moins n chiffres seront imprimés. Si l’argument a moins de n chiffres, la valeur de sortie est complétée à gauche avec des zéros. Si l’argument a plus de n chiffres, la valeur de sortie n’est pas tronquée.

e, E, f

Précise que n chiffres seront imprimés après la virgule, le dernier étant arrondi.

g, G

Au plus n chiffres seront imprimés.

C

N’a aucun effet

s

Au plus n caractères seront imprimés



Les types de conversion dépendent du type des paramètres. Sisal s’efforce de transformer chacun des arguments dans le type précisé par le type de conversion. Si cela n’est pas possible il transforme les arguments dans des valeurs conventionnelles (0).

Type de conversion

Type d’argument attendu

Format résultant

d

entier

entier décimal signé

i

entier

entier décimal signé

o

entier

entier octal non‑signé

u

entier

entier décimal non‑signé

x

entier

entier hexadécimal non‑signé (utilisation de a, b, c, d, e et f)

X

entier

entier hexadécimal non‑signé (utilisation de A, B, C, D, E et F)

f

flottant

signé au format [‑]dddd.dddd

e

flottant

signé au format (‑)d.dddd ou e[+/‑]ddd

g

flottant

signé au format e ou f en fonction de la valeur et de la précision. Les zéros de queue et le point décimal sont imprimés si nécessaire.

E

flottant

Comme e mais avec E comme indicateur d’exposant

G

flottant

Comme g mais avec E comme indicateur d’exposant éventuel

c

Caractère

un seul caractère

s

Chaîne de caractère

Imprime la chaîne de caractère jusqu’à ce que l’on atteigne le caractère de fin de chaîne (0) ou que la précision soit atteinte.

t

Date et heure

Imprime la date et/ou l’heure en fonction de la précision interprété comme un champ de bit :
1 Impression de la date, 2 Impression de l’heure, 4 Impression du jour de la semaine, 8 Impression détaillée et 16 Impression concise.

%

Rien

Imprime le caractère %



Les flottants de valeurs infinis sont imprimés +INF ou ‑INF, les flottants IEEE de valeur " Not‑A‑Number " sont imprimés +NAN ou ‑NAN.

Fonction Scan

La fonction scan permet d’analyser le contenu d’une chaîne de caractère afin d’y retrouver une ou plusieurs valeurs.

Scan( Source, ChaineDeFormat, &Var1, &Var2, ...) : NbValeurs

Les formats utilisés sont identiques à ceux de la fonction Format, les valeurs récupérées sont écrites dans les variables passées en paramètre. C’est la chaîne de format qui définit le type de données enregistré dans chaque variable. Le nombre de variable est limité à 8.

Fonction ParseStr

La fonction ParseStr permet d’analyser itérativement le contenu d’une chaîne afin d’en extraire des sous‑chaînes séparées par des caractères réservés.

ParseStr ( source, marque, indice, &token) : Booléen

Le premier paramètre est la chaîne source, le deuxième la chaîne contenant le caractère de séparation, le troisième l’indice du sous‑champ à extraire, le quatrième sera la variable dans laquelle la fonction rangera la sous‑chaîne extraite. La fonction rend vrai si elle réussit à extraire la sous‑chaîne.

Exemple :

i = 0 ; Encours = 1 ;

while Encours do begin

Encours = ParseStr( " Il fait beau ", "  " , i, Ligne) ;

if Encours then Message( Ligne) ;

i = i + 1 ;

end

Affichera successivement " Il ", " fait " et " beau ".

Fonction ParseArray

La fonction ParseArray1 permet de répartir les sous‑chaînes d’une chaîne de caractère dans les cellules d’un tableau.

ParseArray( source, marque, tableau) : Nombre

Le premier paramètre est la chaîne source, le deuxième la chaîne contenant le caractère de séparation, le troisième le tableau qui contiendra chacun des sous‑champs. La fonction rend le nombre de sous chaîne qui ont été extraites et effectivement rangées dans le tableau.

Si le tableau est trop petit les derniers sous‑champs ne sont pas écrits dans le tableau. Si le tableau contient plus de cellules que de sous champs, les derniers éléments du tableau sont indéfinis.

Exemple :

Var Tab[ 10];

Begin

ParseArray( " Il fait beau ", "  " , Tab);

i = 0;

While i < 10 do begin

if Tab[ i] then Message( Tab[i]);

i = i + 1;

end

end

Affichera successivement " Il ", " fait " et " beau ".

Fonction Evaluate

La fonction Evaluate permet d’évaluer une expression du genre " Entité = Constante ".

Evaluate( Expression) : Status

Les entités doivent être définies dans un fichier d’environnement actif. La fonction rend 1 en cas de succès, elle rend un message d’erreur ( texte) en cas d’erreur.

Exemple :

Le fichier MaFiche.ref contient :

L964.Chargement.Vis = " NB312 "

L964.Rondelle.Couple = 312.45

et le script qui l’analyse est le suivant

Fichier = FileOpen( " MaFiche.ref ", " rt ") ;

if Fichier then begin

While Not( EOF( Fichier)) do

Evaluate( FileReadln( Fichier)) ;

FileClose( Fichier) ;

end

Lors de l’exécution de ce script les données Chargement.Vis et Rondelle.Couple seront directement descendues à leurs automates respectifs.

Fonction CheckSum

La fonction CheckSum rend la somme de contrôle correspondant à la chaîne de caractère passé en paramètre.

Checksum( trame, mode) : Somme de contrôle

L’algorithme appliqué est fonction du paramètre mode:

1

Checksum 8 bits ou exclusif sur chaque octet



L’exemple suivant rajoute une somme de contrôle à une trame transmise à un équipement sur une liaison série

srEquip.Put( Trame);

srEquip.Put( Checksum( Trame, 1));

Fonction FileOpen

La fonction FileOpen permet d’ouvrir un fichier en lecture ou en écriture.

FileOpen( NomDeFichier, Param) : File

La fonction attend en paramètre un nom de fichier complet (avec le chemin d’accès complet) et une chaîne de mode d’ouverture qui précise la manière d’ouvrir le fichier :

Valeur

Description

r

Ouverture en lecture seule

w

Création en écriture. Si un fichier de ce nom existe déjà, il sera écrasé.

a

Ajout. Ouverture en écriture à la fin du fichier ou création en écriture si le fichier n’existe pas.

r+

Ouverture d’un fichier existant pour une mise à jour (en lecture et écriture)

w+

Création d’un nouveau fichier en mise à jour (en lecture et écriture). Si un fichier de ce nom existe déjà, il sera écrasé.

a+

Ouverture en ajout. Ouvre ( ou crée si le fichier n’existe pas) pour mise à jour à la fin du fichier.



Les fichiers peuvent être ouverts suivant deux modes (texte : le fichier pourra être visualisé à l’éditeur, binaire : les données seront enregistrées dans leur format machine). Pour préciser qu’un fichier doit être ouvert dans un mode textuel, il faut rajouter un " t " à la fin du mode d’ouverture. De même un " b " doit être rajouté pour un fichier binaire.

En cas de succès la fonction rend un identificateur de fichier ouvert, qui devra être transmis en paramètre à chacune des opérations menées sur ce fichier ouvert. Ce fichier ne pourra être fermé que par appel de la fonction FileClose.

En cas d’échec, la fonction rend une valeur indéfinie.

Exemple :

Fichier = FileOpen( " C :\Autoexec.bat ", " rt ") ;

if Fichier then begin

Message( FileReadln( Fichier)) ;

FileClose( Fichier) ;

end

Cet exemple affiche la première commande du fichier Autoexec.bat.

Fonction FileWriteln

La fonction FileWriteln permet de rajouter une ligne dans un fichier ouvert en écriture ou en ajout.

FileWriteln( Fichier, Texte) ;

Le fichier doit avoir été ouvert précédemment par un appel à FileOpen, le premier paramètre est l’identificateur de fichier ouvert par FileOpen. Le deuxième paramètre est la ligne à ajouter dans le fichier. La fonction rajoute automatiquement à la fin du texte un retour à la ligne suivante dans le fichier.

Exemple :

Fichier = FileOpen( " Journal.txt ", " at ") ;

if Fichier then begin

FileWriteln( Fichier, " Date : " +Now()+ ", Temp : " +Four.Temp) ;

FileClose( Fichier) ;

end

Fonction EOF

La fonction EOF permet de déterminer si la lecture du fichier est terminée. Elle rend vrai si le point de lecture de fichier est au bout du fichier.

Eof( File)

Exemple :

Fichier = FileOpen( " C :\Autoexec.bat ", " rt ") ;

If Fichier then begin

While EOF( Fichier) == 0 do Message( FileReadln( Fichier)) ;

FileClose( Fichier) ;

end

Lecture et affichage complet du contenu du fichier Autoexec.bat

Fonction FileReadln

La fonction FileReadln permet de lire la ligne suivante dans un fichier texte. Elle rend une expression texte qui contient cette ligne.

FileReadln( File)

Voir l’exemple précédent (EOF)

Fonction FileDelete

La fonction FileDelete permet de supprimer un fichier existant sur le disque. Cette fonction supprime effectivement le fichier de manière définitive et sans recours ( pas de corbeille).

FileDelete( NomDeFichier)

Fonction FindFirstFile

La fonction FindFirstFile permet, conjointement avec la fonction FindNextFile, d'identifier l'ensemble des fichiers d'un répertoire correspondant à un certain masque.

FindFirstFile( CheminGénérique, &Nom) : Handle

La fonction attend en paramètre le chemin générique d'accés, typiquement le chemin d’accès et un nom de fichier générique; en cas de succès la fonction rend un handle qui sera réutilisé pour obtenir les fichiers suivants et positionne dans la variable Nom le nom du premier fichier; en cas d'échec le handle est indéfini et la variable Nom inchangée.

Fonction FindNextFile

La fonction FindNextFile permet après un appel à la fonction FindFirstFile, d'identifier l'ensemble des fichiers d'un répertoire correspondant à un certain masque.

FindNextFile( Handle, &Nom) : Status

La fonction attend en paramètre le handle précedemment obtenu par un appel à FindFirstFile; en cas de succés la fonction rend un 1 positionne dans la variable Nom le nom du fichier suivant; en cas d'échec la fonction rend 0 et la variable Nom inchangée.

Par exemple, obtention de toutes les fiches références d'un répertoire

Hnd = FindFirstFile( "C:\\Sisal\\SimLine2\\References\\*.ref", Nom);

If Hnd then begin

Do

Message( Nom);

While FindNextFile( Hnd, Nom);

FindClose( Hnd);

End



Fonction FindClose

La fonction FindClose permet de fermer une recherche de fichier obtenu avec la fonction FindFirstFile.

FindClose( Handle): Status

La fonction attend en paramètre le handle précedemment obtenu par un appel à FindFirstFile; en cas de succés la fonction rend un 1; en cas d'échec la fonction rend 0 ( handle invalide, ou déjà fermé).

Fonction ParseForm

La fonction ParseForm permet de formater un document avec des données actives.

ParseForm( Source, Dest, Fonction) : Nombre

La fonction attend en paramètre :

La fonction balaye le texte source et chaque fois qu’elle découvre un mot‑clé, elle appelle la fonction de rappel en lui passant en paramètre le mot‑clé, la fonction de rappel retourne une valeur à substituer au mot‑clé.

La fonction ParseForm() retourne le nombre de substitutions effectuées en cas de succès, ‑1 si elle ne peut ouvrir un des fichiers texte, et indéfini si la fonction n’est pas définie.

Exemple :

Function MaFonction( Cle)

Begin

if Cle == " Date " then return " 10/3/99 " ;

else if Cle == " Identification " then return 108703 ;

else if Cle == " Defaut " then begin

if Defaut == 0 then return " Pas de défaut " ;

else if Defaut == 1 then return " Couple insuffisant " ;

else if Defaut == 2 then return " Température insuffisante " ;

else return " Défaut inconnu " ;

end else return Cle ;

end ...

On .. do

ParseForm( " Modele.rtf ", " Fiche.rtf ", MaFonction) ;

Execute(" C :\\Program Files\\Accessoires\\Wordpad Fiche.rtf ‑p ") ;

Fonction RegistOpen

Le système d’exploitation Windows (Win32) permet de paramétrer facilement un logiciel en utilisant la base de registre. Cette dernière permet d’enregistrer des données élémentaires dans un format texte ou dans un format binaire (DWORD). Ces paramètres peuvent être directement modifiés par l’administrateur du système en utilisant l’éditeur de registre (Regedit.exe).

Sisal permet d’utiliser cette facilité en permettant d’accéder à ces données d’une manière semblable à l’accès à un fichier. Un groupe de données (une clé) est ouvert au moyen de la fonction RegistOpen qui rend un identificateur de registre ouvert. Lequel identificateur sera utilisé pour chaque appel de fonction interagissant avec cette clé.

RegistOpen( Racine, CheminDeClé) : Reg

Le paramètre de racine doit être une des racines reconnues de Windows ( généralement " HKEY_LOCAL_MACHINE ") et le chemin de clé un chemin existant ( généralement " SOFTWARE\MaSociété\MonLogiciel ").

Exemple :

Reg = RegistOpen( " HKEY_LOCAL_MACHINE ",

" SOFTWARE\veymont \Sisal ") ;

if Reg then Traces = RegistGet( " Trace ")

Fonction RegistGet

La fonction RegistGet permet de lire le contenu d’une donnée enregistrée en base de registre.

RegistGet( Registre, Nom) : Valeur

Exemple voir l’exemple de RegistOpen

Fonction RegistPut

La fonction RegistPut permet d’enregistrer une donnée dans un registre ouvert. Suivant le format interne de l’expression de valeur transmise en paramètre, le format d’enregistrement de la donnée sera " DWORD " dans le cas d’un entier ou d’un flottant, sinon ce sera une " STRING ".

RegistPut( Registre, Nom, Valeur) : status

La fonction rend un statut indiquant le format d’enregistrement ( 1 pour Dword, 2 pour chaîne et indéfini en cas d’empêchement).

Exemple :

RegistPut( Registre, " Utilisateur ", " Untel ") ;

Fonction RegistStringPut

La fonction RegistStringPut est équivalente à la fonction RegistPut, hormis qu’elle force l’enregistrement au format " STRING " dans la base de registre

RegistStringPut( Registre, Nom, Valeur) ;

Exemple :

RegistStringPut( Registre, " Date ", " 19/2/1999 ") ;

Fonction RegistClose

La fonction RegistClose permet de fermer un registre ouvert. C’est le seul moyen de fermer un registre ouvert.

RegistClose( Reg) ;

Fonction DdeOpen

Le système d’exploitation Windows permet d’établir des échanges de données entre applications. En particulier cela permet de lire ou d’écrire des données ou de faire exécuter par l’autre application un certain traitement.

Le Dde repose sur la notion d’application, de document et d’article. La fonction DdeOpen permet d’établir un échange avec une application donnée et un document donnée.

DdeOpen( NomDApplication, NomDeDocument) : DdeIdent

La fonction attend en paramètre le nom normalisée au sens de Windows et le nom du document. Ces informations sont décrites dans la documentation du logiciel en question.

Un client Sisal a pour nom d’application " Sisal " et un seul document générique " Client ". Un client Sisal peut exécuter des commandes d’ouvertures d’écran celles qui sont définis dans les menus, mais ne dispose d’aucun article en consultation ou modification.

Un serveur Sisal a pour nom d’application " Sisal " et a autant de document que de lignes gérées par ce serveur. Le nom de document est le nom de la ligne, les articles sont les éléments définis dans le fichier de configuration notés sous la forme pointée " poste.élément ", il ne dispose d’aucune commande exécutable de l’extérieur.

L’exemple suivant lorsqu’il est exécuté dans un serveur, ouvre un écran synoptique de changement de série dans le client.

dde = DdeOpen( “ Sisal ", “ Client ");

if dde then begin

DdeExecute( dde, " Synoptic(\ "ChgSerie.syn\ ") ");

DdeClose( dde);

end else message( " Impossible d’ouvrir le synoptique ");

Fonction DdeGet

La fonction DdeGet permet de lire un article défini dans une application Dde.

DdeGet( DdeIdent, Article) : Valeur

La fonction attend en paramètre un identificateur de lien Dde ouvert et un nom d’article. En cas de succès la fonction rend la valeur de l’article , en cas d’échec elle rend indéfinie.

Un synoptique pourrait par exemple obtenir un mot d’un automate par le code suivant

dde = DdeOpen( " Sisal ", " Client ");

if dde then begin

Etat = DdeGet( dde, " Chargement.Etat ");

DdeClose( dde);

end else message( " Impossible d’ouvrir le dde ");

mais cela n’a d’intérêt que pour les autres applications puis qu’il suffit d’écrire dans le synoptique:

Etat = Chargement.Etat;

Fonction DdePut

La fonction DdePut permet d’envoyer à une autre application la valeur d’un article.

DdePut( DdeIdent, Article, Valeur) : status

La fonction attend en paramètre un identificateur de lien Dde ouvert, t un nom d’article et une valeur. La fonction rend un en cas de succès, zéro en cas d’échec.

Exemple :

DdePut( dde, " Chargement.Etat ", " 8 ") ;

Fonction DdeExecute

La fonction DdeExecute permet de faire exécuter un traitement par une application externe.

DdeExecute( DdeIdent, Commande): status

La fonction attend en paramètre un identificateur de lien Dde ouvert et une commande. En cas de succès la fonction rend un, zéro en cas d’échec.

L’exemple suivant permet de lancer sur le traitement de texte WordPerfect l’impression d’une fiche après sa mise en forme par Sisal.

dde = DdeOpen( " WPWin7_Macros ", " FaxForm.rtf ");

if dde then begin

DdeExecute( " FileOpen(\ "%1\ ") PrintFullDoc() CloseNoSave(1) ");

DdeClose( dde);

end else message( " Impossible d’ouvrir le dde ");



Fonction DdeClose

La fonction DdeClose permet de fermer un lien d’échange ouvert. C’est le seul moyen de fermer un lien d’échange.

DdeClose( DdeIdent) ;

Fonction FindWindow

La fonction FindWindow permet de retrouver la fenêtre windows qui a une barre de titre donnée en paramètre ou la fenêtre principale de l’application courante (sans paramètre). Cette fenêtre peut être externe à l’application.

FindWindow( Expression) : Ident

FindWindow() : Ident

Cette fonction rend un identificateur de fenêtre (handle) qui doit être passé en paramètre à toutes les fonctions qui référencent des fenêtres.

Exemple :

Calc = FindWindow( " Calculatrice ") ; if Calc then ShowWindow( Calc, 1) ;

Si la calculatrice est active, on l’affiche en premier plan.

Fonction ShowWindow

La fonction ShowWindow permet de changer l’état d’affichage d’une fenêtre donné

ShowWindow( handle, Mode) ;

Suivant le mode passé en paramètre l’état d’affichage deviendra

Mode

Affichage

0

Caché

1

Normal

2

Minimisé

3

Maximisé

4

Visible non active

5

Visible

6

Minimisé

7

Visible, minimisé, non active

8

Visible non active

9

Visible défaut

10

Max





Fonction SetFocus

La fonction SetFocus permet de donner le focus (c’est à dire le clavier) à une fenêtre particulière.

SetFocus( handle) ;

Fonction Shutdown

La fonction Shutdown permet de faire l’arrêt de la machine.

ShutDown( Mode)

Suivant le mode choisi cette fonction provoquera

Mode

Action

Remarque

0

Shutdown

Arrête la machine et la met dans un état ou on peut couper le courant.

1

Reboot

Arrête la machine et la fait redémarrer automatiquement

2

PowerOff

Arrête la machine et coupe le courant automatiquement si la machine en est capable, sinon fait un shutdown.



Cette fonction ne fonctionne que sous Windows NT.

Fonction Exit

La fonction exit permet d’arrêter le fonctionnement d’un client ou d’un serveur.

Exit( CodeDeRetour)

La fonction attend en paramètre un entier code de retour et ne retourne pas.

Fonction Close

La fonction close permet de provoquer la fermeture du synoptique en cours.

Close()

Fonction Execute

La fonction Execute permet de lancer l’exécution d’un programme externe.

Execute( LigneDeCommande {, Mode {, RepertoireDExecution {, Titre}}})

Cette fonction attend en paramètre une ligne de commande et optionnellement :

Exemple :

Execute( " Notepad.exe Message.txt ") ;

Fonction LineList

Cette fonction permet de rendre dans une variable la liste des lignes définis dans Sisal. C’est une chaîne de caractère dont chaque nom est séparé par une tabulation.

LineList() : Liste

Exemple

Liste = LineList();

i = 0; Encours = 1;

while Encours do begin

Encours = ParseStr( Liste, #9, i, ligne);

if Encours then Message( Ligne);

i = i + 1;

end

Fonction RangeList

La fonction RangeList rend la liste des fonctions composant la gamme fonctionnelle, de cette ligne. C’est une chaîne de caractères composé de nom séparés par une tabulation.

RangeList( Ligne): Liste

Fonction RangeOf

La fonction RangeOf rend la gamme élémentaire correspondant à la ligne et à la fonction passées en paramètre sous forme de chaîne de caractère.

RangeOf( Ligne, Fonction): Gamme

Par exemple

MaGamme = RangeOf( "SimLIne2", "fChargement");

Message( MaGamme);

Affiche "§00000001"

Fonction EquipmentList

La fonction EquipmentList rend la liste des équipements ( postes) définis sur cette ligne. Elle rend une chaîne de caractères composé de nom séparés par une tabulation.

EquipmentList( Ligne) : Liste

Fonction ItemList

La fonction ItemList rend la liste des éléments définis sur cet équipement de cette ligne. Elle rend une chaîne de caractères composée de nom séparés par une tabulation.

ItemList( Ligne, Equipement): Liste

Fonction ModuleList

La fonction ModuleList rend la liste de tous les modules définis sur cette ligne hormis les équipements. Elle rend une chaîne de caractères composée de nom séparés par une tabulation.

ModuleList( Ligne): Liste

Fonction IsLineOpen

La fonction IsLineOpen indique si cette ligne est ouverte à l’instant indiqué. Sisal associe à chaque ligne des périodes d’ouverture et de fermeture, cette fonction rend 1vrai si à la date et heure passé en paramètre cette ligne est supposée être ouverte, autrement elle rend 0.

IsLineOpen( Ligne, Date) : Status

If IsLineOpen( MaLigne, Now()) == 0 then Message( " Rien à faire ") ;

Fonction SpcAnomalyList

SpcAnomalyList() : Liste des anomalies Spc

Fonction SpcAnomalyOf

SpcAnomalyOf( ligne, nomdanomalie): numéro d'anomalie



Fonction SetTraces

La fonction SetTraces permet de modifier le niveau de détail des traces générées par l'exécutable Sisal. La fonction rend le niveau de trace précédent afin de pouvoir le restaurer ultérieurement

SetTraces( int): TracesPrécédentes;

Fonction TraceIt

La fonction permet de modifier l'item bénéficiant des traces approfondies avec le bit de traces trcItem.

TraceInt( item) : status

Fonction Count

La fonction Count permet de compter le nombre d'éléments contenues dans le conteneur ( tableau associatif, pile ou file).

Count( Map_Stack_Queue) : int

Par exemple

Comptes Map[ String];

Comptes[ "Georges"] = 245;

Comptes[ "François"] = 765;

Nb = Count( Comptes);

Nb doit contenir 2.

Fonction Delete

La fonction Delete permet de supprimer un élément d'un tableau associatif

Delete( map, cle) : status

Cle peut être une clé ou un itérateur de tableau associatif

Delete( Comptes, "Georges");

Ou

For I in Comptes do Delete( Comptes, I);

Status est vrai si on a pu supprimer l'entrée, faux si elle n'existe pas.

Fonction Find

La fonction Find permet de savoir si un élément est contenu dans un conteneur ( tableau associatif, pile ou Queue).

Find( Map_Stack_Queue, cle) : status

Status est vrai si le conteneur contient cet élément.

If Find( Comptes, "Robert") then …

Fonction Push

La fonction Push permet d'empiler un élément dans une pile ou une file.

Push( Stack_Queue, Valeur)

Par exemple

ChezLeDentiste Queue;

Push( ChezLeDentiste, "Robert");



Fonction Pull

La fonction Pull permet de retirer un élément d'une pile ou d'une file; pour une pile on retirera le dernier élément empiler, pour une file on retirera l'élément le plus anciennement introduit dans la file

Pull( PileFile) : valeur

Si le conteneur est vide, la valeur rendue est indéfinie.

Par exemple

PatientSuivant = Pull( ChezLeDentiste)

Fonction SetStack

La fonction SetStack permet de transformer une variable simple en pile.

SetStack( variable) : status

La fonction rend 1 si l'opération a pu s'effectuer.

La modification d'une variable en pile implique des allocations internes à Sisal, c'est pour cela qu'il est plutôt conseillé de déclarer des variables globales de type Pile et déconseillé d'effectuer cette opération trop fréquemment.

Fonction SetQueue

La fonction SetQueue permet de transformer une variable simple en file.

SetQueue ( variable) : status

La fonction rend 1 si l'opération a pu s'effectuer.

La modification d'une variable en file implique des allocations internes à Sisal, c'est pour cela qu'il est plutôt conseillé de déclarer des variables globales de type File et déconseillé d'effectuer cette opération trop fréquemment.

Fonction FetchItem

La fonction FetchItem permet de relire la trame contenant une donnée situé sur un automate. Cette fonction est réservé au script serveur.

FetchItem( item): status

La fonction rend un si cela s'est bien passé.

Fonction StrSpn

La fonction StrSpn permet de connaître la sous-chaîne initiale d'une chaîne de caractère qui ne contient que des caractères d'une autre chaîne. La fonction rend la longueur de la chaîne initiale.

StrSpn( ChaineAExaminer, CaractèresADmissibles) : Longueur

Par exemple pour extraire la famille d'une référence particulière:

Model = "WXZ128";

Family = SubStr( Model, 0, StrSPn( Model, "WXYZ"));

Fonction Str2DateTime

La fonction Str2DateTime permet de convertir une chaîne de caractère en date et heure Sisal. Le format de la chaîne d'entrée dépend de la Dll de localisation ( SisalFr.dll ou SisalEn.dll).

Str2DateTime( ChaineAExaminer, &VariableResultat): statut

Le deuxième paramètre doit obligatoirement une variable.

La fonction rend 1 si la chaîne d'entrée est bien compatible avec un format de saisie de date et heure de Sisal, 0 sinon la conversion n'a pas réussi.

Par exemple

Message( Str2DateTime( "2003/01/20 16:28:57", maintenant));

Affichera 1.

Fonction Str2Date

La fonction Str2Date permet de convertir une chaîne de caractère en date Sisal. Le format de la chaîne d'entrée dépend de la Dll de localisation ( SisalFr.dll ou SisalEn.dll).

Str2Date( ChaineAExaminer, &VariableResultat): statut

Le deuxième paramètre doit obligatoirement une variable.

La fonction rend 1 si la chaîne d'entrée est bien compatible avec un format de saisie de date de Sisal, 0 sinon la conversion n'a pas réussi.

Par exemple

Message( Str2DateTime( "2003/01/20", maintenant));

Affichera 1.

Fonction Str2Time

La fonction Str2Time permet de convertir une chaîne de caractère en heure Sisal, c'est à dire en nombre de seconde écoulée depuis minuit. Le format de la chaîne d'entrée dépend de la Dll de localisation ( SisalFr.dll ou SisalEn.dll).

Str2Time( ChaineAExaminer, &VariableResultat): statut

Le deuxième paramètre doit obligatoirement une variable.

La fonction rend 1 si la chaîne d'entrée est bien compatible avec un format d'heure de Sisal, 0 sinon la conversion n'a pas réussi.

Par exemple

Message( Str2Time( "16:28:57", maintenant));

Affichera 1.

Fonction Str2Weekday

La fonction Str2Weekday permet de convertir une chaîne de caractère en jour de la semaine (dimache 0, lundi 1, ...). Le format de la chaîne d'entrée dépend de la Dll de localisation ( SisalFr.dll ou SisalEn.dll), en général la fonction attend en langue normale ( Dimanche, Lundi, ...) et en anglais (Sunday, Monday,...) et ce indépendemment de la casse.

Str2Weekday( ChaineAExaminer, &VariableResultat): statut

Le deuxième paramètre doit obligatoirement une variable.

La fonction rend 1 si la chaîne d'entrée est bien un jour de la semaine, 0 sinon la conversion n'a pas réussi.

Par exemple

Message( Str2Weekday( "Vendredi", dernierjour));

Affichera 1 et dernierjour vaudra 5.

Fonction ShiftList

La fonction ShiftList rend la liste des équipes ou plages d'ouverture définies pour cette ligne dans le fichier de configuration. C’est une chaîne de caractères composé de nom séparés par une tabulation.

ShiftList ( Ligne): Liste

Fonction ShiftDesc

La fonction ShiftDesc retrouve les caractéristiques d'une équipe ou plage d'ouverture de cette ligne définie dans le fichier de configuration.

ShiftDesc( Ligne, Equipe, &Jour, &HeureDebut, &HeureFin): status

Ligne contient le nom de la ligne

Equipe contient le nom de l'équipe

SI la ligne et l'équipe existe, la fonction retourne 1 et met à jour le jour de la semaine (0 dimanche, 1 lundi, 6 samedi) , l'heure de début (nombre de seconde depuis minuit) et l'heure de fin (nombre de seconde depuis minuit). Dans le cas contraire la fonction retourne 0.

Par exemple

Liste = ShiftList( "SimLine2");

i = 0; Encours = 1;

while Encours do begin

Encours = ParseStr( Liste, #9, i, equipe);

if Encours then begin

ShiftDesc( "SimLine2", equipe, jour, debut, fin);

Message( "Equipe ":equipe:" jour ":jour:" Debut ":hms( debut):" fin ":hms(fin));

i = i + 1;

end

affichera

Equipe Lundi_Matin Jour 1 Debut 6:0:0 Fin 13:50:00

Equipe Lundi_ApresMidi Jour 1 Debut 14:00:00 Fin 21:50:00

Fonction ShiftOf

La fonction ShiftOf permet de retrouver le numéro d'équipe ou de la période d'ouverture d'une ligne à partir du nom de celui-ci.

ShiftOf( ligne, ouverture) : Numero

La fonction attend en paramètre le nom de la ligne et le nom de la période d'ouverture, rend le numéro de période si trouvé, -1 sinon.

Par exemple

Equipe = ShiftOf( "SimLine2", "Lundi_ApresMidi");

Fonction ShiftName

La fonction ShiftName permet de retrouver le nom d'une équipe à partir de son numéro.

ShiftName( ligne, numéro) : Numero

La fonction attend en paramètre le nom de la ligne et le numéro de la période d'ouverture, rend le nom de période si trouvé, indéfini sinon.

Par exemple

Equipe = ShiftName( "SimLine2", 2);

Fonction GetShift

La fonction GetShift permet de retrouver les caractéristiques d'une équipe (ou plage d'ouverture) particulière dans une semaine donnée.

GetShift( ligne, ouverture, date, &debut, &fin): status

La fonction attend en paramètre le nom de la ligne, le nom de la période d'ouverture, une datation de la semaine particulière. Si la plage est définie, la fonction calcule ses date/heure de début et de fins dans la semaine contenant la date passée en paramètre; si la date de début fait partie d'un jour travaillé, alors la fonction met à jour les date/heures de début et de fin de cette équipe, et retourne 1. Dans tous les autres cas la fonciton retourne 0.

Par exemple

If GetShift( "SimLine2", "Lundi_ApresMidi", "22/0/2003 16h12", debut, fin) then

Message( "Equipe de Lundi_ApresMidi du": debut: " au": fin);

Else message( "Période non ouverte!");

Fonction CycleTime

La fonction CycleTime permet de retrouver le temps de cycle théorique d'une ligne, tel que défini dans le fichier de configuration.

CycleTime( Ligne): TempsDeCycleThéorique

Par exemple

Message( CycleTime( "SimLine2"));

Affichera 35.2.

Fonction HMS

La fonction HMS permet de convertir rapidement un nombre de seconde en notation horaire. Le format de la chaîne rendue dépend de la Dll de localisation ( SisalFr.dll ou SisalEn.dll).

HMS( duree) : string

Par exemple

Message( HMS( 28865));

Affichera 8:01:05.

Fonction LinePeriod

La fonction LinePeriod permet de connaître la date-heure de début et la date-heure de fin d'une période donnée.

LinePeriod( Ligne, Date, Periode, Delta, &Debut, &Fin {,&Shift}): statut

La fonction attend les paramètres suivants

Paramètre

Valeurs attendues

Description

Ligne

Le nom de la ligne

Le nom de la ligne intéressante

Date

La date autour de laquelle se situe la recherche

Par exemple Now()

Période

De 1 à 8

1 Seconde, 2 Minute, 3 Heure, 4 Equipe, 5 Jour, 6 Semaine, 7 Mois et 8 An.

Delta

Décalage à appliquer

0 pour avoir la période qui contient la date passée en paramètre,

+ 1 pour avoir la période qui suit la période qui contient la date

-1 pour avoir la période qui précéde la période qui contient la date

Statut rend 1 si la fonction a pu être réalisé.

Si la période sélectionnée est de type Equipe, la fonction rend optionnellement le numéro d'équipe (de 0 à NbEquipe-1).

Fonction Monitor

La fonction Monitor permet d'activer (1) ou de désactiver (0) l'enregistrement des échanges dans le fichier moniteur. La fonction rend le précédent état d'activation du monitorage.

Monitor( int): PrécédentEtatDActivation

Fonction SetBlob

La fonction SetBlob1 permet de forcer le type d'une variable en Blob et de lui allouer une zone de données binaires.

SetBlob( Variable, Longueur ): status;

La fonction attend en paramètre une variable et une longueur de zone à allouer.

La fonction rend 1 si l'opération a pu s'effectuer.

Cette fonction est paticulièrement utile lorsque l'on dialogue avec des Dlls externes (cfr.DLL); par exemple:

Declare Function CamGet Lib “Camera.dll” ( &String, &Integer);

Var Photo; Adresse; Longueur;

On … do begin

// Obtention de l'adresse et de la longueur de la zone

// dans laquelle est enregistrée la photo de la camèra

CamGet( Adresse, Longueur);

// Association à la variable Photo

SetBlob( Photo, Longueur);

CopyBlob( Photo, Adresse, Longueur);

end

La modification d'une variable en blob implique des allocations internes à Sisal avec recopie des données passées en paramètre; lors d'une affectation d'une variable par une variable Blob il y a aussi allocation de mémoire et recopie; de même lors du passage en paramètre par valeur à une fonction il y a recopie, c'est pour cette raison qu'il est conseillé de passer par adresse les variables nécessitant des allocations mémoires.

Fonction CopyBlob

La fonction CopyBlob1 permet de recopier dans un blob des données binaire ou inversement d'écrire des données binaires à partir du contenu d'un blob.

CopyBlob( VariableBlob, Adresse, Longueur): integer;

CopyBlob( Adresse, Longueur, VariableBlob): integer;

La fonction rend le nombre d'octets copiés.

Cette fonction attend en paramètre une variable de type Blob, un entier interprété comme une adresse mémoire2 et une longueur. Si le premier paramètre est une variable de type Blob alors on charge la varaible Blob avec le contenu de la zone mémoire défini par les deuxième et troisième paramètres. Inversement, si le premier paramètre n'est pas de type Blob, on écrit le contenu du Blob dans la zone mémoire défini par les premier et second paramètres. Cette fonction rend le nombre d'octets effectivement copiés.

Fonction BlobLen

La fonction BlobLen permet de connaître la taille occupée par un blob

BlobLen( VariableBlob): Integer;

Fonction GetBlob

La fonction GetBlob permet d'extraire d'un blob un champ défini par son type et son décalage dans le blob.

GetBlob( VariableBlob, Type, Decalage {, Longueur}): Valeur;

La fonction attend en paramètre une variable blob, un type élémentaire et un décalage dans le blob; dans certains cas un quatrième paramètre définit la longueur de la zone à extraire.

Les types reconnus sont:

Type

Longueur

Commentaire

Void

En paramètre

Cela permet de créer une variable blob par extraction d'une partie d'une autre variable blob, la longueur du champ extrait est défini par le paramètre longueur.

Char

1

Obtention d'un entier à partir du caractère non signé.

Byte

1

Obtention d'un entier à partir du caractère non signé.

Short

2

Obtention d'un entier à partir d'un entier signé de 16 bits

Word

2

Obtention d'un entier à partir d'un entier non signé de 16 bits

Integer

4

Obtention d'un entier à partir d'un entier signé de 32 bits

DWord

4

Obtention d'un entier à partir d'un entier non signé de 32 bits (attention aux débordements éventuels!)

Float

4

Obtention d'un flottant à partir d'un flottant de 32 bits

Double

8

Obtention d'un flottant à partir d'un flottant de 64 bits (attention aux débordements éventuels)

Date

4

Obtention d'une date à partir d'un champ date (time_t)

String

En paramètre

Permet d'extraire une chaine de caractère dont la longueur est défini par le 4° paramètre.

Handle

4

Obtention d'une valeur handle (par exemple handle de fenêtre).



La fonction rend une valeur Sisal contenant la valeur extraite.

Temperature = GetBlob( TrameRecue, Integer, 24);

Dans cet exemple, un équipement a transmis dans une trame binaire différentes données, l'entier de 4 caractéres placé à partir de la position 24 contient la température qui nous intérésse.

Fonction PutBlob

La fonction PutBlob permet d'écrire une valeur dans un champ d'un blob défini par son type et son décalage dans le blob.

PutBlob( VariableBlob, Valeur, Type, Decalage {, Longueur}): Nombre;

La fonction attend en paramètre une variable blob, une valeur sisal, un type élémentaire et un décalage dans le blob; dans certains cas un quatrième paramètre définit la longueur de la zone à extraire.

Les types sont les mêmes que ceux de la fonction GetBlob.

La fonction convertit la valeur recue dans le type primaire défini par le troisième paramètre et l'écrit dans le blob au décalage indiqué.

La fonction rend une valeur Sisal indiquant le nombre de caractères écrits.

Temperature = PutBlob( TrameAEnvoyer, Integer, 24);

Dans cet exemple, un équipement a transmis dans une trame binaire différentes données, l'entier de 4 caractéres placé à partir de la position 24 contient la température qui nous intérésse.

Fonction DumpBlob

La fonction DumpBlob permet de générer le dump d'un blob ou d'une partie d'un blob.

DumpBlob( VariableBlob{, Decalage , Longueur}): Chaine;

La fonction attend en paramètre une variable blob et éventuellement un décalage et une longueur de zone si on ne souhaite qu'un dump partiel.

La fonction convertit la valeur recue dans le type primaire défini par le troisième paramètre et l'écrit dans le blob au décalage indiqué.

La fonction rend une valeur Sisal de type chaine de caractère contenant le dump de la zone recherchée.

Message( DumpBlob( TrameRecue));

Cette fonction n'est utile qu'à des fins de débogage.

Function ValueType

La fonction ValueType permet de connaître le type courant d'une expression, par exemple d'une variable.

ValueType( Expression) : int

La fonction en paramètre une expression ou une variable et retourne une valeur entière caractéristique du type. La définition des types est dépendante des version, elle est maintenue à jour dans le fichier d'inclusion ValueType.sch

Function GetWindowSize

La fonction GetWindowSize permet de connaître la largeur et la hauteur de la fenêtre associé au synoptique en cours d'éxécution.

GetWindowSize( &width, &height): status

La fonction valorise width et height et rend 1 lorsque elle peut retourner ces informations. Dans les autrees cas elle rend null.

Function GetUser

La fonction GetUser permet de retrouver l'identifinat de l'utilisateur connecté au synoptique courant.

GetUser(): string

Function GetScriptDirectiory()

La fonction GetScriptDirectory permet d'obtenir le chemein complet du répertoire contenant les script par défaut.

GetScriptDirectory() : chemin

Fonction GetPrivilege

La fonction GetPrivilege permet de connaître le niveau de privilège dont dispose l'utilisateur courant (pasde paramètre) ou un utilisateur (paramètres nom d'utilisateur et mot de passe).

GetPrivilege( { user, password): int

Les valeurs rendues sont 0 pour opérateur, 1 pour metteur au point et 2 pour administrateur.

Fonction Sqrt

La fonction SQRT permet d'obtenir la racine carrée d'une expression.

Fonction Power

La fonction Power permet d'elever un nombre a une certaine puissance.

Power( X, Y) : float

Les opérandes sont convertis en flottants avant appel de la fonction mathématique.

Power( 10, 2) -> 100

Fonction StrSubstitute

La fonction StrSubstitute permet de remplacer dans une chaîne de caractére toutes les occurrences d'une sous chaîne par une autre sous chaîne.

StrSubstitute( Source, Sub1, Sub2): STR

La fonction retourne la chaîne mis à jour.

Par exemple StrSubstitute( « La terre est bleue comme une orange », « terre », « mer ») retourne « La mer est bleue comme une orange »

Fonction FileDialog

Fonction ColorDialog

Fonction FontDialog

Fonction DateDialog

DateDialog( Prompt, &Value) -> 1/0

Fonction GetVKeybd

GetVKeybd( "Message", &Value {, keybord_filename}) -> 0/1;

Fonction Cypher

Cypher( Donnee, cle, bInverse) : resultat

// La donnee en entree et la cle sont des chaines ASCII de 64bits de long

// Cela retourne une chaine de caractere de meme type

// EnClair = Cypher( "01234567890abcdef", "01234567890abcdef");

// Avec 3 parametres c'est le dechiffrage



Fonction ReadImage

Fonction WriteImage

Fonction SetImage

Fonction echoScreenCopy()

Fonction CurrentDay

Fonction CurrentHour

Fonction CurrentShift

Fonction CurrentWeek

Fonction CurrentMonth

Fonction CurrentYear

Fonction BarCode

Fonction GetPasswordFromUser

Fonction GetTextFromUser

Fonction GetFreeMemory

Fonction GetDiskSpace

Fonction SetImageButton

Fonction AddImage

Fonction Link

Fonction Call

Fonction ShadowRect

Fonction SpcCardList

Fonction SpcCardOf

Fonction SpcCardName

Fonction GetSystemColor

GetSystemColour( indice)

Fonction ShowFullScreen

ShowFullScreen( 1/0, Bitlist)

Fonctions trigonométriques

Sin( value)

Cos( value)

Tan( Value)

Atan2( X, Y)

Fonction d'itérateur

Good( iter) → 1/0

inc( iter)

Fonction PopupMenu

PopupMenu( Liste de coupe { event, String});

On passe a PopupMenu une liste de couple { Event, String}. Les événements doivent être déclarés comme des objets

RemiseAZero Event;

et lorsque l'utilisateur sélectionnera une entrée de popupmenu, la clause associée à l'événement sera déclenchée.

On Event.RemiseAZero do ...

Fonction StrDump

La fonction StrDump permet de produire une chaine de caracteres correspondant au dump de la chaine passée en paramètre; cela permet entre autre de visualiser des caracteres masqués.

Fonction SetTitle

La fonction SetTitle permet de définir, pour un synoptique le titre de lafenêtre.

SetTitle( MonTitre);

Fonction Wstring

La focntion Wstring permet de forcer le transcodage d'une chaine codée en utf-8 en chaine codée en caractéres unicode ( 16 ou 32bits en fonction de l'OS).

Fonction Qsort

La fonction Qsort permet de trier une liste d'indice, en faisant appel à une fonction de retour permettant de faire une comparaison élémentaire entre deux éléments.

La foinction de retour a deux paramètres l'indice d'accés de gauche et l'indice d'accés de droite ; ce sont des entiers compris entre 0 et Nombre-1 . Nombre est le nombre d'élément de l'ensemble à trier.

L'application la plus courante est le tri d'un tableau.

Soit par exemple une table quelconque contenant des valeurs à trier, on veut pouvoir la balayer dans l'ordre des valeurs croissantes.

Var

MaTable Array[NbLigne];

MaListe List;

...

Function MaComparaison(gauche, droite)

// Ici pour un ordre croissant

// Pour un ordre décroissant on inverse les valeurs +1 et -1

begin

if MaTable[gauche] < MaTable[droite] then return -1;

else if MaTable[gauche] == MaTable[droite] then return 0;

else return +1;

end


...

// Preparation de la liste d'indice avant tri, ici on les prend tous

MaListe.ordered(NbLigne);

// Obtention de la liste triée

Qsort( MaListe, MaComparaison, NbLigne);


// Balayage de la table en suivant les valeurs triées

for i in Maliste do Message( MaTable[i]);


Après l'appel de la fonction Qsort (pour l'anglais Quick Sort), la liste MaListe a été complétement recrée en une liste d'entiers de longueur NbLigne et dont chaque ligne est l'indice d'accés au tableau MaTable dans l'ordre attendu.

Il faut noter que Qsort n'accéde pas directement à ma table, il se contente d'appeler une fonction de retour, ici MaComparaison, qui elle interroge MaTable ; cette fonction QSOrt peut donc être utiliser pour trier tout ensemble de données quelque soit son type, il suffit que l'on puisse accéder à chaque élément par un indice.



Fonctions Pdf

Sisal permet de créer un document pdf standard, la sortie est produite de manière semblable à la production d'un dessin (Canvas).

Un pbjet de type Pdf doit être déclaré avant toute utilisation.

Var MondPdf Pdf ;

et on dispose des fonctions suivantes

AddPage() ;

SaveAsFile( filename) ;

SetFont( family, style, size) ;

Cell( w, h = 0, text = ««, border = slPDF_BORDER_NONE, line = 0, align= slPDF_ALIGN_LEFT, fill = 0);

SetHeaderFunction( MonEntete);

SetFooterFunction( MonEmpied);

SetAcceptPageBreakFunction( MonAcceptPageBreak);

Image( “MonImage.png”, x, y, w, h);

PageNo();

AliasNbPages( [ alias = “{nb}”]);

SetY( Y);

SetX( X);

SetAutoPageBreak( autoPageBreak, margin = 0);

GetStringWidth( str): int

SetDrawColor( RGB( rouge, vert, bleu));

SetFillColor( RGB( rouge, vert, bleu));

SetTextColor( RGB( rouge, vert, bleu));

SetLineWidth( largeur);

Ln(); // perform a line break

MultiCell( w, h, str, border = 0, align = slPDF_ALIGN_JUSTIFY, fill = 0, maxline = 0);

Write( h, str {, PdfLink});

AddLink();

SetLink( link, y = 0.0, page = -1);

SetLeftMargin( margion);

SetFonctSize( size);

WriteXml(( str);

SetTitle( str);

SetAuthor( Str);

SetKeywords( a definir);

SetCreator( str);

Fonctions Graphiques

Les fonctions graphiques sont des fonctions de Sisal permettant de réaliser des graphiques 2D.

Ces fonctions ont toutes en premier paramètre un environnement graphique ou DC ( Device Context). Cet environnement ne peut être créé directement dans un script Sisal, il s'agit obligatoirement d'un environnement graphique créé par un objet graphique au moment d'un dessin. Un bon exemple est l'objet Printout qui crée un DC au moment de l'impression d'une page d'un document.

De même ce DC sera automatiquement détruit à la sortie de la fonction de retour.

Ce DC est en fait un paramètre sans signification qui doit être transmis tel que à chaque appel de fonction graphique.

Fonction DcDrawLine

La fonction dcDrawLine permet de tracer une ligne entre deux points en utilisant le pinceau courant (cf. dcSetPen)

DcDrawLine( dc, x0, y0, x1, y1) : status

La fonction attend en paramètre le DC, les coordonnées du point de départ et celle du point d'arrivée.

La fonction retourne 1 en cas de succès, 0 en cas de DC invalide et nul en cas de défaut de paramètrage.

Fonction DcDrawText

La fonction dcDrawTexte permet de dessiner un texte en utilisant les paramètres courants de dessin de texte (cf. dcSetFont, dcSetTextForeground et dcSetTextBackground).

DcDrawText( dc, textte, x0, y0): status

La fonction attend en paramètre le DC, le texte à dessiner et les coordonnées du point de départ de dessin du texte c'est à dire le coin supérieur gauche du premier caractère du texte.

La fonction retourne 1 en cas de succès, 0 en cas de DC invalide et nul en cas de défaut de paramètrage.

Fonction DcDrawRect

La fonction dcDrawRect permet de dessiner un rectangle en utilisant les paramètres courants de dessin de rectangle (cf. dcSetPen, dcSetBrush).

DcDrawRect( dc, x, y, w, h): status

La fonction attend en paramètre le DC, les coordonnées du coin supérieur gauche et la largeur et la hauteur du rectangle.

La fonction retourne 1 en cas de succès, 0 en cas de DC invalide et nul en cas de défaut de paramètrage.

Fonction DcSetFont

La fonction dcSetFont permet de définir la police et la taille de police à utiliser pour les prochains appels de la fonction dcdrawtext.

DcSetFont( dc, police, taille): status

La fonction attend en paramètre le Dc, le nom de la police à utiliser et la taille à appliquer.

La fonction retourne 1 en cas de succès, 0 en cas de DC invalide et nul en cas de défaut de paramètrage.

Par exemple, pour un titre on peut écrire

dcSetFont( dc, "Arial", 24);

Fonction DcSetPen

La fonction dcSetPen permet de définir les caractéristiques du pinceau à appliquer pour les prochains dessins.

DcSetPen( DC, Couleur, largeur, style): status

DcSetPen( Dc, null): status

La fonction attend en paramètre le Dc, une couleur, une largeur de trait et un style de trait. Les styles de traits sont transparent (0), continu (1) et divers pointillé ( >= 2).

Le deuxième type d'appel avec comme paramètre le dc et une valeur nulle permet de restaurer les anciens attributs du pinceau.

La fonction retourne 1 en cas de succès, 0 en cas de DC invalide et nul en cas de défaut de paramètrage.

Par exemple

dcSetPen( dc, RGB( 0, 0, 0), 1, 1); // Trait noir continu

dcSetPen( dc, RGB( 255, 0, 0), 3, 2); // Trait rouge pointillé et large

Fonction DcSetBrush

La fonction dcSetBrush permet de définir les caractéristiques de la brosse à appliquer au prochain dessin d'aplats par exemple l'intérieur d'un rectangle.

DcSetBrush( DC, Couleur, style):status

La fonction attend en paramètre le DC, une couleur et un style. Les styles d'aplat sont transparent (0), continu (1) et différents types de hachage ( >= 2).

La fonction retourne 1 en cas de succès, 0 en cas de DC invalide et nul en cas de défaut de paramètrage.

Par exemple:

dcSetBrush( dc, RGB( 0, 0, 0), 1); // Rectangle plein noir

dcSetBrush( dc, RGB( 255, 0, 0), 0); // Rectangle transparent

Fonction DcSetTextForegroung

La fonction dcSetTextForeground permet de définir la couleur de texte à appliquer aux prochains dessins de texte.

DcSettextForground( DC, couleur) : status

La fonction attend en paramètre le DC et une couleur.

L'exemple suivant permet d'écrire en rouge un « défaut »:

dcSetTextForeground( dc, RGB( 255, 0, 0));

dcDrawText( dc, « Défaut », 100, 100);

La fonction retourne 1 en cas de succès, 0 en cas de DC invalide et nul en cas de défaut de paramètrage.

Fonction DcSetTextBackground

La fonction DcSetTextBackground permet de définir la couleur de fond de texte à appliquer aux prochains dessins de texte.

DcSetTextBackground( DC, couleur) : status

La fonction attend en paramètre le DC et une couleur.

La fonction retourne 1 en cas de succès, 0 en cas de DC invalide et nul en cas de défaut de paramètrage.

Fonction DcGetTextExtent

La fonction DcGetTextExtent permet de connaître la taille qu'occuperait un texte donné en fonction des caractéristiques d'affichage courante dans ce DC.

DcGetTextExtent( dc, texte, &largeur, &hauteur): status

La fonction attend en paramètre un dc, un texte et deux variables contenant aprés l'appel la taille qu'occuperait le texte.

Par exemple pour afficher un texte centré sur le point 100, 100 on peut écrire

dcGetTextExtent( dc, « Sisal is winning again. », w, h);

dcDrawtext( dc, « Sisal is winning again », 100 – w / 2, 100 – h/2);

Fonction DcDrawRotatedText

Dans certaines circonstances il est nécessaire d'incliner le texte à afficher, la fonction dcDrawRotatedText permet d'effectuer cela.

DcDrawRotatedText( dc, texte, x, y, angle) : status

La fonction attend en paramètre le dc, un texte, les coordonnées du point de départ du texte et un angle en degré (0 vers la droite, 90 vers le haut, 180 vers la gauche et 270 vers le bas).

La fonction retourne 1 en cas de succès, 0 en cas de DC invalide et nul en cas de défaut de paramètrage.

Fonction DcGetSize

La fonction dcGetSize permet d'obtenir la taille en millimètre de l'environnement graphique.

DcGetSize( dc, &w, &h): status

La fonction attend en paramètre le DC et deux variables qui contiendront à l'issue de l'appel la largeur et la hauteur du DC dans son état actuel1.

Fonction DcDrawLabel

La fonction dcDrawLabel permet de dessiner un texte dans un cadre défini sans débordement.

DCDrawLabel( dc, texte, x, y, w, h, cadre): status

La fonction attend en paramètre le Dc, un texte, les coordonnées et tailles d'un rectangle et une valeur de cadrage. Si le cadre vaut 0 le texte sera cadré à gauche, 1 centré et 2 cadré à droite.

Fonction DcDrawPolygon

dcDrawPolygon( dc, TabPt, nb, dx, dy, fill_style) : status

Fonction dcDrawButton

dcDrawButton( dc, x, y, w, h, rgb, flags)

Fonction de déclaration de dégradés

dcSetLinearGradientBrush( dc, x1, y1, x2, y2, RGB1( x, y, z), RGB2( x, y, z));

dcSetRadialGradientBrush( dc, x0, y0, xc, yc, radius, RGB1( x, y, z), RGB2( x, y, z));

Fonction GetSystemColor



DLL

Sisal permet d’accéder à partir d’un script ou d’un synoptique à toutes fonctions déclarées dans une librairie dynamique " DLL " standard de Windows.

Il suffit de déclarer le prototype de chacune des fonctions de la DLL appelées à partir du script, en en-tête de fichier avant la déclaration Object ou Var. Comme les paramètres des fonctions des Dlls sont typés, il est nécessaire de déclarer pour chaque fonction le type des paramètres attendus et le type rendu par la fonction. Le nombre de paramètres est limité à huit (8).

Declare Function MaFonction Lib " MaDll.dll " [Alias " NomDansLaDll "] [( type {, type})] [As Type];


Type

Type de paramètre

Integer

Entier

Double

Flottant1

Date

Datation complete

String

Chaine de caractère

Handle

Identificateur d’objet Windows

Par défaut les paramètres sont transmis par valeur, ils peuvent être transmis par adresse en préfixant le champ type par un &.

Par exemple pour déclarer les fonctions permettant de dialoguer avec une gestion de production centrale, on pourrait utiliser les trois définitions suivantes.

Declare Function GPAOInit Lib “GPAO.dll” Alias “GlobalInit”;

Declare Function ChargeLot Lib “GPAO.dll” Alias “OF” ( Integer) As String;

Declare Function EnregistreLot Lib “GPAO.dll” Alias “Record” ( Integer, String, Date, Integer) As Int;

Bien entendu le développement de la Dll sera réalisé dans un autre environnement que Sisal, par exemple Visual C++ ou Delphi.

Et dans le script nous pourrons avoir

On do begin

// Traitement initial

GPAOInit() ;

End

On Dechargement .Signal do begin

EnregistreLot( NumLot, Reference, Now(), Nombre) ;

end


Objets

Les objets sont des entités qui comprennent des données, des fonctions et des événements. Ces données, fonctions ou événements varient en fonction du type d’objet.

Les objets propres au script, c’est à dire qui ne sont pas déclarés dans un fichier d’environnement, sont déclarés en début de script dans une partie précédée par le mot clé " Object " .

Pour chaque objet nous avons une déclaration du genre

NomDObjet TypeDObjet {, Parametre} ;

Les paramètres dépendent du type d’objet.

Les objets définis dans l’environnement n’ont pas besoin d’être déclarés dans la partie " Object ".

Auto-verrouillage

Certains objets sont uniques et partagés entre toutes les clauses, des mises à jour simultanées faites par deux clauses concurrentes pourraient amener à des incohérences dans les données enregistrées.

Afin de s’assurer de l’intégrité de ces données Sisal alloue exclusivement chaque objet à la première clause qui y fait appel et libère cet objet automatiquement à la fin d’exécution de la clause. Tout autre clause qui chercherait à accéder à cet objet pendant qu’il est alloué à une clause, se trouverait suspendu aussi longtemps que la clause verrouillante ne se serait pas terminée.

Par principe le verrouillage (" Lock ") est effectué au premier appel de fonction de l’objet, et le déverrouillage se produit à la fin de l'exécution de la clause. Si nécessaire une clause peut déverrouiller un objet en appelant la méthode " Unlock() ".

Il est donc conseillé d’avoir des clauses exécution courte ou d’utiliser le mécanisme de déverrouillage.

Base‑produit

À partir du serveur

Pour le serveur gérant une base produit, l’objet Base‑produit est directement issu de sa définition dans son fichier d’environnement. L’objet Base‑produit est unique et partagé par toutes les clauses, le mécanisme d’auto-verrouillage assure la cohérence des données (cf. Auto-verrouillage).

Pour le script Sisal la base‑produit apparaît comme une structure de nom le nom de la base produit et qui possède comme membres les champs standards et les champs spécifiques définis dans l’environnement.

Les champs sont valorisés en fonction du dernier enregistrement accédé ou de leurs dernières affectations. A un instant donné la base‑produit n’accède qu’à un et un seul enregistrement.

Par exemple :

MesProduits.Date = Now() ;

De plus on peut valoriser les champs, et enregistrer un nouvel enregistrement (Add) ou Modifier l’enregistrement courant (Write). On peut lire un enregistrement ...

À partir d'un synoptique

Pour un synoptique, une base produit doit être déclarée dans la partie Objet avant d’être utilisée.

NomDeBaseProduit Product, Fichier ;

Le synoptique peut accéder de deux manières aux données de la base produit, soit par un accès direct au fichier ou au SGBD ODBC, soit par un accès indirect géré par le serveur.

Seul l’accès indirect, on dit distant car il peut être effectué sur le réseau, par le serveur permet d'assurer la cohérence des données sur une base produit ; l’accès direct sur une base produit doit être réservé uniquement à des accès en consultation par exemple sur une base de données sauvegardées qui n'est as en exploitation ; l’accès ODBC peut être fait directement puisque c'est le gestionnaire de base de données (Oracle par exemple) qui assure la cohérence des données et des structures.

Les trois accès sont identifiés par leurs chemins :

Type d’accès

Déclaration, exemple

Distant

Nom Product, Application.Module ;1

TabDirect Product, MonApp.MaTable ;

Direct

Nom Product, chemin_d_acces_aux_fichier ;2
TabVue Product,« C:\Sisal\App\Data\Table1.prd » ;

ODBC

Odbc Product, « \\BaseName\TableName » ;

TabOdbc Product, « \\SisalStore\Clients\ » ;

Le Nom est l’identificateur de la base‑produit dans le synoptique, cela doit être un nom différent du nom déclaré dans le fichier de configuration, le Fichier est le chemin d’accès complet au fichier principal de la base‑produit (.prd). Il n’est pas nécessaire que ce soit une base produit active déclarée dans un fichier d’environnement, le chemin peut être la chaîne vide dans le cas où on ouvre la base produit dans la suite par un appel à la fonction Open.

Donc il est très important de choisir avec précision l’accès dont on a besoin :

Si il s'agit d'une base ODBC, on n'a pas de restriction, seulement des performances médiocres,

S'il s'agit de modifier des enregistrements d'une base de données vivante, c'est à dire couplée à un processus qui enregistre des données, il faut impérativement passer par l’accès distant.

Sinon si on fait une simple consultation ou si on veut accéder à une base de données fermées, on peut l’accès direct.



Fonction New

La fonction New permet de valoriser tous les champs de l’enregistrement courant à leurs valeurs par défaut, en particulier les tolérances des mesures. Cette fonction permet en particulier de s’assurer que l’on a aucun champ valorisé par le précédent enregistrement lu de la base de produit, elle permet de plus de verrouiller la base-produit avant de commencer la mise à jour de tous les champs lorsque l’on crée un nouveau produit.

Base-produit.New() : Int

MesProduits.New() ;

La fonction rend 1 en cas de succès et 0 sinon.

Fonction Add

La fonction Add permet de rajouter un nouvel enregistrement à la base produit. Ce nouvel enregistrement est défini par le contenu actuel des champs et sa date instantanée.

Base‑produit.Add() : Int

Par exemple :

MesProduits.Add() ;

La fonction détermine en examinant la valeur de chacun des champs en Lot si elle doit à cette occasion créer un nouveau lot. Si une de ces valeurs est modifiée elle crée automatiquement un nouveau lot, ce nouveau produit sera le premier produit du nouveau lot, et " Maintenant " sera la date de début du lot..

La fonction retourne le numéro d’enregistrement en cas de succès, ‑1 en cas d’échec.

Fonction Read

La fonction Read permet de lire un enregistrement et de le mettre dans les champs d’édition.

BaseProduit.Read( Param) : numéro

BaseProduit.Read( Param, index = 0) : numéro

La fonction attend, dans le premier cas, un numéro d’enregistrement si aucun index n’est actif, ou sinon la valeur recherchée dans le champ indexé.

Dans le deuxième cas la fonction attend deux paramètres une valeur à rechercher en suivant un index et ce numéro d'index; si l'index est 0 la valeur à rechercher est le numéro d'enregistrement.



Dans le cas d’un index multiple la fonction se positionne sur le premier enregistrement correspondant à ce champ.

La fonction retourne le numéro d’enregistrement en cas de succès, ‑1 en cas d’échec.

Par exemple :

MesProduits.Read( 123456) ;

MesProduits.SetIndex( 1) ; // Sélection de l’index sur le CodeProduit

MesProduits.Read( "  XB17312REF " ) ;

La base‑produit enregistre le numéro de l’enregistrement chargé, numéro qui sera utilisé pour enregistrer en fichier l’enregistrement après modification.

Par exemple :

MesProduits.Read( 123456) ;

MesProduits.CodeProduit = "  XB17312REF "  ;

MesProduits.Write() ;

Fonction Write

La fonction Write permet d’enregistrer en fichier l’enregistrement courant.

BaseProduit.Write() : status

La fonction retourne 1 en cas de succès, 0 en cas d’échec.

Fonction Delete

La fonction Delete permet de supprimer un enregistrement de la base produit.

BaseProduit.Delete( Param) : status

La fonction attend en paramètre un numéro d’enregistrement si aucun index n’est actif, ou sinon la valeur recherchée dans le champ indexé.

Dans le cas d’un index multiple, la fonction supprime le premier enregistrement correspondant à ce champ.

La fonction retourne 1 en cas de succès, 0 en cas d'échec.

Un enregistrement effacé se voit affecté une date invalide, et est retiré de tous les index, il n'apparaîtra plus dans les requêtes1. Cependant l'enregistrement ne sera supprimé qu'au prochain compactage de la base séquence.

Fonction SetIndex

La fonction SetIndex permet de sélectionner un index actif afin de faire des accès directs sur un champ particulier.

BaseProduit.SetIndex( Index) : status

Index est le numéro d’index à activer ou zéro si on souhaite désactiver les index. La fonction retourne 1 en cas de succès, 0 en cas d’échec.

L’index sélectionné reste actif jusqu’au prochain SetIndex.

Fonctions Query et Next

Les fonctions Query et Next permettent de réaliser des requêtes sur la base produit. La requête commence par l’appel de la Query, puis par le positionnement des champs dont on veut l’exacte correspondance lors de la requête (ce sont les critères de sélection), puis d’une succession d’appel à la fonction Next() pour chaque produit correspondant aux critères.

BaseProduit.Query()

BaseProduit.Next() : status

Les fonctions Query et Next n’attendent aucun paramètre. La fonction Next retourne un nombre non nul en cas de succès, 0 en cas d’échec c’est à dire quand la requête est terminée.

Par exemple :

Bons = 0 ;

MesProduits.Query() ;

MesProduits.Begin = "  1999/2/1 0 :0 :0 "  ;

MesProduits.End = "  1999/2/28 23 :59 :59 "  ;

MesProduits.Model = "  XB18 "  ;

While MesProduits.Next() Do If MesProduits.Defect == 0 then Bons = Bons+1 ;

Fonction Previous

La fonction previous est comme la fonction Next, hormis le fait qu'elle charge le produit sélectionné précédent au produit courant.

Par exemple dans un synoptique, les trois boutons suivants permettent de naviguer entre toutes les fiches sélectionnées.

On btSelect.Click do begin

Prod.SelectDialog();

Prod.Query();

Prod.Next();

Affiche();

end

On btPrecedent.click do begin

Prod.Previous();

Affiche();

end

On btSuivant.click do begin

Prod.Next();

Affiche();

end

Itérateur Select

L'itérateur Select permet de définir un ensemble d'enregistrement sur le quel Sisal va pouvoir effectuer un traitement.

BaseProduit.Select( index, valeur) : iterateur

BaseProduit.Select( index, minimum, maximum) : iterateur

Par exemple pour sélectionner touts les produits ayant une certaine température de fonctionnement.

For prd in MesProduits.Select( 1, 125.0, 142.0) do begin

MesProduits.Read( prd);

...

end

Fonction Open

La fonction Open permet d'ouvrir une base-produit à partir de son chemin d'accès.

BaseProduit.Open( Chemin): status

La fonction attend en paramètre le chemin accès à la base-produit. Il s'agit d'une ouverture statique sur une base qui peut être une archive. La fonction rend 1 en cas de succès, 0 en cas d'échec.

Fonction Close

La fonction Close permet de fermer une base-produit ouverte.

BaseProduit.Close()

Il est conseillée de fermer les bases-produit avant de les réouvrir avec un Open.

Fonction List

La fonction List permet de rendre la liste des attributs de la base produit dans une liste, c'est à dire dans une chaîne de caractère dont chacun des champs est séparé du suivant par une tabulation.

BaseProduit.List(): String

Fonction Purge

La fonction Purge permet de vider une base-produit de tous ses enregistrements.

BaseProduit.Purge()

Attention cette fonction est sans retour1, donc il ne faut pas s'en servir...

Fonction DefectTag

La fonction DefectTag permet d'obtenir le libellé d'un défaut produit.

BaseProduit.DefectTag( CodeDefaut): String

Si le code défaut existe DefectTag rend la chaîne de caractère correspondante, sinon elle rend une chaîne vide.

Fonction Records

La fonction records permet de connaître le nombre d'enregistrements existants dans une base-produit

BaseProduit.Records(): int

Fonctions Lots

La fonction Lots permet de connaître le nombre de lots existants dans la base-produit.

BaseProduit.Lots():int

Fonction Columns

La fonction Columns permet de connaître le nombre de champs défini dans la base-produit.

BaseProduit.Columns(): Int

Fonction SelectDialog

Dans un synoptique la fonction SelectDialog, permet d’activer l’écran de sélection des paramètres standard de Sisal.

Cet écran permet interactivement de sélectionner les champs période (Début, Fin), la référence, la série, la plage horaire, la gamme opérationnelle et de prépositionner la requête qui sera exploitée par des Next.

BaseProduit.SelectDialog() : status

La fonction rend 1 si l’utilisateur a appuyé sur la touche OK.

Par exemple

Object

Produit Product, "  C :\Program Files\veymont\Sisal\Produits.prd "  ;

....

// L’utilisateur veut sélectionner une gamme de produit

On btSelect.Click Do

if Produit.SelectDialog() then Affiche( Produit.Next()) ;

On btNext.Click Do Affiche( Produit.Next()) ;

Fonction ModelList

La fonction ModelList permet de rendre la liste de toutes les références enregistrées dans la base produit1 dans une liste, c'est à dire dans une chaîne de caractère dont chacun des champs est séparé du suivant par une tabulation.

Fonction MReqList

La fonction MReqList permet de rendre la liste de toutes les séries enregistrées dans la base produit2 dans une liste, c'est à dire dans une chaîne de caractère dont chacun des champs est séparé du suivant par une tabulation.

BaseProduit.MReqList(): String

Fonction NewBlob

La fonction NewBlob permet de créer un nouveau Blob et de l'associer à un champ de type Blob de l'enregistrement courrant.

NewBlob( BlobField, Size {, ColumnNumber}): status

La fonction attend en paramètre le nom d'un champ de type Blob et la taille à allouer. En cas de succés la fonction retourne 1, 0 en cas d'échec.

En fonction du type de Blob la signification du paramètre Size varie.

Type de Blob

Signification du champ size

Void

Taille en octet de la zone allouée

List

Nombre d'éléments à allouer

Vector

Nombre d'éléments à allouer

Array

Nombre de ligne à allouer, le champ ColumnNumber précise le nombre de colonne à allouer par ligne.

Graph

Nombre de ligne à allouer

Curve

Nombre de ligne à allouer ( le nombre de colonne est toujours 2)

Par exemple

If MesProduits.NewBlob( MesProduits.MonBlob, 5) then begin

For i = 0 To 4 do List[i] = 3.141592 * i;

MesProduits.WriteBlob( MesProduits.MonBlob, List, 5);

End

Fonction SetDomain

La fonction SetDomain permet de préciser le domaine utilisé pour enregistrer les données dans un format compact.

SetDomain( BlobField, MinX, MaxX{ , MinY, MaxY});

SetDomain( BlobField, X0, dX, MinY, MaxY);

La fonction attend en paramètre l'identification du champ Blob et les domaines pour les valeurs sur un (vector) ou deux axes (Array, Curve), ou sur une échelle d'abscisse et un domaine pour les ordonnées ( Graph). Cela permet de garder le maximum de précision dans la zone considére et ce pour chaque blob.

Fonction WriteBlob

La fonction WriteBlob1 permet d'écrire dans la zone réservée d'un blob des données issues soit d'une variable de type Blob, soit d'un tableau de variables élémentaires.

WriteBlob( BlobField, Variable {, Nombre {, NombreDeColonne}}): status;

La fonction rend 1 si l'opération a pu s'effectuer.

Suivant le type de blob et le type de variable transmise les paramètres attendues sont les suivants

Type de blob

Type de variable

Paramètres

Description

Void

Blob

Pas de paramètre

Le zone de données binaires est recopiée


String


La chaine est recopiée dans le blob


Autres


Sans intérêt

List
Vector

Blob

Pas de paramètre

Sans intérêt


Tableau à une dimension

Nombre définit le nombre d'éléments utiles dans le tableau.

Chaque cellule du tableau est formatté dans une cellule du Blob


Tableau à deux dimensions


Sans intérêt

Array

Blob

Pas de paramètre

Sans intérêt


Tableau à une dimension

Nombre définit le nombre d'éléments utiles dans le tableau.

Chaque cellule du tableau est formattée dans une cellule du Blob


Tableau à deux dimensions

Nombre définit le nombre de lignes utiles et NombreDeColonne définit le nombre de colonnes utiles.

Chaque cellule du tableau est formattée dans une cellule du Blob

Graphe

Blob


Sans intérêt


Tableau à une dimension

Nombre définit le nombre de lignes utiles

Chaque cellule du tableau est formatté dans une cellule du Blob1


Tableau à deux dimensions

Nombre définit le nombre de lignes utiles

La première colonne contient la liste des abscisses qui n'est pas écrite2, seule la deuxième colonne est écrite

Curve

Blob


Sans intérêt


Tableau à une dimension


Sans intérêt


Tableau à deux dimensions

Nombre définit le nombre de lignes utiles, la deuxième dimension n'est pas précisée car elle vaut obligatoirement 2.

Chaque cellule du tableau est formatté dans une cellule du Blob3



Dans le cas d'un blob de type List, Vector ou Array, si le nombre de cellules allouées par la fonction NewBlob est insuffisant la fonction indique un compte-rendu d'erreur et n'affecte que les cellules allouées, inversement si la source ne contient pas assez de cellules le Blob ne sera pas complétement rempli mais on conservera néanmoins ses nouvelles dimensions.

Par exemple:

Declare Function CamGet Lib “Camera.dll” ( &String, &Integer);

Var Photo; Adresse; Longueur;

On … do begin

// Obtention de l'adresse et de la longueur de la zone

// dans laquelle est enregistrée la photo de la camèra

CamGet( Adresse, Longueur);

// Association à la variable Photo

WriteBlob( Photo, Adresse, Longueur);

Image = Photo; // Affectation de variable blob

Produits.NewBlob( Produits.PhotoSoudure, BlobLen( Image));

Produits.WriteBlob( Produits.PhotoSoudure, Photo);

end



La modification d'une variable en blob implique des allocations internes à Sisal avec recopie des données passées en paramètre; lors d'une affectation d'une variable par une variable Blob il y a aussi allocation de mémoire et recopie; de même lors du passage en paramètre par valeur à une fonction il y a recopie, c'est pour cette raison qu'il est conseillé de passer par adresse les variables nécessitant des allocations mémoires.

Fonction ReadBlob

La fonction ReadBlob1 permet de relire dans une variable ou un tableau de variable le contenu d'un champ blob.

ReadBlob( BlobField, &Variable {, &Nombre {, &NombreDeColonne}}): status;

La fonction rend 1 en cas de succés, 0 en cas d'échec; les variables Nombre et NombreDeColonne sont mises à jour en fonction du nombre de colonnes et de lignes effectivement mises à jour.

Cette fonction est l'inverse de la fonction WriteBlob elle s'utilise de manière semblable.



Table de données

L'objet Table de données ou Datatable est un objet dérivé de l'objet base-produit, il s'agit pour l'essentiel d'une base produit sans la partie lot ; on peut donc l'assimiler à une simple table de base de données

Pour un serveur, l’objet Datatable est directement issu de sa définition dans son fichier d’environnement. L’objet Datatable est unique et partagé par toutes les clauses, le mécanisme d’auto-verrouillage assure la cohérence des données (cf. Auto-verrouillage).

Pour un synoptique, une Datatable doit être déclarée dans la partie Objet avant d’être utilisée.

NomDeBase Datatable12, Fichier ;

Le NomDeBase est l’identificateur de la database dans le synoptique, le Fichier est le chemin d’accès complet au fichier principal de la database (.prd). Il n’est pas nécessaire que ce soit une base active déclarée dans un fichier d’environnement, le chemin peut être la chaîne vide dans le cas où on ouvre la base dans la suite par un appel à la fonction Open.

Pour le script Sisal la base apparaît comme une structure de nom le nom de la base et qui possède comme membres les champs standards et les champs spécifiques définis dans l’environnement.

Les champs sont valorisés en fonction du dernier enregistrement accédé ou de leurs dernières affectations. A un instant donné la base n’accède qu’à un et un seul enregistrement.

Par exemple :

MesDatas.Date = Now() ;

De plus on peut valoriser les champs, et enregistrer un nouvel enregistrement (Add) ou Modifier l’enregistrement courant (Write). On peut lire un enregistrement ...

Fonction New

La fonction New permet de valoriser tous les champs de l’enregistrement courant à leurs valeurs par défaut. Cette fonction permet en particulier de s’assurer que l’on a aucun champ valorisé par le précédent enregistrement lu de la data-table, elle permet de plus de verrouiller la data-table avant de commencer la mise à jour de tous les champs lorsque l’on crée un nouvel enregistrement.

DataTable.New() : Int

MesDatas.New() ;

La fonction rend 1 en cas de succès et 0 sinon.

Fonction Add

La fonction Add permet de rajouter un nouvel enregistrement à la data-table. Ce nouvel enregistrement est défini par le contenu actuel des champs.

DataTable.Add() : Int

Par exemple :

MesDatas.Add() ;

La fonction retourne le numéro d’enregistrement en cas de succès, ‑1 en cas d’échec.

Fonction Read

La fonction Read permet de lire un enregistrement et de le mettre dans les champs d’édition.

DataTable.Read( Param) : numéro

DataTable.Read( Param, index = 0) : numéro

La fonction attend, dans le premier cas, un numéro d’enregistrement si aucun index n’est actif, ou sinon la valeur recherchée dans le champ indexé.

Dans le deuxième cas la fonction attend deux paramètres une valeur à rechercher en suivant un index et ce numéro d'index; si l'index est 0 la valeur à rechercher est le numéro d'enregistrement.



Dans le cas d’un index multiple la fonction se positionne sur le premier enregistrement correspondant à ce champ.

La fonction retourne le numéro d’enregistrement en cas de succès, ‑1 en cas d’échec.

Par exemple :

MesDatas.Read( 123456) ;

MesDatas.SetIndex( 1) ; // Sélection de l’index sur le CodeProduit

MesDatas.Read( "  XB17312REF " ) ;

La base‑data enregistre le numéro de l’enregistrement chargé, numéro qui sera utilisé pour enregistrer en fichier l’enregistrement après modification.

Par exemple :

MesDatas.Read( 123456) ;

MesDatas.CodeProduit = "  XB17312REF "  ;

MesDatas.Write() ;

Fonction Write

La fonction Write permet d’enregistrer en fichier l’enregistrement courant.

DataTable.Write() : status

La fonction retourne 1 en cas de succès, 0 en cas d’échec.

Fonction Delete

La fonction Delete permet de supprimer un enregistrement de la base data.

DataTable.Delete( Param) : status

La fonction attend en paramètre un numéro d’enregistrement si aucun index n’est actif, ou sinon la valeur recherchée dans le champ indexé.

Dans le cas d’un index multiple, la fonction supprime le premier enregistrement correspondant à ce champ.

La fonction retourne 1 en cas de succès, 0 en cas d'échec.

Un enregistrement effacé se voit affecté une date invalide, et est retiré de tous les index, il n'apparaîtra plus dans les requêtes1. Cependant l'enregistrement ne sera supprimé qu'au prochain compactage de la base séquence.

Fonction SetIndex

La fonction SetIndex permet de sélectionner un index actif afin de faire des accès directs sur un champ particulier.

DataTable.SetIndex( Index) : status

Index est le numéro d’index à activer ou zéro si on souhaite désactiver les index. La fonction retourne 1 en cas de succès, 0 en cas d’échec.

L’index sélectionné reste actif jusqu’au prochain SetIndex.

Fonctions Query et Next

Les fonctions Query et Next permettent de réaliser des requêtes sur la base data. La requête commence par l’appel de la Query, puis par le positionnement des champs dont on veut l’exacte correspondance lors de la requête (ce sont les critères de sélection), puis d’une succession d’appel à la fonction Next() pour chaque data correspondant aux critères.

DataTable.Query()

DataTable.Next() : status

Les fonctions Query et Next n’attendent aucun paramètre. La fonction Next retourne un nombre non nul en cas de succès, 0 en cas d’échec c’est à dire quand la requête est terminée.

Par exemple :

Bons = 0 ;

MesDatas.Query() ;

MesDatas.Begin = "  1999/2/1 0 :0 :0 "  ;

MesDatas.End = "  1999/2/28 23 :59 :59 "  ;

MesDatas.Model = "  XB18 "  ;

While MesDatas.Next() Do If MesDatas.Defect == 0 then Bons = Bons+1 ;

Fonction Previous

La fonction previous est comme la fonction Next, hormis le fait qu'elle charge le data sélectionné précédent au data courant.

Par exemple dans un synoptique, les trois boutons suivants permettent de naviguer entre toutes les fiches sélectionnées.

On btSelect.Click do begin

Prod.SelectDialog();

Prod.Query();

Prod.Next();

Affiche();

end

On btPrecedent do begin

Prod.Previous();

Affiche();

end

On btSuivant do begin

Prod.Next();

Affiche();

end

Itérateur Select

L'itérateur Select permet de définir un ensemble d'enregistrement sur le quel Sisal va pouvoir effectuer un traitement.

DataTable.Select( index, valeur) : iterateur

DataTable.Select( index, minimum, maximum) : iterateur

Par exemple pour sélectionner touts les datas ayant une certaine température de fonctionnement.

For prd in MesDatas.Select( 1, 125.0, 142.0) do begin

MesDatas.Read( prd);

...

end

Fonction SQLSelect

La fonction SQLSelect1 permet sur une table ODBC, de faire une itération sur un ensemble de données ayant certaines caractéristiques.

DataTable.SQLSelect( expression_sql) : iterateur

Par exemple on pourra ecrire

For iter in MesDFatas.SQLSelect( « Temperature > 45 ») do

Message( MesDatas.Datation) ;

ou bien

iter = MesDatas.SQLSelect( « Quantite < 10 ») ;

while good( iter) do begin

MesDatas.Quantite = 10 ;

MesDatas.Write() ;

inc( iter) ;

end

Fonction SQLExec

La fonction SQLExec permet sur une table ODBC, d'éxécuter une instruction SQL quelconque.

DataTable.SQLExec( instruction_sql) : status

La fonction attend en paramêtre une instruction SQL légale pour le modèle de bases de données utilisée (Oracle, PostgreSQL, …).

La fonction retourne 1 en cas de succés, 0 si aucune donnée n'a été exploité par le SGBDR, et nulle si l'instruction n'a pu être compilé par le SGBD.

Par exemple on pourra ecrire

MesDFatas.SQLExec( « UPDATE INVENTAIRES SET DATE_INVENTAIRE = TO_DATE( '2012-04-19', 'YYYY-MM-DD')») ;

Fonction SQLInsert

La fonction SQLInsert permet sur une table ODBC, d'insérer de nouveaux enregistrements.

DataTable.SQLInsert( liste_attribut, liste_valeur) : status

La fonction attend en paramêtre une liste d'attributs existants dans la table, et une liste de valeurs ou une liste de liste de valeurs que l'on affectera aux nouveaux enregistrements ; si la likste de valeurs contient par exemple 5 sous-liste de valeurs on créera 5 enregistrements.

La fonction retourne 1 en cas de succés et nul si l'instruction n'a pu être compilé par le SGBD.

Par exemple on pourra ecrire

MaTable.SQLInsert( "NOM, LONGEVITE, NOURRITURE", "'LAPIN', 3, 'Herbe'");

MaTable.SQLInsert( "NOM, LONGEVITE, NOURRITURE", "Select NOM, AGE, NOURRITURE FROM ANIMAUX WHERE ORDRE = 'Leporidae' ");

films.SQLInsert( "(code, title, did, date_prod, kind)",

"('B6717', ''A bout de souffle', 110, '1959', 'Tragedy'),":

"('HG120', 'Easy rider', 140, '1969', 'Road movie')");

Fonction Open

La fonction Open permet d'ouvrir une base-data à partir de son chemin d'accès.

DataTable.Open( Chemin): status

La fonction attend en paramètre le chemin accès à la base-data. Il s'agit d'une ouverture statique sur une base qui peut être une archive. La fonction rend 1 en cas de succès, 0 en cas d'échec.

Fonction Close

La fonction Close permet de fermer une base-data ouverte.

DataTable.Close()

Il est conseillée de fermer les bases-data avant de les réouvrir avec un Open.

Fonction List

La fonction List permet de rendre la liste des attributs de la base data dans une liste, c'est à dire dans une chaîne de caractère dont chacun des champs est séparé du suivant par une tabulation.

DataTable.List(): String

Fonction Purge

La fonction Purge permet de vider une base-data de tous ses enregistrements.

DataTable.Purge()

Attention cette fonction est sans retour, donc il ne faut pas s'en servir...

Fonction Records

La fonction records permet de connaître le nombre d'enregistrements existants dans une base-data

DataTable.Records(): int

Cette fonction rend toujours 0 dans le cas d'une table ODBC.

Fonction Columns

La fonction Columns permet de connaître le nombre de champs défini dans la base-data.

DataTable.Columns(): Int

Fonction SelectDialog

Dans un synoptique la fonction SelectDialog, permet d’activer l’écran de sélection des paramètres standard de Sisal.

Cet écran permet interactivement de sélectionner les champs période (Début, Fin), la référence, la série, la plage horaire, la gamme opérationnelle et de prépositionner la requête qui sera exploitée par des Next.

DataTable.SelectDialog() : status

La fonction rend 1 si l’utilisateur a appuyé sur la touche OK.

Par exemple

Object

Produit Product, "  C :\Program Files\veymont\Sisal\Produits.prd "  ;

....

// L’utilisateur veut sélectionner une gamme de data

On btSelect.Click Do

if Produit.SelectDialog() then Affiche( Produit.Next()) ;

On btNext.Click Do Affiche( Produit.Next()) ;

Base‑procédé

L’objet Base‑procédé est directement issu de sa définition dans un fichier d’environnement pour un script Serveur. L’objet Base‑procédé est unique et partagé par toutes les clauses, le mécanisme dauto-verrouillage permet d’assurer la cohérence des données.

Pour le script Sisal la base‑procédé apparaît comme une structure de nom le nom de la base‑procédé et qui possède comme membres les champs suivants : Begin, End, Mode, Equipment.

Les champs sont valorisés en fonction du dernier enregistrement accédé ou de leurs dernières affectations. A un instant donné la base‑procédé n’accède qu’à un et un seul enregistrement.

Par exemple :

MesProcédés.Date = Now() ;

De plus on peut valoriser les champs, et enregistrer un nouvel enregistrement (Add). On peut lire un enregistrement Get...

Variables Poste

Pour chacun des postes de la ligne la base procédé définit des variables postes. Ces variables postes maintiennent à jour un entier correspondant au mode de marche du poste. Ces entiers peuvent être lus ou écrits, dans ce dernier cas Sisal l’interprète comme la mise à jour en temps réel de l’état du poste et effectue l’enregistrement en fichier correspondant.

De plus pour chacun des modes de marche, la base‑procédé définit les constantes correspondantes qui peuvent être utilisées dans des affectations.

Par exemple :

MesProcedes.Chargement = MesProcedes.Reparation ;

On enregistre le fait qu’à partir de maintenant le poste de chargement est dans un mode de réparation.

Fonction Add

La fonction Add permet de rajouter un nouvel enregistrement à la base procédé. Ce nouvel enregistrement est défini par le contenu actuel des champs et sa date instantanée.

Base‑procédé.Add() : Int

Par exemple :

MesProcédés.Add() ;

La fonction retourne le numéro d’enregistrement en cas de succès,

Fonction Get

La fonction Get permet de lire un enregistrement et de le mettre dans les champs d’édition.

BaseProcédé.Get( Param) : numéro

La fonction attend en paramètre un numéro d’enregistrement.

Fonctions Query et Next

Les fonctions Query et Next permettent de réaliser des requêtes sur la base‑procédé. La requête commence par l’appel de Query, puis par le positionnement des champs dont on veut l’exacte correspondance lors de la requête (ce sont les critères de sélection), puis d’une succession d’appel à la fonction Next() pour chaque produit correspondant aux critères.

BaseProcédé.Query()

BaseProcédé.Next() : status

La fonction Query et Next n’attendent aucun paramètre. La fonction Next retourne un nombre non nul en cas de succès, 0 en cas d’échec c’est à dire quand la requête est terminée.

Par exemple :

MesProcedes.Query() ;

MesProcedes.Begin = "  1999/2/1 0 :0 :0 "  ;

MesProcedes.End = "  1999/2/28 23 :59 :59 "  ;

While MesProcedes.Next() Do

If MesProcedes.Mode == 0 then Bons = Bons+1 ;

Base‑Alarme

L’objet base‑alarme est directement issu de sa définition dans un fichier d’environnement pour un script Serveur. L’objet base‑alarme est unique et partagé par toutes les clauses, le mécanisme d’auto-verrouillage assure qu’il ne peut être ouvert simultanément par deux clauses (cf. Auto-verrouillage).

Pour le script Sisal la base‑alarme apparaît comme une structure de nom le nom de la base‑alarme et qui possède comme membres les champs suivants : Date, Equipment, Code, Acknowledge.

Les champs sont valorisés en fonction du dernier enregistrement accédé ou de leurs dernières affectations. A un instant donné la base‑alarme n’accède qu’à un et un seul enregistrement.

Par exemple :

MesAlarmes.Date = Now() ;

La base‑alarme est principalement utilisé dans un script afin de lever et de rabaisser des alarmes.

Fonction Raise

La fonction Raise permet de lever une alarme sur un équipement donné. Cela crée un nouvel enregistrement daté de maintenant.

Base‑Alarme.Raise( Equipment, AlarmCode) : Numéro

Par exemple :

Ano108 = MesAlarmes.Raise( Chargement, 108) ;

La fonction retourne le numéro d’alarme afin qu’il puisse être acquitté dés que le défaut sera retombé.

Fonction Drop

La fonction Drop permet d’acquitter, c’est à dire d’associer une date d’acquittement à cette alarme afin d’indiquer qu’elle a été soit corrigée, soit lue.

Base‑Alarme.Drop( Numéro) : status

La fonction attend en paramètre un numéro d’alarme précédemment levé, et rend 1 en cas d’acquittement et 0 en cas d’échec.

Par exemple :

MesAlarmes.Drop( Ano108) ;

Fonction Get

La fonction Get permet de lire un enregistrement et de le mettre dans les champs d’édition.

BaseAlarme.Get( Param) : numéro

La fonction attend en paramètre un numéro d’enregistrement et retourne 1 en cas de succès et 0 en cas d’échec.

Fonctions Query et Next

Les fonctions Query et Next permettent de réaliser des requêtes sur la base‑alarme. La requête commence par l’appel de Query, puis par le positionnement des champs dont on veut l’exacte correspondance lors de la requête (ce sont les critères de sélection), puis d’une succession d’appel à la fonction Next() pour chaque produit correspondant aux critères.

BaseAlarme.Query()

BaseAlarme.Next() : status

Les fonctions Query et Next n’attendent aucun paramètre. La fonction Next retourne un nombre non nul en cas de succès, 0 en cas d’échec c’est à dire quand la requête est terminée.

Par exemple :

MesAlarmes.Query() ;

MesAlarmes.Date = "  1999/2/1 0 :0 :0 "  ;

While MesAlarmes.Next() Do

If MesAlarmes.Acknowledge == 0 then Message( ...) ;


Fonction Unlock

La fonction Unlock permet de déverrouiller la base-alarme (cf. Auto-verrouillage).

Fonction GetCount

La fonction GetCount rend le nombre d'alarme enregistrées dans la base-alarme.

BaseAlarme.GetCount();

Par exemple:

Nombre = MesAlarmes.GetCount();

MesAlarmes.Get( Nombre-1); // Lecture de la dernière alarme

Fonction GetDesc

La fonction GetDesc retrouve les caractéristiques d'un code d'alarme.

BaseAlarme.GetDesc( CodeDAlarme, &Descripteur, [&Gravite, [&Categorie]]): status

CodeDAlarme contient le code d'alarme dont on veut les caractérisitques.

SI le code d'alarme existe dans la base, la fonction retourne 1 et met à jour le descripteur de l'alarme, et optionnellement la gravité et optionnellement la catégorie de l'alarme. Dans le cas contraire la fonction retourne 0.

Par exemple

if MesAlarmes.GetDesc( 25, Nom) then

Message( "L'alarme ":Nom:" a été levée!");

Else Message( "Une alarme non identifiée a été levée!");

Fonction EquipmentTag

La fonction EquipmentTag permet d'obtenir le libellé d'un équipement tel que enregistré dans la base alarme.

BaseAlarme.EquipmentTag( NumEquipement): String

Si le numéro d'équipement existe EquipmentTag rend la chaîne de caractère correspondante, sinon elle rend une chaîne vide.



Base‑Maintenance

L’objet base‑maintenance est directement issu de sa définition dans un fichier d’environnement pour un script Serveur. L’objet base-maintenance est unique et partagé par toutes les clauses, le mécanisme d’auto-verrouillage assure qu’il ne peut être ouvert simultanément par deux clauses (cf. Auto-verrouillage).

Pour le script Sisal la base-maintenance apparaît comme une structure de nom le nom de la base-maintenance.

Une base maintenance comprend deux parties, une partie compteur qui contient tous les compteurs dans leurs états présents et une partie journal qui enregistre toutes les actions de maintenance qui ont été effectuées sur ces compteurs dans le passé, tous les attributs et fonctions relatifs à cette deuxième partie sont préfixé par " Log ".

Chaque enregistrement de la partie compteur dispose des champs suivants :

Champ

Description

Name

Nom complet du compteur

Value

Valeur du compteur au moment de la lecture

Type

Type de compteur (0 compteur, 1 timer)

Event

Gamme fonctionnelle indiquant sur quels événements doit être incrémenté le compteur (cf.PulseEvent et PulseCount)

Period

Période à laquelle on doit envoyer un message d’alarme pour indiquer qu’une action de maintenance est requise.

Coefficient

Coefficient multiplicatif à appliquer au champ Period pour comparer avec le compteur primaire, par exemple le mettre à 3600 si on veut avoir une période exprimée en heure alors que l’on accumule des durées en seconde.

Unit

Chaîne de caractère contenant l’unité d’affichage

Equipment

Numéro d ‘équipement associé

Message

Message d’alarme à envoyer.

Chaque enregistrement de la partie journal dispose des champs suivants :

Champ

Description

LogDate

Date de la journalisation

LogItem

Numéro de compteur associé

LogCount

Valeur du compteur au moment de la journalisation

LogComment

Commentaire enregistré lors de la journalisation

Les champs sont valorisés en fonction du dernier enregistrement accédé ou de leurs dernières affectations. A un instant donné la base-maintenance n’accède qu’à un et un seul enregistrement.

Par exemple :

MesMaintenances.Date = Now() ;

Afin d'accélérer la mise à jour des compteurs de maintenance, le serveur Sisal va maintenir en mémoire des copies de certains compteurs de la base-maintenance, ce sont les compteurs actifs par opposition aux compteurs statiques qui sont enregistrés dans la base-maintenance. Seuls les compteurs définis dans le fichier de configuration peuvent être actifs. Un compteur actif est identifié par son nom, "MesMaintenances.C1" par exemple, et il peut être associé successivement à différents compteurs statiques par la fonction (cf. Link).

Cette fonctionnalité est utile lorsque vous souhaitez associer des compteurs à des sous-ensembles d'équipements qui peuvent être échangés, par exemple des moules d'une presse.

Fonction New

La fonction New permet d'initialiser tous les champs de l'enregistrement courant par des valeurs nulles, elle permet de plus de verrouiller la base-maintenance avant de commencer la mise à jour de tous les champs lorsque l’on crée un nouveau compteur.

BaseMaintenance.New() : Int

Maintenances.New() ;

La fonction rend 1 en cas de succès et 0 sinon.

Fonction Find

La fonction Find permet de retrouver un compteur actif d'après le nom du compteur statique associé1.

BaseMaintenance.Find( NomCompteur) : Ident

La fonction rend le numéro du premier compteur actif associé à ce compteur statique s'il existe, -1 sinon.

Par exemple:

Premier = Maintenances.Find( "Cellule2.Moteurs.X");

Fonction FindRecord

La fonction FindRecord permet de retrouver le numéro d'enregistrement d'un compteur statique d'après son nom1.

BaseMaintenance.FindRecord( NomCompteur): Numéro

La fonction rend le numéro d'enregistrement de ce compteur statique ou -1 s’il n’existe pas.

Par exemple :

record = Maintenances.FindRecord( "Chariot.112.Moteur ") ;

Fonction Link

La fonction Link permet de changer l'affectation d'un compteur actif.

BaseMaintenance.Link( IdActif, IdCompteur): status

La fonction attend en paramètre un numéro de compteur actif et un numéro d'enregistrement de compteur statique ou une valeur indéfinie. Si on ne souhaite plus associé un compteur actif à quelque compteur actif que ce soit, il suffit de passer comme paramètre une valeur nulle.

La fonction rend 1 en cas de succès et 0 en cas d'échec (compteur inexistant par exemple). La déassociation d'un compteur actif rend 1.

Par exemple

Maintenances.Link( Maintenances.C1,

Maintenances.FindRecord( "Cellule3.Moteur.AxeX") );

// Maintenant on incrémente "Cellule3.Moteur.Axe" et non "Celluel2…"

Maintenances.Link( Maintenances.C1, null);

// Maintenant on n'incrémente plus aucun compteur statique par le biais de C1.

Autre exemple, changer l'association de plusieurs compteurs simultanément:

Cpt = Mtn.FindRecord( "Interfaces.112.1");

For Act = Maintenances.Interface to Maintenances.Interface+9 do begin

Mtn.Link( Act, Cpt);

Cpt = Cpt + 1;

end

Fonction Pulse

La fonction Pulse permet d’incrémenter un compteur actif1 désigné par son numéro de compteur.

BaseMaintenance.Pulse( IdCpt)

Par exemple pour un compteur actif :

MesMaintenances.Pulse( MesMaintenances.C1);

Et pour incrémenter un compteur statique, on pourra faire

Verrin = MesMaintenances.Find( "Poste5.Axe.Verrins.X");

MesMaintenances.Pulse( Verrin);

Mais dans ce dernier cas, si le compteur n'est pas actif il ne sera pas incrémenté.

Fonction PulseEvent

La fonction PulseEvent permet d’incrémenter tous les compteurs actifs associés à un événement. Typiquement on associe des compteurs à des fonctions de la gamme fonctionnelle2, et quand ces fonctions sont effectuées, on incrémente ces compteurs, cela permet de limiter le nombre d'appels à la base maintenance.

BaseMaintenance.PulseEvent( Range [, Equipement])

Sisal examine tous les compteurs actifs et pour chacun d'entre eux fait le et-logique entre la gamme Event associée au compteur et la gamme Range transmise en paramètre; si ce et est non-nul, Sisal incrémente le compteur. Par exemple :

MesMaintenances.PulseEvent( fVissage | fCollage);

Optionnellement on peut préciser un numéro d'équipement non nul et dans ce cas seuls les compteurs associés à cet équipement sont incrémentés.

Fonction Count

La fonction Count permet d'incrémenter un compteur actif1 d'une durée de seconde ou plus.

BaseMaintenance.Count( IdCpt, Duration);

 Par exemple

Etuve = MesMaintenances.Find( "Station5.Etuve.TemperatureHaute");

MesMaintenances.Count( Etuve, 1200); // 20 mn

De manière semblable à la fonction Pulse, seuls les compteurs actifs pourront être incrémentés.

Fonction CountEvent

La fonction CountEvent permet d'incrémenter tous les compteurs actifs, associés à un événement, d'une durée de seconde.

BaseMaintenance.CountEvent( Range, Duration [, equipement]);

 Par exemple

MesMaintenances.CountEvent( fVissage | fCollage, 1200); // 20 mn

Optionnellement on peut préciser un numéro d'équipement non nul et dans ce cas seuls les compteurs associés à cet équipement sont incrémentés.

Fonction GetProperties

La fonction GetProperties permet d'obtenir les paramètres de fonctionnement d'un compteur actif. La fonction attend en paramètre le numéro de compteur actif et un numéro de propriété défini dans le tableau ci-après.

BaseMaintenance.GetProperties( IdCpt, Prop): valeur

Numéro

Propriété

Description

1

Cumul

Valeur instantanée du compteur

2

Période

Période d déclenchement du compteur

3

Coefficient

Coefficient multiplicateur par lequel il faut diviser le cumul pour obtenir la valeur à afficher, par exemple 3600 pour passer des secondes aux heures.

4

Equipement

Numéro d'équipement auquel est associé ce compteur

5

Evénements

Gamme fonctionnelle associée au compteur (cf. PulseEvent et CountEvent)

Par exemple:

Cumul_Instantane = Maintenances.GetProperties( Maintenances.C1, 1);

Fonction SetProperties

La fonction SetProperties permet de modifier les paramètres de fonctionnement d'un compteur actif. Ces modifications sont prises en compte uniquement dans le compteur actif et ne sont pas propagées jusqu'au compteur statique éventuellement associé à celui-ci.

La fonction attend en paramètre le numéro de compteur actif, un numéro de propriété (cf.GetProperties) et une valeur.

BaseMaintenance.SetProperties( IdCpt, Prop, Valeur): status

La fonction rend 1 en cas de succès, 0 en cas d'échec. 

Par exemple, pour modifier les événements associés à un compteur actif.

Maintenances.SetPropreties( Maintenances.C1, 5, fAssemblage | fCollage); 



Fonction GetCount

La fonction GetCount rend le nombre de compteur enregistré dans la base maintenance.

BaseMaintenance.GetCount();

Par exemple:

Nombre = Maintenances.GetCount();

For cpt = 0 to Nombre-1 do …

Fonction Add

La fonction Add permet de rajouter un nouveau compteur à la base de maintenance. Ce nouvel enregistrement est défini par le contenu actuel des champs.

BaseMaintenance.Add() : Int

Par exemple :

MesMaintenances.Name = "Cellule3.Axes.X";

MesMaintenances.Add() ;

La fonction retourne le numéro de compteur en cas de succès, ‑1 en cas d’échec.

Fonction Read

La fonction Read permet de lire un enregistrement et de le mettre dans les champs d’édition.

BaseMaintenance.Read( Param) : numéro

La fonction attend en paramètre soit un descripteur de compteur, soit un identifiant de compteur actif, soit le numéro de compteur.

La fonction retourne le numéro d’enregistrement en cas de succès, ‑1 en cas d’échec.

Par exemple :

AxesX = MesMaitenances.Find(( "Cellule3.Axes.X") ;

MesMaintenances.Read( AxesX) ;

MesMaintenances.Read( 145 ) ;

La base‑maintenance enregistre le numéro de compteur chargé, numéro qui sera utilisé pour enregistrer en fichier l’enregistrement après modification.

Fonction Write

La fonction Write permet d’enregistrer en fichier l’enregistrement courant.

BaseMaintenance.Write() : status

La fonction retourne 1 en cas de succès, 0 en cas d’échec.

Fonctions Query et Next

Les fonctions Query et Next permettent de réaliser des requêtes sur l'ensemble des compteurs d'une base‑maintenance. La requête commence par l’appel de Query, puis par le positionnement des champs dont on veut l’exacte correspondance lors de la requête (ce sont les critères de sélection), ou la correspondance partielle pour le nom de compteur, puis d’une succession d’appel à la fonction Next() pour chaque compteur correspondant aux critères.

BaseMaintenance.Query()

BaseMaintenance.Next() : status

Les fonctions Query et Next n’attendent aucun paramètre. La fonction Next retourne un nombre non nul en cas de succès, 0 en cas d’échec c’est à dire quand la requête est terminée.

Par exemple pour lister l'ensemble des compteurs proches du déclenchement.

MesMaintenances.Query() ;

While MesMaintenances.Next() Do

If MesMaintenance.Value / MesMaintenances.Period > 0.90 then

List = List:MesMaintenances.Name:#09;

Fonction GetRecord

La fonction rend le numéro de compteur courant, par exemple pendant l'exécution d'une requète.

BaseMaintenance.GetRecord(): Numero

Par exemple:

MesMaintenances.Query() ;

MesMaintenances.Name = "Cellule1.Moteurs";

While MesMaintenances.Next() Do

Numero = MesMaintenances.GetRecord();

Fonction LogAdd

La fonction LogAdd permet de rajouter un enregistrement dans le journal de maintenance. Les paramètres permettent de définir le numéro de compteur et le commentaire associé.

BaseMaintenance.LogAdd( compteur, commentaire): Int

La fonction retourne le numéro d'enregistrement en cas de succès, -1 en cas d'échec.

Par exemple:

MesMaintenances.LogAdd(

MesMaintenances.Find( "Cellule2.Moteurs.Transversal"),

"Sans commentaire" );

Fonction Reset

La fonction Reset permet de remettre à zéro un compteur et si nécessaire de journaliser cette action. Les paramètres permettent de définir le numéro de compteur et le commentaire associé.

BaseMaintenance.LogAndReset( compteur [, commentaire]): Int

La fonction retourne le numéro d'enregistrement en cas de succès, -1 en cas d'échec.

Par exemple:

MesMaintenances.Reset(

MesMaintenances.Find( "Cellule2.Moteurs.Transversal"),

"Sans commentaire" );

 En l'absence du commentaire ou s'il est indéfini, la journalisation n'est pas effectuée.

Fonctions LogQuery et LogNext

Les fonctions LogQuery et LogNext permettent de réaliser des requêtes sur le journal de la base‑maintenance. La requête commence par l’appel de LogQuery, puis par le positionnement des champs dont on veut l’exacte correspondance lors de la requête (ce sont les critères de sélection), puis d’une succession d’appel à la fonction LogNext() pour chaque produit correspondant aux critères.

BaseMaintenance.LogQuery()

BaseMaintenance.LogNext() : status

Les fonctions LogQuery et LogNext n’attendent aucun paramètre. La fonction Next retourne un nombre non nul en cas de succès, 0 en cas d’échec c’est à dire quand la requête est terminée.

Par exemple pour calculer le nombre total de cycle sur un élément de maintenance.

MesMaintenances.LogQuery() ;

MesMaintenances.Ident =

MesMaintenances.Find( "Cellule2.Moteurs.Transversal") ;

While MesMaintenances.LogNext() Do

GrandTotal = GrandTotal + MesMaintenances.Total;

Fonction Unlock

La fonction Unlock permet de déverrouiller la base-Maintenance (cf. Auto-verrouillage).

Carte de contrôle

Une Carte de contrôle active permet de surveiller l’évolution d’une grandeur physique en utilisant les outils de contrôle statistique (MSP / SPC). Cela est différent d’une carte de contrôle faite hors ligne sur des mesures récupérées dans une base‑produit. Dans ce dernier cas on pourra seulement constater une dérive à posteriori, alors que la carte de contrôle active va effectuer cette surveillance en tâche de fond et éventuellement détecter les anomalies en temps réel.

Pour le script Sisal la carte de contrôle apparaît comme une structure de nom le nom de la carte de contrôle et qui possède comme membres les champs suivants :

Nom

Description

PPC

Points par carte

SPP

Echantillons par points

Interval

Nombre de produits ignorés entre deux points

UCLX

Limite de contrôle supérieur aux X

LCLX

Limite de contrôle inférieur aux X

UCLS

Limite de contrôle supérieur aux S

LCLS

Limite de contrôle inférieur aux S

Threshold

Seuil de contrôle du CP

Anomalies

Mot binaire indiquant les anomalies contrôlées



Si on modifie le nombre de points par carte ou le nombre d’échantillons par point, la carte est resetée.

Les anomalies contrôlées sont

Anomalie

Valeur binaire

Cp

1

Khi2

2

Hors Limite

4

Stabilité

8

Stratification

16

Serie

32

Série croissante

64

Série décroissante

128



Les champs sont valorisés en fonction du dernier enregistrement accédé ou de leurs dernières affectations.

La carte de contrôle définit un événement Update et deux méthodes Add et AddXS

L’événement Update

L’événement Update est activé chaque fois qu’une carte de contrôle ajoute un nouveau point.

Fonction Add

La fonction Add permet d’envoyer une mesure à la carte de contrôle.

CarteDeControle.Add( Mesure) : status

La fonction rend 1 si elle a réussi à prendre en compte la mesure.

Suivant l’état des compteurs internes de la carte, cette mesure sera ignorée ( on est dans l’intervalle), conservée afin de constituer un nouveau point et éventuellement dans ce cas elle provoquera la création d’un nouveau point.

Chaque fois que la carte crée un nouveau point, elle recherche des anomalies éventuelles du genre de celles qui sont activées, et positionne en conséquence le mot d’anomalie associé au point, puis enfin active l’événement Update.

Par exemple :

On ... Do SpcCouple.Add( Couple) ;

On SpcCouple.Update Do if SpcCouple.Anomalies then begin

if SpcCouple.Anomalies & Range(1) then Alarme.Raise( P501, 9000) ; // Cp

if SpcCouple.Anomalies & Range(2) then Alarme.Raise( P501, 9001) ; // Khi2

if SpcCouple.Anomalies & Range(3) then Alarme.Raise( P501, 9002) ; // HorsLimite

if SpcCouple.Anomalies & Range(4) then Alarme.Raise( P501, 9003) ; // Stabilité

if SpcCouple.Anomalies & Range(5) then Alarme.Raise( P501, 9004) ; // Stratification

if SpcCouple.Anomalies & Range(6) then Alarme.Raise( P501, 9005) ; // Seri

e if SpcCouple.Anomalies & Range(7) then Alarme.Raise( P501, 9006) ; // Croissan

t if SpcCouple.Anomalies & Range(8) then Alarme.Raise( P501, 9007) ; // Decroissant

end

Fonction AddXS

Dans certaines circonstances, il est utile de pouvoir créer un point à partir de sa moyenne et de son écart‑type. C’est l’objet de la fonction AddXS.

CarteDeControle.AddXS( Moyenne, Ecart‑type) : status

La fonction rend 1 en cas de succès.

La fonction ne tient pas compte de l’intervalle, et crée un point à chaque appel. Elle effectue ensuite les détections d’anomalies, puis active l’événement Update.

Base‑Séquence

Afin de pouvoir suivre, identifier et comptabiliser des séquences de fabrication Sisal définit l'objet base-séquence1. Une séquence est l'enregistrement d'une occupation d'un moyen pendant une certain temps. Par exemple on peut avoir les séquences suivantes:

L'objectif est de connaître, en totalité à quoi a été utilisé un moyen, une ligne d'assemblage par exemple, pendant toute une période d'ouverture, par exemple une équipe.

Donc on aura des séquences productives associées à des références ou des lots de fabrication particuliers, et des séquences improductives associées à des opérations comme de la maintenance préventive, du réapprovisionnement, etc…

Afin de mieux analyser ce qu'il se passe, à une séquence va être associée une suite de compteurs correspondant à la production réalisée sur le moyen par tranche de cinq minutes, d'où le nom de séquence ou suite de production.

Une application typique de base séquence va être l'enregistrement équipe par équipe de tous les lots de fabrication, et de toutes les situations de production permettant d'expliquer la non tenue des objectifs de production. Au début de l'équipe le responsable de production renseigne les lots de fabrication à réaliser pendant la durée de l'équipe, et à la fin de l'équipe il va éventuellement créer de nouvelle séquence permettant d'identifier où la capacité productive de la machine a été occupée (maintenance, réparation, approvisionnement).



L’objet base‑séquence correspond à une base de donnée dédiée au suivi des séquences de fabrication. , il est directement issu de sa définition dans un fichier d’environnement pour un script Serveur. L’objet base-séquence est unique et partagé par toutes les clauses, le mécanisme d’auto-verrouillage assure qu’il ne peut être ouvert simultanément par deux clauses (cf. Auto-verrouillage).

Pour le script Sisal la base-séquence apparaît comme une structure de nom le nom de la base-séquence.

Une base Séquence comprend deux parties principales, une partie séquence qui contient toutes les séquences enregistrées et une partie description qui enregistre tous les types de séquences.

Chaque enregistrement de la partie séquence dispose des champs suivants :

Champ

Description

Equipment

Numéro d'équipement auquel est associé la séquence, tel que défini dans le fichier de configuration (0 premier poste, ...), si la séquence n'est pas associé à un poste particulier la valeur -1 est utilisée.

Date

Date et heure d'ouverture de la séquence

Duration

Durée d'ouverture de la séquence

Uptime

Durée d'activation de la séquence1

Descriptor

Indice du descripteur associé dans la partie description

Planned

Quantité prévue de pièces à produire ou équivalent.

Realized

Quantité de pièces ou équivalents produits pendant l'ouverture de la séquence.

Counters

Tableau de compteurs comptabilisant par période de 5mn le nombre de pièces ou équivalent produits.

Comment

Chaque séquence peut-être commentée par une chaîne de caractère

Chaque enregistrement de la partie description dispose des champs suivants :

Champ

Description

Name

Chemin du descripteur, notation pointée permettant de classer les descripteurs dans un arbre; par exemple "Produits.XB18.R123656" ou "Maintenance.Préventive"

Type

Type de séquence (cf. les déclarations de séquence dans une configuration)

CycleTime

Durée en milliseconde du temps de cycle théorique pour cette référence

Colour

Couleur RGB associé à ce type de séquence, utilisé dans les affichages de séquence.

Les champs sont valorisés en fonction du dernier enregistrement accédé ou de leurs dernières affectations. A un instant donné la base-séquence n’accède en direct qu’à un et un seul enregistrement.

Par exemple :

MesSéquences.Date = Now() ;

Afin d'accélérer la mise à jour des compteurs de séquence, le serveur Sisal va maintenir en mémoire des copies de certaines séquences de la base-séquence, ce sont les séquences actives par opposition aux séquences statiques qui sont enregistrées dans la base-séquence.

Une séquence active doit être explicitement créée par un Create et fermée par un Close, comme un fichier par exemple. Si le descripteur associé à une séquence n'existe pas, il est automatiquement rajouté à la partie description.

Le fichier de configuration peut contenir des descripteurs prédéfinis de séquence, qui seront automatiquement créés à la création de la base séquence.

Variable Value

A un instant donné pour un équipment donné, une seule séquence est active; soit l'équipement est en train de produire une pièce bonne, ou une pièce mauvaise, ou en train de ne pas produire pour une certaine raison.

La difficulté réside dans le fait que on ne saura l'état réel qu'à la fin de fabrication de la pièce courante; ou que l'équipement pourra déclarer plusieurs pièces bonnes en même temps.

En l'absence d'information Sisal comptabilise le temps qui passe dans une séquence particulière dite la séquence par défaut; et lorsque on détecte une pièce bonne (ou mauvaise), le script va déclencher le comptage de la pièce sur la séquence relative à la pièce bonne et décompter sur la séquence par défaut.

La variable Value permet de connaître quelle est la séquence active au moment de l'appel, cela est utile pendant les phases de débogage.

Fonction OpenTime

La fonction OpenTime permet d'ouvrir une séquence de type Temps d'ouverture; chaque fois que par la suite on demandera de compter un produit d'un type particulier de séquence, il sera créé ou mise à jour une séquence associée à cette séquence d'ouverture. Cela est une nécessité si l'on veut que les algorithmes de calcul du TRS fonctionnent. De plus cette période d'ouverture est commune à tous les équipements de la ligne.

En effet conformément à la norme, le TRS est le rapport entre le temps utile et le temps requis, donc lors du calcul, on ne prend en compte que la partie des séquences qui est synchrone avec une période d'ouverture

BaseSequence.OpenTime( Date, Duree): IdSeq;

La date est la date de début de la séquence, ce sera aussi la date de début de toutes les séquences créées au cours de cette période d'ouverture.

La fonction rend un identificateur de séquence active, IdSeq, qui sera utilisé par les fonctions de mise à jour, en particulier par la fonction de fermeture CloseTime().

Par exemple:

Var seq;

Begin

Seq = MesSequences.OpenTime( Now(), 28800);

End

Fonction CloseTime

La fonction CloseTime permet de clore une période d'ouverture

BaseSequence.CloseTime( IdSeq {, Date});

Lors de la fermeture de la période d'ouverture, toutes les séquences dépendantes, c'est à dire les séquences élémentaires qui auront été créées pendant la période d'ouverture seront aussi fermés.

Si la date est précisée, la durée de la séquence d'ouverture et de toutes les séquences associées encore ouvertes seront mises à jour en conséquence.

Fonction GetOpenTime

La fonction GetOpenTime permet de retrouver l'identificateur de séquence active associée à la période d'ouverture courante.

BaseSequence.GetOpenTime() : IdSeq

Fonction OpenSeq

La fonction OpenSeq permet de créer une nouvelle séquence qui sera associé à une période d'ouverture.

BaseSequence.OpenSeq( Description{, Quantité {, equipment}}) : IdSeq

Description est le chemin de descripteur associé ou un identifiant de descripteur1 défini dans le fichier de configuration, optionnellement Quantité la quantité prévue et optionnelement equipment le numéro de poste auquel sera associé cette séquence2. Si ce descripteur n'existe pas, Sisal créera automatiquement un descripteur dans la partie description de la base de données.

La fonction retourne un identificateur de séquence active, ou -1 en cas d'échec.

Par exemple

Var idTO; seq1; seq2;

Begin

idTO = MesSequences.OpenTime( Now(), 28800);

Seq1 = MesSequences.OpenSeq( "Model.XB18", 144);

Seq2 = MesSequences.OpenSeq( MesSequences.Pause);

MesSequences.Pulse( Seq1);

End

Les séquences associées peuvent être fermées explicitement par un appel à la fonction Close, ou implicitement par un appel à la fonction CloseTime().

Fonction Create

La fonction Create permet de créer une nouvelle séquence active, qui permettra de comptabiliser les pièces produites. Cette séquence ne sera pas associée à une période d'ouverture, mais ces données ne seront intégrées au calcul du TRS que s'il sont synchrones avec une période d'ouverture

BaseSequence.Create( Date, Duree, Description {, Quantité {, equipment}}) : IdSeq

La Date est la date de début de la séquence, Durée sa durée prévue, Description le chemin de descripteur associé, et optionnellement Quantité la quantité prévue et le numéro d'équipement. Si ce descripteur n'existe pas, Sisal créera automatiquement un descripteur dans la partie description de la base de données.

La fonction rend un identificateur de séquence active, IdSeq, qui sera utilisé par les fonctions de mise à jour, par exemple chaque fois que l'on voudra signaler une nouvelle pièce produite, on fera MesSequences.Pulse( IdSequence).

Par exemple, si on doit produire deux références différentes dans les huit prochaines heures:

Var seq1; seq2;

Begin

Seq1 = MesSequences.Create( Now(), 28800, "Model.XB12", 288);

Seq2 = MesSequences.Create( Now(), 28800, "Model.XB18", 144);

End

Fonction Close

La fonction Close permet de fermer une séquence active, il est important de fermer les séquences actives si on veut être certain de leurs mises à jour et ne pas perdre de la mémoire inutilement.

BaseSequence.Close( IdSeq);

La fermeture d'une période d'ouverture avec la fonction Close, ne modifie pas la durée de la séquence, ni les durées des séquences dépendantes; elle provoque néanmoins la fermeture de toutes les séquences associées.

Fonction Pulse

La fonction Pulse permet d'indiquer à une base séquence qu'un produit ou équivalent produit vient d'être détecté.

BaseSequence.Pulse( IdSeq {, nombre}): status

BaseSequence.Pulse( Descripteur {, equipment}): status

BaseSequence.Pulse( IdDescripteur{,equipment}): status

La fonction attend en paramètre un identificateur de séquence active, ou un chemin de descripteur ou l'identifiant d'un descripteur.

Optionnelement on peut associer un nombre de pièces ou équivalent pièces avec un identificateur de séquence; pour les deux autres paramètres cela n'est pas possible car il faut pouvoir définir si nécessaire l'équipement auquel sera associé cette nouvelle séquence.

En effet dans les deux derniers cas la fonction recherche d'abord la séquence active associée à la période d'ouverture identifiée par le chemin de descripteur ou l'identifiant de descripteur et optionnelement l'équipement; s'il n'existe pas de séquence active correspondante, Sisal en crée une.

La fonction va incrémenter le compteur de pièces réalisées dans la séquence du nombre transmis (par défaut 1), va augmenter le temps d'activation de la séquence du temps de cycle, puis va déterminer le compteur élémentaire qu'il faut incrémenter de la même quantité d'après la date et l'heure instantanée ( Si ce compteur élémentaire n'existe pas ( Now() < DateDuCreate ou Now() > DateDuDernierCompteur), la fonction n'incrémentera aucun compteur élémentaire); enfin la fonction décrémente la séquence par défaut de ces mêmes durées.

Par exemple:

Seq1 = MesSequences.Create( Now(), 28800, "Model.XB12", 288);

MesSequences.Pulse( "Arrêt induit.Défaut d'approvisionnement");

MesSequences.Pulse( MesSequences.DefautDAppro, Cellule2);

MesSequences.Pulse( Seq1, 5);

Fonction SetDefault

La fonction SetDefault permet d'indiquer à Sisal quelle est la séquence qu'il faut comptabiliser par défaut, et ce à chaque seconde.

BaseSequence.SetDefault ( Descripteur {, equipment}): status

BaseSequence.SetDefault ( IdDescripteur {, equipment}): status

BaseSequence.SetDefault ( IdSequence ): status

Optionnelement la fonction attend le numéro d'équipement auquel on définira la séquence par défaut.

La fonction SetDefault permet aussi d'arrêter ce comptage implicite.

BaseSequence.SetDefault( null {, equipment}): status

La fonction SetDefault est semblable à la fonction Pulse, hormis que l'incrémentation va être faite automatiquement par Sisal toutes les secondes, on va mettre à jour Uptime et en déduire Realized.

Par exemple

On P701.Mode do

if P701.Mode == EnProduction then MesSequences.SetDefault( null)

Else MesSequences.SetDefault( ArretProvisoire);

Fonction GetProperties

La fonction GetProperties permet d'obtenir les paramètres de fonctionnement d'une séquence active. La fonction attend en paramètre l'identificateur de séquence active et un numéro de propriété défini dans le tableau ci-après.

BaseSéquence.GetProperties( IdCpt, Prop): valeur

Numéro

Propriété

Description

1

Date

Date de création de la séquence

2

Durée

Durée de la séquence

3

Uptime

Durée d'activation de la séquence

4

Descripteur

Numéro de descripteur associé

5

Equipment

Numéro d'équipement associé, -1 si pas d'équipement

6

Prévu

Nombre de produits à réaliser.

7

Réalisé

Nombre de produit réalisé.

8

Commentaire

Commentaire

100 … 100+X

Compteurs

Compteurs

Par exemple:

Réalisé = Séquences.GetProperties( Seq1, 6);

Fonction SetProperties

La fonction SetProperties permet de modifier les propriétés d'une séquence active. Ces modifications sont prises en compte uniquement dans le compteur actif et ne sont enregistrés en base-séquence que quand Sisal assure la mise à niveau de cette dernière.

La fonction attend en paramètre un identificateur de séquence active, un numéro de propriété (cf.GetProperties) et une valeur.

BaseSéquence.SetProperties( IdCpt, Prop, Valeur): status

La fonction rend 1 en cas de succès, 0 en cas d'échec. 

Par exemple, pour modifier le commentaire associé à une séquence active.

Séquences.SetPropreties( Seq1, 8, "Ca alors!"); 



Fonction GetCount

La fonction GetCount rend le nombre de compteur enregistré dans la base Séquence.

BaseSéquence.GetCount();

Par exemple:

Nombre = Séquences.GetCount();

For cpt = 0 to Nombre-1 do …

Fonction GetDescCount

La fonction GetDescCount rend le nombre de descripteur de séquence enregistré dans la base Séquence.

BaseSéquence.GetDescCount();

Par exemple:

Nombre = Séquences.GetDescCount();

For cpt = 0 to Nombre-1 do …

Fonction New

La fonction New permet d'initialiser tous les champs de l'enregistrement courant par des valeurs nulles, elle permet de plus de verrouiller la base-séquence avant de commencer la mise à jour de tous les champs lorsque l’on crée une nouvelle séquence.

BaseSequence.New() : Int

Séquences.New() ;

La fonction rend 1 en cas de succès et 0 sinon.

Fonction Add

La fonction Add permet de rajouter un nouvelle séquence à la base de Séquence. Ce nouvel enregistrement est défini par le contenu actuel des champs.

BaseSéquence.Add() : Int

La fonction retourne le numéro de séquence en cas de succès, ‑1 en cas d’échec.

Par exemple :

MesSéquences.Descriptor=
MesSequences.FindDesc("Aléas.Appro.Goujon");

MesSequences.Date = Now();

MesSequences.Duration = 45*60; // 45 mn

MesSequences.Comment = "Encore une fois au point d'insertion.";

MesSéquences.Add() ;

Si le descripteur n'existe pas, le champ Descriptor ne sera pas valorisé.

Fonction Read

La fonction Read permet de lire une séquence et de la mettre dans les champs d’édition.

BaseSequence.Read( Param) : numéro

La fonction attend en paramètre un numéro de séquence compris entre 0 et GetCount()-1.

La fonction retourne 1 en cas de succès, 0 en cas d’échec.

Par exemple :

MesSéquences.Read( 123456) ;

La base‑séquence enregistre le numéro de l’enregistrement chargé, numéro qui sera utilisé pour enregistrer en fichier l’enregistrement après modification.

Par exemple :

MesSéquences.Read( 123456) ;

MesSéquences.Colour = RGB( 255, 0, 0);

MesSéquences.Write() ;

Fonction Write

La fonction Write permet d’enregistrer en fichier la séquence courante.

BaseSéquence.Write() : status

La fonction retourne 1 en cas de succès, 0 en cas d’échec.

Fonction Delete

La fonction Delete permet de supprimer une séquence de la base séquence.

BaseSequence.Delete( Param) : status

La fonction attend en paramètre un numéro de séquence compris entre 0 et GetCount()-1.

La fonction retourne 1 en cas de succès, 0 en cas d'échec.

Une séquence effacée se voit affectée une date invalide, et est retirée de l'index des dates, elle n'apparaîtra plus dans les requêtes. Cependant l'enregistrement ne sera supprimé qu'au prochain compactage de la base séquence.

Fonctions Query et Next

Les fonctions Query et Next permettent de réaliser des requêtes sur la base séquence. La requête commence par l’appel de la Query, puis par le positionnement des champs dont on veut l’exacte correspondance lors de la requête (ce sont les critères de sélection), puis d’une succession d’appel à la fonction Next() pour chaque produit correspondant aux critères.

BaseSéquence.Query()

BaseSéquence.Next() : status

Les fonctions Query et Next n’attendent aucun paramètre. La fonction Next retourne un nombre non nul en cas de succès, 0 en cas d’échec c’est à dire quand la requête est terminée.

Par exemple :

PerteDAppro = 0 ;

MesSéquences.Query() ;

MesSéquences.Begin = "  1999/2/1 0 :0 :0 "  ;

MesSéquences.End = "  1999/2/28 23 :59 :59 "  ;

MesSéquences.Name = " Aléas.Appro. "  ;

While MesSéquences.Next() Do

PerteDAppro = PerteDAppro + MesSéquences.Realized;

Fonctions First et Next

La fonction First permet d'obtenir la première séquence dont la date de création est supérieure ou égal à la date passée en paramètre, la fonction Next permet de passer à la séquence immédiatement postérieur au numéro de séquence passé en paramètre.

BaseSéquence.First( Debut ) : Numero

BaseSéquence.Next( Numero): Numero

First attend comme paramètre la date à partir de laquelle il faut commencer la sélection, et rend un numéro de séquence (-1 en cas d'insuccés), Next attend un numéro de séquence et rend un numéro de séquence ou –1 s'il n'y a plus de séquence.

Par exemple, pour consulter l'ensemble des séquences du jour on peut faire

Seq = MesSequences.First( DateConvert( 2002, 02, 20));

While seq >= 0 do begin

MesSequences.Read( seq);

Total = total + MesSequences.Realized;

Seq = MesSequences.Next( Seq);

end

Fonction AddDesc

La fonction AddDesc permet de rajouter un descripteur de séquence. Les paramètres permettent de définir le chemin de descripteur de séquence, le type normalisé, le temps de cycle théorique et la couleur utilisé pour l'affichage.

BaseSéquence.AddDesc( Nom, CycleTime, Colour): Int

BaseSéquence.AddDesc( Nom, Type, CycleTime, Colour {, Habilitation} ): Int

Le type normalisé permet de définir que tel descripteur est relatif à tel type de temps défini dans la norme.

Les seules valeurs possibles sont:

Valeur

Nom

Description

1

Temps Utile

Temps de fabrication utilisé à la fabrication de pièces bonnes

2

Temps de rebut

Temps de fabrication utilisé à la fabrication de pièces rebutées

4

Temps fonctionnel non net

Typiquement de la sous-cadence calculé par défaut

8

Temps d'arrêt induit

Par exemple: Défaut d'approvisionnement, Saturation aval, manque personnel, manque de ressources extérieures, Défaut d'énergie

16

Temps de micro-arrêts

Difficilement évaluable, généralement Sisal les calcule par défaut

32

Temps d'arrêts fonctionnels

Changement d'outil programmé, Réglage fréquentiel, Temps de contrôle, Changement de fabrication, Entretien fréquentiel

64

Temps d'arrêt d'exploitation

Provoqué par l'utilisateur: Arrêt de service du à l'incapacité du personnel de remplir sa mission, Problèmes de qualité

128

Temps de panne

Arrêts dus à un dysfonctionnement

256

Temps non requis

Sous-charge, entretien préventif, essais , pause

Ces valeurs sont définies dans le fichier d'inclusion Sequence.sch.

Un temps de cycle théorique de 0 précise que pour ce type de séquence Sisal utilisera dans ses calculs le temps de cycle théorique associée à la base séquence.

Couleur permet de préciser la couleur qui sera utilisée pour représenter une séquence de ce type.

Habilitation permet de préciser le niveau d'habilitation requis pour pouvoir éditer une séquence de ce type, cela permet par exemple d'autoriser les responsable de la maintenance à modifier les séquences liées à des actions de maintenance et à les empêcher de modifier des séquences liées à des productions utiles.

La fonction retourne le numéro de descripteur en cas de succès, -1 en cas d'échec.

Par exemple:

MesSéquences.AddDesc( "Aléas.Divers.Moteurs", 128, 5.5, RGB( 255, 0, 0));

Fonction FindDesc

La fonction FindDesc permet de retrouver un descripteur de séquence.

BaseSequence.FindDesc( Nom) : numéro

La fonction attend en paramètre un chemin de descripteur.

La fonction retourne le numéro de descripteur en cas de succès, 0 en cas d’échec.

Par exemple :

MesSéquences.FindDesc( "Aléas.Driver.Moteur") ;

La base‑séquence enregistre le numéro de l’enregistrement chargé, numéro qui sera utilisé pour enregistrer en fichier l’enregistrement après modification.

Par exemple :

MesSéquences.ReadDesc( 125) ;

MesSéquences.Colour = RGB( 255, 0, 0);

MesSéquences.WriteDesc() ;

Fonction ReadDesc

La fonction ReadDesc permet de lire un descripteur de séquence et de le mettre dans les champs d’édition de descripteur.

BaseSequence.ReadDesc( Param) : numéro

La fonction attend en paramètre un numéro de descripteur compris entre 0 et GetDescCount()-1.

La fonction retourne 1 en cas de succès, 0 en cas d’échec.

Par exemple :

MesSéquences.ReadDesc( 125) ;

La base‑séquence enregistre le numéro de l’enregistrement chargé, numéro qui sera utilisé pour enregistrer en fichier l’enregistrement après modification.

Par exemple :

MesSéquences.ReadDesc( 125) ;

MesSéquences.Colour = RGB( 255, 0, 0);

MesSéquences.WriteDesc() ;

Fonction WriteDesc

La fonction WriteDesc permet d’enregistrer en fichier le descripteur de séquence courante.

BaseSéquence.WriteDesc() : status

La fonction retourne 1 en cas de succès, 0 en cas d’échec.

Fonction Unlock

La fonction Unlock permet de déverrouiller la base-séquence (cf. Auto-verrouillage).



Liaison série

L’objet liaison série permet de déclarer une liaison série dans un script. Cette liaison série est ouverte du début de l’exécution du script jusqu’à la fin d’exécution du script.

NomDeLiaisonSerie Serial , Port, Débit, NbBit, Parité, BitsDeStop ;

Par exemple :

srCouple Serial, "  COM1 : ", 9600, 8, 2, 1 ;

déclare une liaison série sur COM1, à 9600 bauds, 8bits de données, parité pair et un bit stop.

Evénements Receive

Une liaison série définit un seul événement " Receive " qui indique la réception de donnée sur la liaison série.

Attention l’événement est activé à réception du premier caractère d’une trame reçue et donc la trame de données ayant provoqué l’émission de l’événement, peut ne pas avoir été complètement reçue au moment de l’activation de la clause.

Fonction Get

La fonction Get permet de récupérer la trame de caractère reçue. Afin de faciliter la mise en oeuvre, la fonction Get attend la réception de la trame entière avant de retourner le nombre de caractère reçu et d’avoir recopié dans le paramètre la trame reçue.

MaLiaisonSérie.Get( MaTrame) : NbValeurs

Par exemple :

On srCouple.Receive Do begin

srCouple.Get( Trame) ;

Couple = SubSTr( Trame, 10, 5) ;

end

Sur réception d’une trame de l’équipement de mesure de couple, on récupère la trame émise dans la variable Trame, et on obtient le couple en en extrayant cinq caractères à partir du dixième caractère.

Fonction Put

La fonction Put permet d’émettre une chaîne de caractère sur la liaison série. Elle rend le nombre de caractères effectivement émis, indéfini si pour une raison ou pour une autre la liaison série n’est pas établie.

MaLiaisonSérie.Put( MaTrame) : NbValeurs

Par exemple :

srCouple.Put( " Reset " +#13 +#10) ;

Envoi de la trame Reset suivi de CR/LF.



Liaison ethernet

L’objet liaison ethernet permet d'établir une liaison ethernet TCP/IP entre un client ethernet et un serveur ethernet. Cette liaison ethernet est ouverte du début de l’exécution du script jusqu’à la fin d’exécution du script.

NomDeLiaisonEthernet TcpServer, Port, MaxConnexion ;

NomDeLiaisonEthernet TcpClient, Serveur, Port, DélaiRétablissement;

Par définition un serveur ethernet est un script Sisal ou tout autre programme qui attend que des clients ethernet ( script Sisal ou autre programme) se connectent pour pouvoir échanger des informations entre eux deux. Ce sont des notions indépendantes des notions de Serveur Sisal et Client Sisal; un client Sisal peut très bien être un serveur ethernet et un serveur Sisal un client ethernet.

Par exemple :

ethCouple TcpServer, 8112, 1; // Sur le port 8112 on attend les clients

ethGPAO TcpClient, “Atelier.GPAO”, 8254, 60;

déclare un serveur ethernet qui attend des connexions sur le port 8112 et il n'accepte qu'une seule connexion à la fois car il n'y a qu'une seule visseuse.

Et d'autre part ce script Sisal va essayer de se connecter au serveur de GPAO d'atelier qui lui attend des connexions sur le port 8254; si cette connexion est perdue, ce script Sisal retentera la connexion toutes les 60 secondes.

Il faut remarquer que Sisal à ce niveau ne définit que le moyen pour établier une connexion, aprés ce qui est échangé sur cette connexion est purement applicatif. C'est au concepteur du serveur et du client de définir le contenu des trames échangées, de leurs codages (ASCII ou binaire), et de leurs conventions. Bref de définir le protocole applicatif.

La principal différence entre un client et un serveur est que la connexion d'un client est unique, alors qu'une liaison ethernet d'un serveur peut gérer plusieurs connexions (de plusieurs clients) en même temps; dans ce dernier cas, chaque connexion est identifiée par un identifiant obtenu lors de l'acceptation de la connexion.

Fonction Status

La fonction status permet de connaître l'état de la liaison Tcp.

MaLiaisonTcpClient.Status() : status

MaLiaisonTcpServeur.Status( {Connexion}) : status

La fonction Status pour une liaison TcpServeur attend 0 ou 1 paramètre: 0 paramètre lorsque l'on veut tester la liaison d'attente de connexion, et l'identifiant de connexion lorsque l'on veut tester une connexion particulière.

Le status retourné indique l'état de la connexion

Valeur

Description

Null

Identifiant de connexion inconnu

0

Non connecté

1

Connecté

2

Demande de connexion en cours

3

Demande de déconnexion en cours



Evénements Connect

Un serveur TCP émet un événement Connect chaque fois qu'un client essaye de se connecter au serveur. Au serveur d'accepter ou de refuser cette connexion avec la méthode Accept.

Un client TCP émet un événement Connect chaque fois qu'il réussit à (ré)établir une connexion au serveur. Contrairement au serveur, pour un client la connexion est ouverte dés qu'elle est signalée connectée, il n'est pas nécessaire de l'accepter.

Evénements Disconnect

Que ce soit pour un client ou un serveur chaque fois qu'une liaison ethernet est fermée, l'événement Disconnect est levé pour informer de la fermeture de la liaions ethernet.

Le serveur en profitera pour fermer la liaison avec la fonction Close. Le client n'a pas besoin de fermer la liaison ni de retenter la reconnexion, cela se fait automatiquement.

Evénements Receive

Chaque fois qu'une trame de donnée est reçue que ce soit par le client ou le serveur, l'événement Receive est levé pour informer le script.

Pour un client il suffira de faire un Get pour réceptionner les données.

On ethGPAO.Receive do ethGPAO.Get( buffer);

Pour un serveur il faudra aussi identifier la connexion qui a envoyé des données, la fonction attend en plus en paramètre l'identifiant de connexion qui a transmis les données et indique par un booléen si des données sont disponibles.

On ethCouple.Receive do while ethCouple.Get( IdCon, buffer);

Ensemble Received

Un serveur ethernet définit l'ensemble des connexions ayant reçues des données depuis la dernière scrutation. Cela permet d'éxécuter une boucle sur ces seuls connexions actives.

MaLiaisonTcpServeur.Received : iterateur

Par exemple

On ethCouple.Receive do

for idcon in ethCouple.Received do

ethCouple.Get( IdCon, buffer);

Ensemble Connected

Un serveur ethernet définit l'ensemble des tentatives de connexions en cours. Cela permet d'éxécuter une boucle sur ces seuls demandes de connexions.

MaLiaisonTcpServeur.Connected : iterateur

Les liaisons resront dans l'état « Connexion en cours » jusqu'à ce que le script les accepte ou les refuse par un appel de la fonction Accept.

Par exemple

On ethCouple.Connect do

for iter in ethCouple.Connected do ethCouple.Accept( Iter, 1);

Ensemble Disconnected

Un serveur ethernet définit l'ensemble des déconnexions en cours. Cela permet d'éxécuter une boucle sur ces seuls demandes de déconnexions.

MaLiaisonTcpServeur.Disconnected: iterateur

Les laisons resteront dans l'état « Déconnexion en cours » jusqu'à ce que le script les ferme par un appel à la fonction Close.

Par exemple

On ethCouple.Disconnect do

for iter in ethCouple.Disconnected do

ethCouple.Close( iter);

Fonction Get

La fonction Get permet de récupérer la trame de caractère reçue.

MaLiaisonTcpClient.Get( MaTrame) : Nombre

MaLiaisonTcpServeur.Get( Connexion, MaTrame): Nombre

Par exemple :

On ethCouple.Receive Do begin

ethCouple.Get( IdCon, Trame) ;

Couple = SubSTr( Trame, 10, 5) ;

end

Sur réception d’une trame de l’équipement de mesure de couple, on récupère la trame émise dans la variable Trame, et on obtient le couple en en extrayant cinq caractères à partir du dixième caractère.

Pour une liaison ethernet serveur, est attendu en premier paramètre l'identifiant de connexion obtenu lors de l'acceptation de la connexion.

Var Connexions[10];

...

For i = 0 to 9 do

if ethCouple.Get( Connexions[i], trame) then

Couple[i] = SubSTr( Trame, 10, 5);

Dans cet exemple les identifiants de connexions sont enregistrés dans un tableau mis à jour lors des événements Connect et Disconnect.

Cet identifiant de connexion peut aussi être obtenu par itération sur l'ensemble Received.

Fonction Put

La fonction Put permet d’émettre une chaîne de caractère sur une liaison ethernet. Elle rend le nombre de caractères effectivement émis, indéfini si pour une raison ou pour une autre la liaison ethernet n’est pas établie.

MaLiaisonTcpClient.Put( MaTrame) : Nombre

MaLiaisonTcpServer.Put( Connexion, MaTrame): Nombre

Une liaison ethernet serveur attendra en plus un identifiant de connexion.

Par exemple :

ethCouple.Put( Connexions[0]," Reset " +#13 +#10) ;

Envoi de la trame Reset suivi de CR/LF sur la première connexion ouverte.

Fonction Size

La fonction Size permet de connaître la longueur de la prochaine trame disponible en lecture

Size() : Nombre

La fonction retourne le nombre de caractère présent dans la prochaine trame, 0 si aucune trame présente et -1 si la liaison n'est pas ouverte.

Fonction Open et Close

Pour une liaison ethernet client, les fonctions Open et Close permettent d'ouvrir et de fermer une liaison à destination d'un serveur par le script; par défaut les liaisons ethernet sont ouvertes dés le lancement du script et fermées à la terminaison du script.

Pour une liaison ethernet serveur la fonction Close permet de fermer une connexion volontairement. La fonction Open n'existe pas puisque un serveur ne connait pas ses clients, c'est la fonction Accept qui a pour effet d'ouvrir la communication.

MaLiaisonTcpClient.Open( serveur, port) : status

MaLiaisonTcpClient.Close( ): status

MaLiaisonTcpServeur.Close( Connexion) : status

La fonction Open attend en paramètre l'identification du serveur, le numéro de port, elle retourne un status indiquant le succés de la connexion (1) ou l'échec (0). La fonction Close d'un client n'attend pas de paramètre , elle retourne un status ( 1/0).

La fonction Close d'un serveur attend l'identifiant de connexion transmis lors de l'acceptation de connexion (cf.Accept), elle retourne le même status.

Function Accept

La fonction Accept permet à un serveur Tcp d'accepter ou de refuser une connexion.

MaLiaisonTcpServeur.Accept( itercon, booléen): IdConnexion

La fonction accepte un itérateur de connexion (cf. Connected) et un booléen indiquant si on accepte ou non la connexion et elle rend un identificateur de connexion qui sera utilisé ultérieurement pour envoyer ou recevoir des données.

Supposons que notre serveur ne gère qu'une dizaine de connexions ouvertes simultanément

connexions Array[10];

...

function ConnexionDeLibre()

// Rend un numéro de connexion disponible

begin

for i = 0 to 9 do

if connexions[i] == null then return i;

return -1;

end

...

On ethCouple.Connect do begin

// Pour chaque demande de connexion

for idcon in ethCouple.Connected do begin

cn = ConnexionDeLibre();

if cn >= 0 then connexions[ cn] = ethCouple.Accept( idcon, 1)

else ethCouple.Accept( idcon, 0);

end

end

Objet graphique

Les objets graphiques sont définis uniquement dans les synoptiques. Ils permettent de créer des écrans de paramètrage et de pilotage conforme au standard Windows.

Les objets graphiques comprennent les objets Windows et les composants Sisal.

Tous les objets graphiques disposent des variables et fonctions suivantes : X, Y, W, H, Visible, Enable, et SetFocus décrites ci‑après. Ils disposent en plus de variables, fonctions et événements définis dans leurs paragraphes respectifs.

La déclaration d’un objet graphique Windows, sauf cas particulier, comprend les paramètres suivants :

NomDObjet TypeDObjet, Texte, X, Y, W,  H, DrapeauxActivés, DrapeauxInhibés, Police, TailleDePolice ;

La déclaration d’un composant Sisal comprend les éléments suivants :

NomDeComposant TypeDObjet, Texte, X, Y, W,  H, DrapeauxActivés, DrapeauxInhibés;

Par exemple :

edTemperature Edit, "  37,2 " , 210, 125, 120, 25, ES_RIGHT | WS_TABSTOP,,, ;

déclare un champ d’édition contenant au démarrage du synoptique le texte 37,2, de position et taille ainsi précisées, et cadré à gauche. Les positions et tailles sont toujours exprimées en pixels.

Les objets graphiques définis sont

Mots clés

Objets graphiques

Button

Bouton

CheckBox

Boite à cocher

ComboBox

Boite combinée

Edit

Champ d’édition

ListBox

Boite à liste

ScrollBar

Barre de déroulement

Static

Champ statique

TabControl

Boite à onglet

TabSheet

Onglet

Image

Image

ImageList

Image multiple



Les composants Sisal sont

Mots clés

Composants Sisal

ProdLog

Suivi de production

ProdPareto

Pareto des défauts produit

ProdHistogram

Histogramme de mesure

PrcLog

Suivi du procédé

PrcPareto

Pareto des modes de marche

SpcView

Carte de controle

SpcCard

Carte de contrôle active

AlarmList

Journal d’alarme

AlarmPareto

Pareto des alarmes

Table

Tableau



Le champ DrapeauxActivés énumère une suite de constantes prédéfinies pouvant être réunies par un ou inclusif, inversement le champ DrapeauxInhibés énumère une suite de constantes prédéfinies (les mêmes que précédemment) correspondant aux caractéristiques Windows que l’on ne veut pas appliquer à l’objet graphique.

Ces constantes sont énumérées ci‑après, mais nous invitons les utilisateurs à regarder la documentation de Windows afin de bien maîtriser leurs significations.

Constantes Windows

Significations

WS_DISABLED


WS_GROUP


WS_TABSTOP

Sur tabulation le curseur s’arrêtera sur cet objet

WS_VISIBLE

L’objet est rendu visible ou non à sa création



Variables X, Y, W et H

Les variables X, Y, W et H permettent de connaître ou de modifier la position et la taille de l’objet graphique.

Variable Visible

La variable " Visible " permet de rendre visible ou de masquer un objet graphique1. Inversement en lecture elle permet de connaître l’état de visibilité de la variable.

Variable Enable

La variable " Enable " permet d’activer ou inhiber un objet graphique, c’est à dire accessible par le curseur et modifiable. Inversement en lecture elle permet de connaître l’état d’activation de l’objet graphique associé.

Fonction SetFocus

La fonction SetFocus permet de placer le curseur sur un objet graphique. Cela est particulièrement utile lorsque l’utilisateur a fait une saisie erronée dans un champ, on peut le ramener de force dans le champ de saisie.

If edTemperature.Text > 100 then begin

MessageBox( "  La temperature doit être inférieure à 100°C " ) ;

edTemperature.SetFocus() ;

end

Fonction Invalidate

La fonction Invalidate permet d'avertir Windows qu'un des objets graphiques est modifié et doit donc être réaffiché.

Invalidate()

Cette mise à jour est faite automatiquement par Windows pour des objets simples, par contre pour des objets Sisal complexes comme les tableaux cela est nécessaire.

tb Table, "", 100, 100, 200, 150,,,;

...

On .. do tb.Invalidate()





Objet Statique

Un objet statique est un objet qui affiche un texte simple, il ne peut pas être modifié par l’utilisateur.

En plus des constantes windows communes, il dispose de :

Constantes Windows

Significations

SS_BLACKFRAME

Rectangle noir

SS_BLACKRECT

Cadre noir

SS_CENTER

Le texte sera centré dans l’objet

SS_GRAYFRAME

Rectangle gris

SS_GRAYRECT

Cadre gris

SS_LEFT

Le texte sera cadré à gauche

SS_LEFTNOWORDWRAP

Le texte sera cadré à gauche mais sans possibilité de repli sur la ligne suivante

SS_NOPREFIX

Permet de ne pas interpréter le caractère " & " comme un préfixe d’accélérateur.

SS_NOTIFY

Ne pas utiliser.

SS_RIGHT

Le texte sera cadré à droite

SS_SIMPLE

Le texte sera cadré à gauche sur une seule ligne

SS_WHITEFRAME

Rectangle blanc

SS_WHITERECT

Cadre blanc

SS_ETCHEDFRAME

Dessine un cadre autour de l’objet suivant le format EDGE_ETCHED

SS_SUNKEN

Dessine un cadre enfoncé autour de l’objet

SS_NO_AUTORESIZE


Empêche le redimensionnement automatique du champ static, particulièrement utile avec SS_CENTER et SS_RIGHT



Variable Text

La variable " Text " permet de lire ou de modifier le texte affiché par le contrôle statique.

Exemple :

stTemperature.Text = "  Température en °C "  ;

Objet Edit

Un objet Edit permet d’intégrer dans l’écran un champ d’édition.

En plus des constantes windows communes, il dispose de :

Constantes Windows

Significations

ES_AUTOHSCROLL

Permet le glissement horizontal en cours d’édition

ES_AUTOVSCROLL

Permet le glissement vertical en cours d’édition

ES_CENTER

Le texte sera centré dans l’objet

ES_LEFT

Le texte sera cadré à gauche

ES_LOWERCASE

Le texte sera affiché en minuscule

ES_MULTILINE

Le texte sera affiché sur plusieurs lignes

ES_NOHIDESEL

Le texte sélectionné restera mis en valeur même si l’objet n’a pas le focus.

ES_NUMBER

L’utilisateur ne pourra saisir que des chiffres.

ES_OEMCONVERT

Permet de s’assurer que le texte saisi est conforme au standard OEM. Est particulièrement utile pour les noms de fichier.

ES_PASSWORD

Le texte saisi sera masqué par des étoiles.

ES_READONLY

Le texte ne pourra être modifié

ES_RIGHT

Le texte sera cadré à droite.

ES_UPPERCASE

Le texte sera affiché en majuscule

ES_WANTRETURN

Permet de saisir des Retours‑chariots au sein d’un champ d’édition multiligne.

ES_NUMERIC

Le texte saisi sera composé uniquement de chiffre1.



Variable Text

La variable " Text " permet de lire ou de modifier le texte affiché par le contrôle statique.

Exemple :

Température = edTemperature.Text ;

Variable lastKey

La variable LastKey permet de retrouver le dernier caractère saisi dans ce champ d’édition.

Evénement Key

L ‘événement Key permet d’être informé de la saisie de caractère dans le champ d’édition

Exemple :

On edTemperature.Key Do

if edtemperature.Text = "  0 "  then Beep()

Evénement Change

L'événement Change permet d'être informé de la modification du contenu de ce champ d'édition.

Exemple

On edSerie.Change do ChangementDeSerie();



Evénement GetFocus et KillFocus

Les événements GetFocus et KillFOcus sont appelés respectivement quand le curseur entre dans ce champ d'édition ou sort de ce champ d'édition.

Exemple

On edOperateur.KillFocus do Table.invalidate();



Objet Bouton

L’objet Bouton permet d’inclure un bouton dans l’écran.

En plus des constantes windows communes, il dispose de :

Constantes Windows

Significations

BS_3STATE

Permet d’avoir des boutons à trois états.

BS_AUTOCHECKBOX

Permet d’avoir un bouton comme une boite à cocher

BS_AUTORADIOBUTTON

Permet d’avoir un bouton comme un bouton radio

BS_CHECKBOX

Crée une petite boite à cocher vide avec du texte

BS_DEFPUSHBUTTON

Crée un bouton qui a le style " Bouton par défaut "

BS_RADIOBUTTON

Crée un petit cercle avec du texte à droite

BS_BITMAP

Précise que le bouton affiche une bitmap

BS_BOTTOM

Place le texte en bas du bouton

BS_CENTER

Centre le texte horizontalement

BS_ICON

Précise que le bouton affiche une icône.

BS_LEFT

Le texte sera justifié à gauche

BS_MULTILINE

Le texte sera affiché sur plusieurs lignes si nécessaire.

BS_NOTIFY

Ne pas utiliser

BS_PUSHLIKE

Permet de définir un bouton qui se comporte comme un bouton

BS_RIGHT

Le texte sera justifié à droite

BS_RIGHTBUTTON

Positionne le cercle du radiobutton ou le carré de la boite à cocher à droite.

BS_TEXT

Précise que le bouton affiche un texte

BS_TOP

Place le texte en haut du bouton

BS_VCENTER

Centre le texte verticalement



Evénement Click

L’événement Click permet d’être informé de l’appui d’un bouton par l’utilisateur.

Exemple :

On btMarche.Click Do P98.Marche = 1 ;

Objet Boite à liste

L’objet Boite à liste permet d’inclure un boite à liste ou ListBox dans l’écran.

En plus des constantes windows communes, il dispose de :

Constantes Windows

Significations

LBS_DISABLENOSCROLL

Affiche une barre de glissement vertical désactivée quand il n’y a pas assez d’élément dans la liste. Au lieu de masquer la barre.

LBS_EXTENDEDSEL

Permet de sélectionner plusieurs éléments en utilisant la touche Shift

LBS_HASSTRINGS

La liste ne contient que des chaînes de caractères

LBS_MULTICOLUMN

Crée une boite à liste avec plusieurs colonnes

LBS_MULTIPLESEL

Permet à l’utilisateur de sélectionner un ou plusieurs éléments en cliquant dessus.

LBS_NONINTEGRALHEIGHT

Précise que la taille de la liste est exactement celle demandée et non arrondi à un nombre entier de ligne.

LBS_NOREDRAW

Précise que l’apparence de la liste n’est pas immédiatement mise à jour.

LBS_NOTIFY

Ne pas utiliser.

LBS_SORT

Les lignes sont triées par ordre alphabétique

LBS_STANDARD

Les lignes sont triées et le synoptique est averti quand l’utilisateur clique sur une ligne

LBS_USETABSTOPS

Permet à la boite de reconnaître et d’afficher un texte tabulé



Evénement SelChange

L’événement SelChange permet d’être informé de ce que la sélection courante a changé.

Exemple :

On lbMode.SelChange do ..

Fonction AddString

La fonction AddString permet d’ajouter de nouveaux éléments à la liste. La fonction rend la position de l’élément dans la liste (0 est la première position) ou un nombre négatif en cas d’erreur.

Exemple :

lbMode.AddString( "  Automatique " ) ;

Fonction ClearList

La fonction permet de vider la liste.

LbMode.ClearList() ;

Fonction DirectoryList

La fonction DirectoryList permet de remplir la liste avec le contenu d’un répertoire. La fonction attend deux paramètres, le premier attend un nombre entier qui précise les attributs des fichiers attendus (1 Fichiers en lecture seule, 2 fichiers cachés, 4 fichiers système, 8 Volume label, 16 Directory, 32 Archive), et le deuxième est une chaîne de caractère qui précise les fichiers sélectionnés.

LbReference.DirectoryList( 0, " C :\\Sisal\\Références\\*.ref ") ;

Fonction FindExactString

La fonction FindExactString permet de retrouver une chaîne particulière dans la liste.

FindExactString( chaîne, départ) : Indice

Départ précise la ligne de départ de la recherche, Chaîne contient la chaîne recherchée. La fonction recherche la chaîne de départ à partir de la ligne de départ en bouclant complètement si nécessaire. Sélectionnez ‑1 comme ligne de départ pour commencer à partir du début.

La fonction rend l’indice de la première chaîne trouvée ou une valeur négative en cas d’échec.

Idx = lbMode.FindExactString( "  Automatique " ) ;

Fonction GetCount

La fonction GetCount rend le nombre de lignes de la liste.

NbMode = lbMode.GetCount() ;

Fonction GetSel

La fonction GetSel rend 1 si la ligne passée en paramètre est sélectionnée.

Automatique = lbMode.GetSel( 1) ;

Fonction GetSelCount

La fonction GetSelCount rend le nombre de lignes sélectionnées.

ModesSelectionnes = lbMode.GetSelCount() ;

Fonction GetSelIndex

Pour une boite à liste à sélection unique, la fonction GetSelIndex rend l’index de la ligne sélectionnée (commençant à 0) ou une valeur négative si aucun élément n’est sélectionné.

Mode = lbMode.GetSelIndex() ;

Fonction GetString

La fonction GetString permet de retrouver le contenu de la ligne à l’indice passé en paramètre. Si on n’a pu retrouver ce contenu, la fonction rend indéfini.

EdMode.Text = lbMode.GetString( lbMode.GetSelIndex()) ;

Fonction GetTopIndex

La fonction GetTopIndex rend l’indice de la première ligne affichée en haut de la boite à liste.

Debut = lbMode.GetTopIndex() ;

Fonction SetTopIndex

La fonction SetTopIndex permet de forcer la première ligne visible en haut de la boite à liste.

LbMode.SetTopIndex( 5) ;

Fonction SetCaretIndex

La fonction SetCaretIndex donne le focus à la ligne précisée dans le premier paramètre, le second paramètre à 1 autorise un glissement partiel.

lbMode.SetCaretIndex( 5, 1) ;

Fonction SetSelIndex

La fonction SetSelIndex permet de sélectionner la ligne à l’indice passé en paramètre.

LbMode.SetSelIndex( 5) ;

Objet Boite combinée

L’objet Boite combinée permet d’inclure un boite combinée ou ComboBox dans l’écran.

En plus des constantes windows communes, il dispose de :

Constantes Windows

Significations

CBS_AUTOHSCROLL

Permet la saisie de texte plus long que le champ d’édition en faisant glisser le texte horizontalement.

CBS_DISABLENOSCROLL

Affiche une barre de glissement désactivée dans le cas ou la liste n’est pas assez longue.

CBS_DROPDOWN

Similaire à CBS_SIMPLE, hormis le fait que la boite liste n’est pas affichée tant que l’utilisateur ne clique pas sur l’icône à coté du champ d’édition.

CBS_DROPDOWNLIST

Similaire à CBS_DROPDOWN, hormis le fait que le champ d’édition est remplacé par un statique qui affiche la sélection courante.

CBS_LOWERCASE

Convertit en minuscule toute chaîne saisie dans le champ d’édition.

CBS_NOINTEGRALHEIGHT

Précise que la taille de la liste est exactement celle demandée et non arrondie à un nombre entier de ligne.

CBS_OEMCONVERT

Permet de s’assurer que le texte saisi est conforme au standard OEM. Est particulièrement utile pour les noms de fichier.

CBS_SIMPLE

Affiche la boite à liste en permanence. La sélection courante de cette dernière est affichée dans le champ d’édition.

CBS_SORT

Les lignes sont triées par ordre alphabétique

CBS_UPPERCASE

Convertit en majuscule toute chaîne saisie dans le champ d’édition.



Les événements et fonctions sont semblables à ceux de la boite à liste.

L’événement SelChange

L’événement SelChange permet d’être informé de ce que la sélection courante a changé.

Exemple :

On cbMode.SelChange do ..

Fonction AddString

La fonction AddString permet d’ajouter de nouveaux éléments à la liste. La fonction rend la position de l’élément dans la liste (0 est la première position) ou un nombre négatif en cas d’erreur.

Exemple :

cbMode.AddString( "  Automatique " ) ;

Fonction ClearList

La fonction permet de vider la liste.

cbMode.ClearList() ;

Fonction DirectoryList

La fonction DirectoryList permet de remplir la liste avec le contenu d’un répertoire. La fonction attend deux paramètres, le premier est un nombre entier qui précise les attributs des fichiers attendus (1 Fichiers en lecture seule, 2 fichiers cachés, 4 fichiers système, 8 Volume label, 16 Directory, 32 Archive), et le deuxième est une chaîne de caractère qui précise les fichiers sélectionnés.

cbReference.DirectoryList( 0, "  C :\Sisal\Références\*.ref "  ) ;

Fonction Findtring

La fonction FindString permet de retrouver une chaîne particulière dans la liste.

Indice FindString( chaîne, départ) ;

Départ précise la ligne de départ de la recherche, Chaîne contient la chaîne recherchée. La fonction recherche la chaîne de départ à partir de la ligne de départ en bouclant complètement si nécessaire. Sélectionnez ‑1 comme ligne de départ pour commencer à partir du début.

La fonction rend l’indice de la première chaîne trouvée ou une valeur négative en cas d’échec.

Idx = cbMode.FindString( "  Automatique " ) ;

Fonction GetCount

La fonction GetCount rend le nombre de lignes de la liste.

NbMode = cbMode.GetCount() ;

Fonction GetSel

La fonction GetSel rend 1 si la ligne passée en paramètre est sélectionnée.

Automatique = cbMode.GetSel( 1) ;

Fonction GetSelCount

La fonction GetSelCount rend le nombre de lignes sélectionnées.

ModesSelectionnes = cbMode.GetSelCount() ;

Fonction GetSelIndex

Pour une boite à liste à sélection unique, la fonction GetSelIndex rend l’index de la ligne sélectionnée (commençant à 0) ou une valeur négative si aucun élément n’est sélectionné.

Mode = cbMode.GetSelIndex() ;

Fonction GetString

La fonction GetString permet de retrouver le contenu de la ligne à l’indice passé en paramètre. Si on n’a pu retrouver ce contenu, la fonction rend indéfini.

EdMode.Text = cbMode.GetString( cbMode.GetSelIndex()) ;

Fonction GetTopIndex

La fonction GetTopIndex rend l’indice de la première ligne affichée en haut de la boite à liste.

Debut = cbMode.GetTopIndex() ;

Fonction SetTopIndex

La fonction SetTopIndex permet de forcer la première ligne visible en haut de la boite à liste.

cbMode.SetTopIndex( 5) ;

Fonction SetCaretIndex

La fonction SetCaretIndex donne le focus à la ligne précisée dans le premier paramètre, le second paramètre à 1 autorise un glissement partiel.

cbMode.SetCaretIndex( 5, 1) ;

Fonction SetSelection

La fonction SetSelection permet de sélectionner la ligne à l’indice passé en paramètre.

cbMode.SetSelection( 5) 

Objet Boite à cocher

L’objet Boite à cocher permet d’inclure une boite à cocher dans l’écran. Il s’agit d’un bouton qui a le style BS_CHECKBOX. Les constantes spécifiques sont celles du Bouton.

L’événement Click

L’événement Click permet d’être informé de ce que la boite à cocher a été cliquée.

Fonction SetCheck

La fonction SetCheck permet de préciser l’état de la boite à cocher. Suivant la valeur du paramètre la boite sera cochée (1), pas cochée (0) ou grisée (‑1).

Exemple :

On bcParite.Click do

if bcParite.GetCheck() then bcParite.SetCheck( 0) ;

else bcParite.SetCheck( 1) ;

Fonction GetCheck

La fonction permet de connaître l’état de la boite à cocher. Suivant l’état de la boite à cocher la fonction retourne 1 si elle est cochée, 0 si elle n’est pas cochée et ‑1 si elle est grisée.

Objet Bouton-radio

L’objet bouton-radio permet d’inclure une liste de boutons à choix excliusif dans l’écran. Il s’agit d’un bouton qui a le style BS_RADIOBUTTON ou de type RadioButton.

Un groupe de radio-boutons est défini par le premier élément qui a le style RB_GROUP, c'est à dire que tous les raduio-boutons qui suivent ce premier radio-bouton ont des valeurs exclusives. Pour un définir un autre groupe de valeurs exlusives il suffit de déclarer un autre radio-bouton avec l'attribut RB_GROUP.

Les constantes spécifiques sont celles du Bouton.

L’événement Click

L’événement Click permet d’être informé de ce que la boite à cocher a été cliquée.

Fonction SetCheck

La fonction SetCheck permet de préciser l’état de la boite à cocher. Suivant la valeur du paramètre la boite sera cochée (1) ou décochée (0).

Les autres radio-boutons du même groupe seront décochés.

Exemple :

On rbSexeMasculin.Click do titre = “M.”;

On rbSexeFeminin.Click do titre = “Mme”;

Fonction GetCheck

La fonction permet de connaître l’état de la boite à cocher. Suivant l’état de la boite à cocher la fonction retourne 1 si elle est cochée, 0 si elle n’est pas cochée.

Objet boite à onglet

L’objet boite à onglet permet de définir une boite à onglet. Il s’agit d’une déclaration structurée qui intègre la déclaration d’autres objets en particulier d’objets onglet qui permettent de définir les différents onglets. Sisal gère automatiquement les objets affichés en fonction de l’onglet sélectionné, mais ne peut gérer qu’une seule boite à onglet par synoptique.

NomDeBoiteAOnglet TabControl, Texte, X, Y, W,  H, DrapeauxActivés, DrapeauxInhibés, Police, TailleDePolice Begin { NomDOnglet TabSheet, Texte ; { DeclarationDObjet ;} } end ;

L’exemple suivant définit une boite à onglet ayant deux onglets ( Chargement, Rondelle), chacun de ces onglets ayant un statique propre :

tcOnglet TabControl, "  "  , 10, 60, 770, 420,,,,, Begin

tsChargement TabSheet, "  Chargement "  ;

stPick Static, "  Pick position " , 120, 140, 120, 25,,,, ;

tsRondelle TabSheet, "  Rondellle "  ;

stFirst Static, "  Premier poit " , 120, 160, 200, 25,,,, ;

end ;

L’objet boite à onglet et l’objet onglet ne possèdent pas de constante windows spécifique.

L’objet onglet ne définit aucune variable, fonction ou événement spécifique.

L’objet boite à onglet définit l’événement " SelChange " et les fonctions " GetSel " et " SetSel ".

L’événement SelChange

L’événement SelChange permet d’être informé de ce que l’utilisateur a sélectionné un onglet de la boite à onglet.

Exemple :

On tcOnglet.SelChange do ..

Fonction GetSel

La fonction rend le numéro d’onglet actuellement sélectionné (0 pour le premier onglet, ‑1 si aucun onglet sélectionné).

Fonction SetSel

La fonction SetSel permet de sélectionner un onglet par son indice (0 pour le premier onglet).

Objet Image

L’objet Image permet d’afficher une image dans un synoptique

NomDImage Image, Fichier, X, Y, W, H, DrapeauxActivés, DrapeauxInhibés;

Par exemple:

imLog Image, " Log.bmp ", 100, 200, 100, 50,,;

Une image ne dispose que des constantes standards, et ne dispose d’aucune méthode propre. A l’affichage l’image est agrandie au dimensions précisées par W et H.

Objet ImageList

L’objet ImageList permet d’afficher une image particulière dans une série d’image. La série d’image est une bande d’image définie dans une bitmap caractérise par la largeur des images élémentaires et une couleur de masque qui rend transparent tous les pixels de l’image de cette couleur.

Interactivement le synoptique peut faire afficher une image particulière de la liste d’image.

NomDImageList ImageList, Fichier, X, Y, W, H, Largeur, Masque;

Masque est une couleur qui peut s’exprimer sous forme d’entier 0xFF0000 ou sous forme de macro RGB.

Par exemple:

ilEtat ImageList, " LstImage.bmp ", 100, 100, 32, 32, 32, RGB( 255, 0, 0);

Variable Image

La variable Image permet de modifier ou de connaître le numéro d’image actuellement affichée. Image peut varier de 0 à GetCount()‑1.

IlEtat.Image = 2;

Fonction GetCount

La fonction GetCount() permet de connaître le nombre d’image définies dans la liste d’image.

Fonction GetHandle

La fonction GetHandle() rend l’identification Windows (Handle) de la liste d’image afin que cette dernière puisse être utilisée par exemple dans une vue en arbre (TreeView).

Objet TreeView

L’objet TreeView permet d’afficher des informations sous forme arborescente comme dans la partie gauche de l’explorateur Windows.

NomDArbre TreeView, Texte, X, Y, W, H, DrapeauxActifs, DrapeauxInactifs, Police, Taille;

En plus des constantes windows communes, il dispose de

Constantes Windows

Signification

TVS_HASBUTTONS

Permet d’afficher des boutons + ou ‑ à coté des éléments parent afin que l’utilisateur puisse déployer ou replier la liste de ses enfants.

TVS_HASLINES

Permet d’afficher les lignes reliant les parents aux enfants.

TVS_LINESATROOT

Permet d’afficher les lignes des la racine à condition que TVS_HASLINES soit aussi sélectionné.

TVS_EDITLABELS

Non opérationnel (Permet à l’utilisateur de modifier les texte d’un élément).

TVS_DISABLEDRAGDROP

Non opérationnel (Permet à l’utilisateur de démarrer une opération Glisser‑Déplacer).

TVS_SHOWALWAYS

Permet à un élément sélectionné de l’arbre de rester sélectionné y compris quand l’arbre perd le focus.



Un arbre d’affichage est un composant complexe qui nécessite de pouvoir désigner un de ses éléments afin de pouvoir le modifier, de désigner son père, son fils, de naviguer, ...

Pour cela Sisal permet de définir dans une variable un identificateur d’élément d’arbre d’affichage, aussi appelé item. Cette identificateur devra être transmis à chaque fonction adressant un élément particulier de l’arbre.

A un arbre d’affichage on peut associer une liste d’image afin de pouvoir montrer une icône associé à chaque élément, l’image choisie dépend de l’état de l’élément sélectionné ou non.

A chaque élément on peut associer une donnée numérique entière libre d’utilisation.

Fonction AddChild

La fonction AddChild permet de rajouter à un élément existant un enfant.

AddChild( item, Texte {, Indice {, IndiceSélectionné {, Donnée}}}): Item

Item désigne l’élément existant, Texte est le texte associé à cet élément, Indice et Indice Sélectionné désignent respectivement le numéro d’image associée lorsque l’élément est sélectionné ou pas. Ces numéros sont spécifiques à chaque élément. Donnée est la donnée entière applicative qui sera associée à cet élément.

Exemple:

Fils = AddChild( Pere, " Aine ");

Fonction InsertItem

La fonction InsertItem permet d’insérer un élément dans un arbre en fin de liste y compris dans le cas ou aucun élément n’existe dans l’arbre.

InsertItem( item, Texte {, Indice {, IndiceSélectionné {, Donnée}}}): Item

Item désigne le parent à qui on rajoute un élément, si item est indéfini (null) l’élément est rajouté à la racine. Texte est le texte associé à cet élément, Indice et Indice Sélectionné désignent respectivement le numéro d’image associée lorsque l’élément est sélectionné ou pas. Ces numéros sont spécifiques à chaque élément. Donnée est la donnée entière applicative qui sera associée à cet élément.

Exemple:

Program = InsertItem( null, " Program Files ");

InsertItem( Program, " Veymont ");

Sisal = InsertItem( null, " Sisal ");

InsertItem( Sisal, " L982 ");

Cet exemple crée un arbre à deux entrées qui ont chacune un fils.

Fonction GetRoot

La fonction GetRoot retrouve le premier élément de l’arbre.

GetRoot(): Item

Fonction DeleteAllItem

La fonction DeleteAllItem détruit tous les éléments d’un arbre.

DeleteAllItem(): int

La fonction retourne 1 en cas de succès

Fonction DeleteItem

La fonction DeleteItem permet de retire un élément.

DeleteItem( item) : int

Item désigne l’élément à retirer, La fonctionne retourne 1 en cas de succès

Fonction GetParent

La fonction GetParent permet de retrouver l’élément parent d’un élément.

GetParent( item) : item

La fonction rend l’item en cas de succès et indéfini sinon.

Fonction GetChild

La fonction GetChild permet de retrouver le fils ainé d’un élément.

GetChild( item): item

La fonction rend l’item en cas de succès et indéfini sinon.

Fonction GetNext

La fonction GetNext permet de retrouver l’élément suivant d’un élément ( le frère cadet).

GetNext( item) : item

La fonction rend l’item en cas de succès et indéfini sinon.

Fonction GetPrevious

La fonction GetPrevious permet de retrouver l’élément précédent d’un élément ( le frère aîné).

GetPrevious( item) : item

La fonction rend l’item en cas de succès et indéfini sinon.

Fonction SetText

La fonction SetText permet de modifier le texte associé à un élément

SetText( item, text)

Fonction GetText

La fonction GetText permet de retrouver le texte associé à un élément.

GetText( item): String

Fonction SetData

La fonction SetData permet de modifier la donnée associée à un élément.

SetData( item, int)

Fonction GetData

La fonction GetData permet de retrouver la donnée entière associée à un élément

GetData( item) : int

Fonction Expand

La fonction Expand permet d’afficher les éléments associés à un élément.

Expand( item): int

La fonction rend 1 si un changement a eu lieu.

Fonction Collapse

La fonction Collapse permet de masquer les éléments associés à un élément.

Collapse( item): int

La fonction rend 1 si un changement a eu lieu.

Fonction GetSelection

La fonction GetSelection permet de retrouver l’élément actuellement sélectionné.

GetSelection() : Item

Fonction GetPath

La fonction GetPath rend le chemin accès correspondant à l’élément passé en paramètre.

GetPath( item) : string

A la fin de l’exemple suivant, la variable chaîne contient " alpha.bravo.charlie ".

item = arbre.InsertItem( null, " alpha ");

item = arbre.InsertItem( item, " bravo ");

item = arbre.InsertItem( item, " charlie ");

chaîne = arbre.GetPath( item);

Fonction SetImageList

La fonction SetImageList permet d’associer à un arbre d’affichage une liste d’image.

SetImageList( Handle {, Type})

Deux icônes peuvent être au plus associées à un élément, et pour cela on peut associer deux liste d’image à un arbre d’affichage: la liste normale de sélection et la liste d’état.

Handle doit être un handle d’un objet ListImage rendu par la fonction GetHandle(), et Type peut être0 pour la liste normale et 1 pour la liste d’état.

Exemple:

Object

il ImageList, " LstImage.bmp ", 20, 20, 32, 32,,WS_VISIBLE,

32, RGB( 255, 0, 0);

tv TreeView, "  ", 20, 80, 200, 300,TVS_HASBUTTONS | TVS_HASLINES|

TVS_LINESATROOT| TVS_EDITLABELS, , "Arial ",‑12;

Synoptic Reglage( Test)

Begin

On Do Begin

tv.SetImageList( il.GetHandle());

...

Fonction SetState

La fonction SetState permet d’associer à un élément un état particulier.

SetState( item , valeur, {, Type});

Item désigne l’élément en question, Valeur sera un entier codant l’état et Type désigne la liste 1 pour la liste normale de sélection (valeur par défaut) et 2 pour la liste d’état.

Fonction GetState

La fonction GetState permet de retrouver l’état d’un élément.

GetState( item {, Type}); int

Item désigne l’élément en question et Type désigne la liste 1 pour la liste normale de sélection (valeur par défaut) et 2 pour la liste d’état. La fonction rend la valeur entière correspondant à l’état demandé (0 pour la non‑sélection).

Evénement SelChange

L’événement SelChange permet d’être informé du changement d’élément sélectionné.

Exemple

On tv.SelChange do begin

actif = tv.GetSelection();

Message( " Elément sélectionné: " :tv.GetText( actif));

end

Evénement ItemExpand

L’événement ItemExpand permet d’être informé de l’expansion ou du repli des éléments d’un élément

On tv.ItemExpand do begin

actif = tv.GetSelection();

Message( " Elément modifié: " :tv.GetText( actif));

end

Objets StackView et QueueView

Les objets StackView et QueueView permettent d'afficher un ensemble d'images animées qui sont gérés comme dans une pile (LIFO) ou une file d'attente (FIFO). Ce sont des objets qui reprennent une bonne partie des fonctions de l'objet Sprite.

NomDePile StackView, Fichier, X, Y, W, H, Largeur, Masque;

NomDeQueue QueueView, Fichier, X, Y, W, H, Largeur, Masque;

Par exemple:

BufferDEntree Queue, " LstImage.bmp ", 100, 100, 32, 32, 32, RGB( 255, 0, 0);

Au départ l'objet est vide, chaque sprite doit être déclaré afin de pouvoir apparaître.

Function SetWindow

La fonction SetWindow permet de préciser la taille du conteneur et l'orientation général du conteneur

SetWindow( nombre, orientation);

Le champ orientation précise que l'introduction des éléments se fait

Orientation

Introduction

0

A gauche

1

En haut

2

A droite

3

En base

Function Push

La fonction Push permet d'introduire un sprite dans le conteneur.

Push( image [, valeur [, label]]);

La fonction rajoute un sprite associé à l'image passé en paramètre dans le conteneur. Optionnellement on peut lui rajouter une valeur particulière (cf.SetValue) et aussi une étiquette particulière (cf.SetLabel).

Par exemple pour monter une palette furet, on peut écrire

Furet = Pile.Push( 5, "999", "F");

Fonction Pull

La fonction Pull permet de retirer un élément du conteneur. Pour une pile (StackView) le dernier introduit dans la pile est retiré, pour une file (QueueView) le plus anciennement introduit est retiré.

Fonctions SetValue et GetValue

A chaque sprite peut être associé une valeur propre, cette valeur est fixé par la fonction SetValue et peut récupérer par la valeur GetValue.

SetValue( Sprite, Valeur)

GetValue( Sprite) : valeur

Fonctions SetLabel et GetLabel

A chaque sprite peut être associé un texte (une étiquette) qui sera affiché en même temps que lui. Ce texte est centrée sur le centre du sprite.

SetLabel( Sprite, Valeur);

GetLabel( Sprite): Valeur

Pour désactiver l'affichage de l'étiquette il suffit d'appeler SetLabel avec la valeur null.

Fonction DeleteAll

La fonction DeleteAll permet de détruire tous les sprites définis dans l'objet Sprite.

Fonction Show

La fonction Show permet de changer l'image associée à un sprite.

Show( Sprite, image);

Fonction GetImage

La fonction GetImage permet de retrouver l'image présentement associée au sprite, elle rend le numéro d'image.

GetImage( sprite);

Par exemple pour connaître l'image du furet

Sprites.GetImage( furet);

Fonction Find

La fonction Find permet de retrouver le Sprite qui se trouve aux coordonnées passées en paramètres. Ces coordonnées doivent être exprimées par rapport à l'origine de l'objet Sprite.

Find( X, Y) : Sprite

La fonction rend l'identification du sprite qui se trouve sous ce point, 0 s'il n'y en pas.

Fonction GetCount

La fonction GetCount rend le nombre de sprite défini dans l'objet Sprite.

GetCount(): nombre

Fonctions ForEach, Next et Current

Les fonctions ForEach, Next et Current permettent d'obtenir la liste de tous les sprites d'un objet sprite.

ForEach()

Next(): Booléen

Current(): sprite

La fonction Foreach permet d'initialiser une itération sur tous les sprites contenus dans l'objet Sprite, la fonction Next permet de passer au sprite suivant (au premier la première fois) et d'indiquer si on a fini l'itération, et enfin la fonction Current permet d'obtenir l'identification du sprite courant, cette dernière n'est valide que si la fonction Next .

Par exemple si on veut changer l'image associé à tous les sprites d'un objet Sprite, il suffit de faire

Sprites.ForEach();

While sprite.Next() do begin

Spr = sprites.Current();

Sprites.Show( spr, 6);

end

On ne peut imbriquer des boucles ForEach sur un même objet sprite, de plus on ne peut supprimer des sprites dans une boucle ForEach.

Fonctions First et Last

Les fonctions First et Last permettent respectivement de retrouver l'identification du plus vieux sprite et du plus jeune sprite.

Fonctions GetXClick et GetYClick

Objet Sprite

L’objet Sprite permet d’afficher des images mobiles et animées, appelées sprite, dans une partie de l'écran et des contours colorés appelés shape. Les sprites sont dessinés en transparence sur le fond d'écran du synoptique. Il peuvent s'empiler les uns sur les autres, auquel cas les plus récemment introduits dans l'objet Sprite, masquent les plus anciens.

Il se déclare de manière semblable à la liste d'image, les images affichées étant sélectionnées dans la liste d'image.

La série d’image est une bande d’image définie dans une bitmap caractérise par la largeur des images élémentaires et une couleur de masque qui rend transparent tous les pixels de l’image de cette couleur.

NomDesSprites Sprite, Fichier, X, Y, W, H, Largeur, Masque;

Masque est une couleur qui peut s’exprimer sous forme d’entier 0xFF0000 ou sous forme de macro RGB.

Par exemple:

Sprites Sprite, " LstImage.bmp ", 100, 100, 32, 32, 32, RGB( 255, 0, 0);

Les shapes sont dessinés d'après un polygone quelconques et permettent d'attirer l'attention de l'opérateur sur un équipement défectueux. Les shapes peuvent être affichés et masqués, changés de couleur et animés.

Au départ l'objet est vide, chaque sprite et shape doivent être déclaré afin de pouvoir apparaître.

Fonction Create

La fonction Create permet de créer un sprite.

Create( image, x, y):sprite

La fonction permet d'afficher un sprite avec l'image correspondante dans la liste d'image, il placé dans la zone de l'objet aux coordonnées X, Y relatives au coin supérieur gauche de l'objet Sprite. La fonction rend un identificateur de sprite qui sera transmis chaque fois qu'une fonction fera référence à ce sprite.

Par exemple pour monter une palette furet, on peut écrire

Furet = Sprites.Create( 5, 10, 10);

Fonction CreateShape

La fonction Create permet de créer une shape.

CreateShape( Tableau, Nombre, x, y):sprite

La fonction permet de définir un shape en donnant un tableau de points indiquant la suite des points du polygone.

La fonction rend un identificateur de sprite (ou de shape) qui sera transmis chaque fois qu'une fonction fera référence à ce shape.

Par exemple pour montrer en rouge un carré, on peut écrire

Tab[0,0] = 0; tab[0,1] = 0;

Tab[1,0] = 50; tab[1,1] = 0;

Tab[2,0] = 50; tab[2,1] = 50;

Tab[3,0] = 0; tab[3,1] = 50;

Carre = Sprites.CreateShape( Tab, 4, 10, 10);

Sprites.Show( carre, RGB( 255, 0, 0));

...

Sprites.Hide( carre);

Sprites.Move( carre, 100, 100);

Fonction Delete

La fonction Delete permet de détruire un sprite ou shape qui a été créé précédemment Attention il est important de détruire les sprites qui ne sont plus utilisés sinon on risque de manquer de mémoire.

Delete( sprite);

La fonction rend 1 si elle a pu détruire le sprite

Par exemple quand le changement de série est terminé:

Sprites.Delete( furet);

Fonction Move

La fonction Move permet de changer la position d'un sprite ou d'un shape.

Move( sprite, X, Y);

La fonction rend 1 si elle a pu déplacer le sprite.

Exemple pour changer de place le furet:

Sprites.Move( Furet, 100, 10);

Fonctions SetValue et GetValue

A chaque sprite peut être associé une valeur propre, cette valeur est fixé par la fonction SetValue et peut être récupérée par la fonction GetValue.

SetValue( Sprite, Valeur)

GetValue( Sprite) : valeur

Fonctions SetLabel et GetLabel

A chaque sprite peut être associé un texte (une étiquette) qui sera affiché en même temps que lui. Ce texte est centrée sur le centre du sprite.

SetLabel( Sprite, Valeur);

GetLabel( Sprite): Valeur

Pour désactiver l'affichage de l'étiquette il suffit d'appeler SetLabel avec la valeur null.

Fonction DeleteAll

La fonction DeleteAll permet de détruire tous les sprites définis dans l'objet Sprite.

Fonction Show

La fonction Show permet de changer l'image associée à un sprite.

Show( Sprite, image);

ou d'afficher une shape en précisant sa couleur d'affichage.

Show( Shape, Couleur);

Fonction GetImage

La fonction GetImage permet de retrouver l'image présentement associée au sprite, elle rend le numéro d'image.

GetImage( sprite);

Par exemple pour connaître l'image du furet

Sprites.GetImage( furet);

Fonctions GetX et GetY

Les fonctions GetX et GetY permettent de retrouver les coordonnées du sprite.

GetX( sprite): X

GetY( spritte): Y

Fonction Find

La fonction Find permet de retrouver le Sprite qui se trouve aux coordonnées passées en paramètres. Ces coordonnées doivent être exprimées par rapport à l'origine de l'objet Sprite.

Find( X, Y) : Sprite

La fonction rend l'identification du sprite qui se trouve sous ce point, 0 s'il n'y en pas.

Fonction GetCount

La fonction GetCount rend le nombre de sprite défini dans l'objet Sprite.

GetCount(): nombre

Fonctions ForEach, Next et Current

Les fonctions ForEach, Next et Current permettent d'obtenir la liste de tous les sprites d'un objet sprite.

ForEach()

Next(): Booléen

Current(): sprite

La fonction Foreach permet d'initialiser une itération sur tous les sprites contenus dans l'objet Sprite, la fonction Next permet de passer au sprite suivant (au premier la première fois)et d'indiquer si on a fini l'itération, et enfin la fonction Current permet d'obtenir l'identification du sprite courant, cette dernière n'est valide que si la fonction Next .

Parexemple si on veut changer l'image associé à tous les sprites d'un objet Sprite, il suffit de faire

Sprites.ForEach();

While sprite.Next() do begin

Spr = sprites.Current();

Sprites.Show( spr, 6);

end

On ne peut imbriquer des boucles ForEach sur un même objet sprite, de plus on ne peut supprimer des sprites dans une boucle ForEach.

Fonctions First et Last

Les fonctions First et Last permettent respectivement de retrouver l'identification du plus vieux sprite et du plus jeune sprite.

Fonction DragTo

La fonction DragTo permet de déplacer un sprite de sa position actuelle à la position passée en paramètre.

DragTo( sprite, X, Y, vitesse);

Le quatrième paramètre est la vitesse à laquelle va se déplacer le sprite, elle s'exprime en pixel par seconde.

Par exemple pour faire avancer le furet à la station 2, on va faire.

Sprites.DragTo( furet, X2, Y2, 100);

Fonction Moving

La fonction Moving permet de savoir si un sprite est en cours de déplacement.

Moving( sprite);

Par exemple pour effacer un sprite après son déplacement..

Sprites.DragTo( furet, X2, Y2, 100);

While Sprites.Moving( furet) do Wait;

Sprites.Show( furet, 0);

Fonction Animate

La fonction Animate permet d'animer l'apparence d'un sprite, c'est à dire que périodiquement on va changer l'image qui le représente et ce sans autre programmation que l'appel de cette fonction.

Animate( sprite, premiere, derniere, periode[, depart])

La fonction attend un identificateur de sprite, un numéro de première image (incluse), un numéro de dernière image(exclus), une période de changement d'image en milli-seconde et optionnellement un top de départ pour l'animation.

L'objet Sprite va automatiquement afficher le sprite avec chacune des images comprises entre la première et la dernière en les changeant toutes les "période fois" milli-secondes. Le top départ permet de synchroniser les images entre sprites, pour cela on choisit l'instant de départ (par défaut la valeur 0), si par contre on veut montrer une évolution propre et indépendante de chaque sprite ( pour l'ouverture d'une porte par exemple) on passera en paramètre une valeur spécifique (le résultat de la fonction GetTickCount() par exemple), enfin si on désire n'afficher qu'une seule fois le cycle d'image on transmet la valeur –1 comme top départ.

Par exemple on veut afficher une pompe qui tourne avec six images:

Sprites.Animate( Pompe, ImgPompe, ImgPompe+6, 100);

Pour montrer l'ouverture d'une porte et sa fermeture on peut faire:

// Ouverture de la prote

Sprites.Animate( Porte, ImgPorte, ImgPorte+4, 100, -1);

Fin = GetTickCount()+400; // Il faut 400ms pour afficher l'ouverture

While GetTickCount() < Fin do Wait;

// Fermeture de la porte

Sprites.Animate( Porte, ImgPorte+3, ImgPorte-1, 100, -1);

Fonctions GetXClick et GetYClick

Objet Canvas

L’objet Canvas permet de dessiner dans une partie de l'écran comme on dessine sur un canevas. Ces dessins peuvent être des dessins simples, des affichages de texte ou des widgets (objet graphique).

NomDeCanvas Canvas, Texte, X, Y, W, H, DrapeauxActifs, DrapeauxInactifs { begin

declaration de widgets inclus dans le canevas

end }

;

Le paramètre texte n'est défini que par compatibilité avec les déclarations des autres objets graphiques, les autres paramètres ont leurs usages habituels.

Le contenu du canevas est produit dans une fonction qui a comme paramètre un DC (device context) ; lorsque Sisal doit repeindre le contenu d'un canevas, cet fonction est automatiquement appelée. Cette fonction de peinture est définie par l'appel de la fonction SetPaintFunction.

Par exemple:

CanevasSimple Canvas, "", 10, 10, 32, 32;

CanevasConteneur Canvas, """, 10, 100, 800, 300 begin

monwidget Rond, RGB( 255, 0, 0), 10, 10, 32, 32;

end

CanevasSimple est un simple canevas, il faut obligatoirement déclarer une fonction de peinture.

CanevasConteneur est un canevas qui contient un widget, la fonction de peinture n'est pas impérative mais peut-être utilisée pour peindre un fond de canevas ; lors de la peinture Sisal va appeler chacune des fonctions Paint de chaque widget inclus.

L'intérêt de déclarer des widgets dans le canevas est de pouvoir déclencher des événements directement associés à chacun d'entre eux

Fonction SetPaintFunction

La fonction SetPaintFunction permet de définir la fonction qui sera automatiquement appelée par Sisal lors de la peinture du canevas.

SetPaintFunction( NomDeFonctionDePeinture);

La fonction attend le nom d'une fonction de peinture ; une fonction de peinture est une fonction qui attend en paramètre un DC (device context) et effectue des appels de fonctionss graphiques en transmettant ce même DC.

Par exemple pour afficher l'heure dans un canevas on peut définir.

Object

cnHeure Canvas, "", 10, 10, 120, 32;

...

Function PeintHeure( DC)

var str;

dcSetFont( dc, "Arial", 24);

dcSetTextForeground( dc, RGB( 0, 255, 0));

tr = Format( "%.19t", Now());

dcDrawText( dc, str, 10, 10);

end

...

On do begin

cnHeure.SetPaintFunction( PeintHeure);

end

...

On Horloge.ToutesLesSecondes do cnHeure.Invalidate();

Toutes les secondes on invalide cnHeure, c'est à dire on dit à Sisal que son contenu est pas à jour ; et donc Sisal relance l'appel de la fonction PeintHeure.

Événement Click

L’événement Click permet d’être informé du click de l'utilisateur sur le canevas, les fonctions GetXClick et GetYClick permettent de retrouver les coordonnées du click.

Les widgets inclus dans le canevas dispose de l'événement Click, si l'utilisateur clique sur un widget gérant cet événement, seul l'événement du widget sera déclenché.

On cnSimple.Click Do x = cnSimple.GetXClick();

Événement RClick

L’événement RClick permet d’être informé du click droit de l'utilisateur sur le canevas. Le clic droit est préconisé pour faire apparaître un menu déroulant permettant de paramétrer le canevas droit-cliqué.

Param Event;

...

On cnSimple.RClick Do PopupMenu( { Param, "Paramétres"});


On Event.Param do …



Événement Drag

L’événement Drag permet d’être informé d'un mouvement de glisser-lâcher de l'utilisateur sur le canevas. La fonction GetDrag permet d'être informé des caractéristiques de ce mouvement.

On cnSimple.Drag Do cnSimple.GetDrag( X0, Y0, X1, Y1)


Objet Graphic

L’objet Graphic permet d’afficher des graphes dans une partie de l'écran. Ces graphes sont dessinés avec une échelle horizontale et verticale. Un Graphic peut afficher plusieurs graphes avec des couleurs et des attributs différents. Ils peuvent s'empiler les uns sur les autres, auquel cas les plus récemment introduits dans l'objet Graphic, masquent les plus anciens.

NomDeGraphic Graphic, Texte, X, Y, W, H;

Par exemple:

GraphVue Graphic, "", 100, 100, 32, 32;

Au départ l'objet est vide, chaque graphe doit être déclaré afin de pouvoir apparaître.

Fonction SetViewport

La fonction SetViewport permet de définir la cloture utilisé pour le graphe, c'est à dire les bornes inférieures et supérieures pour l'abscisse et l'ordonnée.

SetViewport( MinX, MinY, MaxX, MaxY);

La fonction attend les coordonnées du premier point visible en bas à gauche et du dernier point visible en haut à droite. L'objet Graphic en déduira toutes les transformations pour afficher tous les points.

Par exemple pour afficher le déplacement d'au plus un mêtre d'un escargot pendant une heure on peut définir.

GraphVue.SetViewPort( 0, 0.0, 60, 1.0);

On aura le temps de 0 à 60 sur l'abscisse et le déplacement sur l'ordonnée.

Si l'escargot est trop rapide, par exemple il est à 1m20 au bout de dix minutes, ce point [10, 1,2] ne pourra pas être affiché mais cela ne crée pas de difficultés.

Fonctions SetXScale et SetYScale

L'objet Graphic permet de définir les caractéristiques de dessin des échelles.

SetXScale( Flags, Zero, MajorIncrement, MinorIncrement, RatioDAffichage, Format);

SetYScale( Flags, Zero, MajorIncrement, MinorIncrement, RatioDAffichage, Format);

Flags définit un ensemble de drapeaux indiquant comment seront tracés les échelles ( 1 Affichage de l'échelle, 2 Affichage des marques majeures avec leurs valeurs en texte, 4 Affichage des marques mineures, 8 tracé des filigranes correspondants aux marques majeures).

Zero définit l'abscisse ou l'ordonnée à la hauteur de laquelle sera tracé le premier incrément majeur, MajorIncrement définit l'incrément à appliquer entre chaque marques majeures, MinorIncrement définit l'incrément à appliquer entre chaque marque mineure.

Le ratio d'affichage permet d'indiquer par combien doit être divisé la valeur de marque avant son affichage en texte, le format d'appliquer un format (cf.Format).

Par exemple pour afficher les heures et indiquer les quarts d'heures de temps exprimé en seconde à partir de midi, on peut écrire

GraphVue.SetXScale( 7, 12*3600, 3600, 900, 3600, "%.2fh");

Fonction Create

La fonction Create permet de créer un graphe élémentaire.

Create( nombre) : GraphItem

La fonction permet d'afficher un graphe comprenant un certain nombre de points, un point est défini par deux coordonnées: son abscisse et son ordonnée.

La fonction rend un identificateur de graphe qui sera transmis chaque fois qu'une fonction fera référence à ce graphe.

Par exemple pour créer une courbe de dix points, on peut écrire

Effort = GraphVue.Create( 10);

Fonction Delete

La fonction Delete permet de détruire un graphe qui a été créé précédemment. Attention il est important de détruire les graphes qui ne sont plus utilisés sinon on risque de manquer de mémoire.

Delete( GraphItem);

La fonction rend 1 si elle a pu détruire le graphe.

Par exemple quand le changement de série est terminé:

GraphVue.Delete( furet);

Fonction Write

La fonction Write permet de définir les points d'un graphe.

Write( GraphItem, Tableau, Nombre): nombre;

La fonction attend en paramètre un identificateur de courbe, et un tableau à deux dimensions contenant les coordonnées de chaque point.

La fonction rend le nombre de points effecivement enregistré, -1 si le graphe n'existe pas.

Exemple pour dessiner un carré

Carre = GraphVue.Create(5);

Graphic[ 0, 0] = 10; Graphic[ 0, 1] = 10;

Graphic[ 1, 0] = 50; Graphic[ 1, 1] = 10;

Graphic[ 2, 0] = 50; Graphic[ 2, 1] = 50;

Graphic[ 3, 0] = 10; Graphic[ 3, 1] = 50;

Graphic[ 4, 0] = 10; Graphic[ 4, 1] = 10;

GraphVue.Write( Carre, Graphic, 5);

Bien evidemment comme un Graphic trace des lignes brisées, il faut cinq points pour que la ligne brisée puisse fermer le carré.

Fonctions Read

La fonction Read permet de lire les données d'un graphe dans un tableau.

Read( GraphItem, Tableau, &Nombre): status

La fonction attend en paramètre un identificateur de courbe, un tableau à deux dimensions destiné à contenir les coordonnées de chaque point et une variable destinée à recevoir le nombre de points effectivement écrits.

La fonction rend un status indiquant si cela s'est bien passé 1 ou pas 0.

Fonctions SetValue et GetValue

A chaque graphe peut être associé une valeur propre, cette valeur est fixé par la fonction SetValue et peut être récupérée par la fonction GetValue.

SetValue( GraphItem, Valeur)

GetValue( GraphItem) : valeur

Fonctions SetLabel et GetLabel

A chaque graphe peut être associé un texte (une étiquette) qui sera affiché en info-bulle lorsque l'utilisteur cliquera sur le graphe.

SetLabel( GraphItem, Valeur);

GetLabel( GraphItem): Valeur

Pour désactiver l'affichage de l'étiquette il suffit d'appeler SetLabel avec la valeur null.

Fonctions SetColor et GetColor

Chaque graphe peut avoir une couleur de tracé propre.

SetColor( GraphItem, Valeur);

GetColor( GraphItem): Valeur

Par exemple pour avoir une courbre tracée en rouge.

GraphVue.SetColor( dernier, RGB( 255,0,0));

Fonctions SetPenStyle et GetPenStyle

Chaque graphe peut avoir une forme de tracé propre.

SetPenStyle( GraphItem, Valeur);

GetPenStyle( GraphItem): Valeur

Windows permet de définir sept (7) types de plume différents (0 à 6).

Fonctions SetWidth et GetWidth

Chaque graphe peut avoir une épaisseur de tracé propre.

SetWidth( GraphItem, Valeur);

GetWidth( GraphItem): Valeur

Fonction DeleteAll

La fonction DeleteAll permet de détruire tous les graphes définis dans l'objet Graphic.

Fonction Find

La fonction Find permet de retrouver le graphe dont un des points se trouve le plus proche des coordonnées passées en paramètres.

Find( X, Y) : GraphItem

La fonction rend l'identification du graphe qui se trouve sous ce point, 0 s'il n'y en pas.

Fonction GetCount

La fonction GetCount rend le nombre de graphes définis dans l'objet Graphic.

GetCount(): nombre

Fonctions ForEach, Next et Current

Les fonctions ForEach, Next et Current permettent d'obtenir la liste de tous les graphes d'un objet Graphic.

ForEach()

Next(): Booléen

Current(): GraphItem

La fonction Foreach permet d'initialiser une itération sur tous les graphes contenus dans l'objet Graphic, la fonction Next permet de passer au graphe suivant (au premier la première fois) et d'indiquer si on a fini l'itération, et enfin la fonction Current permet d'obtenir l'identification du graphe courant, cette dernière n'est valide que si la fonction Next a été appellée précedemment.

On ne peut imbriquer des boucles ForEach sur un même objet Graphic, de plus on ne peut supprimer des Graphics dans une boucle ForEach.

Fonctions First et Last

Les fonctions First et Last permettent respectivement de retrouver l'identification du plus vieux graphe et du plus jeune graphe.

Fonctions GetXClick et GetYClick

Les fonctions GetXClick et GetYClick permettent de retrouver les coordonnées du dernier clic de l'utilisateur dans le Graphic.

Objet HtmlView

L'objet HtmlView permet d'afficher dans une partie de synoptique un document Html. Un document Html est un document texte normalisé pouvant être généré par script et présentant des capacités de mise en valeur supérieur à un champ Edit.

Cet objet dispose des méthodes suivantes:

HtmlView.Read( fichier);

HtmlView.Print( fichier {, entete {, empied}})

HtmlView.Preview(fichier {, entete {, empied}})


et de la valeur Page.

Objet Printout

L’objet Printout permet de réaliser des impressions de documents, par exemple des rapports ou des étiquettes. Cet objet ne présente pas de visualisation dans l'écran de synoptique mais permet de néanmoins de prévisualiser si nécessaire le document avant impressions.

NomDImpression Printout, Imprimante, W, H;

Par exemple:

Etiquette Printout, "HP Color LaserJet 3500", 210, 297;

Au départ l'objet ne comprend que le nom de l'imprimante à utiliser et les dimensions en millimètre de la page utilisée. Le contenu de chacune des pages du document est défini au moment de l'impression ou de la prévisualisation du document par l'appel d'une fonction de retour spécifique (cf. SetPrintPageFunction).

Fonction SetPrintPageFunction

La fonction SetPrintPageFunction permet d'associer à un objet d'impression la fonction qui réalise effectivement les impressions.

SetPrintPageFunction( Fonction) : status

La fonction de retour a deux paramètre un contexte d'équipements (DC ou device context1) et un numéro de page, elle retourne un compte-rendu (1 OK).

PageFunction( DC, page): status

A l'intérieur de la fonction, on réalise toutes les opérations requises en utilisant le DC.

Par exemple

Etiquette Printout, "HP Color LaserJet 3500", 210, 297;


Function ImprimeEtiquette( dc, numpage)

begin

dcDrawText( dc, "Sisal is winning again.", 0, 0);

dcDrawText( dc, "page ":numpage, 90, 270);

end

....

On do begin

Etiquette.SetPrintPageFunction( ImprimeEtiquette);

end


On bt.click do begin

Etiquette.MinPage = 1;

Etiquette.MaxPage = 10;

Etiquette.PageFrom = 1;

Etiquette.PageTo = 10;

Etiquette.Preview();

end

Cet exemple affichera en prévisualisation les dix pages du document équivalent.




Fonction Print

La fonction Print permet de lancer l'impression sur l'imprimante associée.

Print() : status

La fonction n'attend pas de paramètre, elle retourne 1 en cas de succés, 0 en cas d'échec.

Fonction Preview

La fonction Preview permet d'ouvriri une fenêtre montrant à l'utilisateur une vue approchante du résultat final.

Preview() : status

La fonction n'attend pas de paramètre, elle retourne 1 en cas de succés, 0 en cas d'échec.

Fonction GetPageSizePixels

La fonction GetPageSizePixels permet d'obtenir la dimension en pixel de la page associée à l'imprimante.

GetPageSizePixels( &largeur, &hauteur): status

La fonction attend en paramètre deux variables qui sont mis à jour au retour de la fonction en cas de succès (1); en cas d'échec la fonction retourne une valeur indéfinie.

Fonction GetPageSizeMM

La fonction GetPageSizeMM permet d'obtenir la taille en millimètre de la page associée à l'imprimante.

GetPageSizeMM( &largeur, &hauteur): status

La fonction attend en paramètre deux variables qui sont mis à jour au retour de la fonction en cas de succès (1); en cas d'échec la fonction retourne une valeur indéfinie.

Fonction SetBin

La fonction SetBin permet de sélectionner le bac à utiliser pour la prochaine impression.

SetBin( numéro) : status

La fonction attend en paramètre un numéro de bac, ces numéros sont propres à chaque type d'imprimante, la seule solution d'identification est de les tester tous.

Fonction GetBin

La fonction GetBin permet de connaître le bac actuellement sélectionné .

GetBin() : numéro

La fonction n'attend pas de paramètre, elle retourne le numéro de bac.

Fonction SetOrientation

La fonction SetOrientation permet de sélectionner l'orientation de la prochaine impression.

SetOrientation( numéro) : status

La fonction attend en paramètre un entier ( 1 en portrait, 2 à l'italienne)..

Fonction GetOrientation

La fonction GetOrientation permet de connaître l'orientation actuellement sélectionnée.

GetOrientation() : numéro

La fonction n'attend pas de paramètre, elle retourne l'orientation courante.

Variables MinPage et MaxPage

Les variables MinPage et MaxPage permettent d'informer le gestionnaire d'impression avant l'impression du nombre total de pages contenues dans le document.

Ces varaibles doivent être impérativement valorisées avant toute impression.

Variable PageFrom et PageTo

Les variables PageFrom et PageTo permettent d'informer le gestionnaire d'impression avant l'impression des pages qui devront être imprimées.

Ces variables permettent de faire une impression partielle et doivent être impérativement valorisées avant toute impression.

Composant Suivi de production

Un composant ProdLog permet d’intégrer une fenêtre Suivi de production dans un synoptique. Le composant est associé à une base produit et possède les mêmes propriétés qu’une fenêtre de Suivi de production normale.

NomDeSuivi ProdLog, Base-produit, X, Y, W, H, DrapeauxActives, DrapeauxInhibes ;

L’exemple suivant ouvre une fenêtre Suivi de production liée à la base produit L982.Produits :

plSuivi ProdLog, " L982.Produits ", 100, 100, 200, 150, WS_VISBLE, ;

Le composant ProdLog n’a pas de constante Windows spécifique.

Un composant ProdLog introduit des variables et des fonctions qui correspondent aux critères applicables dans la boite à option de la fenêtre de suivi de production normale. De cette manière on peut effectuer toutes les interrogations de manière programmée.

Ce composant comprend les variables suivantes :

Nom

Description

Begin

Date de début de sélection

End

Date de fin de sélection

Period

Période de sélection ( 0 période particulière, 1 seconde, 2 minute, 3 heure, 4 Equipe, 5 jour, 6 semaine, 7 mois, 8 année)1.

Team

Equipe sélectionné (0 première équipe définie, …); ce champ est valide si Period vaut Equipe2

CumulPeriod

Période de cumul, c’est à dire la largeur des bâtons.

WithShift

Mettre à un si on veut sélectionner en fonction de la plage horaire

ShiftBegin

Heure de début de la plage horaire ( Nombre de seconde depuis minuit)

ShiftEnd

Heure de fin de la plager horaire (idem)

WithLot

Mettre à un si on veut sélectionner en fonction de la référence et/ou de la série

Model

Référence, indéfinir si on ne veut sélectionner qu’en fonction de la série

MReq

Série, indéfinir si on ne veut sélectionner qu'en fonction de la référence

WithRange

Mettre à un si on veut sélectionner en fonction de la gamme opérationnelle

Range

Gamme opérationnelle, on conserve les produits qui ont réalisés au moins une des fonctions précisées dans Range.

Productivity

Mettre à un si on veut calculer le rendement.



Fonction Select

La fonction Select permet de lancer une nouvelle sélection.

Select() : status

La fonction arrête la sélection en cours et relance une nouvelle sélection avec les paramètres actifs. La fonction retourne avant que la sélection ne soit terminée. Son statut indique vrai si le calcul est en cours au moment ou la fonction retourne.

L’exemple suivant montre la sélection des produits de la semaine courante.

plSuivi ProdLog, " L982.Produits ", 100, 100, 200, 150 ,, ;

...

On bouton.Click do begin

plSuivi.Stop() ; // Arrêtons le calcul en cours éventuel

plSuivi.Begin = now() ;

plSuivi.Period = 5 ;

plSuivi.Select() ;

end

Fonction Stop

La fonction stop permet d’arrêter un calcul en cours

Stop() : status

Cela est utile en particulier lorsque l’on doit relancer une nouvelle sélection et que l’on ne souhaite pas avoir des effets de bord sur la sélection restée active avec les nouveaux paramètres (voir l’exemple précédent).

Composant Pareto des défauts produits

Un composant ProdPareto permet d’intégrer une fenêtre Pareto des défauts produits dans un synoptique. Le composant est associé à une base produit et possède les mêmes propriétés qu’une fenêtre de Pareto des défauts produits.

Nom ProdPareto, Base-produit, X, Y, W, H, DrapeauxActives, DrapeauxInhibes ;

L’exemple suivant ouvre une fenêtre Pareto des défauts produits liée à la base produit L982.Produits :

ppPareto ProdPareto, " L982.Produits ", 100, 100, 200, 150, WS_VISBLE, ;

Le composant ProdPareto n’a pas de constante Windows spécifique.

Un composant ProdPareto introduit des variables et des fonctions qui correspondent aux critères applicables dans la boite à option de la fenêtre de suivi de production normale. De cette manière on peut effectuer toutes les interrogations de manière programmée.

Ce composant comprend les variables suivantes :

Nom

Description

Begin

Date de début de sélection

End

Date de fin de sélection

Period

Période de sélection ( 0 période particulière, 1 seconde, 2 minute, 3 heure, 4 Equipe, 5 jour, 6 semaine, 7 mois, 8 année)1.

Team

Equipe sélectionné (0 première équipe définie, …); ce champ est valide si Period vaut Equipe2

CumulPeriod

Période de cumul, c’est à dire la largeur des batons.

WithShift

Mettre à un si on veut sélectionner en fonction de la plage horaire

ShiftBegin

Heure de début de la plage horaire ( Nombre de seconde depuis minuit)

ShiftEnd

Heure de fin de la plager horaire (idem)

WithLot

Mettre à un si on veut sélectionner en fonction de la référence et/ou de la série

Model

Référence, indéfinir si on ne veut sélectionner qu’enfonction de la série

MReq

Série, indéfinir si on ne veut sélectionner qu'en fonction de la référence

WithRange

Mettre à un si on veut sélectionner en fonction de la gamme opérationnelle

Range

Gamme opérationnelle, on conserve les produits qui ont réalisés au moins une des fonctions précisées dans Range.

Graph

Mettre 0 pour un l’histogramme et à 1 pour un graphe sectoriel.

ParetoBy

Mettre à 0 pour un pareto par nombre et à 1 pour un pareto par durée



Fonction Select

La fonction Select permet de lancer une nouvelle sélection.

Select() : status

La fonction arrête la sélection en cours et relance une nouvelle sélection avec les paramètres actifs. La fonction retourne avant que la sélection ne soit terminée. Son statut indique vrai si le calcul est en cours au moment ou la fonction retourne.

L’exemple suivant montre la sélection des défauts-produits de la semaine courante.

ppSuivi ProdPareto, " L982.Produits ", 100, 100, 200, 150 ,, ;

...

On bouton.Click do begin

ppSuivi.Stop() ; // Arrêtons le calcul en cours éventuel

ppSuivi.Begin = now() ;

ppSuivi.Period = 5 ;

ppSuivi.Select() ;

end

Fonction Stop

La fonction stop permet d’arrêter un calcul en cours

Stop() : status

Cela est utile en particulier lorsque l’on doit relancer une nouvelle sélection et que l’on ne souhaite pas avoir des effets de bord sur la sélection restée active avec les nouveaux paramètres (voir l’exemple précédent).

Composant Histogramme de mesure

Un composant ProdHistogram permet d’intégrer une fenêtre Histogramme de mesure dans un synoptique. Le composant est associé à une base produit et possède les mêmes propriétés qu’une fenêtre de Histogramme de mesure normale.

Nom ProdHistogram, Base-produit, X, Y, W, H, DrapeauxActives, DrapeauxInhibes ;

L’exemple suivant ouvre une fenêtre Histogramme de mesure liée à la base produit L982.Produits :

phSuivi ProdHistogram, " L982.Produits ", 100, 100, 200, 150, WS_VISBLE, ;

Le composant ProdHistogram n’a pas de constante Windows spécifique.

Un composant ProdHistogram introduit des variables et des fonctions qui correspondent aux critères applicables dans la boite à option de la fenêtre de Histogramme de mesure normale. De cette manière on peut effectuer toutes les interrogations de manière programmée.

Ce composant comprend les variables suivantes :

Nom

Description

Begin

Date de début de sélection

End

Date de fin de sélection

Period

Période de sélection ( 0 période particulière, 1 seconde, 2 minute, 3 heure, 4 Equipe, 5 jour, 6 semaine, 7 mois, 8 année)1.

Team

Equipe sélectionné (0 première équipe définie, …); ce champ est valide si Period vaut Equipe2

WithShift

Mettre à un si on veut sélectionner en fonction de la plage horaire

ShiftBegin

Heure de début de la plage horaire ( Nombre de seconde depuis minuit)

ShiftEnd

Heure de fin de la plage horaire (idem)

WithLot

Mettre à un si on veut sélectionner en fonction de la référence et/ou de la série

Model

Référence, indéfinir si on ne veut sélectionner qu’en fonction de la série

Mreq

Série, indéfinir si on ne veut sélectionner qu'en fonction de la référence

WithRange

Mettre à un si on veut sélectionner en fonction de la gamme opérationnelle

Range

Gamme opérationnelle, on conserve les produits qui ont réalisés au moins une des fonctions précisées dans Range.

Measure

Numéro de la mesure de 0 à n-1.

ClassNumber

Nombre de class

WithLimitModified

A un pour forcer les limites avec les deux valeurs suivantes

UCL

Limite de contrôle supérieure

LCL

Limite de contrôle inférieure

WithKhi2

A un pour calculer le Khi2

NormalityThreshold

Seuil de normalité



Fonction Select

La fonction Select permet de lancer une nouvelle sélection.

Select() : status

La fonction arrête la sélection en cours et relance une nouvelle sélection avec les paramètres actifs. La fonction retourne avant que la sélection ne soit terminée. Son statut indique vrai si le calcul est en cours au moment ou la fonction retourne.

L’exemple suivant montre la sélection des produits de la semaine courante.

plSuivi ProdHistogram, " L982.Produits ", 100, 100, 200, 150 ,, ;

...

On bouton.Click do begin

plSuivi.Stop() ; // Arrêtons le calcul en cours éventuel

plSuivi.Begin = now() ;

plSuivi.Period = 5 ;

plSuivi.Select() ;

end

Fonction Stop

La fonction stop permet d’arrêter un calcul en cours

Stop() : status

Cela est utile en particulier lorsque l’on doit relancer une nouvelle sélection et que l’on ne souhaite pas avoir des effets de bord sur la sélection restée active avec les nouveaux paramètres (voir l’exemple précédent).

Fonction MeasureList

La fonction MeasureList permet de rendre la liste de toutes les mesures définies dans la base produit associée au composant Histogramme, c'est à dire dans une chaîne de caractère dont chacun des champs est séparé du suivant par une tabulation.



MeasureList(): String

Composant Suivi du procédé

Un composant PrcLog permet d’intégrer une fenêtre Suivi de procédé dans un synoptique. Le composant est associé à une base procédé et possède les mêmes propriétés qu’une fenêtre de Suivi de procédé normale.

Nom PrcLog, Base-procédé, X, Y, W, H, DrapeauxActives, DrapeauxInhibes ;

L’exemple suivant ouvre une fenêtre Suivi de procédé liée à la base produit L982.Process :

plSuivi PrcLog, " L982.Process ", 100, 100, 200, 150, WS_VISBLE, ;

Le composant PrcLog n’a pas de constante Windows spécifique.

Un composant PrcLog introduit des variables et des fonctions qui correspondent aux critères applicables dans la boite à option de la fenêtre de Suivi de procédé normale. De cette manière on peut effectuer toutes les interrogations de manière programmée.

Ce composant comprend les variables suivantes :

Nom

Description

Begin

Date de début de sélection

End

Date de fin de sélection

Period

Période de sélection ( 0 période particulière, 1 seconde, 2 minute, 3 heure, 4 Equipe, 5 jour, 6 semaine, 7 mois, 8 année)1.

Team

Equipe sélectionné (0 première équipe définie, …); ce champ est valide si Period vaut Equipe2

WithShift

Mettre à un si on veut sélectionner en fonction de la plage horaire

ShiftBegin

Heure de début de la plage horaire ( Nombre de seconde depuis minuit)

ShiftEnd

Heure de fin de la plage horaire (idem)



Fonction Select

La fonction Select permet de lancer une nouvelle sélection.

Select() : status

La fonction arrête la sélection en cours et relance une nouvelle sélection avec les paramètres actifs. La fonction retourne avant que la sélection ne soit terminée. Son statut indique vrai si le calcul est en cours au moment ou la fonction retourne.

L’exemple suivant montre la sélection des produits de la semaine courante.

plSuivi PrcLog, " L982.Produits ", 100, 100, 200, 150 ,, ;

...

On bouton.Click do begin

plSuivi.Stop() ; // Arrêtons le calcul en cours éventuel

plSuivi.Begin = now() ;

plSuivi.Period = 5 ;

plSuivi.Select() ;

end

Fonctio Stop

La fonction stop permet d’arrêter un calcul en cours

Stop() : status

Cela est utile en particulier lorsque l’on doit relancer une nouvelle sélection et que l’on ne souhaite pas avoir des effets de bord sur la sélection restée active avec les nouveaux paramètres (voir l’exemple précédent).

Composant Pareto des modes de marche

Un composant PrcPareto permet d’intégrer une fenêtre Pareto des modes de marche dans un synoptique. Le composant est associé à une base procédé et possède les mêmes propriétés qu’une fenêtre de Pareto des modes de marche normale.

Nom PrcPareto, Base-procédé, X, Y, W, H, DrapeauxActives, DrapeauxInhibes ;

L’exemple suivant ouvre une fenêtre Pareto des modes de marche liée à la base produit L982.Process :

plSuivi PrcPareto, " L982.Process ", 100, 100, 200, 150, WS_VISBLE, ;

Le composant PrcPareto n’a pas de constante Windows spécifique.

Un composant PrcPareto introduit des variables et des fonctions qui correspondent aux critères applicables dans la boite à option de la fenêtre de Pareto des modes de marche normale. De cette manière on peut effectuer toutes les interrogations de manière programmée.

Ce composant comprend les variables suivantes :

Nom

Description

Begin

Date de début de sélection

End

Date de fin de sélection

Period

Période de sélection ( 0 période particulière, 1 seconde, 2 minute, 3 heure, 4 Equipe, 5 jour, 6 semaine, 7 mois, 8 année)1.

Team

Equipe sélectionné (0 première équipe définie, …); ce champ est valide si Period vaut Equipe2

WithShift

Mettre à un si on veut sélectionner en fonction de la plage horaire

ShiftBegin

Heure de début de la plage horaire ( Nombre de seconde depuis minuit)

ShiftEnd

Heure de fin de la plage horaire (idem)

WithLot

Mettre à un si on veut sélectionner en fonction de la référence et/ou de la série



Fonction Select

La fonction Select permet de lancer une nouvelle sélection.

Select() : status

La fonction arrête la sélection en cours et relance une nouvelle sélection avec les paramètres actifs. La fonction retourne avant que la sélection ne soit terminée. Son statut indique vrai si le calcul est en cours au moment ou la fonction retourne.

L’exemple suivant montre la sélection des produits de la semaine courante.

plSuivi PrcPareto, " L982.Produits ", 100, 100, 200, 150 ,, ;

...

On bouton.Click do begin

plSuivi.Stop() ; // Arrêtons le calcul en cours éventuel

plSuivi.Begin = now() ;

plSuivi.Period = 5 ;

plSuivi.Select() ;

end

Fonction Stop

La fonction stop permet d’arrêter un calcul en cours

Stop() : status

Cela est utile en particulier lorsque l’on doit relancer une nouvelle sélection et que l’on ne souhaite pas avoir des effets de bord sur la sélection restée active avec les nouveaux paramètres (voir l’exemple précédent).

Composant Carte de contrôle

Un composant SpcView permet d’intégrer une fenêtre Carte de contrôle dans un synoptique. Le composant est associé à une base produit et possède les mêmes propriétés qu’une fenêtre de Carte de contrôle normale.

NomDeSuivi SpcView, Base-produit, X, Y, W, H, DrapeauxActives, DrapeauxInhibes ;

L’exemple suivant ouvre une fenêtre Carte de contrôle liée à la base produit L982.Produits :

plSuivi SpcView, " L982.Produits ", 100, 100, 200, 150, WS_VISBLE, ;

Le composant SpcView n’a pas de constante Windows spécifique.

Un composant SpcView introduit des variables et des fonctions qui correspondent aux critères applicables dans la boite à option de la fenêtre de Carte de contrôle normale. De cette manière on peut effectuer toutes les interrogations de manière programmée.

Ce composant comprend les variables suivantes :

Nom

Description

Begin

Date de début de sélection

End

Date de fin de sélection

Period

Période de sélection ( 0 période particulière, 1 seconde, 2 minute, 3 heure, 4 Equipe, 5 jour, 6 semaine, 7 mois, 8 année)1.

Team

Equipe sélectionné (0 première équipe définie, …); ce champ est valide si Period vaut Equipe2

WithShift

Mettre à un si on veut sélectionner en fonction de la plage horaire

ShiftBegin

Heure de début de la plage horaire ( Nombre de seconde depuis minuit)

ShiftEnd

Heure de fin de la plage horaire (idem)

WithLot

Mettre à un si on veut sélectionner en fonction de la référence et/ou de la série

Model

Référence, indéfinir si on ne veut sélectionner qu’en fonction de la série

MReq

Série, indéfinir si on ne veut sélectionner qu'en fonction de la référence

WithRange

Mettre à un si on veut sélectionner en fonction de la gamme opérationnelle

Range

Gamme opérationnelle, on conserve les produits qui ont réalisés au moins une des fonctions précisées dans Range.

Measure

Numéro de la mesure

PPC

Points par carte

SPP

Echantillons par points

Interval

Intervalle entre deux groupes d’échantillons

XMean

Moyenne aux X

UCLX

Limite de contrôle supérieure aux X

LCLX

Limite de contrôle inférieure aux X

SMean

Ecart-type moyen

UCLS

Limite de contrôle supérieure aux S

LCLS

Limite de contrôle inférieure aux S

NormalityThreshold

Seuil de normalité

Anomalies

Mot binaire sélectionnant les anomalies à détectée (e 1 à 2 puisance NbAnomalies)



Fonction Select

La fonction Select permet de lancer une nouvelle sélection.

Select() : status

La fonction arrête la sélection en cours et relance une nouvelle sélection avec les paramètres actifs. La fonction retourne avant que la sélection ne soit terminée. Son statut indique vrai si le calcul est en cours au moment ou la fonction retourne.

L’exemple suivant montre la sélection des produits de la semaine courante.

plSuivi SpcView, " L982.Produits ", 100, 100, 200, 150 ,, ;

...

On bouton.Click do begin

plSuivi.Stop() ; // Arrêtons le calcul en cours éventuel

plSuivi.Begin = now() ;

plSuivi.Period = 5 ;

plSuivi.Select() ;

end

Fonction Stop

La fonction stop permet d’arrêter un calcul en cours

Stop() : status

Cela est utile en particulier lorsque l’on doit relancer une nouvelle sélection et que l’on ne souhaite pas avoir des effets de bord sur la sélection restée active avec les nouveaux paramètres (voir l’exemple précédent).

Fonction NbMeasure

La fonction NbMeasure permet de connaître le nombre de mesure enregistrées dans la base-produit.

NbMeasure() : int

Composant Carte de contrôle active

Un composant SpcCard permet d’intégrer une fenêtre Carte de contrôle active dans un synoptique. Le composant est associé à une carte de contrôle active et possède les mêmes propriétés qu’une fenêtre de Carte de contrôle active normale.

NomDeSuivi SpcCard, Base-produit, X, Y, W, H, DrapeauxActives, DrapeauxInhibes ;

L’exemple suivant ouvre une fenêtre Carte de contrôle active liée à la base produit L982.Produits :

scSuivi SpcCard, " TensionsX.cc ", 100, 100, 200, 150, WS_VISBLE, ;

Le composant SpcCard n’a pas de constante Windows spécifique.

Un composant SpcCard introduit des variables qui correspondent aux critères applicables dans la boite à option de la fenêtre de Carte de contrôle active normale. Il ne possèdent donc pas de possibilité de modifier la période de temps, ni tout autre critère puisqu’une carte de contrôle active ne conserve que les PPC derniers points.

Ce composant comprend les variables suivantes :

Nom

Description

PPC

Points par carte

SPP

Echantillons par points

Interval

Intervalle entre deux groupes d’échantillons

XMean

Moyenne aux X

UCLX

Limite de contrôle supérieure aux X

LCLX

Limite de contrôle inférieure aux X

SMean

Ecart-type moyen

UCLS

Limite de contrôle supérieure aux S

LCLS

Limite de contrôle inférieure aux S

NormalityThreshold

Seuil de normalité

Anomalies

Mot binaire sélectionnant les anomalies à détectée (e 1 à 2 puissance NbAnomalies)



Composant Journal d’alarme

Un composant AlarmList1 permet d’intégrer une fenêtre Journal des alarmes dans un synoptique. Le composant est associé à une base alarme et possède les mêmes propriétés qu’une fenêtre de Journal des alarmes normale.

NomDeSuivi AlarmList, Base-alarme, X, Y, W, H, DrapeauxActives, DrapeauxInhibes ;

L’exemple suivant ouvre une fenêtre Journal des alarmes liée à la base produit L982.Produits :

plSuivi AlarmList, " L982.Incidents ", 100, 100, 200, 150, WS_VISBLE, ;

Le composant Alarm n’a pas de constante Windows spécifique, ni de variable, ni de fonction spécifique puisque que toutes les alarmes sont visualisées à l’écran.

Composant Pareto des alarmes

Un composant AlarmPareto permet d’intégrer une fenêtre Pareto des alarmes dans un synoptique. Le composant est associé à une base alarme et possède les mêmes propriétés qu’une fenêtre de Pareto des alarmes normale.

NomDeSuivi AlarmPareto, Base-alarme, X, Y, W, H, DrapeauxActives, DrapeauxInhibes ;

L’exemple suivant ouvre une fenêtre Pareto des alarmes liée à la base produit L982.Produits :

plSuivi AlarmPareto, " L982.Produits ", 100, 100, 200, 150, WS_VISBLE, ;

Le composant AlarmPareto n’a pas de constante Windows spécifique.

Un composant AlarmPareto introduit des variables et des fonctions qui correspondent aux critères applicables dans la boite à option de la fenêtre de Pareto des alarmes normale. De cette manière on peut effectuer toutes les interrogations de manière programmée.

Ce composant comprend les variables suivantes :

Nom

Description

Begin

Date de début de sélection

End