Beckhoff Information System - German

TwinCAT ADS Web Service: Beispiele

TwinCAT ADS Web Service: Beispiele

Beispiel | Downloadlink
Implementation Consumer in C# | Sample01.exe
Implementation Consumer in C++ | WebServiceSampleCPP.zip
Implementation Consumer in Java | WebServiceSampleJava.zip
Implementation ASP.NET 2.0 AJAX "Atlas" | SPS Beispiel ASP.NET 2.0 AJAX - C# Beispiel 01 ASP.NET 2.0 AJAX - C# Beispiel 02
Implementation Consumer in Delphi 8 for .NET | Sample01.exe


TwinCAT ADS Web Service: C# Beispiel

Consumer in C# zum Lesen und Schreiben von SPS-Variablen

In diesem Beispiel wird erklärt, wie ein ADS-WebService-Consumer zum Lesen und Schreiben von SPS-Variablen via ADS-HTTP erstellt wird.

Erstellen eines WebService-Consumers mit Hilfe des Microsoft Visual Studio 2005

1. Neues Projekt erstellen:

Starten Sie das Visual Studio 2005.
Erstellen Sie ein neues Projekt, indem Sie im Menü -> File -> New -> Project klicken. Im Dialogfeld New Project können Sie ein neues Projekt auf der Basis verschiedener Vorlagen erstellen.
Hier wählen Sie unter Project Types die Programmiersprache Visual C# und unter den Vorlagen Windows Application. Geben Sie Ihrem Projekt ein neuen Namen, in diesem Fall bitte den Namen TcAdsWebService01 eingeben. Wählen Sie dann den Verzeichnispfad unter Location in dem Sie ihr Arbeitsprojekt erstellen wollen.
  • Durch Auswahl der Vorlage Windows Application ist die neue Applikation ausschließlich auf vollständigen .NET Plattformen lauffähig.
  • Durch Auswahl der Vorlage Smart Device Applikation ist die neue Applikation auf vollständigen .NET Plattformen und auf .NET-CompactFramework (CE-) Plattformen lauffähig.
    Durch Auswahl der NET-CompactFramework (CE-) Plattform ergeben sich Einschränkungen.

2. Bedienungsoberfläche erstellen

Hierzu wird zuerst eine Oberfläche in dem Design Modus der Form Form1 mit der Toolbox erstellt. Die Einstellungen der verschiedenen Controls (wie z.B. 6 Bezeichnungsfelder , 6 Textfelder , 2 Schaltflächen) können Sie im Properties Window des Visual Studio einsehen und verändern.
// Bezeichnungsfelder (Label)
lblWebServiceUrl.Text = "WebServiceUrl:";
lblAdsPort.Text = "ADS Port:";
lblAmsNetID.Text = "Ams Net ID:";
lblBool.Text = "VarBool:";
lblInt.Text = "VarInt:";
lblString.Text = "VarString:";

// Textfelder (TextBox)
txtWebServiceUrl.Text = "";
txtAdsPort.Text = "";
txtAmsNetId.Text = "";
txtBool.Text = "";
txtInt.Text = "";
txtString.Text = "";

// Schaltflächen (Button)
btnRead.Text = "&Read";
btnWrite.Text = "&Write";

3. Web Referenz hinzufügen

Wählen Sie nach dem Erstellen des Projekts unter Projects --> Add Web Reference....
Geben Sie im darauf erscheinenden Fenster die URL der WebService-WSDL-Datei an oder lassen Sie mit Web services on the local machine danach suchen.

Geben Sie der Referenz einen Namen und klicken Sie auf Add Reference.

4. Quelltext bearbeiten

Instanzen
Nach dem Erstellen der Oberfläche und das Einbinden des TwinCAT ADS Webservice kann zum C# Quelltext gewechselt werden. In die oberste Zeile des Quelltextes wird die benötigte Namespace System.Web.Services.Protocols eingefügt, die später die SOAP-Exceptions abfängt.
using System.Web.Services.Protocols;

Als nächstes folgen die Deklarationen innerhalb der Klasse Form1. Zuerst müssen Sie die Instanz zu dem TwinCAT ADS Webservice herstellen, um in Ihrem Programm ein WebService-Objekt zur Verfügung zu haben:
TcAdsWebService.TcAdsWebService TcWebService = new TcAdsWebService.TcAdsWebService();

Hier wird eine Instanz der Klasse System.Text.ASCIIEncoding benötigt, um das Byte-Array in ein String umzuwandeln und umgekehrt.
private System.Text.ASCIIEncoding encoder = new System.Text.ASCIIEncoding();

Variablen
private string szWebServiceUrl = "http://localhost/TcAdsWebService/TcAdsWebService.dll";
public string szAmsNetId = "192.168.0.2.1.1";
public int iPort = 801;
public UInt32 iIndexGroup = 0x4020;
Mehr Information zu den Themen AmsNetID, ADS Ports und Laufzeitsystemen finden Sie unter: Identifikation Ads-Gerät

Der Syntax der URL sollte dementsprechend angepasst werden, zum Beispiel:
// Beispiel 1:
TcWebService.Url = "http://192.168.0.2/TcAdsWebService/TcAdsWebService.dll";

// Beispiel 2:
TcWebService.Url = "http://CX_xxxxxx/TcAdsWebService/TcAdsWebService.dll";
Die Adresse muss die URL Ihrer TwinCAT ADS WebService-DLL-Datei angeben.

Konstruktor
Der Konstruktor public Form1() wird beim Aufruf der Windows Applikation gestartet. Hier werden die Steuerelemente mit der Methode InitializeComponent() initialisiert. Zusätzlich muss hier die Variable szWebServiceUrl, in der die Information der WebService-URL vorhanden ist, mit dem TwinCAT ADS Webservice verbunden werden:
 TcWebService.Url = szWebServiceUrl;

Methoden
Hier fehlen noch zwei Click-Methoden der Schaltflächen, in ihnen werden die Methode Read zum Lesen der SPS-Variablen und Write zum Schreiben der SPS-Variablen initialisiert. Hier werden vorher die benötigten Variablen, wie Adresse der TcAdsWebservie-URL, die Ams Net ID des Gerätes, sowie Port 801 des SPS Laufzeitsystems 1 übergeben, welche bereits definiert wurden.
//  Click-Methode für die Schaltfläche btnRead
private void btnRead_Click(object sender, System.EventArgs e)
{
    szWebServiceUrl = txtWebServiceUrl.Text;
    szAmsNetId = txtAmsNetId.Text;
    iPort = Convert.ToInt32(txtAdsPort.Text);
    Read();
}

// Click-Methode für die Schaltfläche btnWrite
private void btnWrite_Click(object sender, System.EventArgs e)
{
    szWebServiceUrl = txtWebServiceUrl.Text;
    szAmsNetId = txtAmsNetId.Text;
    iPort = Convert.ToInt32(txtAdsPort.Text);
    Write();
}
Zum Schluss muss noch dafür gesorgt werden, dass die Methode btnRead_Click und btnWrite_Click auch beim richtigen Ereignis aufgerufen werden. Dazu wechseln Sie in die Design Ansicht, markieren die Schaltfläche btnRead , klicken im Properities Window bei Events auf Click und wählen dann die Methode btnRead_Click. Gleichegilt für die Schaltfläche btnWrite mit der Methode btnWrite_Click.

Konvertieren von Variablen
Die Werte der Variablen werden als Byte-Array gelesen und geschrieben. Es ist somit erforderlich, die Werte der Variablen in Byte-Arrays und zurück konvertieren zu können.

Byte-Arrays in lesbare Variablen-Werte konvertieren
Der ausgelesene Datenpuffer aus der SPS wird wie folgt aufgeteilt: 1 Byte für PlcVarBool, 2 Bytes für PlcVarInt und 81 Bytes für PlcVarString = 84 Bytes.
byte[] abDataBuffer = new byte[84];

Das Konvertieren von Byte-Arrays in lesbare Werte der Variablen von Datentyp int und bool lässt sich mit der Klasse BitConverter realisieren. Byte-Arrays in String-Variablen werden mit der Klasse System.Text.ASCIIEncoding umgewandelt.

// Konvertiert den ersten Byte von dem Byte-Array in ein bool-Variable
bool bVarBool = BitConverter.ToBoolean(abDataBuffer,0);

// Konvertiert den zweiten und dritten Byte von dem Byte Array in int-Variable
int iVarInt = BitConverter.ToInt16(abDataBuffer,1);

// Konvertiert den anderen Byte von dem Byte Array in string-Variable
System.Text.ASCIIEncoding encoder = new System.Text.ASCIIEncoding();
string szVarString = encoder.GetString(abDataBuffer, 3, 81);

Lesbare Variablen-Werte in Byte-Arrays konvertieren
Das Konvertieren von lesbaren Werten der Variablen von Datentyp int und bool in Byte-Array lässt sich mit der Klasse BitConverter realisieren. String-Variablen in Byte-Arrays werden mit der Klasse System.Text.ASCIIEncoding umgewandelt.

// Byte-Arrays für die verschiedenen Variablen
byte[] abDataBool   = new byte[1];
byte[] abDataInt       = new byte[2];
byte[] abDataString = new byte[81];

// Konvertiert die Werte der verschiedenen Variablen in Byte-Arrays
abDataBool = BitConverter.GetBytes(bValueBool);
abDataInt = BitConverter.GetBytes((Int16)iValueInt);

System.Text.ASCIIEncoding encoder = new System.Text.ASCIIEncoding();
encoder.GetBytes(szValueString, 0, encoder.GetByteCount(szValueString), abDataString, 0);

Genauere Informationen zu diesen Methoden und Klassen finden Sie in der entsprechenden Fachliteratur zu C#.

SPS-Variablen auslesen
Zum Auslesen der SPS-Variablen benutzen Sie die Read-Methode des WebService-Objektes:
TcWebService.Read(string netId, int nPort, System.UInt32 indexGroup, System.UInt32 indexOffset, int cblen, out System.Byte[] ppData);
  • netId: String der die AMS-Net-Id angibt, auf der die SPS zu finden ist
  • nPort: Port-Nummer des Laufzeitsystems
  • indexGroup: IndexGroup der zu lesenden Variablen
  • indexOffset: Erstes Byte, das gelesen werden soll
  • cblen: Anzahl der Bytes, die gelesen werden sollen
  • ppData: Byte-Array, in das die SPS-Daten geschrieben werden sollen.
Beispiel:
TcWebService.Read("192.168.0.2.1.1", 801, 0x4020, 0, 84, out abDataBuffer);

SPS-Variablen schreiben
Zum Schreiben von SPS-Variablen benutzen Sie die Write-Methode des WebService-Objektes:
TcWebService.Write(string netId, int nPort, System.UInt32 indexGroup, System.UInt32 indexOffset, System.Byte[] pData);
  • netId: String der die AMS-Net-Id angibt, auf der die SPS zu finden ist
  • nPort: Port-Nummer des Laufzeitsystems
  • indexGroup: IndexGroup der SPS- Variablen
  • indexOffset: Erstes Byte, in das geschrieben werden soll
  • pData: Byte-Array, das die zu schreibenden Daten enthält.
Beispiel:
byte[] Data = new byte[10];
TcWebService.Write("192.168.0.2.1.1", 801, 0x4020, 0, Data);

Zusammengefasst sehen dann die Methoden Read() und Write() wie folgt aus:
private void Read()
{
    // Der ausgelesene Datenpuffer aus der SPS wird wie folgt aufgeteilt
    // 1 Byte für 'PlcVarBool',
    // 2 Bytes für 'PlcVarInt'
    // und 81 Bytes für 'PlcVarString' = 84 Bytes.
    byte[] abDataBuffer = new byte[84];

    try
    {
        TcWebService.Read(szAmsNetId, iPort, iIndexGroup, 0, 84, out abDataBuffer);

        // Konvertiert den ersten Byte von dem Byte-Array in ein bool-Variable
        bool bVarBool = BitConverter.ToBoolean(abDataBuffer,0);

        // Konvertiert den zweiten und dritten Byte von dem Byte Array in int-Variable
        int iVarInt = BitConverter.ToInt16(abDataBuffer,1);

        // Konvertiert den anderen Byte von dem Byte Array in string-Variable
        string szVarString = encoder.GetString(abDataBuffer, 3, 81);

        // schreibt die Werte in die Textfelder
        txtBool.Text = bVarBool.ToString();
        txtInt.Text = iVarInt.ToString();
        txtString.Text = szVarString;
    }
    catch (SoapException ex)
    {
        MessageBox.Show(ex.Message);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

private void Write()
{
    try
    {
        // Byte-Arrays für die verschiedenen Variablen
        byte[] abDataBool = new byte[1];
        byte[] abDataInt = new byte[2];
        byte[] abDataString = new byte[81];

        // Werte von Textfelder erhalten
        bool bValueBool = Convert.ToBoolean(txtBool.Text);
        int iValueInt = Convert.ToInt16(txtInt.Text);
        string szValueString = txtString.Text;

        // Konvertiert die Werte der verschiedenen Variablen in Byte-Arrays
        abDataBool = BitConverter.GetBytes(bValueBool);
        abDataInt = BitConverter.GetBytes((Int16)iValueInt);

        encoder.GetBytes(szValueString,			// Source
                            0,				// Position of the first character to convert
                            encoder.GetByteCount(szValueString),// Gets the length of the source
                            abDataString,			// Byte-array to save the conversion
                            0);				// First byte in the array to save the conversion

        // Schreibt die Werte in SPS
        TcWebService.Write(szAmsNetId, iPort, iIndexGroup, 0, abDataBool);
        TcWebService.Write(szAmsNetId, iPort, iIndexGroup, 1, abDataInt);
        TcWebService.Write(szAmsNetId, iPort, iIndexGroup, 3, abDataString);
    }
    catch (SoapException ex)
    {
        MessageBox.Show(ex.Message);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

5. SPS-Programm, IEC1131 Variablendeklaration

PROGRAM MAIN
VAR
    PlcVarBool	AT %MX0.0	: BOOL := TRUE;
    PlcVarInt 	AT %MW1	: INT := 1234;
    PlcVarString	AT %MD3	: STRING := 'Hallo Automation';
END_VAR

6. C#-Applikation, das Layout :

7. C# Applikation und SPS Quelltext Download:

Sprache / IDE | Beispielprogram auspacken
Visual C# | Sample01.exe


TwinCAT ADS Web Service: C++-Beispiel

Consumer in C++ zum Lesen und Schreiben von SPS-Variablen

In diesem Beispiel wird erklärt, wie ein ADS-WebService-Consumer zum Lesen und Schreiben von SPS-Variablen via ADS-HTTP erstellt wird.
Zunächst müssen Sie das Beispielprogramm 'WebServiceTestConsumer (C++)' entpacken.

1. Erstellen eines WebService-Consumers mit Hilfe des Microsoft VisualStudio 6.0

Erstellen Sie mit Hilfe des MFC-AppWizards ein neues Projekt.
Kopieren Sie die in der 'WebServiceSampleCPP.zip' enthaltenen Dateien 'WebServiceConnector.cpp', 'WebServiceConnector.h', 'Base64.cpp' und 'Base64.h' in das Projektverzeichnis und fügen Sie diese dem Projekt hinzu.
Fügen Sie folgende Zeile in die Datei ein, in der Sie den Webservice verwenden wollen:
#include "WebServiceConnector.h"

Bevor Sie Daten lesen oder schreiben können, müssen Sie ein Objekt erstellen und sich mit dem WebService verbinden:
CWebServiceConnector webServiceConnector;
webServiceConnector.Connect("http://192.168.0.2/TcAdsWebService/TcAdsWebService.dll");

2. SPS-Variablen auslesen

Zum Auslesen der SPS-Variablen benutzen Sie eine der "Read"-Funktionen der WebServiceConnector-Klasse:
HRESULT Read(char* netId, int port, ULONG indexGroup, ULONG indexOffset, ULONG* pcbData, BYTE* pData);

  • netId: String, der die AMS-Net-Id angibt, auf der die SPS zu finden ist
  • port: Port-Nummer des Laufzeitsystems
  • indexGroup: IndexGroup der zu lesenden Variablen
  • indexOffset: Erstes Byte, das gelesen werden soll
  • cblen: Anzahl der Bytes, die gelesen werden sollen
  • pData: Byte-Array, in das die SPS-Daten geschrieben werden sollen.
  • return value: Errorcode

Die drei Methoden übernehmen das Konvertieren der Ausgangsvariablen in den entsprechenden Typ:
HRESULT ReadInt (char* netId, int port, ULONG indexGroup, ULONG indexOffset, ULONG cblen, int& ret);
HRESULT ReadBool (char* netId, int port, ULONG indexGroup, ULONG indexOffset, ULONG cblen, bool& ret);
HRESULT ReadString (char* netId, int port, ULONG indexGroup, ULONG indexOffset, ULONG cblen, CString& ret);

Beispiel:
bool Boolean;
if (webServiceConnector.ReadBool("192.168.0.2.1.1", 801, 16416, 0, 1, Boolean)!=S_OK)
            MessageBox("Fehler");

3. SPS-Variablen schreiben

HRESULT Write(char* netId, int port, ULONG indexGroup, ULONG indexOffset, ULONG cblen, BYTE* pData);

  • netId: String der die AMS-Net-Id angibt, auf der die SPS zu finden ist
  • port: Port-Nummer des Laufzeitsystems
  • indexGroup: IndexGroup der SPS- Variablen
  • indexOffset: Erstes Byte, in das geschrieben werden soll
  • pData: Byte-Array, das die zu schreibenden Daten enthält
  • return value: Errorcode

Die drei Methoden übernehmen das Konvertieren der Eingangsvariablen in einen ByteArray:
HRESULT WriteInt(char* netId, int port, ULONG indexGroup, ULONG indexOffset, ULONG cblen, int Value);
HRESULT WriteBool(char* netId, int port, ULONG indexGroup, ULONG indexOffset, ULONG cblen, bool Value);
HRESULT WriteString(char* netId, int port, ULONG indexGroup, ULONG indexOffset, ULONG cblen, CString Value);

Beispiel:
if (webServiceConnector.WriteBool("192.168.0.2.1.1", 801, 16416, 0, 1, true)!=S_OK)
            MessageBox("Fehler");

4. Errorcodes

S_OK - kein Fehler
E_NO_CON - Nicht mit dem WebService verbunden
E_SEND - kann nicht zum WebService senden
E_RESPONSE - unbekannte Antwort vom WebService
E_FAILED - unbekannter Fehler

5. SPS-Programm, IEC1131 Variablendeklaration

PROGRAM MAIN
VAR
    PlcVarBool    AT %MX0.0  : BOOL := TRUE;
    PlcVarInt     AT %MW1    : INT := 1234;
    PlcVarString  AT %MD3    : STRING := 'Hallo Automation';
END_VAR

6. C++ Applikation, das Layout:

7. C++ Applikation, der Quelltext:

void CWebServiceTestConsumerDlg::OnRead()
{
    CWebServiceConnector webServiceConnector;
    webServiceConnector.Connect(WebServiceURL);
    if (webServiceConnector.IsConnected())
    {
        int Integer;
        bool Boolean;
        CString String;

        int port = 801;
        int group = 16416;
        unsigned long size;
        int offset;

        /* read bool */
        size = 1;
        offset = 0;
        if (webServiceConnector.ReadBool(WebServiceNetId,port,group,offset,size,Boolean) == S_OK)
        {
            m_boolean = Boolean;
        }
        else
        {
            MessageBox("Error");
            return;
        }

        /* read int */
        size = 2;
        offset = 1;
        if (webServiceConnector.ReadInt(WebServiceNetId,port,group,offset,size,Integer) == S_OK)
        {
            m_integer = Integer;
        }
        else
        {
            MessageBox("Error");
            return;
        }

        /* read string */
        size = 81;
        offset = 3;
        if (webServiceConnector.ReadString(WebServiceNetId,port,group,offset,size,String) == S_OK)
        {
            m_string = String;
        }
        else
        {
            MessageBox("Error");
            return;
        }
        UpdateData(false);
    }
    else MessageBox("Error");
}

void CWebServiceTestConsumerDlg::OnWrite()
{
    CWebServiceConnector webServiceConnector;
    webServiceConnector.Connect(WebServiceURL);
    if (webServiceConnector.IsConnected())
    {
        UpdateData(true);

        int port = 801;
        int group = 16416;
        int offset;
        unsigned long size;

        /* write boolean */
        size = 1;
        offset = 0;
        bool boolean = false;
        if (m_boolean==1)
            boolean = true;
        if (webServiceConnector.WriteBool(WebServiceNetId,port,group,offset,size,boolean)!=S_OK)
            MessageBox("Error");

        /* write integer */
        size = 2;
        offset = 1;

        if (webServiceConnector.WriteInt(WebServiceNetId,port,group,offset,size,m_integer)!=S_OK)
            MessageBox("Error");

        /* write string */
        size = 81;
        offset = 3;

        if (webServiceConnector.WriteString(WebServiceNetId,port,group,offset,size,m_string)!=S_OK)
            MessageBox("Error");
    }
    else MessageBox("Error");
}

8. C++ Applikation, der Download:

WebServiceSampleCPP.zip


TwinCAT ADS Web Service: Java-Beispiel

Consumer in Java zum Lesen und Schreiben von SPS-Variablen

In diesem Beispiel wird erklärt, wie ein ADS-WebService-Consumer zum Lesen und Schreiben von SPS-Variablen via ADS-HTTP erstellt wird.
Zuerst müssen Sie das Beispielprogramm AdsWebServiceSampleJava.zip entpacken.

1. Erstellen eines WebService-Consumers

Kopieren Sie die Dateien TcAdsSOAP.java und Base64.java in den Ordner Ihrer Java Datei.
Fügen Sie folgende Zeile in die Java Datei ein, in der Sie den WebService verwenden wollen:

TcAdsSOAP tcSoap = new TcAdsSOAP("http://172.16.6.241/TcAdsWebService/TcAdsWebService.dll");

2. SPS-Variablen auslesen

Zum Auslesen der SPS-Variablen benutzen Sie eine der folgenden Funktionen der TcAdsSOAP Klasse:
DataInputStream SOAPCall(String netId, int port, long indexGroup, long indexOffset, int cblen)

  • netId: String, der die AMS-Net-Id angibt, auf der die SPS zu finden ist
  • port: Port-Nummer des Laufzeitsystems
  • indexGroup: IndexGroup der zu lesenden Variablen
  • indexOffset: Erstes Byte, das gelesen werden soll
  • cblen: Anzahl der Bytes, die gelesen werden sollen
  • return value: DataInputStream mit den gelesenen Daten, throws Exception bei Fehlschlag

Die drei Methoden übernehmen das Konvertieren der Ausgangsvariablen in den entsprechenden Typ:
short ReadInt(String netId, int port, long indexGroup, long indexOffset)
boolean ReadBool(String netId, int port, long indexGroup, long indexOffset)
String ReadString(String netId, int port, long indexGroup, long indexOffset, int cblen)

Beispiel:
boolean Bool1;
try
{
    Bool1 = tcSoap.ReadBool("192.168.0.2.1.1", 801, 16416, 0)
}
catch (Exception e)
{
    System.out.println("Error");
}

3. SPS-Variablen schreiben

boolean SOAPWrite(String netId, int port, long indexGroup, long indexOffset, byte[] pData)

  • netId: String, der die AMS-Net-Id angibt, auf der die SPS zu finden ist
  • port: Port-Nummer des Laufzeitsystems
  • indexGroup: IndexGroup der SPS- Variablen
  • indexOffset: Erstes Byte, in das geschrieben werden soll
  • pData: Byte-Array, dass die zu schreibenden Daten enthält.
  • return value: true bei Erfolg, throws Exception bei Fehlschlag

Die drei Methoden übernehmen das Konvertieren der Eingangsvariablen in einen ByteArray:
boolean WriteBool(String netId, int port, long indexGroup, long indexOffset, boolean pData)
boolean WriteInt(String netId, int port, long indexGroup, long indexOffset, int pData)
boolean WriteString(String netId, int port, long indexGroup, long indexOffset,String pData)

Beispiel:
try
{
    tcSoap.WriteBool("192.168.0.2.1.1", 801, 16416, true)
}
catch (Exception e)
{
    System.out.println("Error");
}

4. SPS-Programm, Variablendeklaration

PROGRAM MAIN
VAR
    PlcVarBool    AT %MX0.0  : BOOL := TRUE;
    PlcVarInt     AT %MW1    : INT := 1234;
    PlcVarString  AT %MD3    : STRING := 'Hello Automation';
END_VAR

5. Java Applikation, der Quelltext:

public class AdsWebServiceSample
{
    public static void main(String args[])
    {
        TcAdsSOAP tcSoap = new TcAdsSOAP("http://172.16.6.241/TcAdsWebService/TcAdsWebService.dll");
        try
        {
            String netId = "192.168.0.2.1.1";
            int port = 801;
            int offset = 16416;

            /* write bool */
            boolean testBool = true;
            if (tcSoap.WriteBool(netId,port,offset,0,testBool))
                System.out.println("Boolean "+testBool+" Written");

            /* write int */
            int testInt = 1234;
            if (tcSoap.WriteInt(netId,port,offset,1,testInt))
                System.out.println("Integer "+testInt+" Written");

            /* write string */
            String testString = "Hello Automation";
            if (tcSoap.WriteString(netId,port,offset,3,testString))
                System.out.println("String "+testString+" Written");

            /* read bool */
            System.out.println(String.valueOf(tcSoap.ReadBool(netId,port,offset,0) ));

            /* read int */
            System.out.println(String.valueOf(tcSoap.ReadInt(netId,port,offset,1) ));

            /* read string */
            System.out.println(tcSoap.ReadString(netId,port,offset,3,81));
        }
        catch(Exception ex)
        {
            System.out.println(String.valueOf(ex));
        }
    }
}

5. Java Applikation, der Download:

WebServiceSampleJava.zip


TwinCAT ADS Web Service: ASP.NET 2.0 AJAX Extensions Beispiel

TwinCAT ADS Web Service: ASP.NET 2.0 AJAX Beispiel

ASP.NET 2.0 AJAX Extensions

Microsoft ASP.NET 2.0 AJAX Extensions ist der neue Name für die ASP.NET Technologie „Atlas“.

Anforderungen

  • Betriebssysteme : Windows Server 2003; Windows Vista; Windows XP
  • Software:
    • Microsoft .NET Framework Version 2.0
      Link: http://msdn.microsoft.com/netframework/downloads/updates/default.aspx
    • Microsoft Internet Explorer 5.01 (oder höher)
    • Visual Studio 2005
    • Framework "ASP.NET 2.0 AJAX Extensions" (kostenlos)
      Link : http://ajax.asp.net/
    • Download - Microsoft ASP.NET AJAX

Erstellen einer AJAX-Webseite mit Hilfe des Microsoft Visual Studio 2005

1. Neues Projekt erstellen:

Wählen Sie in Visual Studio 2005 unter File , New die Option Website.. aus.
Bei den Vorlagen (Templates) die Auswahl ASP.NET AJAX-Enabled Web Site wählen.
Auswahl der Implementationssprache : hier Visual C#

Erstelle eine neue 'ASP.NET AJAX-Enabled Web Seite'

2. Referenz hinzufügen:

Die Referenz von TwinCAT.Ads.dll zu VS2005 anhängen -> Menu -> Website -> Add Reference....
Der vorgegebene Installationsordner für .NET Framework 2.0 von TwinCAT.Ads.dll ist C:\TwinCAT\ADS Api\.NET\v2.0.50727\TwinCAT.ADS.dll
Bitte stets mit den aktuellsten Versionen arbeiten.

3. AJAX Komponenten hinzufügen:

Zwei Komponenten aus der Toolbox hinzufügen : Den Timer und das UpdatePanel von AJAX Extensions zu der Webdatei 'Default.aspx' anfügen

AJAX Extensions

4. Properties bearbeiten:

Ändern Sie den Interval des Timer1:
Interval = "3000"

Ändern Die den 'UpdateMode' des UpdatePanel1:
UpdateMode = "Conditional"

5. SPS Variablen auslesen:

Implementation der Methode "TcAdsClient.Read()", um die Variablen von der ADS Hardware zu lesen.
In diesem Beispiel werden die Daten synchron aus der SPS ausgelesen.
TcAdsClient.Read(int indexGroup, int indexOffset, AdsStream dataStream, int offset, int length);

Parameter:

  • indexGroup: - Enthält die Index Group Nummer des angeforderten ADS services.
  • indexOffset: - Enthält die Index Offset Nummer des angeforderten ADS services.
  • dataStream: - Datenstrom, der die Daten empfängt.
  • offset: - Offset der Daten im dataStream.
  • length: - Länge der Daten im dataStream.

6. ASP.NET 2.0 AJAX Beispiel 01

Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>ASP.NET 2.0 AJAX Beispiel 01</title>
</head>
<body>
    <form id="form1" method="post" runat="server">
        <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <asp:Timer ID="Timer1" runat="server" Interval="3000" OnTick="Timer1_Tick">
            </asp:Timer>

            <!-- ASP.NET AJAX UpdatePanel1 - Nur der Inhalt in diesem Panel wird aktualisiert. -->
            <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"
                <ContentTemplate>

                    UpdatePanel Inhalt aktualisiert um <%=DateTime.Now.ToString() %>

                    <asp:Label ID="lblPlcVarBool01" runat="server" Text="PlcVarBool:"
                    Style="z-index: 101; left: 10px; position: absolute; top: 50px"></asp:Label>
                    <asp:Label ID="lblPlcVarBool02" runat="server" Text="-" BackColor="Black" ForeColor="White"
                    Style="z-index: 101; left: 100px; position: absolute; top: 50px"></asp:Label>

                    <asp:Label ID="lblPlcVarInt01" runat="server" Text="PlcVarInt:"
                    Style="z-index: 101; left: 10px; position: absolute; top: 100px"></asp:Label>
                    <asp:Label ID="lblPlcVarInt02" runat="server" Text="-" BackColor="Black" ForeColor="White"
                    Style="z-index: 101; left: 100px; position: absolute; top: 100px"></asp:Label>

                    <asp:Label ID="lblMessage01" runat="server" Text="Message:"
                    Style="z-index: 101; left: 10px; position: absolute; top: 200px"></asp:Label>
                    <asp:Label ID="lblMessage02" runat="server" Text="-"
                    Style="z-index: 101; left: 100px; position: absolute; top: 200px"></asp:Label>

                    <asp:Button ID="btnRefreshAll" runat="server" Text="Refresh All" Width="160px" OnClick="btnRefreshAll_Click"
                    Style="z-index: 201; left: 207px; position: absolute; top: 250px"/>

                    <asp:Label ID="lblPlcVarString01" runat="server" Text="PlcVarString:"
                    Style="z-index: 101; left: 10px; position: absolute; top: 150px"></asp:Label>
                    <asp:Label ID="lblPlcVarString02" runat="server" Text="-" BackColor="Black" ForeColor="White"
                    Style="z-index: 101; left: 100px; position: absolute; top: 150px"></asp:Label>

                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="Timer1" />
                </Triggers>
            </asp:UpdatePanel>
        </div>
    </form>
</body>
</html>

Default.aspx.cs

ACHTUNG: Die Parameter AMS NET ID und AdsServerPort sind an die lokalen Anforderungen anzupassen.

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using TwinCAT.Ads;
using System.IO;

public partial class _Default : System.Web.UI.Page
{
    // ADS Kommunication mit ADS Hardware
    TcAdsClient tcAds = new TcAdsClient();

    // AMS NET ID <- Ändere den AMS NET ID für die TWINCAT Konfiguration
    string strAmsNetId = "192.168.0.2.1.1";

    // AMS Port (801, 811, 821, 831) <- Ändere den AMS Port für die TWINCAT Konfiguration
    int iAdsServerPort = 801;
    //...
Mehr Information zu den Themen AmsNetID, ADS Ports und Laufzeitsystemen finden Sie unter: Identifikation Ads-Gerät
    //...
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public void RemoteStatusRead()
    {
        try
        {
            tcAds.Connect(strAmsNetId, iAdsServerPort);
            tcAds.Timeout = 200;

            AdsStream dataStream = new AdsStream(171);
            BinaryReader binRead = new BinaryReader(dataStream);

            //	bool Variable mit IndexGroup and IndexOffset lesen
            tcAds.Read(16417, 0, dataStream, 0, 1);
            // int Variable mit IndexGroup and IndexOffset lesen
            tcAds.Read(16416, 1, dataStream, 1, 2);
            // string Variable mit IndexGroup and IndexOffset lesen
            tcAds.Read(16416, 5, dataStream, 3, 168);

            bool bVarBool = false;
            byte b = binRead.ReadByte();
            if (b == 0) bVarBool = false;
            else bVarBool = true;

            if (bVarBool == true)
            {
                lblPlcVarBool02.Text = "TRUE";
                lblPlcVarBool02.BackColor = Color.Blue;
                lblPlcVarBool02.ForeColor = Color.White;
            }
            else
            {
                lblPlcVarBool02.Text = "FALSE";
                lblPlcVarBool02.BackColor = Color.Black;
                lblPlcVarBool02.ForeColor = Color.White;
            }

            int iData = 0;
            iData = binRead.ReadByte();

            if (iData != 0)
            {
                lblPlcVarInt02.Text = iData.ToString();
            }
            else
            {
                lblPlcVarInt02.Text = "-";
            }

            char [] strData = new char[160];
            strData = binRead.ReadChars(160);

            if (strData != null)
            {
                lblPlcVarString02.Text = "";
                for (int i = 1; i < 160; i++)
                {
                    lblPlcVarString02.Text += strData[i];
                }
            }
            else
            {
                lblPlcVarString02.Text = "-";
            }
            lblMessage02.Text = "";
        }
        catch(Exception ex)
        {
            lblMessage02.Text = ex.Message;
        }
    }

   protected void btnRefreshAll_Click(object sender, EventArgs e)
    {
        RemoteStatusRead();

        // Inhalt des UpdatePanel1 aktualisieren
        UpdatePanel1.Update();
    }

    protected void Timer1_Tick(object sender, EventArgs e)
    {
        RemoteStatusRead();

        // Inhalt des UpdatePanel1 aktualisieren
        UpdatePanel1.Update();
    }
}

7. SPS Beispiel

PROGRAM MAIN
VAR
    PlcVarBool    AT %MX0.0  : BOOL := TRUE;
    PlcVarInt     AT %MW1    : INT := 0;
    PlcVarIntMax  AT %MW3    : INT := 1000;
    PlcVarString  AT %MD5    : STRING(20);
    TON1: TON;
    bool1: BOOL;
    time1: TIME;
END_VAR

PlcVarInt := PlcVarInt + 1;
IF PlcVarInt > PlcVarIntMax THEN
    PlcVarInt := 0;
    PlcVarBool := NOT PlcVarBool;
END_IF

TON1(IN:=TRUE , PT:=t#5m , Q=>bool1 , ET=>time1 );
IF bool1 THEN
TON1(IN:=FALSE , PT:= , Q=> , ET=> );
END_IF

PlcVarString := TIME_TO_STRING(time1);

8. Download Beipiele

SPS Beispiel
ASP.NET 2.0 AJAX - C# Beispiel 01
ASP.NET 2.0 AJAX - C# Beispiel 02

9 . Konfiguration vom Microsoft Internet Information Services (IIS)

Starten sie die Konfigurationsoberfläche mit

  • Start -> Control Panel(Systemsteuerung) -> Administrative Tools (Verwaltung) -> Internet Information Services
  • Per "rechter Mausklick" wird ein neuer virtueller Ordner für eine neue Webseite eingerichtet
    IIS -> (local computer) -> Web Sites -> Default Web Sites -> New -> Virtual Directory...

Einstellungen des IIS:
  • Alias: AjaxSample01
  • Directory: C:\Projects\WebSites\AJAXEnabledWebSite1
  • Access Permission: Anwahl der Optionen "Read", "Run scripts" und "Execute"
  • Achtung : Nach Auswahl des erstellten virtuellen Ordner "AjaxSample01" muss dort die IIS Einstellung "ASP.NET" der Webseite zu Version 2.0 vorgenommen werden.

10. Demo der AJAX Webseite im Microsoft IE

AJAX Website with Internet Explorer 7

Die neue Seite kann nun durch Öffnen der "Default.aspx" Webseite im IIS gestartet werden.
Alternativ kann die Seite per http://localhost/AjaxSample01/Default.aspx auf dem lokalen Computer mit dem Internet Explorer geöffnet werden.

Von anderen Computern im Netzwerk können Sie die Seite per http://<ip-vom-PC>/AjaxSample01/Default.aspx starten.

Hinweis: Diese Beispiel kann nur bei Zugriff von einem User mit einer Instanz verwendet werden.


TwinCAT ADS Web Service: Delphi 8 .NET Beispiel

TwinCAT ADS Web Service: Delphi Beispiel

Consumer in Delphi 8 for .NET zum Lesen und Schreiben von SPS-Variablen

In diesem Beispiel wird erklärt, wie ein ADS-WebService-Consumer zum Lesen und Schreiben von SPS-Variablen via ADS-HTTP erstellt wird.

Voraussetzungen:

  • Delphi 8 für Microsoft .NET Framework;
  • Webservice Consumer für Windows XP-Plattform (Windows Forms .NET Application);
  • Webservice Server wurde auf einem Embeded PC: CX9000 mit Windows CE (ARM) konfiguriert.

Import in Delphi

Die Schnittstellenbeschreibung des Servers wird in einer WSDL-Datei (Web Service Definition Language) veröffentlicht. Die WSDL-Beschreibung wird in Delphi importiert und von Delphi in Delphi-Units konvertiert.

Erstellen Sie als erstes ein neues Projekt (Windows Forms-Anwendung Delphi .NET). Speichern Sie das Projekt. Als nächstes können Sie die WSDL-Datei importieren. Klicken Sie im Projektmanager mit der rechten Maustaste auf den Projektnamen und wählen "Webreferenz hinzufügen" aus.

Es erscheint ein Dialog mit Webservice-Verzeichnissen von IBM, Microsoft usw. Wir wollen aber die WSDL-Datei vom Datenträger öffnen.

Die WSDL-Dateien vom TwinCAT ADS Webservice finden Sie im Ordner: ..TwinCAT\Ads API\TcAdsWebService\V100\... Navigieren Sie in den entsprechenden Ordner und wählen sie die WSDL-Datei aus. In userem Fall ist es die WSDL-Datei aus dem Ordner für die Windows CE (ARM) Zielplattform.

Hinweis:

Es gibt keine Unterschiede bei den WSDL-Dateien für die XP/CE (X86 oder ARM) Plattform. D.h. es handelt sich überal um die gleiche WSDL-Datei. Sie können die WSDL-Datei aus dem CE/ARM-Ordner in Ihr Consumer-Projekt einbinden und trotzdem mit einem ADS WebService-Server auf einer XP-Plattform kommunizieren.

Der Inhalt der WSDL-Datei wird in einem Dialogfenster angezeigt.

Wählen Sie "Webreferenz hinzufügen" aus. Die benötigten Units werden automatisch generiert und zum Projekt hinzugefügt.

Webservice verwenden

Um den Webservice verwenden zu können müssen Sie die Webservice-Unit in die Unit des Hauptfensters einbinden. Bei der Gelegenheit können Sie gleich noch zwei weitere Units einbinden die Sie später in Ihrem Projekt benötigen werden einbinden: System.Text und System.Web.Services.Protocols

uses
System.Drawing, System.Collections, System.ComponentModel,
System.Windows.Forms, System.Data, WebReference.TcAdsWebService, System.Text,
System.Web.Services.Protocols;

Jetzt können Sie eine ADS Webservice-Instanz erzeugen.

 private
{ Private Declarations }
TcWebService : WebReference.TcAdsWebService.TcAdsWebService;

Und im Konstruktor von TWinForm:

TcWebService := WebReference.TcAdsWebService.TcAdsWebService.Create();

Die Codevervollständigung hilft Ihnen weiter. Tippen Sie TcWebService mit einem Punkt ein und sehen Sie sich die zur Verfügung stehenden Methoden an.

Wir benutzen in unserem Beispiel folgende Methoden:

  • Read zum Lesen der SPS-Variablen;
  • Write zum Schreiben der SPS-Variablen;
  • ReadState zum Lesen des SPS-Server-Status;
  • WriteControl zum Ändern des SPS-Server-Status;
type TArrayOfByte = array of Byte;

procedure Read(netId: string; nPort: Integer; indexGroup: Cardinal; indexOffset: Cardinal; cbLen: Integer; out ppData: TArrayOfByte);
procedure Write(netId: string; nPort: Integer; indexGroup: Cardinal; indexOffset: Cardinal; pData: TArrayOfByte);
procedure ReadState(netId: string; nPort: Integer; out pAdsState: Integer; out pDeviceState: Integer);
procedure WriteControl(netId: string; nPort: Integer; adsState: Integer; deviceState: Integer; pData: TArrayOfByte);

netId: String mit der Netzwerkadresse des TwinCAT Zielsystems. In unserem Fall die TwinCAT AMS NetID des PC's mit dem SPS-Laufzeitsystem;

nPort: TwinCAT ADS Port-Nummer des SPS-Laufzeitsystems;

indexGroup: Index-Group der zu lesenden SPS-Variablen;

indexOffset: Index-Offset (Byte-/Bit-Offset) der der SPS-Variablen die gelesen werden soll;

cbLen: Anzahl der Bytes, die gelesen werden sollen;

ppData: Variable in die die gelesenen Daten gespeichert werden (dynamisches Byte-Array);

pData: Variable mit den zu schreibenden Daten (dynamisches Array);

adsState / pAdsState: PLC Serverstatus.

deviceState / pDeviceState: PLC Gerätestatus;

Die SPS Applikation

PROGRAM MAIN
VAR
    VarBool		AT %MX0.0:	BOOL := TRUE;
    VarInt		AT %MB1:	INT := 123;
    VarString	AT %MB3:	STRING := 'Hello Automation';
END_VAR

SPS-Variablen auslesen

procedure TWinForm.ReadData();
var cbLen, nIG, nIO   : Integer;
    data    : TArrayOfByte;
begin
  try
    // read BOOL at adress AT%MX0.0
    nIG   := $4021;
    nIO   := 0;
    cbLen := SizeOf(varBool);
    TcWebService.Read( sNetID, iPort, nIG, nIO, cbLen, data );
    varBool         := BitConverter.ToBoolean(data, 0);
    // read INT at adress AT%MB1
    nIG   := $4020;
    nIO   := 1;
    cbLen := SizeOf(varInt);
    TcWebService.Read( sNetID, iPort, nIG, nIO, cbLen, data );
    varInt          := BitConverter.ToInt16(data, 0);
    // read STRING at adress AT%MB3
    nIG   := $4020;
    nIO   := 3;
    cbLen := 81;
    TcWebService.Read( sNetID, iPort, nIG, nIO, cbLen, data );
    varString := System.Text.Encoding.Default.GetString(data,0, Length(data));
  except
    On E:SoapException do
      HandleSoapException(E.Message, E.HelpLink, E.Detail.InnerText);
  end;
end;

SPS Variablen schreiben

procedure TWinForm.WriteData();
var data    : TArrayOfByte;
    cbLen, nIG, nIO : Integer;
begin
  try
    // write BOOL at adress AT%MX0.0
    nIG   := $4021;
    nIO   := 0;
    data  := BitConverter.GetBytes(varBool);
    TcWebService.Write( sNetID, iPort, nIG, nIO, data );
    // write INT at adress AT%MB1
    nIG   := $4020;
    nIO   := 1;
    data  := BitConverter.GetBytes(varInt);
    TcWebService.Write( sNetID, iPort, nIG, nIO, data );
    // write STRING at adress AT%MB3
    nIG   := $4020;
    nIO   := 3;
    cbLen := System.Text.Encoding.Default.GetByteCount(varString);
    // Allocate one byte more! We need it to write the string end delimiter!.
    SetLength(data, cbLen + 1);
    System.Text.Encoding.Default.GetBytes( varString, 0, cbLen, data, 0);
    data[cbLen] := 0;
    TcWebService.Write( sNetID, iPort, nIG, nIO, data );
  except
    On E:SoapException do
      HandleSoapException(E.Message, E.HelpLink, E.Detail.InnerText);
  end;
end;

SPS Status lesen

procedure TWinForm.ReadState();
var adsState, deviceState : Integer;
sState : String;
begin
  try
    TcWebService.ReadState( sNetID, iPort, adsState, deviceState );
    case adsState of
      PLC_ADSSTATE_RUN:
        sState := 'RUN';
      PLC_ADSSTATE_STOP:
        sState := 'STOP';
    else
      sState := 'OTHER';
    end;
    StatusBar1.Panels.Item[0].Text := 'PLC server state: ' + sState;
  except
    On E:SoapException do
      HandleSoapException(E.Message, E.HelpLink, E.Detail.InnerText);
  end;
end;

SPS Starten/Stoppen

procedure TWinForm.WriteControl(adsState : Integer);
begin
  try
    TcWebService.WriteControl( sNetID, iPort, adsState, 0, nil );
  except
    On E:SoapException do
      HandleSoapException(E.Message, E.HelpLink, E.Detail.InnerText);
  end;
end;

Language / IDE | Extract the sample program
Delphi 8 for .NET | Sample01.exe


Hinweise zur Dokumentation

Diese Beschreibung wendet sich ausschließlich an ausgebildetes Fachpersonal der Steuerungs- und Automatisierungstechnik, das mit den geltenden nationalen Normen vertraut ist.
Zur Installation und Inbetriebnahme der Komponenten ist die Beachtung der Dokumentation und der nachfolgenden Hinweise und Erklärungen unbedingt notwendig.
Das Fachpersonal ist verpflichtet, für jede Installation und Inbetriebnahme die zu dem Zeitpunkt veröffentlichte Dokumentation zu verwenden.

Das Fachpersonal hat sicherzustellen, dass die Anwendung bzw. der Einsatz der beschriebenen Produkte alle Sicherheitsanforderungen, einschließlich sämtlicher anwendbaren Gesetze, Vorschriften, Bestimmungen und Normen erfüllt.

Disclaimer

Diese Dokumentation wurde sorgfältig erstellt. Die beschriebenen Produkte werden jedoch ständig weiter entwickelt.
Wir behalten uns das Recht vor, die Dokumentation jederzeit und ohne Ankündigung zu überarbeiten und zu ändern.
Aus den Angaben, Abbildungen und Beschreibungen in dieser Dokumentation können keine Ansprüche auf Änderung bereits gelieferter Produkte geltend gemacht werden.

Marken

Beckhoff®, TwinCAT®, EtherCAT®, EtherCAT G®, EtherCAT G10®, EtherCAT P®, Safety over EtherCAT®, TwinSAFE®, XFC®, XTS® und XPlanar® sind eingetragene und lizenzierte Marken der Beckhoff Automation GmbH.
Die Verwendung anderer in dieser Dokumentation enthaltenen Marken oder Kennzeichen durch Dritte kann zu einer Verletzung von Rechten der Inhaber der entsprechenden Bezeichnungen führen.

Patente

Die EtherCAT Technologie ist patentrechtlich geschützt, insbesondere durch folgende Anmeldungen und Patente:
EP1590927, EP1789857, EP1456722, EP2137893, DE102015105702
mit den entsprechenden Anmeldungen und Eintragungen in verschiedenen anderen Ländern.

EtherCAT® ist eine eingetragene Marke und patentierte Technologie lizenziert durch die Beckhoff Automation GmbH, Deutschland.

Copyright

© Beckhoff Automation GmbH & Co. KG, Deutschland.
Weitergabe sowie Vervielfältigung dieses Dokuments, Verwertung und Mitteilung seines Inhalts sind verboten, soweit nicht ausdrücklich gestattet.
Zuwiderhandlungen verpflichten zu Schadenersatz. Alle Rechte für den Fall der Patent-, Gebrauchsmuster- oder Geschmacksmustereintragung vorbehalten.


Beckhoff Information System - German

TwinCAT ADS Web Service: JavaScript Beispiel

Consumer in JavaScript zum Lesen und Schreiben von SPS-Variablen

In diesem Beispiel wird erklärt, wie ein ADS-WebService-Consumer zum Lesen und Schreiben von SPS-Variablen via ADS-HTTP erstellt wird.

Zuerst müssen Sie das Beispielprogramm WebServiceSampleJavaScript.zip entpacken.

1. Erstellen eines WebService-Consumers

Dieses Beispiel verwendet das XMLHttpRequest Objekt, welches die Kommunikation via SOAP Requests mit dem AdsWebService ermöglicht.
Kopieren Sie die Dateien index.html und xmlhttp.js in den Ordner des AdsWebService (um einen AdsWebService zu erstellen, schauen Sie hier).
Ändern Sie Host Adresse in den Variablen url, netId und port:
// The URL to your TcAdsWebService WebService
var url = "http://172.16.10.195/TcAdsWebService/TcAdsWebService.dll";
// Your local AmsNetId
var netId = "172.16.4.220.1.1";
// Your current PLCs runtime
var port = 801;
Der Wert des Refresh Timers kann ebenfalls geändert werden.

2. SPS-Variablen auslesen

Zum Auslesen der SPS Variablen verwenden Sie eine der folgenden Funktionen:
Read (netId, nPort, indexGroup, indexOffset, cbLen)

  • netId: String, der die AMS-Net-Id angibt, auf der die SPS zu finden ist
  • nPort: Port-Nummer des Laufzeitsystems
  • indexGroup: IndexGroup der zu lesenden Variablen
  • indexOffset: Erstes Byte, das gelesen werden soll
  • cbLen: Anzahl der Bytes, die gelesen werden sollen

Das Resultat der Read Funktion muss in der processReqChange () Funktion verarbeitet werden.
Die zwei Funktionen wandeln die ppData Werte um, die zur processReqChange() Funktion in ihre entsprechende Art zurückgebracht werden:
toString(string)
toInt(string)

Nicht vergessen, b64t2d(string) zu verwenden, um die Zeichenkette zu decodieren, bevor Sie es verwenden.
Um einen bool-Wert zu konvertieren, überprüfen Sie ob der char-Wert '0' an der Position 0 vorhanden ist.
result = (data.charCodeAt(0)!='0');

Beispiel:
// Decode result string
data = b64t2d(data);

// First byte: Status (boolean)
bool = (data.charCodeAt(0) != '0');

// Second and third byte: Value (int)
integer = toInt(data.substr(1, 2));

// Fourth and fifth byte: MaxValue (int)
max = toInt(data.substr(3, 2));

// 5-86 byte: Time (string)
time = toString(data.substr(5, 81));

3. SPS Variablen schreiben

Write (netId, nPort, indexGroup, indexOffset, cbWrLen, pwrData, type)
  • netId: String, der die AMS-Net-Id angibt, auf der die SPS zu finden ist
  • nPort: Port-Nummer des Laufzeitsystems
  • indexGroup: IndexGroup der SPS- Variablen
  • indexOffset: Erstes Byte, in das geschrieben werden soll
  • cbWrLen: Anzahl der Bytes, die geschrieben werden sollen
  • pwrData: Array rray , das die zu schreibenden Daten enthält
  • type: "bool", "int" oder "string"

Beispiel:

Bei einem Klick auf den Button wird der Wert aus dem <Input>-Tag mit dem Namen "input_max" von der Website ausgelesen und in einen Integer konvertiert. Danach wird er als 'int' an die gegebene Adresse geschrieben.

<input type="submit" size="5" name="submit" value="Change" onclick="Write(netId, port, '16416', '3', '2', parseInt(document.all['input_max'].value), 'int')" />

4. SPS-Programm, Variablendeklaration

PROGRAM MAIN
VAR
   PlcVarBool   AT %MW0 :BOOL := TRUE;
   PlcVarInt    AT %MW1 :INT := 0;
   PlcVarIntMax AT %MW3 :INT := 1000;
   PlcVarString AT %MD5 :STRING;
   TON1                 :TON;
   bool1                :BOOL;
   time1                :TIME;
END_VAR

5. SPS-Programm, der Quelltext

PlcVarInt := PlcVarInt + 1;
IF PlcVarInt > PlcVarIntMax THEN
    PlcVarInt := 0;
END_IF

PlcVarBool := NOT PlcVarBool;

TON1(IN:=TRUE , PT:=t#5m , Q=>bool1 , ET=>time1 );
IF bool1 THEN
TON1(IN:=FALSE , PT:= , Q=> , ET=> );
END_IF

PlcVarString := TIME_TO_STRING(time1);

6. JavaScript, der Quelltext

var success = 0, errors = 0, req, data;

function init()
{
    loop(refresh);
}

function loop(x)
{
    // Send soap read request via xmlhttprequest
    Read(netId, port, '16416', '0', '86');

    // Call loop again with x ms delay
    window.setTimeout("loop(" + x + ")", x);
}

// Parse the SOAP result of the xmlhttprequest
function processReqChange()
{
    /*
    readyStates:
    0 = uninitialized
    1 = loading
    2 = loaded
    3 = interactive
    4 = complete
    */

    if (req.readyState == 4)
    {
        // Check for status "OK"
        if (req.status == 200)
        {
            response = req.responseXML.documentElement;

            // Check the response for errors in the request
            try
            {
                errortext = response.getElementsByTagName('faultstring')[0].firstChild.data;

                try
                {
                    errorcode = response.getElementsByTagName('errorcode')[0].firstChild.data;
                }
                catch (e)
                {
                    errorcode = "-";
                }

                showerror(errortext + " ("+errorcode+")");
                return;
            }
            catch (e)
            {
                errorcode = 0;
            }

            // Check whether the response contains a  element. If so process it and retrieve the values.
            // If not it is a write request and therefore ignored.
            try
            {
                data = response.getElementsByTagName('ppData')[0].firstChild.data;

                // Since now the data is extracted from the response its contents need to be parsed so that the results can be displayed.
                try
                {
                    // Decode result string
                    data = b64t2d(data);

                    // First byte: Status (boolean)
                    bool = (data.charCodeAt(0) != '0');

                    // Second and third byte: Value (int)
                    integer = toInt(data.substr(1, 2));

                    // Fourth and fifth byte: MaxValue (int)
                    max = toInt(data.substr(3, 2));

                    // 5-86 byte: Time (string)
                    time = toString(data.substr(5, 81));
                }
                catch (e)
                {
                    showerror("Parsing Failed: " + e);
                    return;
                }

                // Display the results
                document.all["valuefield"].value = integer;
                pro = (integer / max) * 100;
                document.loadimage.width = pro * 3;

                document.all["maxfield"].value = max;
                document.all["timefield"].value = time;
                document.all["boolfield"].value = bool;

                if (bool==true)
                    document.all["boolfield"].className="blue";
                else
                    document.all["boolfield"].className="normal";
            }
            catch (e)
            {
                data = "";
                mode = "";
            }

            // Valid checks only: Set the status to "ok".
            document.all["status"].value = "ok";
            document.all["status"].className = "green";

            success++;
            document.all["success"].value = success;
        }
        else
        {
            // Request status is not correct: Display error message.
            showerror(req.statusText);
        }
    }
}

function showerror (text)
{
    errors++;
    document.all["status"].value = text;
    document.all["status"].className = "red";
    document.all["errors"].value = errors;
}

7. JavaScript, der Download:

WebServiceSampleJavaScript.zip