SIMATIC - S7-Net Freeware
SIMATIC - S7-Net Freeware
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.
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 its localhost, for a plc that
its in rack 0 and a cpu that its in slot 2 of the hardware configuration:
Plc plc = new Plc(CpuType.S7300, "127.0.0.1", 0, 2);
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
}
and
public string LastErrorString
on every methods that you execute, in order to catch errors while running the driver.
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.
This property can be checked after you called the method Open(), to check if the connection is still alive.
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
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. Its 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);
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.
varType: specify the data that you want to get your bytes converted.
public enum VarType
{
Bit,
Byte,
Word,
DWord,
Int,
DInt,
Real,
String,
Timer,
Counter
}
count: this contains how many variables you want to read. Its limited to 200 bytes and if you
need more, you must use recursion.
Value: array of values to be written to the plc. It can be a single value or an array, the important is
that the type is unique, for example array of double, array of int, array of shorts, etc..
Example:
This method reads the first 20 DWords of DB1:
var dwords = plc.Read(DataType.DataBlock, 1,0, VarType.DWord, 20);
variable: specify the variable to read by using strings like DB1.DBW20, T45, C21,
DB1.DBD400, etc.
Example:
This reads the variable DB1.DBW0. The result must be cast to ushort to get the correct 16-bit format in C#.
ushort result = (ushort)plc.Read("DB1.DBW0");
Example:
You define a DataBlock in the plc like:
Then you add a struct into your .Net application that is similiar to the DB in the plc:
public struct testStruct
{
public bool varBool0;
public bool varBool1;
public bool varBool2;
public bool varBool3;
public bool varBool4;
public bool varBool5;
public bool varBool6;
public byte varByte0;
public byte varByte1;
sourceClass: instance of the class that you want to assign the values
db: index of the DB to read
startByteAdr: specified the first address of the byte to read (the default is zero).
Example:
You define a DataBlock in the plc like:
Then you add a struct into your .Net application that is similiar to the DB in the plc:
public class TestClass
{
public bool varBool0 { get; set;}
public bool varBool1 { get; set;}
public bool varBool2 { get; set;}
public bool varBool3 { get; set;}
public bool varBool4 { get; set;}
public bool varBool5 { get; set;}
public bool varBool6 { get; set;}
public byte varByte0 { get; set;}
public byte varByte1 { get; set;}
Read S7 Word:
ushort result = (ushort)plc.Read("DB1.DBW0");
Write S7 Word:
ushort val = 40000;
plc.Write("DB1.DBW0", val);
Read S7 DWord:
uint result = (uint)plc.Read("DB1.DBD40");
Write S7 DWord:
uint val = 1000;
plc.Write("DB1.DBD40", val);
Write S7 Dint:
int value = -60000;
plc.Write("DB1.DBD60", value);
Read S7 Real, you need to use ConvertToDouble():
double result = ((uint)plc.Read("DB1.DBD40")).ConvertToDouble();
S7 1200/1500 Notes
An external equipment can access to S71200/1500 CPU using the S7 base
protocol, only working as an HMI, i.e. only basic data transfer are allowed.
All other PG operations (control/directory/etc..) must follow the extended protocol,
not (yet) covered by Snap7.
Particularly to access a DB in S71500 some additional setting plc-side are needed.
1. Only global DBs can be accessed.
2. The optimized block access must be turned off.
3. The access level must be full and the connection mechanism must allow
GET/PUT.
Lets see these settings in TIA Portal V12
DB property
Select the DB in the left pane under Program blocks and press Alt-Enter (or in
the contextual menu select Properties)
Uncheck Optimized block access, by default its checked.
Protection
Select the CPU project in the left pane and press Alt-Enter (or in the contextual
menu select Properties)
In the item Protection, select Full access and Check Permit access with PUT/GET
. as in figure.