import { S7WLBit, S7WLByte, S7WLWord, S7WLDWord, S7WLReal, S7WLCounter, S7WLTimer, } from '../protocol/constants.js'; export function getByteCount(wordLen: number): number { switch (wordLen) { case S7WLBit: case S7WLByte: return 1; case S7WLWord: case S7WLCounter: case S7WLTimer: return 2; case S7WLDWord: case S7WLReal: return 4; default: return 0; } } export function getTransportSize(wordLen: number): number { switch (wordLen) { case S7WLBit: return 0x01; case S7WLByte: return 0x02; case S7WLWord: return 0x04; case S7WLDWord: return 0x06; case S7WLReal: return 0x08; case S7WLCounter: return 0x1C; case S7WLTimer: return 0x1D; default: return 0x00; } } export function readFixedString(buf: Buffer, offset: number, len: number): string { return buf.subarray(offset, offset + len).toString('ascii').replace(/\0+$/, '').trimEnd(); } export function writeFixedString(buf: Buffer, offset: number, len: number, str: string): void { const strBuf = Buffer.alloc(len, 0x20); // pad with spaces Buffer.from(str, 'ascii').copy(strBuf, 0, 0, Math.min(str.length, len)); strBuf.copy(buf, offset); } export function encodeS7Address(start: number, bitOffset: number, area: number, dbNumber: number, wordLen: number): Buffer { const transportSize = getTransportSize(wordLen); const buf = Buffer.alloc(12); buf[0] = 0x12; // Item spec buf[1] = 0x0A; // Item len buf[2] = 0x10; // Syntax ID S7Any buf[3] = transportSize; const isDB = area === 0x84; const numElements = wordLen === S7WLBit ? 1 : 1; // simplified, caller handles amount buf.writeUInt16BE(1, 4); // Number of elements (will be overwritten by caller) buf.writeUInt16BE(isDB ? dbNumber : 0, 6); buf[8] = area; // Address: Offset * 8 + BitOffset, 3 bytes big-endian const addr = start * 8 + bitOffset; buf[9] = (addr >> 16) & 0xFF; buf[10] = (addr >> 8) & 0xFF; buf[11] = addr & 0xFF; return buf; } export function s7DateToDate(year: number, month: number, day: number, hour: number, minute: number, second: number): Date { return new Date(year, month - 1, day, hour, minute, second); } export function dateToS7Date(d: Date): { year: number; month: number; day: number; hour: number; minute: number; second: number } { return { year: d.getFullYear(), month: d.getMonth() + 1, day: d.getDate(), hour: d.getHours(), minute: d.getMinutes(), second: d.getSeconds(), }; }