Server Setup for Testing
The built-in server lets you test your client code without a physical PLC.
Basic Server Example
from s7 import Server, SrvArea
from ctypes import c_char
# Create and configure the server
server = Server()
# Register a data block (DB1) with 100 bytes
db_size = 100
db_data = bytearray(db_size)
db_array = (c_char * db_size).from_buffer(db_data)
server.register_area(SrvArea.DB, 1, db_array)
# Start the server on a non-privileged port
server.start(tcp_port=1102)
Client-Server Round Trip
from s7 import Client, Server, SrvArea
from ctypes import c_char
# --- Server setup ---
server = Server()
db_size = 100
db_data = bytearray(db_size)
db_array = (c_char * db_size).from_buffer(db_data)
server.register_area(SrvArea.DB, 1, db_array)
server.start(tcp_port=1102)
# --- Client connection ---
client = Client()
client.connect("127.0.0.1", 0, 1, tcp_port=1102)
# Write data
client.db_write(1, 0, bytearray([0x01, 0x02, 0x03, 0x04]))
# Read it back
data = client.db_read(1, 0, 4)
print(f"Read back: {list(data)}") # [1, 2, 3, 4]
# Clean up
client.disconnect()
server.stop()
Registering Multiple Areas
from s7 import Server, SrvArea
from ctypes import c_char
server = Server()
# Register DB1
db1_data = bytearray(100)
db1 = (c_char * 100).from_buffer(db1_data)
server.register_area(SrvArea.DB, 1, db1)
# Register DB2
db2_data = bytearray(200)
db2 = (c_char * 200).from_buffer(db2_data)
server.register_area(SrvArea.DB, 2, db2)
# Register merker area (256 bytes)
mk_data = bytearray(256)
mk = (c_char * 256).from_buffer(mk_data)
server.register_area(SrvArea.MK, 0, mk)
server.start(tcp_port=1102)
Note
Use a port number above 1024 (e.g., 1102) to avoid requiring root/admin privileges. Port 102 is the standard S7 port but is in the privileged range.
Using the Mainloop Helper
For quick testing, the mainloop function from the legacy snap7 package
starts a server with common data blocks pre-registered:
from snap7.server import mainloop
# Blocks the current thread
mainloop(tcp_port=1102)