S7.Net documentation
How to download s7.Net
The official repository is on GitHub (https://github.com/killnine/s7netplus), you can also download the
library directly from NuGet (https://www.nuget.org/packages/S7netplus/).
What is S7.Net
S7.Net is a plc driver that works only with Siemens PLC and only with Ethernet connection. This means that
your plc must have a Profinet CPU or a profinet external card (CPxxx card).
S7.Net is written entirely in C#, so you can debug it easily without having to go through native dlls.
Supported PLC
S7.Net is compatible with S7-200, S7-300, S7-400, S7-1200, S7-1500.
Getting started with S7.Net
To get started with S7.Net you have to download and include the S7.Net.dll in your project. You can do this
by downloading the NuGet package, or by downloading the sources and compile them.
Create a PLC instance, connect and disconnect
To create an instance of the driver you need to use this constructor:
public Plc(CpuType cpu, string ip, Int16 rack, Int16 slot)
Cpu: this specify what CPU you are connecting to. The supported CPU are:
public enum CpuType {
S7200 = 0,
S7300 = 10,
S7400 = 20,
S71200 = 30,
S71500 = 40,
}
Ip: this contains the IP address of the CPU of external Ethernet card
Rack: this contains the rack of the plc, that you can find in hardware configuration in Step7
Slot: this is the slot of the CPU, that you can find in hardware configuration in Step7
Example:
This code creates a Plc object for a S7-300 plc at the IP address 127.0.0.1, that it’s localhost, for a plc that
it’s in rack 0 and a cpu that it’s in slot 2 of the hardware configuration:
Plc plc = new Plc(CpuType.S7300, "127.0.0.1", 0, 2);
Connecting to the PLC
public ErrorCode Open()
For example this line of code open the connection:
plc.Open();
Disconnecting from the PLC
public void Close()
For example this closes the connection:
plc.Close();
Error handling
The Open() method returns an ErrorCode to check if the operation was successful. You should always
check that it returns ErrorCode.NoError.
These are the types of errors:
public enum ErrorCode
{
NoError = 0,
WrongCPU_Type = 1,
ConnectionError = 2,
IPAddressNotAvailable,
WrongVarFormat = 10,
WrongNumberReceivedBytes = 11,
SendData = 20,
ReadData = 30,
WriteData = 50
}
Global error handling
Not all methods returns an error. You can check for
public ErrorCode LastErrorCode
and
public string LastErrorString
on every methods that you execute, in order to catch errors while running the driver.
Check PLC availability
To check if the plc is available you can use the property
public bool IsAvailable
When you check this property, the driver will send a ping to the plc and returns true if the plc responds to
the ping, false otherwise.
Check PLC connection
Checking the plc connection is trivial, because you have to check if the PC socket is connected but also if the
PLC is still connected.
The property that you have to check in this case is this:
public bool IsConnected
This property can be checked after you called the method Open(), to check if the connection is still alive.
Read bytes / Write bytes
The library offers several methods to read variables. The basic one and the most used is ReadBytes.
public byte[] ReadBytes(DataType dataType, int db, int startByteAdr, int count)
public ErrorCode WriteBytes(DataType dataType, int db, int startByteAdr, byte[] value)
This reads up to 200 bytes (actual limit of the protocol) from a memory location that you determine.
dataType: you have to specify the memory location with the enum DataType
public enum DataType
{
Input = 129,
Output = 130,
Memory = 131,
DataBlock = 132,
Timer = 29,
Counter = 28
}
db: this is the address of the dataType, for example if you want to read DB1, this field is “1”; if you
want to read T45, this field is 45.
startByteAdr: this is the address of the first byte that you want to read, for example if you
want to read DB1.DBW200, this is 200.
count: this contains how many bytes you want to read. It’s limited to 200 bytes and if you need
more, you must use recursion.
Value[]: array of bytes to be written to the plc.
Example:
This method reads the first 200 bytes of DB1:
var bytes = plc.ReadBytes(DataType.DataBlock, 1,0,200);
Example with recursion:
private List<byte> ReadMultipleBytes(int numBytes, int db, int startByteAdr = 0)
{
List<byte> resultBytes = new List<byte>();
int index = startByteAdr;
while (numBytes > 0)
{
var maxToRead = (int)Math.Min(numBytes, 200);
byte[] bytes = ReadBytes (DataType.DataBlock, db, index, (int)maxToRead);
if (bytes == null)
return new List<byte>();
resultBytes.AddRange(bytes);
numBytes -= maxToRead;
index += maxToRead;
}
return resultBytes;
}