TIA Email versenden im TIA

<Eddy>

Level-2
Beiträge
34
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gemeinde,

ich habe mich schon durch einige Themen und Beiträge hier im Forum durchgelesen, komme aber trotzdem irgendwie nicht weiter.

Ich arbeite mit einer S7-1500 und einer PC Station WinCC RT Advanced. Meine Aufgabe besteht darin sobald irgendeine Störung in meiner Anlage besteht eine Email zu verschicken mit einem Betreff: Störung, Text: Störung...... usw. an eine beliebige Email Adresse.

Hat das schon mal jemand von euch gemacht und kann mir Step by Step erklären wie ich vorgehen soll?

Wäre der TMAIL_C Baustein eine sinnvolle Variante oder geht das auch irgendwie in WinCC Advanced?

Vielen Dank im Voraus

Mfg Eddy
 
Servus Eddy,

Ich hab das bei einer Anlage über TMAIL_C gelößt.

Code:
#IO_TMAIL_Instance(

REQ:=#IO_SendMail,
// Anforderung fürs Versenden der Mail.

TO_S:=#C_String_To,
// Ziel Mail Addresse als String, Bsp: 'test@test.com'. Auch mehrere Adressen getrennt durch einen Beistrich möglich.

CC:=#C_String_CC_To,
// Ziel CC-Mail Addresse als String, Bsp: 'test@test.com'. Auch mehrere Adressen getrennt durch einen Beistrich möglich.

SUBJECT:=#IO_String_MSG_Title,
// Betreff als String.

TEXT:=#IO_String_MSG_Text,
// Nachricht als String.

ATTACHMENT:=NULL,
ATTACHMENT_NAME:='',
// Anhang. Hatte ich nie in Verwendung, weiß also nicht wie das genau läuft.

MAIL_ADDR_PARAM:=#I_TMail_Con,
// Connection Baustein. Siehe unten.

DONE=>#T_SendMail_Done,
// Mail erfolgreich gesendet.

BUSY=>#T_SendMail_Busy,
// Mail wird gerade gesendet.

ERROR=>#T_SendMail_Error,
// Fehler beim Versenden.

STATUS=>#T_Word_SendMail_Status
//Status Byte des Versendens.

);

#IO_SendMail := FALSE;

Der Connection Baustein:

Code:
S_TMail_Connection - TMail_V4

InterfaceId = 64
//Hardware Kennung des ProfiNet Ports der am Netzwerk hängt

ID = 16#0064
//Connection Referenz ID (?)

ConnectionType = 16#20
//Verbindungstyp (?)

ActiveEstablished = TRUE
//CPU soll eine Verbindung herstellen und nicht der Mail-Server

CertIndex = 16#00
//Zertifikat Index (?)

WatchDogTime = T#10S
//Zeitüberwachung bei der Verbindungsherstellung

MailServerAddress
    ADDR
       ADDR[1] = 6#xx
       ADDR[2] = 6#xx
       ADDR[3] = 6#xx
       ADDR[4] = 6#xx
//Addresse des Mail-Servers in Hex oder Dezimal

UserName = 'sender@testmail.de'
//Nutzername des E-Mail Accounts mit dem die Mails versendet werden.

PassWord = '12345'
//Passwort des E-Mail Accounts mit dem die Mails versendet werden.

From
    LocalPartPlusAtSign = 'sender@'
    FullQualifiedDomainName = 'testmail.de'
//E-Mail Addresse des Sende-Accounts aufgeteilt

Umgesetzt habe ich das wie folgt:

Im FB Notification wird die FC Send_Mail zyklisch aufgerufen.

FC Send_Mail hat Folgende Ein- und Ausgänge:

Code:
IN:
    I_Con := S_TMail_Connection 

IN/OUT:
    IO_String_MSG_Title := S_Mail_Title
    IO_String_MSG_Text := S_Mail_Text
    IO_Send_Mail := S_Send_Mail
    IO_TMAIL_Instance := S_TMail_Instance

OUT:
    S_Word_SendMail_Status:= O_Word_SendMail_Status

Alle S_* sind im FB Notification als Static deklariert.

Der Aufbau von FC Send_Mail schaut so aus:

Code:
IF NOT #T_SendMail_Busy THEN

    IF "AL_SM_Allg_Events".FEHLER1THEN
    
        #IO_String_MSG_Text := "AL_DB_Mail_MSGs"."S_String[]_MSGs"[0];
        #IO_String_MSG_Title := "AL_DB_Mail_MSGs"."S_String[]_Titles"[0];
        "AL_SM_Allg_Events".FEHLER1:= FALSE;

    ELSIF "AL_SM_Allg_Events".FEHLER2 THEN

        #IO_String_MSG_Text := "AL_DB_Mail_MSGs"."S_String[]_MSGs"[1];
        #IO_String_MSG_Title := "AL_DB_Mail_MSGs"."S_String[]_Titles"[0];
        "AL_SM_Allg_Events".FEHLER2:= FALSE;

    ELSIF "AL_SM_Allg_Events".FEHLER3 THEN

        #IO_String_MSG_Text := "AL_DB_Mail_MSGs"."S_String[]_MSGs"[2];
        #IO_String_MSG_Title := "AL_DB_Mail_MSGs"."S_String[]_Titles"[1];
        "AL_SM_Allg_Events".FEHLER3 := FALSE;

    END_IF;

    IF LEN(#IO_String_MSG_Text) > 0 THEN
        #IO_SendMail := TRUE;
    END_IF;
END_IF;

#IO_TMAIL_Instance(
                   REQ := #IO_SendMail,
                   TO_S := 'test@test.com',
                   CC := '',
                   SUBJECT := #IO_String_MSG_Title,
                   TEXT := #IO_String_MSG_Text,
                   ATTACHMENT := NULL,
                   ATTACHMENT_NAME := '',
                   MAIL_ADDR_PARAM := #I_TMail_Con,
                   DONE => #T_SendMail_Done,
                   BUSY => #T_SendMail_Busy,
                   ERROR => #T_SendMail_Error,
                   STATUS => #T_Word_SendMail_Status);

#IO_SendMail := FALSE;

IF #T_SendMail_Done OR #T_SendMail_Error THEN
    
    #O_Word_SendMail_Status := #T_Word_SendMail_Status;
    #IO_String_MSG_Title := '';
    #IO_String_MSG_Text := '';
    
END_IF;

In dem DB AL_SM_Allg_Events befinden sich die Auslöser für die Mail (FEHLER1, FEHLER2, FEHLER3, ...).
Sobald einer von den Fehler durch externen Code auf True gesetzt wird, wird der IO_String_MSG_Text und IO_String_MSG_Title mit einer Fehlermeldung aus dem DB AL_DB_Mail_MSGs bestückt.
Bei Länge von IO_String_MSG_Text > 0, wird IO_SendMail True und eine Mail wird mittels IO_TMAIL_Instance versendet.
Beim Beenden oder Abbruch des Sende-Vorgangs wird IO_String_MSG_Text und IO_String_MSG_Title wieder zurückgesetzt und der Status übergeben.

Ich habe mal das Ganze auch mit IO_String_MSG_Text und IO_String_MSG_Title, nur als Temporäre Variable im FC Send_Mail hinterlegt versucht, dies war aber nicht erfolgreich. Nur bei der Übergabe an den überliegen DB hat es funktioniert wie gewünscht.

Lg,

Jonathan
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jonathan,

erstmal vielen vielen Dank für diese ausführliche Beschreibung und Erklärung. Ich werde das ganze mal demnächst ausprobieren und gebe dir dann mal Rückmeldung ob es so funktioniert hat :)

Grüße Eddy
 
Zurück
Oben