Programmation en langage ST
Cet exemple est programmé en langage ST (littéral structuré). La section correspondante se trouve dans la même tâche maître (MAST).
(* Fonction pour écrire %MW100 dans %MW140 de l'esclave Y *)(* --------------------------------------------- *)CASE Step_4 OF 0: (* Initialisation *) IF (Start_4) THEN (* Indicateur de déclenchement *) Error_4 := 0; Step_4 := 5; (* Etape suivante *) END_IF; 5: (* Envoyer commande pour basculer le port série du mode Modbus en mode caractère *) READ_STS(Ioddt_Pcmcia_0_3_1); (* Lire état du port série *) IF (Ioddt_Pcmcia_0_3_1.EXCH_STS = 0) THEN (* Aaucune commande active *) Ioddt_Pcmcia_0_3_1.CONTROL := 16#00; (* Réinitialiser mot de commande *) SET(Ioddt_Pcmcia_0_3_1.MB_TO_CHAR); (* Régler bit de commande MB_TO_CHAR *) WRITE_CMD (Ioddt_Pcmcia_0_3_1); (* Envoyer commande *) i := 0; (* Initialiser compteur de nouvelles tentatives *) Step_4 := 10; (* Etape suivante *) END_IF; 10: (* Tester résultat de la commande de bascule *) READ_STS(Ioddt_Pcmcia_0_3_1); (* Lire état du port série *) IF (Ioddt_Pcmcia_0_3_1.EXCH_STS = 0) THEN (* Commande terminée *) RESET(Ioddt_Pcmcia_0_3_1.MB_TO_CHAR); (* Rréinitialiser bit de commande MB_TO_CHAR *) IF (Ioddt_Pcmcia_0_3_1.EXCH_RPT = 0) THEN (* Aucune erreur *) IF (AND(Ioddt_Pcmcia_0_3_1.PROTOCOL, 16#0F) = 03) THEN (* Mode caractère OK *)°°°°°°°° Step_4 := 15; (* Etape suivante *) ELSE i := i + 1; IF (i > 1000) THEN Error_4 := -1; (* Erreur *) Step_4 := 65; (* Etape suivante = fin *) END_IF; END_IF; ELSE (* Erreur lors de l'envoi de la commande au port *) Error_4 := -2; (* Erreur *) Step_4 := 65; (* Etape suivante = fin *) END_IF; END_IF; 15: (* Envoyer commande de numérotation au modem *) Adr_4 := ADDR('0.3.1.SYS'); (* Port de communication *) MngtPrint_4[3] := 50; (* Timeout *) MngtPrint_4[4] := 16; (* Nombre d'octets à envoyer *) ReqString_4 := 'ATDT0102030405$N'; (* Message de numérotation *) PRINT_CHAR(Adr_4, ReqString_4, MngtPrint_4); MngtInput_4[3] := 300; (* Timeout *) MngtInput_4[4] := 0; (* Nombre d'octets à envoyer *) INPUT_CHAR(Adr_4, 0, 12, MngtInput_4, AnsString_4); (* Attente réponse du modem *) Step_4 := 20; (* Etape suivante *) 20: (* Tester résultat de la fonction PRINT_CHAR *) IF (NOT MngtPrint_4[1].1) THEN IF (MngtPrint_4[2] = 0) THEN Step_4 := 25; (* Etape suivante *) ELSE Error_4 := -3; (* Erreur *) Step_4 := 65; (* Etape suivante = fin *) END_IF; END_IF; 25: (* Tester résultat de la fonction INPUT_CHAR *) IF (NOT MngtInput_4[1].1) THEN IF (MngtInput_4[2] = 0) THEN Step_4 := 30; (* Réussite : étape suivante *) ELSE Error_4 := -4; (* Erreur *) Step_4 := 65; (* Etape suivante = fin *) END_IF; END_IF; 30: (* Tester réponse du modem *) IF (AnsString_4 = 'CONNECT 9600') THEN Step_4 := 35; (* Réussite : étape suivante *) ELSE Error_4 := -5; (* Erreur *) Step_4 := 65; (* Etape suivante = fin *) END_IF; 35: (* Initialiser paramètres de OUT_IN_MBUS *) MbusCmd_4[1] := 10; (* Adresse automate esclave *) MbusCmd_4[2] := 16#06; (* Fonction Modbus 16#06 *) MbusCmd_4[3] := 100; (* Zone automate esclave = %MW100 *) MbusCmd_4[4] := 41; (* Quantité de données *) RetryLmt_4 := 2; (* Nombre de nouvelles tentatives *) DataBits_4 := %KW0.3.1.1.8; (* 1 = 8 bits -> Mode RTU, 0 = 7 bits -> Mode ASCII *) RespTout_4 := 300; (* Timeout = 30 s *) Flag_Error_4 := 0; Step_4 := 40; (* Etape suivante *) 40: (* Appel de OUT_IN_MBUS *) Out_In_Mbus_4 (Adr_4, MbusCmd_4, RetryLmt_4, DataBits_4, RespTout_4, Abort_4, %MW100:41, Retry_4, Active_4, Done_4, Flag_Error_4, Status_4); IF (NOT Active_4) THEN (* Demande terminée *) IF (NOT Flag_Error_4) THEN (* Aucune erreur *) Step_4 := 45; (* Etape suivante *) ELSE (* Erreur *) Error_4 := -6; (* Erreur *) Step_4 := 45; (* Etape suivante *) END_IF; END_IF; 45: (* Raccrochage du modem *) MngtPrint_4[3] := 50; (* Timeout *) MngtPrint_4[4] := 9; (* Nombre d'octets à envoyer *) ReqString_4 := '+++ATH0$N'; (* Message de raccrochage *) PRINT_CHAR(Adr_4, ReqString_4, MngtPrint_4); Step_4 := 50; (* Etape suivante *) 50: (* Tester résultat de la fonction PRINT_CHAR *) IF (NOT MngtPrint_4[1].1) THEN IF (MngtPrint_4[2] = 0) THEN (* Réussite : étape suivante *) Step_4 := 55; ELSE (* Fin sur erreur *) Error_4 := 1; Step_4 := 65; END_IF; END_IF; 55: (* Envoyer commande pour basculer le port série du mode Modbus en mode caractère *) READ_STS(Ioddt_Pcmcia_0_3_1); (* Lire état du port série *) IF (Ioddt_Pcmcia_0_3_1.EXCH_STS = 0) THEN (* Aucune commande active *) Ioddt_Pcmcia_0_3_1.CONTROL := 16#00; (* Réinitialiser mot de commande *) SET(Ioddt_Pcmcia_0_3_1.CHAR_TO_MB); (* Régler bit de commande MB_TO_CHAR *) WRITE_CMD (Ioddt_Pcmcia_0_3_1); (* Envoyer commande *) i := 0; (* Initialiser compteur de nouvelles tentatives *) Step_4 := 60; (* Etape suivante *) END_IF; 60: (* Tester résultat de la commande de bascule *) READ_STS(Ioddt_Pcmcia_0_3_1); (* Lire état du port série *) IF (Ioddt_Pcmcia_0_3_1.EXCH_STS = 0) THEN (* Commande terminée *) RESET(Ioddt_Pcmcia_0_3_1.CHAR_TO_MB); (* Réinitialiser bit de commande CHAR_TO_MB *) IF (Ioddt_Pcmcia_0_3_1.EXCH_RPT = 0) THEN (* Aucune erreur *) IF (AND(Ioddt_Pcmcia_0_3_1.PROTOCOL, 16#0F) = 07) THEN (* Mode Modbus OK *) Step_4 := 65; (* Etape suivante *) ELSE i := i + 1; IF (i > 1000) THEN Error_4 := 2; (* Erreur *) Step_4 := 65; (* Etape suivante *) END_IF; END_IF; ELSE (* Erreur lors de l'envoi de la commande au port *) Error_4 := 3; (* Erreur *) Step_4 := 65; (* Etape suivante *) END_IF; END_IF; 65: (* Fin *) Start_4 := 0; (* Autoriser nouvelle demande *) Step_4 := 0; (* Atteindre état d'attente *)END_CASE;
