Page 1 sur 1
Ecrire dans String
Posté : 27 sept. 2016, 07:52
par varach
Bonjour ,
Je suis en train de faire un système d'envoi de sms suivant des alarmes sur un S7 300 , en V5.5.
Mon message actif est stocké dans un DB1 , format string [160 ]
J'aimerai pouvoir stocker tt mes messages dans un autre DB2 , et aller "piocher "dedans suivant condition .
Comment déplacer un string de mon DB2 vers mon DB1 ?
Ils ont tous la même longueur .
Merci d 'avance ,
Yann
Re: Ecrire dans String
Posté : 27 sept. 2016, 08:20
par djé
Salut,
utilises le SFC20 "BLKMOV" en prenant soin d'utiliser, de préférence pour l'adressage des string, la manière "symbolique".
Re: Ecrire dans String
Posté : 27 sept. 2016, 09:46
par JC87
Bonjour,
Ou alors la méthode gros bourricot :
L DB2.DBDx
T DB1.DBDx
.
.
L DB2.DBDz
T DB1.DBDz
Bon c'est clair que le bloc move c'est quand même autrement plus élégant
JC
Re: Ecrire dans String
Posté : 27 sept. 2016, 11:31
par djé
ou pour faire complet:
Transfert d'un message issu d'une table (DB2 "DB_SRC", MESSAGES : ARRAY [0 .. 20 ] OF STRING [160 ] - 21 messages au total) dans la destination DB1 "DB_DEST" (Message_txt : STRING [160 ])
MW100= numéro de message à envoyer (0à20)
Déclaration Local (Temp)
Source: ANY
Pointeur:DWORD
Rézo1: Contrôle (bornage num message)
Code : Tout sélectionner
L MW 100
L 0
<I // test <0
SPB S000
L MW 100
L 20 // test >20
>I
SPB S001
SPA s003
S000: L 0
T MW 100
SPA s003
S001: L 20
T MW 100
s003: NOP 0
Rézo2: Création du décalage (pointeur) en fonction du num message
Code : Tout sélectionner
L MW 100
L 162
*I
SLD 3 // mise au format Pointeur
L P#DBX 0.0 // on part de zéro dans la DB2
+D
T #Pointeur
Rézo3: Construction du pointeur ANY source
Code : Tout sélectionner
LAR1 P##Source
L B#16#10 // 10h pour S7
T LB [AR1,P#0.0]
L B#16#2 // type de données : BYTE= 2h
T LB [AR1,P#1.0]
L 162 // Taille 162 octets
T LW [AR1,P#2.0]
L 2 // Num DB=2 (DB2)
T LW [AR1,P#4.0]
L #Pointeur // décalage
T LD [AR1,P#6.0]
Rézo4: transfert via SFC20
Code : Tout sélectionner
CALL "BLKMOV"
SRCBLK :=#Source
RET_VAL:=#TEMP_ret
DSTBLK :="DB_DEST".Message_txt
NOP 0
Re: Ecrire dans String
Posté : 28 sept. 2016, 11:08
par GG10
Bonjour !!
plus simplement en SCL
FUNCTION_BLOCK FB83
title='';
"DB2".MESSAGE[1]:="DB1".MESSAGE[1];
"DB2".MESSAGE[2]:="DB1".MESSAGE[2];
"DB2".MESSAGE[3]:="DB1".MESSAGE[10];
END_FUNCTION_BLOCK
Re: Ecrire dans String
Posté : 28 sept. 2016, 13:00
par djé
Bonjour,
Effectivement le SCL facilite grandement la programmation en rendant transparent tous une tas d'opération assez barbare (construction du pointeur ANY, utilisation du SCF20):
En SCL on peut ainsi directement affecter à la variable de destination un élément du tableau source:
Code : Tout sélectionner
FUNCTION FC100 : void
VAR_input
Idx:INT;
END_VAR
BEGIN
"DB_DEST".Message_txt:="DB_SRC".MESSAGES[Idx];
END_FUNCTION
Malheureusement tout le monde ne dispose pas du SCL et il est toujours intéressant, voire nécessaire de connaitre et comprendre les mécanismes qui sous-tendent au SCL.
Re: Ecrire dans String
Posté : 29 sept. 2016, 07:17
par varach
Bonjour,
Merci à tous !