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".
String.png

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 :mrgreen:

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 !