Programmation en langage ST.
L'exemple est programmé en langage ST. La section correspondante se trouve dans la même (MAST).
CASE Function_Step OF
0: (* Initialisation *)
IF (Start) THEN (* indicateur de déclenchement *)
Error := 0;
Function_Step := 5; (* étape suivante *)
END_IF;
5: (* Envoyer commande pour faire passer le port série du mode Modbus esclave au Mode caractère *)
READ_STS(Serial_port); (* lire état du port série *)
IF (Serial_port.EXCH_STS = 0) THEN (* aucune commande active *)
Serial_port.CONTROL := 16#00; (* réinitialiser mot de commande *)
(* définir bit de commande TO_CHAR_MODE *)
SET(Serial_port.TO_CHAR_MODE);
WRITE_CMD (Serial_port); (* envoyer commande *)
Test_inc := 0; (* initialiser compteur de nouvelles tentatives *)
Function_Step := 10; (* étape suivante *)
END_IF;
10: (* Tester le résultat de la commande de bascule en Mode caractère*).
READ_STS(Serial_port); (* lire état du port série *)
IF (Serial_port.EXCH_STS = 0) THEN (* commande terminée *)
(* réinitialiser bit de commande TO_CHAR_MODE *)
RESET(Serial_port.TO_CHAR_MODE);
IF (Serial_port.EXCH_RPT = 0) THEN (* aucune erreur *)
IF (AND(Serial_port.PROTOCOL, 16#0F) = 03)
THEN (* Mode caractère OK *)
Function_Step := 15; (* étape suivante *)
ELSE
Test_inc := Test_inc + 1;
IF (Test_inc > 1000) THEN
Error := 10; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
END_IF;
ELSE (* erreur lors de l'envoi de la commande au port *)
Error := 10; (* erreur *)
Function_Step := 130;
END_IF;
END_IF;
15: (* Envoyer commande de numérotation au modem *)
(*Le numéro de téléphone doit être inséré entre 'ATDT' et '$N'*)
ReqString := 'ATDT4001$N'; (* message de numérotation *)
MngtPrint[2] := 500; (* timeout *)
MngtPrint[9] := 9; (* taille de l'échange en octet *)
PRINT_CHAR(ADDM(Adr_Char), ReqString, MngtPrint);
Function_Step := 20;
20: (* Tester résultat de la fonction PRINT_CHAR *)
IF (NOT MngtPrint[0].0) THEN
IF (MngtPrint[1] = 0) THEN
Function_Step := 25; (* réussi : étape suivante *)
ELSE
Error := 20; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
END_IF;
25: (* Attente de la réponse via INPUT_CHAR *)
MngtInput[2] := 500; (* timeout *)
AnsString1:=' ';
(* attendre réponse du modem *)
INPUT_CHAR(ADDM(Adr_Char), 1, nb_charac_to_receive_connect, MngtInput, AnsString1);
Function_Step := 30; (* étape suivante *)
30: (* Tester résultat de la fonction INPUT_CHAR *)
IF (NOT MngtInput[0].0) THEN
IF (MngtInput[1] = 0) THEN
Function_Step := 35; (* réussi : étape suivante *)
ELSE
Error := 30; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
END_IF;
35: (* Tester réponse du modem *)
IF (AnsString1 = '$NCONNET') THEN
Function_Step := 40; (* réussi : étape suivante *)
ELSE
Error := 35; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
40: (* Envoyer commande pour faire passer le port série du Mode caractère au mode Modbus maître *)
READ_STS(Serial_port); (* lire état du port série *)
IF (Serial_port.EXCH_STS = 0) THEN (* aucune commande active *)
Serial_port.CONTROL := 16#00; (* réinitialiser mot de commande *)
(* définir bit de commande TO_MODBUS_MASTER *)
SET(Serial_port.TO_MODBUS_MASTER);
WRITE_CMD (Serial_port); (* envoyer commande *)
Test_inc := 0; (* initialiser compteur de nouvelles tentatives *)
Function_Step := 45; (* étape suivante *)
END_IF;
45: (* Tester le résultat de la commande de bascule en mode Modbus maître*).
READ_STS(Serial_port); (* lire état du port série *)
IF (Serial_port.EXCH_STS = 0) THEN (* commande terminée *)
(* bit de commande TO_MODBUS_MASTER *)
RESET(Serial_port.TO_MODBUS_MASTER);
IF (Serial_port.EXCH_RPT = 0) THEN (* aucune erreur *)
IF (AND(Serial_port.PROTOCOL, 16#0F) = 06)
THEN (* mode Modbus maître OK *)
Function_Step := 50; (* étape suivante *)
ELSE
Test_inc := Test_inc + 1;
IF (Test_inc > 1000) THEN
Error := 45; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
END_IF;
ELSE (* erreur lors de l'envoi de la commande au port *)
Error := 45; (* erreur *)
Function_Step := 130;
END_IF;
END_IF;
50: (*Ecrire des informations dans la deuxième UC*)
Mngtwrite[2]:=50; (* timeouts*)
%MW40:=5; (* valeur à envoyer *)
WRITE_VAR(ADDM(Adr_modbus),'%MW',100,2,%MW40:2,Mngtwrite);
Function_Step := 55;
55: (* Tester résultat de la fonction WRITE_VAR *)
IF (NOT Mngtwrite[0].0) THEN
IF (Mngtwrite[1] = 0) THEN
Function_Step := 60; (* réussi : étape suivante *)
ELSE
Error := 55; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
END_IF;
60: (* Envoyer commande pour basculer le port série du mode Modbus au Mode caractère *)
READ_STS(Serial_port); (* lire état du port série *)
IF (Serial_port.EXCH_STS = 0) THEN (* aucune commande active *)
Serial_port.CONTROL := 16#00; (* réinitialiser mot de commande *)
(* définir bit de commande TO_CHAR_MODE *)
SET(Serial_port.TO_CHAR_MODE);
WRITE_CMD (Serial_port); (* envoyer commande *)
Test_inc := 0; (* initialiser compteur de nouvelles tentatives *)
Function_Step := 65; (* étape suivante *)
END_IF;
65: (* Tester résultat de la commande de bascule *)
READ_STS(Serial_port); (* lire état du port série *)
IF (Serial_port.EXCH_STS = 0) THEN (* commande terminée *)
(* réinitialiser bit de commande TO_CHAR_MODE *)
RESET(Serial_port.TO_CHAR_MODE);
IF (Serial_port.EXCH_RPT = 0) THEN (* aucune erreur *)
IF (AND(Serial_port.PROTOCOL, 16#0F) = 03)
THEN (* Mode caractère OK *)
Function_Step := 70; (* étape suivante *)
ELSE
Test_inc := Test_inc + 1;
IF (Test_inc > 1000) THEN
Error := 65; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
END_IF;
ELSE (* erreur lors de l'envoi de la commande au port *)
Error := 65; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
END_IF;
70: (* Raccrochage du modem : étape 1*)
ReqString := '+++'; (* séquence d'échappement *)
MngtPrint[3] := 3; (* taille de l'échange en octet *)
PRINT_CHAR(ADDM(Adr_Char), ReqString, MngtPrint);
Function_Step := 75; (* étape suivante *)
75: (* Tester résultat de la fonction PRINT_CHAR *)
IF (NOT MngtPrint[0].0) THEN
IF (MngtPrint[1] = 0) THEN
(* Réussi : étape suivante *)
Function_Step := 80;
ELSE
(* Fin sur erreur *)
Error := 75;
Function_Step := 130;
END_IF;
END_IF;
80:
MngtInput[2] := 50; (* timeout *)
INPUT_CHAR(ADDM(Adr_Char), 1, nb_charac_to_receive_ok, MngtInput, AnsString2); (*Attendre réponse du modem*)
Function_Step := 85; (* étape suivante *)
85: (* Tester résultat de la fonction INPUT_CHAR *)
IF (NOT MngtInput[0].0) THEN
IF (MngtInput[1] = 0) THEN
(* Réussi : étape suivante *)
Function_Step := 90;
ELSE
(* Fin sur erreur *)
Error := 85;
Function_Step := 130;
END_IF;
END_IF;
90: (* Tester réponse du modem *)
IF (AnsString2 = '$NOK') THEN
Function_Step := 95; (* réussi : étape suivante *)
ELSE
Error := 90; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
95: (* Raccrochage du modem : étape 2*)
ReqString := 'ATH0$N'; (* message de raccrochage *)
MngtPrint[3] := 3; (* taille de l'échange en octet *)
PRINT_CHAR(ADDM(Adr_Char), ReqString, MngtPrint);
Function_Step := 100; (* étape suivante *)
100: (* Tester résultat de la fonction PRINT_CHAR *)
IF (NOT MngtPrint[0].0) THEN
IF (MngtPrint[1] = 0) THEN
(* Réussi : étape suivante *)
Function_Step := 105;
ELSE
(* Fin sur erreur *)
Error := 100;
Function_Step := 130;
END_IF;
END_IF;
105:
MngtInput[2] := 50; (* timeout *)
INPUT_CHAR(ADDM(Adr_Char), 1, nb_charac_to_receive_ok, MngtInput, AnsString3); (*Attendre réponse du modem*)
Function_Step := 110; (* étape suivante *)
110: (* Tester résultat de la fonction INPUT_CHAR *)
IF (NOT MngtInput[0].0) THEN
IF (MngtInput[1] = 0) THEN
(* Réussi : étape suivante *)
Function_Step := 115;
ELSE
(* Fin sur erreur *)
Error := 110;
Function_Step := 130;
END_IF;
END_IF;
115: (* Tester réponse du modem *)
IF (AnsString3 = '$NOK') THEN
Function_Step := 120; (* réussi : étape suivante *)
ELSE
Error := 115; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
120: (* Envoyer commande pour basculer le port série du Mode caractère au mode Modbus esclave *)
READ_STS(Serial_port); (* lire état du port série *)
IF (Serial_port.EXCH_STS = 0) THEN (* aucune commande active *)
Serial_port.CONTROL := 16#00; (* réinitialiser mot de commande *)
(* définir bit de commande TO_MODBUS_SLAVE *)
SET(Serial_port.TO_MODBUS_SLAVE);
WRITE_CMD (Serial_port); (* envoyer commande *)
Test_inc := 0; (* initialiser compteur de nouvelles tentatives *)
Function_Step := 125; (* étape suivante *)
END_IF;
125: (* Tester résultat de la commande de bascule *)
READ_STS(Serial_port); (* lire état du port série *)
IF (Serial_port.EXCH_STS = 0) THEN (* commande terminée *)
(* réinitialiser bit de commande TO_MODBUS_SLAVE *)
RESET(Serial_port.TO_MODBUS_SLAVE);
IF (Serial_port.EXCH_RPT = 0) THEN (* aucune erreur *)
IF (AND(Serial_port.PROTOCOL, 16#0F) = 07)
THEN (* Mode caractère OK *)
Function_Step := 130; (* étape suivante *)
ELSE
Test_inc := Test_inc + 1;
IF (Test_inc > 1000) THEN
Error := 125; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
END_IF;
ELSE (* erreur lors de l'envoi de la commande au port *)
Error := 125; (* erreur *)
Function_Step := 130; (* étape suivante = fin *)
END_IF;
END_IF;
130: (* Fin *)
IF (NOT Start) THEN (* indicateur de déclenchement *)
Function_Step := 0; (* atteindre état d'attente *)
END_IF;
END_CASE;