VK QuickView Cette documentation est destinée aux développeurs d'applications VK QuickView. Elle regroupe la description de certaines fonctionnalités qui ne sont pas décrites dans la documentation principale du produit. L'audit trail Avantages traçabilité des actions opérateur Conforme aux exigences GMP pour l'industrie pharmaceutique (par ex. de la Food and Drug Administration) Réduction des co¹ts d'ingénierie et de validation Idéalement adapté aux exigences des constructeurs de machines qui doivent remplir de sévères critères de qualité (par ex. livraison de machines et d'éléments d'installation devant être validées) Fonctions L' Audit trail remplit les principales exigences de GMP (Good Manufacturing Practice) ainsi que celles de la FDA (Food and Drug Administration) selon 21 CFR Part 11. L' Audit facilite la construction de machines pour les branches travaillant avec des applications nécessitant des validations, étant donné que des fonctions indispensables pour remplir ces exigences sont déjà disponibles comme standard. De cette manière, les différentes machines ou éléments d'installation peuvent déjà être qualifiés chez le fournisseur. En même temps, les audit trails assurent la traçabilité du processus de fabrication, comme l'exige par ex. la directive européenne 178/2002 pour l'industrie agro-alimentaire dans une optique d'amélioration de la qualité des produits. Enregistrement d'actions opérateur dans les audit trails En exploitation, tous les changements de variables intéressant GMP (Good Manufacturing Practice) et les actions opérateur sont enregistrés comme audit trails dans un fichier CSV. Il peut s'agir par exemple de la saisie de valeurs process, du démarrage de recettes ou d'un acquittement de messages ou encore de messages relatifs à la gestion des utilisateurs, tels que la connexion et la déconnexion d'un utilisateur. Cela permet alors de voir précisément qui a fait quoi - et ce pour un travail de configuration minimal. En plus, un procédé de Checksum vérifie que les données dans l'audit trail sont exemptes de manipulations. Archivage et journalisation L' Audit Trail permet l'archivage et la journalisation dans le PC localement ou dans un répertoire réseau. Cela facilite ainsi la réalisation de solutions pour l'archivage à long terme et la restauration des données. Configuration Pour fonctionner, une configuration minimum est demandée. Dans le répertoire WQVFiles, le fichier "AuditTrail.ini" doit être présent. Dans ce fichier, la session [System] doit contenir le mot clef suivant: [System] AuditTrailPath=C:\VK-WinQV\AuditTrail Le nom du répertoire peut être défini avec un autre répertoire sur la machine en local ou un répertoire sur un disque réseau à votre convenance. Afficher l'audit trail Pour afficher l'audit trail il faut utiliser le programme AuditTrailViewer.exe. Ce programme a été installé lors de l'installation de QuickView sur votre système. Lancer le programme et la page principale de celui-ci s'affichera: Lors du premier démarrage de l'application il faut définir le répertoire contenant l'Audit Trail. Celui-ci doit correspondre au répertoire défini dans la configuration. l'icône représentant un symbole OK indique que les fichiers de l'audit n'ont pas été altérés ou modifiés. Si l'un des fichiers a été modifié, le symbole OK est remplacé par le symbole X signifiant ce fait. Fonctionnement La génération des enregistrements Des routines d'enregistrement ont été ajoutées dans le programme client ainsi que dans le serveur. Chaque fois qu'une opération est effectuée par un utilisateur, celle-ci est enregistrée dans le fichier. Les fichiers sont sauvegardés selon la hiérarchie suivante : Répertoire de sauvegarde/Nom du PC/année/mois/jour/ClientAuditTrail.csv pour le client et Répertoire de sauvegarde/Nom du PC/année/mois/jour/ServerAuditTrail.csv pour le serveur Un compteur d'enregistrement est maintenu dans un fichier texte séparé : Répertoire de sauvegarde/Nom du PC/ClientAuditTrailCounter.ini pour le client et Répertoire de sauvegarde/Nom du PC/ServerAuditTrailCounter.ini pour le serveur. Le nom du répertoire de sauvegarde est défini dans un mot clef du fichier de configuration de l'audit trail soit, AuditTrail.ini[System]AuditTrailPath=Nom du répertoire de sauvegarde. Si ce mot clef n'est pas défini, la fonction " AuditTrail " est désactivée. La visualisation des enregistrements Un programme séparé permet la visualisation et l'impression de l'audit trail. Il vérifie la validité des enregistrements en vérifiant le checksum de chacun d'entre eux. Il vérifie également la continuité des numéros d'enregistrement pour assurer qu'aucun d'entre eux n'ai été effacé. Une marque " Check " verte est affichée si le fichier visualisé est intègre. Dans le cas contraire, une marque " Stop " rouge informe l'utilisateur que l'audit a été manipulé. Le programme de visualisation permet à l'utilisateur de choisir une date ou une période et affiche tous les enregistrements de tous les PC (client et serveur). Les enregistrements dont le checksum n'est pas valide sont affichés en rouge. La discontinuité dans la numérotation des enregistrements est également indiquée en rouge. l'impression des enregistrements est possible. l'exportation sous forme de fichier pdf est également possible. Les enregistrements sont affichés sous forme de table avec les colonnes suivantes : Nom Description PcID Nom du PC ProgramID Client ou Server RecordID Numéro d'enregistrement TimeStamp Date et heure UTC d'enregistrement UserID Nom de l'utilisateur. ObjectID Variable ou objet ayant été modifié. Description Description de la modification Comment Commentaire éventuel Le format des fichiers Les fichiers sont de type csv. Le séparateur de liste est le point-virgule. Les champs suivants sont utilisés : Nom Type Description RecordID Integer Numéro d'enregistrement TimeStamp DateTObjectNameime Date et heure UTC d'enregistrement au format DD.MM.YYYY HH :mm :SS UserID String Nom de l'utilisateur. ObjectID String Variable ou objet ayant été modifié. Description String Description de la modification Comment String Commentaire éventuel Checksum Integer CRC32 de l'enregistrement. Chaque fichier commencera par la description des champs soit : "RecordID";"TimeStamp";"UserID";"ObjectID";"Description";"Comment";"Checksum" Calcul de la checksum Le checksum correspond au CRC32 du string correspondant au record sans le champ checksum mais dernier séparateur inclus. La procédure de calcul est la suivante : const CRC32Table: ARRAY[0..255] OF DWORD = ($00000000, $77073096, $EE0E612C, $990951BA, $076DC419, $706AF48F, $E963A535, $9E6495A3, $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988, $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91, $1DB71064, $6AB020F2, $F3B97148, $84BE41DE, $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC, $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5, $3B6E20C8, $4C69105E, $D56041E4, $A2677172, $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B, $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59, $26D930AC, $51DE003A, $C8D75180, $BFD06116, $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, $2802B89E, $5F058808, $C60CD9B2, $B10BE924, $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D, $76DC4190, $01DB7106, $98D220BC, $EFD5102A, $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433, $7807C9A2, $0F00F934, $9609A88E, $E10E9818, $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01, $6B6B51F4, $1C6C6162, $856530D8, $F262004E, $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457, $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C, $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2, $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, $4369E96A, $346ED9FC, $AD678846, $DA60B8D0, $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9, $5005713C, $270241AA, $BE0B1010, $C90C2086, $5768B525, $206F85B3, $B966D409, $CE61E49F, $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD, $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A, $EAD54739, $9DD277AF, $04DB2615, $73DC1683, $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8, $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1, $F00F9344, $8708A3D2, $1E01F268, $6906C2FE, $F762575D, $806567CB, $196C3671, $6E6B06E7, $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5, $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252, $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B, $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60, $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, $CB61B38C, $BC66831A, $256FD2A0, $5268E236, $CC0C7795, $BB0B4703, $220216B9, $5505262F, $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04, $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D, $9B64C2B0, $EC63F226, $756AA39C, $026D930A, $9C0906A9, $EB0E363F, $72076785, $05005713, $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38, $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21, $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E, $81BE16CD, $F6B9265B, $6FB077E1, $18B74777, $88085AE6, $FF0F6A70, $66063BCA, $11010B5C, $8F659EFF, $F862AE69, $616BFFD3, $166CCF45, $A00AE278, $D70DD2EE, $4E048354, $3903B3C2, $A7672661, $D06016F7, $4969474D, $3E6E77DB, $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9, $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6, $BAD03605, $CDD70693, $54DE5729, $23D967BF, $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94, $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D); function _CRC32(AStream : TStream) : Cardinal; var aMemStream : TMemoryStream; aValue : Byte; begin aMemStream := TMemoryStream.Create; try Result := $FFFFFFFF; while AStream.Position < AStream.Size do begin // Lecture d'un bloc de données aMemStream.Seek(0, soFromBeginning); if ((AStream.Size - AStream.Position) >= 1024*1024) then begin aMemStream.CopyFrom(AStream, 1024*1024); end else begin aMemStream.Clear; aMemStream.CopyFrom(AStream, AStream.Size-AStream.Position); end; //Calcul du CRC du bloc aMemStream.Seek(0, soFromBeginning); while aMemStream.Position < aMemStream.Size do begin aMemStream.ReadBuffer(aValue, 1); Result := (Result shr 8) xor CRC32Table[aValue xor (Result and $000000FF)]; end; end; Result := not Result; finally aMemStream.Free; end; end; function CalculateCRC32(AString : String) : Cardinal; var aStringStream : TStringStream; begin aStringStream := TStringStream.Create(AString); Result := $FFFFFFFF; try result:=_CRC32(aStringStream); finally aStringStream.Free; end; end; Les types d'objet Les objets suivants sont possibles: Objets Description *System* Audit auto-générés par l'application Users accounts Tout ce qui concerne les comptes des utilisateurs : login, logout, add user, delete user, modify user, etc. Application Tout ce qui concerne l'application : Démarrage, Arrêt,... DataBank Tout ce qui concerne l'écriture dans un registre ou dans un bit Access Level Tout ce qui concerne les niveaux d'accès Settings Tout ce qui concerne les modifications de la configuration Commands Toutes les commandes envoyées au serveur : ajout d'une charge, effacement d'un charge, mise en service d'une position, etc. HoistsAndShuttles Toutes les commandes concernant les transporteurs et les transferts. Rectifiers Toutes les commandes concernant les redresseurs Dosing Toutes les commandes concernant les pompe doseuses, Loading Toutes les commandes concernant le chargement Sequence Editor Toutes les opérations sur les fichiers "séquence" Sequence Step Toutes les modifications sur les pas de séquence Sequence Step Job Toutes les modifications sur les jobs d'un step de séquence Equipement Control Editor Toutes les opérations sur les fichiers de commandes d'équipement Equipement Control Position Toutes les opérations sur les commandes d'une position Equipement Control Step Toutes les opérations sur les steps d'une position dans une commande d'équipement Machine Mode Editor Toutes les modifications sur les modes machine Machine Mode Step Toutes les modifications sur les steps d'un mode machine Machine Mode Execution Toutes les opérations effectuées avec les modes machine Clock Schema Editor Toutes les opérations effectuées sur l'éditeur de schéma de l'horloge Clock Schema Step Toutes les opérations effectuées sur les pas d'schéma de l'horloge Sequencer Editor Toutes les opérations effectuées dans l'éditeur de "sequencer" Sequencer Execution Tous les lancements de sequencer. Start/Stop Clock Tous les démarrages et arrêt de l'horloge TouchScreen Content Chemical product Tous les ajouts de produits chimiques La fonction "Pick/Put-to-Light" Lorsque QuickView est utilisé sur une machine manuelle (sans robot), la fonction "Pick/Put-to-Light" est utilisée pour suivre/indiquer les manipulations faites/à faire pas l'opérateur. Jusqu'à la version 10.26, cette fonction était réalisée dans l'automate programmable. A partir de la version 10.27, il sera possible d'utiliser un nouveau driver de communication avec des boutons tactiles Banner. La communication avec ces boutons est effectuée à l'aide du protocole ModBus RTU sur une ligne série RS-485. Configuration des robots virtuels Pour pouvoir utiliser la fonction "Pick/Put-to-Light", un ou des robots virtuels doivent être définis. Ceci se fait dans le fichier VKServer.ini dans les sections [Hoist1]..[HoistX]. Ces sections sont utilisées pour définir les robots de la machine. Dans le cas d'une machine manuelle, le type de robot doit être défini comme Type=CBSim2. Ce type de robot demande l'utilisation d'un DB de données ainsi qu'un DB de commande. Exemple de configuration: [Hoist1] Type=CBSim2 DbData=23 RegData=0 DbCommand=24 RegCommand=0 Le DB de données Dans ce DB, le statut du robot est simulé par le système. Le DB de données est défini avec les mots clef DBData=N° de DB et RegData=N° de registre. Un DB interne sera utilisé et celui-ci doit contenir 100 words. Exemple de DB de données: [DataBank23] Device=0 Channel=0 Level=0 Regi=0 Regf=100 Pool=-1 Le DB de commandes Ce DB sert à l'envoie des informations de destination et à la réception des données des boutons sur lesquels l'opérateur a pressé. Le DB de commande est défini à l'aide des mots clef DBCommand=N° de DB et RegCommand=N° de registre. Un DB de l'automate programmable ou du nouveau device BannerPicktolight sera utilisé. Exemple de DB de commandes: [DataBank24] Device=1 Channel=250 Regi=0 Regf=29 Pool=500 RegType=Word Le premier registre contient le n° de position sur laquelle le bouton a été pressé. Le deuxième registre contient le n° de position sur laquelle la montre connectée a simulé la pression sur le bouton. Le troisième registre correspond dans le Low-byte au n° de position sur laquelle la lampe doit être allumée et dans le High-byte la fonction à exécuter soit 1 pour une montée et 2 pour une descente. Dans le cas où la position ne serait pas équipée d'un bouton lumineux, l'automate (ou le driver) doit simuler la pression sur le bouton jusqu'à ce que le n° de la position de destination soit mis à zéro. Le device BannerPickToLight Le nouveau device se défini en utilisant un port série du PC. Un convertisseur COM vers RS-485 devra être utilisé pour permettre la connexion sur les boutons Banner. Exemple de définition du device: [Device1] Protocol=BannerPickToLight ComPort=3 BaudRate=19200 Parity=Even DataBits=8 StopBits=1 Timeout=1000 ConfigString=1:1,3:3,4:5..10 Le mot clef ConfigString permet de définir les boutons qui sont connectés sur le Bus. Il se compose d'une série de paires de chiffres X:Y séparées par une virgule. X correspondant au numéro de position et Y correspondant à l'adresse du bouton. Pour définir un suite de boutons consécutifs, il suffit de définir l'adresse par 2 chiffres séparés par deux points. Dans l'exemple ci-dessus, les boutons pour les positions 1,3,4,5,6,7,8 et 9 utilisent les adresses 1,3,5,6,7,8,9 et 10. Ce device possède 30 registres permettant de définir 3 opérateurs (couleurs) différents. Registre Couleur Fonction 0   Numéro de position sur laquelle l'opérateur a touché le bouton vert (lecture uniquement) 1   Numéro de position sur laquelle l'opérateur utilisant une montre connectée l'a spécifiée. 2 Vert Low-Byte: Numéro de position sur laquelle le bouton vert doit être allumé. High-Byte: fonction à effectuer 1=prendre 2=déposer 3   Position sur laquelle le bouton vert est allumé. 4   Numéro de position sur laquelle l'opérateur a touché le bouton rouge (lecture uniquement) 5   Numéro de position sur laquelle l'opérateur utilisant une montre connectée l'a spécifiée. 6 Rouge Low-Byte: Numéro de position sur laquelle le bouton rouge doit être allumé. High-Byte: fonction à effectuer 1=prendre 2=déposer 7   Position sur laquelle le bouton rouge est allumé. 8   Numéro de position sur laquelle l'opérateur a touché le bouton jaune (lecture uniquement) 9   Numéro de position sur laquelle l'opérateur utilisant une montre connectée l'a spécifiée. 10 Jaune Low-Byte: Numéro de position sur laquelle le bouton jaune doit être allumé. High-Byte: fonction à effectuer 1=prendre 2=déposer 11   Position sur laquelle le bouton jaune est allumé. 12   Mode de fonctionnement: 0=Run 1=Test vert 2=Test rouge 3=Test jaune 13   Erreur de communication bouton positions 1 à 15 14   Erreur de communication bouton positions 16 à 31 15   Erreur de communication bouton positions 32 à 47 16   Erreur de communication bouton positions 48 à 63 17   Erreur de communication bouton positions 64 à 79 18   Erreur de communication bouton positions 80 à 95 19   Erreur de communication bouton positions 96 à 111 20   Erreur de communication bouton positions 112 à 127 21   Réserve 22   Réserve 23   Réserve 24   Réserve 25   Réserve 26   Réserve 27   Réserve 28   Réserve 29   Réserve Diagramme de fonctionnement Le device PickToLightGateway Ce device utilise le réseau du PC pour envoyer et recevoir les données des boutons. Un module VK Pick-to-Light Gateway devra être utilisé pour permettre les échanges entre le PC et les boutons Banner. Exemple de définition du device: [Device1] Protocol=PickToLightGateway Address=192.168.11.3 Port=80 Timeout=1000 ConfigString=1:1,3:3,4:5..10 IOAlarm=28 Le mot clef ConfigString permet de définir les boutons qui sont connectés sur le Bus. Il se compose d'une série de paires de chiffres X:Y séparées par une virgule. X correspondant au numéro de position et Y correspondant à l'adresse du bouton. Pour définir un suite de boutons consécutifs, il suffit de définir l'adresse par 2 chiffres séparés par deux points. Dans l'exemple ci-dessus, les boutons pour les positions 1,3,4,5,6,7,8 et 9 utilisent les adresses 1,3,5,6,7,8,9 et 10. Le mot clef IOAlarm=N° d'I/O permet d'activer une alarme lorsqu'une charge doit être déplacer. L'alarme est annulée lorsque l'opérateur presse sur le bouton de la charge à déplacer. Dans l'exemple ci-dessus, l'I/O N° 28 sera activée lors d'une alarme. Cette I/O est du type Word. Chaque bit correspond à un numéro d'opérateur. Ce device possède 40 registres permettant de définir 6 opérateurs (couleurs) différents. Registre Opérateur Fonction 0 1 Numéro de position sur laquelle l'opérateur 1 a touché le bouton (lecture uniquement) 1 1 Réserve 2 1 Low-Byte: Numéro de position sur laquelle le bouton de l'opérateur 1 doit être allumé. High-Byte: fonction à effectuer 1=prendre 2=déposer 3 1 Position sur laquelle le bouton de l'opérateur 1 est allumé. 4 2 Numéro de position sur laquelle l'opérateur 2 a touché le bouton (lecture uniquement) 5 2 Réserve 6 2 Low-Byte: Numéro de position sur laquelle le bouton de l'opérateur 2 doit être allumé. High-Byte: fonction à effectuer 1=prendre 2=déposer 7 2 Position sur laquelle le bouton de l'opérateur 2 est allumé. 8 3 Numéro de position sur laquelle l'opérateur3  a touché le bouton  (lecture uniquement) 9 3 Réserve 10 3 Low-Byte: Numéro de position sur laquelle le bouton de l'opérateur 3 doit être allumé. High-Byte: fonction à effectuer 1=prendre 2=déposer 11 3 Position sur laquelle le bouton de l'opérateur 3 est allumé. 12 4 Numéro de position sur laquelle l'opérateur 4 a touché le bouton (lecture uniquement) 13 4 Réserve 14 4 Low-Byte: Numéro de position sur laquelle le bouton de l'opérateur 4 doit être allumé. High-Byte: fonction à effectuer 1=prendre 2=déposer 15 4 Position sur laquelle le bouton de l'opérateur 4 est allumé. 16 5 Numéro de position sur laquelle l'opérateur 5 a touché le bouton  (lecture uniquement) 17 5 Réserve 18 5 Low-Byte: Numéro de position sur laquelle le bouton de l'opérateur 5 doit être allumé. High-Byte: fonction à effectuer 1=prendre 2=déposer 19 5 Position sur laquelle le bouton de l'opérateur 5 est allumé. 20 6 Numéro de position sur laquelle l'opérateur 6 a touché le bouton  (lecture uniquement) 21 6 Réserve 22 6 Low-Byte: Numéro de position sur laquelle le bouton de l'opérateur 6 doit être allumé. High-Byte: fonction à effectuer 1=prendre 2=déposer 23 6 Position sur laquelle le bouton de l'opérateur 6 est allumé. 24   Couleur de l'opérateur 1: 0=OFF 1=Red 2=Green 3=Yellow 4=Blue 5=Magenta 6=Cyan 7=White 8=Amber 9=Rose 10=Lime Green 11=Orange 12=Sky blue 13=Violet 14=Spring Green 25   Couleur de l'opérateur 2 26   Couleur de l'opérateur 3 27   Couleur de l'opérateur 4 28   Couleur de l'opérateur 5 29   Couleur de l'opérateur 6 30   Mode flash à utiliser pour indiquer la dépose: 0=OFF 1=Steady 2=Flash 3=Strobe 11-20= N-Pulse (N=Index-10) (e.g. 13=3 pulses) 31   Mode de fonctionnement: 0=Run, 1=Test Opérateur 1, 2=Test Opérateur 2, 3=Test Opérateur 3, 4=Test Opérateur 4, 5=Test Opérateur 5, 6=Test Opérateur 6, 7=Configuration des boutons, 8=Reset Factory default, 9=Reset System, 10=Reset commun Address, 11=Reset state Mode, 12=Reset test mode 32   Configuration: 0=Off 1=Renvoie la configuration à la passerelle une seule fois, remis à zéro par le driver 33   Erreur de communication bouton positions 1 à 15 34   Erreur de communication bouton positions 16 à 31 35   Erreur de communication bouton positions 32 à 47 36   Erreur de communication bouton positions 48 à 63 37   Erreur de communication bouton positions 64 à 79 38   Erreur de communication bouton positions 80 à 95 39   Erreur de communication bouton positions 96 à 111 40   Erreur de communication bouton positions 112 à 127 41   Force la lampe de la position si>0 et < 128 42   Eteins la lampe de la position si>0 et < 128. Si =0 alors éteins toutes les lampes  43 Step de configuration 0=Pas en mode configuration 1=En mode configuration 44 Nombre de boutons à configurer 45 Prochain ID de configuration 46 Erreur RFID: 0=Pas d'erreur, 1=Pas de RFID détecté sur la position, 2=Le RFID ne correspond pas 47 Position sur laquelle l'alarme est intervenue 48 0=Mode RFID inactif, 1=Mode RFID actif Registres Modbus des boutons Pick-IQ Les registres suivants dont utilisés: Registre Adresse Fonction Valeur 6100 0 16 Max ID ID Max (broadcast) 6300-6301 16 0, 0 Reset state mode 6500 0 16 0 Reset test mode (broadcast) 6500 ID 16 1 Set test mode 7940 195 3 Lecture du statut commun 7940 195 16 Set commun ID  7941 ID 16 0 Effacement Latch 7942 ID 3 Lecture du statut 8701-8702 0 16 n, m n=Mode de fonctionnement: 0=OFF 1=Steady 2=Flash 3=Strobe 11-20= N-Pulse (N=Index-10) (e.g. 13=3 pulses)   m=couleur à utiliser (broadcast): 0=OFF 1=Red 2=Green 3=Yellow 4=Blue 5=Magenta 6=Cyan 7=White 8=Amber 9=Rose 10=Lime Green 11=Orange 12=Sky blue 13=Violet 14=Spring Green 8701-8702 ID 16 n,m n=Mode de fonctionnement, m=couleur à utiliser 8701-8702 0 16 0 ,0 All OFF (broadcast) 8701-8702 ID 16 0,0 Bouton OFF 8810-8811 0 16 0 , 195 Reset commun ID (broadcast) Travail avec des lecteurs RFID En parallèle avec les boutons, il est possible de vérifier que le bon bouclard est déposé dans une position à l'aide de lecteurs RFID. Il faut pour cela ajouter des antennes RFID sur les positions devant être contrôlées. Lorsque le bouclard est déposé dans une position équipée d'une antenne, le système vérifie que le RFID du bouclard correspond au RFID lu par l'antenne. Si le RFID correspond alors la charge est transférée dans la position. S'il ne correspond pas alors une alarme est générée. Sur les postes de charge, la vérification est également effectuée lors de la prise de la charge. Si les RFID ne correspondent pas alors une alarme est générée. Les alarmes possibles sont: DB Reg Bit Message 24 46 0 Aucun RFID détecté sur le poste de charge 24 46 1 Le RFID du bouclard ne correspond pas au RFID lu par l'antenne Pour définir les lecteurs RFID dans le système, il faut définir la section suivante: [RFID] CheckDB=25 ConfigReaders=1..3,47 Les mots clef ci-dessus permettent de définir les antennes. CheckDB permet de définir le Databank contenant les RFID lu sur les positions. Par exemple DB25. Ce Databank est composé du nombre de registres string correspondant aux positions machine. Le registre 1 correspond à la position 1, le 2 à la position 2, etc... ConfigReaders permet de définir sur quelles positions une antenne est installée. Dans l'exemple ci-dessus, des antennes sont installées sur les positions 1,2,3 et 47. Le registre 48 du Databank de commandes doit être =1 pour que la vérification par RFID soit fonctionnelle. Les boutons tactiles Banner EZ-Light ou Pick-IQ La société Banner propose le produit EZ-Light K50 Modbus Series Pick-to-Light Sensors ou Pick-IQ K50 Ces boutons doivent être connectés entre eux par un bus RS-485. Il existe des convertisseurs USB-RS-485 pour pouvoir les connecter sur un PC. La fiche technique peut être téléchargée ici. Installation typique A) CÔble "Single-Ended" (RK 4.5T-2/S2501) B) Tee (Truck RSC 2RKC 57) C) CÔble "Double-Ended" (Truck RK 4.5T-1-RS 4.5T/S2501) D) Résistance terminale (Banner EZL-RTM-M or F) Convertisseur FTDI USB-485 Pour connecter les boutons sur un PC, nous utiliserons le convertisseur USB-RS485-WE-1800-BT. VK Pick-to-Light Gateway Cette passerelle fonctionne à l'aide de messages UDP. Ces messages UDP consistent en un enregistrement JSON. A chaque commande, une réponse est attendue. Les messages contiennent tous un numéro de fonction et un numéro d'évènement. La réponse doit contenir le numéro d'événement du message reçu Liste des commandes Fonction 1: définition de la liste des boutons Cette fonction permet de définir la liste des boutons connectés sur la passerelle. PC->Passerelle Paramètres Type Description f integer =1 e integer Numéro d'évènement btn string Liste des ID des boutons séparée par ; Passerelle -> PC Paramètres Type Description f integer =9 (ack) e integer Même numéro d'événement que commande Exemple: PC->M5 : {"f":1,"e":12456,"btn":"1;2;3;4"} M5->PC : {"f":9,"e":12456} Fonction 2: interface avec un bouton Cette fonction permet d'allumer, d'éteindre ou de faire clignoter un bouton PC->Passerelle Paramètres Type Description f integer =2 e integer Numéro d'évènement btn integer ID du bouton clr integer Couleur du bouton: 0=OFF 1=Red 2=Green 3=Yellow 4=Blue (bouton Pick-IQ seulement) 5=Magenta (bouton Pick-IQ seulement) 6=Cyan (bouton Pick-IQ seulement) 7=White (bouton Pick-IQ seulement) 8=Amber (bouton Pick-IQ seulement) 9=Rose (bouton Pick-IQ seulement) 10=Lime Green (bouton Pick-IQ seulement) 11=Orange (bouton Pick-IQ seulement) 12=Sky blue (bouton Pick-IQ seulement) 13=Violet (bouton Pick-IQ seulement) 14=Spring Green (bouton Pick-IQ seulement) blk integer Type de lumière: 0=OFF 1=Steady 2=Flash 3=Strobe 11-20= N-Pulse (N=Index-10) (e.g. 13=3 pulses) Passerelle -> PC Paramètres Type Description f integer =9 (ack) e integer Même numéro d'événement que commande Exemple: PC->M5 : {"f":2,"e":12459,"btn":2,"clr":1,"blk":2} //Faire clignoter le bouton ID 2 en vert M5->PC : {"f":9,"e":12459} Fonction 3: Commandes pour tous les boutons Cette fonction permet d'allumer, d'éteindre ou de faire clignoter tous les boutons PC->Passerelle Paramètres Type Description f integer =3 e integer Numéro d'évènement clr integer Couleur des boutons (voir fonction 2) blk integer type de lumière (voir fonction 2) Passerelle -> PC Paramètres Type Description f integer =9 (ack) e integer Même numéro d'événement que commande Exemple: PC->M5 : {"f":3,"e":12874,"clr":2,"blk":1} // tous les boutons en rouge fixe M5->PC : {"f":9,"e":12874} Fonction 4: définition de l'adresse "remote" Cette fonction permet d'indiquer à la passerelle l'adresse et le port utilisés par le PC.  PC->Passerelle Paramètres Type Description f integer =4 e integer Numéro d'évènement Passerelle -> PC Paramètres Type Description f integer =9 (ack) e integer Même numéro d'événement que commande Exemple: PC->M5 : {"f":4,"e":32874} M5->PC : {"f":9,"e":32874} Fonction 5: information d'un redémarrage de la passerelle Cette fonction indique au PC que la passerelle a redémarré. Passerelle -> PC Paramètres Type Description f integer =5  Exemple: M5->PC : {"f":5} Fonction 6: information d'un bouton pressé Cette fonction indique que le bouton a été pressé. Passerelle -> PC Paramètres Type Description f integer =6 btn integer ID du bouton ayant été pressé Exemple: M5->PC : {"f":6,"btn":3} // le bouton 3 a été pressé Fonction 7: information d'un bouton relÔché Cette fonction indique que le bouton a été relÔché Passerelle -> PC Paramètres Type Description f integer =7 btn integer ID du bouton ayant été relÔché Exemple: M5->PC : {"f":7,"btn":3} // le bouton 3 a été relÔché Fonction 8: erreur de communication avec un bouton Cette fonction indique que le bouton ne répond pas Passerelle -> PC Paramètres Type Description f integer =8 btn integer ID du bouton ayant été pressé Exemple: M5->PC : {"f":8,"btn":3} // le bouton 3 ne répond pas Fonction 10: acquittement des erreurs Cette fonction permet d'acquitter les erreurs de communication avec les boutons: PC->Passerelle Paramètres Type Description f integer =10 e integer Numéro d'évènement Passerelle -> PC Paramètres Type Description f integer =9 (ack) e integer Même numéro d'événement que commande Exemple: PC->M5 : {"f":10,"e":2456} M5->PC : {"f":9,"e":2456} Les écrans de la passerelle Ecran principal Cet écran est affiché au démarrage de la passerelle. Les ID des boutons définis sont affichés sur cet écran. Si un bouton est allumé, son image est affichée dans la couleur sélectionnée. Sur l'image précédente, le bouton avec l'ID 1 est affiché en rouge. Lorsqu'une erreur de communication est détectée, une icône d'alarme est affichée à côté de l'image du bouton. Sur cette image, le bouton avec l'ID 5 est en erreur. Pour acquitter le défaut, il faut presser sur le bouton central. Le coin en haut à droite indique le mode de fonctionnement du Wifi. Les barres indiquent que le mode Wifi est activé et est connecté. Les lettres AP indique que le Wifi est en mode AccessPoint et est activé. Tous les écrans précédents indiquent un mode de fonctionnement en mode Marche (fonctionnement normal). Il est possible de changer de mode de fonctionnement en mode DEMO ou en mode TEST. Ce changement se fait en accédant au menu principal en maintenant enfoncé le bouton de gauche. Le menu s'affiche: Sélection du mode de fonctionnement Sélectionner le menu "Mode de fonctionnement" à l'aide des boutons gauche et droit en les pressant brièvement. Une fois le menu surligné, presser sur le bouton central. Les modes possibles sont affichés: Le mode "Arrêt": Le mode "Arrêt" ne fait rien (pas d'action sur les boutons). Le mode "Test": Pour démarrer le mode "Test", pressez sur le bouton central. Le mode "Test" fait clignoter chaque bouton en jaune, il faut ensuite presser sur le bouton pour passer au bouton suivant. Une fois pressé, le bouton s'allume en vert fixe et le prochain bouton clignote en jaune et ainsi de suite jusqu'à tous les boutons on été pressés. Le mode "DEMO": Pour démarrer le mode "DEMO", pressez sur le bouton central. Le mode "DEMO" affiche chaque bouton, les uns après les autres, dans toutes les couleurs possibles. Une fois la boucle terminée, celle-ci recommence avec le premier bouton et ceci indéfiniment jusqu'à ce que l'utilisateur arrête le fonctionnement en pressant sur le bouton central encore une fois. Les écrans de configuration Configuration de l'adresse Ethernet locale en mode cÔblé: L'adresse locale est l'adresse Ethernet de la passerelle en mode cÔblé (RJ-45) Configuration de l'adresse Ethernet distante (PC) en mode cÔblé: Configuration des boutons: Le premier menu permet de définir le type de bouton utilisé. Pour l'instant 2 types sont possibles: Le deuxième menu permet de définir les boutons utilisés: Pour définir un ID utilisé (adresse du bouton), déplacer le curseur à l'aide des flèches et sélectionner avec le bouton central pour activer/désactiver un ID. Configuration du WiFi: Il est possible de désactiver le WiFi, de fonctionner en mode Access Point ou de se connecter à un réseau WiFi existant. Fonctionnement direct sur Comport sans passer par la passerelle Le device peut également fonctionner directement sur un comport sans passer par la gateway. Pour cela, il faut définir le device comme suit: [Device1] Protocol=PickToLightGateway ComPort=3 BaudRate=19200 Parity=Even DataBits=8 StopBits=1 Timeout=500 ConfigString=1:16,2:1..12,14:17,15:13..15,18:19..21,21:22..31,31:18 De cette manière, tout le travail de communication avec les boutons est réalisé par le programme serveur sans passer par une passerelle. Les machines standards de galvanoplastie Introduction Les machines sont représentées de la manière suivante: Cette machine est composée de 2 branches avec un transfert au milieu. Il peut y avoir un grand nombre de configurations différentes: machine d'une seule branche, de plusieurs branches, machine affichée de gauche à droite ou de droite à gauche. La première branche affichée sur le haut ou en bas, etc... Bref, chaque machine a sa propre configuration. Pour permettre un affichage automatique, il faut prévoir une manière de spécifier la mise en page. La fenêtre d'affichage La fenêtre d'affichage peut soit être encrée dans le coin gauche de l'écran, soit flottante ou soit occuper tout le haut de l'écran. Le choix d'affichage est configuré en utilisant des mots clef ou en utilisant la page [Machine] de la boîte de dialogue [Settings]. Dans les premières versions de QuickView la machine était toujours affichée sur une seule rangée de gauche à droite ou l'inverse mais toutes les branches étaient affichées d'un seul tenant. Dans une version récente, les mots clef affichés sur la droite de la boîte ont été ajoutés permettant d'afficher les branches sur des rangées différentes. Cette évolution permet une représentation plus réaliste de la machine mais des problèmes interviennent lorsque plusieurs transferts sont présents. Il n'est pas possible certaines fois d'aligner les cuves pour que tous les transferts soient alignés. Pour corriger ce problème, un nouvelle manière de configurer la machine a été réalisée. Cette manière est décrite dans la section suivante. Langage de configuration Un langage de configuration a été créé. Ce langage a été inspiré du langage LOGO (wikipedia). Il permet de décrire comment les positions seront dessinées. Si le string de configuration est vide, l'affichage se ferra de gauche à droite et commencera à la cellule 0:0. Pour afficher la machine comme représentée ci-dessus, le string de configuration sera: 0R1:0,37R0:1 Explication: le string de configuration est composé de groupes de données séparés par des virgules. Dans notre exemple, le premier groupe indique que la position dont l'index est 0 (première position de la machine) est dessinée dans la cellule ayant les coordonnées 1:0. Les positions suivantes sont dessinées à droite de celle-ci. le deuxième groupe indique que la position dont l'index est 37 est dessinée dans la cellule ayant les coordonnées 0:1. Les positions suivantes sont dessinées à droite de celle-ci. A chaque changement de branche ou de direction ou pour indiquer un espacement, un nouveau groupe doit être défini. Autre exemple de string de configuration 0L27:2,28R0:0,54L25:1,55L18:1 Autre exemple de string de configuration 0L47:0,48R0:1,88R46:1 La grille de la machine La fenêtre principale de la machine est considérée comme une grille. Chaque cellule de la grille peut correspondre à une position de la machine: a marge à gauche et à droite. La largeur de ces marges correspond au minimum à la largeur d'une position divisée par 2. b longueur de la machine. Cette longueur correspond au maximum de positions d'une branche. Dans le dessin ci-dessus, le nombre maximum de positions des branches est de 15 positions. c largeur de la fenêtre d'affichage. d largeur d'une position. e hauteur d'un position. Cette hauteur correspond en général à la hauteur (g) divisée par 2 pour une machine à 2 branches. f fenêtre permettant l'affichage de messages. g hauteur de toutes les branches. h marge en haut et en bas de la fenêtre d'affichage. i hauteur de la fenêtre d'affichage. Le contenu d'une cellule de la grille Chaque cellule (numérotée ci-dessus de 1 à 30) peut comprendre la représentation d'une position ou peut être vide. La représentation d'une position est faite de la manière suivante: A Affichage d'un transporteur en-dessus de la position B Affichage d'un transporteur pouvant se déplacer en-dessus des autres transporteurs. Si ce type de transporteur n'est pas utilisé alors cet espace n'est pas affiché. C Numéro du transporteur D Charge sur le transporteur E Potence du transporteur en haut F Potence du transporteur ni en haut ni en bas G Potence du transporteur en bas H Cuve de la position I Numéro du porte-rack ou du programme J Charge dans la cuve K Information si la position est en service ou hors service L Numéro de la classe de traitement n° 2 (cette case n'est pas affichée si pas de classe de traitement secondaire définie) M Nom de la position N Indication qu'un mouvement de montée est prévu sur cette position O Numéro du transporteur devant effectuer un mouvement sur cette position P Indication qu'un mouvement de descente est prévu sur cette position Q Numéro d'identification de la position R Numéro de la classe de traitement n° 1 ( cette case n'est pas affichée si pas de classe de traitement primaire définie) S T Couvercle fermé sur la position Licence et clef de protection Pour fonctionner en production, le logiciel VKQuickView a besoin d'une clef de licence. Cette licence peut être soit une clef logicielle ou soit une clef matérielle de type USB Dongle. La clef logicielle La clef logicielle est installée lors de l'installation de VK QuickView. Il faut pour cela activer la case à cocher correspondante lors de l'installation: La clef logicielle est archivée dans le registre de Windows et demande donc des droits d'administration correspondants par conséquence. La clef logicielle correspond à 3 entrées du registre soit: Key0, Key1 et Key2. La première entrée (Key0) correspond aux options autorisées du logiciel. Cette clef est cryptée par rapport à la configuration matérielle de votre PC. La deuxième clef (Key1) correspond au numéro de clef de licence. C'est ce numéro qui apparaît dans la boîte About du logiciel. La troisième clef n'est pas utilisée mais doit être présente. La clef matérielle La clef matérielle est une clef USB de type Sentinel. Le driver de cette clef est installé lors de la procédure d'installation (la case à cocher est activée par défaut). Le numéro de la clef ainsi que les options autorisées sont mémorisés dans la clef. Le fichier de licence VK.lic Pour ajouter une option ou pour étendre la période de mise à jour, il était nécessaire de modifier la Key0 de la clef logicielle ou de modifier le contenu du dongle mais à partir de la version 10.27.0.0 et 9.60.0.0, un fichier crypté de licence a été introduit. Ce fichier se nomme VK.lic et doit se trouver dans le répertoire dans lequel se trouve les exécutables VKClient10.exe et VKServer10.exe. Organigramme de fonctionnement Le serveur HttpWebSocket Il est possible d'activer un serveur Http permettant de publier des pages statiques ainsi qu'un serveur WebSocket permettant de publier les changements des données du serveur. L'activation se fait au niveau du fichier dans la section [Http]. Le mot clef Enabled=1 doit être défini. Il faut également que la licence permette cette option. Le serveur WebSocket transmet les modifications des données du serveur sous la forme de messages JSON. Il peut également recevoir des commandes sous le même format. Le serveur http utilise http.sys, il faut donc configurer http.sys pour que le serveur puisse fonctionner. La configuration est réalisée avec l'utilitaire TMSHttpConfigTool.exe qui se trouve dans le répertoire Addon de QuickView. Lancer l'application en mode administrateur, l'écran suivant s'affiche: Ajouter une nouvelle règle en pressant sur le bouton [Add]: Le port est maintenant autorisé et le serveur peut être lancer. Les mots clef Dans la section [http], les mots clef suivants sont disponibles: Mot clef Type Description Enabled Boolean Vrai si la fonctionnalité est activée. BaseHttpURL String Adresse de base du serveur http HttpPort Integer Numéro du port http BaseWSURL String Adresse de base du serveur Websocket. Par défaut, l'adresse de base est /websocket WSPort Integer Numéro du port WebSocket. Par défaut, le port du WebSocket sera le même que le port http RootPath String Adresse du répertoire dans lequel les fichiers des pages htlm sont sauvegardés. Par défaut, definitionpath+\www DomainName String Nom du domain. Par défaut, + Exemple de définition: [HTTP] Enabled=1 httpPort=8484 Le protocole de communication Un protocole de communication spécialement conçu pour QuickView est implémenté. Les messages JSON sont formés comme suit: Exemple de message: { "function":"write", "register":10, "Data": { "programmode": true }} Les clients doivent se connecter sur le serveur à l'aide d'un websocket. Avant d'ouvrir le websocket, les clients devront s'identifier sur le serveur Web en effectuant un POST à l'adresse /auth avec comme paramètres "?username=xxx&pass=yyy". Les "userName" et "Password" correspondant aux identifiants de QuickView. Si l'identification est correct, le serveur renvoie un jwt ( JSon Web Token) enregistré dans un Cookie (jwtoken=.....). Lorsque le client ouvre le websocket, le serveur vérifie le contenu du token et accepte ou non son ouverture. Le token est valable 24 heures après quoi il est nécessaire de renouveler son identification si le websocket est fermé. Il est aussi possible d'utiliser le mode d'authentification basic des websocket pour se connecter. En utilisant ce schéma, le serveur attend le token Authorization: Basic xxxx dans l'entête de la requête de connexion (voir https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Authorization ). Les commandes possibles Pour pouvoir lire, écrire, etc... le protocole demande l'utilisation de commandes. Les commandes possibles sont décrit dans le tableau suivant: Commandes Description read Lecture du contenu d'un registre. Format de la commande "read" : {"function":"read", "register":n } {"function":"read", "databank":n } n étant un entier et correspond au numéro de registre désiré. write Écriture de données dans un registre. Format de la commande "write": {"function":"write", "register":n, "data": {json object}} {"function":"write", "databank":n, "reg":m, "bit":b, "value":true or false} {"function":"write", "databank":n, "reg":m, "value": number or "string"} n étant un entier correspondant au numéro de registre. data correspond à un objet JSOn qui est spécifique pour chaque registre.Lors de l'écriture dans un registre d'un databank, il faut spécifier le databand, le registre et la valeur pour une donnée complète du registre ou alors spécifier le bit et l'état de ce bit pour une valeur boolean. readall Demande le rafraîchissement de tous les registres du système. Le serveur renvoie tous les registres disponibles. Format de la commande "refreshall": {"function":"readall"} subscribe Souscrit au rafraîchissement d'un ou de plusieurs registres. Le serveur renvoie chaque changement d'un registre à tous les clients ayant souscrit à ce registre. Format de la commande "subscribe": {"function":"subscribe", "register":[x,y,z,...]} => souscrit aux changements de registres {"function":"subscribe", "databank":[x,y,z,...]} => souscrit aux changements des databanks {"function":"subscribe"} => souscrit à tous les changements unsubscribe Annule la souscription à un ou plusieurs registres. Format de la commande "unsubscribe": {"function":"unsubscribe", "register":[x,y,z,...]} => annule les souscriptions aux changements de registres {"function":"unsubscribe", "databank":[x,y,z,...]} => annule les souscriptions aux changements de databank {"function":"unsubscribe"} => annule toutes les souscriptions Les registres Les registres suivants sont disponibles: Registre Data Description 10 "modeprogram":boolean Statut du mode programme "modebuffer":boolean Statut du mode gare "simulation":boolean Vrai si en mode simulation "endofcycle":boolean Vrai si en fin de cycle "workingmode":integer Mode de fonctionnement (0:DIA/OPI, 1:Priority, 2:OSCILine) "timesynch":integer Nombre de secondes depuis le 01/01/1980. Permet de synchroniser les horloges Statuts de la machine 32 "DateOfData" : string Date des données au format yyyymmdd "Date" : string Date des données au format du PC "BatchesIn" : Integer Nombre de chargements "BatchesOut" : Integer Nombre de déchargements "IdleTime" : Integer Nombre de minutes avec poste de charge vide "ErrorStopTime" : Integer Nombre de minutess en stop causé par une alarme "ErrorWarningTime" : Integer Nombre de minutes en stop causé par une alarme système en Auto "ManuModeTime" : Integer Nombre de minutes en mode manuel "SafetyDoorTime" : Integer Nombre de minutes pendant lesquelles les portes sont ouvertes "PowerOnTime" : Integer Nombre de minute pendant lesquelles la machine est en marche "Utilization-RPT" : Integer (PowerOnTime-Idle Time)/Power On Time = % d'utilisation "Reliability" : Integer (Power On Time-Error Stop Time)/Power on Time = % Données journalières 33 "labels" : Array 0..23 of strings Heures "BatchsIn": Array 0..23 of integer Nombre de chargements par heure "BatchesOut": Array 0..23 of integer Nombre de déchargements par heure ... Comme registre 32 Données journalières sur 24 heures 40 "alarmcount":integer Nombre d'alarme en cours "alarms": array of alarm [ "evt":integer Type d'événement: 1=Rtn, 2=Ack, 3=Ala, 4=Wrn "num":integer Numéro de l'alarme "time":Time Heure de l'alarme "type":string Type de l'alarme "group":string Groupe de l'alarme "mess":string Message de l'alarme "val":float Valeur associée à l'alarme ] Liste des alarmes actives 42 "messagecount":integer Nombre de messages en cours "messages": array of message [ "evt":integer Type d'événement: 1=Rtn, 2=Ack, 3=Ala, 4=Wrn "num":integer Numéro du message "time":Time Heure du message "type":string Type du message "group":string Groupe du message "mess":string Texte du message "val":float Valeur associée au message ] Liste des messages actifs 2000 "positioncount":integer Nombre de positions dans la machine "hoistcount":integer Nombre de transporteurs dans la machine "positions":array of position [ "pos":integer Numéro de la position "name": string Nom de la position "flag":integer Flag de la position "addr":integer Adresse de la position "group":integer Numéro du groupe de la position "tank": integer Numéro de la cuve "disable":boolean Vrai si la position peut être mise hors service "width":integer Largeur de la position "process":integer Numéro de la page graphique "dist":integer Distance entre position précédente et centre de la position "branch";integer Numéro de la branche de la machine "num":integer Numéro de la position à afficher "layout":integer Layout de la position (0=standard, 1=en avant, 2=en arrière) ] "hoists":array of hoist [ "hoist":integer Numéro du transporteur "type":integer Type de transporteur "driptray":Boolean True si un bac d'égouttage est défini "halfup":Boolean True si le transporteur peut faire un up demi "pmin":integer Position minimale du transporteur "pmax":integer Position maximale du transporteur ] Définition de la machine 3000 "rectifiercount":integer Nombre de redresseur défini "rectifiers": array of rectifier [ "rectifier":integer numéro du redresseur "position":integer position dans laquelle se trouve le redresseur "name":string Nom du redresseur "status":integer Statut du redresseur "step":integer Step actuel du profil de courant "ahamn":boolean True si Ah "surface":float surface exposée "density":float densité de courant "current":float courant actuel "voltage":float tension actuelle "Q":float compteur Ah "QTheo:float quantité d'Ah théorique "QTheoAct:float écart actuel des Ah "QTotal":float totalisateur des Ah "setpoint":float consigne actuelle "reverse":float consigne actuelle inverse "maxU":float tension maximale "maxI":float courant maximum "minU":float tension à vide "minI":float courant max lorsque la tension min est appliquée "pcsetpoint":integer pourcentage de la consigne lorsque plusieurs redresseurs sont utilisés sur la même position "alternation":integer temps entre chaque alternance "surfaceflag":integer partie de la surface prise en considération "currentform":integer numéro du profil de courant "flag0":integer "flag1:integer "flag2:integer ] Les redresseurs 5001..5100 "device":integer Numéro du device utilisé dans QuickView (0=interne) "channel":integer Numéro du canal "db":integer Numéro du db de l'automate "regstart":integer Numéro du premier registre "regend":integer Numéro du dernier registre "registers": array of registre [ "reg":integer Numéro du registre "type":string Type de registre (byte,word,dword,real,string,int) "value": string | number | float Valeur du registre ] Contenu des databanks du serveur 12000 "ios" : array of IO [ "io" : Integer Numéro de l'I/O "Name" : string Nom de l'I/O "unit" : string Unité de l'I/O "type" : Integer Type d'I/O "db" : Integer Numéro du DB "reg" : Integer Numéro du registre "bit" : Integer Numéro du bit "mask" : Integer Mask à appliquer "flags" : Integer Flags de l'I/O "position" : Integer Position associée "min" : Integer Valeur minimum "max" : Integer valeur maximum "value" : Integer|boolean|string selon le type de variable ] Définition de toutes les I/O 12001..13999 "io" : Integer Numéro de l'I/O "Name" : string Nom de l'I/O "unit" : string Unité de l'I/O "type" : Integer Type d'I/O "db" : Integer Numéro du DB "reg" : Integer Numéro du registre "bit" : Integer Numéro du bit "mask" : Integer Mask à appliquer "flags" : Integer Flags de l'I/O "position" : Integer Position associée "min" : Integer Valeur minimum "max" : Integer valeur maximum "value" : Integer|boolean|string selon le type de variable I/O individuelle 14000 "io1" : Integer|Boolean|String Donnée de l'I/O 1 "io2": Integer|Boolean|String Donnée de l'I/O 2 ... "io1999": Integer|Boolean|String Donnée de l'I/O 1999 Données de toutes les I/O sans définition 14100 "hoistsdata" : array hoistType [ "hoist" : Integer Numéro du bras "ready" : Boolean Vrai si le transporteur est prêt "blockingalarms" : Integer Alarmes bloquantes "height" : Integer Hauteur actuelle "destheight" : Integer Hauteur de destination "position" : Integer Position actuelle "destination" : Integer Position de destination "mode" : Integer Mode du robot "movingleft" : Boolean Vrai si le robot se déplace à gauche "movingright" : Boolean Vrai si le robot se déplace à droite "movingup" : Boolean Vrai si le robot se déplace en haut "movingdown" : Boolean Vrai si le robot se déplace en bas "racknum" : Integer numéro de rack si présent sinon pas dans le record "rackstatus" : Integer statut du rack si présent sinon pas dans le record "rackprog" : Integer N° de programme du rack si présent sinon pas dans le record ] Données de tous les robots 14101 "positionsdist" : array PositionDist [ "position":integer numéro de position "dist":integer distance depuis le début de la machine ] "hoistsdist" : array HoistDist [ "hoist":integer numéro du transporteur "dist":integer distance actuelle depuis le début de la machine ] Content 14200 "positiondata" : array PositionDataType [ "position" : Integer Numéro de la position "racknum" : Integer numéro de rack si présent sinon pas dans le record "rackstatus" : Integer statut du rack si présent sinon pas dans le record "rackprog" : Integer N° de programme du rack si présent sinon pas dans le record "program": String Nom du programme du rack "ref": String Nom de la référence de la charge sur le rack "tmin": Integer Temps minimum défini "tmax": Integer Temps maximum défini "teff": Integer Temps d'entrée dans la position (temps en secondes) "disable" : Boolean Etat de la position si la position peut être mise hors service "inalarm" : Boolean Etat d'alarme de la position "ready" : Boolean Etat des équipements de la position par rapport au "Mode machine ready" ] Données d'état des positions 14300 json de la page graphique Données du dessin d'une page graphique 14301 "Registers" : array RegisterData [ "db":integer numéro du databank "reg":integer numéro du registre "type":string type du registre (integer, real, string) "value": integer or real or string valeur du registre ] Utilisation en tant que API Il est possible de faire des requêtes API sur le serveur. Pour obtenir les registres ci-dessus dans un GET HTTP, il faut effectuer les requêtes comme l'exemple suivant: Get http://localhost:8484/API?REGISTER=10 La réponse est un objet JSON comme suit: { "function":"write", "register":10, "Data": { "modeprogram": true, "modebuffer": true,..... }} Utilisation comme serveur Web Il est possible de fonctionner en tant que serveur web. Les fichiers doivent se trouver dans le répertoire RootPath . Dashboard Il est possible de faire fonctionner le site web avec Freeboard. Pour fonctionner, il faut décompresser le fichier www.zip et le placer dans le répertoire défini dans rootPath. Pour le lancer, il faut soit taper l'adresse web du site pour avoir l'éditeur de freeboard ou soit http://localhost:8484/index.html#source=dashboard.json pour lancer directement un dashboard prédéfini. Dans le fichier index.html, le bouton donnant l'accès aux modification du dashboard a été commenté. Pour permettre des modifications, il faut dé-commenter les lignes 48 à 96 et 110 à 111 La mesure d'épaisseur Activating the measurement function To activate the thickness measurement function, you must first open the "Settings" dialog box by clicking on the "Setting definition" menu: The "Settings" dialog box will be displayed: On the left panel, select "Machine" then check the "ShowMeasurementType" check box. Defining a sequence with measurement Once the "Measurement type" is activated, a new column is displayed in the sequence definition table: In this new column, you can select which position need a measurement. There are 3 measurement possibilities:? In place: means the load stays in the tank and the measurement is done in the position. On hoist: means the load is lifted by the hoist and the measurement is done on the air. In measurement position: means the load is transferred to a position dedicated to measurement. Running program with measurement When a thickness measurement is requested, the jig requiring the measurement will be displayed in flashing fuchsia in the machine: In order to open the measurement dialog box, you must right click on the load and select "Thickness measurement" in the popup menu: By clicking on this command, the following dialog box will be displayed: If the thickness is too low, you can enter an additional time in the corresponding field. You must also specify if, after this additional time, a new measurement is required or not. Once this 2 fields filled, the "continue" button becomes enabled. Click on "Continue" to add time or click on "Finished" to continue to the next sequence step. The "Cancel" button will only close the box. L'utilisation de VKQVRemoteDB Le programme VKQVRemoteDB est un programme fonctionnant en tant que service Windows. Ce programme maintient une connexion avec 2 bases de données MS SQL. Il est utilisé pour faire le lien entre le moteur de bases de données MS SQL et les applications VK QuickView en utilisant une liaison sécurisée https. Ce logiciel est utilisé lorsque la connexion directe sur la base de données ou l'utilisation de OBDC ne sont pas autorisées. Ce programme doit fonctionner sur un PC du réseau du client final (PC virtuel ou directement sur le PC sur lequel le moteur de bases de données est installé) . Schéma de fonctionnement La configuration du serveur La configuration du programme est enregistrée dans un fichier "texte" qui se trouve dans le même répertoire que le programme et se nomme VKQVRemoteDB.ini. Pour modifier la configuration, il faut lancer le programme en mode GUI. Ceci se fait de la manière suivante:? Arrêter le service VKQVRemoteDBService si celui-ci est en marche. Ouvrir une fenêtre de commande depuis le répertoire de l'application Taper VKQVRemoteDB.exe -gui La fenêtre de configuration s'affiche: Remplir les champs selon la configuration de votre serveur de bases de données Sauvegarder la configuration en cliquant sur File|Save Fermer la fenêtre pour terminer l'application puis relancer le service VKQVRemoteDBService Le programme utilise http.sys pour son serveur Web. Il faut donc réserver les ports et les chemins d'accès à l'aide de l'utilitaire TMSHttpConfig.exe qui est installé dans le répertoire "Addon" lors de l'installation de VK QuickView. Lancer le programme et la fenêtre suivante s'affiche: Sur cette fenêtre, il y a deux onglets "Url Acl" et "SSL". Dans la fenêtre "Url Acl" cliquer sur "Add". La fenêtre suivante s'affiche: Introduire l'url que vous désirez réserver soit http://+:1888/vkqvpart/ pour la connexion à la bibliothèque d'articles et http://+:1888/vkqvreport/ pour le suivi de charge. Il faut sélectionner "Everyone" pour que tous les utilisateurs puissent accéder à cette adresse. Dans le cas de l'utilisation d'une liaison sécurisée, les adresses a réservées doivent commencer par https:// et il faut également attribuer un certificat au port. L'attribution du certificat se fait dans l'onglet "SSL". Une fois ces réservations effectuées, le service VKQVRemoteDBService peut être lancé. Si le service n'a jamais été installé, il faut l'installer en lançant une fenêtre de commande en tant qu'Administrateur. Puis il faut taper VKQVRemoteDB.exe -install . Cette commande enregistrera le service dans Windows. Il faudra ensuite démarrer le service. Pour cela, il faut ouvrir les services et chercher le service "VKQV Remote Database Service" dans la liste, sélectionner le service et cliquer avec le bouton de droite puis sélectionner la commande "Propriétés" du menu popup. La boîte suivante s'affiche: Sélectionner "Automatique" dans type de démarrage. Puis cliquer sur "Démarrer". La configuration de QuickView Les bases de données configurées dans RemoteDB sont utilisées par VKClient10.exe ( bibliothèque d'articles) et VKServer10.exe ( rapport de suivi). La configuration du client La configuration du client se fait dans le fichier VKWinQV.ini dans la section "PartLibrary". Les mots clef suivants doivent être définis: Mot clef Type Valeur Description Type String REMOTEDB Le type de connexion utilisé par la bibliothèque. ConnectionString String http://localhost:1888 Adresse du serveur Web (VKQVRemoteDB.exe) Path String vkqvpart Chemin d'accès de la liaison PartMachineID Integer 0 Machine ou groupe de machines auquel est associé la bibliothèque de pièces LoadMachineID Integer 0 Machine ou groupe de machines auquel est associé la bibliothèque de charges ToolMachineID Integer 0 Machine ou groupe de machines auquel est associé la bibliothèque d'outillages ProcessMachineID Integer 0 Machine ou groupe de machines auquel est associé la bibliothèque de gammes UserName String Nom d'utilisateur pour accéder au serveur Web. Si pas défini, la valeur par défaut est utilisée. Password String Mot de passe pour accéder au serveur Web. Si pas défini, la valeur par défaut est utilisée. La configuration du serveur La configuration du serveur se fait dans le fichier VKServer.ini dans la section "RemoteDB". Les mots clef suivants doivent être définis: Mot clef Type Valeur Description Host String http://localhost:1888 Adresse du serveur Web (VKQVRemoteDB.exe) Path String vkqvreport Chemin d'accès de la liaison sqlFileName String _ODBC Extension du nom de fichier des scripts SQL utilisés pour créer les tables dans la base de données. Ces scripts sont générés automatiquement par le programme client dans le répertoire Dbase\SQL CreateTable Boolean 1 Indique au système s'il doit créer les tables lorsque celle-ci sont absentes de la base de données. UserName String Nom d'utilisateur pour accéder au serveur Web. Si pas défini, la valeur par défaut est utilisée. Password String Mot de passe pour accéder au serveur Web. Si pas défini, la valeur par défaut est utilisée Installation de plusieurs instances du programme Lorsque plusieurs instance du programme sont installées sur un poste, il faut créer un répertoire par instance. Les répertoires doivent contenir le programme .exe ainsi que son fichier de configuration. Il est important de donner un nom de service différent pour chaque instance du programme.  Des chemins d'accès différents doivent également être configurés. Le serveur OPC-DA Pour permettre la liaison entre VKQVRemoteDB et un autre programme, VK Vision a développé un serveur OPC-DA. Pour l'instant, ce serveur n'est utilisé que pour visualiser les données de la table TOOLS de la base de données d'articles mais il pourrait être étendu pour accéder à d'autres tables. Le programme serveur OPC s'appelle VKQVOPCRemoteDB.exe. Il est enregistré comme serveur COM lors de son installation. Le serveur OPC se nomme VKQVOPCRemoteDB.TVKQVRemoteDBOPCServer.1. Les variables accessibles sont: Variable Type Lecture/Ecriture Description VKQVREMOTEDB. TOOLS. SERVERADDRESS String R/W Adresse du serveur web (VKQVRemoteDB.exe). Lorsque l'on écrit dans cette variable, sa valeur est sauvegardée dans le fichier de configuration du programme. VKQVREMOTEDB. TOOLS. SERVERPATH String R/W Chemin d'accès du serveur Web. Lorsque l'on écrit dans cette variable, sa valeur est sauvegardée dans le fichier de configuration du programme. VKQVREMOTEDB. TOOLS. MACHINEID Integer R/W Numéro de machine correspondant à la table TOOLS. Lorsque l'on écrit dans cette variable, sa valeur est sauvegardée dans le fichier de configuration du programme. VKQVREMOTEDB. TOOLS. RFID String R/W Tag du RFID a lire VKQVREMOTEDB. TOOLS. REQUESTRFID Boolean R/W Demande de lecture de l'outillage correspondant au RFID ci-dessus. Lorsque l'on désire lire les informations correspondant à une étiquette RFID il faut premièrement introduire la valeur du tag désirée. Puis écrire "True" dans cette variable. Le serveur efface les champs d'information et se connecte sur VKQVRemoteDB pour rechercher un outillage ayant le même tag que celui demandé. Si un outillage est trouvé, le programme remplit les champs d'informations avec les données en provenance du serveur. Cette variable est ensuite écrite avec la valeur "False". Si le tag n'existe pas ou si la connexion ne peut pas être effectué alors la variable ERROR est positionnée avec une valeur négative et la variable est remise à "False". VKQVREMOTEDB. TOOLS. ERROR Integer R/W Résultat de l'opération sur le serveur. 0=OK, Valeur négative=erreur. VKQVREMOTEDB. TOOLS. DESCRIPTION String R Valeur correspondant à la description de l'outillage VKQVREMOTEDB. TOOLS. ID Integer R Valeur correspondant au champ ID de l'outillage VKQVREMOTEDB. TOOLS. REFERENCE String R Valeur correspondant au champ Référence de l'outillage VKQVREMOTEDB. TOOLS. TYPE String R Valeur correspondant au champ Type de l'outillage VKQVREMOTEDB. TOOLS. TOTALUSE Integer R Valeur correspondant au compteur de passage en machine de l'outillage VKQVREMOTEDB. TOOLS. TOTALUSELIMIT Integer R Valeur correspondant à la limite de passage avant alarme de l'outillage VKQVREMOTEDB. TOOLS. TOTALUSEGALVANIC Integer R Valeur correspondant au compteur de passage en machine dans des cuves galvaniques VKQVREMOTEDB. TOOLS. TOTALUSENOGALVANIC Integer R Valeur correspondant au compteur de passage en machine dans des cuves non galvaniques VKQVREMOTEDB. TOOLS. LOCATION Integer R/W Valeur correspondant à l'emplacement de l'outillage. Les valeurs possibles sont: 0: Indéterminé 1: Stockage 2: Production 3: Accrochage 4: Décrochage 5: Stripage VKQVREMOTEDB. TOOLS. SETLOCATION Boolean R/W Ecriture de l'emplacement de l'outillage correspondant à la variable RFID. Lorsque l'on désire modifier l'emplacement de l'outillage, il faut premièrement introduire la valeur de l'emplacement dans la variable ci-dessus. Il faut ensuite écrire "True" dans cette variable. Le serveur se connecte sur VKQVRemoteDB et enregistre l'emplacement de outillage ayant le même tag que celui défini dans la variable RFID. Si un outillage est trouvé, le programme remplit les champs d'informations avec les données en provenance du serveur. Cette variable est ensuite écrite avec la valeur "False". Si le tag n'existe pas ou si la connexion ne peut pas être effectué alors la variable ERROR est positionnée avec une valeur négative et la variable est remise à "False". VKQVREMOTEDB. TOOLS. CLEARTOTALUSE Boolean R/W Effacement du compteur de passage de l'outillage correspondant à la variable RFID. Lorsque l'on désire effacer le compteur de passage de l'outillage, il faut écrire "True" dans cette variable. Le serveur se connecte sur VKQVRemoteDB et effectue l'effacement du compteur outillage ayant le même tag que celui défini dans la variable RFID. Si un outillage est trouvé, le programme remplit les champs d'informations avec les données en provenance du serveur. Cette variable est ensuite écrite avec la valeur "False". Si le tag n'existe pas ou si la connexion ne peut pas être effectué alors la variable ERROR est positionnée avec une valeur négative et la variable est remise à "False". VKQVREMOTEDB. TOOLS. SETTOTALUSEMAX Boolean R/W Affectation du compteur de passage à sa valeur limite + 1. Lorsque l'on désire forcer la valeur limite de compteur de passage de l'outillage, il faut écrire "True" dans cette variable. Le serveur se connecte sur VKQVRemoteDB et effectue l'affectation du compteur outillage ayant le même tag que celui défini dans la variable RFID. Si un outillage est trouvé, le programme remplit les champs d'informations avec les données en provenance du serveur. Cette variable est ensuite écrite avec la valeur "False". Si le tag n'existe pas ou si la connexion ne peut pas être effectué alors la variable ERROR est positionnée avec une valeur négative et la variable est remise à "False". Le programme VKQVStripApp4RemoteDB Ce programme permet d'enregistrer le suivi de la démétallisation sur le serveur de rapports. Il permet également de mettre à zéro les compteurs de passages galvaniques et non galavaniques. Le programme se présente comme suit: La commande Options|Configuration permet d'accéder aux paramètres de l'application: Paramètres Type Description Sélèction d'un programme obligatoire Bool Indique au programme que l'utilisateur à l'obligation de choisir un programme dans la liste pour démarrer une démétallisation Nom de l'opérateur obligatoire Bool Indique au programme que l'utilisateur à l'obligation d'introduire son nom pour démarrer une démétallisation Remarque obligatoire Bool Indique au programme que l'utilisateur à l'obligation d'introduire une remarque pour démarrer une démétallisation Nom de la machine String Nom de la machine affiché sur les rapports: Numéro de la machine String Numéro de la machine affiché sur les rapports: Les programme pouvants être sélectionnés sont définis dans cette page de configuration. 30 noms de programmes peuvent être définis. Les connexions avec la base de données sont définies dans la page de configuration des connexions: Paramètre Type Description Adresse du serveur (outillages) String Adresse http ou https du serveur d'articles Nom d'accès (outillages) String Nom d'accès du serveur d'outillage: toujours "vkqvpart" Nom d'utilisateur (outillages) String Nom d'utilisateur permettant l'accès au serveur: toujours "vkvisionsa" Mot de passe (outillages) String Mot de passe permettant l'accès au serveur. ID machine (outillages) Integer Numéro de la machine utilisé pour les outillages. Ici 10. Adresse du serveur (suivi) String Adresse http ou https du serveur de rapports Nom d'accès (suivi) String Nom d'accès du serveur de rapports: toujours "vkqvreport" Nom d'utilisateur (suivi) String Nom d'utilisateur permettant l'accès au serveur: toujours "vkvisionsa" Mot de passe (suivi) String Mot de passe permettant l'accès au serveur. ID machine (suivi) Integer Numéro de la machine utilisé pour les rapports. Ici 4: Pour commencer, l'utilisateur introduit un numéro de référence de l'outillage. Si l'outillage est trouvé dans la base de données, les informations sur l'outillage sont affichées: Si la référence n'est pas trouvée dans la base de données, un message l'indique: Une fois les informations de la référence affichées, l'utilisateur doit introduire les données obligatoires: Le bouton de démarrage s'affiche en vert. L'utilisateur doit cliquer dessus pour démarrer la démétallisation. Lorsque la démétallisation à débutée, les champs d'informations sont grisés. Le numéro de la charge en cours est affiché en dessus du bouton STOP. Lors du démarrage, les compteurs sont remis à zéro et la date et le nom de l'opérateur sont actualisés. Lorsque l'utilisateur clique sur le bouton STOP, la date de fin de traitement est actualisée et le statut de la charge passe à "terminé". La forme est effacée et une nouvelle démétallisation peut être démarrée. La connexion à un broker MQTT Définition dans le serveur Dans tous les logiciels modernes, il est possible de publier des données pouvant être utilisées par d'autres applications. Dans QuickView, nous avons opter pour l'utilisation de MQTT. MQTT est une manière de publier des données selon un protocole standard (voir MQTT sur wikipedia ). Création d'un "UNS" (Unified Name Space) L'utilisation de MQTT doit se faire d'une manière standardisée en appliquant les standards ISA-95 dans l'architecture d'un UNS: Exemple d'un Unified Name Space: Dans l'exemple ci-dessus, ENTREPRISE, SITE et AREA correspondent à "Base Name". PRODUCTION LINE correspond à "Group Name". La configuration La configuration de la connexion se fait dans VKServer.ini. Une nouvelle section [MQTT] doit être créée. Il faut auparavant avoir obtenu la licence pour permettre cette connexion. La licence correspond à AMConnector car elle est aussi utilisée par VK A&M pour importer des données depuis QuickView. Exemple de configuration: [MQTT] Enabled=1 Host=192.168.11.31 Port=8883 SSlEnable=1 ClientID=VKQuickView GroupName=A34002 RefreshRate=30 Hierarchical=1 ForceIOType=0 AutoRestart=1 PublishRectifiers=1 PublishMachine=1 PublishCounters=1 PublishDailyData=1 ValueStyle=1 DecimalCount=2 La section [MQTT] Les mots clef suivants peuvent être définis: Mot clef Type Valeur par défaut Description Enabled Boolean 0 Doit être activé pour que la connexion soit créée. Host String vide Adresse du broker MQTT Port Integer 1883 Numéro du port TCP SSLEnable Boolean 0 Vrai si la connexion utilise Open SSL (TLSv1.1) pour une connexion sécurisée. Pour pouvoir travailler en mode SSL sécurisé, il faut placer les dll d'OpenSSL dans le même répertoire que QuickView (version 32bits, version testée: 1.0.2.18) ClientID String GUID Nom du client MQTT KeepAlive Integer 60 Temps en secondes pour garder la connexion en vie lorsqu'il n'y a pas de communication RefreshRate Integer 30 Temps en secondes pour l'exécution d'un rafraîchissement des variables Retain Boolean 0 Vrai si le contenu des variables doit être préservé sur le broker après la déconnexion. Si ce flag est activé, alors des messages seront renvoyés à tous les clients lors de leur connexion au broker. BaseName String VKQV Nom de base des topics. GroupName String MachineName Nom de publication du groupe. En général correspond au code de la machine par exemple: A34002 ForceIOType Boolean 1 Vrai si le type défini dans les I/O doit être respecté. Si faux alors le système utilise le type des registres des databanks. Hierarchical Boolean 0 Vrai pour forcer une hiérarchie dans la publication des variables par exemple: VKQV\23\Température actuelle. Si faux alors le système n'utilise pas le nom de la variable mais son numéro exemple: VKQV\924 PublishMachine Boolean 0 Vrai pour forcer la publication de la machine et des tableaux correspondants comme les redresseurs, les pompes doseuses. AutoRestart Boolean 1 Vrai pour forcer la reconnexion et le démarrage de la publication après une perte de connexion. ValueStyle Integer 1 Format des valeurs des variables: 0: (ISA-95) Tous les changement de variable sont envoyés dans le même topic soit: BaseName/GroupName/ToVKAM . Le format utilisé sera: { "Type":1, "Items":[{ "LB": "A34001/23/Température actuelle", "V": 12.4, "U":"°C","T":"Double"},{...}], "TS": "2019-04-06T13:46:15.145"}   1: (Legacy) {"V":12.4,"U":"°C","T":"Double","TS":"2019-04-06T13:46:15.145"} V=Value, U=Units, T=Type, TS=TimeStamp DecimalCount Integer 2 Nombre de décimales affichées dans les valeurs réelles UserName String vide Nom de l'utilisateur lorsqu'un login est demandé par le broker Password String vide Mot de passe lorsqu'un login est demandé par le broker Language Integer 0 Langue utilisée pour les textes des alarmes et messages PublishAlarm Boolean 0 Vrai pour forcer la publication des alarmes et des messages UsePosNumber Boolean 0 Vrai pour utiliser la valeur "display" de la position à la place de son index dans le nom des variables publiées. PublishIOs Boolean 0 Publie les IO dans l'items 'IOs' si le style ISA-95 est utilisé ItemValueOnly Boolean 0 Lorsque les I/O sont publiées avec le style ISA-95, si ce mot clef est activé alors les données des I/O seront publiées en valeurs numériques (sans TS, T et U) PublishDailyData Boolean 0 Vrai pour publier les données de fonctionnement journalier WillTopic String vide Nom du topic du will (utilisé seulement lorsque ValueStyle=1) Will String vide Contenu du will (utilisé seulement lorsque ValueStyle=1) QoS Integer 0 Qualité se service (0:At most once, 1: At least once, 2: Exactly once) La définition des variables dans QuickView Les variables sont définies dans les IO de QuickView. Le flag 'Q' doit être ajouté à toutes les variables devant être publiées vers MQTT. Ceci se fait soit manuellement dans le fichier IO.ini soit en utilisant le navigateur d'équipement de VKClient10. Exemple de définition dans [IO.INI]: ; Températures ; ============ 300=1,Actual Temperature A,W,RQ,15,0,$FFFF,10,100 301=1,Actual Temperature B,W,RQ,15,1,$FFFF,10,100 302=3,Actual Temperature,W,RQ,15,2,$FFFF,10,100 303=4,Actual Temperature,W,RQ,15,3,$FFFF,10,100 304=5,Actual Temperature,W,RQ,15,4,$FFFF,10,100 La publication des variables Le système publiera les I/O qui sont définies comme pouvant être publiées dans la définition ci-dessus. Il publiera également les valeurs globales de la machine comme par exemple la définition machine ou les redresseurs à condition que le mot clef "PublishMachine" soit activé. Les variables sont publiées sous forme d'un enregistrement au format JSON. Exemple: {"V":12.4,"U":"°C","T":"Double","TS":"2019-04-06T13:46:15.145"} Les topics de publication dépendent du mot clef "ValueStyle". 2 styles sont définis: 0-ISA-95: Style utilisé avec VKAM ayant une version > 3.0.0.2. et 1-Legacy: Style utilisé avec VKAM ayant une version <= 3.0.0.2 VariableStyle=ISA-95 Ce style utilise des topics prédéfinis dont voici la liste: Topics Description BaseName/GroupName/VKQV/Datas Topic dans lequel les changements des variables sont envoyés. Le format du topic sera le suivant:   {    "Type": int,    "Items": Array [                              {                                "LB": string,                                "V": object,                                "U": string,                                "T": string,                                "S": string                               },                              {                               ....                               }                            ],     "TS" : string }         Type: Type de message. Toujours 1 pour l'instant LB : Label de la variable V  : valeur de la variable U : unité de la variable T: type de la variable S: source de la variable TS: Timestamp   Exemple: { "Type":1, "Items":[{ "LB": "A34001/23/Température actuelle", "V": 12.4, "U":"°C", "T":"Double"},{"LB":"A34001/78/Conductivité", "V":2.44, "U":"mS", "T":"Double"}], "TS": "2019-04-06T13:46:15.145"} BaseName/GroupName/VKQV/Apps Topic dans lequel les clients se connectent à QuickView BaseName/GroupName/VKQV/Apps/ClientID Topic dans lequel le client ClientID publie ses commandes. BaseName/GroupName/VKQV/Apps/ClientID/Status Statut de la connexion avec le client ClientID. BaseName/GroupName/VKQV/Apps/ClientID/Status/Connection Topic dans lequel le client ClientID publie le statut de sa connexion. Exemple: {"TS":"2023-12-27T10:54:40.646125Z","T":"String","V":"Connected"} Ce topic est également désigné comme Last Will Topic lors de la connexion du client. BaseName/GroupName/VKQV/Apps/ClientID/Status/Watchdog Topic dans lequel ClientID va écrire de temps en temps pour indiquer que la connexion est valide. Exemple: {"Id":"Server_92881d83-d3a0-4edf-8720-e8e700340346","Date":"2023-12-28T12:40:45.6958696+01:00"} BaseName/GroupName/VKQV/Apps/ClientID/Login Topic dans lequel ClientID va s'authentifier. Exemple: {"Id":"Server_92881d83-d3a0-4edf-8720-e8e700340346", "UserName":"MyUserName","Password":"MyPassword"}  Lorsque VKQV constate qu'un client s'authentifie, il remplace le contenu par les informations de connexion: Exemple: {"jwtoken":"MyToken"} Si le login n'aboutit pas alors la réponse sera: {"Error":"Login fail !"} Si le login aboutit alors il contient un jwt de connexion qui devra être utilisé à chaque commande vers VKQV. Le client lit la réponse, l'enregistre puis efface le contenu du topic. BaseName/GroupName/VKQV/Apps/ClientID/Commands Topic dans lequel ClientID envoie des commandes à VKQV. Exemple: {"jwtoken":"MyToken", "Commands": [{"Cmd":"WriteBit", "Addr":"20,4,2", "Value": true}] } Lorsque VKQV accepte la commande, il l'execute si le jwtoken est valide puis efface le contenu. BaseName/GroupName/VKQV/Status/Watchdog Topic dans lequel VKQV va écrire à chaque rafraîchissement des variables. VKQV s'abonne à ce topic pour vérifier que le broker soit bien fonctionnel. Si celui-ci fonctionne correctement, il devrait renvoyer ce que VKQV a écrit. La liaison est déclarée comme dégradée si ce topic n'est pas envoyé par le broker après 5 fois le temps de rafraichissement. Dans ce cas, la liaison est interrompue et une nouvelle connexion est tentée.   Exemple du contenu envoyé par VKQV: {"V":269,"T":"Int","TS":"2022-06-03T10:28:01.936"}   BaseName/GroupName/VKQV/Status/Machine Statut de la machine. Pour chaque position de la machine, un statut est envoyé dans un json array: "V": {         "positions": [             {                 "pos": 1,                 "jn": 3,                 "js": 0,                 "jp": 0,                 "rdy": 1,                 "ala": false             },             {                 "pos": 2,                 "rdy": 1,                 "ala": false             },             {                 "pos": 3,                 "jn": 1,                 "js": 0,                 "jp": 0,                 "ena": true,                 "rdy": 1,                 "ala": false             }, ...     ],         "hoists": [             {                 "hoist": 1,                 "rdy": true,                 "blockingala": 0,                 "ala": 0,                 "height": 0,                 "destheight": 0,                 "position": 0,                 "destpos": 0,                 "origin": 0,                 "destination": 0,                 "mode": 0,                 "moveHforward": false,                 "moveHbackward": false,                 "moveVup": false,                 "moveVdown": false             },             {                 "hoist": 2,                 "rdy": true,                 "blockingala": 0,                 "ala": 0,                 "height": 0,                 "destheight": 0,                 "position": 0,                 "destpos": 0,                 "origin": 0,                 "destination": 0,                 "mode": 0,                 "moveHforward": false,                 "moveHbackward": false,                 "moveVup": false,                 "moveVdown": false             }          ]     },     "T": "MachineStatus",     "TS": "2024-04-26T06:55:30.333" }   Les positions sont composées des topics suivants: pos : int  -> numéro de position jn : int  -> numéro du rack dans la position js : int -> Statut du rack dans la position jp: int -> numéro de programme du rack ena: boolean -> position en/hors service rdy: boolean -> position prête (mode machine) ala: boolean -> position en alarme   Les robots sont composés des topics suivants: hoist:int -> numéro du robot rdy:boolean -> indique si le robot est prêt blockingala:int -> mot de statut des alarmes bloquantes ala:int -> mot de statut des alarmes non bloquantes height:int -> hauteur actuelle du robot destheight:int -> hauteur de destination position:int -> position actuelle destpos:int -> position de destination origin:int -> position d'origine lors d'un mouvement complet destination:int -> position de destination lors d'un mouvement mode:int -> mode de fonctionnement du robot moveHforward:boolean -> le robot se déplace horizontalement en avant moveHbackward:boolean -> le robot se déplace horizontalement en arrière moveVup:boolean -> le robot se déplace verticalement vers le haut moveVdown:boolean -> le robot se déplace verticalement vers le bas.   BaseName/GroupName/VKQV/Status/Alarms Statut des alarmes: {     "V": {         "alarms": [             {                 "evt": 2,                 "num": 50,                 "time": "07:16:19",                 "type": "Programme",                 "group": "Général",                 "mess": "Programme en mode STOP",                 "tnum": 1,                 "gnum": 150,                 "mnum": 2             },             {                 "evt": 2,                 "num": 897,                 "time": "07:16:19",                 "type": "Communication",                 "group": "M5Stack",                 "mess": "Erreur de communication avec l'automate",                 "tnum": 14,                 "gnum": 148,                 "mnum": 35             },             {                 "evt": 3,                 "num": 2,                 "time": "07:16:20",                 "type": "Système",                 "group": "HMI",                 "mess": "Watchdog communication avec automate",                 "tnum": 2,                 "gnum": 140,                 "mnum": 37             }         ]     },     "T": "AlarmStatus",     "TS": "2024-04-26T07:16:46.639" } Les alarmes contiennent les topics suivants:   evt:int -> événement ALA/ACK/RTN num:int -> numéro de l'alarme. time:Time -> heure/minute/seconde de l'alarme type:string -> type de l'alarme mess:string -> message de l'alarme group:string -> groupe de l'alarme tnum:int -> numéro du type de l'alarme gnum:int -> numéro du groupe de l'alarme mnum:int -> numéro du message de l'alarme val:num -> valeur associée à l'alarme.   BaseName/GroupName/VKQV/Status/Messages Même chose que ci-dessus pour les messages BaseName/GroupName/VKQV/Status/DailyData Données de production et d'efficacité: { "V": {         "DateOfData": "20240426",         "Date": "26.04.2024",         "BatchesIn": 0,         "BatchesOut": 0,         "IdleTime": 0,         "ErrorStopTime": 0,         "ErrorWarningTime": 28,         "ManuModeTime": 28,         "SafetyDoorTime": 0,         "PowerOnTime": 28,         "Utilization": 100,         "Reliability": 100,         "24hours": [             {                 "Hour": 9,                 "BachesIn": 0,                 "BachesOut": 0,                 "Reliability": 0,                 "Utilization": 0             },             {                 "Hour": 10,                 "BachesIn": 0,                 "BachesOut": 0,                 "Reliability": 0,                 "Utilization": 0             },             { ...     },     "T": "DailyData",     "TS": "2024-04-26T07:23:31.594" } BaseName/GroupName/VKQV/Status/Rectifiers Statut des redresseurs:   {     "V": {         "rectifiers": [             {                 "rectifier": 1,                 "position": 13,                 "name": "",                 "status": 128,                 "step": 0,                 "ahamn": 1,                 "surface": 0,                 "density": 0,                 "current": 0,                 "voltage": 0,                 "Q": 0,                 "QTheo": 0,                 "QTheoAct": 0,                 "QTotal": 1406.11250237337,                 "setpoint": 0,                 "reverse": 0,                 "maxU": 15,                 "maxI": 100,                 "minU": 0,                 "minI": 100,                 "pcsetpoint": 100,                 "alternation": 0,                 "flag0": 0,                 "flag1": 1,                 "flag2": 0,                 "surfaceflag": 7,                 "currentform": 0             },             { ...             }         ]     },     "T": "RectifiersStatus",     "TS": "2024-04-26T06:55:30.353" } BaseName/GroupName/VKQV/Status/PositionsStat Statut d'utilisation des positions de la machine et des barres:   {     "V": {         "positions": [             {                 "pos": 1,                 "time": 13,                 "load": "",                 "surftotal": 128,                 "surfmetal": 0,                 "entrainment": 1             },             { ...             }         ]       "jigs":[          {               "jig": 1,               "loaded": 45,               "total": 234          },          {          ...          }          ]    },     "T": "RectifiersStatus",     "TS": "2024-04-26T06:55:30.353" } BaseName/GroupName/VKQV/Status/Connection Statut de la connexion VKQV. Lorsque VKQV démarre, il écrit le statut de la connexion soit: {"V":"Connected","T":"String","TS":"2022-06-02T09:20:00.642"}. Avant de se déconnecter, il écrit: {"V":"Disconnected","T":"String","TS":"2022-06-02T10:24:35.123"}. Ce topic est également désigné comme Last Will Topic lors de la connexion. BaseName/GroupName/VKQV/Status/Databanks/{#} Liste des databanks de l'application. Le contenu de chaque databank est contenu dans le topic ayant comme nom le numéro du databank. Exemple: {"DB":1,"Device":1,"Channel":1,"Regi":0,"Regf":13,"Registers":[{"R":0,"T":"Int","V":0},{"R":1,"T":"Int","V":0},{"R":2,"T":"Int","V":0},{"R":3,"T":"Int","V":0},{"R":4,"T":"Int","V":0},{"R":5,"T":"Int","V":0},{"R":6,"T":"Int","V":0},{"R":7,"T":"Int","V":0},{"R":8,"T":"Int","V":0},{"R":9,"T":"Int","V":0},{"R":10,"T":"Int","V":0},{"R":11,"T":"Int","V":0},{"R":12,"T":"Int","V":0},{"R":13,"T":"Int","V":0}],"TS":"2023-12-28T11:22:22.923"} BaseName/Messaging/ Service d'envoi de message BaseName/Messaging/Status/Connection/ Statut de la connexion de VKSMSMessaging. Lorsque ce programme démarre, il écrit le statut de la connexion soit: {"V":"Connected","T":"String","TS":"2022-06-02T09:20:00.642"}. Avant de se déconnecter, il écrit: {"V":"Disconnected","T":"String","TS":"2022-06-02T10:24:35.123"}. Ce topic est également désigné comme Last Will Topic lors de la connexion. BaseName/Messaging/Status/Watchdog/ Topic dans lequel VKSMSMessaging va écrire à chaque rafraîchissement des variables. VKSMSMessaging s'abonne à ce topic pour vérifier que le broker soit bien fonctionnel. Si celui-ci fonctionne correctement, il devrait renvoyer ce que VKSMSMessaging a écrit. La liaison est déclarée comme dégradée si ce topic n'est pas envoyé par le broker après 5 fois le temps de rafraichissement. Dans ce cas, la liaison est interrompue et une nouvelle connexion est tentée.   Exemple du contenu envoyé par VKSMSMessaging: {"V":269,"T":"Int","TS":"2022-06-03T10:28:01.936"} BaseName/Messaging/SMS/{messages} Topic contenant les messages à envoyer par SMS. Ce topic contiendra des sous-topic nommer par un GUID. Chaque sous-topic correspondra à un message à envoyer. L'application qui s'occupera de l'envoi des SMS devra s'abonner au topic .../SMS/#. Chaque fois que l'application recevra un topic, il l'analysera, enverra le SMS correspondant puis effacera le topic. Le contenu du topic sera composé d'un json. Exemple: {"Recipient":"+41219683128", "Sender":"VKVision", "Message" : "Température max. chaudière", "TS":"2023-12-28T11:22:22.923"} Si le temps entre le TS et l'heure de réception du topic est plus grand qu'un temps pré-défini, le message est effacé sans être envoyé. BaseName/GroupName/VKQV/Datas/ Changement des I/O de la machine: {"Type":1,"Items":[{"LB":"A44003/3/Température actuelle","V":38.1,"T":"Double","U":"°C"}],"TS":"2024-04-26T07:32:31.852"}   Toutes les I/O qui ont changées d'état depuis la dernière analyse sont  transmit dans cet array.   BaseName/GroupName/VKQV/Datas/{#position} Liste des I/O par position. Le nom des I/O est modifié pour ne pas interférer dans les noms de topics: les espaces, /, \,# sont remplacés par _ Par exemple, l'I/O "Compteur d'Amin" de la cuve 33: Topic: 33 Topic: Compteur_Amin {"V":135.44,"TS":"2024-04-16T08:48:16.256","T":"Double","U":"Amin"}   BaseName/GroupName/VKQV/Configuration/Machine Définition de la machine: {     "V": {         "positioncount": 65,         "hoistcount": 4,         "positions": [             {                 "pos": 1,                 "name": "01 - Charge",                 "flag": 2,                 "addr": 1,                 "group": 0,                 "tank": 1,                 "disable": false,                 "width": 0,                 "process": 1,                 "dist": 200,                 "branch": 0,                 "num": 1,                 "layout": 0             },             {                 "pos": 2,                 "name": "02 - Transfert 1",                 "flag": 10,                 "addr": 2,                 "group": 0,                 "tank": 2,                 "disable": false,                 "width": 0,                 "process": 2,                 "dist": 200,                 "branch": 0,                 "num": 2,                 "layout": 0             },             { ..             }         ],         "hoists": [             {                 "hoist": 1,                 "type": 13,                 "driptray": true,                 "halfup": true,                 "pmin": 1,                 "pmax": 26             },             {                 "hoist": 2,                 "type": 13,                 "driptray": true,                 "halfup": true,                 "pmin": 12,                 "pmax": 36             },             {                 "hoist": 3,                 "type": 13,                 "driptray": true,                 "halfup": true,                 "pmin": 37,                 "pmax": 56             },             {                 "hoist": 4,                 "type": 13,                 "driptray": true,                 "halfup": true,                 "pmin": 45,                 "pmax": 65             }         ]     },     "T": "MachineDefinition",     "TS": "2024-04-26T06:54:58.864" } BaseName/GroupName/VKQV/Configuration/Graphics/{#NomduSynoptique} Pages graphiques de l'application publiées sous forme de winjson BaseName/GroupName/VKQV/Status/TimeTable Positions avec une charge: { "V": { "timetable": [ { "rack": 5, "num": 2, "posnumber": 112, "name": "112 - Stockage", "status": 3, "reference": "APEP30100", "progname": "G-APEP30100", "prognum": 255, "tmin": 0, "tmax": 1800000, "in": "2026-07-20T08:17:50.000" }, { "rack": 4, "num": 4, "posnumber": 114, "name": "114 - Stockage", "status": 3, "reference": "APCC30100", "progname": "G-APCC30100", "prognum": 255, "tmin": 0, "tmax": 1800000, "in": "2026-07-20T08:15:32.000" }, { "rack": 7, "num": 14, "posnumber": 207, "name": "207 - Dégrais. 2.1", "status": 1, "reference": "BCBD30035", "progname": "G-BCBD30035", "prognum": 255, "tmin": 900, "tmax": 930, "in": "2026-07-20T09:34:33.000" Pub/Sub Il est possible de définir des variables en publication ou en souscription indépendamment du système d'I/O de QuickView. Ces variables sont définies dans 2 sections de IO.ini: [MQTTSub] et [MQTTPub]. MQTTSub Dans cette section il est possible de définir jusqu'à 100 souscriptions à des topics MQTT. ;************************************************************************* ;Souscription à des variables MQTT ;1..100=nom de la variable,Type (IO/DB),N°I/O, Var type,N°DB, N°Reg, N°Bit ;************************************************************************* [MQTTSub] 1=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Conductivité_eau_recyclée_20uS,DB,0,F,36,90 2=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Température_eau_recyclée_20uS,DB,0,F,36,91 3=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/pH_eau_recyclée_20uS,DB,0,F,36,92 4=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Turbidité_eau_recyclée_20uS,DB,0,F,36,93 5=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Conductivité_eau_recyclée_5uS,DB,0,F,36,94 6=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Température_eau_recyclée_5uS,DB,0,F,36,95 7=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/pH_eau_recyclée_5uS,DB,0,F,36,96 8=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Turbidité_eau_recyclée_5uS,DB,0,F,36,97 9=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Conductivité_eau_DI,DB,0,F,36,98 10=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Température_eau_DI,DB,0,F,36,99 Il est possible de souscrire à des topics MQTT et de les stocker dans des registres de databank. Il est possible de souscrire jusqu'à 100 topics. La définition se fait de la manière suivante: Section [MQTTSub] n=Nom du topic, type de donnée, n° de l'I/O, type de variable, n° du DB, n° du registre, n° du bit n : numéro de souscription(1..100) Nom du topic: nom du topic dans MQTT type de donnée: IO => correspond à un numéro d'I/O  DB => correspond à un DB,Reg,Bit n° d'I/O: si le type de donnée = IO alors indique le numéro d'I/O à utiliser pour stocker les données sinon pas utilisé type de variable: 'F' => float, 'B' => boolean, 'W' => integer n° du DB: numéro du databank si le type de donnée = DB sinon pas utilisé n° du registre: numéro du registre du databank si type de donnée = DB sinon pas utilisé n° du bit: numéro du bit du registre du databank si type de donnée = DB sinon pas utilisé MQTTPub Dans cette section il est possible de définir jusqu'à 100 publications dans des topics MQTT. ;******************************************************************************************************************************* ;Publication de variables vers MQTT ;1..100=nom du topic,Min time between refresh (sec),Force Refresh after (sec),Type (IO/DB),N° d'I/O,Var type, N°DB, N°Reg, N°Bit ;******************************************************************************************************************************* [MQTTPub] 1=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Conductivité_eau_recyclée_20uS,5,600,DB,0,F,36,121 2=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Température_eau_recyclée_20uS,5,600,DB,0,F,36,122 3=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/pH_eau_recyclée_20uS,5,600,DB,0,F,36,123 4=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Turbidité_eau_recyclée_20uS,5,600,DB,0,F,36,124 5=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Conductivité_eau_recyclée_5uS,5,600,DB,0,F,36,125 6=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Température_eau_recyclée_5uS,5,600,DB,0,F,36,126 7=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/pH_eau_recyclée_5uS,5,600,DB,0,F,36,127 8=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Turbidité_eau_recyclée_5uS,5,600,DB,0,F,36,128 9=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Conductivité_eau_DI,5,600,DB,0,F,36,129 10=Rolex/Bienne/Galvano_BB/A34003/VKQV/Pub/STEP/Température_eau_DI,5,600,DB,0,F,36,130 Il est possible de publier le contenu de DB ou d'I/O dans des topics MQTT. Il est possible de définir jusqu'à 100 publications. La définition se fait de la manière suivante: Section [MQTTPub] n=Nom du topic, Min time between refresh, Force refresh after, n° de l'I/O, type de donnée, type de variable, n° du DB, n° du registre, n° du bit n : numéro de publication (1..100) Nom du topic: nom du topic dans MQTT Min time between refresh: correspond au temps minimum entre chaque publication si la variable à changée. Le temps est exprimé en secondes. Force refresh after: correspond au temps minimum entre chaque publication quelque soit le valeur de la variable. Le temps est exprimé en secondes. type de donnée: IO => correspond à un numéro d'I/O  DB => correspond à un DB,Reg,Bit n° d'I/O: si le type de donnée = IO alors indique le numéro d'I/O à utiliser pour stocker les données sinon pas utilisé type de variable: 'F' => float, 'B' => boolean, 'W' => integer n° du DB: numéro du databank si le type de donnée = DB sinon pas utilisé n° du registre: numéro du registre du databank si type de donnée = DB sinon pas utilisé n° du bit: numéro du bit du registre du databank si type de donnée = DB sinon pas utilisé Définition dans le client Il est possible de définir une connexion MQTT dans le programme client. Cette connexion peut être utilisée pour échanger avec un ERP ou pour l'utilisation d'un lecteur de codes à barres partagé sur plusieurs PC ou pour faire un login/logout sur plusieurs PC en même temps. La définition se fait dans le fichier VKWinQV.ini dans la section [MQTT]. Par exemple: [MQTT] Enabled=1 Host=wss://google.com Port=xxxx GroupName=A11191 WatchdogTopic=WatchDog BaseName=VK_Vision_SA/Villeneuve/Galvano_BA BarCodeReaderTopic=VK_Vision_SA/Villeneuve/Galvano_BA/A11191/BarcodeReader_PDC1 LoginTopic= SSLEnable=1 ValueStyle=0 UserName= Password= RefreshRate=10 ClientName=PC_Poste_de_charge_1 La section [MQTT] Les mots clef suivants peuvent être définis: Mot clef Type Valeur par défaut Description Enabled Boolean 0 Doit être activé pour que la connexion soit créée. Host String vide Adresse du broker MQTT Port Integer 1883 Numéro du port TCP SSLEnable Boolean 0 Vrai si la connexion utilise Open SSL (TLSv1.1) pour une connexion sécurisée. Pour pouvoir travailler en mode SSL sécurisé, il faut placer les dll d'OpenSSL dans le même répertoire que QuickView (version 32bits, version testée: 1.0.2.18) ClientID String GUID Nom du client MQTT KeepAlive Integer 60 Temps en secondes pour garder la connexion en vie lorsqu'il n'y a pas de communication RefreshRate Integer 30 Temps en secondes pour l'exécution d'un rafraîchissement des variables. Ce temps, multiplié par 5, est également utilisé pour l'attente du watchdog. Lorsque le topic watchdog est défini, celui-ci doit être reçu par le programme client pour confirmer sa connexion avec MQTT. Passé ce temps, une reconnexion automatique est effectuée. Retain Boolean 0 Vrai si le contenu des variables doit être préservé sur le broker après la déconnexion. Si ce flag est activé, alors des messages seront renvoyés à tous les clients lors de leur connexion au broker. BaseName String VKQV Nom de base des topics. GroupName String MachineName Nom de publication du groupe. En général correspond au code de la machine par exemple: A34002 AutoRestart Boolean 1 Vrai pour forcer la reconnexion et le démarrage de la publication après une perte de connexion. ValueStyle Integer 0 Format des valeurs des variables: 0: (ISA-95)   UserName String vide Nom de l'utilisateur lorsqu'un login est demandé par le broker Password String vide Mot de passe lorsqu'un login est demandé par le broker QoS Integer 0 Qualité se service (0:At most once, 1: At least once, 2: Exactly once) ClientName String vide Nom lisible du client utilisé par la connexion à un ERP LoginTopic String vide Nom du topic utilisé lors d'un partage de login/logout par les clients BarcodeReaderTopic String vide Nom du topic utilisé lorsqu'un lecteur de codes à barres est partagé entre plusieurs PC Login/Logout sur plusieurs PC Le LoginTopic n'est pas basé sur le BaseName, il est définissable n'importe où dans l'espace MQTT. Si un LoginTopic est défini, il est utilisé lorsqu'un utilisateur effectue un login ou un logout. Lorsqu'il effectue un login, le topic est rempli avec le json suivant: { "Command": "Login", "User": "Crypted user name", "Pwd": "Crypted password" } Lorsqu'il effectue un logout, le topic est rempli avec le json suivant: { "Command": "Logout", "User": "Crypted user name" }  Le client s'abonne au LoginTopic. Lorsque ce dernier change, le programme exécute le login ou le logout selon les données reçues. Bien s¹r, le nom d'utilisateur et le mot de passe doivent être définis et correspondre. Lecteur de barres codes partagé Le BarcodeReaderTopic n'est pas basé sur le BaseName, il est définissable n'importe où dans l'espace MQTT. Ce topic possède 2 sous-topics : In et Out. Le topic "In" correspond à la valeur lue par le lecteur de codes à barres. Le topic "Out" permet l'envoi de données à afficher sur le lecteur. Il peut également correspondre à une commande permettant de faire beeper le lecteur. Lorsque la section [Barcode]ReaderType=MQTT, le programme s'abonne au topic BarcodeReaderTopic et lorsque son contenu change, il prend la valeur contenu dans le sous-topic "In" pour l'utiliser sur le poste de charge. Echanges entre QuickView et un ERP Les échanges entre QuickView et un ERP peuvent être réalisés en passant par MQTT. QuickView fait la demande en publiant une demande sur MQTT. Un agent spécialisé s'occupe de l'échange avec l'ERP et retourne la réponse en publiant cette réponse à MQTT. QuickView récupère la réponse et effectue la commande correspondante. Pour fonctionner avec MQTT, la section [Exchange] doit être défini  doit être définie avec les valeurs suivantes: [Exchange] Enabled=1 Mode=8 Timeout=10 Lorsque le mode d'échange est = 8, le client s'abonne au topic suivant: BaseName/GroupName/ERP/Clients/ClientName/Request/#.  L'agent (VKQV_NCOM ou VKQV_SAPDB ou autre) souscrit au topic  BaseName/GroupName/ERP/Clients/# et répondra aux requêtes des différents clients dans /Request/Result ou /Request/Error ou /Request/File. Lorsque l'agent démarre, il publie son statut dans le topic BaseName/GroupName/ERP/Status/Connection pour que les clients connectés sachent que l'agent est actif. Il publie également le type d'agent dans BaseName/GroupName/ERP/Status/AgentType pour que les clients puissent modifier l'interprétation des données car tous les ERP ne fonctionnent pas de la même manière. NCOM NCOM est un échange entre Flexnet et QuickView. Le nom de l'agent est VKQV-NCOM. Les échanges ci-dessous sont pris en compte: SAPDM L'échange entre SAPDM et QuickView est réalisé à l'aide de l'agent VKQV-SAPDM. Les échanges ci-dessous sont pris en compte: Mosquitto Eclipse Mosquitto est un courtier de messages open source (sous licence EPL/EDL) qui implémente les versions 5.0, 3.1.1 et 3.1 du protocole MQTT. Mosquitto est léger et convient à une utilisation sur tous les appareils, des ordinateurs monocarte à faible consommation aux serveurs complets. Le protocole MQTT fournit une méthode légère pour effectuer la messagerie à l'aide d'un modèle de publication/abonnement. Cela le rend adapté à la messagerie de l'Internet des objets, par exemple avec des capteurs de faible puissance ou des appareils mobiles tels que des téléphones, des ordinateurs embarqués ou des microcontrôleurs. Télécharger le programme ici : https://mosquitto.org/download/ puis l'installer selon les instructions. Il faut modifier le fichier de configuration de Mosquitto (mosquitto.conf) en y ajoutant les "listener" disponibles: #Si pas de mot de passe nécessaire allow_anonymous true #Web socket ws:// listener 9000 protocol websockets socket_domain ipv4 #Web socket sécurisé wss:// listener 9001 protocol websockets cafile C:\Metier\mosquitto\certs\ca_certificat.crt certfile C:\Metier\mosquitto\certs\certificat.crt keyfile C:\Metier\mosquitto\certs\certificat.key #accès standard mqtt:// listener 1883 protocol mqtt require_certificate false #accès sécurisé mqtts:// listener 8883 protocol mqtt cafile C:\Metier\mosquitto\certs\ca_certificat.crt certfile C:\Metier\mosquitto\certs\certificat.crt keyfile C:\Metier\mosquitto\certs\certificat.key Pour permettre l'utilisation depuis une application web, un listener Web socket doit être activé (ws:// ou wss://) Configuration de l'ACL (Access Control List) dans Mosquitto Par défaut Mosquitto autorise la connexion sans login / mot de passe. J'ai parlé de ce point dans l'article sur son installation Une fois connecté chaque utilisateur (ou client) peut écrire ou écouter n'importe quel topic sans aucune restriction. C'est ici que l'ACL intervient ! Dans le fichier de configuration de votre Mosquitto, il est nécessaire de configurer l'emplacement de votre acl_file. acl_file /etc/mosquitto/acl "Lexique" # û Wildcard, il donne accès à tout le topic de façon récursive. + û Wildcard, il donne accès à tout le topic sur le même niveau. $SYS û est réservé au broker, il communique ses statistiques,... Vous pouvez laisser l'accès en lecture ou non aux clients via un pattern par exemple. user û Permet de définir l'utilisateur concerné. topic û Permet de définir le topic concerné. pattern û Permet de définir un topic à tous utilisateurs ou clients. read û Permet de lire le topic. write û Permet d'écrire sur le topic. readwrite û Permet de lire et d'écrire sur le topic. %c û ID du client. %u û Nom de l'utilisateur. Il est possible de connecter plusieurs clients avec un ID différent avec le même utilisateur. Dans un premier temps limitez-vous à un client = un utilisateur car cela peut vite poser des soucis. Clients & Users Dans l'exemple suivant l'utilisateur cuisine à le droit d'écrire et de lire dans tout le topic maison/cuisine et à aussi le droit de lire tout le topic maison. l'utilisateur toto lui à uniquement le droit de lire maison/cuisine/temperature. user cuisine topic readwrite maison/cuisine/# topic read maison/# user toto topic read maison/cuisine/temperature Patterns Dans l'exemple suivant tous les utilisateurs peuvent lire les informations du broker $SYS. Chaque client et utilisateur ont le droit d'écrire et de lire dans " leur espace ?. Donc l'utilisateur toto à son topic maison/user/toto de façon récursive, pareil pour l'utilisateur cuisine. pattern read $SYS/# pattern readwrite maison/id/%c/# pattern readwrite maison/user/%u/# Ressource : https://mosquitto.org/man/mosquitto-conf-5.html Sources: https://iooner.io/configuration-acl-mosquitto/ SparkPlugB Sparkplug B est une spécification qui standardise la façon dont les données sont structurées et échangées sur MQTT dans un contexte industriel (IIoT/SCADA), pour éviter que chaque fournisseur ait son propre format. Points clés : Topic namespace : les messages suivent une arborescence fixe spBv1.0/group_id/message_type/edge_node_id/device_id, où message_type indique le type de message (NBIRTH, NDEATH, DBIRTH, DDEATH, NDATA, DDATA, etc.). Payload en Protobuf : contrairement au MQTT classique souvent en JSON, Sparkplug B encode les données en Protocol Buffers, ce qui réduit la taille des messages et impose un schéma strict (métriques avec nom, type, valeur, timestamp, alias). Gestion d'état (birth/death) : à la connexion, un nœud publie un message NBIRTH (Node Birth) listant toutes ses métriques avec leurs valeurs initiales. Le broker MQTT garde en réserve un message NDEATH (via le mécanisme Last Will and Testament) qui est publié automatiquement si le nœud se déconnecte anormalement. Cela permet aux abonnés de connaître l'état de santé (« online »/« stale ») du réseau à tout instant. Rapport par exception (RBE) : après le message de naissance complet, seules les valeurs qui changent sont republiées (NDATA/DDATA), ce qui limite la bande passante. Séquencing : chaque message porte un numéro de séquence (0-255) qui permet de détecter des messages perdus et de déclencher une resynchronisation. En résumé, Sparkplug B ajoute par-dessus MQTT une convention de topics, un format de payload binaire, et un cycle de vie (birth/death/data) qui garantit un état cohérent et interopérable entre tous les appareils du réseau. Le flux de données avec un serveur d'entreprise Ce chapitre décrit les flux de données entre le serveur d'entreprise FlexNet et VK QuickView lors de la recherche d'articles. Il décrit également les flux de données utilisées pour les rapports de suivi. Echanges avec des équipements Ce chapitre décrit les échanges effectués entre le PC et les divers équipement L'interface avec le contrôleur de transporteur CB99A Dans une installation de traitement de surface, le système VK envoie les commandes de déplacement à l'automate programmable. Ce dernier est responsable de contrôler le déplacement et de positionnement des transporteurs. Le système VK gère l'anticollision avant l'envoi d'une nouvelle commande. Par exemple, si le système doit envoyer le transporteur 1 à la position 10 et que le transporteur 2 se trouve sur la position 9, il ordonnera d'abord au transporteur 2 de se déplacer à une position suffisamment éloignée pour ne pas entrer en collision avec le transporteur 1. La commande de déplacement du transporteur 1 sera envoyée une fois que le transporteur 2 est en dehors de la zone de collision. Pour gagner du temps lors des déplacements, un mode " unsafe " peut être activé sur le système VK lui permettant d'envoyer les commandes de déplacement en parallèle. Dans notre exemple, le système envoi la commande de déplacement au robot 2 et dès que le système voit que le robot 2 est effectivement en train de se déplacer vers la position de destination, il envoi la commande au robot 1. Ce mode impose les fonctions suivantes : 1) Les transporteurs doivent tous avoir la même vitesse de déplacement. 2) Un système d'anticollision doit être implémenté dans l'automate programmable. Ce mode est activé dans l'onglet [Hoist] de la page des paramètres du serveur: Les registres d'échange Les registres de commande et de statut sont définis comme suit: Registre Type Direction Description 0 Word PLC->VK Statut du transporteur: bit 0..6: position actuelle Bit 7: le transporteur est en bas Bit 8: le transporteur est en haut Bit 9: le transporteur se déplace horizontalement Bit 10: le transporteur monte Bit 11: le transporteur descend Bit 12: bac d'égouttage fermé Bit 13: le transporteur est à la hauteur Up1/2 Bit 14: le transporteur est prêt Bit 15: toggle nouvelle commande. 1 Word PLC->VK Alarmes du transporteur 2 Word PLC->VK Bit 0: Fermeture du bac d'égouttage 3 Word PLC->VK Mode du transporteur: Bit 0..3: Mode du transporteur ( 0: OFF, 1: Manu, 2: Semi, 4: Auto, 8: Init) Bit 4: Le transporteur est à la hauteur HLiftout (nouveau) 4 Word VK-PLC Consigne de vitesse de rotation 5 Word VK->PLC Commande à exécuter: Bit 0..3: Commande à exécuter 1 = Déplacement horizontal (Bit 8-14 = position de destination) 2 = Déplacement vertical (Bit 4-7 = hauteur de destination 1:en haut, 2: en bas, 4:up 1/2 Bit 12..14 = vitesse à utiliser 0..7) 4 = Déplacement vertical (Bit 4-7 = hauteur de destination 1:en haut, 2: en bas, 8: hauteur HLiftout. La vitesse semi-verticale doit être utilisée) (nouveau) Bit 15: trigger nouvelle commande (inversé à chaque commande) L'interface avec le contrôleur de transporteur CB07FPL Les registres d'échange Les registres de commande et de statut sont définis comme suit: Registre Type Direction Description 0 DWORD VK->PLC Hoist command: Bit 0 : Hoist command Bit 1 : Hoist command Bit 2 : Hoist command Bit 3 : Hoist command Bit 4 : ON if next movement is a lift command (UP or DOWN movement). Bit 5 : ON when horizontal movement is without rack holder (jig). Bit 6 : (reserve) Bit 7 : Movement data Bit 8 : Movement data Bit 9 : Movement data Bit 10 : Movement data Bit 11 : Movement data Bit 12 : Movement data Bit 13 : Movement data Bit 14 : Movement data Bit 15 : Trigger new command Bit 16 : Reset buffer Bit 17 : Program is in AUTO mode Bit 18.. Bit 20..Bit 27 : Temps d'égouttage en secondes (spécial) Bit 31 : (reserve) 1 DWORD VK->PLC Hoist equipement command : Bit 0 : Barrel rotation type Bit 1 : Barrel rotation type Bit 2 : Barrel rotation type Bit 3 : Barrel rotation type Bit 4 : ON if drip tray must be in closed position Bit 5.. Bit 31 : (reserve) 2 DWORD PLC->VK Hoist Status : Bit 0 : Hoist mode Bit 1 : Hoist mode Bit 2 : Hoist mode 0=OFF 1=Manual 2=Semi-auto 4=Automatic Bit 3 : ON when hoist is ready to accept new command Bit 4 : ON when a blocking alarm is pending (register 3 is not empty) Bit 5 : ON when drip tray is in closed position Bit 6 : ON when hoist is moving horizontaly Bit 7..14 : Logical horizontal position of the hoist (0..255) Bit 15 : Trigger command terminated Bit 16 : ON when lift 1 is in low vertical position Bit 17 : ON when lift 1 is in upper vertical position Bit 18 : ON when lift 1 is lowering Bit 19 : ON when lift 1 is lifting Bit 20 : ON when lift 1 is in intermediate vertical position Bit 21 : ON when clip on lift 1 is closed (clipped) Bit 22 : ON when hoist is agitating Bit 23 : ON when lift 1 is in HLiftout vertical position Bit 24 : ON when lift 2 is in low vertical position Bit 25 : ON when lift 2 is in upper vertical position Bit 26 : ON when lift 2 is lowering Bit 27 : ON when lift 2 is lifting Bit 28 : ON when lift 2 is in intermediate vertical position Bit 29 : (reserve) Bit 30 : (reserve) Bit 31 : (reserve) 3 DWORD PLC->VK Alarm bits. Program should go to STOP mode: Bit 0..31 : Alarm indication 4 DWORD PLC->VK Warning bits. Program continue in AUTO mode: Bit 0..31 : Warning indication Commands to hoist Check In order to send a new command to hoist, VKQV will check the following conditions : ? Hoist mode is in Auto ( Reg2 Bit 0-2 == 4) Hoist is ready to accept new command ( Reg2 Bit 3 == ON) Hoist has no blocking alarm activated (Reg2 Bit 4 == OFF) Command trigger = status trigger (Reg0 Bit 15 == Reg2 Bit 15) If all of those conditions are verified than a new command can be send. Sending a new command VKQV writes a new command in the register #0. In this new command, the Bit15 will be inverted from its last value, telling to the PLC that a new command has been written. When the PLC see that Reg0 Bit15 is different than Reg2 Bit15, it knows that a new command is pending. The Reg2 Bit4 should go Off telling to VKQV that the command is being executed. When the command is terminated (hoist is in destination), Reg2 Bit4 should go ON again and Reg2 Bit15 must be set with the content of Reg0 Bit15. Move horizontal command A move horizontal command is specified by writting the value 1 in the Reg0 HoistCommand bits. The Reg0 Bit4 is set to ON if the next movement is a vertical lift. This is used by the PLC to activate some equipement command ( open tank cover, or turn on spray, or etc.). The Reg0 Bit5 is set to ON when the horizontal movement is done without rack holder (jig) on the hoist. This is also an information used by the PLC to not activate some equipement command because the hoist is empty. The destination logical position is written in Reg0 Bit7-14. This is corresponding to the horizontal destination of the hoist. The Reg0 Bit15 is inverted from its previous state. And the Reg0 Bit 17 is set to ON telling to the PLC that VKQV program mode is in AUTO (set to OFF if the program mode is in STOP. This is corresponding in a command done by the remote control of the hoist). Example of horizontal command: Hoist is located in logical position #16 in lower vertical position: Move to logical position #3, program mode = STOP, there is no rack holder on the hoist: Command is accepted by the PLC: Hoist is moving horizontally and is actually in logical position #9: Hoist is in the logicial position 3 and is ready to accept a new command: Move vertical command A move vertical command is specified by writting 2 in the Reg0 HoistCommand bits. The Reg0 Bit5 is set to ON when the movement is done without rack holder (jig) on the hoist. The type of vertical movement is specified in the Reg0 Bit8-11 (1=go up to top, 2=go down to bottom, 3=go up to intermediate high, 4= go up to top from the intermediate high, 5=go down to bottom from the intermediate high, 6=go down from top to intermediate high, 7=go up to HLiftout, 8=go up from HLiftout to top, 9= go down from top to HLiftout, 10= do down from HLiftout to bottom). The speed to be use is specified in the Reg0 Bit12-14 (0..7). Example of vertical command: Hoist is in the logicial position #3 in lower vertical position: Move to top: Command is accepted by the PLC: Hoist is moving vertically. It is in logical position #3 and is clipped: Hoist is in logical position #3 in upper vertical position and is ready to accept a new command: Hoist agitation command A hoist agitation command is specified in writting 4 in the Reg0 HoistCommand bits. This command tells to the hoist controller to agitate a load. The hoist must be in lower position and centered. When the controller receive this command, it starts to agitate while a time defined in the controller. It must stop in lower position. While the hoist is agitating, the bit22 of status register is set by the controller. QuickView will not pick/drop load while this bit is activated. Interface avec le contrôleur de transporteur CB24FPL Ce nouveau type de contrôleur permet le contrôle d'un transporteur permettant l'inclinaison latérale des charges ainsi que l'inclinaison radiale de celles-ci. Ces inclinaisons permettent un meilleur égouttage des charges. L'inclinaison se fait en haut mais peut également se faire en bas pour remplir et évacuer les bulles dans les pièces traitées. Les registres d'échange Il y a 6 registres d'échange par transporteur: Registre Type Direction Description 0 DWORD VK->PLC Command 1 register (Triggered commands) 1 DWORD VK->PLC Command 2 register (Direct commands) 2 DWORD PLC->VK Status 1 3 DWORD PLC->VK Status 2 4 DWORD PLC->VK Alarms register 5 DWORD PLC->VK Warnings register Le détail des registres de commande et de statut sont définis comme suit: Registre Type Direction Description 0 DWORD VK->PLC Hoist horizontal command: Bit 0 : True => Horizontal move Bit 1 : False Bit 2 : False Bit 3 : False Bit 4 : ON if next movement is a lift command (UP or DOWN movement). Bit 5 : ON when horizontal movement is without rack holder (jig). Bit 6 : (reserve) Bit 7.. Bit 14 : Destination logical position. Bit 15 : Trigger new command Bit 16 : Reset buffer Bit 17 : Program is in AUTO mode Bit 18.. Bit 31 : (reserve) 0 DWord VK->PLC Hoist vertical command: Bit 0 : False Bit 1 : True => Vertical move Bit 2 : False Bit 3 : False Bit 4 : (reserve) Bit 5 : Movement without jig Bit 6 : (reserve) Bit 7 : (reserve) Bit 8 .. Bit 11 : Movement type: 1=Up, 2=Down, 3=Up 1/2, 4=1/2 to Up, 5=1/2 to Down Bit 12 .. Bit 14 : (reserve) Bit 15 : Trigger new command Bit 16 : Reset buffer Bit 17 : Program is in AUTO mode Bit 18 .. Bit 23 : Drip time Bit 24 .. Bit 29 : Type of movement Bit 30.. Bit 31 : (reserve) 0 DWORD VK->PLC Hoist initialisation command: Bit 0 : True  Bit 1 : True => Hoist initialisation Bit 2 : False Bit 3 : False Bit 4 ..  Bit 14 : (reserve) Bit 15 : Trigger new command Bit 16 : Reset buffer Bit 17 : Program is in AUTO mode Bit 18.. Bit 31 : (reserve) 0 DWORD VK->PLC License settings command: Bit 0 : False Bit 1 : False Bit 2 : True => Set license Bit 3 : False Bit 4 .. Bit 6 : (reserve) Bit 7 .. Bit 14 : License data Bit 15 : Trigger new command Bit 16 : Reset buffer Bit 17 : Program is in AUTO mode Bit 18.. Bit 31 : (reserve) 1 DWORD VK->PLC Hoist equipement command : Bit 0 : Barrel rotation type Bit 1 : Barrel rotation type Bit 2 : Barrel rotation type Bit 3 : Barrel rotation type Bit 4 : ON if drip tray must be in closed position Bit 5.. Bit 31 : (reserve) 2 DWORD PLC->VK Hoist Status 1 : Bit 0 : Hoist Manu Bit 1 : Hoist Semi Bit 2 : Hoist Auto Bit 3 : ON when hoist is ready to accept new command Bit 4 : ON when a blocking alarm is pending (register 3 is not empty) Bit 5 : ON when drip tray is in closed position Bit 6 : ON when hoist is moving horizontaly Bit 7..14 : Logical horizontal position of the hoist (0..255) Bit 15 : Trigger command terminated Bit 16 : ON when lift 1 is in low vertical position Bit 17 : ON when lift 1 is in upper vertical position Bit 18 : ON when lift 1 is lowering Bit 19 : ON when lift 1 is lifting Bit 20 : ON when lift 1 is in intermediate vertical position Bit 21 : ON when clip on lift 1 is closed (clipped) Bit 22 : ON when hoist is agitating Bit 23 : ON when lift 1 is in HLiftout vertical position Bit 24 : ON when lift 2 is in low vertical position Bit 25 : ON when lift 2 is in upper vertical position Bit 26 : ON when lift 2 is lowering Bit 27 : ON when lift 2 is lifting Bit 28 : ON when lift 2 is in intermediate vertical position Bit 29 : (reserve) Bit 30 : (reserve) Bit 31 : (reserve) 3 DWORD PLC->VK Hoist status 2: Bit 0 : (reserve) Bit 1 : Lateral inclinaison: -15? Bit 2 : Lateral inclinaison: 0? Bit 3 : Lateral inclinaison: +15? Bit 4 : (Reserve) Bit 5 : Radial inclinaison: -20? Bit 6 : Radial inclinaison: -10? Bit 7 : Radial inclinaison: 0? Bit 8 : Radial inclinaison: +10? Bit 9 : Radial inclinaison: +20? Bit 10 .. Bit 17 : (reserve) Bit 18 : Vertical movement in progress Bit 19.. Bit 23 : Actual step of the lift sequencer Bit 24.. Bit 29 : Actual type of lift Bit 30.. Bit 31 : (reserve) 4 DWORD PLC->VK Alarm bits. Program should go to STOP mode: Bit 0..31 : Alarm indication 5 DWORD PLC->VK Warning bits. Program continue in AUTO mode: Bit 0..31 : Warning indication Les types de mouvements verticaux Les mouvements verticaux sont définis dans une table de l'automate. Cette table est composée de 50 types de mouvements. Chaque type est composé de 20 enregistrements. Chaque enregistrement est composé de: Type (Int) Param 1 (Int) Param 2 (Int) 0=None 1=Go to High High # (0-5): 0=Top 1=Middle Top 2=Brillantage Pos 3=Réserve 4=Middle Bottom 5=Bottom Speed (0-100%) 2=Wait Wait time (seconds) 3=Wait drip time 4=Lateral inclinaison Inclinaison position (0-2): 0=Center (0?) 1=Neg (-15?) 2=Pos (15?) Speed (0-100%) 5=Radial inclinaison Inclinaison position (0-4): 0=Center (0?) 1=Neg20 (-20?) 2=Neg10 (-10?) 3=Pos10 (+10?) 4=Pos20 (+20?) Speed (0-100%) 6=Go up Duration (miliseconds) Speed (0-100%) 7=Go down Duration (miliseconds) Speed (0-100%) Structure du DB interne d'échange Tous les types de transporteur utilisent une zone mémoire commune définie dans DBData et RegData. Cette zone doit comprendre 100 registres et doit être associé à un Databank interne. Les registres de cette zone correspondent à la définition suivante: Le DB Interne d'échange a la structure suivante: Reg Fonction 0 1 Alarmes bloquantes 2 Registre d'alarmes 3 Registre de warning 4 Numéro de position occupée en cas d'erreur 5 6 Hauteur deuxième lift 7 Hauteur du transporteur (1=en haut, 2 en bas) 8 Position du transporteur 9 10 Registre de statut du transporteur 11 Alarme transporteur 12 Commande en cours 13 14 Vitesse de rotation 15 Registre de commande du transporteur 16 17 18 Position de destination 19 Hauteur de destination 20 Temps d'égouttage 21 Programme de montée 22 Programme de descente 23 Forçage programme de montée 24 Forçage programme de descente 25 26 27 Transporteur prêt (0=pas prêt 1=prêt) 28 29 30 Flèches télécommande (bit 0=déplacement horizontal, bit 2=descente, bit 3 =montée, bit 4=origine verticale atteinte, bit 5 = origine horizontale atteinte 31 32 33 34 Numéro de position physique minimum 35 Numéro de position physique maximum 36 37 38 39 40 Mode du transporteur (auto, manu, semi, off) 41 42 Pince fermée 43 Type de rotation en cours 44 45 46 47 48 49 50 51 52 53 54 55 L'interface avec les redresseurs PLCRECTIFIER Les registres d'échange Cette page décrit l'échange des données entre le PC et l'automate programmable en ce qui concerne la commande d'un redresseur. Registre Type Direction Description 0 WORD VK->PLC Commande envoyée au redresseur Bit 0 : Mise en marche/arrêt du redresseur (0=arrêt 1=Mise en marche) Bit 1 : Mode de régulation (0=courant constant 1=tension constante) Bit 2 : Remise à zéro du compteur d'Ah. Toggle=changement d'état = remise à zéro Bit 3 : acquittement des alarmes. Toggle=changement d'état = acquittement Bit 4 : Démarrage/Arrêt séquence  Bit 8 : Mode amorçage (0=mode polarisation 1=mode amorçage) 1 WORD PLC->VK Statut du redresseur Bit 0 : Etat de marche. 0=arrêté 1=en marche Bit 1 : Alarme disjoncteur. 0=pas d'alarme 1=en alarme. Bit 2 : Alarme régulation. 0=pas d'alarme 1=en alarme. L'alarme régulation doit être activée lorsque le redresseur ne peut pas atteindre la valeur à réguler. Il est remis à zéro lorsque le bit 3 du regsitre de commande change d'état. Bit 3 : Défaut retour de marche Bit 4 : Défaut régulation Bit 5 : Redresseur en alarme Bit 6 : Défaut disjoncteur Bit 7 : Défaut mode amorçage Bit 8 : Statut amorçage (0=polarisation 1=amorçage) 2 REAL VK->PLC Consigne de courant. La consigne de courant correspond à la valeur ( en ampère) à réguler lorsque le mode de régulation = courant constant. Si le mode de régulation = tension constante alors cette consigne correspond à la valeur maximale de courant à délivrer par le redresseur. 3 REAL VK->PLC Consigne de tension. La consigne de tension correspond à la valeur (en volt) à réguler lorsque le mode de régulation = tension constante. Si le mode de régulation = courant constant alors cette consigne correspond é la valeur maximale de tension à délivrer par le redresseur. 4 REAL PLC->VK Courant actuel (en ampères) délivré par le redresseur. 5 REAL PLC->VK Tension actuelle (en volts) délivrée par le redresseur. 6 REAL PLC->VK Compteur ampères/secondes déjà délivré par le redresseur. Ce compteur est mis à zéro lorsque le bit2 du registre de commande change d'état. L'interface avec les redresseurs PULSPLCRECTIFIER Configuration Le device se configure de la manière suivante: [Device2] Protocol=PULSPLCRECTIFIER Les redresseurs se configurent de la manière suivante: [Rectifier1] Device=2 Position=28 Surface=1 AhorAmn=Amn MaxI=150 MaxU=15 MaxRI=450 MaxRU=45 PulsMode=1 DBIO=50 REGIO=0 CurrentFormDb=51 CurrentFormReg=0 Version=2 BrandName=PE86CB DualRangeMode=0 Mot clef Description Device Numéro du device Position Index de la position dans la définition machine Surface 1=avant A, 2=arrière A, 3=Total avant & arrière A, 4=avant B, 5=Arrière B, 6=Total avant et arrière B, 7=Total de toutes les surfaces. AhorAmn Ah=Ampères heures, Amn=Ampères minutes PulseMode 0=mode DC 1=Mode pulsé MaxI Courant max positif en Ampère MaxU Tension max positive en Volt MaxRI Courant max négatif en Ampère MaxRU Tension max négative en Volt DDBIO Numéro du DB d'échange REGIO Numéro du premier registre d'échange CurrentFormDB Numéro du DB de la table de la forme de courant CurrentFormReg Numéro du premier registre de la table de la forme de courant Version Numéro de version du protocole BrandName Nom du type de redresseur DualRangeMode 1 = plusieurs redresseurs pour la même position. La consigne permet de choisir le redresseur si celle-ci est <= au MaxI. Les registres d'échange Cette page décrit l'échange des données entre le PC et l'automate programmable en ce qui concerne la commande d'un redresseur. Registre Type Direction Description 0 WORD VK->PLC Commande envoyée au redresseur Bit 0 : Mise en marche/arrêt du redresseur (0=arrêt 1=Mise en marche) Bit 1 : Démarrage redresseur (0=standby 1=Auto) Bit 2 : Remise à zéro du compteur d'Ah. Toggle=changement d'état = remise à zéro Bit 3 : Acquittement des alarmes. Toggle=changement d'état = acquittement Bit 4 : Prise en compte des changements. Lorsqu'un nouveau step est envoyé dans le CurrentFormDB ou que le % de la consigne change, le programme inverse ce bit. Toggle = changement de courbe ou de % de consigne. 1 WORD PLC->VK Statut du redresseur Bit 0 : Etat de marche. 0=arrêté 1=en marche Bit 1 : Etat démarrage 0=standby 1=démarré Bit 2 : Statut des alarmes. 0=OK 1=en alarme Bit 3 : Statut des warnings. 0=OK 1=il existe des warning Bit 4 : Statut des warnings from the past. 0=OK 1=Warning from the past  2 WORD VK->PLC Consigne du redresseur : 0-100% 3 REAL PLC->VK Courant actuel (en ampères) délivré par le redresseur.  4 REAL PLC->VK Tension actuelle (en volts) délivrée par le redresseur. 5 REAL PLC->VK Compteur ampères/secondes déjà délivré par le redresseur. Ce compteur est mis à zéro lorsque le bit2 du registre de commande change d'état. 6 DWORD PLC->VK Messages actuels 1-4 7 DWORD PLC->VK Message actuel 5 8 DWORD PLC->VK Messages from the past 1-4 9 DWORD PLC->VK Message from the past 5 Table de la forme de courant (Version=1) Les formes de courant est composée de max 10 steps sous la forme suivante: Registre Type Description 0 INT Step 1: Courant Ix1 en Ampères. Plage -3276.8 à 3276.7. Courant multiplié par 1000 si MaxI<=25A et que BandName='PE86CB' ou 'PE526'. Si MaxI>25 et que BandName='PE86CB' ou 'PE526' alors le courant est multiplié par 100 sinon le courant est multiplié par 10. 1 INT Step 1: Courant Ix2 en Ampères. Plage -3276.8 à 3276.7. Courant multiplié par 1000 si MaxI<=25A et que BandName='PE86CB' ou 'PE526'. Si MaxI>25 et que BandName='PE86CB' ou 'PE526' alors le courant est multiplié par 100 sinon le courant est multiplié par 10. 2 INT Step 1: Tension Ux1 en Volts. Plage -3276.8 à 3276.7. Tension multipliée par 1000 si MaxI<=25A et que BandName='PE86CB' ou 'PE526'. Si MaxI>25 et que BandName='PE86CB' ou 'PE526' alors la tension est multipliée par 100 sinon la tension est multipliée par 10. 3 INT Step 1: Tension Ux2 en Volts. Plage -3276.8 à 3276.7. Tension multipliée par 1000 si MaxI<=25A et que BandName='PE86CB' ou 'PE526'. Si MaxI>25 et que BandName='PE86CB' ou 'PE526' alors la tension est multipliée par 100 sinon la tension est multipliée par 10. 4 WORD Step 1: Time Tx1 en x20 S. Plage 0s to 1.307 secondes 5 WORD Step 1: Time Tx2 en x20 S. Plage 0s to 1.307 secondes 6 BYTE Step 1: Slope (option) 7 BYTE Step 1: Nombre de cycle 8 INT Step 2: Courant Ix1 en Ampères. Plage -3276.8 à 3276.7 9 INT Step 2: Courant Ix2 en Ampères. Plage -3276.8 à 3276.7 10 INT Step 2: Tension Ux1 en Volts. Plage -3276.8 à 3276.7 ...     79 BYTE Step10: Nombre de cycle Table de la forme de courant (Version=2) Les formes de courant est composée de max 10 steps sous la forme suivante: Registre Type Description 0 INT Step 1: Courant Ix1 en Ampères. Plage -3276.8 à 3276.7 1 INT Step 1: Courant Ix2 en Ampères. Plage -3276.8 à 3276.7 2 INT Step 1: Tension Ux1 en Volts. Plage -3276.8 à 3276.7 3 INT Step 1: Tension Ux2 en Volts. Plage -3276.8 à 3276.7 4 WORD Step 1: Time Tx1 en x20 S. Plage 0s to 1.307 secondes 5 WORD Step 1: Time Tx2 en x20 S. Plage 0s to 1.307 secondes 6 WORD Step 1: RESERVE 7 WORD Step 1: Nombre de cycles 8 WORD Step 1: RESERVE 9 WORD Step 1: numéro du step 0 à 10. 0=Fin des steps 10 INT Step 2: Courant Ix1 en Ampères. Plage -3276.8 à 3276.7 11 INT Step 2: Courant Ix2 en Ampères. Plage -3276.8 à 3276.7 12 INT Step 2: Tension Ux1 en Volts. Plage -3276.8 à 3276.7 ...     99 WORD Step10: Numéro du step 0 à 10. 0=Fin des steps Utilisation d'un liftout sur les machines de type FPL Description Les liftouts n'ont pas été intégrés sur les machines de type FPL car dans ces machines, il n'y a pas de déplacement à une hauteur intermédiaire. Le déplacement est soit en haut ou soit en bas. Les autres mouvements horizontaux sont interdit. Le fonctionnement autour d'un liftout demande donc des modifications dans le contrôleur de bras (automate programmable) et dans QuickView. Ce document décrit les modifications qui seront réalisées dans QuickView pour rendre possible le fonctionnement de positions équipées de liftout. Une description des nouvelles commandes ainsi que des nouveaux statuts sera également documentée. Le type de liftout utilisé dans ce document est un ascenseur en forme de cage qui permet de sortir complètement des pièces de la cuve sans devoir utiliser le transporteur. Le transporteur, quant à lui, doit pouvoir : Déposer une charge dans la position lorsque l'ascenseur est en haut Déposer une charge dans la position lorsque l'ascenseur est en bas Prendre une charge depuis la position lorsque l'ascenseur est en haut Prendre une charge depuis la position lorsque l'ascenseur est en bas Pour fonctionner correctement, les 2 positions avant et après la position du liftout doivent être définies mais ne doivent pas être utilisées pour déposer une charge. Il faut donc interdire les mouvements verticaux avec une charge sur ces positions. Cette interdiction doit être réalisée dans l'automate. Il faut également que la hauteur de passage sous la balancelle lorsque l'ascenseur est en position haute soit définie dans le statut du transporteur. Il doit y avoir un nouveau détecteur sur le transporteur pour détecter cette position (ou détecteur virtuel si un encodeur est utilisé) Déposer une charge "Ascenseur en haut" Il n'est pas possible de venir déposer une charge lorsque l'ascenseur est en haut. Il faut d'abord amener la charge en position, monter l'ascenseur, puis descendre à la hauteur de dépose "haute". Il faut ensuite déplacer le transporteur à gauche ou à droite puis descendre le transporteur jusqu'en bas. l'ascenseur peut alors descendre la charge jusqu'en bas. Pour permettre ces mouvements, de nouvelles commandes doivent être ajoutées dans l'interface: Commande de descendre à la hauteur de passage sous la balancelle à la hauteur "Haute" du liftout (Dépose en position haute). Commande de descendre tout en bas depuis la hauteur La vitesse utilisée lors de ces mouvements sera la vitesse "Semi verticale". Il ne faut pas tenir compte de la vitesse envoyée dans la commande. Déposer une charge "Ascenseur en bas" Cette fonction est la même que sur une position sans liftout. Les vitesses utilisées sont celles définies dans la séquence ou dans la position. Prendre une charge "Ascenseur en haut" Pour prendre une charge du liftout en position haute, il faut que le transporteur se déplace sur la position précédant le lift, monter le transporteur à la hauteur HLiftout, se déplacer sur la position du liftout, monter jusqu'en haut, descendre l'ascenseur puis se déplacer sur la position de destination et descendre. Pour permettre ces mouvements, de nouvelles commandes doivent être ajoutées dans l'interface: Commande de monter à la hauteur de passage sous la balancelle (HLiftout). Commande de monter tout en haut depuis la hauteur HLiftout. La vitesse utilisée lors de ces mouvements sera la vitesse "Semi verticale". Il ne faut pas tenir compte de la vitesse envoyée dans la commande. Prendre une charge "Ascenseur en bas" Cette fonction est la même que sur une position sans liftout. Les vitesses utilisées sont celles définies dans la séquence ou dans la position. Déplacement à vide par dessus la position liftout "Ascenseur pas en bas" Lorsque l'ascenseur n'est pas en bas, il sera possible de se déplacer avec le transporteur par dessus de la position uniquement si celui-ci est vide. Un transporteur ôchargé" ne peut pas traverser en dessus de la position. Pour traverser, le transporteur doit: se déplacer à la position précédant la position équipée du liftout, monter tout en haut, se déplacer à la position suivant le liftout, descendre jusqu'en bas et continuer ses mouvements. Les paramètres, statuts et commandes de l'ascenseur l'ascenseur procède quelques paramètres: Vitesse de montée en mm/sec lors d'un déplacement dans le liquide (word) Vitesse de montée en mm/sec lors d'un déplacement en dehors du liquide (word) Vitesse de descente en mm/sec lors d'un déplacement dans le liquide (word) Vitesse de descente en mm/sec lors d'un déplacement en dehors du liquide (word) Position en mm lorsque l'ascenseur est en bas (word) Position en mm lorsque l'ascenseur est en haut (word) Un registre automate est utilisé pour chacun des paramètres. Les paramètres de vitesse pourront être défini dans la commande d'équipement. Les commandes suivantes sont possibles: Arrêter = 0 Monter = 1 Descendre = 2 Un registre de commande doit être réservé pour transmettre la commande à l'automate (word) Les statuts suivants doivent être disponibles: l'ascenseur est en haut (bit) l'ascenseur est en bas (bit) l'ascenseur monte (bit) l'ascenseur descend (bit) Position actuelle de l'ascenseur en mm (word) Commandes couvercle Les commandes du couvercle doivent être gérées par l'automate programmable. Lorsqu'une commande de monter de l'ascenseur est détectée, le couvercle doit s'ouvrir. Le VK ne vérifie pas ceci. Interface avec le contrôleur de transporteur CB07FCL Les registres d'échange Les registres de commande et de statut sont définis comme suit: Registre Type Direction Description 0 WORD VK -> PLC Hoist command: Bit 0 : Hoist command Bit 1 : Hoist command Bit 2 : Hoist command Bit 3 : Hoist command   Commandes possibles:   $0: Commande pince et rotation sans mouvement:        Bit 4 : On = Ouvrir pince       Bit 5 : On = Fermer pince       Bit 8..E = No de cycle de rotation, 0=Arrêt   $1: Commande de déplacement du robot.       Bit 4 : On = Ouvrir la pince       Bit 5:  On = Fermer la pince   $2: Stop   $4: Déplacement à l'origine (initialisation)   $8: Changement de mode:       Bit 4 = On = Mode Joystick       Bit 4 = Off = Mode automatique     Bit 15 : Trigger new command   1 WORD VK -> PLC Vitesse et accéleration à utiliser pour la commande de déplacement Bit 0..3 : Vitesse horizontale à utiliser (1,,10) Bit 4..5 : Accélération horizontale à utiliser (1..3) Bit 8..B : Vitesse verticale à utiliser (1..10) Bit C..D: Accéleration verticale à utiliser (1..3) 2 WORD VK -> PLC Position horizontale à atteindre (mm) 3 WORD VK -> PLC Position verticale à atteindre (mm) 4 WORD PLC -> VK Statut du robot: Bit 0: Mode actuel du robot 0=joystick 1=auto Bit 1: On=Le robot monte Bit 2: On=Le robot descend Bit 3: On=Le robot se déplace horizontalement Bit 4: On=Origine verticale atteinte Bit 5: On=Origine horizontale atteinte Bit 6: On=Le robot se déplace à l'origine Bit 7: On = La pince est fermée Bit 8: On = la pince est ouverte Bit 9: On = la rotation est activée Bit 13: On = Alarme bloquante. Bit 14: On = robot est prêt pour une nouvelle commande Bit 15: Trigger commande acceptée 5 WORD PLC -> VK Position horizontale du robot 6 WORD PLC -> VK Position vertical du robot Interface avec les transferts Les transferts permettent le transport de charges d'une branche de la machine à une autre branche. Les transferts sont représentés comme suit: Dans QuickView, il est possible de définir 4 transferts au maximum. Ils sont définis dans le fichier VKServer.ini dans les sections [ShuttleX] ;---------------> SHUTTLE [SHUTTLE1] Db=29 RegCommand=0 RegStatus=1 Mode=1 DefaultMachine=0 [SHUTTLE2] Db=29 RegCommand=3 RegStatus=4 Mode=1 DefaultMachine=1 Les mots clef suivant sont possibles: Mot clef Type Description DB Integer Numéro de databank dans lequel se trouve les registres de statut et de commande DBCom Integer Numéro de databank si le DB de statut et différent du DB de commande RegComand Integer Numéro de registre dans lequel les commandes sont écrites RegStatus Integer Numéro de registre dans lequel les statuts sont écrits par l'automate Mode Integer Mode de fonctionnement une fois la charge déposée dans la destination: 0: Renvoie le transfert à la position d'origine. 1: Renvoie le transfert à la position par défaut. 2: Renvoie le transfert à la machine dont un mouvement robot est prévu. 3: Ne rien faire DefaultMachine Integer Numéro de la branche de la machine dans laquelle le transfert est envoyé à la fin d'un mouvement Le registre de statut est constitué comme suit: Bits Description 0 Le transfert se trouve dans la branche 0 de la machine 1 Le transfert se trouve dans la branche 1 de la machine 2 Le transfert se trouve dans la branche 2 de la machine 3 Le transfert se trouve dans la branche 3 de la machine 4 Le transfert se déplace vers la branche 0 de la machine 5 Le transfert se déplace vers la branche 1 de la machine 6 Le transfert se déplace vers la branche 2 de la machine 7 Le transfert se déplace vers la branche 3 de la machine Le registre de commande est constitué comme suit: Bits Description 0 Demande de déplacement vers la branche 0 de la machine 1 Demande de déplacement vers la branche 1 de la machine 2 Demande de déplacement vers la branche 2 de la machine 3 Demande de déplacement vers la branche 3 de la machine Il existe d'autres mots clef utilisés par les transferts: Mots clef Type Valeur par défaut Description Parameters.ini[System]CheckMovementOverShuttlePrio Boolean 0 Avant d'envoyer un transfert dans une branche de la machine, le système doit vérifier si un mouvement d'un robot est en cours au dessus d'une position d'un transfert. Si actif, la vérification est effectuée en mode prioritaire. Parameters.ini[System]NoMoveToNearesetShuttlePrio Boolean 0 Lorsqu'un robot a pris une charge dans une position ayant pour destination un transfert, il se déplace à la position la plus proche du transfert si le transfert est en cours de déplacement. Si ce mot clef est activé, le robot ne se déplace pas vers la position la plus proche, il attend au dessus de la position sur laquelle il a pris la charge. Parameters.ini[System]PrioOverLoadedShuttle Boolean 0 Si mot clef est activé cela indique au système qu'il n'est pas autorisé à un robot de se déplacer au dessus d'un transfert chargé. Parameters.ini[System]Shuttle1 Integer 30 Temps de déplacement du transfert 1 d'une branche à l'autre en secondes. Parameters.ini[System]Shuttle2 Integer 30 Temps de déplacement du transfert 2 d'une branche à l'autre en secondes. Parameters.ini[System]Shuttle3 Integer 30 Temps de déplacement du transfert 3 d'une branche à l'autre en secondes. Parameters.ini[System]Shuttle4 Integer 30 Temps de déplacement du transfert 4 d'une branche à l'autre en secondes. Parameters.ini[System]ShuttleFree1 Integer 60 Temps libre nécessaire pour le calcul d'utilisation du transfert 1.   Parameters.ini[System]ShuttleFree2 Integer 60 Temps libre nécessaire pour le calcul d'utilisation du transfert 2.   Parameters.ini[System]ShuttleFree3 Integer 60 Temps libre nécessaire pour le calcul d'utilisation du transfert 3.   Parameters.ini[System]ShuttleFree4 Integer 60 Temps libre nécessaire pour le calcul d'utilisation du transfert 4.   VKServer.ini[System]DoNotCheckShuttleMoving Boolean 0 Si activé, le système ne vérifie pas les bits de statut indiquant le déplacement d'un transfert pour positionner un robot Procédure de mise en service d'un CB07FPL 1 Réglage de l'axe horizontal Commencer les réglages avec le premier robot, et cela pour chaque ligne. Régler les paramètres de configuration ·         Type de bras ·         N° du bras en arrière ·         N° du bras en avant ·         N° de l'axe horizontal ·         N° de l'axe vertical Se référer à la documentation " Library_FPL.chm ? si nécessaire (librairie FPL ® \ CB07a \ DB \ H_Par_Hoist). Définir les valeurs des positions      Introduire les valeurs des distances des positions de manière approximative.  Régler les paramètres des Grandeurs physiques -       Définir les largeurs du robot en arrière et avant en fonction du centre de la potence et les extrémités des encombrements en avant et en arrière. -       VKServer \ System parameters \ Hoists: entrer les mêmes valeurs en y ajoutant 50mm et mettre à jour la largeur du robot. -       Définir les limites physiques en arrière et en avant selon la configuration de la machine (butés mécaniques, chaine porte cÔbles mais sans tenir comptes des autres robots). -       Introduire les paramètres suivants : ·         Offset de référence = 0 ·         Offset de recouvrement = 0 ·         Fenêtre au point de positionnement = 3 ·         Zone d'arrêt = 3 ·         Distance d'arrêt anticipé de l'agitation = 100 ·         Distance d'arrêt anticipé de l'agitation avant prise = 100 ·         Distance d'ouverture anticipée des couvercles = 0 ·         Distance d'ouverture anticipée du bac d'égouttage = 0   Régler les paramètres des Positions logiques -       Régler les limites logiques en arrière et en avant en fonction des valeurs des positions et des limites physiques. -       VKServer \ System parameters \ Hoists: entrer les mêmes valeurs dans les positions min et max hardware. -       Si utilisation d'un axe relatif, définir les paramètres suivants ·         Position de destination après initialisation ·         Sens d'initialisation -       Régler les paramètres des Vitesses -       Régler les paramètres avec les valeurs typiques suivantes : ·         Vitesse d'initialisation= 0 ·         Vitesse manu horizontale= 150 ·         Vitesse semi horizontale= 250..400 ·         Vitesse auto horizontale= 500..1000 (en fonction des caractéristiques du constructeur). ·         Accélération horizontale= 300..400 Régler le paramètre du Time-out Régler le Time-out mouvement horizontal à 60. Mouvement en mode manuel -       Faire des mouvements en avant / arrière et ajuster les paramètres de l'axe correspondant. -       Aller en butée avant/arrière à pleine vitesse et contrôler que le robot s'arrête correctement sans rentrer en collision avec les butées/robots. Si nécessaire, augmenter ou diminuer les largeurs du robot afin d'obtenir un arrêt correct. Attention la modification de la vitesse manuelle et de l'accélération peuvent influencer sur l'arrêt. Si ces paramètres sont modifiés, il faut tester à nouveau !  Si les largeurs ont été modifiées il faut mettre à jour les paramètres dans le VKServer \ System parameters \ Hoists en y ajoutant 50mm et mettre à jour la largeur du robot. Mouvement en mode Auto -       Tester les déplacements en automatique et contrôler le positionnement pour des mouvements courts et longs. Ajuster les paramètres de l'axe correspondant si nécessaire. 2 Réglage de l'axe vertical Régler les paramètres des Vitesses -       Régler les paramètres avec les valeurs typiques suivantes : ·         Vitesse manu verticale = 15 ·         Vitesse semi verticale = 25 ·         Vitesse d'approche verticale = 15 ·         Accélération verticale = 300..400 Régler le paramètre du Time-out Régler le Time-out mouvement vertical à 20. Mouvement en mode manuel Faire des mouvements en haut / bas et ajuster les paramètres de l'axe correspondant. Définir les paramètres des mouvements verticaux -       Pour tous les types de montée utilisés (Up et Up-Demi), il faut définir un step correspondant à la sortie du rack du Vé, puis le compléter en fonction du mouvement souhaité. Par exemple Up1 ·         Vitesse1 = 20 |           Temps1 =  1500 ·         Vitesse2 = 100            |           Temps2 = 3500 Cela est nécessaire pour l'enclenchement de l'agitation dès la sortie du Vé.   -       Pour tous les types de descentes utilisés (Down et Dw-Demi), il faut veiller que le rack soit en vitesse d'approche lorsque le rack arrive dans le Vé. Cela est nécessaire pour l'arrêt retardé de l'agitation. Attention risque de crash si cela n'est pas respecté. Mouvement en mode Automatique -       Tester et optimiser chaque type défini. VKServer \ System parameters \ Lift time: compléter le tableau avec les valeurs correspondantes. 3 Régalge des robots suivants de la même ligne Lorsque le premier robot de la même ligne est en service, il faut répéter les opérations décrites dans les º1 et 2 relatives au robot pour les robots suivants. Seul le régalge de l'offset de recouvrement diffère : Réglage de l'offset de recouvrement -       Définir une position commune (entre le robot mis en service le robot suivant) comme référence. Ajuster l'offset de recouvrement du bras à mettre en service sur cette la position de référence 4 Réglages des valeurs de positions Réglage des valeurs des positions -       Introduire les valeurs des distances des positions de manière précise. Mettre à jour les distances dans le VKServer en utilisant la commande du menu Hoists : read positions distances from PLC. 5 Test des interfaces Test de l'interfaces de couvercles En mode semi ou auto, faire un mouvement de montée / descente sur chaque position équipée d'un couvercle pour tester l'interface. Test de l'interface des agitations  En mode semi ou auto, faire un mouvement de montée / descente sur chaque position équipée d'une agitation pour tester l'interface. Test de l'interface des transferts -       En mode semi ou auto, déplacer le robot sur le transfert, puis dès le départ du mouvement du robot : ·         Contrôler que le transfert ne peut pas se déplacer (verrouillage) -       En mode semi ou auto, déplacer le transfert, puis dès le départ du mouvement du transfert : ·         Contrôler que le robot ne peut pas se déplacer sur le transfert (verrouillage) 6 Test des anti-collisions Test dans le sens en " avant ? en mode Automatique -       Positionner tous les robots de la même ligne sur la position correspondant à leur limite logique en arrière. -       Déplacer le premier robot de position en position et contrôler que les robots suivants soient dégagés correctement. Lorsque le premier robot a atteint sa limite logique en avant, continuer avec le deuxième robot, etc. Test dans le sens en " arrière ? en mode Automatique -       Positionner tous les robots de la même ligne sur la position correspondant à leur limite logique en avant. -       Déplacer le dernier robot de position en position et contrôler que les robots précédents soient dégagés correctement. Lorsque le dernier robot a atteint sa limite logique en arrière, continuer avec le robot précédent, etc. Répéter le test pour chaque ligne de l'installation. 7 Test de la sécurité  Tester la fonctionnalité du détecteur de position occupée. Tester un arrêt mouvement en pleine vitesse (attention à respecter les caractéristiques du constructeur). 8      Test du positionnement Attention : ne pas exécuter ce test avec des bouclards, tonneaux ou autres supports qui seraient en contact avec les bains s'il y a de la chimie dans les bains. Risque de pollution !          Crée un programme de test allant dans toutes les positions        Sélectionner dans le VKServer \ Systems parameters \ Repeat Load        Mettre le programme et la gare en mode automatique        Charger le programme de test        Surveiller les mouvements des robots. 9      Optimisation des anticipations -       Régler les paramètres suivants : Distance d'arrêt anticipé de l'agitation Distance d'arrêt anticipé de l'agitation avant prise Distance d'ouverture anticipée des couvercles Distance d'ouverture anticipée du bac d'égouttage Afin que les mouvements des robots ne soient pas retardés, mais tout en conservant un temps maximum d'agitation.  Interface avec le contrôleur de transporteur CB25FPLA Le contrôleur de transporteur CB25FPLA est un contrôleur pour robot spécial. Il permet de transporter des paniers à l'aide de crochets. Pour se déplacer horizontalement, les crochets doivent être en-haut. C'est pout cela que ce transporteur ne se déplace horizontalement qu'en haut. Le principe pour prendre une charge est de se décaler du centre de la position, descendre, se centrer puis prendre la charge. Pour la dépose c'est le même principe, aller sur une position, descendre puis se décaler et remonter. Le CB25FPLA a une autre spécialité c'est le transport de 2 paniers en même temps: un petit panier à l'intérieur d'un grand panier. Sur certaines positions de la machine, le petit panier doit être extrait du grand panier pour continuer. Les registres d'échange Les registres de commande et de statut sont définis comme suit: Registre Type Direction Description 0 DWORD VK->PLC Hoist command: Bit 0 : Hoist command Bit 1 : Hoist command Bit 2 : Hoist command Bit 3 : Hoist command Bit 4 : ON if next movement is a lift command (UP or DOWN movement). Bit 5 : ON when horizontal movement is without rack holder (jig). Bit 6 : ON for small basket  OFF for big basket Bit 7 : Movement data Bit 8 : Movement data Bit 9 : Movement data Bit 10 : Movement data Bit 11 : Movement data Bit 12 : Movement data Bit 13 : Movement data Bit 14 : Movement data Bit 15 : Trigger new command Bit 16 : Reset buffer Bit 17 : Program is in AUTO mode Bit 18 : Extraction of small basket from big one Bit 19 : Reintroduction of small basket into big one Bit 20..Bit 31: (reserve) 1 DWORD VK->PLC Hoist equipement command : Bit 0 : Barrel rotation type Bit 1 : Barrel rotation type Bit 2 : Barrel rotation type Bit 3 : Barrel rotation type Bit 4 : ON if drip tray must be in closed position Bit 5.. Bit 31 : (reserve) 2 DWORD PLC->VK Hoist Status : Bit 0 : Hoist mode Bit 1 : Hoist mode Bit 2 : Hoist mode 0=OFF 1=Manual 2=Semi-auto 4=Automatic Bit 3 : ON when hoist is ready to accept new command Bit 4 : ON when a blocking alarm is pending (register 3 is not empty) Bit 5 : ON when drip tray is in closed position Bit 6 : ON when hoist is moving horizontaly Bit 7..14 : Logical horizontal position of the hoist (0..255) Bit 15 : Trigger command terminated Bit 16 : ON when lift 1 is in low vertical position Bit 17 : ON when lift 1 is in upper vertical position Bit 18 : ON when lift 1 is lowering Bit 19 : ON when lift 1 is lifting Bit 20 : ON when lift 1 is in intermediate vertical position Bit 21 : ON when clip on lift 1 is closed (clipped) Bit 22 : ON when hoist is agitating Bit 23 : ON when lift 1 is in HLiftout vertical position Bit 24..Bit 28 : (reserve) Bit 29 : ON when hoist is shifted Bit 30 : (reserve) Bit 31 : (reserve) 3 DWORD PLC->VK Alarm bits. Program should go to STOP mode: Bit 0..31 : Alarm indication 4 DWORD PLC->VK Warning bits. Program continue in AUTO mode: Bit 0..31 : Warning indication Cobian backup Le logiciel Cobian est un outil qui permet de sauvegarder les fichiers et la base de donnée de l'application Quickview. Dans le dossier C:\VK-WinQV\Addon\Cobian, exécuter le fichier cbSetup.exe pour installer Cobian Backup 11. Utiliser l'outil en tant que service pour un client. Si c'est pour des tests, utiliser le en tant qu'application. Dans la barre des notifications Windows, vous trouverez Cobian: Copier le dossier "C:\VK-WinQV\Addon\Cobian\Backup" dans le dossier racine Quickview "C:\VK-WinQV\Backup" Dans le script "BackupDatabase.bat", vérifier le chemin d'accès à l'outil de compression Firebird "Gbak.exe". Sauvegarde des fichiers de l'application Quickview Clique droit, Edit task... Définir le dossier de destination des sauvegardes: Définir la fréquence des sauvegardes: Le nombre de copies à conserver: Compression du fichier Ne pas copier la base de donnée: Sauvegarde de la base de donnée Quickview Clique droit, Edit task... Créer manuellement le dossier source "C:\VK-WinQV\Backup\DBase": Définir le dossier de destination des sauvegardes: Définir la fréquence des sauvegardes: Le nombre de copies à conserver: Compression du fichier Scripts à exécuter avant et après la sauvegarde: Résultats Lancer un test en cliquant sur RUN: La fonction "RFID Follower" Lorsque QuickView est utilisé sur une machine manuelle (sans robot), la fonction "RFID Follower" peut est utilisée pour suivre les manipulations faites pas l'opérateur. Pour permettre le suivi des charges, des lecteurs RFID devront être installés sur les positions devant être suivi Configuration des robots virtuels Pour pouvoir utiliser la fonction "RFID Follower", un robot virtuel doit être défini. Ceci se fait dans le fichier VKServer.ini dans la section [Hoist1]. Cette section est utilisée pour définir le robot n°1 de la machine. Dans le cas d'une machine manuelle, le type de robot doit être défini comme Type=CBSim2. Ce type de robot demande l'utilisation d'un DB de données ainsi qu'un DB Table. Exemple de configuration: [Hoist1] Type=CBSim2 DbData=23 RegData=0 DbTable=80 RegTable=0 Le DBTable Le DBTable permet de transmettre les RFID lus par les lecteurs à QuickView. Chaque registre de ce DB correspond à une position de la machine. Le premier registre à la position 1, le deuxième à la position 2 et ainsi de suite. Le DB doit contenir autant de registres string qu'il y a de positions machine. Si une position n'est pas équipée alors le registre sera toujours vide mais doit exister. Exemple d'un DBTable pour 32 positions: [Databank80] Device=1 Channel=380 Regi=0 Regf=31 Pool=1000 RegType=String Les bases de données Ce chapitre décrit la structure des bases de données utilisées dans le système Les divers types de bases de données VKQuickView utilise actuellement 3 types de base de données : BDE, Firebird et ODBC. BDE (Borland Database Engine) Installation Cette base de données est installée automatiquement lors de la procédure d'installation de VKQuickView si son option d'installation a été sélectionnée ou si l'installation par défaut a été choisie. Si l'option a été choisie, un programme séparé d'installation est exécuté à la fin de l'installation du logiciel. Utilisation La BDE est utilisée uniquement par le programme " Client ? pour stocker les données utilisées par les divers postes de charge. Lors du démarrage du programme " Client ?, le système vérifie la présence du fichier de base de données et le crée dans le cas où celui-ci n'existerai pas. Pour les postes de charge 0 à 35, ce fichier s'appelle " DBase\Database.DBF ?. A partir du poste de charge N° 36, ce fichier s'appelle " Dbase\Database[N° de poste de charge].DBF. Si vous changez de n° de poste de charge après le premier démarrage du système, il faut obligatoirement effacer l'ancien fichier si le nouveau et l'ancien poste de charge est plus petit que 35 car les champs définis dans les tables ne sont pas forcément identiques. Ce type de base de données est uniquement destiné aux mises à jour d'ancien équipement. Sur les nouvelles machines, ce type a été remplacé par une base de données relationnelles de type Firebird. Firebird Firebird est un moteur de bases de données relationnelles open sources. Il existe différentes versions de ce logiciel. La structure des fichiers de base de données change selon la version utilisée mais elle reste compatible lorsque vous passez d'une ancienne version à une version plus récente. l'inverse n'est pas vrai. Installation Lors de l'installation du logiciel VKQuickView, une option d'installation permet de choisir de copier le fichier d'installation de Firebird sur le disque dur du PC dans le répertoire " VK-WinQV\ADDON ?. Ce programme d'installation n'est pas lancé automatiquement pendant la phase d'installation du logiciel VKQuickView. Pour installer le moteur Firebird, il faut ouvrir l'explorateur Windows et localiser le programme d'installation qui se trouve dans le répertoire C :\VK-WinQV\Addon. Lors de la fabrication du CD d'installation, la dernière version publiée de Firebird est installée. Actuellement c'est la version 3.0.7 qui est contenue dans le fichier d'installation " Firebird-3.0.7.33374_1_Win32 ?. Utilisation Le suivi des charges "Reporting" Cette base de données est utilisée pour l'enregistrement des événements qui se passent pendant le passage des pièces dans la machine. l'affichage des rapports de charge utilise cette base de données. Pour pouvoir utiliser la base de données, il faut la configurer dans les fichiers VKWinQV.ini et VKServer.ini. La section se nomme [Database] (voir aide QuickView). Lors du démarrage du programme Client, le système vérifie la présence du fichier de base de données. Si celui-ci n'existe pas, un nouveau fichier est créé (seulement si le fichier se trouve sur le poste local (nom du fichier commençant par " localhost : ?)). La base de données "Articles" du poste de charge N° 11 Cette base de données est utilisée pour stocker les informations des pièces et des gammes du poste de charge N° 11. Pour pouvoir utiliser la base de données, il faut la configurer dans le fichier VKWinQV.ini dans la section [PartDatabase] (Voir aide QuickView). Lors du démarrage du programme Client, le système vérifie la présence du fichier de base de données. Si celui-ci n'existe pas, un nouveau fichier est créé (seulement si le fichier se trouve sur le poste local). La base de données "Articles" du poste de charge N° 52 Cette base de données est utilisée pour stocker les informations des pièces et des gammes de traitement utilisés par le poste de charge N° 52. Pour pouvoir utiliser la base de données, il faut la configurer dans le fichier VKWinQV.ini. La section se nomme [PartLibrary] (voir aide QuickView). Lors du démarrage du programme Client, le système vérifie la présence du fichier de base de données. Si celui-ci n'existe pas, un nouveau fichier est créé (seulement si le fichier se trouve sur le poste local (nom du fichier commençant par " localhost : ?)). ODBC ODBC (Open Data Base Connectivity) n'est pas une base de données à proprement dit mais plutôt un accès à une base de données.  Pour pouvoir utiliser ODBC, il faut tout d'abord installer une base de données compatible avec ODBC par exemple MSSQL ou MSSQL Express. MSSQL Express est une version gratuite de MSSQL avec des limitations sur la quantité d'enregistrements possibles. Utilisation Le suivi des charges "Reporting" Cette base de données est utilisée pour l'enregistrement des événements qui se passent pendant le passage des pièces dans la machine. Pour pouvoir utiliser la base de données, il faut la configurer dans le fichier VKServer.ini. La section se nomme [ODBC]. La base de données doit être créée en utilisant un programme de management de la base de données. Il n'est pas possible de créer une base de données au travers de la connexion ODBC.  Le système test la présence des tables. Si les tables n'existent pas (nouvelle base de données), le système les crée automatiquement. ODBC-Customer Ce type de base de données fonctionne comme la connexion ODBC ci-dessus sauf que la base de données n'est pas gérée par le système mais par le client. Cette connexion est utilisée pour un accès à des données pièces pour remplir les champs de certains porte de charge.   La base de données "Article" du poste de charge N° 52 Cette base de données est utilisée pour stocker les informations des pièces et des gammes de traitement utilisés par le poste de charge N° 52Pour pouvoir utiliser la base de données, il faut la configurer dans le fichier VKWinQV.ini. La section se nomme [PartLibrary] (voir aide QuickView). Lors du démarrage de QuickView, le système vérifie la connexion avec la base de données. Si celle-ci est OK, il teste la présence des tables. Si les tables n'existent pas elles sont créées automatiquement.  La structure de la base de données "Reporting" Les bases de données " Reporting " comportent 10 tables : VK_ACTIONS Liste des actions possibles dans les messages VK_MSG_TYPES Liste des types de message. VK_ALARM_GROUPS Liste des groupes d'alarmes dans les 4 langues VK_ALARM_TYPES Liste des types d'alarmes dans les 4 langues VK_ALARM_MESSAGES Liste des messages des alarmes dans les 4 langues VK_LOADS Liste des charges introduites au poste de charge VK_LOAD_PARTS Liste des pièces des charges introduites au poste de charge VK_LOAD_TBS Liste des blocs de traitements des charges VK_LOAD_CONTROLS Liste des contrôles en sortie VK_MESSAGES Liste de tous les événements intervenus sur l'installation. La table "VK_MSG_TYPE" Cette table contient la liste des types d'actions (Champ TYPE_ID) de la table " VK_MESSAGES ?. Ces champs sont définis comme suit : Champ Type Description TYPE_ID Integer Numéro de l'action DESCRIPTION Varchar(200) Description du type 100 Take/Give load 200 Login/Logout 300 Alarm/return/ack 310 Alarm rack 400 Logger 500 Programme/Buffer mode/Divers 600 Message/return/ack 700 Chemical 800 Equipment controls 900 Buffer Messages 1000 MQTT Commands 1100 Hoist changes 1200 DailyData 1300 Position En/Hors service La table "VK_ACTIONS" Cette table contient la liste de toutes les actions (Champ ACTION_ID) de la table " VK_MESSAGES ?. Les champs sont définis comme suit : Champ Type Description ACTION_ID Integer Numéro de l'action DESCRIPTION Varchar(200) Description de l'action 101 Take Load 102 Drop Load 103 Ampères/heure réels 104 Ampères/heure théorique 105 Courants moyens 106 Tensions moyennes 107 Courants max 108 Tensions max 109 Consignes de courant 110 Consignes de tension 111 End Job OSCILine 112 Start Job OSCILine 113 Log Job data OSCILine 114 Log Job commande OSCILine 115 Log Job Status Change OSCILine 121.. 125 RecDBOut 131.. 135 RecDBIn 201 Login 202 Logout 301 Return 302 Acknowlege 303 Alarm 401 Log item 402 Log rectifier 403 Log US 404 Log validation data 405 Log validation Windows 406 Log rectifier setpoints 501 Programme Mode 502 Buffer Mode 503 Machine Mode 504 Log counters 505 Log dosing 506 Log Exchange mode 507 Log Execution Mode 508 Log Increment Delay 509 Log server Start/Stop 510 Log dosing pumps 511 Log makeup 601 Return message 602 Acknowlege 603 Message 701 Auto add chemical 702 Manu add chemical 801 Equipment controls 802 Equipment commands start 900 Save Buffer Messages 1001 MQTT DB Commands 1002 MQTT Login 1003 MQTT Alarm/Message ack 1004 MQTT Hoists commands 1101 Hoist change 1201 LastHour dailydata 1301 Position En Service 1302 Position Hors service La table "VK_ALARM_GROUPS" Cette table contient la liste des textes des groupes d'alarme dans les 4 langues. Ces champs sont définis comme suit : Nom du champ Type Fonction ALARMGROUP_ID Integer Numéro du groupe d'alarme MACHINE_ID Integer Numéro de la machine DESCRIPTION Varchar(200) Description du groupe (pas utilisé) NAME_LGU0 Varchar(50) Nom du groupe dans la langue 0 NAME_LGU1 Varchar(50) Nom du groupe dans la langue 1 NAME_LGU2 Varchar(50) Nom du groupe dans la langue 2 NAME_LGU3 Varchar(50) Nom du groupe dans la langue 3 STATUS Char(1) Status de l'enregistrement (pas utilisé) La table "VK_ALARM_TYPES" Cette table contient la liste des textes des types d'alarme dans les 4 langues. Ces champs sont définis comme suit : Nom du champ Type Fonction ALARMTYPE_ID Integer Numéro du type d'alarme MACHINE_ID Integer Numéro de la machine DESCRIPTION Varchar(200) Description du type (pas utilisé) NAME_LGU0 Varchar(50) Nom du type dans la langue 0 NAME_LGU1 Varchar(50) Nom du type dans la langue 1 NAME_LGU2 Varchar(50) Nom du type dans la langue 2 NAME_LGU3 Varchar(50) Nom du type dans la langue 3 STATUS Char(1) Status de l'enregistrement (pas utilisé) La table "VK_ALARM_MESSAGES" Cette table contient la liste des textes des messages d'alarme dans les 4 langues. Ces champs sont définis comme suit : Nom du champ Type Fonction ALARMMESSAGE_ID Integer Numéro du message d'alarme MACHINE_ID Integer Numéro de la machine DESCRIPTION Varchar(200) Description du message (pas utilisé) NAME_LGU0 Varchar(50) Nom du message dans la langue 0 NAME_LGU1 Varchar(50) Nom du message dans la langue 1 NAME_LGU2 Varchar(50) Nom du message dans la langue 2 NAME_LGU3 Varchar(50) Nom du message dans la langue 3 STATUS Char(1) Status de l'enregistrement (pas utilisé) La table "VK_LOADS" Cette table contient les données des charges créées sur les postes de charge des machines. Champ Type Description REC_ID BigInt PK Numéro d'identification. Ce champ sera la clef primaire de la table LOAD_ID Integer Numéro unique d'identification des charges MACHINE_ID Integer Numéro de la machine CUSTOMER_NAME Varchar(80) Nom du client CUSTOMER_NUMBER Varchar(16) Numéro du client CREATE_DATE Date Date de création CREATE_TIME Time Heure de création CREATE_TIMESTAMP DateTime Horodatage de création PROGRAM_NR Smallint Numéro de programme PROGRAM_NAME Varchar(80) Nom du programme PROGRAM_VERSION Integer Numéro de version du programme MODE_NR Smallint Numéro du mode d'équipement MODE_NAME Varchar(80) Nom du mode d'équipement MODE_VERSION Integer Numéro de version du mode d'équipement JIG_NR Smallint Numéro du porte rack POSITION_NR Smallint Numéro de la position de chargement REMARQUE1 Varchar(80) Remarque REMARQUE2 Varchar(80) Remarque RECEIPT_NAME Varchar(80) Nom de la recette (ID base de données parts) AREA_FRONT_A Float Surface N° 1 AREA_BACK_A Float Surface N° 2 AREA_FRONT_B Float Surface N° 3 AREA_BACK_B Float Surface N° 4 AREA_FRONT_C Float Surface N° 5 AREA_BACK_C Float Surface N° 6 AREA_FRONT_D Float Surface N° 7 AREA_BACK_D Float Surface N° 8 AREA_CHEM Float Surface chimique (surface totale) UP_TYPE Smallint Type de montée DOWN_TYPE Smallint Type de descente ROTATION_TYPE Smallint Type de rotation ROTATION_SPEED Smallint Vitesse de rotation SUPPORT_TYPE Smallint Type de support PANEL_TYPE Smallint Type de panneaux CHECK_SUM Integer Pas utilisé END_STATUS Smallint Statut de fin (1=charge OK 2=charge avec erreurs) UNLOAD_DATE Date Date de déchargement UNLOAD_TIME Time Heure de déchargement UNLOAD_TIMESTAMP DateTime Horodatage de déchargement DEPARTEMENT Varchar(80) Nom du département TEAM Varchar(80) Nom de l'équipe NUM_LOAD Smallint Numéro de la charge par rapport au nombre total TOTAL_LOAD Smallint Nombre total de charge VALIDATION Smallint Charge de validation TXT_1 Varchar(80) Texte libre (dépend du type de poste de charge) TXT_2 Varchar(80) " TXT_3 Varchar(80) " TXT_4 Varchar(80) " TXT_5 Varchar(80) " TXT_6 Varchar(64) " TXT_7 Varchar(64) " TXT_8 Varchar(64) " TXT_9 Varchar(64) " TXT_10 Varchar(64) " TXT_11 Varchar(32) " TXT_12 Varchar(32) " TXT_13 Varchar(32) " TXT_14 Varchar(32) " TXT_15 Varchar(32) " TXT_16 Varchar(32) " TXT_17 Varchar(32) " TXT_18 Varchar(32) " TXT_19 Varchar(32) " TXT_20 Varchar(32) " CHEM_NAME_1 Varchar(64) Nom du produit chimique N° 1 CHEM_NAME_2 Varchar(64) Nom du produit chimique N° 2 CHEM_NAME_3 Varchar(64) Nom du produit chimique N° 3 CHEM_NAME_4 Varchar(64) Nom du produit chimique N° 4 CHEM_NAME_5 Varchar(64) Nom du produit chimique N° 5 CHEM_NAME_6 Varchar(64) Nom du produit chimique N° 6 CHEM_NAME_7 Varchar(64) Nom du produit chimique N° 7 CHEM_NAME_8 Varchar(64) Nom du produit chimique N° 8 CHEM_NAME_9 Varchar(64) Nom du produit chimique N° 9 CHEM_NAME_10 Varchar(64) Nom du produit chimique N° 10 CHEM_NAME_11 Varchar(64) Nom du produit chimique N° 11 CHEM_NAME_12 Varchar(64) Nom du produit chimique N° 12 CHEM_NAME_13 Varchar(64) Nom du produit chimique N° 13 CHEM_NAME_14 Varchar(64) Nom du produit chimique N° 14 CHEM_NAME_15 Varchar(64) Nom du produit chimique N° 15 CHEM_NAME_16 Varchar(64) Nom du produit chimique N° 16 CHEM_LOT_1 Varchar(64) Numéro de lot du produit chimique N° 1 CHEM_LOT_2 Varchar(64) Numéro de lot du produit chimique N° 2 CHEM_LOT_3 Varchar(64) Numéro de lot du produit chimique N° 3 CHEM_LOT_4 Varchar(64) Numéro de lot du produit chimique N° 4 CHEM_LOT_5 Varchar(64) Numéro de lot du produit chimique N° 5 CHEM_LOT_6 Varchar(64) Numéro de lot du produit chimique N° 6 CHEM_LOT_7 Varchar(64) Numéro de lot du produit chimique N° 7 CHEM_LOT_8 Varchar(64) Numéro de lot du produit chimique N° 8 CHEM_LOT_9 Varchar(64) Numéro de lot du produit chimique N° 9 CHEM_LOT_10 Varchar(64) Numéro de lot du produit chimique N° 10 CHEM_LOT_11 Varchar(64) Numéro de lot du produit chimique N° 11 CHEM_LOT_12 Varchar(64) Numéro de lot du produit chimique N° 12 CHEM_LOT_13 Varchar(64) Numéro de lot du produit chimique N° 13 CHEM_LOT_14 Varchar(64) Numéro de lot du produit chimique N° 14 CHEM_LOT_15 Varchar(64) Numéro de lot du produit chimique N° 15 CHEM_LOT_16 Varchar(64) Numéro de lot du produit chimique N° 16 SERVER_VERSION Varchar(64) Numéro de version du programme VKServer STATUS Char(1) Statut de l'enregistrement (pas utilisé) OPERATOR_NAME Varchar(64) Nom de l'opérateur ayant chargé les données AUTOCONTROLS Smallint Nombre de contrôles à effectuer AUTOCONTROLS_RESULT Smallint Résultat des contrôles de l'opérateur AUTOCONTROLS_SUP_RESULT Smallint Résultat des contrôles du superviseur AUTOCONTROLS_DOUBLE_CONTROL Smallint 1 = un superviseur doit faire un contrôle  AUTOCONTROL_DATE Timestamp Date et heure du contrôle par l'opérateur AUTOCONTROL_USER Varchar(32) Nom de l'opérateur ayant réalisé les contrôles AUTOCONTROL_SUP_DATE Timestamp Date et heure du contrôle par le superviseur AUTOCONTROL_SUR_USER Varchar(32) Nom du superviseur ayant réalisé le double contrôle La table "VK_LOAD_PARTS" Cette table contient la liste des pièces chargées sur chaque charge. Champ Type Description PART_ID BigInt PK Numéro d'identification. Ce champ sera la clef primaire de la table LOAD_ID Integer Numéro de la charge MACHINE_ID Integer Numéro de la machine PART_NR Smallint Numéro de la pièce sur la charge (1..n) PART_TYPE Smallint Type de pièce : 0 : Outillage 1 : Pièce 2 : Billes REFERENCE Varchar(80) Référence de la pièce VAL_S1 Varchar(64) Texte N° 1 (dépend du type de poste de charge) VAL_S2 Varchar(64) Texte N° 2 (dépend du type de poste de charge) VAL_S3 Varchar(64) Texte N° 3 (dépend du type de poste de charge) VAL_S4 Varchar(64) Texte N° 4 (dépend du type de poste de charge) VAL_S5 Varchar(64) Texte N° 5 (dépend du type de poste de charge) VAL_S6 Varchar(64) Texte N° 6 (dépend du type de poste de charge) VAL_S7 Varchar(64) Texte N° 7 (dépend du type de poste de charge) VAL_S8 Varchar(64) Texte N° 8 (dépend du type de poste de charge) VAL_S9 Varchar(64) Texte N° 9 (dépend du type de poste de charge) VAL_S10 Varchar(64) Texte N° 10 (dépend du type de poste de charge) VAL_N1 Integer Nombre N° 1 (dépend du type de charge) VAL_N2 Integer Nombre N° 2 (dépend du type de charge) VAL_N3 Integer Nombre N° 3 (dépend du type de charge) VAL_N4 Integer Nombre N° 4 (dépend du type de charge) VAL_N5 Integer Nombre N° 5 (dépend du type de charge) VAL_N6 Integer Nombre N° 6 (dépend du type de charge) VAL_N7 Integer Nombre N° 7 (dépend du type de charge) VAL_N8 Integer Nombre N° 8 (dépend du type de charge) VAL_N9 Integer Nombre N° 9 (dépend du type de charge) VAL_N10 Integer Nombre N° 10 (dépend du type de charge) VAL_R1 Float Valeur N° 1 (Dépend du type de charge) VAL_R2 Float Valeur N° 2 (Dépend du type de charge) VAL_R3 Float Valeur N° 3 (Dépend du type de charge) VAL_R4 Float Valeur N° 4 (Dépend du type de charge) VAL_R5 Float Valeur N° 5 (Dépend du type de charge) VAL_R6 Float Valeur N° 6 (Dépend du type de charge) VAL_R7 Float Valeur N° 7 (Dépend du type de charge) VAL_R8 Float Valeur N° 8 (Dépend du type de charge) VAL_R9 Float Valeur N° 9 (Dépend du type de charge) VAL_R10 Float Valeur N° 10 (Dépend du type de charge) STATUS Char(1) Statut de l'enregistrement (pas utilisé) La table "VK_LOAD_TBS" Cette table contient les données des blocs de traitement définis pour les charges au poste de charge. Champ Type Description TB_ID BigInt PK Numéro d'identification. Ce champ sera la clef primaire de la table LOAD_ID Integer Numéro de la charge MACHINE_ID Integer Numéro de la machine TB_NB Smallint Index du bloc de traitement (1..8) TB Smallint Numéro du bloc de traitement TB_NAME Varchar(32) Nom du bloc de traitement TB_POSITION SmallInt Numéro de la position machine TB_GROUP SmallInt Numéro du groupe TB_CYCLE Smallint Nombre de cycle TB_TIME Integer Temps du bloc de traitement TB_SINGLEPOS Smallint Numéro de la position du groupe TB_RAMP Smallint Numéro de la forme de courant TB_RAMP_TYPE Smallint Type de régulation de la forme de courant : 0 : Courant 1 : Tension TB_DENSITY Float Densité de courant TB_THICKNESS Float Epaisseur désirée TB_MEASURE Float Epaisseur mesurée STATUS Char(1) Statut de l'enregistrement (pas utilisé) CHECK_SUM Integer pas utilisé La table "VK_LOAD_CONTROLS" Cette table contient les données des résultats des contrôles en sortie des pièces. Champ Type Description CONTROL_ID BigInt PK Numéro d'identification. Ce champ sera la clef primaire de la table LOAD_ID Integer Numéro de la charge MACHINE_ID Integer Numéro de la machine ARTICLE_NB Smallint Index de l'article ARTICLE_NAME Varchar(32) Nom de l'article VALID_COUNT SmallInt Numéro de la validation (1..10) VALID_SUP SmallInt 0: Opérateur 1:Superviseur VALID_CONTROL Varchar(32) Nom du contrôle VALID_MESURE Varchar(32) Valeur mesurée par l'opérateur VALID_RESULT Smallint Résultat du contrôle: 1: CONFORME 2:NON-CONFORME VALID_NONCONFORMITY Varchar(64) Résultat de la non-conformité La table "VK_MESSAGES" Cette table regroupe tous les messages produits par l'application. Les champs sont définis comme suit: Nom du champ Type Fonction MESSAGE_ID Integer Numéro du message. LOAD_ID Integer Numéro de la charge MACHINE_ID Integer Numéro de la machine TYPE_ID Integer Type de message: MSG_DATE Date Date du message MSG_TIME Time Heure du message MSG_TIMESTAMP DateTime Date et heure du message USER_ID Integer Numéro de l'utilisateur (pas utilisé) MACHINE_NB Smallint Numéro de la machine (branche de la machine) POSITION_NB Smallint Numéro de position ACTION_ID Integer Type d'action: VAL_N1 Integer VAL_N2 Integer VAL_N3 Integer VAL_N4 Integer VAL_N5 Integer VAL_N6 Integer VAL_N7 Integer VAL_N8 Integer VAL_N9 Integer VAL_N10 Integer VAL_R1 Float VAL_R2 Float VAL_R3 Float VAL_R4 Float VAL_R5 Float VAL_R6 Float VAL_R7 Float VAL_R8 Float VAL_R9 Float VAL_R10 Float VAL_S1 Varchar(80) VAL_S2 Varchar(80) VAL_B1 SmallInt VAL_B2 SmallInt VAL_TIME1 Timestamp VAL_TIME2 Timestamp CHECK_SUM Integer Checksum de l'enregistrement (pas utilisé) STATUS Char(1) Etat de l'enregistrement (pas utilisé) Les messages "Take Load" sur une position avec redresseur Ces messages sont générés lorsqu'un transporteur prend une charge sur une position équipée de redresseur: Champ Valeur Description TYPE_ID 100 Take/Drop ACTION_ID 101 Take LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Numéro du robot VAL_N2 n Numéro de rack VAL_N3 n Tmin VAL_N4 n Tmax VAL_N5 n Teff VAL_N6 n Nombre d'alarmes VAL_N7 n I/O à enregistrer I1 VAL_N8 n I/O à enregistrer I2 VAL_N9 n I/O à enregistrer I3 VAL_N10 n Type de régulation pendant le step de type " Immersion ? 0=Courant constant 1=Tension constante VAL_R1 n I/O à enregistrer R1 VAL_R2 n I/O à enregistrer R2 ou Moyenne R1 1 VAL_R3 n I/O à enregistrer R3 ou Min R1 1 VAL_R4 n I/O à enregistrer R4 ou Max R1 1 VAL_R5 n Ah réel avant VAL_R6 n Ah réel arrière  ou  U moyen 2 VAL_R7 n Ah théorique avant VAL_R8 n Ah théorique arrière ou I moyen 2 VAL_R9 n U max ou U Setpoint 3 VAL_R10 n I max ou I Setpoint 3 VAL_B1 n % d'erreur entre les Ah théoriques et le Ah réels. Ce % peut être modifié par l'utilisateur dans le programme client. *1) Les colonnes R2, R3 et R4 correspondent respectivement à la valeur moyenne, la valeur Min et la valeur Max de R1 si le mot clef Parameters.ini[Database]DBMeanAnalog=1. *2) S'il n'y a qu'un seul redresseur défini sur la position alors enregistrement de la moyenne du courant ou de la tension sinon enregistrement des Ah réels et théoriques du deuxième redresseur. *3) Les colonnes R9 et R10 correspondent respectivement à la valeur max de la tension et la valeur max du courant si le mot clef Parameters.ini[Database]LogUISetPoints=0.  Si le mot clef = 1 alors les colonnes correspondent aux consignes de courant et de tension lors du premier step de type " Immersion ? Les colonnes VAL_R1 à VAL_R10 peuvent contenir des données différentes selon la configuration du VKServer. Dans l'onglet " Database ? de la page " System Parameters ?, on peut sélectionner diverses fonctions : La case " Log hoists movements ? indique au système qu'il doit enregistrer les mouvements des transporteurs (Take/Drop load ). La case " Log alarms ? indique au système qu'il doit enregistrer les alarmes lorsque celles-ci sont générées. La case " Log Loads ? indique au système qu'il doit enregistrer les informations des charges lors de leurs intégrations au poste de charge. La case " Log equipment commands ? indique au système qu'il doit sauvegarder les commandes d'équipements lorque celles-ci sont exécutées. La case " Log special counters ? indique au système d'il doit sauvegarder les compteurs spéciaux La fréquence de sauvegarde est indiqué dans le champ " Time ?. Les compteurs spéciaux sont définis dans le fichier IO.ini dans la section [Database] La case " Average analog value ? permet d'enregistrer les moyennes de la valeur analogique N° 1. La valeur de R1 à la sortie de la cuve est enregistrée dans la colonne VAL_R1. La moyenne de R1 pendant toute l'immersion est enregistrée dans la colonne VAL_R2. La valeur minimale de R1 pendant toute l'immersion est enregistrée dans la colonne VAL_R3 et la valeur maximale de R1 pendant toutes l'immersion est enregistrée dans la colonne VAL_R4. La case " Log rectifers ah/ah/theor/Imean/Umean/Imax/Umax ? indique au système qu'il doit enregistrer les messages correspondants à la sortie des charges des positions. La case " Log rectifiers data ? Indique au système qu'il doit enregistrer les variations des redresseurs pendant l'immersion des charges. Les messages "Take load" sur une position sans redresseur Ces messages sont générés lorsqu'un transporteur prend une charge sur une position sans redresseur: Champ Valeur Description TYPE_ID 100 Take/Drop ACTION_ID 101 Take LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Numéro du robot VAL_N2 n Numéro de rack VAL_N3 n Tmin VAL_N4 n Tmax VAL_N5 n Teff VAL_N6 n Nombre d'alarmes VAL_N7 n I/O à enregistrer I1 VAL_N8 n I/O à enregistrer I2 VAL_N9 n I/O à enregistrer I3 VAL_N10 n I/O à enregistrer I4 VAL_R1 n I/O à enregistrer R1 VAL_R2 n I/O à enregistrer R2 ou Moyenne R1 1 VAL_R3 n I/O à enregistrer R3 ou Min R1 1 VAL_R4 n I/O à enregistrer R4 ou Max R1 1 VAL_R5 n I/O à enregistrer R5 VAL_R6 n I/O à enregistrer R6 VAL_R7 n I/O à enregistrer R7 VAL_R8 n I/O à enregistrer R8 VAL_R9 n I/O à enregistrer R9 VAL_R10 n I/O à enregistrer R10 *1) Les colonnes R2, R3 et R4 correspondent respectivement à la valeur moyenne, la valeur Min et la valeur Max de R1 si le mot clef Parameters.ini[Database]DBMeanAnalog=1. Les messages "Drop load" Ces messages sont générés lorsqu'un transporteur dépose une charge dans une position. Champ Valeur Description TYPE_ID 100 Take/Drop ACTION_ID 102 Drop LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Numéro du robot VAL_N2 n Numéro de rack VAL_N3 n Tmin VAL_N4 n Tmax VAL_N7 n I/O à enregistrer I1 VAL_N8 n I/O à enregistrer I2 VAL_N9 n I/O à enregistrer I3 VAL_N10 n I/O à enregistrer I4 VAL_R1 n I/O à enregistrer R1 VAL_R2 n I/O à enregistrer R2 VAL_R3 n I/O à enregistrer R3 VAL_R4 n I/O à enregistrer R4 VAL_R5 n I/O à enregistrer R5 VAL_R6 n I/O à enregistrer R6 VAL_R7 n I/O à enregistrer R7 VAL_R8 n I/O à enregistrer R8 VAL_R9 n I/O à enregistrer R9 VAL_R10 n I/O à enregistrer R10 Les messages "Ah réels" Champ Valeur Description TYPE_ID 100 ACTION_ID 103 Ampères/heure réels LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Différence entre ah réel et ah théor du redresseur 1 (ë) VAL_N2 n Différence entre ah réel et ah théor du redresseur 2 (ë) VAL_N3 n Différence entre ah réel et ah théor du redresseur 3 (ë) VAL_N4 n Différence entre ah réel et ah théor du redresseur 4 (ë) VAL_N5 n Différence entre ah réel et ah théor du redresseur 5 (ë) VAL_N6 n Différence entre ah réel et ah théor du redresseur 6 (ë) VAL_N7 n Différence entre ah réel et ah théor du redresseur 7 (ë) VAL_N8 n Différence entre ah réel et ah théor du redresseur 8 (ë) VAL_N9 n Numéro du bras VAL_N10 n Numéro du rack VAL_R1 n Ampères/heure réels redresseur 1 (Ah) VAL_R2 n Ampères/heure réels redresseur 2 (Ah) VAL_R3 n Ampères/heure réels redresseur 3 (Ah) VAL_R4 n Ampères/heure réels redresseur 4 (Ah) VAL_R5 n Ampères/heure réels redresseur 5 (Ah) VAL_R6 n Ampères/heure réels redresseur 6 (Ah) VAL_R7 n Ampères/heure réels redresseur 7 (Ah) VAL_R8 n Ampères/heure réels redresseur 8 (Ah) La différence entre ah réels et théorique est positive si il y a trop d'ampères/heure et négative si pas assez. Les messages "Ah théoriques" Champ Valeur Description TYPE_ID 100 ACTION_ID 104 Ampères/heure théoriques LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N9 n Numéro du bras VAL_N10 n Numéro du rack VAL_R1 n Ampères/heure théoriques redresseur 1 (Ah) VAL_R2 n Ampères/heure théoriques redresseur 2 (Ah) VAL_R3 n Ampères/heure théoriques redresseur 3 (Ah) VAL_R4 n Ampères/heure théoriques redresseur 4 (Ah) VAL_R5 n Ampères/heure théoriques redresseur 5 (Ah) VAL_R6 n Ampères/heure théoriques redresseur 6 (Ah) VAL_R7 n Ampères/heure théoriques redresseur 7 (Ah) VAL_R8 n Ampères/heure théoriques redresseur 8 (Ah) Les messages "Courants moyens" Champ Valeur Description TYPE_ID 100 ACTION_ID 105 Ampères/heure théoriques LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N9 n Numéro du bras VAL_N10 n Numéro du rack VAL_R1 n Courant moyen redresseur 1 (A) VAL_R2 n Courant moyen redresseur 2 (A) VAL_R3 n Courant moyen redresseur 3 (A) VAL_R4 n Courant moyen redresseur 4 (A) VAL_R5 n Courant moyen redresseur 5 (A) VAL_R6 n Courant moyen redresseur 6 (A) VAL_R7 n Courant moyen redresseur 7 (A) VAL_R8 n Courant moyen redresseur 8 (A) Les messages "Tensions moyennes" Champ Valeur Description TYPE_ID 100 ACTION_ID 106 Tension moyenne LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N9 n Numéro du bras VAL_N10 n Numéro du rack VAL_R1 n Tension moyenne redresseur 1 (Volt) VAL_R2 n Tension moyenne redresseur 2 (Volt) VAL_R3 n Tension moyenne redresseur 3 (Volt) VAL_R4 n Tension moyenne redresseur 4 (Volt) VAL_R5 n Tension moyenne redresseur 5 (Volt) VAL_R6 n Tension moyenne redresseur 6 (Volt) VAL_R7 n Tension moyenne redresseur 7 (Volt) VAL_R8 n Tension moyenne redresseur 8 (Volt) Les messages "Courant max." Champ Valeur Description TYPE_ID 100 ACTION_ID 107 Courant maximum LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N9 n Numéro du bras VAL_N10 n Numéro du rack VAL_R1 n Courant max. redresseur 1 (A) VAL_R2 n Courant max. redresseur 2 (A) VAL_R3 n Courant max. redresseur 3 (A) VAL_R4 n Courant max. redresseur 4 (A) VAL_R5 n Courant max. redresseur 5 (A) VAL_R6 n Courant max. redresseur 6 (A) VAL_R7 n Courant max. redresseur 7 (A) VAL_R8 n Courant max. redresseur 8 (A) Les messages "Tensions max." Champ Valeur Description TYPE_ID 100 ACTION_ID 108 Tension maximum LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N9 n Numéro du bras VAL_N10 n Numéro du rack VAL_R1 n Tension max. redresseur 1 (Volt) VAL_R2 n Tension max. redresseur 2 (Volt) VAL_R3 n Tension max. redresseur 3 (Volt) VAL_R4 n Tension max. redresseur 4 (Volt) VAL_R5 n Tension max. redresseur 5 (Volt) VAL_R6 n Tension max. redresseur 6 (Volt) VAL_R7 n Tension max. redresseur 7 (Volt) VAL_R8 n Tension max. redresseur 8 (Volt) Les messages "Consignes de courant" Champ Valeur Description TYPE_ID 100 Take/Drop ACTION_ID 109 Consignes de courant LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 0 Type de régulation (0 :I 1 :U) du redresseur N° 1 VAL_N2 n Type de régulation (0 :I 1 :U) du redresseur N° 2 VAL_N3 n Type de régulation (0 :I 1 :U) du redresseur N° 3 VAL_N4 n Type de régulation (0 :I 1 :U) du redresseur N° 4 VAL_N5 n Type de régulation (0 :I 1 :U) du redresseur N° 5 VAL_N6 n Type de régulation (0 :I 1 :U) du redresseur N° 6 VAL_N7 n Type de régulation (0 :I 1 :U) du redresseur N° 7 VAL_N8 n Type de régulation (0 :I 1 :U) du redresseur N° 8 VAL_N9 n Numéro du bras VAL_N10 n Numéro du rack VAL_R1 n Consigne de courant du redresseur N° 1 VAL_R2 n Consigne de courant du redresseur N° 2 VAL_R3 n Consigne de courant du redresseur N° 3 VAL_R4 n Consigne de courant du redresseur N° 4 VAL_R5 n Consigne de courant du redresseur N° 5 VAL_R6 n Consigne de courant du redresseur N° 6 VAL_R7 n Consigne de courant du redresseur N° 7 VAL_R8 n Consigne de courant du redresseur N° 8 Les messages "Consignes de tension" Champ Valeur Description TYPE_ID 100 Take/Drop ACTION_ID 110 Consignes de tension LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 0 Type de régulation (0 :I 1 :U) du redresseur N° 1 VAL_N2 n Type de régulation (0 :I 1 :U) du redresseur N° 2 VAL_N3 n Type de régulation (0 :I 1 :U) du redresseur N° 3 VAL_N4 n Type de régulation (0 :I 1 :U) du redresseur N° 4 VAL_N5 n Type de régulation (0 :I 1 :U) du redresseur N° 5 VAL_N6 n Type de régulation (0 :I 1 :U) du redresseur N° 6 VAL_N7 n Type de régulation (0 :I 1 :U) du redresseur N° 7 VAL_N8 n Type de régulation (0 :I 1 :U) du redresseur N° 8 VAL_N9 n Numéro du bras VAL_N10 n Numéro du rack VAL_R1 n Consigne de tension du redresseur N° 1 VAL_R2 n Consigne de tension du redresseur N° 2 VAL_R3 n Consigne de tension du redresseur N° 3 VAL_R4 n Consigne de tension du redresseur N° 4 VAL_R5 n Consigne de tension du redresseur N° 5 VAL_R6 n Consigne de tension du redresseur N° 6 VAL_R7 n Consigne de tension du redresseur N° 7 VAL_R8 n Consigne de tension du redresseur N° 8 Les messages "Start job OSCILine" Champ Valeur Description TYPE_ID 100 Take/Drop ACTION_ID 112 Start Job LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 0 VAL_N2 n Numéro de rack VAL_N3 0 VAL_N4 n Consigne VAL_N7 n I/O à enregistrer I1 VAL_N8 n I/O à enregistrer I2 VAL_N9 n Job index VAL_N10 n Job num VAL_R1 n I/O à enregistrer R1 VAL_R2 n I/O à enregistrer R2 VAL_R3 n I/O à enregistrer R3 VAL_R4 n I/O à enregistrer R4 VAL_R5 n Ah réel avant   ou  I/O à enregistrer R5 VAL_R6 n Ah réel arrière  ou  I/O à enregistrer R6 VAL_R7 n Ah théorique avant  ou  I/O à enregistrer R7 VAL_R8 n Ah théorique arrière  ou  I/O à enregistrer R8 VAL_R9 n I/O à enregistrer R9 VAL_R10 n I/O à enregister R10 VAL_S1 n Nom du Job Les messages "End job OSCILine" Champ Valeur Description TYPE_ID 100 Take/Drop ACTION_ID 111 End Job LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 0 VAL_N2 n Numéro de rack VAL_N3 n Temps actuel VAL_N4 n Consigne VAL_N7 n I/O à enregistrer I1 VAL_N8 n I/O à enregistrer I2 VAL_N9 n Job index VAL_N10 n Job num VAL_R1 n I/O à enregistrer R1 VAL_R2 n I/O à enregistrer R2 VAL_R3 n I/O à enregistrer R3 VAL_R4 n I/O à enregistrer R4 VAL_R5 n Ah réel avant   ou  I/O à enregistrer R5 VAL_R6 n Ah réel arrière  ou  I/O à enregistrer R6 VAL_R7 n Ah théorique avant  ou  I/O à enregistrer R7 VAL_R8 n Ah théorique arrière  ou  I/O à enregistrer R8 VAL_R9 n I/O à enregistrer R9 VAL_R10 n I/O à enregister R10 VAL_S1 n Nom du Job VAL_B1 n % d'erreur entre les Ah théoriques et le Ah réels. Ce % peut être modifié par l'utilisateur dans le programme client. Les messages "Log Job Data OSCIILine" Champ Valeur Description TYPE_ID 100 Take/Drop ACTION_ID 113 Log Job Data LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Commande VAL_N2 n N° de rack VAL_N3 n Numéro du job VAL_N4 n Numéro du prochain Job VAL_N5 n Temps VAL_N6 n Paramètre 1 VAL_N7 n Paramètre 2 Les messages "Log Job Command OSCILine" Champ Valeur Description TYPE_ID 100 Take/Drop ACTION_ID 114 Log Job Data LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Commande VAL_N2 n N° de rack Les messages "Log Job Status change OSCILine" Champ Valeur Description TYPE_ID 100 Take/Drop ACTION_ID 115 Log Job Data LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Status VAL_N2 n N° de rack VAL_S2 n Statut en texte clair Les messages "RecDBOut" Champ Valeur Description TYPE_ID 100 ACTION_ID 121..125 Enregistrement de db à la sortie d'une charge LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Valeur entière N° 1 VAL_N2 n Valeur entière N° 2 VAL_N3 n Valeur entière N° 3 VAL_N4 n Valeur entière N° 4 VAL_N5 n Valeur entière N° 5 VAL_N6 n Valeur entière N° 6 VAL_N7 n Valeur entière N° 7 VAL_N8 n Valeur entière N° 8 VAL_N9 n Numéro du bras VAL_N10 n Numéro du rack VAL_R1 n Valeur réelle N° 1 VAL_R2 n Valeur réelle N° 2 VAL_R3 n Valeur réelle N° 3 VAL_R4 n Valeur réelle N° 4 VAL_R5 n Valeur réelle N° 5 VAL_R6 n Valeur réelle N° 6 VAL_R7 n Valeur réelle N° 7 VAL_R8 n Valeur réelle N° 8 Les messages "RecDBIn" Champ Valeur Description TYPE_ID 100 ACTION_ID 131..135 Enregistrement de db à l'entrée d'une charge LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Valeur entière N° 1 VAL_N2 n Valeur entière N° 2 VAL_N3 n Valeur entière N° 3 VAL_N4 n Valeur entière N° 4 VAL_N5 n Valeur entière N° 5 VAL_N6 n Valeur entière N° 6 VAL_N7 n Valeur entière N° 7 VAL_N8 n Valeur entière N° 8 VAL_N9 n Numéro du bras VAL_N10 n Numéro du rack VAL_R1 n Valeur réelle N° 1 VAL_R2 n Valeur réelle N° 2 VAL_R3 n Valeur réelle N° 3 VAL_R4 n Valeur réelle N° 4 VAL_R5 n Valeur réelle N° 5 VAL_R6 n Valeur réelle N° 6 VAL_R7 n Valeur réelle N° 7 VAL_R8 n Valeur réelle N° 8 Les messages "Login users" Champ Valeur Description TYPE_ID 200 Login ACTION_ID 201,202 Login / Logout MACHINE_ID n Numéro de la machine VAL_S1 n Nom de l'utilisateur Les messages "Alarmes" Champ Valeur Description TYPE_ID 300 Alarme ACTION_ID 301,302,303 Return/Ack/Alarm LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Numéro de l'alarme VAL_N2 n Type d'alarme VAL_N3 n Groupe de l'alarme VAL_N4 n Numéro du message VAL_N5 n Priorité de l'alarme VAL_N6 n =1 Indique une alarme de conformité. VAL_N7 n Classe de l'alarme (à partir de 10.58.0.0) VAL_N8 n Colonne OPT1 de la définition des alarmes (à partir de 10.58.0.0)  VAL_N9 n Colonne OPT2 de la définition des alarmes (à partir de 10.58.0.0) VAL_R1 n Valeur Les messages "Log Items" Champ Valeur Description TYPE_ID 400 Logger ACTION_ID 401 Log item MACHINE_ID n Numéro de la machine POSITION_NB n Numéro de position VAL_N1 n Numéro de l'enregistreur VAL_N2 n Numéro de l'I/O VAL_N3 n Numéro du DB VAL_N4 n Numéro du registre VAL_R1 n Valeur Les messages "Log Rectifier" Champ Valeur Description TYPE_ID 400 Logger ACTION_ID 402 Rectifier LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Numéro du redresseur VAL_N2 n Numéro de rack VAL_N3 n Numéro du step redresseur VAL_R1 n Courant VAL_R2 n Tension VAL_R3 n Consigne courant VAL_R4 n Consigne tension Les messages "Log Validation Data" Champ Valeur Description TYPE_ID 400 Logger ACTION_ID 404 Log validation data MACHINE_ID n Numéro de la machine POSITION_NB n Numéro de position VAL_N1 n Numéro de l'enregistreur VAL_N2 n Numéro de l'I/O VAL_N3 n Numéro du DB VAL_N4 n Numéro du registre VAL_R1 n Valeur Les messages "Log Validation Windows" Champ Valeur Description TYPE_ID 400 Logger ACTION_ID 405 Log validation Windows MACHINE_ID n Numéro de la machine POSITION_NB n Numéro de position VAL_N1 n Numéro de la fenêtre VAL_N2 n Numéro de la courbe VAL_N3 n Début de la fenêtre VAL_N4 n Fin de la fenêtre VAL_N5 n Durée minimum VAL_N6 n Temps effectif dans la fenêtre VAL_N7 n =0 conforme, =1 temps effectif trop court, =2 la position du n° de pas ne correspond pas au numéro de la position de la charge de référence, =3 le numéro de pas est plus grand que le nombre de pas de la charge de référence VAL_N8 n N° du pas de séquence VAL_R1 n Valeur Minimum VAL_R2 n Valeur maximum VAL_R3 n Valeur moyenne dans la fenêtre de référence VAL_S1 x Nom de la courbe Les messages "Rectifier setpoints" Champ Valeur Description TYPE_ID 400 Logger ACTION_ID 406 Rectifier setpoint LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Numéro du redresseur VAL_N2 n Numéro de rack VAL_N3 n Type de régulation 0=courant constant 1=tension constante VAL_R1 n Consigne de courant VAL_R2 n Consigne de tension Les messages "Mode programme" Champ Valeur Description TYPE_ID 500 Programme/Buffer ACTION_ID 501 Mode programme MACHINE_ID n Numéro de la machine VAL_N1 0/1 0=STOP  1=AUTO VAL_N2 n Temps depuis dernier changement Les messages "Mode gare" Champ Valeur Description TYPE_ID 500 Programme/Buffer ACTION_ID 502 Mode Buffer MACHINE_ID n Numéro de la machine VAL_N1 0/1 0=STOP  1=AUTO Les messages "Mode machine" Champ Valeur Description TYPE_ID 500 Programme/Buffer ACTION_ID 503 Mode machine MACHINE_ID n Numéro de la machine VAL_N1 n Contenu de l'I/O machineState Les messages "Log Counters" Champ Valeur Description TYPE_ID 500 Logger ACTION_ID 504 Log dosing MACHINE_ID n Numéro de la machine VAL_R1 n Valeur compteur N° 1 VAL_R2 n Valeur compteur N° 2 VAL_R3 n Valeur compteur N° 3 VAL_R4 n Valeur compteur N° 4 VAL_R5 n Valeur compteur N° 5 VAL_R6 n Valeur compteur N° 6 VAL_R7 n Valeur compteur N° 7 VAL_R8 n Valeur compteur N° 8 VAL_R9 n Valeur compteur N° 9 VAL_R10 n Valeur compteur N° 10 Les messages "Log Dosing" Champ Valeur Description TYPE_ID 500 Logger ACTION_ID 505 Log dosing MACHINE_ID n Numéro de la machine VAL_N1 n Numéro de la cuve VAL_N2 n Numéro du produit VAL_R1 n Quantité Les messages "Log Exchange mode" Champ Valeur Description TYPE_ID 500 Logger ACTION_ID 506 Log exchange mode MACHINE_ID n Numéro de la machine VAL_N1 n Mode exchange 0 :local 1 :server Les messages "Log Execute mode" Champ Valeur Description TYPE_ID 500 Logger ACTION_ID 507 Log Execute mode MACHINE_ID n Numéro de la machine VAL_N1 n Numéro du mode Les messages "Log Inc Delay" Champ Valeur Description TYPE_ID 500 Logger ACTION_ID 508 Log Inc Delay MACHINE_ID n Numéro de la machine VAL_N1 n Temps de délai retardé. Les messages "Start/Stop Server" Champ Valeur Description TYPE_ID 500 Logger ACTION_ID 509 Mode server Start/Stop MACHINE_ID n Numéro de la machine VAL_N1 0/1 0=STOP  1=AUTO Les messages "Log dosing pumps" Champ Valeur Description TYPE_ID 500 Logger ACTION_ID 510 Dosing pumps MACHINE_ID n Numéro de la machine VAL_N1 n Numéro de position initiales VAL_N2 n Numéro du produit ID (ou numéro de la pompe si pas défini) VAL_N3 0/1/2 Mode d'envoi : 0: Automatique 1: Manuel 2: Makeup VAL_N4 n Numéro de la position finales VAL_R1 n.0000 Quantité envoyée à l'automate VAL_S1 s Nom du produit chimique VAL_S2 s Nom et numéro de la position  Les messages "Log makeup" Champ Valeur Description TYPE_ID 500 Logger ACTION_ID 511 Makeup MACHINE_ID n Numéro de la machine VAL_N1 n Numéro de produit VAL_N2 n Numéro de la position de destination VAL_R1 n Quantité dosée Les messages "Log messages" Champ Valeur Description TYPE_ID 600 Message ACTION_ID 601,602,603 Return/Ack/Alarm LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Numéro du message VAL_N2 n Type du message VAL_N3 n Groupe du message VAL_N4 n Numéro du message VAL_R1 n Valeur Les messages "Log chemical change" Champ Valeur Description TYPE_ID 700 Log chemicals ACTION_ID 701,702 701 log auto 702 log mannal MACHINE_ID n Numéro de la machine VAL_N1 n Numéro du produit chimique VAL_S1 n Nom du produit chimique VAL_S2 n Numéro de lot du produit Les messages "Equipment Controls" Champ Valeur Description TYPE_ID 800 Equipment controls ACTION_ID 801 Log execution d'une commande d'équipement LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Numéro de la commande position (1..150) VAL_N2 n Numéro de l'I/O VAL_N3 n Start time VAL_N4 n Start time type VAL_R1 n Data VAL_S1 n Nom de l'I/O Les messages "Equipment Start" Champ Valeur Description TYPE_ID 800 Equipment controls ACTION_ID 802 Log initialisation des commandes d'une position LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine MACHINE_NB n Numéro de la branche de machine POSITION_NB n Numéro de position VAL_N1 n Numéro d'immersion Les messages "Puls Rectifier Steps" Champ Valeur Description TYPE_ID 5000 Puls rectifiers ACTION_ID 5003 Log recitifier steps LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine VAL_N1 n Numéro du redresseur VAL_N2 n Numéro du step VAL_N3 n Numéro du Batch Step VAL_R1 n Courant 1 VAL_R2 n Courant 2 VAL_R3 n Temps de la pulse 1 VAL_R4 n Temps de la pulse 2 VAL_R5 n Courant moyen Les messages "MQTT DB Commands" Champ Valeur Description TYPE_ID 1000 MQTT Commands ACTION_ID 1001 DB write commands MACHINE_ID n Numéro de la machine VAL_N1 n Fonction: 1: WriteBit 2: WriteWord 3: WriteFloat   VAL_N2 n Numéro du DB VAL_N3 n Numéro du Registre VAL_N4 n Numéro du Bit VAL_N5 n Donnée lors de l'écriture d'un entier. VAL_R1 n Donnée lors de l'écriture d'un real. VAL_B1 n Donnée lors de l'écriture d'un bit VAL_S1 n Nom de l'utilisateur VAL_S2 n Nom de l'application Les messages "MQTT Login" Champ Valeur Description TYPE_ID 1000 MQTT Commands ACTION_ID 1002 Login MACHINE_ID n Numéro de la machine VAL_N1 n 0: Login fail 1 :Login ok VAL_S1 n Nom de l'utilisateur VAL_S2 n Nom de l'application Les messages "MQTT Hoists commands" Champ Valeur Description TYPE_ID 1000 MQTT Commands ACTION_ID 1004 Hoist command MACHINE_ID n Numéro de la machine VAL_N1 n Numéro de robot VAL_N2 n Commande 1: Monter 2: Descente 3: Déplacement horizontal 5: Ajustement de la position 6: Enregistrement de la position du robot dans la position VAL_N3 n Paramètre: Si fonction 1 et 2 alors = type de montée/descente Si fonction 5 = delta à ajouter/soustraire de la position VAL_N4 n Numéro de position VAL_S1 n Nom de l'utilisateur VAL_S2 n Nom de l'application Les messages "Hoist change" Champ Valeur Description TYPE_ID 1100 Hoist change ACTION_ID 1101 Hoist change LOAD_ID n Numéro de la charge MACHINE_ID n Numéro de la machine VAL_N1 n N° du robot VAL_N2 n N° du rack VAL_N3 n Registre de commande 1 VAL_N4 n Registre de commande 2 VAL_N5 n Registre de statut 1 VAL_N6 n Registre de statut 2 VAL_N7 n Registre d'alarmes VAL_N8 n Registre de messages Les messages "LastHour DailyData" Champ Valeur Description TYPE_ID 1200 DailyData ACTION_ID 1201 LastHour DailyData MACHINE_ID n Numéro de la machine VAL_N1 n Batches IN VAL_N2 n Batches OUT VAL_N3 n Reliability VAL_N4 n Utilisation VAL_N5 n Error Hoist VAL_N6 n Alarm On Load VAL_N7 n Manu mode VAL_N8 n Power On VAL_N9 n Safety Door Les messages "Position En Service" Champ Valeur Description TYPE_ID 1300 Position En/Hors service ACTION_ID 1301 Position en service MACHINE_ID n Numéro de la machine VAL_N1 n Position Les messages "Position Hors Service" Champ Valeur Description TYPE_ID 1300 Position En/Hors service ACTION_ID 1302 Position Hors service MACHINE_ID n Numéro de la machine VAL_N1 n Position La structure de la base de données "Articles" Cette base de données est composée de 5 tables : LOADS Table de chargement prédéfinie PARTS Table des articles PROCESSES Table des gammes de traitement TOOLS Table des outillages REF_TOOLING Table de référencement des outillages CONTROLS Table des contrôles en sortie à effectuer La table "Parts" Cette table contient les différentes pièces (articles) utilisées sur les machines. Champ Type Description REC_ID BigInt PK Numéro d'identification. Ce champ sera la clef primaire de la table REFERENCE_C Varchar(64) Référence de la pièce. Ce champ sera référencé dans une table d'index DESCRIPTION_C Varchar(255) Description de la pièce. CREATE_DT DateTime Date et heure de création de la pièce CREATE_USER_C Varchar(128) Nom de l'utilisateur ayant créé la pièce MODIFY_DT Date Date et heure de la dernière modification MODIFY_USER_C Varchar(128) Nom de l'utilisateur ayant modification MACHINEID_N Smallint Numéro de la machine TYPE_C Varchar(64) Type de pièce. CLIENT_C Varchar(64) Nom du client final. USER_INFO_C Varchar(255) Information à afficher à l'utilisateur lors du chargement METAL_AREA_A_N Float Surface métallique A de la pièce (surface avant pour PCB) METAL_AREA_B_N Float Surface métallique B de la pièce (surface arrière pour PCB) CHEMICAL_AREA_N Float Surface totale de la pièce UNIT_AREA_A_N SmallInt Unité de surface pour la surface métallique A UNIT_AREA_B_N SmallInt Unité de surface pour la surface métallique B UNIT_CHEMICAL_AREA_N SmallInt Unité de surface pour la surface totale WEIGHT_N Float Poids de la pièce UNIT_WEIGHT_C SmallInt Unité de poids pour le poids de la pièce PARTCOUNT_N Integer Nombre de pièces disponibles en stock TOTALPART_N Integer pas utilisé La table "Tools" Cette table contient les différents outillages utilisés sur les machines. Champ Type Description REC_ID BitInt PK Numéro d'identification. Ce champ sera la clef primaire de la table REFERENCE_C Varchar(64) Nom de l'outillage. Ce champ sera référencé dans une table d'index. DESCRIPTION_C Varchar(255) Description de l'outillage. CREATE_DT DateTime Date et heure de la création de l'outillage CREATE_USER_C Varchar(128) Nom de l'utilisateur ayant créé l'outillage MODIFY_DT DateTime Date et heure de la dernière modification MODIFY_USER_C Varchar(128) Nom de l'utilisateur ayant fait la dernière modification MACHINE_ID Smallint Numéro de la machine TYPE_C Varchar(64) Type d'outillage USER_INFO_C Varchar(255) Information à afficher à l'utilisateur lors du chargement TOOL_ID Integer Numéro d'identification de l'outillage METAL_AREA_A_N Float Surface métallique A de l'outillage. METAL_AREA_B_N Float Surface métallique B de l'outillage CHEMICAL_AREA_N Float Surface totale immergée de l'outillage MAX_CURRENT_N Float Courant maximum autorisé. UNIT_AREA_A_N Smallint Unité de la surface A: 0:mm2 1:cm2 2:dm2 3:m2 4:in2 5:ft2 UNIT_AREA_B_N Smallint Unité de la surface B UNIT_CHEMICAL_AREA_N Smallint Unité de la surface chimique MAX_WEIGHT_N Float Poids maximum autorisé UNIT_MAX_WEIGHT_N Smallint Unité du poids: 0:g 1:Kg 2:lb 3:oz. MIN_PART_N Integer Nombre minimum de pièces MAX_PART_N Integer Nombre maximum de pièces autorisé MIN_SURFACE_N Float Surface minimale MAX_SURFACE_N Float Surface maximale UNIT_MIN_SURFACE_N Smallint Unité de la surface minimale UNIT_MAX_SURFACE_N Smallint Unité de la surface maximale TOTALUSE_N Integer Nombre total d'utilisation de l'outillage TOTALUSE_LIMIT_N Integer Limite d'utilisation autorisée INC_NOGALVANIC_N Smallint 0: Incrément le nombre d'utilisation seulement avec les gamme passant pas une cuve de déposition électro. 1: Incrément pour toues les gammes TOTALUSE_NOGALVANIC_N Integer Nombre d'utilisation non galvanique TOTALUSE_GALVANIC_N Integer Nombre total d'utilisation galvanique RFID_C Varchar(32) Numéro  de code du RFID utilisé pour identifier l'outillage LOCATION_N Smallint Lieu où se trouve l'outillage: 0: Indéterminé 1: stockage 2: Production 3: Accrochage 4: Décrochage 5: Stripage LASTSTRIP_DT Datetime Date du dernier stripage LASTSTRIPBY_C Varchar(64) Nom de l'utilisateur ayant effectué le dernier stripage STARTINGDATE_DT DateTime Date de mise en service ENDINGDATE_DT DateTime Date de maintenance ou de retrait  de l'outillage DISABLED_N Smallint 0: En service 1=Hors service DISABLEREASON_C Varchar(80) Raison de la mise hors service WORKOUT_N Float Quantité d'entrainement de l'outillage PICTURE_F String Nom du fichier image de l'outillage La table "REF_TOOLING" Cette table contient les liaisons entre pièces et outillages. Certaines pièces devant utiliser des outillages spécifiques. Champ Type Description REC_ID BitInt PK Numéro d'identification MACHINEID_N Smallint Numéro de la machine PARTREF Varchar(64) Référence de la pièce TOOLREF Varchar(64) Référence de l'outillage La table "PROCESSES" Cette table contient les données des gammes de traitement. Champ Type Fonction REC_ID BigInt PK Numéro de gamme. REFERENCE_C Varchar(64) Nom de la gamme DESCRIPTION_C Varchar(255) Description de la gamme. CREATE_DT DateTime Date et heure de la création de la gamme CREATE_USER_C Varchar(128) Utilisateur ayant créé la gamme MODIFY_DT DateTime Date et heure de la dernière modification MODIFY_USER_C Varchar(128) Utilisateur ayant modifié la gamme en dernier MACHINEID_N Smallint Numéro de la machine PROG_NB_N Integer Numéro de programme. PROG_VER_N Integer Numéro de version du programme MODE_NB_N Integer Numéro de mode. MODE_VER_N Integer Numéro de version du mode SUPPORT_TYPE_N Integer Type de support UP_TYPE_N Integer Type de montée DOWN_TYPE_N Integer Type de descente DRIP_TIME_N Integer Temps d'égouttage ADJUST_TYPE_N Integer Mode d'ajustement des temps/densité/épaisseur TB_COUNT_N Integer Nombre de blocs de traitement DENSITY_TYPE_N Integer Mode de fonctionnement de la densité de courant : pondération ou densité réelle TB1_N Integer Numéro de bloc de traitement N° 1 GROUP1_N Integer Numéro du groupe du bloc de traitement N° 1 POSITION1_N Integer Numéro de position du bloc de traitement N° 1 SINGLE_POS1_N Integer Numéro de la position forcée du groupe du bloc de traitement N° 1 TIME1_N Integer Temps d'immersion en secondes dans le bloc de traitement N° 1 CYCLE_COUNT1_N Integer Nombre de cycle dans le bloc de traitement N° 1 FORM1_N Integer Numéro de la forme de courant à utiliser dans le bloc de traitement N° 1 THICKNESS1_N Float Epaisseur désirée en um dans le bloc de traitement N° 1 DENSITY1_N Float Densité de courant à utiliser dans le bloc de traitement N° 1 VOLTAGE1_N Float Tension à utiliser dans le bloc de traitement N° 1 lorsque le type de bain = Dégraissage Electro TB2_N Integer Numéro de bloc de traitement N° 2 GROUP2_N Integer Numéro du groupe du bloc de traitement N° 2 POSITION2_N Integer Numéro de position du bloc de traitement N° 2 SINGLE_POS2_N Integer Numéro de la position forcée du groupe du bloc de traitement N° 2 TIME2_N Integer Temps d'immersion en secondes dans le bloc de traitement N° 2 CYCLE_COUNT2_N Integer Nombre de cycle dans le bloc de traitement N° 2 FORM2_N Integer Numéro de la forme de courant à utiliser dans le bloc de traitement N° 2 THICKNESS2_N Float Epaisseur désirée en um dans le bloc de traitement N° 2 DENSITY2_N Float Densité de courant à utiliser dans le bloc de traitement N° 2 VOLTAGE2_N Float Tension à utiliser dans le bloc de traitement N° 2 lorsque le type de bain = Dégraissage Electro Etc... jusqu'à 8     SEQUENCE_T Varchar(MAX) Fichier séquence COMMAND_T Varchar(MAX) Fichier des commandes d'équipements TAGNAME_C Varchar(64) Etiquette associée à la référence START_MODE_N Smallint Numéro du mode de démarrage SELECT_MODE_N Smallint Numéro de mode de sélection ROTATION_N Smallint Type de rotation VERSION_N Integer Numéro de version de la gamme COMMENT_C Varchar(250) Commentaire sur la version La table "LOADS" Cette table contient la liste des charges prédéfinies permettant d'être directement chargées sur les postes de charge des machines. Champ Type Fonction REC_ID Integer PK Numéro d'identification REFERENCE_C Varchar(64) Nom de la charge DESCRIPTION_C Varchar(255) Description de la charge CREATE_DT DateTime Date et heure de la création de la charge CREATE_USER_C Varchar(128) Utilisateur ayant créé la charge MODIFY_DT DateTime Date et heure de la dernière modification MODIFY_USER_C Varchar(128) Utilisateur ayant modifié la charge en dernier MACHINEID_N Smallint Numéro de la machine TOOL_C Varchar(64) Nom de l'outillage à utiliser PART1_C Varchar(64) Nom de l'article N° 1 PART1_COUNT_N Integer Nombre de pièce de l'article N° 1 PART2_C Varchar(64) Nom de l'article N° 2 PART2_COUNT_N Integer Nombre de pièce de l'article N° 2 PART3_C Varchar(64) Nom de l'article N° 3 PART3_COUNT_N Integer Nombre de pièce de l'article N° 3 PART4_C Varchar(64) Nom de l'article N° 4 PART4_COUNT_N Integer Nombre de pièce de l'article N° 4 PART5_C Varchar(64) Nom de l'article N° 5 PART5_COUNT_N Integer Nombre de pièce de l'article N° 5 PROCESS_C Varchar(64) Nom de la gamme à utiliser UNLOADDEST_N Smallint Destination à la décharge. Valeur envoyée à l'automate pour diriger la barre vers sa destination finale PICTURE_F Varchar(250) Nom du fichier de l'image  DISABLE_N Smallint 0: La référence n'est pas hors service 1: la référence est hors service DISABLEREASON_C Varchar(80) Raison pourquoi la référence est hors service QUANTITY_MIN1_N.. QUANTITY_MIN5_N Integer Quantité min 1 autorisée QUANTITY_MAX1_N.. QUANTITY_MAX5_N Integer Quantité max autorisée PROCESS_MINMAX1_C.. PROCESS_MINMAX5_C Varchar(64) USERINFO_C Varchar(250) Information pour l'utilisateur TOOLSQUANTITY_N Integer Nombre de montage sur la charge BALLS_N Integer Type de billes à utiliser BALLSWEIGHT_N Integer Poids des billes en grammes La table "CONTROLS" Cette table contient les données des contrôles à effectuer à la sortie des charges Champ Type Description REC_ID BitInt PK Numéro d'identification MACHINEID_N Smallint Numéro de la machine REFERENCE_C Varchar(64) Référence de la pièce DESCRIPTION_C Varchar(255) Description de la pièce CREATE_DT DATETIME Date de la création de l'enregistrement CREATE_USER_C Varchar(128) Nom de l'utilisateur ayant créé l'enregistrement MODIFY_DT DATETIME Date de la dernière modification de l'enregistrement MODIFY_USER_C Varchar(128) Nom de l'utilisateur ayant modifié l'enregistrement DOUBLECONTROL_N Smallint 0=Pas de double contrôle. 1=Double contrôle QUANTITY_N Integer Nombre de pièces à contrôler CONTROLTYPE1_C.. CONTROLTYPE10_C Varchar(64) Nom du contrôle à effectuer INFO1_C.. INFO10_C Varchar(64) Information sur le contrôle à effectuer TOOL1_C.. TOOL10_C Varchar(64) Nom de l'outillage à utiliser pour faire le contrôle NUMRESULT1_N.. NUMRESULT10_N Smallint 0=Par de résultat attendu 1=Besoin d'un résultat de mesure La structure de la base de données "CUSTOMER" Cette base de données peut être composée de plusieurs tables mais uniquement la table définie par [PartLibrary]TableName sera utilisée. Pour rechercher une référence, une requête sera faite avec la requête suivante: SELECT * FROM inidata.PartLibraryTableName WHERE inidata.PartLibraryReferenceName = Reference Si la requête aboutit, les 10 champs suivants seront lus: [PartLibrary]FieldName1..10. Les types des champs ([PartLibrary]FieldType1..10) pourrons être l'un des types suivants:  0:String, 1:Integer et 2:Float. Si le nom d'un champ n'est pas défini, celui-ci ne sera pas lu. Les paramètres du système prioritaire Introduction Les paramètres du système prioritaire sont accessibles depuis l'onglet [Priority mode ] des paramètres du serveur: Ces paramètres permettent de modifier le comportement du système prioritaire. Le système prioritaire Le système prioritaire gère le déplacement des robots sur une ligne de traitement de surfaces. Contrairement à un système optimisé, le système prioritaire ne calcule pas entièrement le diagramme des mouvements des robots mais estime le bon moment pour lancer une charge dans la machine. Une fois les charges lancées dans la machine, les robots seront appelés pour déplacer celle-ci selon un ordre de priorité défini dans les séquences: Les priorités sont définissables de 0 à 255. 0 correspond à la priorité la plus basse et 255 la plus élevé. Cette dernière a également une signification importante c'est qu'une fois la charge déposée dans la cuve, le robot attendra sur la position pendant tout le temps défini dans le Tmin . Le robot sera bloqué pour toutes les autres charges. Avant de lancer une charge, le système calcule l'occupation des positions dans lesquelles la charge devra passer. Si l'occupation des cuves est vérifié et que le système permet de chargement alors la charge est définie comme démarrée et la couleur de celle-ci dans la machine passe en vert-claire. Elle est alors traitée comme n'importe quelle autre charge dans la ligne. Dans un système prioritaire, ce sont les cuves qui appellent un robot pour déplacer la charge. Lorsque le temps d'immersion Tmin est atteint, la cuve s'ajoute dans une liste de charges à déplacer. A chaque seconde, le système trie cette liste par ordre de priorité et cherche un robot libre pouvant effectuer le mouvement. Les paramètres prioritaires Check immersion time Ce paramètre devrait toujours être coché. Il indique au système de calculer l'utilisation des cuves dans le temps lors de la validation du démarrage de la charge. Si ce paramètre n'est pas coché alors aucun vérification de l'utilisation des cuves n'est effectuée. Dec transfert time from Tmin La cuve est ajoutée dans la liste des charges à déplacer lorsque son temps d'immersion a atteint son Tmin. Lorsque ce paramètre est coché alors le temps de déplacement du robot (le plus susceptible pour faire le déplacement) de sa position actuelle à la cuve est décompté du Tmin pour anticiper l'appel du robot. Ceci permet que le robot soit prêt à prendre la charge une fois le Tmin atteint. Over jig forbidden Lors de l'utilisation de certains outillage encombrant, il faut interdire de passer une charge par dessus une autre charge dans la ligne. Ce paramètre permet cette fonctionnalité. Express jig only from buffer Si ce paramètre est coché, seules les charges ayant été définies comme "Prioritaires" sur le poste de charge seront prises en compte lors du chargement de la machine. En fait, si dans la gare il existe des charges "prioritaires" et des charges "non prioritaire", le système attendra que toutes les charges "prioritaires" soient chargées avant d'essayer de charger les charges "non prioritaires" Special hoist attribution Ce paramètre doit être coché sur les nouvelles machine. Il est là pour être compatible avec les anciens systèmes. Ce paramètre permet d'attribuer un robot à un mouvement même si le mouvement sort des marges "logicielles" des positions min et max. Cela permet d'attribuer un robot à un mouvement lorsque le robot "naturel" est occupé par un autre mouvement. Optimize Buffer to machine Ce paramètre permet d'utiliser un autre robot que le robot "naturel" pour venir chercher une charge dans le buffer et l'envoyer en machine. Ce paramètre doit être utilisé que sur certaines machines ayant une configuration spéciale. Hoist do not wait above buffer Si ce paramètre est coché alors les robots ne resteront pas sur une position de la gare pour attendre mais ils se déplaceront sur une position d'attente. Load to machine in case of buffer full Ce paramètre permet de charger un charge directement en machine sans passer par la gare dans le cas où cette dernière serai pleine (pas de position libre). Check position ready (mode machine ready) Lorsque ce paramètre est coché, le système vérifie que chaque position définie dans la séquence soit "prête" (cuve pas dessinée en mauve). Si toutes les cuves sont prêtes alors le chargement est autorisé. Dans le cas contraire, la charge reste en jaune et un message affiche le message "Le mode de démarrage n'est pas vérifié" Lock load/unload at origin position Ce paramètre permet de bloquer les postes de charge/décharge dès la position d'origine du robot au lieu de les bloquer avant une montée/descente sur le poste de charge/décharge. New way of timeway's computation Ce paramètre modifie la manière de calculer le diagramme de mouvements. Sans ce paramètre, le diagramme est calculé selon les séquences et les temps définis dans Tmin. Avec ce paramètre, le digramme est calculé également selon les séquences et le temps définis dans Tmin mais certains temps peuvent être modifiés selon l'occupation des cuves. Ceci permet d'optimiser le chargement de la machine. Always check Tmax for reporting Normalement le système indique une charge en erreur lorsqu'une priorité a été définie et que le temps dépasse le Tmax. Si ce paramètre est coché alors le système indiquera une erreur sur toutes les positions où le TMax est dépassé sans tenir compte du fait que la position ai une priorité ou non. Do not make up/down on same position (origin = destination) Il est possible de définir dans une séquence plusieurs fois la même position de suite (utilisé par exemple pour permettre des densités de courant différentes pendant l'immersion). Dans un cas normal, lorsque l'immersion a atteint le Tmin, un robot vient prendre la charge et la dépose dans la destination mais comme dans ce cas la destination et la même que la position alors le robot fera une montée/descente sur la position. Ce paramètre permet de ne pas faire cette montée/descente et seulement continuer avec les paramètres de la deuxième ou nème immersion. Check no alarm in clear path to continue Lorsqu'un "clear path" est défini sur un pas de la séquence, si ce paramètre est coché alors le système vérifiera qu'il n'y a pas d'alarme dans les positions du "clear path" avant d'autoriser la charge à ce déplacer. Wait if priority time and zone not free Lorsqu'une priorité 255 est définie dans une position, le robot est bloqué sur cette pendant tout l'immersion mais seulement à condition que la zone occupé par le robot en sortie (position de destination) est libre. Dans le cas où la zone n'est pas libre, la priorité 255 ne bloque pas le robot sur la position et permet au robot de faire d'autre mouvements- Si ce paramètre est coché alors le robot passera dans une boucle d'attente sur la position même si la zone est occupée. Sort time by difference between dwell time and Tmax Ce paramètre permet de trier la liste des charges devant être déplacées avec comme paramètre la différence de temps entre le temps actuel d'immersion et le Tmax. Les temps les plus court seront traités en premier. Si ce paramètre n'est pas coché alors le Tmax n'interviendra pas dans le choix de l'ordre des charges à déplacer. Disable position not permitted Lors du calcul de démarrage d'une charge, le système vérifie que toutes les positions dans lesquelles la charge doit passer sont en service. Si une ou plusieurs positions sont hors service, le système interdira le chargement. Une fois démarrée, la charge pourra être déposée dans toutes les positions même si celles-ci ont été mises hors service après le départ. Ce paramètre interdira à une charge d'être déposée dans une position hors service. La charge attendra dans la position précédente que la position soit à nouveau en service. Do not take load from disabled position Normalement, une position dans laquelle une charge est déposée peut être mise hors service pour empêcher les charges suivantes d'y venir. Lorsque son temps d'immersion a atteint le TMin, le système demande à un robot de venir prendre la charge. En activant ce paramètre, les charges se trouvant dans une position hors service ne sont plus déplacées. Passing with a load over a loaded shuttle is not allowed Si ce paramètre est coché alors une charge n'a pas le droit de passer par dessus une charge se trouvant dans le transfert si celui-ci se trouve dans la même machine que la charge. Time between load (sec) Ce paramètre correspond au temps minimum (en secondes) entre 2 chargements. Il permet de limiter le nombre de charges en ligne. Time between check load from buffer (sec) Une fois le temps entre charge atteint, le système essaiera de charger la machine toutes les n secondes indiquées dans ce paramètre. Une valeur adéquate est 5 secondes. Il ne faut pas introduire une valeur inférieure pour ne pas surcharger le système. Short priority time (sec) Ce paramètre permet de gérer les charges ayant un temps Tmin plus petit que le temps indiqué dans ce paramètre comme si 255 avait été défini dans la priorité de la position. 0 indique que ce paramètre n'est pas utilisé. Add time to immersion (sec) Lors du calcul du diagramme de mouvement, le Tmin des positions est augmenté du nombre de secondes indiqués dans ce paramètre ce qui empêche que le test d'utilisation de la position soit autorisé aussitôt que le temps d'immersion se termine. Ce nombre de secondes correspond en général au temps nécessaire pour charger et décharger une position (environ 45 secondes). Lockup time (sec) Ce la valeur de ce paramètre indique au système un temps qu'il faut déduire du Tmin avant l'appel d'un robot. Ce temps est fixe pour toutes les positions contrairement au paramètre "Dec transfert time from Tmin" qui est individuel pour chaque position. Wait time before moving to a safe position Ce paramètre indique en secondes après combien de temps le robot est envoyé sur une position de type "Safe" (pouvant rester dessus) lorsqu'il est positionné sur une position sur laquelle il n'a pas le droit de rester. Empty jig program & Max empty jig program Ces paramètres sont utilisés pour forcer un programme pour rack vide lorsqu'une charge doit entrer dans une position occupée par un rack vide. Le système essaie d'attribuer le programme "Empty jig program" à la charge. Si ce n'est pas possible (la position ne se trouve pas dans la séquence), il essaie avec le programme "Empty jig program"+1 et ainsi de suite jusqu'à "Max empty jig program". Lorsqu'un programme est trouvé, le programme est attribué au rack vide et celui-ci passe en couleur bleu indiquant un rack avec programme rack-vide. Tmin in buffer before treatement (sec) Ce paramètre indique en secondes le temps minimum qu'une charge doit rester dans la gare de chargement avant d'être intégré en ligne. Maximum "Clear path" position allowed Ce paramètre permet de limiter le nombre de positions de "Clear path" défini dans les pas de séquence. Si l'utilisateur a défini un nombre plus élevé que celui indiqué dans ce paramètre, le système tiendra compte uniquement de ce paramètre. Liste of ignored positions in the occupancy calculation routine Ce paramètre contient une liste de position dont l'occupation n'est pas vérifier lors du calcul d'utilisation des positions. La liste correspond aux numéros de position séparés par une virgule. Drip time while up/down Ce paramètre permet de définir un temps d'égouttage lorsque des montées/descentes sont programmées sur les positions. Les paramètres OSCILine Les paramètres spécifiques au système OSCILine se situent dans la deuxième partie de l'onglet: Wait next station filled Si, dans la séquence, le step actuel demande le remplissage de la cuve de destination avant de déplacer la charge et que ce paramètre est activé alors le système envoie la commande de remplissage de la cuve de destination et attend que celle-ci soit pleine avant de déplacer la charge. Maximum wait time next station filled (sec) Ce paramètre correspond à un temps d'attente maximum pour que la cuve de destination soit pleine. Il est utilisé seulement lorsque le paramètre précédant est activé. Move empty load to next empty tank Lorsque ce paramètre est coché cela indique au système que celui-ci peut déplacer une charge vide se trouvant dans la position de destination d'une charge et la stocker dans une position vide de la machine. Time move empty load (sec) Ce paramètre est utilisé pour anticipé le déplacement d'une charge vide se trouvant dans la position de destination d'une charge. Avec le paramètre précédant, les charges vides sont déplacés si celles-ci se trouvent dans la destination d'une charge mais ce déplacement est effectué juste avant d'effectuer le mouvement. Avec ce paramètre > 0, ce déplacement est anticipé de la valeur de ce paramètre exprimée en secondes. Do not move empty load on unload station Si ce paramètre est activé alors les charges vides se trouvant sur un poste de décharge ne sont pas déplacées. Ce paramètre est utilisé en harmonie avec les 2 derniers paramètres. Job time adjustment (sec) Ce paramètre est utilisé pour ajuster le calcul total du temps d'utilisation d'une cuve. Tous les temps définis dans les jobs ainsi que les temps de remplissage et de vidange sont additionnés et pour charge job ce paramètre est ajouté. Il correspond au temps de communication (handshake) entre le système et l'automate. Job 255 time adjustment (sec) Ce paramètre est utilisé pour ajuster le calcul total du temps d'utilisation d'une cuve dont le job=255 (cuve jamais vidée). Ce temps est ajouté au temps défini dans la séquence. Il correspond au temps de communication (handshake) entre le système et l'automate. Les paramètres d'occupation des transporteurs Dans un système prioritaire, les temps de déplacement des transporteurs (occupation) ne sont pris en compte que pour le calcul du temps d'utilisation des cuves. Si deux mouvements doivent être effectués en même temps par le même transporteur, cette incompatibilité n'est pas prise en compte par le système car, au moment du calcul, les transporteurs sont attribués selon leurs taux d'occupation calculés mais cela ne veut pas dire qu'ils seront appelés de la même manière au moment de l'exécution en temps réel. Pour palier à ce problème, un taux d'occupation maximum des transporteurs a été ajouté au système. Ce taux d'occupation est calculé sur une période définie dans le paramètre Range. Par exemple, si la valeur est 600 cela veut dire que le taux d'occupation sera calculé sur des périodes de 10 minutes. Le calcul sera répété toutes les 10 minutes décalé de la moitié du temps défini soit 5 minutes. Dans l'illustration suivante, les 3 premières périodes sont représentées: Le calcul est effectué jusqu'au dernier mouvement prévu. Si le calcul du taux d'occupation de chaque transporteur pendant les périodes dépasse le taux d'occupation défini dans le tableau alors la charge ne sera pas autorisée à démarrer. Dans le graphique, chaque colonne correspond au taux d'occupation de la période calculée. Dans l'exemple ci-dessus, le transporteur 1 sera occupé pendant 18% du temps de la première période puis plus rien dans les autres périodes. Le transporteur 2 sera occupé pendant 10% du temps de la première période, 16 % de la deuxième période, 11 % de la troisième période puis 4 % de la quatrième période puis plus rien. Pour le troisième transporteur, il sera occupé 9% pendant la première période, 0% pendant la deuxième, 7 % pendant la troisième, 14 % pendant la quatrième, 7 % pendant la cinquième, etc... Le premier ensemble de colonnes correspond à la moyenne du taux d'occupation de tous les transporteurs. Bien entendu, la case "Check hoists occupation" doit être cochée pour que la vérification soit effectuée. Le mode de fonctionnement OSCILine Introduction Le mode de fonctionnement OSCILine permet l'utilisation de conteneurs contenant de la chimie ou des rinçages pouvant être pompés ou vidangés vers ou depuis la cuve de travail. L'utilisation de ces conteneurs est nommé "Job". Un "Job" correspond donc au remplissage de la cuve principale depuis un conteneur, à l'immersion de la charge pendant un temps défini puis à la vidange de la cuve de travail vers le conteneur. Il peut également correspondre à une douche pendant un certain temps et à la vidange vers l'égout ou vers un conteneur. Le fonctionnement du Job est programmé dans l'automate programmable et peut correspondre à n'importe quelle fonction. En mode OSCILine une cuve de travail est également appelée "Module". Exemple d'une cascade en mode OSCILine Exemple d'une cuve de rinçage en mode OSCILine La définition des modules et jobs La définition des modules et des jobs est réalisée dans le fichier OSCIDef.ini. Par exemple: [Module11] Type=1 StatusDB=28 StatusReg=11 CommandDB=27 CommandReg=44 JOB1=Spray DI;11;10;3;5 JOB2=Spray EV;16;10;3;5 JOB3=Rinçage;1;30;30;30 [Module12] Type=0 StatusDB=0 StatusReg=0 CommandDB=0 CommandReg=0 JOB1=Traitement;255;45;0;0 [Module13] Type=1 StatusDB=28 StatusReg=13 CommandDB=27 CommandReg=52 JOB1=Spray DI;11;10;3;5 JOB2=Spray EV;16;10;3;5 JOB3=Rinçage;1;30;30;30 ... [Module21] Type=0 StatusDB=0 StatusReg=0 CommandDB=0 CommandReg=0 JobDB=29 JobReg=21 JOB1=Champagne NN ;51;180;0;0;0;1 JOB2=5N ;52;180;0;0;0;2 JOB3=2N18 ;53;180;0;0;0;3 Pour chaque position de la machine un module doit être défini. Le numéro du module correspond au numéro (index) de la position. Les mots clef Mots clef Type Description Type Integer Indique le type de mode: 0: Cuve toujours pleine (pas de conteneur annexe). Le fonctionnement est géré par VKQuickView. 1: Cuve équipée de conteneurs annexes pouvant être remplie et vidée. Le fonctionnement est géré par l'automate programmable. Le statut du fonctionnement est lu depuis l'automate programmable dans le registre de statut. La commande est envoyé à l'automate programmable dans le registre de commande. Les divers statuts sont décrits dans la section "Statuts" et les diverses commandes sont décrites dans la section *Commandes" StatusDB Integer Numéro du DB dans lequel se trouve le registre de statut StatusReg Integer Numéro du registre de statut. CommandDB Integer Numéro du DB dans lequel se trouve le registre de commande. CommandReg Integer Numéro du registre de commande. Job1..20 String Définition des 20 jobs possibles par module. Les jobs sont composés de données séparées par un point virgule. Les données sont les suivantes: 1) Nom du job (texte affiché dans la définition des séquences) 2) Numéro interne du job dans l'automate. Les jobs 1..254 correspondent à des fonctions définies dans l'automate programmable. Le job 255 correspond à une cuve toujours pleine gérée par QuickView. 3) Temps (en secondes) par défaut dans la séquence. 4) Temps caché (en secondes) correspond au temps de remplissage de la cuve principale. 5) Temps (en secondes) de vidange de la cuve principale. 6) Numéro du job correspondant à un rinçage. Lorsqu'un job est avorté suite à une erreur de rotation par exemple, ce numéro correspond au numéro de job que QuickView va exécuter après l'arrêt du job en cours. 7) Numéro du redresseur par défaut (1..9). Un module peut comporter jusqu'à 8 redresseurs. 1 à 8 indique le numéro du redresseur, 9 indique tous les redresseurs. JobDB Integer Numéro du DB dans lequel se trouve le registre de numéro de Job du module (1..20) JobReg Integer Numéro du registre de job. Le numéro de job indique à QuickView quelle cuve mobile est en place. Les autorisations de démarrage d'un programme passant par des cuves mobiles vérifient que les bonnes cuves sont en place avant que l'autorisation soit accordée. Chaque bit du registre correspond à un numéro de job (1..20). Le bit 1 correspond au job numéro 1, le bit 2 au job numéro 2, le bit 15 au job numéro 15, etc.... Le bit 0 n'est pas utilisé. Le contenu du registre de statut Le contenu du registre de statut de l'automate indique au système dans quel état se trouve le job dans l'automate. Les statuts suivants sont possibles: Valeur Description 0 Le job est prêt à démarrer. Une nouvelle commande de démarrage peut être envoyée. 1 Le job a terminé son initialisation 2 Le job a démarré le décompte du temps 3 Le job a commencé la vidange 4 Le job a exécuté la fin de vidange 5 fin de job ou erreur La structure des registres de commande La structure des registres de commande est composé de 4 registres: Registre Type Description 0 Word bits 0-7 = commande : 0=reset, fin de job, 1=démarrer le remplissage, 2=démarrage du temps, 3=démarrage vidange, 4=fin de vidange, 255=Reset alarme bits 8-15 = numéro de job 1 Word Temps défini dans la séquence 2 Word bit 0-7 = numéro du prochain job dans la séquence ou 0 si dernier job. bits 8-15 = paramètre 1 3 Word Paramètre 2 Utilisation de plusieurs langues sur les pages graphiques En général, les textes des pages graphiques sont définis dans la langue de l'utilisateur final et ne sont pas relative à la langue de l'utilisateur enregistré dans le système. Il est cependant possible de définir les textes dans la langue de l'utilisateur en modifiant la manière dont laquelle sont défini les textes sur une page graphique. Dans l'utilitaire QVConfig.exe, il existe un onglet (UserText0-3.ini) permettant de définir des textes spécifiques à l'application. Ces textes sont sauvegardés dans les fichiers WQVFiles\UserText0.ini, WQVFiles\UserText1.ini, etc... Pour utiliser ces textes, il faut commencer le texte par {% suivi du numéro de texte. Par exemple, pour un bouton Ouvrir/Fermer qui serait affiché dans la langue de l'utilisateur, il faut introduire [\1:{%4\0:{%5] dans le texte du bouton. Ceci est valable pour tous les textes d'une page graphique. Suivi des produits chimiques Pour permettre le suivi des produits chimiques et leurs numéros de lots dans les rapports de suivi, une structure de données correspondant à une liste de produits chimiques a été introduite. Cette structure permet de définir 16 produits chimiques et numéros de lots différents . Les registres internes (DB 0) 12001..12016 correspondent aux noms des produits chimiques et les registres internes (DB 0) 13001..13016 correspondent aux numéros de lot. Ces données sont stockées dans le fichier WQVFiles\Chemicals.dat au format "Texte". Ces données sont associées aux charges lors du chargement au poste de charge. Elles peuvent donc être imprimées sur le rapport de suivi. Les postes de charge Description du fonctionnement des différents postes de charge intégrés dans l'application Le poste de charge n° 52 Introduction Le poste de charge n°52 est le poste de charge à utiliser pour les machines de traitement de surfaces en général car il contient toutes les options possibles existantes sur les postes de charge. Sélection de la référence à charger. Zone dédiée à la sélection du poste de charge. Tableau des articles et outillages Zone dédiée à la sélection de fonctions spéciales Tableau des blocs de traitement Zone des commandes de charge et décharge Zone des icônes de commande. La configuration du poste de charge est effectuée à l’aide de mots clef. Ces mots clef sont éditables dans le fichier VKWinQV.ini dans la section [PDC] (ou au travers de l'icône "Options" du poste de charge) ou au travers de la boîte de dialogue “Settings” de QuickView. Les supports de pièces Les supports de pièces correspondent aux outils utilisés sur la machine pour stocker les pièces sur le porte rack. Sur certaines machines, il sera possible de travailler avec divers supports de pièces. Dans ce cas, il est important de pouvoir indiquer au système quel type de support est utilisé. Ceci se fait au travers d'un combobox permettant de choisir le type de support. Pour afficher cet élément, la case à cocher [Settings][General]ShowSupportType doit être cochée. La liste des supports est fixe et permet le choix entre: Rack, Tonneau ou Vibreur La rotation sur le transporteur Lorsque le support "Tonneau" est utilisé, il faut certaines fois pouvoir sélectionner si celui-ci doit tourner sur les transporteurs lorsque le tonneau est en l'air par le transporteur. Si uniquement le fait de tourner ou pas est exigé alors la case à cocher [Settings][General]LoadRotation permettra de pouvoir sélectionner cette fonction sur le poste de charge Dans le cas où un type de rotation devait être sélectionner, la case à cocher [Settings][General]LoadRotationType affichera un combobox permettant un choix entre divers types de rotation. Les types de rotations possibles sont: Pas de rotation Rotation continue jusqu'à destination Depuis le début du temps d'égouttage jusqu'en haut Depuis le début du temps d'égouttage jusqu'à destination Depuis la fin du temps d'égouttage jusqu'en haut Depuis la fin du temps d'égouttage jusqu'à destination Depuis le bas jusqu'à l'arrêt pour égoutter Depuis le bas jusqu'à la fin du temps d'égouttage Depuis le bas jusqu'en haut Sélection du poste de charge Lorsque la machine est équipé de plusieurs postes de charge, il est possible soit d'utiliser une boîte de dialogue pour chaque poste de charge ou une boîte de dialogue gérant tous les postes de charge. Pour choisir cette fonctionnalité, il faut cocher la case à cocher [Settings][General]SingleLoadForm. Le choix des poste de charge est alors affiché sur le haut de la boîte de dialogue.   Sélection du numéro de porte-rack En général, les portes-rack d'une machine sont numérotés. Pour permettre le suivi de leur utilisation, il est possible d'afficher une zone de sélection à l'aide de la case à cocher [Settings][General]ShowVirtualJig. Pour choisir le numéro de porte-rack, cliquez sur le bouton [Porte-rack], la liste des portes-racks s'affiche. Travail avec une gare virtuelle Il est possible de préparer des charges dans une gare virtuelle et les charger dans la machine une fois le chariot inséré dans le poste de charge. Cette gare virtuelle permet de choisir une charge plutôt qu'une autre selon les informations affichées sur le panneau latéral. Le panneau latéral affiche en-haut les charges en cours dans la machine et en bas les charges dans la gare virtuelle. Pour définir une gare virtuel il faut définir un poste de charge virtuel dans la définition des postes de charge dans le fichier io.ini; [Load2] Position=EXT mode=60 StackBuffer=15 Position=EXT indique que le chargement se fait dans la gare virtuelle. Mode=60 indique le mode de fonctionnement en gare virtuelle. StackBuffer=15 indique le nombre de positions maximum dans cette gare virtuelle. Pour permettre un fonctionnement en gare virtuelle il faut donc: Activer le panneau latéral. Activer la sélection du numéro de porte-rack Définir le poste de charge extérieur Les informations de production Il est possible d'afficher l'heure du prochain départ, l'heure de la prochaine sortie et l'heure du dernier mouvement. Pour afficher ceci, il faut cocher la case [PDC]"Affichage des informations de production". Inspections Lorsque des inspections sont définies dans IO.ini, il est possible de les afficher dans un bloc.  Pour les inspections de type 0 et 1, l'opérateur doit indiquer quelles inspections devront être réalisées ou si des pièces témoin doivent être ajoutées lors de l'inspection. Pour afficher ces informations, la case ci-dessous doit être activée: Mode de fonctionnement Lorsque le système peut travailler en local ou avec le serveur d'entreprise, le bloc "Mode de fonctionnement" s'affiche. Destination après la décharge Sur certaines machines équipées de tapis ou de robot à la décharge, il faut indiquer la destination des pièces après avoir été déchargées. Pour afficher la destination, il faut cocher la case  [Settings][General]ShowUnloadDest La liste des destinations possibles est définie dans [PDC]"Destination après décharge": Mode de démarrage Sur certaines machines, il peut être demandé d'enclencher ou déclencher des équipements lorsque certaines pièces sont chargées. Pour pouvoir faire ceci, les modes machine sont utilisés. Pour sélectionner un mode de démarrage, la case à cocher [Settings][General]ShowStartMode est utilisée. Le combobox affichera la liste de tous les modes ayant la case "mode pouvant être utilisé comme mode de démarrage" cochée. Sélection de l'heure de chargement Sur certaines machines équipées d'une gare de chargement, il est possible de sélectionner une heure de démarrage. Pour permettre cette fonctionnalité, il faut cocher la case [Settings][General]ShowStartDateTime. Lorsque celle-ci est cochée, l'icône "Calendrier" est affichée dans la zone des icônes de commande. En cliquant sur cette icône, le mode de démarrage sur calendrier est activé ou désactivé. Lorsque le mode de démarrage sur calendrier est sélectionné, le choix de la date et de l'heure de départ est affiché. Si la date et l'heure sont affichées alors lorsque l'utilisateur cliquera sur le bouton [Charge], cette date et cette heure seront utilisées pour démarrer la charge en production. Si ceux-ci ne sont pas affichés alors la charge démarrera tout de suite lorsque l'état de la machine le permettra. Utilisation d'une balance Certaines machines sont équipées d'une balance au poste de charge permettant de peser la quantité de pièce introduite principalement dans des tonneaux. Pour permettre l'utilisation d'une balance, la case à cocher [Settings][General]ShowScaleButton doit être activée. Une I/O doit être définie dans la définition du poste de charge IO.ini[Load1]WeightIO=n° d'I/O. Cette I/O doit contenir le poids retourné par la balance. Lorsque tout ceci est défini, l'icône "Balance" s'affiche dans les icônes de commande. Lorsqu'un article a été introduit et que le nombre de pièces n'est pas encore défini, il est possible de cliquer sur l'icône "Balance" et la boîte de dialogue suivante s'affiche: Le poids max affiché dans la boîte correspond au poids maximum autorisé pour l'outillage. Cela veut dire qu'il est obligatoire d'introduire un type d'outillage avant de pouvoir peser des pièces. Lors de l'ouverture de la boîte de dialogue, le poids affiché correspond en général au poids du tonneau et du porte-rack. L'utilisateur doit alors effectuer un tarage de la balance en cliquant sur le bouton [T]. Une fois taré, le poids s'affiche en vert, l'information NET est affichée en-dessous du poids et le bouton [Ok] devient actif. Il faut ensuite ajouter les pièces désirées dans le tonneau. Le poids affiché correspond maintenant au poids réel des pièces chargées. Pressez sur le bouton [OK] pour terminer la pesée. Le nombre de pièces est alors calculé et mis à jour dans le tableau des pièces. Le tableau des pièces Le tableau des pièces permet l'introduction des données des pièces chargées sur la machine. Il est partiellement configurable à l'aide de la boîte de dialogue des options du poste de charge. Le tableau ci-dessus indique que 2 outillages (rack #1796 et rack # 2457) sont chargés respectivement avec 100 pièces de l'article ayant la référence 123 et 50 pièces du même article. Ces deux outillages ont chacune une surface métallique de 0.23 dm² ainsi qu'une surface totale de 0.25 dm². 300 gammes de billes ont été ajoutés à la charge ce qui représente une surface de 1.87 dm². La surface métallique total est de 20.63 dm² (0.23 + 100x0.12 + 0.23 + 50x0.12 +1.87) et la surface chimique totale est de 24.87 dm². Type de surface Le type de surface affichée est sélectionnable dans [PDC]"Type de surface". Les types suivants sont possibles: Surface métallique et surface totale Surface avant et surface arrière (utilisé principalement dans le chargement de circuits imprimés) Surface métallique et poids Surface métallique Surface avant, surface arrière et surface totale Utilisation de billes de contact Lorsque des tonneaux sont utilisés, il est fréquent d'ajouter aux pièces des billes de contact. Le nombre de bille n'étant pas connu, l'utilisateur introduit le poids de ces billes. La surface ainsi ajoutée est calculée automatiquement. Pour afficher la ligne correspondant aux billes, il faut cocher la case [Settings][General]ShowBallsLib. Lorsque cette option est définie, l'onglet [Définition des billes] de la boîte de dialogue "Définition des bains" devient apparent. Quantité d'outillages Certaines fois, il est demandé de mentionner le nombre d'outillages de même type chargé sur un porte-rack. Dans ce cas, la quantité d'outillage est affichée devant le nom de l'outillage. Le champ correspondant au nom de l'outillage devient le type d'outillage. Il est possible d'introduire le numéro de chaque outillage en cliquant sur le champ du type d'outillage. Une boîte de dialogue s'affiche: Nombre de lignes de données du tableau Il est possible d'indiquer le nombre de lignes de données affichées dans [PDC]"Nombre de lignes visibles dans la grille des pièces". Si le nombre sélectionné est plus petit que le nombre réel de lignes possibles, un ascenseur vertical sera affiché à droite du tableau permettant la navigation. Le tableau peut être composé de maximum 4 outillages ([PDC]"Nombre max. d'outillages") pouvant contenir chacun 5 articles ([PDC]"Nombre max. d'articles par outillage"). Les unités utilisés ainsi que le nombre de décimales affichés sont également définissable dans [PDC].  Le tableau des blocs de traitement Les blocs de traitement sont en général utilisés pour modifier certains paramètres comme : la densité de courant, le temps de traitement, l'épaisseur, le profil de courant ou une position d'un groupe. Il peut être défini jusqu'à 8 blocs de traitements par séquence. Un bloc de traitement est défini lorsque l'option "Charge" est défini dans la colonne [Variable] de la définition des séquences. Par défaut, les 8 blocs possibles sont affichés mais il est possible de réduire ce nombre pour diminuer la surface utilisée par la boîte de dialogue du poste de charge. Le nombre de lignes affichées se défini dans [PDC]"Nombre de lignes visibles dans la grille des blocs de traitement". Il est possible d'introduire 0 dans cette option pour cacher le tableau complètement (aucun bloc utilisé dans la machine). Lorsqu'aucun redresseur n'est configuré dans la machine, le tableau des blocs de traitement est raccourcis des colonnes utilisées par les redresseurs. Les contrôles en sortie Certaines fois, il est demandé à l'opérateur de faire certains contrôles lorsque les charge sont sorties de la machine. Lorsque cette option est activée, le panneau d'information contient un nouvel onglet "Contrôles à la sortie". La table affichée dans cet onglet montre les n dernières charges déchargées de la machine. Lorsque des contrôles sont demandés, 2 colonnes indiquent le résultat des contrôles s'ils ont été effectués ou s'ils doivent être effectués. Pour effectuer un contrôle, l'opérateur doit double-cliquer sur la case "Conformité" de la charge correspondante. Une fenêtre s'affiche indiquant les contrôles à effectuer: Dans cette fenêtre, les contrôles à réaliser sont affichés. L'opérateur doit indiquer si le contrôle est conforme ou non. Dans le cas ou le contrôle n'est pas conforme, il doit introduire une remarque dans le champ "Non-conformité". Certaines fois, il est demandé d'introduire un résultat numérique tel que une épaisseur, ou un diamètre. Le champ mesure est fait pour cela. Lorsque tous les champs ont été renseignés, un bouton de validation s'affiche dans le bas du tableau. Lorsque l'opérateur clique sur celui-ci, les résultats des contrôles sont enregistrés dans la base de données et ne sont plus modifiables. Il peut être demandé qu'un deuxième contrôle soit requis. Ce deuxième contrôle doit être réalisé par un superviseur. L'opérateur ayant réalisé le premier contrôle ne peut pas effectuer le deuxième contrôle. Ce doit être un opérateur différent ayant les droits nécessaires. Utilisation d'un lecteur de codes à barres Pour fonctionner avec un lecteur de codes à barres, celui-ci doit être configuré dans VKWinQV.ini dans la section suivante: [Barcode] Comport=4 Baudrate=9600 StopBits=1 Databits=8 Parity=None Encoding=14 Le lecteur doit être un lecteur connecté sur un port série physique ou virtuel. Lorsque l'encoding=14, la configuration des RegEx s'affiche dans la page de configuration du poste de charge. Le groupe index permet de définir le même RegEx sur différents champs mais en indiquant l'index du groupe défini dans le RegEx. Ceci permet d'avoir plusieurs informations dans un même code à barres. Les mots clefs des fichiers ini Les mots clef possibles sont: Mot clef Type Valeur par défaut Configuration Description DefaultSupport Integer 0 INI Indique le type de support à utiliser par défaut lorsque l’on efface le poste de charge (0: Rack 1: Tonneau 2: Vibarrel) DefaultRotation Integer 0 INI Indique le type de rotation sur les transporteurs à utiliser par défaut (0= sans 1=avec) MaxTools Integer 4 PDC Indique le nombre d’outillages à afficher. MaxReferences Integer 5 PDC Indique le nombre de références par outillage à afficher. DefaultMetalUnit Integer 2 PDC Indique le type d’unité de mesure pour la surface métallique (0: mm2 1:cm2 2: dm2 3: m2 4: in2 5: ft2) DefaultChemicalUnit Integer 2 PDC Indique le type d’unité de mesure pour la surface chimique (0: mm2 1:cm2 2: dm2 3: m2 4: in2 5: ft2) TotalMetalUnit Integer 2 PDC Indique le type d’unité de mesure pour le total de la surface métallique (0: mm2 1:cm2 2: dm2 3: m2 4: in2 5: ft2) TotalChemicalUnit Integer 2 PDC Indique le type d’unité de mesure pour le total de la surface chimique (0: mm2 1:cm2 2: dm2 3: m2 4: in2 5: ft2) WeightUnit Integer 0 PDC Indique le type d’unité de mesure pour le poids (0: g 1: kg 2: lb 3: oz.) TotalWeightUnit Integer 0 PDC Indique le type d’unité de mesure pour le total de poids (0: g 1: kg 2: lb 3: oz.) NbDecimalDensity Integer 2 PDC Indique le nombre de décimales à afficher dans les champs “Densité” NbDecimalMicron Integer 2 PDC Indique le nombre de décimales à afficher dans les champs “Epaisseur” NbDecimalWeight Integer 2 PDC Indique le nombre de décimales à afficher dans les champs “Poids” NbDecimalTotalWeight Integer 2 PDC Indique le nombre de décimales à afficher dans le total du poids NbdecimalCurrent Integer 1 PDC Indique le nombre de décimales à afficher dans les champs “Courant” NbDecimalTotal Integer 2 PDC Indique le nombre de décimales à afficher dans le total de la surface métallique NbDecimalSurface Integer 2 PDC Indique le nombre de décimales à afficher dans le total de la surface chimique ChangeProgramMode Integer 0 PDC Indique comment utiliser les champs “Densité”, “Temps” et “Epaisseur” lors d’un changement de programme. (0: Utiliser la densité et le temps, 1: Utiliser le temps et l'épaisseur 2: Utiliser la densité et l'épaisseur) ChangeDensityMode Integer 0 PDC Indique ce qu’il faut modifier lorsque l’on change la densité de courant (0: Le temps 1: l'épaisseur) ChangeTimeMode Integer 0 PDC Indique ce qu’il faut modifier lorsque l’on change le temps (0: la densité 1: l'épaisseur) ChangeThicknessMode Integer 0 PDC Indique ce qu’il faut modifier lorsque l’on change l'épaisseur (0: la densité 1: le temps) SurfaceMode Integer 0 PDC Indique quels champs de surface qu’il faut afficher dans le tableau des articles: 0: Surface métallique et surface totale 1: Surface avant et surface arrière (circuits imprimés): 2: Surface métallique et poids 3: Surface métallique uniquement 4: Surface avant, arrière et totale (circuits imprimés) CheckProgramVersion Boolean True PDC Vérification lors de la pression sur le bouton [Charge] que le numéro de version du programme enregistré dans la référence bibliothèque correspond au numéro de version du programme actuel. Si la version est différente, le chargement n’est pas possible et un message s’affiche vous l’indiquant. CheckModeVersion Boolean True PDC Vérification lors de la pression sur le bouton [Charge] que le numéro de version du mode d'équipement enregistré dans la référence bibliothèque correspond au numéro de version du mode d'équipement actuel. Si la version est différente, le chargement n’est pas possible et un message s’affiche vous l’indiquant. CheckDensityRange Boolean True PDC Vérification que la densité de courant introduite dans les blocs de traitement soit bien comprise entre le minimum et le maximum autorisé. Si en dehors des marge, les champs correspondant sont affichés en rouge. CheckVoltageRange Boolean False PDC Vérification que la consigne de tension introduite dans les blocs de traitement soit bien comprise entre le minimum et le maximum autorisé. Si en dehors des marge, les champs correspondant sont affichés en rouge. Le champ “tension” n’est affiché que lorsque les profils de tension sont configurés comme “LargecurrentFormRegulation” dans l'écran de settings des redresseurs: CheckThicknessRange Boolean False PDC Vérification que l'épaisseur introduite dans les blocs de traitement soit bien comprise entre le minimum et le maximum autorisé. Si en dehors des marge, les champs correspondant sont affichés en rouge. CheckMaxRectifier Boolean True Settings Vérification de la capacité des redresseurs soit bien en dessous de la valeur autorisée. Si en dessus de la capacité des redresseurs, les champs correspondant sont affichés en rouge et le chargement est interdit. CheckAuthorisedTools Boolean False PDC Lorsque les outillages sont associés au porte-rack, il est possible de vérifier que les pièces chargées soient bien chargées dans le bon outillage. CheckNumberOfBlock Boolean True PDC Vérification que le nombre de blocs de traitement définis dans la référence correspond bien au nombre de blocs actuellement utilisés par le programme sélectionné. CheckWeight Boolean False PDC Vérification du poids maximum autorisé. ShowToolButton Boolean False Settings Affichage du bouton permettant d’appeler un rack en décharge selon le type d’outillage nécessaire. ShowScaleButton Boolean False Settings Affichage de l’icône permettant de visualiser les données de la balance. ProgramAuto Boolean False PDC Permet d'interdire le chargement si le mode programme n'est pas en automatique ToolUsage Boolean False PDC Permet d'activer la fonction de vérification de l'utilisation des outillages ToolUsageLimit Integer 0 PDC Limite d'utilisation des outillages lors de la création d'un nouvel outillage MonoCopyPaste Boolean False Settings Utilise le même copier/coller pour tous les postes de charge DisplayTimeInHour Boolean False Affichage des temps en heures (pour les positions utilisant des minutes comme unité de temps) UserQuestion String PDC Question affichée lorsque l'utilisateur clique sur le bouton [Charge]. ShowUnloadDest Boolean False Settings Affichage du combobox permettant le choix de la destination lors de la décharge. UnloadDest[1..10] String PDC Définition du choix des destinations affichées dans le combobox ci-dessus ShowStartDateTime Boolean False Settings Permet d'afficher la date et l'heure de démarrage désirées CheckProgramOverload Boolean False PDC CalcMicronRampe Boolean True PDC HideChemicalSurface Boolean False CurrentDensity Integer 0 PDC PartGridLineCount Integer 6 PDC Nombre de ligne dans le tableau des articles ShowStartMode Boolean False Settings Affichage du mode de démarrage ShowLoadPicture Boolean False Settings Affichage d'images associées aux articles dans le panneau d'information ShowProductionInfo Boolean False PDC Affichage des informations de production: RFIDEqualReference Boolean True RFID Settings RFIDTimeout Integer 30 PDC RFIDOnTool Boolean False Settings CheckPartUsage Boolean False PDC CalcPartQuantity Boolean False PDC ReportFile String INI FocusOnProcessFirst Boolean False PDC AutoLoadEnabled Boolean False Settings ResetToLoad1 Boolean False Settings CheckJigUsage Boolean False PDC ShowToolQuantity Boolean False Settings MaxToolQuantity Integer 20 PDC ShowBarcodeIcon Boolean False PDC CheckTBDiffTime Boolean False PDC Permet de vérifier si le changement de temps d'un bloc de traitement ne dépasse pas les limites autorisées: DefaultPDC Integer 1 Settings Poste de charge par défaut. L'affiche lorsque l'on presse F5 LoadingDisabledRackForbiden Boolean false PDC Interdiction d'utiliser des barres hors-service BypassVerification Boolean false PDC Ne pas effectuer les vérifications d'usage (utilisé lors de fonctionnement avec serveur d'entreprise) Poste de charge n°66 Suivre la procédure suivante pour scanner les différents barcode: Scan le barcode "Optima". Ce barcode fait le lien entre le programme de lavage et la commande d'équipement. Il doit être défini dans la DBase . Scan du Basket carrier # (N° de panier). Pas de règle défini pour ce barcode. Scan du Shop order (N° de commande). Commence toujours avec le préfixe $6. Il contient aussi un suffixe de 1 caractère aléatoire. le préfixe et le suffixe sont automatiquement effacés pour l'enregistrement. Scan du Trace code (Code de suivi). Commence toujours avec le préfixe $7. Il contient aussi un suffixe de 1 caractère aléatoire. le préfixe et le suffixe sont automatiquement effacés pour l'enregistrement. La Quantity (Quantité) peut être insérée au clavier ou avec un barcode purement numérique sans règle (1-9999).  Lorsque l'on presse sur "Load", le système contrôle que tous les champs nécessaires sont remplis. Si ce n'est pas le cas, un message pop-up apparait à l'écran: Poste de charge n°67 Suivre la procédure suivante pour scanner les différents barcode: Scan du Lot ID (N° de commande). Pas de règle défini pour ce barcode. Scan du Baseplate letter (Code de suivi). Commence toujours avec le préfixe $2. Le préfixe est automatiquement effacé pour l'enregistrement. Scan de la Quantity (Quantité). Commence toujours avec le préfixe $QTY + un numéro (1-8). Le préfixe est automatiquement effacé pour l'enregistrement. Scan du Lot ID du lot numéro 2 Scan du Baseplate letter du lot numéro 2 Scan de la Quantity du lot numéro 2 Scan du Basket Carrier # (N° de panier). Commence toujours avec le préfixe $1. Le programme et le mode sont renseignés la première fois puis automatiquement réinsérés lors du prochain chargement. Si la quantité insérée n'est pas comprise entre 1 et 8, un message pop-up apparait: Lorsque l'on presse sur "Load", le système contrôle que tous les champs nécessaires sont remplis. Si ce n'est pas le cas, un message pop-up apparait à l'écran:   Poste de charge n°69 Options... Suivre la procédure suivante pour scanner les différents barcode: Scan du Product ID (Produit). Règle définie selon RegEx. Le système contrôle que ce numéro existe dans la base de donnée Optima. Le premier Product ID défini le programme à utiliser. Chaque Product ID supplémentaire doivent avoir le même programme de lavage lié dans la base de donnée. Scan du Lot ID (Lot). Règle définie selon RegEx. Scan de la Quantity (Quantité). Doit être un numéro (1-9999). Répéter les opérations de 1 à 3. Jusqu'à un maximum de 12 Product ID. Si un Product ID n'a pas le même programme de lavage que les précédents, un message pop-up s'affiche: Si le champs attendu ne correspond pas au RegEx: Si on presse sur "Load" et que le numéro de lot est vide: Si on presse sur "Load" et que le champs quantité est vide: Si on presse sur "Load" et que l'option "Checking maximum number of parts" est cochée. Un message pop-up apparait si la quantité total insérée (en prenant en compte chaque ligne) est plus grande que le paramètre "Maximum quantity": Si on presse sur "Load" et que l'option "Checking unique lot ID" est cochée. Un message pop-up apparait si un numéro de lot n'est pas unique: Poste de charge n°71 Options... Suivre la procédure suivante pour scanner les différents barcode: Scan du Product Code (Produit). Règle définie selon RegEx. Le système contrôle que ce numéro existe dans la base de donnée Optima. Le premier Product Code défini le programme à utiliser. Chaque Product Code supplémentaire doivent avoir le même programme de lavage lié dans la base de donnée. Scan du Work Order (Lot). Règle définie selon RegEx. Scan de la Quantity (Quantité). Doit être un numéro (1-9999). Répéter les opérations de 1 à 3 pour la deuxième ligne. Si la case "Reading 2x barcode" est cochée et que le deuxième barcode lu est différent du premier, le message suivant apparait: Si un Product Code inexistant dans la base de données est inséré: Si un Product Code n'a pas le même programme de lavage que le précédent, un message pop-up s'affiche: Si le champs attendu ne correspond pas au RegEx: Poste de charge n°74 Options... Suivre la procédure suivante pour scanner les différents barcode: Scan de la Référence (Dbase référence). N'importe quel barcode est autorisé. Le système contrôle que ce code existe dans la base de donnée Optima. Scan du Lot. Règle définie selon RegEx. Le nombre minimum de lot requis est défini dans les options et un maximum de 100 lots peut être inséré. Si l'option "Vérification des lots uniques" est cochée, lors d'un doublon en scannant, celui-ci est ignoré par le système et n'est donc pas inséré une deuxième fois. Si le champs attendu (lot) ne correspond pas au RegEx: Si la quantité minimale de lot définie dans les options du poste de charge n'est pas atteinte: Si la référence scannée n'existe pas dans la base de donnée Optima: Poste de charge n°77 Options... Suivre la procédure suivante pour scanner les différents barcode: Scan de la référence. Pas de règle. Le système contrôle que ce code existe dans la base de donnée Optima. Il permet de définir le programme de lavage ainsi que le mode d'équipement. Scan du Numéro de commande. Règle définie selon RegEx Scan du (des) Numéro d'article. Règle définie selon RegEx. Un maximum de 100 articles peuvent être enregistré. Scan du Code opérateur. Règle définie selon RegEx. Si la référence insérée n'existe pas dans la base de donnée Optima, un message pop-up s'affiche: Poste de charge n°78 Options... Suivre la procédure suivante pour scanner les différents barcode: Scan de la référence. Pas de règle. Le système contrôle que ce code existe dans la base de donnée Optima. Il permet de définir le programme de lavage ainsi que le mode d'équipement. Scan du Lot #. Règle définie selon RegEx Scan du Article #. Règle définie selon RegEx. Scan du Production order #. Règle définie selon RegEx. Poste de charge n°79 Options... Suivre la procédure suivante pour scanner les différents barcode: Scan de la Grundtrõger (Panier). Règle définie selon RegEx. Scan du Fertigungsauftrags (OF). Règle définie selon RegEx. Une requête est transmise à une base de données externe (côté client) avec ce numéro d'OF (WORK_ORDER). Les autres champs de la ligne correspondante sont alors automatiquement ajouté dans le poste de charge. Le programme de lavage ainsi que le mode d'équipement sont aussi automatiquement renseigné. Le mode d'équipement doit avoir le même numéro que le programme (CLEAN_PROGRAM). Répéter le point 2 pour insérer d'autres articles. Configuration dans VKWinQV.ini: Type=ODBC_CUSTOMER ConnectionString=DSN=A3226_Parts;UID=sa;PWD=xxxxxxxxxxxxxxxx; CloseConnectionAfterQuery=0 TableName=VEI_Barcode_Query1_CLEAN ReferenceName=WORK_ORDER FieldName1=MATERIAL FieldType1=0 FieldName2=MATERIAL_DESC FieldType2=0 FieldName3=BATCH FieldType3=0 FieldName4=OPERATION_QUANTITY FieldType4=1 FieldName5=CLEAN_PROGRAM FieldType5=1 Il faut définir une connexion ODBC à la base de données. Exemple de la table d'une base de données: Si le champs attendu ne correspond pas au RegEx: Si l'article scanné n'a pas le même programme de lavage que le premier, un message pop-up s'affiche et la ligne du poste de charge n'est pas remplie: Poste de charge n°80 Options... Suivre la procédure suivante pour scanner les différents barcode: Scan du N° de panier. Règle définie selon RegEx. Scan de la référence (Programme de lavage). Règle selon RegEx. Le système contrôle que ce numéro existe dans la base de donnée Optima. Il renseigne automatiquement le programme et le mode d'équipement. Scan du Article et Lot. Règle définie selon RegEx. l'article et le lot sont ensemble dans un même barcode. Le RegEx et le Groupe index permet de les différencier. Insérer au clavier le Plateau. Pas de règle défini. Choisir dans le menu déroulant parmi les 3 options pour le nombre de balancelle (1/1, 1/2, 2/2). Par défaut 1/1 est sélectionné. Poste de charge n°82 Identique au poste de charge n°69 mais avec une colonne "Basket ID". Options... Suivre la procédure suivante pour scanner les différents barcode: Scan du Product ID (Produit). Règle définie selon RegEx. Le système contrôle que ce numéro existe dans la base de donnée Optima. Le premier Product ID défini le programme à utiliser. Chaque Product ID supplémentaire doivent avoir le même programme de lavage lié dans la base de donnée. Scan du Lot ID (Lot). Règle définie selon RegEx. Scan de la Quantity (Quantité). Doit être un numéro (1-9999). Scan du Basket ID (numéro de panier). Règle définie selon RegEx. Répéter les opérations de 1 à 4. Jusqu'à un maximum de 12 Product ID. Si un Product ID n'a pas le même programme de lavage que les précédents, un message pop-up s'affiche: Si le Product ID n'existe pas dans la base de donnée Optima: Si le champs attendu ne correspond pas au RegEx: Si on presse sur "Load" et que le numéro de lot est vide: Si on presse sur "Load" et que le champs quantité est vide: Si on presse sur "Load" et que l'option "Checking maximum number of parts" est cochée. Un message pop-up apparait si la quantité total insérée (en prenant en compte chaque ligne) est plus grande que le paramètre "Maximum quantity": Si on presse sur "Load" et que l'option "Checking unique lot ID" est cochée. Un message pop-up apparait si un numéro de lot n'est pas unique: Trucs et astuces Rappel des fonctionnalités peu connues de QuickView Affichage du MTO sur les rapports de suivi Le MTO (Metal turn over) indique combien de fois le bain a subi une régénération complète du métal contenu dans celui-ci. Un bain de Nickel chimique contient un certain nombre de grammes de nickel par litre de bain (par exemple 6 g/L). Tout au long de son existence, ce nickel est déposé sur les pièces étant traitées. Un analyseur sur lequel des pompes doseuses sont connectées permettent d'ajouter du nickel dans le bain pour maintenir une concentration constante. La durée de vie du bain est mesurée à l'aide du MTO. Le fournisseur du bain définit un MTO maximum pour décider de sa fin de vie et de son remplacement. Pour ajouter un compteur de MTO dans QuickView, il faut afficher le navigateur d'équipements puis cliquer à droite sur la position désirée. Un menu popup permet d'ajouter un compteur de MTO: Pour ajouter un compteur MTO, il faut activer la case à cocher M.T.O. et indiquer le numéro de pompe dans la liste des pompes doseuses utilisée pour régénérer le Nickel. Pour afficher le compteur, cliquez à droite sur la position de la machine dans laquelle vous avez ajouté le compteur. Le compteur s'affiche: Fonction Description Volume du bain Indique le volume du bain en litres Concentration Indique la concentration en métal du bain. Concentration régénération Indique la concentration en métal de la solution de régénération Poids spécifique Poids spécifique du métal. Ceci est utilisé lorsque le MTO est calculé par rapport à la surface passée dans le bain et à l'épaisseur définie au poste de charge. Total consommé (régénération) Poids total consommé par la pompe doseuse. Total consommé (surface) Si aucun pompe doseuse n'est définie alors la consommation est calculée par rapport à la surface passée selon la formule : surface des pièces * épaisseur * poids spécifique = total consommé. Rajout manuel Valeur ajoutée manuellement pour ajuster la concentration après analyse. MTO Valeur actuelle du MTO Pour faire apparaître cette valeur de MTO sur les rapports de suivi, il faut ajouter une I/O sur la position. Ceci est réalisé dans le navigateur d'équipement ou directement dans le fichier I/O.ini Il faut ensuite définir cette I/O dans les données à enregistrer dans la base de données. Ceci ce fait dans la section [Database] du fichier IO.ini: Voila, le rapport contiendra la valeur du MTO du bain à la sortie de la charge. Demande d'un outillage au poste de charge Lorsque l'on charge des pièces en vrac dans une machine, celles-ci doivent être placées dans un tonneau ou un vibreur. Ces tonneaux ou vibreurs n'ont pas tous les mêmes caractéristiques, par exemple la grandeur des trous des tonneaux ou la charge maximum d'un vibreur. Lors du chargement des pièces, il faut qu'un outillage (tonneau ou vibreur) soit amené au poste de charge mais il faut que le bon outillage soit utilisé. Pour résoudre ce problème, dans la bibliothèque d'articles, il est possible d'associer des outillages utilisables à chaque article. Dans la liste de gauche, tous les types d'outillage disponibles sont affichés. Il faut sélectionner les outillages pouvant être utilisés par l'article et les transférer dans la liste de droite qui correspond aux outillages autorisés. Le transfert entre les 2 listes se fait à l'aide des boutons situés entre ces 2 listes. Pour que la liste des outillages disponibles puisse être remplie, il faut qu'un type d'outillage soit attribué à chaque outillage. Ceci se fait dans la bibliothèque d'outillages. Pour tous les articles utilisés dans la machine, il faut leur attribué les outillages autorisés. Pour pouvoir appeler un outillage, il faut activer cette fonction dans la boîte de [Settings] dans l'onglet [Poste de charge]: Lorsque cette case est cochée, le bouton permettant d'appeler un outillage s'affiche sur le poste de charge: Pour que ce nouveau bouton soit fonctionnel, il faut tout d'abord sélectionner l'article que l'on désire charger dans la machine. Une fois que cet article est défini alors il est possible de cliquer sur le bouton [Outillage] pour afficher les positions contenant les outillages qui peuvent être utilisés pour cet article. La liste est établie par rapport aux charges se trouvant dans le groupe associé au poste de charge (groupe correspondant à la gare de charge). Si aucun groupe n'est défini, alors les positions ayant la colonne [Jig] définie avec la valeur "Yes" dans la définition de la machine seront utilisées. Toutes les charges présentes dans le groupe étant vides ou terminées et ayant un outillage autorisé seront ajoutées à la liste. En sélectionnant l'outillage désiré puis en cliquant sur le bouton [OK], le système ira chercher la barre et le ramènera au poste de charge. Si une barre est déjà sur le poste de charge, alors celle-ci sera tout d'abord envoyée en gare avant de retourner la barre désirée. Les redresseurs de polarisation et d'amorçage Sur les cuves de nickel chimique, il est fréquent de voir le redresseur de polarisation de la cuve utilisé également comme redresseur d'amorçage. Dans une telle configuration, il n'est pas possible d'utiliser ce type de redresseur comme les autres redresseurs de la machine. Pour permettre ce mode de fonctionnement, il ne faut pas associer le redresseur à la position dans la définition machine. Les cases [Recti] et [Rectf] doivent rester vides. Il ne faut également pas définir le redresseur dans la liste des redresseurs du fichier VKServer.ini mais le redresseur fait qu'en même partie de la structure du databank utilisé pour la commande des redresseurs (PLCRECTIFIER). Les redresseurs de polarisation doivent rester enclenchés tant que la température du bain est supérieure à une certaine température. Une consigne de tension doit être donnée au redresseur pour polariser la cuve pour éviter que celle-ci se plaque avec du nickel. Lorsque le courant généré par le redresseur dépasse une certaine consigne, cela indique que la cuve doit être strippée au plus vite et ne doit plus être utilisée en production. Exemple de configuration Définition du databank des redresseurs: ;DB Rectifier [DataBank50] Device=1 Channel=400 Regi=0 Regf=76 RegType=Struct(Word=2,Real=5)11; Définition d'un databank interne utilisé pour stocker les consignes des redresseurs de polarisation: ;DB Alarm rectifier ;Reg0,Bit0 = Alarme courant max ;Reg1 = Consigne alarme courant max mode actuel ;Reg2 = Consigne alarme courant max mode polarisation ;Reg3 = Consigne alarme courant max mode amorçage [DataBank51] Device=0 Regi=0 Regf=23 RegType=Struct(Word=1,Real=3)6; Retain=1 Définition d'un script effectuant le contrôle du courant max des redresseurs de polarisation: //******************************************************** //* Génération d'alarmes sur redresseurs de polarisation * //******************************************************** T:=TimerCreate(2000); fin:=false; repeat if t.timerFinish then begin { Position A21 Nickel Chimique } if bit(50,21,0) then { le redresseur est-il en marche ? } begin if not bit(50,21,8) then { le redresseur est-il en mode polarisation ? } begin if bit(51,0,8) then { le mode a changé } begin if plcr(51,1)<>plcR(51,2) then plcr(51,1,plcr(51,2)); { récupère la bonne consigne } bit(51,0,8,false); end; if plcr(51,1)<>plcr(51,2) then plcr(51,2,plcr(51,1)); { la consigne a changée alors enregistre la } end else begin if not bit(51,0,8) then { le mode a changé } begin if plcr(51,1)<>plcR(51,3) then plcr(51,1,plcr(51,3)); { récupère la bonne consigne } bit(51,0,8,true); end; if plcr(51,1)<>plcr(51,3) then plcr(51,3,plcr(51,1)); { la consigne a changée alors enregistre la } end; bit(51,0,0,plcr(50,25)>plcr(51,1)); { alarme si courant > alarme max } end else bit(51,0,0,false); { reset alarme } t.timerRestart; end; until fin; Ce script devra être défini comme "Auto start" dans le VKServer.ini [Script] 1=C:\VK-WinQV\Projets\44 - Emtech\A44004 - Verbrugge\SimulationA05.sct 2=C:\VK-WinQV\Projets\44 - Emtech\A44004 - Verbrugge\SimulationA07.sct 3=C:\VK-WinQV\Projets\44 - Emtech\A44004 - Verbrugge\Rectifiers.sct Des I/O (mode de fonctionnement et consigne de tension) devront être définies pour chaque redresseur de polarisation: ;Pos.A21-Nickel Chimique ;========== 200=21,Pompe En/Hors,B,W,31,21,0 201=21,Chauffage En/Hors,B,W,31,21,10 202=21,Remplissage Auto/Hors,B,W,31,21,16 203=21,Ouvrir couvercle,B,W,31,21,26 204=21,Ouvrir aspiration,B,W,31,21,28 205=21,Etat couvercle ouvert,B,RC,32,21,26 206=21,Etat couvercle fermé,B,RC,32,21,27 207=21,Mode amorçage,B,WP,50,21,8 208=21,Consigne tension,F,WP,50,24,$ffff,0,10 Le mode d'amorçage est défini dans les commandes d'équipements: Dans l'exemple ci-dessus, le redresseur est activé en mode "Amorçage" pendant 2 minutes. La tension d'amorçage est de 2.4 volts. Après 2 minutes, le mode passe à nouveau en mode "Polarisation" et la consigne de tension retourne à 1.3 volts. Il faut également définir une alarme de dépolarisation de la cuve: Sauvegarde des courbes de température Les courbes de température, conductivité, etc.. sont sauvegardées normalement dans des fichiers. Chaque courbe est sauvegardée dans un fichier ayant l'extension ".rec". Ces fichiers se trouvent dans les répertoires Report/Année/Mois/Jours/n.rec. Le n correspond au numéro de l'enregistreur que vous pouvez trouver dans le fichier Recorder.ini: Il faut être prudent lors de la définition des l'enregistreurs. Il faut définir correctement chaque enregistreur pour ne pas encombrer les fichiers de données inutiles. Par exemple, l'enregistrement des températures ne devrait se faire que toutes les minutes voir plus car ces données ne changent pas souvent. Deux types d'enregistrement sont possibles: Realtime data: utilisé par les graphiques sélectionnables dans le menu popup d'une cuve. Sampling rate correspondant au temps (en secondes) entre chaque point. Horiz. axis width: correspond à la grandeur de l'axe du temps du graphique et Retain (sec) correspond au temps de rétention des données en mémoire. Ces valeurs ne doivent pas dépasser quelques heures pour ne pas saturer la mémoire du PC.  Recording: utilisé pour sauvegarder les données dans les fichiers. Deadband (val) et deadband (sec) sont utilisés pour indiquer la zone morte qui doit être utilisée pour déclencher l'enregistrement. Dans l'exemple ci-dessus, si le système détecte un changement de valeur plus grand que 0.5 pendant une durée de 3 secondes, la valeur sera enregistrée. En plus, l'enregistrement sera effectué toutes les 60 secondes même si le deadband n'est pas atteint. Chaque poste client génère ses propre fichiers d'enregistrement. Si vous avez plusieurs postes client, il faut activer l'enregistrement sur un seul poste. A la place de sauvegarder les valeurs dans des fichiers, il est possible de les sauvegarder dans la base de données de reporting. Pour cela, il faut activer le mot clef VKWinQV.ini[Database]StoreChartInDatabase=1 (ce mot clef est activé par défaut). Il est possible de demander au serveur de sauvegarder les données dans la base de données. Pour cela, il faut activer la case suivante: Lorsque la sauvegarde est réalisée par le serveur, il faut décocher la case DoSaveRecorder des clients. Utilisation du service VKSMSMessaging Le programme VKSMSMessaging permet l'envoi de messages par SMS, Email ou Office365. Le programme peut fonctionner en tant que service ou sous forme d'une application normal. Pour lancer le programme en tant qu'application normal, il faut lancer la ligne de commande et passer le paramètre suivant :  -GUI.  Vous pouvez également créer un raccourcis sur le programme et ajouter le paramètre  dans les propriétés du raccourcis. Pour installer le service, il faut passer par la ligne de commande et ajouter le paramètre -INSTALL. De même pour désinstaller le service, il faut passer le paramètre -UNINSTALL. L'application fonctionne par la souscription à un topic MQTT. Lorsque ce topic reçoit un message, il est retransmit à un numéro de téléphone puis effacé. Le mode application GUI Lorsque l'application est lancée sous forme GUI, le programme démarre sous forme minimisée. L'icône suivante est affichée sur la barre des tÔches Pour afficher la page principale de l'application cliquer sur l'icône. La page s'affichera au centre de l'écran. Cette page principale permet de configurer les différents services. L'onglet "SMS" Cet onglet est utilisé pour configurer la fonction SMS.  L'envoi d'SMS est réalisé par une connexion chez un fournisseur d'accès.  Les fournisseurs suivants sont supportés: Twilio https://www.twilio.com/docs/sms/api Sinch https://developers.sinch.com/docs/sms/api-reference/ SMS Global https://www.smsglobal.com/us/rest-api/ SMS.to  https://developers.sms.to/#intro Vonage https://developer.vonage.com/en/api/sms Clickatell https://docs.clickatell.com/channels/one-api/one-api-reference/ Vous devez vous abonner à l'un de ces fournisseurs pour pouvoir utiliser le service. Une fois abonné, vous obtenez un numéro de compte ainsi qu'un clef secrète permettant la connexion au service. Par exemple chez Sinch, les données de connexion se trouvent ici: Le champ "Message From" est le nom affiché comme expéditeur sur votre téléphone. Certains fournisseurs ne permettent pas de changer le nom de l'expéditeur. Sinch lui le permet. Le champ "Recipient" indique le numéro de téléphone du destinataire. Pour la plupart des fournisseurs, le numéro de téléphone doit commencer par l'indicateur international + suivi du numéro du pays. Les noms du destinataire ainsi que le numéro de téléphone peuvent être envoyés dans les données du token depuis l'application VKQuickView. Le champ message correspond au message qui sera envoyé au téléphone. Le message peut être composé de mot clef permettant de remplacer ces mots clef par les données en provenance de QuickView. Les mots clefs sont encadrés par des caractères %. Les mots clef suivants sont possibles: Mots clef Description %Subject% Sujet du message %Machine% Nom ou numéro de la machine %DateTime" Date et heure du message d'alarme %Type% Type du message d'alarme %Group% Groupe du message d'alarme %Message%  Message de l'alarme %Number% Numéro de l'alarme Pour effectuer un test de message, remplissez les champs de test et cliquez sur le bouton [Test]. Le message sera envoyé selon le contenu du champ "Message" et des champs "Test". Activation du service dans QuickView L'activation du service se fait grace à la commande Edition|Messagerie. L'image suivante s'affiche: Il est nécessaire de définir les classes d'alarme devant être transmises. Les statistiques avec la base de données de suivi Lorsqu'une base de données de suivi est utilisée, il est possible de générer des statistiques avec les données récoltées. Les statistiques sont atteignables à l'aide des menus suivants: Rapports de suivi Statistiques de production Historique des mouvements des robots Historique des alarmes et messages Statistiques d'utilisation des pompes doseuses MTBF et MTTR Courbes des redresseurs Rapports de suivi Par défaut, les charges passées durant le mois en cours sont affichées. Le graphique affiche le nombre de charges passées par jour. Il est possible de naviguer entre le total de charges passées sans tenir compte de l'état des charges terminées (jaune) ou le total des charges bonnes (vertes) et le total des charges pas bonnes (rouges). Ce choix est sélectionnée à l'aide des 2 premières icônes en dessus du graphique. Le centre de l'écran affiche le rapport sélectionné (avec ou sans les commandes d'équipements). La case à cocher "affichage des commandes d'équipements" permet de choisir entre 2 types de rapport : ReportFPL.frf ou ReportFPL_CMD.frf (pour les machines de type FPL) et ReportFCL.frf et ReportFCL_CMD.frf (pour les machines de type FCL). L'icône Imprimante permet d'afficher le graphique dans le centre de l'écran pour permettre son impression. La liste de gauche affiche les charges du jour sélectionné. Il est possible de sélectionner le jour soit en le sélectionnant dans le calendrier ou soit en cliquant sur la colonne correspondante dans le graphique. L'onglet "Recherche" donne l'accès à la recherche: L'onglet "Export" donne l'accès aux fonctions d'exportation: Le répertoire d'exportation affiché est également utilisé pour exporter les rapports lorsqu'une charge est déposée sur un poste de décharge. Les exportations sont faites à plat si la case à cocher "Structure de fichiers: années/mois/jours n'est pas cochée. Dans le cas contraire, les exportations sont faites dans la structure de fichiers années/mois/jours. Si les répertoires n'existent pas, ils sont créés automatiquement.  Si votre système a été configuré pour permettre l'introduction de mesures, lorsque vous cliquez avec le bouton droit de la souris sur une charge dans la liste, une fenêtre permettant l'introduction de mesures est affichée: Statistiques de production Le type de statistiques  est sélectionnable à l'aide du combobox situé tout à gauche du menu. Les types suivants sont possibles: Références chargées Articles chargés Contrôles en sortie Productivité journalière Occupation des positions Les références chargées Pour chaque barre chargée, une ligne est affichée.  Articles chargés Tous les articles chargés sont afficher dans cette table. Il peut y avoir plusieurs lignes (une par article) par charge. Contrôles en sortie Si l'option du contrôle en sortie a été configurée, vous pouvez afficher le résultat de ces contrôles dans cette table. Pour pouvez afficher le rapport correspondant à une ligne en double-cliquant sur la ligne. Productivité journalière Occupation des positions L'occupation est calculé avec les enregistrements "Prise/Dépose" des robots dans les positions de la machine.   Historique des mouvements des robots Deux onglets permet soit d'afficher la liste des mouvements des robots dans une table (table des mouvements) ou soit un diagramme des mouvement effectués pendant la période de recherche. Table des mouvements Diagramme des mouvements Historique des alarmes et messages Il est possible d'afficher 4 types de tableau: Alarmes et Messages Alarmes seulement Messages seulement Alarmes prioritaires Alarmes et messages La liste des alarmes et des messages est affichée en mélangeant chronologiquement les évènements. Il est possible d'afficher toutes les alarmes d'un même type ou d'un même groupe ou d'un même message en double-cliquant sur la colonne désirée.  Dans l'exemple ci-dessus, l'utilisateur a double-cliqué sue le groupe "Robot 3". Pour revenir en arrière, double-cliquer sur le titre de la colonne en jaune. Alarmes seulement La liste ne contient que des alarmes. Messages seulement La liste ne contient que des messages. Alarmes prioritaires Lorsque ce type de statistique est choisi, une icône supplémentaire s'affiche dans l'entête. En cliquant sur cette icône, vous pouvez choisir les types et groupes d'alarmes désirés. Vous pouvez également choisir que les alarmes avec une priorité plus grande que 0. Cette liste est la même qu'utilisée lors du calcul du MTBF et MTTR.  Cette liste tient compte des arrêts d'urgence. Lorsqu'une alarme d'arrêt d'urgence est activée, toutes les alarmes situés entre le début de l'arrêt d'urgence et la fin de celle-ci sont éliminées. De plus, lorsqu'une alarme sur un robot intervient, toutes les autres alarmes du même robot sont inhibées pendant la durée de la première alarme car certaines fois des alarmes sont générées à cause de la première alarme et elles sont pas significatives pour le calcul du MTBF.  Statistique d'utilisation des pompes doseuses Sur cette page, il est possible d'afficher 3 types de liste: Le dosage manuel: L'utilisateur à sélectionné une quantité à ajouter sur la page des pompes doseuses. Le dosage automatique: Les quantités envoyées automatiquement par les pompes doseuses lorsque la consigne de dosage est atteinte. Le makeup: quantités envoyées par des fonctions de makeup (montage manuel d'un bain). MTBF et MTTR MTBF (temps moyen entre les défaillances) Le temps moyen entre les défaillances (MTBF) est le temps moyen entre les défaillances de production qui peuvent être réparées. Il mesure la fiabilité et la disponibilité d'un appareil ou d'un bien. Plus la valeur du MTBF est élevée, plus le système est fiable. L'objectif est d'obtenir un MTBF aussi élevé que possible, de l'ordre de plusieurs centaines ou milliers d'heures. Exemple de calcul de la MTBF Voici l'équation qui permet de calculer le MTBF : MTBF = durée totale de fonctionnement / nombre de défaillances Imaginez qu'une ligne de production fonctionne 130 heures par semaine avec 4 pannes. Les deux premières durent 2 heures chacune et les deux autres 3 heures chacune. Durée totale de travail : 130 heures Nombre de défaillances : 4 Interruptions Durée totale de l'échec : 2(2 heures) + 2(3 heures) = 10 heures (130 - 10) / 4 = 30 MTBF = 30 MTTF (temps moyen de défaillance) Le temps moyen de défaillance (MTTF) est le temps moyen avant la défaillance d'un appareil ou d'un bien non réparable. Il mesure la durée d'utilisation fiable d'un appareil ou d'un bien avant qu'il ne tombe complètement en panne et prédit le moment où les opérateurs doivent s'attendre à remplacer l'appareil ou à effectuer des diagnostics réguliers. Il est synonyme de durée de vie des appareils. Il est évident que plus le MTTF est long, moins l'entreprise doit dépenser pour remplacer l'appareil ou le bien en question. Exemple de calcul du MTTF Voici l'équation qui permet de calculer le MTTF : MTTF = durée de vie totale des appareils ou des biens / nombre d'appareils ou de biens Imaginez qu'une chaîne de production compte au total trois appareils du même type. Le premier appareil est tombé en panne à 5 200 heures, le deuxième à 4 200 heures et le troisième à 5 600 heures. Durée de vie totale des appareils : 5,200 + 4,200 + 5,600 = 15,000 Nombre d'appareils : 3 15,000 / 3 = 500 MTTF = 500 heures Cela signifie que cet appareil a une durée de vie moyenne de 5 000 heures. GrÔce à cette mesure, les entreprises peuvent déterminer si cette marque d'appareil ou d'équipement convient à leur production ou si elles doivent opter pour une solution plus durable et plus performante. Période de fonctionnement La période de fonctionnement est calculé avec les évènements Programme AUTO/STOP de la machine. Le MTBF est calculé uniquement lorsque le mode programme est sur AUTO. Toutes les alarmes (de la liste des types et groupes d'alarme) intervenues pendant cette période sont prise en compte. La disponibilité de la machine est calculé comme suit: MTBF/(MTBF+MTTR)*100. Il ne faut pas choisir plus de 100 jours entre les dates de début et de fin.   Courbes des redresseurs Les positions d'inspection Dans l'application, il est possible de définir des positions d'inspection. Une position d'inspection est une position où l'on envoie une charge pour être inspectée. Les positions d'inspection sont définies dans le fichier IO.ini dans la section [Inspection]. Exemple: ;***************************************************** ;Inspection ;num=Name,position,inspectionposition,type,I/O,Programme ; Num = Numéro d'inspection 1..10 ; Name = nom de l'inspection ; Position = position à laquelle démarre l'inspection ; InspectionPosition = position d'inspection ; Type = 0:Quality 1:Hanging dummy part 2:Wettability ; I/O = Inspection I/O Index 0: Statut Index 1: Commande ; Programme = numéro de la séquence à utiliser pour retourner en gare ;***************************************************** [Inspection] 1=Cuivre,58,44,1,60,90 2=Palladium,72,82,0,61,91 # Paramètre type Description 1 Numéro de l'inspection Integer de 1 à 10 2 Nom de l'inspection String[64] Ce nom est affiché sur le poste de charge 3 Position Integer Numéro de la position de la machine qui permet de démarrer une inspection 4 InspectionPosition Integer Numéro de la position vers laquelle la charge est envoyée pour une inspection. La position doit avoir le champ flag = 0 dans la définition de la machine. 5 Type Integer Type d'inspection 0: Inspection de qualité 1: accroche d'une pièce témoin 2: inspection sur le robot 6 I/O Integer I/O indiquant le début de la table automate. La table est composée de 2 registres: le premier correspond au statut de la position d'inspection et le deuxième est utilisé comme commande de VK.   Le registre de statut est composé des bits : Bit Fonction 0 Position d'inspection prête. 1 Inspection terminée. Continuer la séquence 2 Inspection terminée. Retour en gare Le registre de commande est composé des bits: Bit Fonction 0 Ajout pièce témoin 1 Inspection terminée, continue la séquence 2 Inspection terminée, retour en gare 3 En attente d'une réponse de l'opérateur 8 Erreur poste d'inspection non disponible 9 Erreur d'inspection, rack not OK 10 Erreur d'inspection, timeout réponse Il ne faut pas oublier de définir les bits 8 , 9 et 10 dans des alarmes pour que celles-ci soient enregistrées sur le rapport. 7 Programme Integer Numéro de programme à utiliser pour retourner la charge en gare Il faut définir dans les séquences, les positions sur lesquelles les charges doivent subir une inspection. Pour cela, le mot clef "ShowMeasurementType" doit être activé: En activant cette case à cocher, une colonne supplémentaire s'affiche dans l'éditeur de séquences: Cette colonne permet de sélectionner une mesure (voir chapitre mesures) ou une inspection. Lors de l'enregistrement de la séquence,  si une inspection est définie dans une position, le système vérifie que la position est bien définie dans la liste des positions d'inspection avant d'enregistrer la séquence. Si une inspection est définie dans une position ne faisant pas partie de la liste des positions d'inspection, l'enregistrement n'est pas possible et un message d'erreur vous en informera. En général, les inspections sont réalisées sur quelques charges mais pas sur toutes. Pour définir sur quelles charges les inspections sont réalisées, le poste de charge n°52 permet cette sélection: Pour que cet onglet s'affiche, il faut l'activer dans la configuration du poste de charge: La zone "Information de production" n'est pas disponible lorsque cette option est activée. Lorsqu'une charge est dans une position d'inspection (type 0 ou 1), une fois le temps d'immersion terminé, le système vérifie si la charge a été définie pour être inspectée. Si c'est le cas, le système vérifie si la position d'inspection est libre et que le registre de statut bit(0) est activé (prêt à recevoir une charge). Si c'est le cas, la charge est transférée à la position d'inspection et le bit 0 du registre de commande est activé s'il n'y a pas de demande d'accrochage dans le cas contraire, le bit 1 est activé. Les autres bits sont effacés. Lorsqu'une charge est en position d'inspection et que le bit 0 du registre de statut est activé, le système vérifie le bit 1 ou le bit 2 soit activé. Si le bit 1 est activé alors la charge continue son traitement comme défini dans la séquence. Si le bit 2 est activé, le programme de retour en gare est assigné à la charge. Pour le type=2, le fonctionnement est différent. Lorsqu'une charge sort de la position d'inspection, le système vérifie si la charge a été définie pour être inspectée. Si c'est le cas, le système active le bit 3 du registre de commande et est en attente d'une réponse de l'opérateur pendant 30 secondes. Pendant ces 30 secondes, l'opérateur doit indiquer si la charge continue sa séquence ou si celle-ci doit retourner en gare. Si aucune réponse n'est donnée pendant ces 30 secondes, la charge est considérée comme en erreur et est redéposée dans la position. Le programme de retour en gare est assigné à la charge. Lecture de codes à barres au travers de MQTT Pour permettre le partage d'un lecteur de codes à barres par plusieurs PC, il est possible d'utiliser un topic MQTT comme entrée de données. Pour cela, il faut modifier la configuration du lecteur dans VKWinQV.ini comme suit: [Barcode] ReaderType=MQTT Comport=10 suffix=13 Baudrate=9600 Databits=8 Stopbits=2 Parity=Even Encoding=14 bell=7 Dans la définition ci-dessus, ReaderType=MQTT indique que le lecteur est lié à un topic MQTT. La définition Comport n'est dans ce cas pas utilisé. Le mot clef ReaderType peut contenir les valeurs suivantes: MQTT, COM, ETHERNET La section [MQTT] doit être définie pour que l'utilisation de MQTT soit utilisable par le client.   Les positions contrôlées par AlarmStop Dans l'application, il est possible de définir des positions sur lesquelles un contrôle d'alarme est effectué. Le contrôle d'alarme permet d'interrompre une séquence dans certaines situations et de renvoyer la charge en gare. Les positions d'alarmstop sont définies dans le fichier IO.ini dans la section [AlarmStop]. Exemple: ;***************************************************** ;AlarmStop ;num=alarmstopPosition,I/O,Programme ; Num = Numéro d'alarmStop 1..10 ; Position = position à laquelle se déroule l'alarmStop ; I/O = AlarmStop I/O Index 0: Statut Index 1: Commande ; Programme = numéro de la séquence à utiliser pour retourner en gare ;***************************************************** [AlarmStop] 1=12,44,90 2=34,45,91 # Paramètre type Description 1 Numéro de l'AlarmStop Integer de 1 à 10 2 Position Integer Numéro de la position de la machine sur laquelle le contrôle est effectué 3 I/O Integer I/O indiquant le début de la table automate. La table est composée de 2 registres: le premier correspond au statut de la position d'alarmstop et le deuxième est utilisé comme commande de VK.   Le registre de statut est composé des bits : Bit Fonction 0 Alarme active. Le programme doit retourner en gare 1 2 Le registre de commande n'est pour l'instant pas utilisé   Il ne faut pas oublier de définir le bit du registre de statut dans des alarmes pour que celle-ci soit enregistrée sur le rapport. 4 Programme Integer Numéro de programme à utiliser pour retourner la charge en gare A la fin du temps de traitement, le système contrôle si le bit 0 du registre de statut est activé. Dans ce cas, le programme indiqué dans le paramètre 4 est assigné à la charge sinon le programme continue normalement sa séquence. Les profils de courant Sur le poste de charge (ou dans la définition des gammes de la bibliothèque de pièces), il est possible de définir un profil de courant sur les blocs de traitement utilisant un redresseur. Ce profil de courant correspond à un chiffre de 1 à 32. Ce numéro fait référence à une liste de profils définis par l'utilisateur. Les profils de courant sont paramétrables en sélectionnant la commande suivante: Edition | Profils de courant. Plusieurs types de profil sont définissables. Le type est défini lors de la mise en service de la machine. Il peut être modifié par la suite mais il faut impérativement redémarrer l'application (Client et Serveur). Attention: tous les types de redresseur ne supportent pas certains type de profil. Il faut se renseigner chez VK pour savoir si vos redresseurs supportent le type de profil désiré. Le type de profil se défini dans Définition des paramètres système | Redresseurs: Sur les applications récentes, NewCurrentForm doit être sélectionné. Les types de step possibles doivent être activés pour fonctionner. Encore une fois, tous les types de step ne fonctionnent pas avec tous les redresseurs. Se renseigner avant de modifier. Type de profil "NewCurrentForm" Dans ce type de profil, chaque profil comportent 6 steps. Les steps se déroulent les uns après les autres. Lorsque le temps prévu dans le step est atteint, le step suivant est sélectionné et les données sont envoyées au redresseur. Un step vide indique la fin de la liste des steps possibles. Un type de régulation est configuré sur chaque profil: régulation tension ou régulation courant. Tous les steps du profil utiliseront le même type de régulation. En cliquant sur la cellule "Regul", la boîte de sélection du type de régulation s'affiche: Vous pouvez choisir entre Régulation Courant avec une tension max paramétrable (0=Tension max  du redresseur) ou Régulation Tension avec un courant max paramétrable (0=Courant max du redresseur). En cliquant sur les cellules des steps, la boîte de configuration du step s'affiche: Les types de step sont sélectionnables sur les onglets en haut de la boîte. Ces types sont configurés dans la définition des paramètres système (voir ci-dessus). Pour chaque type de step des paramètres doivent être configurés. Pour les steps de type DC, les paramètres suivants sont définissables: T1 Description Immersion Le step durera pendant le temps d'immersion calculé sur le poste de charge. Le champ "Valeur" n'est pas utilisé dans ce cas. Secondes Le step durera pendant le temps défini dans le champ "Valeur". % immersion Le step durera pendant le pourcentage du temps d'immersion indiqué dans le champ "Valeur". V1 Description % consigne Le champ "Valeur" indique un pourcentage de la consigne envoyée au redresseur. Par exemple pour une surface de 10dm2 avec une densité de 2.5A/dm2 soit une consigne total de 25A, avec une valeur de 15 dans ce champ une consigne de 3.75A sera envoyée au redresseur. Valeur Le champ "Valeur" indique la consigne à envoyer au redresseur. Une valeur négative dans le champ "Valeur" indique au système d'effectuer une inversion de polarité. Il faut bien sûr que le redresseur soit équipé d'un inverseur de polarité pour que cela fonctionne. La case à cocher "Rampe" indique au système qu'une rampe sera effectuée pendant la durée du step. La valeur de départ de la rampe correspond à la valeur de consigne du dernier step. La valeur d'arrivée correspond à la valeur V1. Les consignes sont calculées toutes les 5 secondes. Il faut donc que le temps T1 soit assez grand pour permettre plusieurs étapes. Pour les steps de type "Alterné", les paramètres suivants sont définissables: Les consignes V1 et V2 sont appliquées alternativement pendant toute la durée du Step T1. T2 correspond à la durée de V1 et T3 correspond à la durée de V2. Type de profil "StepCoating" Ce type de profil est utilisé dans des cas bien précis et ne sont pas applicables à tous les types de redresseur.  Dans ce type de profil, 20 steps peuvent être définis par profil. Type de profil "LargeCurrentForm" Ce type de profil fonctionne de la même manière que "NewCurrentForm" sauf que le nombre de steps total est limité à 25 steps. Une petite subtilité dans le type de régulation Tension, il est possible de spécifier une valeur QMax pour terminer le profil de courant. Pour que cela fonctionne, le poste de charge doit être configurer pour permettre la définition d'un QMax. Type de profil "LargeCurrentFormRegulation" Ce type fonctionne comme le type précédent sauf que le type de régulation est défini pour chaque step. Il est possible donc de mélanger des steps en régulation de courant et des steps en régulation de tension.  Il est également possible de définir de quelle manière le profil s'arrête à l'aide du combo box situé en haut de la page à droite: