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;