Lesen und Schreiben von String-Variablen

Download

Voraussetzungen

Sprache / IDE

Beispielprogram auspacken

C# / Visual Studio

Sample04.zip

Aufgabe

Eine .NET Applikation soll einen String von der SPS lesen und einen String in die SPS schreiben.

Beschreibung

Im Load-Ereignis wird eine neue Instanz der Klasse TcAdsClient erzeugt. Dann wird die Methode TcAdsClient.Connect des TcAdsClient Objektes aufgerufen, um eine Verbindung mit dem Port 801 herzustellen. Zum Schluss wird dann die Methode TcAdsClient.CreateVariableHandle aufgerufen, um sich ein Handle auf die SPS-Variable zu besorgen. Wenn das Programm beendet wird, wird das Handle in der Event-Methode Form1_Closing wieder freigegeben und die Dispose-Methode des TcAdsClient Objektes wird aufgerufen.

Wenn der Anwender den "Read"-Button betätigt, wird die String-Variable MAIN.text mit Hilfe der Methode TcAdsClient.Read aus der SPS gelesen und in dem Editierfeld angezeigt. Wenn der Anwender den "Write"-Button betätigt, wird der Text der im Editierfeld steht in die SPS-Variable MAIN.text geschrieben.

Mit Hilfe der Klassen AdsBinaryReader and AdsBinaryWriter können SPS-Strings aus einem AdsStream gelesen und in einen AdsStream geschrieben werden( siehe kommentierten Abschnitt des Beispiel-Programmes). Diese Klassen sind direkt von den Klassen BinaryReader und BinaryWriter abgeleitet. Um einen String aus dem Stream zu lesen wird die Methode AdsBinaryReader.ReadPlcString aufgerufen. Um einen String in den Stream zu schreiben wird die Methode AdsBinaryWriter.WritePLCString aufgerufen. Die Länge vom AdsStream muss der Länge des Strings in der SPS entsprechen (ohne Null-Terminierung). Die Länge der String-Variablen wird der Methode als Parameter übergeben und muss der Länge des Strings in der SPS entsprechen (ohne Null-Terminierung).

Lesen und Schreiben von String-Variablen 1:

C# Programm


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using TwinCAT.Ads;
using System.IO;

namespace Sample04
{
public class Form1 : System.Windows.Forms.Form
{
private System.ComponentModel.Container components = null;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button btnRead;
private System.Windows.Forms.Button btnWrite;
private System.Windows.Forms.Label label1;
private TcAdsClient adsClient;
private int varHandle;

public Form1()
{
InitializeComponent();
}

protected override void Dispose( bool disposing )
{
...
}

private void InitializeComponent()
{
...
}

[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{
try
{
adsClient = new TcAdsClient();

// PLC1 Port - TwinCAT 3=851
tcClient.Connect(851);

varHandle = adsClient.CreateVariableHandle("MAIN.text");
}
catch( Exception err)
{
MessageBox.Show(err.Message);
}
}

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
adsClient.Dispose();
}

private void btnRead_Click(object sender, System.EventArgs e)
{
try
{
//length of the stream = length of string in sps + 1
AdsStream adsStream = new AdsStream(31);
BinaryReader reader = new BinaryReader(adsStream,System.Text.Encoding.ASCII);

int length = adsClient.Read(varHandle, adsStream);
string text = new string(reader.ReadChars(length));
//necessary if you want to compare the string to other strings
//text = text.Substring(0,text.IndexOf('\0'));
textBox1.Text = text;
}
catch(Exception err)
{
MessageBox.Show(err.Message)
}
}

private void btnWrite_Click(object sender, System.EventArgs e)
{
try
{
//length of the stream = length of string + 1
AdsStream adsStream = new AdsStream(textBox1.Text.Length+1);
BinaryWriter writer = new BinaryWriter(adsStream, System.Text.Encoding.ASCII);
writer.Write(textBox1.Text.ToCharArray());
//add terminating zero
writer.Write('\0');
adsClient.Write(varHandle,adsStream);
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}
}


/*From version 1.0.0.10 and higher the classes AdsBinaryReader and AdsBinaryWriter
can be used to read and write strings
private void btnRead_Click(object sender, System.EventArgs e)
{
try
{
AdsStream adsStream = new AdsStream(30);
AdsBinaryReader reader = new AdsBinaryReader(adsStream);
adsClient.Read(varHandle, adsStream);
textBox1.Text = reader.ReadPlcString(30);
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}
}

private void btnWrite_Click(object sender, System.EventArgs e)
{
try
{
AdsStream adsStream = new AdsStream(30);
AdsBinaryWriter writer = new AdsBinaryWriter(adsStream);
writer.WritePlcString(textBox1.Text, 30);
adsClient.Write(varHandle, adsStream);
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}
}
*/

}
}



PLC Programm


PROGRAM MAIN
VAR
text : STRING[30] := 'hello';
END_VAR