Compilation grafcet et langage C

sTreb Messages postés 2 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 7 avril 2009 - 2 avril 2009 à 20:32
sTreb Messages postés 2 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 7 avril 2009 - 7 avril 2009 à 17:10
Bonjour à tous et à toute.
Tous d'abord je ne sais pas si ce que j'ai expliquer est bien la compilation. Soyer indulgent, merci.

Tous d'abord je vais vous expliquer mon projet.
Je souhaite controler plusieurs appareil electrique avec des tempo (de plusieurs moi).
J'ai commander 2 carte relais que j'ai brancher (les deux) sur un PC (a l'aide d'une carte controleur pour rajouter un port parallele).
Je souhaitais programmer en grafcet car je pensais que sa allait etre plus facile qu'en C(je ne dispose d'aucune connaissance en C, mais j'ai réaliser qq grafcet quand jétais étudiant sur automgen).
J'ai brancher les deux carte sur le PC. Il y a un petit soft (fournis avec les carte) qui permet de controler la carte(le petit prog marche parfaitement mais ne fonctionne qu'avec une seule carte).

Ensuite j'utilise un petit logiciel pour creer les grafcet (je peux vous le fournir par email si toutefois vous en avez besoin pour m'aider)
Il y a un programme deja ecrit sur le logciel qui permet de controler une carte (mais il est ecrit en C). Alors j'ai essyer de faire un mixte entre ce programme et la parti grafcet afin de pouvoir attribuer les sortie correspondante (SB0, SB1 etc).
Mais voila ca ne fonctionne pas je n'y comprend rien j'ai lu pas mal de chose qui parle de programmation sur port parrallele mais aucun sujet sur le controle d'une carte relais par un grafcet.

Alors dans un premier temmps je vous ai copier le programme en C qui est intégrer au log et dans un deuxieme temps il y a un fichier qui est intégrer au grafcet (c'est ici que je dois rentrer des valeurs et variable afin de controler les ports) jai suivi les explication qui sont écrite dedans mais ce ne fonctionne toujours pas. Je vous donne les programme sans aucune modification de ma part.
Voici les adresse des cartes
1ere carte (port imprimante (LPT1), je vous écrit les phrases qui sont indiquer dans gestionnaire des peripherique)
Plage d'E/S : 0378 - 037F
Plage d'E/S : 0778 - 077B
DMA : 03

2e carte (port de communication (COM1)
Plage d'E/S : 03F8 - 03FF
IRQ : 04
Ma principale préocupation est d'assigner SB0, SB1 etc a chaque sortie sur les cartes.

Je vous REMERCIE d'avance.
FRED

_______________________________________________________________________________

/*
GRAFCET.IO

Fichier d'interfa?age par d?faut

Bruno Dima, Marc Manka
9 septembre 1995

Ce fichier est pr?vu pour une syst?me ?quip? d'une carte interface
num?rique "Le Grafcet" ? l'adresse de base par d?faut 300 Hex, et d'une
carte interface analogique "Le Grafcet" ? l'adresse indiqu'e par la macro
ANALOG.

Pour configurer les interfaces, utiliser les d?finitions suivantes qui
doivent ?tre ?crites dans l'?diteur C au dessus de :
#include "grafcet.io"

#define MAJUSCULE // variables en majuscules pour les touches (entr?es)
#define i0_i31 // d?finition des variables d'entr?e i0 .. i31
#define NUM 0x3xx // d?finition de l'adresse de la carte num?rique

#define ANALOG 0x3xx // d?finition de la carte analogique et de son adresse
#define GAIN0 xxx // d?finition du gain de chaque entr?e
#define GAIN1 xxx // xxx : 1, 10, 100, 1000 (1 par d?faut)
#define GAIN2 xxx
#define GAIN3 xxx
*/


#include // op?rateurs usuels en fran'ais :
// logiques : ET, OU, PAS, EGAL, DIFF
// comptage : UP, DN,
// conditionnel : SI, SINON

#define fait done

bool boolinp[32]; // d?claration du tampon d'interfa?age pour les 32
// entr?es de la carte num?rique
bool boolout[16]; // d?claration du tampon d'interfa?age pour les 16
// sorties de la carte num?rique

// -------- D?claration des variables --------

#ifdef ANALOG // Carte analogique -----------

int intinp[4]; // d?claration du tampon d'interfa?age pour les 4
// entr?es de la carte analogique
int intout[2]; // d?claration du tampon d'interfa?age pour les 2
// sorties de la carte analogique
inti(ea0, 0);
inti(ea1, 1);
inti(ea2, 2);
inti(ea3, 3);

into(SA0, 0);
into(SA1, 1);

#endif // ------- ifdef ANALOG

int C1; // d?claration des 8 compteurs C1 .. C8
int C2;
int C3;
int C4;
int C5;
int C6;
int C7;
int C8;

boolo(SB0, 0); // d?claration des sorties S0 ? S15
boolo(SB1, 1);
boolo(SB2, 2);
boolo(SB3, 3);
boolo(SB4, 4);
boolo(SB5, 5);
boolo(SB6, 6);
boolo(SB7, 7);
boolo(SB8, 8);
boolo(SB9, 9);
boolo(SB10, 10);
boolo(SB11, 11);
boolo(SB12, 12);
boolo(SB13, 13);
boolo(SB14, 14);
boolo(SB15, 15);

#ifdef i0_i31 // ---- variables pour les entr?es
booli(i0, 0); // d?claration des entr?es i0 ? i31
booli(i1, 1);
booli(i2, 2);
booli(i3, 3);
booli(i4, 4);
booli(i5, 5);
booli(i6, 6);
booli(i7, 7);
booli(i8, 8);
booli(i9, 9);
booli(i10, 10);
booli(i11, 11);
booli(i12, 12);
booli(i13, 13);
booli(i14, 14);
booli(i15, 15);
booli(i16, 16);
booli(i17, 17);
booli(i18, 18);
booli(i19, 19);
booli(i20, 20);
booli(i21, 21);
booli(i22, 22);
booli(i23, 23);
booli(i24, 24);
booli(i25, 25);
booli(i26, 26);
booli(i27, 27);
booli(i28, 28);
booli(i29, 29);
booli(i30, 30);
booli(i31, 31);
#endif // ---- ifdef i0_i31

#ifndef MAJUSCULE // ---- les touches sont des lettres minuscules
booli(a, 1); // d?claration des touches du clavier
booli(b, 2); // les touches sont li?es aux entr?es
booli(c, 3); // ? partir de l'entr?e 1
booli(d, 4);
booli(e, 5);
booli(f, 6);
booli(g, 7);
booli(h, 8);
booli(i, 9);
booli(j, 10);
booli(k, 11);
booli(l, 12);
booli(m, 13);
booli(n, 14);
booli(o, 15);
booli(p, 16);
booli(q, 17);
booli(r, 18);
booli(s, 19);
booli(t, 20);
booli(u, 21);
booli(v, 22);
booli(w, 23);
booli(x, 24);
booli(y, 25);
booli(z, 26);
#endif // ---- ifndef MAJUSCULE

#ifdef MAJUSCULE // ---- les touches sont des lettres majuscules
booli(A, 1); // d?claration des touches du clavier
booli(B, 2); // les touches sont li?es aux entr?es
booli(C, 3); // ? partir de l'entr?e 1
booli(D, 4);
booli(E, 5);
booli(F, 6);
booli(G, 7);
booli(H, 8);
booli(I, 9);
booli(J, 10);
booli(K, 11);
booli(L, 12);
booli(M, 13);
booli(N, 14);
booli(O, 15);
booli(P, 16);
booli(Q, 17);
booli(R, 18);
booli(S, 19);
booli(T, 20);
booli(U, 21);
booli(V, 22);
booli(W, 23);
booli(X, 24);
booli(Y, 25);
booli(Z, 26);
#endif // ---- ifdef MAJUSCULE

// ------- configuration des cartes interfaces -------

#ifndef NUM
#define NUM 0x300
#endif

#ifndef GAIN0
#define GAIN0 1
#endif

#ifndef GAIN1
#define GAIN1 1
#endif

#ifndef GAIN2
#define GAIN2 1
#endif

#ifndef GAIN3
#define GAIN3 1
#endif

void config(void)
{
// configuration d'une carte num?rique ? l'adresse 0x300
// et activation des ports d'entr?es et se sortie
cfg_8booli(NUM + 0x00, 0); // entr?es 0 .. 7
cfg_8booli(NUM + 0x01, 8); // 8 .. 15
cfg_8booli(NUM + 0x02, 16); // 16 .. 23
cfg_8booli(NUM + 0x0A, 24); // 24 .. 31
cfg_8boolo(NUM + 0x08, 0); // sorties 0 .. 7
cfg_8boolo(NUM + 0x09, 8); // sorties 8 .. 15

#ifdef ANALOG
cfg_GF7_inti(ANALOG, 0, GAIN0, 0); // 4 entrees analogiques
cfg_GF7_inti(ANALOG, 1, GAIN1, 1);
cfg_GF7_inti(ANALOG, 2, GAIN2, 2);
cfg_GF7_inti(ANALOG, 3, GAIN3, 3);
cfg_GF7_into(ANALOG, 0, 0); // 2 sorties analogiques
cfg_GF7_into(ANALOG, 1, 1);
#endif
}


______________________________________________________________________________________________________________________________________________________________

Source GRAFCET ver. 2.1
test carte interface grafcet port //
_LINE_ 2
_COL_ 2
_PAGE_ 1
_WINDOWS_ 0
_EQUA_

_CODE_

/*
Programme : Test de la carte interface grafcet
Auteur : Bruno Dima
Date : 3-12-98
*/

#define ADR_OUT 0x378
#define ADR_IN 0x379
#define ADR_CTRL 0x37A

bool boolout[12]; // tampon des sorties booleennes pour actions continues
boolo(SB0, 0); boolo(SB1, 1); boolo(SB2, 2); boolo(SB3, 3);
boolo(SB4, 4); boolo(SB5, 5); boolo(SB6, 6); boolo(SB7, 7);
boolo(SB8, 8); boolo(SB9, 9); boolo(SB10, 10); boolo(SB11, 11);
bool a, b, c, d, e, f, g, h; // variables des 8 entr?es

unsigned en, en_prec, // entr?es num?riques
sn, sn_prec, // sorties num?riques
sc; // sorties de contr?le
int tst1, b0, fin; // test automatique et sortie du programme

char *msg = "Pour utiliser la touche <Test> (test automatique),\n"
"relier les sorties aux entr?es correspondantes :\n"
"SN0..7 avec EN0..7; \n";

void aff_msg(int x1, int y1, int couleur, char *msg)
{
moveto(x1, y1);
color(couleur);
puts(msg);
}

void read_carte()
{
outp(ADR_CTRL, sc & 7); // selection des 4 msb (bit 3 ? 0)
en = inp(ADR_IN) & 0xf0;
outp(ADR_CTRL, sc | 8); // selection des 4 lsb (bit 3 ? 1)
en += inp(ADR_IN) >> 4;

a = (bool) (en & 0x01);
b = (bool) (en & 0x02);
c = (bool) (en & 0x04);
d = (bool) (en & 0x08);
e = (bool) (en & 0x10);
f = (bool) (en & 0x20);
g = (bool) (en & 0x40);
h = (bool) (en & 0x80);
}

void write_carte()
{
sn = (int) SB0 + // sorties 0 a 7
((int) SB1 << 1) +
((int) SB2 << 2) +
((int) SB3 << 3) +
((int) SB4 << 4) +
((int) SB5 << 5) +
((int) SB6 << 6) +
((int) SB7 << 7);
outp(ADR_OUT, sn);

sc = (int) SB8 + // sorties de controle
((int) SB9 << 1) +
((int) SB10 << 2);

outp(ADR_CTRL, sc);
}

void boutons(void)
{
// sorties SN0 .. SN7
if (sqr_button(b0, 20, 170, 47, 190, SB0 ? 0xE0 : 0x70, "0"))
SB0 = !SB0;
if (sqr_button(b0, 50, 170, 77, 190, SB1 ? 0xE0 : 0x70, "1"))
SB1 = !SB1;
if (sqr_button(b0, 80, 170, 107, 190, SB2 ? 0xE0 : 0x70, "2"))
SB2 = !SB2;
if (sqr_button(b0, 110, 170, 137, 190, SB3 ? 0xE0 : 0x70, "3"))
SB3 = !SB3;
if (sqr_button(b0, 140, 170, 167, 190, SB4 ? 0xE0 : 0x70, "4"))
SB4 = !SB4;
if (sqr_button(b0, 170, 170, 197, 190, SB5 ? 0xE0 : 0x70, "5"))
SB5 = !SB5;
if (sqr_button(b0, 200, 170, 227, 190, SB6 ? 0xE0 : 0x70, "6"))
SB6 = !SB6;
if (sqr_button(b0, 230, 170, 257, 190, SB7 ? 0xE0 : 0x70, "7"))
SB7 = !SB7;

// 3 sorties de controle
if (sqr_button(0, 300, 170, 327, 190, SB8 ? 0xE0 : 0x70, "0"))
SB8 = !SB8;
if (sqr_button(0, 330, 170, 357, 190, SB9 ? 0xE0 : 0x70, "1"))
SB9 = !SB9;
if (sqr_button(0, 360, 170, 387, 190, SB10 ? 0xE0 : 0x70, "2"))
SB10 = !SB10;

// tests automatiques
if (sqr_button(0, 315, 80, 360, 100, 0x3E, "Test"))
tst1 1, b0 4;

// fin du programme
if (sqr_button(0, 580, 25, 630, 50, 0x70, "Fin")) {
outp(ADR_OUT, 0);
outp(ADR_CTRL, 0);
fin = 1;
exit(0);
}
}

void test_carte(void)
{
if (tst1 == 1)
sqr_button(5, 370, 80, 400, 100, 0x78, "OK");

// comparaison entre entree et sortie
if ((en & 0xff) != sn) { // erreur
tst1 0, b0 0;
return;
}

// decalage bit a 1
if (tst1 <= 8) {
memset((char *) boolout, 0, 8);
boolout[tst1-1] = 1;
++tst1;
}
// decalage bit a 0
else if (tst1 <= 16) {
memset((char *) boolout, 1, 8);
boolout[tst1-9] = 0;
++tst1;
}

// test OK
else {
sqr_button(5, 370, 80, 400, 100, 0xB0, "OK");
memset((char *) boolout, 0, 8); // reset des sorties
boutons();
tst1 0, b0 0;
}
}

void aff_entrees(void)
{
// entr?es EN0 .. EN7
sqr_button(5, 20, 100, 47, 120, a ? 0xE0 : 0x70, "0");
sqr_button(5, 50, 100, 77, 120, b ? 0xE0 : 0x70, "1");
sqr_button(5, 80, 100, 107, 120, c ? 0xE0 : 0x70, "2");
sqr_button(5, 110, 100, 137, 120, d ? 0xE0 : 0x70, "3");
sqr_button(5, 140, 100, 167, 120, e ? 0xE0 : 0x70, "4");
sqr_button(5, 170, 100, 197, 120, f ? 0xE0 : 0x70, "5");
sqr_button(5, 200, 100, 227, 120, g ? 0xE0 : 0x70, "6");
sqr_button(5, 230, 100, 257, 120, h ? 0xE0 : 0x70, "7");

// valeurs numeriques
color(0x1F);
moveto(100, 80);
printf("%3X ", en & 0xFF);
}

void aff_sorties()
{
color(0x1F);
moveto(100, 150);
printf("%3X ", sn & 0xFF);
}


void redraw(void)
{
rectangle(0, 0, 160, 55);
aff_msg(10, 10, 0x0f, "Carte CVM-PC//");
aff_msg(10, 35, 0x0f, "Programme de test");
setfillstyle(1, 0x1);
bar(170, 0, 639, 55);
aff_msg(180, 10, 0x1f, msg);
setfillstyle(1, 0x8);
bar(280, 60, 470, 125);

// ---- entr?es num?riques
setfillstyle(1, 0x7);
bar(0, 60, 275, 125);
aff_msg(20, 66, 0x70, "Entr?es num?riques");
aff_msg(20, 80, 0x71, "Valeur : Adr. : ");
moveto(210, 80);
printf("%3XH", ADR_IN);

// ---- sorties num?riques
setfillstyle(1, 0x7);
bar(0, 130, 275, 200);
aff_msg(20, 136, 0x70, "Sorties num?riques");
aff_msg(20, 150, 0x71, "Valeur : Adr. : ");
moveto(210, 150);
printf("%3XH", ADR_OUT);

// ---- sorties de controle
setfillstyle(1, 0x7);
bar(280, 130, 470, 200);
aff_msg(300, 136, 0x71, "Sorties de contr?le");
moveto(300, 150);
printf("Adr. : %3XH", ADR_CTRL);

aff_entrees();
aff_sorties();

// ---- initialisation des boutons
sqr_button(5, 370, 80, 400, 100, 0x78, "OK");
ini_button(24);
}

void init(void)
{
setgraphmode(2);
redraw();
}

void background(void)
{
boutons();
if (fin) return;

// ecriture de la carte
write_carte(); // sorties numeriques
// lecture de la carte
read_carte(); // entrees numeriques

// mise a jour des affichages
if (en != en_prec) { // entrees numeriques
aff_entrees();
en_prec = en;
}

if (clocktick()) { // test automatiques
if (tst1) test_carte();
}

// affichage sorties numeriques
if (sn != sn_prec) {
aff_sorties();
sn_prec = sn;
}
}


_GRAFCET_
COMMENTAIRE L2 C2 P1
/*
Programme en langage C pour contr?ler
une interface branch?e sur le port parall?le
*/

1 réponse

sTreb Messages postés 2 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 7 avril 2009
7 avril 2009 à 17:10
Parmis toute les personnes qui ont lu ce message, personne ne saurait comment assimiler a SB0 une sortie sur la carte SVP
C'est un grand soucis pour la poursuite de mon projet.
Merci
0
Rejoignez-nous