Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: ELECTRONIQUE : Une réalisation pilotée par PANORAMIC Lun 16 Sep 2024 - 10:54 | |
| Bonjour à tous ! Je partage une réalisation (software + hardware) qui n’aura pas grand intérêt pour la communauté. Il s’agit d’une aide au diagnostic et dépannage d’un automate existant. Cette aide est composée : 1) D’une partie informatique dont voici le code source : - Code:
-
' Programme de test des circuits CIBUS ' Marc - Juillet 2024 ' Ecrit en langage Panoramic 0.9.29.i9
dim dossier$, info$, trame$, receptionTrame$, poidsFaible%, poidsFort%, octet1$, octet2$, octet3$, octet4$, poids%, i% dim brasseurOnOFF%, broyeurOnOff%, pompeOnOff%, vanneRetourOnOff%, vanneDepart1OnOff%, vanneDepart2OnOff%, vanneDepart3OnOff%, vanneDepart4OnOff%, vanneDistribOnOff% dim produit1_On_Off%, produit2_On_Off%, produit3_On_Off%, produit4_On_Off%, produit5_On_Off%, produit6_On_Off%, produit7_On_Off%, produit8_On_Off%, produit9_On_Off% dim numVanneDistribution%, delai%, null%, quartet_H%, quartet_L%, poidsOnOff% dim portCom%, parity%, sPortCom$, sBaudRate$, sParity$, sDataBit$, sStopBit$
label afficheFenetreSerial, fermerFenetreSerial, ouvrirLiaisonSerie label choixPortCom, choixBaudrate, choixNbBits, choixParity, choixBitstop, enregistrer
data "Broyeur","Brasseur","Pompe","Vanne retour","Vanne départ 1","Vanne départ 2","Vanne départ 3","Vanne départ 4","Vanne distrib." data "Produit 1","Produit 2","produit 3","Produit 4","Produit 5","Produit 6","Produit 7","Produit 8","Produit 9","Poids cuve"
dossier$ = dir_current$ + chr$(92)
creerInterfaceUtilisateur()
chargerFichierConfiguration()
end ' ------------------------------------------------------------------------------ sub boucleDeFonctionnement()
while 1 = 1 ' détection appui sur le bouton "Broyeur" if clicked(10) = 1 appelBroyeur() end_if ' détection appui sur le bouton "Brasseur" if clicked(20) = 1 appelBrasseur() end_if
' détection appui sur le bouton "Pompe" if clicked(30) = 1 appelPompe() end_if
' détection appui sur le bouton "Vanne retour" if clicked(40) = 1 appelVanneRetour() end_if ' détection appui sur le bouton "Vanne départ 1" if clicked(50) = 1 appelVanneDepart1() end_if ' détection appui sur le bouton "Vanne départ 2" if clicked(60) = 1 appelVanneDepart2() end_if ' détection appui sur le bouton "Vanne départ 3" if clicked(70) = 1 appelVanneDepart3() end_if ' détection appui sur le bouton "Vanne départ 4" if clicked(80) = 1 appelVanneDepart4() end_if
' détection appui sur le bouton "Vanne distribution" if clicked(90) = 1 appelVanneDistribution() end_if
' détection appui sur le bouton "Produit 1" if clicked(100) = 1 appelProduit1() end_if
' détection appui sur le bouton "Produit 2" if clicked(110) = 1 appelProduit2() end_if
' détection appui sur le bouton "Produit 3" if clicked(120) = 1 appelProduit3() end_if
' détection appui sur le bouton "Produit 4" if clicked(130) = 1 appelProduit4() end_if
' détection appui sur le bouton "Produit 5" if clicked(140) = 1 appelProduit5() end_if
' détection appui sur le bouton "Produit 6" if clicked(150) = 1 appelProduit6() end_if
' détection appui sur le bouton "Produit 7" if clicked(160) = 1 appelProduit7() end_if
' détection appui sur le bouton "Produit 8" if clicked(170) = 1 appelProduit8() end_if
' détection appui sur le bouton "Produit 9" if clicked(180) = 1 appelProduit9() end_if ' détection appui sur le bouton "Poids cuve" if clicked(190) = 1 appelPoidsCuve() end_if
' détection appui sur le bouton "Stop" if clicked(4) = 1 arretMoteurs() end_if ' détection appui sur le bouton "Vanne +" if mouse_left_down(6) = 1 appelVannePlus() end_if
' détection appui sur le bouton "Vanne -" if mouse_left_down(7) = 1 appelVanneMoins() end_if ' détection appui sur "On/Off" liaison série if clicked(297) = 1 arretMoteurs() caption 298,"Non connecté" active 296 on_click 297,ouvrirLiaisonSerie exit_while end_if lecturePoids() ' pause pour ralentir la boucle de fonctionnement (ne pas affoler le processeur) pause 50
end_while end_sub ' ------------------------------------------------------------------------------ sub purgeClicked() dim_local i%, null% for i% = 10 to 190 step 10 null% = clicked(i%) next i% null% = clicked(297) null% = clicked(4) null% = clicked(6) null% = clicked(7) end_sub ' ------------------------------------------------------------------------------ sub creerInterfaceUtilisateur() dim_local n%, x%, y%, nom$
' dimensions de la fenetre width 0,width(0) - width_client(0) + 1000 height 0,height(0) - height_client(0) + 800 ' titre de la fenêtre caption 0,"Test des circuits CIBUS" ' centrer la fenetre à l'écran top 0,(screen_y - height(0)) / 2 left 0,(screen_x - width(0)) / 2
' créer PICTURE fond de fenêtre pour pouvoir dessiner dessus picture 1 width 1,width_client(0) height 1,height_client(0) color 1,0,181,220 ' créer menu déroulant main_menu 295 sub_menu 296 parent 296,295 caption 296,"Port COM" on_click 296,afficheFenetreSerial
sub_menu 297 parent 297,295 caption 297,"On/Off" hide 297 sub_menu 298 parent 298,295 caption 298,"Non connecté" ' créer buffer image image 3 ' créer bouton STOP picture 4 width 4,58 height 4,58 top 4,600 left 4,850 color 4,0,181,220 2d_target_is 4 2d_pen_color 204,30,30 2d_line 17,0,40,0 2d_line 40,0,57,17 2d_line 57,17,57,40 2d_line 57,40,40,57 2d_line 40,57,17,57 2d_line 17,57,0,40 2d_line 0,40,0,17 2d_line 0,17,17,0 2d_flood 29,29,204,30,30 2d_pen_color 255,255,255 2d_line 18,2,39,2 2d_line 39,2,55,18 2d_line 55,18,55,39 2d_line 55,39,39,55 2d_line 39,55,18,55 2d_line 18,55,2,39 2d_line 2,39,2,18 2d_line 2,18,18,2 2d_flood 29,29,255,255,255 2d_pen_color 204,30,30 2d_line 19,4,38,4 2d_line 38,4,53,19 2d_line 53,19,53,38 2d_line 53,38,38,53 2d_line 38,53,19,53 2d_line 19,53,4,38 2d_line 4,38,4,19 2d_line 4,19,19,4 2d_flood 29,29,204,30,30 print_target_is 4 font_color 4,255,255,255 font_name 4,"Bahnschrift Light Condensed" font_size 4,16 font_bold 4 print_locate 10,16 print "STOP" cursor_point 4 hint 4,"Arrêt d'urgence" ' créer les boutons x% = 40 y% = 40 for n% = 10 to 190 step 10 read nom$
button_picture_target_is_object button_picture n% top n%,y% left n%,x% width n%,160 height n%,45 button_picture_target_is_picture width n%,156 height n%,41 cursor_point n%
create_hide ' habillage bouton "OFF" picture n%+1 width n%+1,156 height n%+1,41 color n%+1,240,240,240 2d_target_is n%+1 2d_fill_color 240,240,240 font_name n%+1,"Arial" font_size n%+1,14 print_target_is n%+1 print_locate centrer%(nom$),9 print nom$ 2d_image_copy 3,0,0,155,41 2d_target_is n% 2d_image_paste 3,0,0 ' habillage bouton "ON" picture n%+2 width n%+2,156 height n%+2,41 color n%+2,0,240,0 2d_target_is n%+2 2d_fill_color 0,240,0 font_name n%+2,"Arial" font_size n%+2,14 print_target_is n%+2 print_locate centrer%(nom$),9 print nom$ create_show y% = y% + 60 if n% = 90 x% = 800 y% = 40 end_if next n% ' positionner le bouton "Vannes distrib." top 90,590 ' positionner le bouton "Poids cuve" left 190,40 top 190,695
' créer afficheur 1er octet machines creerAfficheurBinaire(200,340,42) ' créer afficheur 2ème octet machines creerAfficheurBinaire(220,340,592) ' affichage n° de vanne distrib. panel 5 top 5,590 left 5,210 width 5,45 height 5,45 caption 5,"0" font_name 5,"Arial" font_size 5,14 ' flèche vers le haut picture 6 width 6,30 height 6,22 top 6,590 left 6,255 color 6,240,240,240 2d_target_is 6 2d_pen_color 255,255,255 2d_line 0,0,29,0 2d_pen_color 160,160,160 2d_line 29,0,29,22 2d_pen_color 50,50,50 2d_point 14,7 2d_line 13,8,16,8 2d_line 12,9,17,9 2d_line 11,10,18,10 2d_line 10,11,19,11 2d_line 9,12,20,12 2d_line 8,13,21,13 2d_line 7,14,22,14 2d_line 6,15,23,15 cursor_point 6 ' flèche vers le bas picture 7 width 7,30 height 7,22 top 7,613 left 7,255 color 7,240,240,240 2d_target_is 7 2d_pen_color 160,160,160 2d_line 29,0,29,22 2d_line 0,21,30,21 2d_pen_color 50,50,50 2d_point 14,14 2d_line 13,13,16,13 2d_line 12,12,17,12 2d_line 11,11,18,11 2d_line 10,10,19,10 2d_line 9,9,20,9 2d_line 8,8,21,8 2d_line 7,7,22,7 2d_line 6,6,23,6 cursor_point 7 ' créer afficheur valeur décimale du poids panel 270 top 270,697 left 270,210 height 270,40 width 270,90 font_name 270,"Arial" font_size 270,14 caption 270,"- - - - kg" ' créer afficheur binaire poids creerAfficheurBinaire(240,310,697) creerAfficheurBinaire(260,640,697) dessinerSerigraphie()
creerFenetreSerial()
open_dialog 290 save_dialog 291 serial 293 end_sub ' ------------------------------------------------------------------------------ sub creerAfficheurBinaire(n%,x%,y%) dim_local i%, x1%
panel n% left n%,x% top n%,y% width n%,320 height n%,40 font_size n%,14 command_target_is n%
for i% = 1 to 8 panel n% + i% width n% + i%,40 height n% + i%,40 left n% + i%,x1% x1% = x1% + 40 caption n% + i%,8-i% next i% command_target_is 0 end_sub ' ------------------------------------------------------------------------------ sub dessinerSerigraphie() 2d_target_is 1 2d_pen_color 0,0,0 2d_pen_width 1 ' ligne Broyeur 2d_line 200,62,340,62 ' ligne Brasseur 2d_line 200,122,400,122 2d_line 400,122,400,82 ' ligne Pompe 2d_line 200,182,440,182 2d_line 440,182,440,82 ' ligne Vanne retour 2d_line 200,242,480,242 2d_line 480,242,480,82 ' accolade Demultiplexer 4 to 16 2d_line 509,83,521,95 2d_line 521,95,571,95 2d_line 571,95,579,103 2d_line 579,103,587,95 2d_line 587,95,638,95 2d_line 638,95,651,82 2d_fill_color 0,181,220 print_target_is 1 font_name 1,"Arial" font_size 1,12 print_locate 533,112 print "Demultiplexer" print_locate 556,132 print "4 to 16" print_locate 442,19 print "Octet machines" print_locate 412,569 print "Octet Vannes distribution" print_locate 216,569 print "Vanne n°" print_locate 234,674 print "Poids" print_locate 420,674 print "Octet poids fort" print_locate 737,674 print "Octet poids faible" font_size 1,10 print_locate 213,750 print "12 bits + sign" print_locate 310,750 print "Alarme" print_locate 360,750 print "NC" print_locate 400,750 print "NC" print_locate 465,750 print "Bit de signe : 0=positif" font_name 1,"Consolas" font_size 1,14 font_color 1,255,255,0 : print_locate 530,160 : print "0 0 0 0" : font_color 1,0,0,0 : print_locate 650,160 : print "(0)" font_color 1,255,255,0 : print_locate 530,183 : print "0 0 0 1" : font_color 1,0,0,0 : print_locate 650,183 : print "(1)" font_color 1,255,255,0 : print_locate 530,206 : print "0 0 1 0" : font_color 1,0,0,0 : print_locate 650,206 : print "(2)" font_color 1,255,255,0 : print_locate 530,229 : print "0 0 1 1" : font_color 1,0,0,0 : print_locate 650,229 : print "(3)" font_color 1,255,255,0 : print_locate 530,252 : print "0 1 0 0" : font_color 1,0,0,0 : print_locate 650,252 : print "(4)" font_color 1,255,255,0 : print_locate 530,275 : print "0 1 0 1" : font_color 1,0,0,0 : print_locate 650,275 : print "(5)" font_color 1,255,255,0 : print_locate 530,298 : print "0 1 1 0" : font_color 1,0,0,0 : print_locate 650,298 : print "(6)" font_color 1,255,255,0 : print_locate 530,321 : print "0 1 1 1" : font_color 1,0,0,0 : print_locate 650,321 : print "(7)" font_color 1,255,255,0 : print_locate 530,344 : print "1 0 0 0" : font_color 1,0,0,0 : print_locate 650,344 : print "(8)" font_color 1,255,255,0 : print_locate 530,367 : print "1 0 0 1" : font_color 1,0,0,0 : print_locate 650,367 : print "(9)" font_color 1,255,255,0 : print_locate 530,390 : print "1 0 1 0" : font_color 1,0,0,0 : print_locate 650,390 : print "(10)" font_color 1,255,255,0 : print_locate 530,413 : print "1 0 1 1" : font_color 1,0,0,0 : print_locate 650,413 : print "(11)" font_color 1,255,255,0 : print_locate 530,436 : print "1 1 0 0" : font_color 1,0,0,0 : print_locate 650,436 : print "(12)" font_color 1,255,255,0 : print_locate 530,459 : print "1 1 0 1" : font_color 1,0,0,0 : print_locate 650,459 : print "(13)" font_color 1,255,255,0 : print_locate 530,482 : print "1 1 1 0" : font_color 1,0,0,0 : print_locate 650,482 : print "(14)" font_color 1,255,255,0 : print_locate 530,505 : print "1 1 1 1" : font_color 1,0,0,0 : print_locate 650,505 : print "(15)" ' lignes : sections départs vers produits 2d_line 682,194,696,194 2d_line 682,217,696,217 2d_line 682,240,696,240 2d_line 682,263,696,263 2d_line 682,286,696,286 2d_line 682,309,696,309 2d_line 682,332,696,332 2d_line 682,355,696,355 2d_line 682,378,696,378 ' lignes : sections arrivées aux produits 2d_line 785,62,799,62 2d_line 785,122,799,122 2d_line 785,182,799,182 2d_line 785,242,799,242 2d_line 785,302,799,302 2d_line 785,362,799,362 2d_line 785,422,799,422 2d_line 785,482,799,482 2d_line 785,542,799,542 ' lignes obliques Produits 2d_line 696,194,785,62 2d_line 696,217,785,122 2d_line 696,240,785,182 2d_line 696,263,785,242 2d_line 696,286,785,302 2d_line 696,309,785,362 2d_line 696,332,785,422 2d_line 696,355,785,482 2d_line 696,378,785,542 ' Lignes : sections vannes départ 2d_line 200,302,280,302 2d_line 200,362,280,362 2d_line 200,422,280,422 2d_line 200,482,280,482 ' lignes : sections arrivées 2d_line 440,400,520,400 2d_line 440,423,520,423 2d_line 440,446,520,446 2d_line 440,469,520,469 ' lignes obliques 2d_line 280,302,440,400 2d_line 280,362,440,423 2d_line 280,422,440,446 2d_line 280,482,440,469 ' ligne vannes distribution 2d_line 287,613,338,613 ' lignes octets poids 2d_line 256,737,256,747 2d_line 329,737,329,747 2d_line 369,737,369,747 2d_line 409,737,409,747 2d_line 449,737,449,759 2d_line 449,759,463,759 ' lignes au dessus des octets poids 2d_line 420,671,526,671 2d_line 738,671,858,671 end_sub ' ------------------------------------------------------------------------------ fnc centrer%(a$) dim_local longueur%, offset% longueur% = text_width(a$,11) offset% = (156 - longueur% ) / 2 result offset% end_fnc
' ****************************************************************************** ' COMMANDE MOTEURS - COMMANDE MOTEURS - COMMANDE MOTEURS - COMMANDE MOTEURS - CO ' ------------------------------------------------------------------------------ sub appelBroyeur() if broyeurOnOff% = 0 broyeurOnOff% = 1 quartet_H% = quartet_H% + 128 2d_target_is 12 2d_image_copy 3,0,0,155,40 2d_target_is 10 2d_image_paste 3,0,0 else broyeurOnOff% = 0 quartet_H% = quartet_H% -128 2d_target_is 11 2d_image_copy 3,0,0,155,40 2d_target_is 10 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelBrasseur() if brasseurOnOff% = 0 brasseurOnOff% = 1 quartet_H% = quartet_H% + 64 2d_target_is 22 2d_image_copy 3,0,0,155,40 2d_target_is 20 2d_image_paste 3,0,0 else brasseurOnOff% = 0 quartet_H% = quartet_H% - 64 2d_target_is 21 2d_image_copy 3,0,0,155,40 2d_target_is 20 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelPompe() if pompeOnOff% = 0 pompeOnOff% = 1 quartet_H% = quartet_H% + 32 2d_target_is 32 2d_image_copy 3,0,0,155,40 2d_target_is 30 2d_image_paste 3,0,0 else pompeOnOff% = 0 quartet_H% = quartet_H% - 32 2d_target_is 31 2d_image_copy 3,0,0,155,40 2d_target_is 30 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelVanneRetour() if vanneRetourOnOff% = 0 vanneRetourOnOff% = 1 quartet_H% = quartet_H% + 16 2d_target_is 42 2d_image_copy 3,0,0,155,40 2d_target_is 40 2d_image_paste 3,0,0 else vanneRetourOnOff% = 0 quartet_H% = quartet_H% - 16 2d_target_is 41 2d_image_copy 3,0,0,155,40 2d_target_is 40 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelVanneDepart1() if vanneDepart1OnOff% = 0 vanneDepart1OnOff% = 1 eteindreBoutonPrecedent() quartet_L% = 10 2d_target_is 52 2d_image_copy 3,0,0,155,40 2d_target_is 50 2d_image_paste 3,0,0 else vanneDepart1OnOff% = 0 quartet_L% = 0 2d_target_is 51 2d_image_copy 3,0,0,155,40 2d_target_is 50 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelVanneDepart2() if vanneDepart2OnOff% = 0 vanneDepart2OnOff% = 1 eteindreBoutonPrecedent() quartet_L% = 11 2d_target_is 62 2d_image_copy 3,0,0,155,40 2d_target_is 60 2d_image_paste 3,0,0 else vanneDepart2OnOff% = 0 quartet_L% = 0 2d_target_is 61 2d_image_copy 3,0,0,155,40 2d_target_is 60 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelVanneDepart3() if vanneDepart3OnOff% = 0 vanneDepart3OnOff% = 1 eteindreBoutonPrecedent() quartet_L% = 12 2d_target_is 72 2d_image_copy 3,0,0,155,40 2d_target_is 70 2d_image_paste 3,0,0 else vanneDepart3OnOff% = 0 quartet_L% = 0 2d_target_is 71 2d_image_copy 3,0,0,155,40 2d_target_is 70 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelVanneDepart4() if vanneDepart4OnOff% = 0 vanneDepart4OnOff% = 1 eteindreBoutonPrecedent() quartet_L% = 13 2d_target_is 82 2d_image_copy 3,0,0,155,40 2d_target_is 80 2d_image_paste 3,0,0 else vanneDepart4OnOff% = 0 quartet_L% = 0 2d_target_is 81 2d_image_copy 3,0,0,155,40 2d_target_is 80 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelProduit1() if produit1_On_Off% = 0 produit1_On_Off% = 1 eteindreBoutonPrecedent() quartet_L% = 1 2d_target_is 102 2d_image_copy 3,0,0,155,40 2d_target_is 100 2d_image_paste 3,0,0 else produit1_On_Off% = 0 quartet_L% = 0 2d_target_is 101 2d_image_copy 3,0,0,155,40 2d_target_is 100 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelProduit2() if produit2_On_Off% = 0 produit2_On_Off% = 1 eteindreBoutonPrecedent() quartet_L% = 2 2d_target_is 112 2d_image_copy 3,0,0,155,40 2d_target_is 110 2d_image_paste 3,0,0 else produit2_On_Off% = 0 quartet_L% = 0 2d_target_is 111 2d_image_copy 3,0,0,155,40 2d_target_is 110 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelProduit3() if produit3_On_Off% = 0 produit3_On_Off% = 1 eteindreBoutonPrecedent() quartet_L% = 3 2d_target_is 122 2d_image_copy 3,0,0,155,40 2d_target_is 120 2d_image_paste 3,0,0 else produit3_On_Off% = 0 quartet_L% = 0 2d_target_is 121 2d_image_copy 3,0,0,155,40 2d_target_is 120 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelProduit4() if produit4_On_Off% = 0 produit4_On_Off% = 1 eteindreBoutonPrecedent() quartet_L% = 4 2d_target_is 132 2d_image_copy 3,0,0,155,40 2d_target_is 130 2d_image_paste 3,0,0 else produit4_On_Off% = 0 quartet_L% = 0 2d_target_is 131 2d_image_copy 3,0,0,155,40 2d_target_is 130 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelProduit5() if produit5_On_Off% = 0 produit5_On_Off% = 1 eteindreBoutonPrecedent() quartet_L% = 5 2d_target_is 142 2d_image_copy 3,0,0,155,40 2d_target_is 140 2d_image_paste 3,0,0 else produit5_On_Off% = 0 quartet_L% = 0 2d_target_is 141 2d_image_copy 3,0,0,155,40 2d_target_is 140 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelProduit6() if produit6_On_Off% = 0 produit6_On_Off% = 1 eteindreBoutonPrecedent() quartet_L% = 6 2d_target_is 152 2d_image_copy 3,0,0,155,40 2d_target_is 150 2d_image_paste 3,0,0 else produit6_On_Off% = 0 quartet_L% = 0 2d_target_is 151 2d_image_copy 3,0,0,155,40 2d_target_is 150 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelProduit7() if produit7_On_Off% = 0 produit7_On_Off% = 1 eteindreBoutonPrecedent() quartet_L% = 7 2d_target_is 162 2d_image_copy 3,0,0,155,40 2d_target_is 160 2d_image_paste 3,0,0 else produit7_On_Off% = 0 quartet_L% = 0 2d_target_is 161 2d_image_copy 3,0,0,155,40 2d_target_is 160 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelProduit8() if produit8_On_Off% = 0 produit8_On_Off% = 1 eteindreBoutonPrecedent() quartet_L% = 8 2d_target_is 172 2d_image_copy 3,0,0,155,40 2d_target_is 170 2d_image_paste 3,0,0 else produit8_On_Off% = 0 quartet_L% = 0 2d_target_is 171 2d_image_copy 3,0,0,155,40 2d_target_is 170 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub appelProduit9() if produit9_On_Off% = 0 produit9_On_Off% = 1 eteindreBoutonPrecedent() quartet_L% = 9 2d_target_is 182 2d_image_copy 3,0,0,155,40 2d_target_is 180 2d_image_paste 3,0,0 else produit9_On_Off% = 0 quartet_L% = 0 2d_target_is 181 2d_image_copy 3,0,0,155,40 2d_target_is 180 2d_image_paste 3,0,0 end_if afficherOctetMoteurs() end_sub ' ------------------------------------------------------------------------------ sub eteindreBoutonPrecedent() select quartet_L% case 1 produit1_On_Off% = 0 2d_target_is 101 2d_image_copy 3,0,0,155,40 2d_target_is 100 2d_image_paste 3,0,0 case 2 produit2_On_Off% = 0 2d_target_is 111 2d_image_copy 3,0,0,155,40 2d_target_is 110 2d_image_paste 3,0,0
case 3 produit3_On_Off% = 0 2d_target_is 121 2d_image_copy 3,0,0,155,40 2d_target_is 120 2d_image_paste 3,0,0
case 4 produit4_On_Off% = 0 2d_target_is 131 2d_image_copy 3,0,0,155,40 2d_target_is 130 2d_image_paste 3,0,0 case 5 produit5_On_Off% = 0 2d_target_is 141 2d_image_copy 3,0,0,155,40 2d_target_is 140 2d_image_paste 3,0,0 case 6 produit6_On_Off% = 0 2d_target_is 151 2d_image_copy 3,0,0,155,40 2d_target_is 150 2d_image_paste 3,0,0
case 7 produit7_On_Off% = 0 2d_target_is 161 2d_image_copy 3,0,0,155,40 2d_target_is 160 2d_image_paste 3,0,0
case 8 produit8_On_Off% = 0 2d_target_is 171 2d_image_copy 3,0,0,155,40 2d_target_is 170 2d_image_paste 3,0,0 case 9 produit9_On_Off% = 0 2d_target_is 181 2d_image_copy 3,0,0,155,40 2d_target_is 180 2d_image_paste 3,0,0
case 10 vanneDepart1OnOff% = 0 2d_target_is 51 2d_image_copy 3,0,0,155,40 2d_target_is 50 2d_image_paste 3,0,0
case 11 vanneDepart2OnOff% = 0 2d_target_is 61 2d_image_copy 3,0,0,155,40 2d_target_is 60 2d_image_paste 3,0,0
case 12 vanneDepart3OnOff% = 0 2d_target_is 71 2d_image_copy 3,0,0,155,40 2d_target_is 70 2d_image_paste 3,0,0
case 13 vanneDepart4OnOff% = 0 2d_target_is 81 2d_image_copy 3,0,0,155,40 2d_target_is 80 2d_image_paste 3,0,0 end_select end_sub ' ------------------------------------------------------------------------------ sub afficherOctetMoteurs() dim_local i%, bit%, octet$, n% inactive 0
n% = quartet_H% + quartet_L% ' décodage décimal en binaire octet$ = "" while n% > 0 if frac(n% / 2) = 0 octet$ = "0" + octet$ else octet$ = "1" + octet$ end_if n% = int(n% / 2) end_while
while len(octet$) < 8 octet$ = "0" + octet$ end_while
' affiche la valeur binaire de numVanneDistribution% for bit% = 0 to 7 if mid$(octet$,bit%+1,1) = "1" color 201+bit%,240,60,50 else color 201+bit%,240,240,240 end_if next bit%
transmettreTrameSerie()
active 0 end_sub
' ****************************************************************************** ' VANNES DISTRIBUTION - VANNES DISTRIBUTION - VANNES DISTRIBUTION - VANNES DISTR ' ------------------------------------------------------------------------------ sub appelVanneDistribution() if vanneDistribOnOff% = 0 vanneDistribOnOff% = 1 numVanneDistribution% = val(caption$(5)) 2d_target_is 92 2d_image_copy 3,0,0,155,40 2d_target_is 90 2d_image_paste 3,0,0 else vanneDistribOnOff% = 0 2d_target_is 91 2d_image_copy 3,0,0,155,40 2d_target_is 90 2d_image_paste 3,0,0 end_if affichageOctetVanneDistri() end_sub ' ------------------------------------------------------------------------------ sub appelVannePlus() if mouse_right_down(6) = 1 exit_sub end_if null% = mouse_left_up(6) numVanneDistribution% = val(caption$(5)) delai% = 450 while mouse_left_up(6) <> 1 if numVanneDistribution% < 255 numVanneDistribution% = numVanneDistribution% + 1 end_if caption 5,str$(numVanneDistribution%) pause delai% delai% = delai% - 1 if delai% < 447 delai% = 20 end_if end_while null% = mouse_left_up(6) null% = mouse_left_down(6) null% = mouse_right_up(6) null% = mouse_right_down(6) affichageOctetVanneDistri() end_sub ' ------------------------------------------------------------------------------ sub appelVanneMoins() if mouse_right_down(7) = 1 exit_sub end_if null% = mouse_left_up(7) numVanneDistribution% = val(caption$(5)) delai% = 450 while mouse_left_up(7) <> 1 if numVanneDistribution% > 0 numVanneDistribution% = numVanneDistribution% - 1 end_if caption 5,str$(numVanneDistribution%) pause delai% delai% = delai% - 1 if delai% < 447 delai% = 20 end_if end_while null% = mouse_left_up(7) null% = mouse_left_down(7) null% = mouse_right_up(7) null% = mouse_right_down(7) affichageOctetVanneDistri() end_sub ' ------------------------------------------------------------------------------ sub affichageOctetVanneDistri() dim_local i%, bit%, octet$, n%
inactive 0
if vanneDistribOnOff% = 0 for bit% = 0 to 7 color 221+bit%,240,240,240 next bit%
numVanneDistribution% = 0 transmettreTrameSerie() active 0 exit_sub end_if n% = numVanneDistribution% ' décodage décimal en binaire octet$ = "" while n% > 0 if frac(n% / 2) = 0 octet$ = "0" + octet$ else octet$ = "1" + octet$ end_if n% = int(n% / 2) end_while
while len(octet$) < 8 octet$ = "0" + octet$ end_while
' affiche la valeur binaire de numVanneDistribution% for bit% = 0 to 7 if mid$(octet$,bit%+1,1) = "1" color 221+bit%,240,60,50 else color 221+bit%,240,240,240 end_if next bit%
transmettreTrameSerie()
active 0 end_sub
' ****************************************************************************** ' POIDS POIDS POIDS POIDS POIDS POIDS POIDS POIDS POIDS POIDS POIDS POIDS POIDS ' ------------------------------------------------------------------------------ sub appelPoidsCuve() if poidsOnOff% = 0 poidsOnOff% = 1 2d_target_is 192 2d_image_copy 3,0,0,155,40 2d_target_is 190 2d_image_paste 3,0,0 else poidsOnOff% = 0 2d_target_is 191 2d_image_copy 3,0,0,155,40 2d_target_is 190 2d_image_paste 3,0,0 end_if end_sub ' ------------------------------------------------------------------------------ sub lecturePoids() ' !!! Les deux octets poids sont en logique inversée !!! dim_local octet$, n%, bit%
receptionTrame$ = serial_read$(293) if len(receptionTrame$) > 3 octet1$ = left$(receptionTrame$,1) if octet1$ = chr$(170) octet4$ = mid$(receptionTrame$,4,1) if octet4$ = chr$(187) octet2$ = mid$(receptionTrame$,2,1) poidsFaible% = asc(octet2$) octet3$ = mid$(receptionTrame$,3,1) poidsFort% = asc(octet3$)
' octet poids fort : décoder décimal en binaire n% = poidsFort% octet$ = "" while n% > 0 if frac(n% / 2) = 0 octet$ = "0" + octet$ else octet$ = "1" + octet$ end_if n% = int(n% / 2) end_while
while len(octet$) < 8 octet$ = "0" + octet$ end_while
' octet poids fort : afficher la valeur binaire for bit% = 0 to 7 if mid$(octet$,bit%+1,1) = "1" color 241+bit%,240,60,50 else color 241+bit%,240,240,240 end_if next bit%
' octet poids faible : décoder décimal en binaire n% = poidsFaible% octet$ = "" while n% > 0 if frac(n% / 2) = 0 octet$ = "0" + octet$ else octet$ = "1" + octet$ end_if n% = int(n% / 2) end_while
while len(octet$) < 8 octet$ = "0" + octet$ end_while
' octet poids faible : afficher la valeur binaire for bit% = 0 to 7 if mid$(octet$,bit%+1,1) = "1" color 261+bit%,240,60,50 else color 261+bit%,240,240,240 end_if next bit%
' détection coupure courant si tous les bits sont à 1 if poidsFort% > 254 message "Sécurité : attente mise sous tension !" end_if
' 0 kg = 01101111 11111111 : -1 kg = 01110000 00000000
' inversion des bits pour passer en logique positive poidsFaible% = 255 - poidsFaible% poidsFort% = 127 - poidsFort%
' 0 kg = 00010000 00000000 : -1 kg = 00001111 11111111 ' traitement si le poids est une valeur positive (bit 4 poids fort à 1) if poidsFort% > 15 poidsFort% = poidsFort% - 16 else :' si c'est une valeur négative poidsFort% = 15 - poidsFort% : ' inversion des 4 bits poids faibles de l'octet fort poidsFort% = poidsFort% * (-1) poidsFaible% = 255 - poidsFaible% :' inversion des 8 bits de l'octet faible poidsFaible% = poidsFaible% + 1 poidsFaible% = poidsFaible% * (-1) end_if ' afficher poids à l'écran poids% = (poidsFort% * 256) + poidsFaible% caption 270,str$(poids%) + " kg" end_if end_if end_if end_sub
' ****************************************************************************** ' PORT COM PORT COM PORT COM PORT COM PORT COM PORT COM PORT COM PORT COM PORT C ' ------------------------------------------------------------------------------ sub creerFenetreSerial() dim_local n% command_target_is 0
create_hide panel 300 height 300,300 width 300,290 top 300,5 left 300,5 create_show
command_target_is 300 ' picture fond du PANEL 70 picture 301 width 301,290 height 301,300 color 301,191,191,191 2d_target_is 301 2d_fill_off 2d_pen_color 112,112,112 2d_rectangle 0,0,290,300 ' bandeau haut du PANEL 2 picture 302 width 302,287 height 302,25 top 302,1 left 302,1 2d_target_is 302 2d_pen_color 0,0,60 2d_fill_color 0,0,60 2d_rectangle 10,9,13,16 2d_rectangle 9,10,14,15 2d_rectangle 8,11,15,14 2d_line 14,12,47,12 2d_line 18,11,20,11 2d_line 19,10,21,10 2d_line 20,9,23,9 2d_line 22,8,24,8 2d_line 23,7,26,7 2d_line 25,6,28,6 2d_rectangle 28,5,33,8 2d_rectangle 29,4,32,9 2d_line 23,13,25,13 2d_line 24,14,26,14 2d_line 25,15,28,15 2d_line 27,16,29,16 2d_line 28,17,31,17 2d_line 30,18,35,18 2d_rectangle 34,16,39,21 2d_line 42,8,42,17 2d_line 43,9,43,16 2d_line 44,10,44,15 2d_line 45,11,45,14 2d_pen_color 0,0,0 2d_fill_color 0,0,0 2d_fill_off print_target_is 302 print_locate 56,5 print "Configuration port COM"
' croix blanche sur fond rouge picture 303 width 303,45 height 303,24 left 303,244 top 303,1 color 303,232,17,35 2d_target_is 303 2d_pen_color 241,107,118 2d_line 18,7,27,16 2d_line 17,8,26,17 2d_line 17,15,26,6 2d_line 18,16,27,7 2d_pen_color 255,255,255 2d_line 17,7,27,17 2d_line 17,16,27,6 cursor_point 303 on_click 303,fermerFenetreSerial ' n° port COM combo 304 top 304,50 left 304,124 width 304,100 height 304,25 for n% = 1 to 255 item_add 304,"COM" + str$(n%) next n% on_change 304,choixPortCom ' vitesse en bauds combo 305 top 305,90 left 305,124 width 305,100 height 305,25 item_add 305,"110" item_add 305,"300" item_add 305,"600" item_add 305,"1200" item_add 305,"2400" item_add 305,"4800" item_add 305,"9600" item_add 305,"14400" item_add 305,"19200" item_add 305,"38400" item_add 305,"57600" item_add 305,"115200" on_change 305,choixBaudrate ' données : nombre bits combo 306 top 306,130 left 306,124 width 306,100 item_add 306,"5" item_add 306,"6" item_add 306,"7" item_add 306,"8" on_change 306,choixNbBits ' parité combo 307 top 307,170 left 307,124 width 307,100 item_add 307,"Aucune" item_add 307,"Impaire" item_add 307,"Paire" on_change 307,choixParity ' bits d'arrêt combo 308 top 308,210 left 308,124 width 308,100 item_add 308,"1" item_add 308,"1.5" item_add 308,"2" on_change 308,choixBitstop ' bouton "Définir par défaut" button 309 top 309,260 left 309,21 width 309,108 caption 309,"Set defaults" cursor_point 309 on_click 309,enregistrer
' bouton "OK" button 310 top 310,260 left 310,161 width 310,108 caption 310,"OK" cursor_point 310 on_click 310,ouvrirLiaisonSerie
' legendes print_target_is 301 print_locate 94,53 print "Port:" print_locate 67,93 print "Baud rate:" print_locate 71,133 print "Data bits:"
print_locate 86,173 print "Parity:" print_locate 72,213 print "Stop bits:" command_target_is 0 end_sub ' ------------------------------------------------------------------------------ afficheFenetreSerial: for i% = 10 to 190 step 10 inactive i% next i% show 300 return ' ------------------------------------------------------------------------------ choixPortCom: sPortCom$ = item_index$(304) return ' ------------------------------------------------------------------------------ choixBaudrate: sBaudRate$ = item_index$(305) return ' ------------------------------------------------------------------------------ choixNbBits: sDataBit$ = item_index$(306) return ' ------------------------------------------------------------------------------ choixParity: sParity$ = item_index$(307) return ' ------------------------------------------------------------------------------ choixBitstop: sStopBit$ = item_index$(308) return ' ------------------------------------------------------------------------------ fermerFenetreSerial: hide 300
for i% = 10 to 190 step 10 active i% next i% return ' ------------------------------------------------------------------------------ ouvrirLiaisonSerie: if sPortCom$ = "" info$ = "Veuillez configurer le port COM !" if message_warning_ok(info$) > 0 show 300 end_if return end_if
portCom% = val(mid$(sPortCom$,4,len(sPortCom$))) serial_close 293
caption 298,"Non connecté" active 296
if serial_port_exists(portCom%) = 0 hide 297 info$ = "Le port " + sPortCom$ + " n'est pas disponible !" + chr$(13) + chr$(13) info$ = info$ + "Vérifiez les connexions électriques ainsi que le numéro de port COM attribué." if message_error_ok(info$) < 2 return end_if end_if hide 300 if sParity$ = "Aucune" then parity% = 0 if sParity$ = "Impaire" then parity% = 1 if sParity$ = "Paire" then parity% = 2
serial_port 293,portCom% serial_baudrate 293,val(sBaudRate$) serial_databits 293,val(sDataBit$) serial_parity 293,parity% serial_stopbits 293,val(sStopBit$) serial_open 293
arretMoteurs() off_click 297 caption 298,"Connecté" inactive 296 show 297
for i% = 10 to 190 step 10 active i% next i% purgeClicked() boucleDeFonctionnement() return ' ------------------------------------------------------------------------------ enregistrer: file_open_write 293,dossier$ + "test_cibus.cfg" file_writeln 293,sPortCom$ file_writeln 293,sBaudRate$ file_writeln 293,sDataBit$ file_writeln 293,sParity$ file_writeln 293,sStopBit$ file_close 293 return ' ------------------------------------------------------------------------------ sub chargerFichierConfiguration() ' charger fichier configuration s'il existe if file_exists(dossier$ + "test_cibus.cfg") = 1 file_open_read 292,dossier$ + "test_cibus.cfg" sPortCom$ = file_readln$(292) sBaudRate$ = file_readln$(292) sDataBit$ = file_readln$(292) sParity$ = file_readln$(292) sStopBit$ = file_readln$(292) file_close 292 trigger_click 310 else ' valeurs par défaut sPortCom$ = "" sBaudRate$ = "9600" sDataBit$ = "8" sParity$ = "Aucune" sStopBit$ ="1" end_if
text 304,sPortCom$ text 305,sBaudRate$ text 306,sDataBit$ text 307,sParity$ text 308,sStopBit$ end_sub ' ------------------------------------------------------------------------------
' ****************************************************************************** ' STOP - STOP - STOP - STOP - STOP - STOP - STOP - STOP - STOP - STOP - STOP - S ' ------------------------------------------------------------------------------ sub arretMoteurs() inactive 0 quartet_H% = 0 eteindreBoutonPrecedent() quartet_L% = 0
numVanneDistribution% = 0 broyeurOnOff% = 0 2d_target_is 11 2d_image_copy 3,0,0,155,40 2d_target_is 10 2d_image_paste 3,0,0
brasseurOnOff% = 0 2d_target_is 21 2d_image_copy 3,0,0,155,40 2d_target_is 20 2d_image_paste 3,0,0
pompeOnOff% = 0 2d_target_is 31 2d_image_copy 3,0,0,155,40 2d_target_is 30 2d_image_paste 3,0,0
vanneRetourOnOff% = 0 2d_target_is 41 2d_image_copy 3,0,0,155,40 2d_target_is 40 2d_image_paste 3,0,0 afficherOctetMoteurs()
vanneDistribOnOff% = 0 2d_target_is 91 2d_image_copy 3,0,0,155,40 2d_target_is 90 2d_image_paste 3,0,0
affichageOctetVanneDistri() active 0 end_sub
' ------------------------------------------------------------------------------ sub transmettreTrameSerie() trame$ = "" trame$ = trame$ + chr$(quartet_H% + quartet_L%) trame$ = trame$ + chr$(numVanneDistribution%) trame$ = trame$ + chr$(255) trame$ = trame$ + chr$(255) serial_write 293,trame$ end_sub
Ce programme permet de contrôler toute la partie électronique/électrotechnique existante avec la possibilité d’outrepasser les possibilités techniques de l’automate d’origine. 2) D’une partie électronique qui se substitue à l'installation existante. Elle permet de vérifier le bon fonctionnement des ordres envoyés par l’automate. Très succinctement : Cette partie électronique simule toute l’installation électronique/électrotechnique commandée par l’automate. La communication est bidirectionnelle : un retour d’information revient vers l’automate. Chaque élément (moteurs, vannes …) est représenté par une LED. Les informations de défaut sont simulées par des interrupteurs. L’information des jauges de contraintes (mesure du poids) est simulée par un Arduino NANO programmé en compteur 12 bits + retenue. La partie électronique est composée de deux modules reliés par une nappe de 40 conducteurs : - Une carte interface ordinateur/machines réalisée avec un Arduino UNO. - Une carte multifonction d’affichage de l’état des machines et de simulation de comptage du poids (réalisé par l’Arduino NANO). Pour finir, si vous souhaitez tester le code-source ci-dessus, c’est tout à fait possible. Il suffit de sélectionner le port COM n°1 dans le menu « Port COM ». Pour information, le PORT COM 1, bien qu’il aboutisse dans le vide, est actif dans toutes les versions de Windows. Le couple PANORAMIC / ELECTRONIQUE fonctionne à merveille ! | |
|