A virtual PLC simulator that implements the EthernetIP/CIP protocol, allowing Studio 5000, RSLogix, and other SCADA systems to connect for testing and development -- no physical hardware required.
Built for automation engineers, integrators, and developers who need a quick way to test EthernetIP communications without a real PLC.
Built & maintained by Industrial Monitor Direct -- USA-based manufacturer of rugged industrial panel PCs, touchscreens, and embedded computers for automation.
Option A -- Run from source:
git clone https://github.com/imdtouch/EthernetIP-Simulator.git
cd EthernetIP-Simulator
python main.pyDependencies install automatically on first run. If that fails, run pip install -r requirements.txt manually.
Option B -- Run the pre-built executable (Windows):
Download EthernetIP_Simulator.exe from this repository and run it directly. No Python installation needed.
- Virtual PLC Server -- Simulates an EthernetIP device on port 44818 that accepts connections from SCADA software
- Tag Management -- Create, edit, and delete tags with inline editing, undo/redo, and context menus
- All Standard Data Types -- BOOL, SINT, INT, DINT, LINT, USINT, UINT, UDINT, REAL, LREAL, STRING
- Arrays -- Single and multi-dimensional array support
- User Defined Types (UDTs) -- Define complex data structures with custom members
- Modern Dark UI -- Built with PySide6 (Qt6) with a dark industrial theme
- Persistent Storage -- Tags persist between sessions via SQLite
- Auto-Install -- Dependencies are installed automatically on first run
- Python 3.8+ (not needed if using the
.exe) - Windows 10/11 (recommended) or Linux
- Internet connection for initial dependency installation
- Click "Add Tag" in the Tag Management panel
- Set the tag name, data type, and optional initial value
- Click "Create Tag"
Tag names must start with a letter or underscore and contain only alphanumeric characters and underscores (standard PLC naming rules).
- Click "Start Server" in the Server Control panel
- The status indicator turns green when the server is running
- Note the IP address and port (default: 44818)
- Open your Studio 5000 project
- In I/O Configuration, add a new Ethernet Module
- Set the IP Address to the one shown in the simulator's Server Control panel
- Set Port to
44818and Slot to0 - Download to the PLC and browse Controller Tags -- your simulator tags will appear
- You can now read and write tag values between Studio 5000 and the simulator
- Double-click a value cell to edit inline
- BOOL tags toggle on double-click
- Ctrl+Z / Ctrl+Y to undo/redo value changes
- Right-click for context menu (Copy Name, Copy Value, Delete)
| Shortcut | Action |
|---|---|
| Ctrl+Q | Exit application |
| F12 | Capture screenshot & submit feedback |
| Ctrl+Z | Undo tag value edit |
| Ctrl+Y | Redo tag value edit |
| Type | Description | Range / Size |
|---|---|---|
| BOOL | Boolean | True / False |
| SINT | Short Integer (8-bit) | -128 to 127 |
| INT | Integer (16-bit) | -32,768 to 32,767 |
| DINT | Double Integer (32-bit) | -2,147,483,648 to 2,147,483,647 |
| LINT | Long Integer (64-bit) | 64-bit signed |
| USINT | Unsigned Short Integer | 0 to 255 |
| UINT | Unsigned Integer | 0 to 65,535 |
| UDINT | Unsigned Double Integer | 0 to 4,294,967,295 |
| REAL | 32-bit Float | IEEE 754 single precision |
| LREAL | 64-bit Float | IEEE 754 double precision |
| STRING | Character String | Up to 82 characters |
EthernetIP-Simulator/
├── main.py # Entry point (auto-installs dependencies)
├── requirements.txt # Python dependencies
├── EthernetIP_Simulator.exe # Pre-built Windows executable
│
├── src/
│ ├── models/ # Data models (Tag, UDT, DataType)
│ ├── database/ # SQLite persistence (thread-safe)
│ ├── services/ # Business logic with caching
│ ├── server/ # EthernetIP/CIP server (cpppo)
│ ├── ui/ # PySide6 interface & dialogs
│ └── feedback/ # Screenshot annotation system
│
├── build/ # PyInstaller build scripts
└── data/ # Runtime data (created automatically)
The codebase follows a layered architecture:
| Layer | Responsibility |
|---|---|
| Models | Data structures (Tag, UDT, DataType enums) |
| Database | SQLite persistence with thread-safe, lock-protected cursors |
| Services | Business logic with O(1) cached tag lookups |
| Server | EthernetIP/CIP communication via cpppo (thread-safe) |
| UI | PySide6 dark-themed interface |
- Verify Python 3.8+ is installed:
python --version - Try manual dependency install:
pip install -r requirements.txt
- Check if port 44818 is already in use by another application
- Verify your firewall allows traffic on port 44818
- On Windows, see
WINDOWS_SOCKET_GUIDE.mdfor port management tips
- Confirm the server status shows "Running" (green indicator)
- Make sure the IP address in Studio 5000 matches what the simulator displays
- If testing on the same machine, try
127.0.0.1 - Check that both machines are on the same network
- Create tags before starting the server
- After adding new tags, restart the server
- In Studio 5000, re-download the configuration
This simulator is built by Industrial Monitor Direct, a USA-based manufacturer of industrial computing solutions. When you're ready to move from simulation to production, we offer:
- Rugged Panel PCs & HMI Touchscreens -- IP65/IP66 rated for factory floor environments
- Fanless Embedded Box PCs -- designed for 24/7 industrial operation
- Industrial Tablets -- mobile SCADA access on the plant floor
- Custom OEM Solutions -- wide-temp operation (-20°C to 60°C), UL/CE/FCC certified
All products come with a 3-year warranty and US-based technical support.
| Website | industrialmonitordirect.com |
| Support@IndustrialMonitorDirect.com | |
| Phone | 1 (207) 800-1637 |
Contributions are welcome! To contribute:
- Fork this repository
- Create a feature branch (
git checkout -b feature/my-feature) - Commit your changes (
git commit -m "Add my feature") - Push to the branch (
git push origin feature/my-feature) - Open a Pull Request
For bugs or feature requests, please open an issue.
This project is licensed under the MIT License.
- Complete UI rewrite from CustomTkinter to PySide6 (Qt6)
- Dark industrial theme with sortable, resizable columns
- Right-click context menus and inline tag value editing
- Undo/redo support (Ctrl+Z / Ctrl+Y)
- F12 screenshot annotation and feedback system
- Thread-safe database and server operations
- O(1) tag lookup via secondary cache index
- Removed 6 unused dependencies for a leaner install
- Initial release with EthernetIP server, tag management, array support, and CustomTkinter UI