
Security News
Axios Supply Chain Attack Reaches OpenAI macOS Signing Pipeline, Forces Certificate Rotation
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.
modbus-server
Advanced tools
A TypeScript implementation of a Modbus TCP server for industrial automation and IoT applications.
npm install
import { ModbusTCPServer } from 'modbus-tcp-server';
// Simple usage with defaults
const server = new ModbusTCPServer();
// Or customize specific settings
const server = new ModbusTCPServer({
port: 5020, // Custom port
minRegisterAddress: 40001, // Start at standard holding register range
maxRegisterAddress: 40100 // Limit to 100 registers
});
// Start the server
await server.start();
// Access the data store
const dataStore = server.getDataStore();
// Set some data
dataStore.setHoldingRegister(100, 1234);
dataStore.setCoil(200, true);
// Read data directly from server
console.log('Holding Register 100:', server.getHoldingRegisterValue(100));
console.log('Coil 200:', server.getCoilValue(200));
console.log('All data:', server.getAllData());
// Stop the server
await server.stop();
The server provides convenient methods to read data directly:
// Read individual values
const holdingValue = server.getHoldingRegisterValue(100);
const inputValue = server.getInputRegisterValue(200);
const coilValue = server.getCoilValue(300);
const discreteValue = server.getDiscreteInputValue(400);
// Read ranges
const holdingRange = server.getHoldingRegisterValues(100, 5); // Read 5 registers starting at 100
const inputRange = server.getInputRegisterValues(200, 3); // Read 3 registers starting at 200
// Get all data
const allData = server.getAllData();
// Get data summary
const summary = server.getDataSummary();
console.log(`Holding: ${summary.holdingRegisters}, Input: ${summary.inputRegisters}`);
# Start with default settings (port 502)
npm start
# Start with custom port
npm start -- --port=5020
# Start with custom address range
npm start -- --min-address=50000 --max-address=54000
# Show help
npm start -- --help
The server comes with sensible defaults:
const DEFAULT_CONFIG = {
port: 502, // Standard Modbus TCP port
host: '0.0.0.0', // Listen on all interfaces
unitId: 1, // Default unit ID
maxHoldingRegisters: 10000, // Memory limits
maxInputRegisters: 10000,
maxCoils: 10000,
maxDiscreteInputs: 10000,
minRegisterAddress: 1, // Address range
maxRegisterAddress: 65535
};
| Option | Environment Variable | Default | Description |
|---|---|---|---|
--port | MODBUS_PORT | 502 | Server port |
--host | MODBUS_HOST | 0.0.0.0 | Server host |
--unit | MODBUS_UNIT_ID | 1 | Unit ID |
--min-address | MIN_REGISTER_ADDRESS | 50000 | Minimum register address |
--max-address | MAX_REGISTER_ADDRESS | 54000 | Maximum register address |
--max-holding | MAX_HOLDING_REGISTERS | 10000 | Max holding registers |
--max-input | MAX_INPUT_REGISTERS | 10000 | Max input registers |
--max-coils | MAX_COILS | 10000 | Max coils |
--max-discrete | MAX_DISCRETE_INPUTS | 10000 | Max discrete inputs |
npm run build
npm run dev
# Run tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage
npm run test:coverage
# Check for linting errors
npm run lint
# Fix linting errors
npm run lint:fix
# Format code
npm run format
Main server class for handling Modbus TCP connections.
constructor(config: ModbusServerConfig)
start(): Promise<void> - Start the serverstop(): Promise<void> - Stop the servergetDataStore(): ModbusDataStore - Get the data store instanceData store for managing Modbus registers and coils.
setHoldingRegister(address: number, value: number): voidgetHoldingRegister(address: number): numbersetHoldingRegisters(startAddress: number, values: number[]): voidgetHoldingRegisters(startAddress: number, quantity: number): number[]setInputRegister(address: number, value: number): voidgetInputRegister(address: number): numbergetInputRegisters(startAddress: number, quantity: number): number[]setCoil(address: number, value: boolean): voidgetCoil(address: number): booleansetCoils(startAddress: number, values: boolean[]): voidgetCoils(startAddress: number, quantity: number): boolean[]setDiscreteInput(address: number, value: boolean): voidgetDiscreteInput(address: number): booleangetDiscreteInputs(startAddress: number, quantity: number): boolean[]getAllRegisters() - Get all register dataclearAllData() - Clear all dataFor applications requiring multiple Modbus servers (e.g., different inverters):
# Terminal 1: First inverter
npm start -- --port=5020 --min-address=50000 --max-address=52000
# Terminal 2: Second inverter
npm start -- --port=5021 --min-address=52001 --max-address=54000
export MODBUS_PORT=5020
export MODBUS_HOST=127.0.0.1
export MIN_REGISTER_ADDRESS=50000
export MAX_REGISTER_ADDRESS=54000
npm start
MIT
For issues and questions, please use the GitHub issue tracker.
FAQs
TypeScript Modbus TCP Server Implementation
The npm package modbus-server receives a total of 6 weekly downloads. As such, modbus-server popularity was classified as not popular.
We found that modbus-server demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.

Security News
Open source is under attack because of how much value it creates. It has been the foundation of every major software innovation for the last three decades. This is not the time to walk away from it.

Security News
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.