Lecture db et ecriture SCL
Bonjour à tous,
Donc je suis en stage en informatique industriel. Je dois développer un bloc assez complexe. Donc je m'entraine à plus simple pour commencer :D
Donc j'ai fais un nouveaux projet sous simatic manager (je dois utiliser cela car je dois faire un programme compatible avec s7-1200,1500
J'ai créé un DB20 de test avec plusieurs information de type REAL.
Je voudrais depuis un un FC lire toutes les information une à une dans mon db.
Plusieurs question se pose.
1) je voudrais utiliser un ARRAY[0..n] la valeur n n'est pas connu à la compilation donc problème. Allocation dynamique peut être? Si oui quel est la procédure. Car pas de fonction malloc etc... Et comment connaitre la taille du db pas facile a trouver.
2)J'ai fuiné sur le net et je trouve des solutions avec pointeur mais je ne vois pas ou mon db est lier. Ni comment accèder à toutes les adress du db. Voici le code que j'ai adapter sans trop comprendre
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| FUNCTION FC123:VOID
VAR_TEMP
// création d'un pointeur
pDB:ANY;
// Liaison du pointeur sur la strucuture de donnée
pAny AT pDB:
STRUCT
S7Code:BYTE;
DataType:BYTE;
Lenght :INT;
DBNumber:INT;
MemoryArea:BYTE;
ByteAdressMSB:BYTE;
ByteAdressLSB:WORD;
END_STRUCT;
END_VAR
VAR_INPUT
TAILLE_DB:INT;
NUMERO_DB:INT;
NOMBRE_DE_POINT:INT;
LECTURE_CAPTEUR:REAL;
UNITER_DE_LECTURE:CHAR;
END_VAR
VAR_OUTPUT
INDEX_VALUE:INT;
VALEUR_CHARGE:REAL;
VALEUR_CAPTEUR_DB:REAL;
END_VAR
// Initialisation des composante de la structure
pAny.S7Code := 16#10;
// type REAL
pAny.DataType := 16#08;
pAny.Lenght := TAILLE_DB;
pAny.DBNumber := NUMERO_DB;
pAny.MemoryArea := 16#84;
pAny.ByteAdressMSB :=0;
pAny.ByteAdressLSB :=0;
END_FUNCTION |
Je voudrais aussi savoir comment dans un FB je peux instancier un DB car a chaque fois que je met un fb dans mon ob1 bah cela s'affiche en rouge donc je dois avoir oublier quelques chose. Alors je met une db en input, mais c'est pas ce que je cherche à faire.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| FUNCTION_BLOCK FB1
VAR_INPUT
DB_TEST: BLOCK_DB;
END_VAR
VAR_OUTPUT
outputest:REAL;
END_VAR
VAR
stat_var1:REAL;
END_VAR
outputest:=DWORD_TO_REAL(DB_TEST.dd0);
END_FUNCTION_BLOCK |
Je sèche un peu et je suis débutant SCL merci à vous de m'aider :)