s7-server
Version:
TypeScript S7 PLC Server Simulator
192 lines • 5.52 kB
TypeScript
/**
* S7 Protocol Data Unit (PDU) Implementation
* Handles S7 protocol message structures and parsing
*/
import { Buffer } from 'buffer';
import { S7Area, S7WordLength } from '../types/s7-types';
export declare const S7_PROTOCOL_ID = 50;
export declare const S7_PDU_TYPE_REQUEST = 1;
export declare const S7_PDU_TYPE_RESPONSE = 3;
export declare const S7_PDU_TYPE_USERDATA = 7;
export declare const S7_FUNC_READ = 4;
export declare const S7_FUNC_WRITE = 5;
export declare const S7_FUNC_NEGOTIATE = 240;
export declare const S7_FUNC_CONTROL = 40;
export declare const S7_FUNC_UPLOAD = 29;
export declare const S7_FUNC_DOWNLOAD = 30;
export declare const S7_FUNC_GET_CLOCK = 1;
export declare const S7_FUNC_SET_CLOCK = 2;
export declare const S7_ERROR_NO_ERROR = 0;
export declare const S7_ERROR_RESOURCE_NOT_AVAILABLE = 10;
export declare const S7_ERROR_INVALID_PARAMETER = 11;
export declare const S7_ERROR_ADDRESS_OUT_OF_RANGE = 5;
export declare const S7_ERROR_DATA_SIZE_MISMATCH = 6;
export declare const TS_RES_BIT = 3;
export declare const TS_RES_BYTE = 4;
export declare const TS_RES_INT = 5;
export declare const TS_RES_REAL = 7;
export declare const TS_RES_OCTET = 9;
export interface S7ReqHeader {
P: number;
PDUType: number;
AB_EX: number;
Sequence: number;
ParLen: number;
DataLen: number;
}
export interface S7ResHeader {
P: number;
PDUType: number;
AB_EX: number;
Sequence: number;
ParLen: number;
DataLen: number;
Error: number;
}
export interface S7ReadRequest {
FunRead: number;
ItemCount: number;
Items: S7ReadItem[];
}
export interface S7ReadItem {
TransportSize: number;
Length: number;
DBNumber: number;
Area: number;
Addr: Buffer;
}
export interface S7ReadResponse {
FunRead: number;
ItemCount: number;
Items: S7ReadResponseItem[];
}
export interface S7ReadResponseItem {
ReturnCode: number;
TransportSize: number;
DataLength: number;
Data: Buffer;
}
export interface S7WriteRequest {
FunWrite: number;
ItemCount: number;
Items: S7WriteItem[];
}
export interface S7WriteItem {
TransportSize: number;
Length: number;
DBNumber: number;
Area: number;
Addr: Buffer;
Data: Buffer;
}
export interface S7WriteResponse {
FunWrite: number;
ItemCount: number;
Items: number[];
}
export interface S7NegotiateRequest {
FunNegotiate: number;
Unknown: number;
ParallelJobs_1: number;
ParallelJobs_2: number;
PDULength: number;
}
export interface S7NegotiateResponse {
FunNegotiate: number;
Unknown: number;
ParallelJobs_1: number;
ParallelJobs_2: number;
PDULength: number;
}
export interface S7ControlRequest {
FunControl: number;
Unknown: number;
ControlCode: number;
}
export interface S7ControlResponse {
FunControl: number;
Unknown: number;
}
export interface S7ClockRequest {
FunClock: number;
Unknown: number;
Data?: Buffer;
}
export interface S7ClockResponse {
FunClock: number;
Unknown: number;
Data: Buffer;
}
export declare class S7PDUParser {
/**
* Parse S7 request header
*/
static parseRequestHeader(data: Buffer): S7ReqHeader | null;
/**
* Parse S7 response header
*/
static parseResponseHeader(data: Buffer): S7ResHeader | null;
/**
* Parse S7 read request
*/
static parseReadRequest(data: Buffer): S7ReadRequest | null;
/**
* Parse S7 write request
*/
static parseWriteRequest(data: Buffer): S7WriteRequest | null;
/**
* Parse S7 negotiate request
* Supports both 6-byte (nodes7 client) and 8-byte (standard SNAP7) formats
*/
static parseNegotiateRequest(data: Buffer): S7NegotiateRequest | null;
/**
* Parse S7 control request
*/
static parseControlRequest(data: Buffer): S7ControlRequest | null;
/**
* Create S7 read response
*/
static createReadResponse(sequence: number, items: S7ReadResponseItem[]): Buffer;
/**
* Create S7 write response
*/
static createWriteResponse(sequence: number, returnCodes: number[]): Buffer;
/**
* Create S7 negotiate response
* Creates response in standard SNAP7 format (8 bytes) to match C++ implementation
*/
static createNegotiateResponse(sequence: number, pduLength: number): Buffer;
/**
* Create S7 control response
*/
static createControlResponse(sequence: number, controlCode: number): Buffer;
/**
* Create S7 clock response
*/
static createClockResponse(sequence: number, clockData: Buffer): Buffer;
/**
* Get response transport size and data length from request transport size
* This matches the C++ SNAP7 implementation exactly
*/
static getResponseTransportSizeAndLength(requestTransportSize: number, dataSize: number): {
transportSize: number;
dataLength: number;
};
/**
* Get transport size code from word length (legacy function)
*/
static getTransportSizeCode(wordLen: S7WordLength): number;
/**
* Get byte count from word length
*/
static getByteCountFromWordLen(wordLen: S7WordLength): number;
/**
* Validate S7 address
*/
static validateAddress(area: S7Area, dbNumber: number, start: number, size: number): boolean;
/**
* Parse address from 3-byte buffer (matches C++ SNAP7 implementation)
*/
static parseAddress(addr: Buffer): number;
}
//# sourceMappingURL=s7-pdu.d.ts.map