Bonjour les pros,
J'aurais besoin de l'avis éclairé d'un ou plusieurs experts.
Voici me question,
Je lis avec un lecteur de code-barres l'heure et les minutes. Je les ai en format string,
par exemple “ 12 53”.
Je dois comparer cela avec l’heure du CPU. Et je dois pouvoir prendre une décision par rapport à la différence.
Merci d’avance en bonne pâque à tous,
Umberto
[S7-1200]
-
Umberto1974
- Asservi son premier moteur

- Messages : 27
- Enregistré le : 25 nov. 2018, 22:18
- Localisation : Mechelen
- Sycon88
- Première mise en service

- Messages : 64
- Enregistré le : 22 févr. 2019, 17:43
- Localisation : Vosges
Re: [S7-1200]
Bonjour Umberto,
Tu peux récupérer la date et l'heure de la cpu via une variable de type DTL.
Ensuite pour lui affecter l'heure automate, tu utilise le bloc RD_SYS_T_DTL sous TIA.
De cette variable la tu peux extraire l'heure, les minutes...
Ensuite tu dois pouvoir isoler les valeurs de ta variable string et les comparer
Tu peux récupérer la date et l'heure de la cpu via une variable de type DTL.
Ensuite pour lui affecter l'heure automate, tu utilise le bloc RD_SYS_T_DTL sous TIA.
De cette variable la tu peux extraire l'heure, les minutes...
Ensuite tu dois pouvoir isoler les valeurs de ta variable string et les comparer
- LaurentCK
- Première mise en service

- Messages : 60
- Enregistré le : 24 oct. 2020, 08:41
- Localisation : Pizay
Re: [S7-1200]
Type de donnée DTL : année-mois-jour-heures:minutes:secondes.nanosecondes
Min. : DTL#1970-01-01-00:00:00.0
Max. : DTL#2262-04-11-23:47:16.854775807
Les valeurs entières des heures et des minutes se trouvent dans les octets 5 (heures) et 6 (minutes)
C'est sûrement le plus simple de tout mettre en minutes depuis minuit...
On peut aussi faire d'abord une conversion DTL_TO_TOD
Mais si vous faites ça, il vous faudra comprendre comment est construit le type de données TOD (TIME_OF_DAY) : double mot qui mémorisent le nombre de millisecondes depuis le début du jour (0:00) comme nombre entier sans signe. TOD#00:00:00.000 à TOD#23:59:59.999
La conversion vers un double entier non signé (UDINT) par exemple se fera facilement avec l'instruction T_CONV
Au passage si on avait à travailler sur du DATE_AND_TIME, voilà comment est construit le type de données DT (DATE_AND_TIME) 8 octets bien compartimentés qui mémorisent les indications concernant la date et l'heure en format BCD.
Octet 3 : Heure ---> de BCD#0 à BCD#23
Octet 4 : Minute ---> de BCD#0 à BCD#59
Après 1 conversions pour chacun de ces deux nombres BCD vers 2 nombres entiers, puis 1 multiplication pour chacun, puis une addition, on retombe facilement sur un nombre de millisecondes depuis le début du jour.
Vous devriez trouver votre bonheur avec ces instructions :
Notamment pour convertir les données texte du lecteur de code-barres (String / Char)
S_CONV : Convertir la chaîne de caractères (S7-1200, S7-1500)
STRG_VAL : Convertir la chaîne de caractères en valeur numérique (S7-1200, S7-1500)
Strg_TO_Chars : Convertir la chaîne de caractères en Array of CHAR (S7-1200, S7-1500)
LEFT : Lire les caractères de gauche d'une chaîne de caractères (S7-1200, S7-1500)
RIGHT : Lire les caractères de droite d'une chaîne de caractères (S7-1200, S7-1500)
MID : Lire les caractères au milieu d'une chaîne de caractères (S7-1200, S7-1500)
DELETE : Supprimer des caractères dans la chaîne de caractères (S7-1200, S7-1500)
INSERT : Insérer des caractères dans une chaîne de caractères (S7-1200, S7-1500)
REPLACE : Remplacer des caractères dans une chaîne de caractères (S7-1200, S7-1500)
Sinon, pour travailler sur les heures & minutes :
T_CONV : Convertir et extraire les temps (S7-1200, S7-1500)
TOD vers UDINT par exemple : UDINT : nombre de millisecondes depuis le début de la journée (0:00).
T_SUB : Soustraire les temps (S7-1200, S7-1500)
T_DIFF : Différence des temps (S7-1200, S7-1500)
Min. : DTL#1970-01-01-00:00:00.0
Max. : DTL#2262-04-11-23:47:16.854775807
Les valeurs entières des heures et des minutes se trouvent dans les octets 5 (heures) et 6 (minutes)
C'est sûrement le plus simple de tout mettre en minutes depuis minuit...
On peut aussi faire d'abord une conversion DTL_TO_TOD
Mais si vous faites ça, il vous faudra comprendre comment est construit le type de données TOD (TIME_OF_DAY) : double mot qui mémorisent le nombre de millisecondes depuis le début du jour (0:00) comme nombre entier sans signe. TOD#00:00:00.000 à TOD#23:59:59.999
La conversion vers un double entier non signé (UDINT) par exemple se fera facilement avec l'instruction T_CONV
Au passage si on avait à travailler sur du DATE_AND_TIME, voilà comment est construit le type de données DT (DATE_AND_TIME) 8 octets bien compartimentés qui mémorisent les indications concernant la date et l'heure en format BCD.
Octet 3 : Heure ---> de BCD#0 à BCD#23
Octet 4 : Minute ---> de BCD#0 à BCD#59
Après 1 conversions pour chacun de ces deux nombres BCD vers 2 nombres entiers, puis 1 multiplication pour chacun, puis une addition, on retombe facilement sur un nombre de millisecondes depuis le début du jour.
Vous devriez trouver votre bonheur avec ces instructions :
Notamment pour convertir les données texte du lecteur de code-barres (String / Char)
S_CONV : Convertir la chaîne de caractères (S7-1200, S7-1500)
STRG_VAL : Convertir la chaîne de caractères en valeur numérique (S7-1200, S7-1500)
Strg_TO_Chars : Convertir la chaîne de caractères en Array of CHAR (S7-1200, S7-1500)
LEFT : Lire les caractères de gauche d'une chaîne de caractères (S7-1200, S7-1500)
RIGHT : Lire les caractères de droite d'une chaîne de caractères (S7-1200, S7-1500)
MID : Lire les caractères au milieu d'une chaîne de caractères (S7-1200, S7-1500)
DELETE : Supprimer des caractères dans la chaîne de caractères (S7-1200, S7-1500)
INSERT : Insérer des caractères dans une chaîne de caractères (S7-1200, S7-1500)
REPLACE : Remplacer des caractères dans une chaîne de caractères (S7-1200, S7-1500)
Sinon, pour travailler sur les heures & minutes :
T_CONV : Convertir et extraire les temps (S7-1200, S7-1500)
TOD vers UDINT par exemple : UDINT : nombre de millisecondes depuis le début de la journée (0:00).
T_SUB : Soustraire les temps (S7-1200, S7-1500)
T_DIFF : Différence des temps (S7-1200, S7-1500)
-
Umberto1974
- Asservi son premier moteur

- Messages : 27
- Enregistré le : 25 nov. 2018, 22:18
- Localisation : Mechelen
Re: [S7-1200]
Merci à tous.