-- TIA Portal built-in instructions for SCL LSP -- Defines functions, function blocks, data types, and their parameters local M = {} -- Built-in functions (return values, no state) M.FUNCTIONS = { ADD = true, SUB = true, MUL = true, DIV = true, MOD = true, ABS = true, NEG = true, SQR = true, SQRT = true, EXP = true, LN = true, LOG = true, SIN = true, COS = true, TAN = true, ASIN = true, ACOS = true, ATAN = true, MIN = true, MAX = true, LIMIT = true, CALCULATE = true, CONVERT = true, ROUND = true, TRUNC = true, CEIL = true, FLOOR = true, SCALE_X = true, NORM_X = true, LEN = true, CONCAT = true, LEFT = true, RIGHT = true, MID = true, INSERT = true, DELETE = true, REPLACE = true, FIND = true, AND = true, OR = true, XOR = true, NOT = true, SHL = true, SHR = true, ROL = true, ROR = true, DECO = true, ENCO = true, BCD_I = true, I_BCD = true, DI_BCD = true, DI_R = true, I_DI = true, R_DI = true, R_DB = true, MOVE = true, FILL = true, SWAP = true, PEEK = true, POKE = true, GET_ERROR = true, GET_ERR_ID = true, RESET_ERR = true, T_CONV = true, T_ADD = true, T_SUB = true, T_DIFF = true, T_COMBINE = true, DT_DATE = true, DT_TOD = true, DATE_TO_DTL = true, DTL_TO_DATE = true, TOD_TO_DTL = true, DTL_TO_TOD = true, TimeToTicks = true, TicksToTime = true, GETHIGHNUM = true, GETLOWNUM = true, SAMPLE = true, SAMPLE_TRIG = true, WRIT_HIST = true, READ_HIST = true, COMPRESS = true, READFILE = true, WRITEFILE = true, READ_DB = true, WRITE_DB = true, RDREC = true, WRREC = true, RALRM = true, GET_DIAG = true, DPRINT = true, CTRL_PWM = true, CTRL_PTO = true, STATUS_PTO = true, HOME = true, MOVE_JOG = true, MOVE_VEL = true, MOVE_AXIS = true, POS_PULSE = true, POS_MC = true, SET_CAM = true, CAM_TB = true, CAM_TE = true, CAM_DOWN = true, MC_CamIn = true, MC_CamOut = true, MC_Superimpose = true, MC_GearIn = true, MC_GearOut = true, MC_Phasing = true, MC_CombineAxes = true, MC_Interpolate = true, MC_MoveLinear = true, MC_MoveCircular = true, MC_MoveDirect = true, MC_Home = true, MC_Halt = true, MC_Stop = true, MC_Power = true, MC_Reset = true, MC_ReadParam = true, MC_WriteParam = true, MC_ReadAxisError = true, MC_TouchProbe = true, MC_AbortTrigger = true, MC_ExtSetPointGen = true, MC_Generator = true, MC_BRIDGE = true, MC_BRIDGE_OFF = true, ENABLE = true, DISABLE = true, DISPLAY = true, LOG_EVENT = true, ALARM = true, ALARM_DQ = true, GET_ALARM = true, GETINST = true, GETALARMST = true, CHANGEOVER = true, REPLY_VALUE = true, NOTIFY = true, NOTIFY_WITH_ACK = true, ASGEN = true, HMI_R_DISCONNECT = true, HMI_R_CONNECT = true, HMI_R_SEND = true, HMI_R_RECEIVE = true, HMI_R_GET_STATE = true, MODBUSPN = true, MODBUSCP = true, TSEND = true, TRCV = true, TCON = true, TDISCON = true, TSEND_C = true, TRCV_C = true, TUSEND = true, TURCV = true, TCONNECT = true, TDISCONNECT = true, GETHNSON = true, DELHNSON = true, DNS_CLIENT = true, DHCP_CLIENT = true, DCP_CLIENT = true, -- Spec instructions (from keywords.md - 159 additions) ACK_FCT_WARN = true, ASI_CTRL = true, ATH = true, ATTR_DB = true, AssignmentAttempt = true, BCDCPL = true, BITCMP = true, BITSUM = true, BLKMOV = true, COUNTER = true, Chars_TO_Strg = true, CountOfElements = true, CTRL_PWM = true, CTRL_PTO = true, DataLogCreate = true, DB_ANY_TO_VARIANT = true, DECO = true, DELETE = true, DELETE_DB = true, DEMUX = true, Deserialize = true, DeviceStates = true, DP_TOPOL = true, ENCO = true, ENDIS_PW = true, EXP = true, FileReadC = true, FileWriteC = true, FILL_BLK = true, FRAC = true, GADR_LGC = true, GATHER = true, GATHER_BLK = true, GEN_DIAG = true, Gen_UsrMsg = true, GEO2LOG = true, GEO_LOG = true, GET_ERR_ID = true, GET_ERROR = true, GETIO = true, Get_AlarmResources = true, Get_AlarmState = true, GetBlockName = true, GET_DIAG = true, GetInstanceName = true, GetInstancePath = true, GetSymbolForReference = true, GetSymbolName = true, GetSymbolPath = true, GOTO = true, HTA = true, INIT_RD = true, INSERT = true, IO2MOD = true, IS_ARRAY = true, JOIN = true, LEAD_LAG = true, LEFT = true, LGC_GADR = true, LOG2GEO = true, LOG2MOD = true, LOG_GEO = true, LOWER_BOUND = true, MAX_LEN = true, MID = true, ModuleStates = true, MOVE_BLK = true, MOVE_BLK_VARIANT = true, MoveFromResolvedSymbol = true, MoveResolvedSymbolsFromBuffer = true, MoveResolvedSymbolsToBuffer = true, MoveToResolvedSymbol = true, MUX = true, NORM_X = true, PE_CMD = true, PE_DS3_Write_ET200S = true, PEEK_BOOL = true, PE_Get_Mode_RSP = true, PE_Identify_RSP = true, PE_Measurement_List_RSP = true, PE_Measurement_Value_RSP = true, PE_PEM_Status_RSP = true, PE_START_END = true, PE_WOL = true, POKE_BLK = true, POKE_BOOL = true, PRESET_TIMER = true, Program_Alarm = true, QRY_CINT = true, Random = true, RD_ADDR = true, RD_DPAR = true, RD_DPARA = true, RD_LGADR = true, RD_LOC_T = true, RD_SYS_T = true, READ_BIG = true, READ_DBL = true, ReadFromArrayDB = true, ReadFromArrayDBL = true, READ_LITTLE = true, RecipeExport = true, RecipeImport = true, REF = true, REPLACE = true, RESET_TIMER = true, ResolveSymbols = true, RH_CTRL = true, RH_GetPrimaryID = true, RIGHT = true, ROL = true, ROR = true, ROUND = true, RTM = true, RUNTIME = true, SCALE = true, SCALE_X = true, SCATTER = true, SCATTER_BLK = true, S_CD = true, S_COMP = true, S_CONV = true, S_CU = true, SEG = true, SEL = true, Serialize = true, SET_CINT = true, SET_TIMEZONE = true, SET_TINT = true, SET_TINTL = true, SHL = true, SHR = true, SIGN = true, SMC = true, S_MOVE = true, S_ODT = true, S_ODTS = true, S_OFFDT = true, S_PEXT = true, SPLIT = true, S_PULSE = true, SQR = true, SQRT = true, Strg_TO_Chars = true, STRG_VAL = true, SWAP = true, SYNC_PI = true, SYNC_PO = true, T_ADD = true, TAN = true, T_COMBINE = true, T_COMP = true, T_CONV = true, T_DIFF = true, TIME_TCK = true, TRUNC = true, T_SUB = true, TypeOf = true, TypeOfDB = true, TypeOfElements = true, UBLKMOV = true, UFILL_BLK = true, UMOVE_BLK = true, UNSCALE = true, UPDAT_PI = true, UPDAT_PO = true, UPPER_BOUND = true, VAL_STRG = true, VariantGet = true, VariantPut = true, VARIANT_TO_DB_ANY = true, WAIT = true, WR_DPARM = true, WRIT_DBL = true, WRITE_BIG = true, WRITE_LITTLE = true, WriteToArrayDB = true, WriteToArrayDBL = true, WR_LOC_T = true, WR_SYS_T = true, } -- Built-in function blocks (have state, need instance) M.FUNCTION_BLOCKS = { TON = true, TOF = true, TP = true, TONR = true, CTU = true, CTD = true, CTUD = true, IEC_TIMER = true, IEC_TON = true, IEC_TOF = true, IEC_TP = true, IEC_COUNTER = true, IEC_CTU = true, IEC_CTD = true, IEC_CTUD = true, R_TRIG = true, F_TRIG = true, SR = true, RS = true, SCHEDULE = true, BPM = true, LOG = true, DATALOG = true, -- Spec function blocks (from keywords.md) ATTACH = true, CAN_TINT = true, DCAT = true, DETACH = true, DIS_AIRT = true, DRUM = true, EN_AIRT = true, ENDIS_PW = true, EN_IRT = true, GEN_DIAG = true, MCTA = true, PRESET_TIMER = true, RE_TRIGR = true, RESET_TIMER = true, RTM = true, RUNTIME = true, SET_TIMEZONE = true, } M.DATA_TYPES = { BOOL = true, BYTE = true, WORD = true, DWORD = true, LWORD = true, CHAR = true, WCHAR = true, STRING = true, WSTRING = true, INT = true, DINT = true, LINT = true, USINT = true, SINT = true, UINT = true, UDINT = true, ULINT = true, REAL = true, LREAL = true, TIME = true, DATE = true, TOD = true, TIME_OF_DAY = true, DATE_AND_TIME = true, DT = true, S5TIME = true, LTIME = true, DTL = true, -- Additional S7-1500 data types LTOD = true, LDT = true, LTIME_OF_DAY = true, DATE_AND_LTIME = true, VARIANT = true, -- IEC timer/counter sub-types TON_TIME = true, TOF_TIME = true, TONR_TIME = true, TP_TIME = true, IEC_TIMER = true, IEC_COUNTER = true, IEC_CTU = true, IEC_CTD = true, IEC_CTUD = true, IEC_TON = true, IEC_TOF = true, IEC_TP = true, } -- Parameter definitions for built-in instructions -- Format: { inputs = { { name, type }, ... }, outputs = { { name, type }, ... } } M.PARAMETERS = { TON = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } }, TOF = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } }, TP = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } }, TONR = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } }, CTU = { inputs = { { name = "CU", type = "BOOL" }, { name = "R", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "CV", type = "INT" } } }, CTD = { inputs = { { name = "CD", type = "BOOL" }, { name = "LD", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "CV", type = "INT" } } }, CTUD = { inputs = { { name = "CU", type = "BOOL" }, { name = "CD", type = "BOOL" }, { name = "R", type = "BOOL" }, { name = "LD", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "QU", type = "BOOL" }, { name = "QD", type = "BOOL" }, { name = "CV", type = "INT" } } }, R_TRIG = { inputs = { { name = "CLK", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" } } }, F_TRIG = { inputs = { { name = "CLK", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" } } }, SR = { inputs = { { name = "S", type = "BOOL" }, { name = "R1", type = "BOOL" } }, outputs = { { name = "Q1", type = "BOOL" } } }, RS = { inputs = { { name = "S1", type = "BOOL" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q1", type = "BOOL" } } }, IEC_TIMER = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } }, IEC_TON = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } }, IEC_TOF = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } }, IEC_TP = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } }, IEC_COUNTER = { inputs = { { name = "CU", type = "BOOL" }, { name = "CD", type = "BOOL" }, { name = "R", type = "BOOL" }, { name = "LD", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "QU", type = "BOOL" }, { name = "QD", type = "BOOL" }, { name = "CV", type = "INT" } } }, IEC_CTU = { inputs = { { name = "CU", type = "BOOL" }, { name = "R", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "CV", type = "INT" } } }, IEC_CTD = { inputs = { { name = "CD", type = "BOOL" }, { name = "LD", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "CV", type = "INT" } } }, IEC_CTUD = { inputs = { { name = "CU", type = "BOOL" }, { name = "CD", type = "BOOL" }, { name = "R", type = "BOOL" }, { name = "LD", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "QU", type = "BOOL" }, { name = "QD", type = "BOOL" }, { name = "CV", type = "INT" } } }, ADD = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } }, SUB = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } }, MUL = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } }, DIV = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } }, MIN = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } }, MAX = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } }, LIMIT = { inputs = { { name = "MN" }, { name = "IN" }, { name = "MX" } }, outputs = { { name = "OUT" } } }, MOVE = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, CONVERT = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, ROUND = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, TRUNC = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, CEIL = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, FLOOR = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, SQR = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, SQRT = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, SIN = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, COS = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, TAN = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, ASIN = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, ACOS = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, ATAN = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, LEN = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, CONCAT = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } }, LEFT = { inputs = { { name = "IN" }, { name = "L" } }, outputs = { { name = "OUT" } } }, RIGHT = { inputs = { { name = "IN" }, { name = "L" } }, outputs = { { name = "OUT" } } }, MID = { inputs = { { name = "IN" }, { name = "L" }, { name = "P" } }, outputs = { { name = "OUT" } } }, AND = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } }, OR = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } }, XOR = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } }, SHL = { inputs = { { name = "IN" }, { name = "N" } }, outputs = { { name = "OUT" } } }, SHR = { inputs = { { name = "IN" }, { name = "N" } }, outputs = { { name = "OUT" } } }, ROL = { inputs = { { name = "IN" }, { name = "N" } }, outputs = { { name = "OUT" } } }, ROR = { inputs = { { name = "IN" }, { name = "N" } }, outputs = { { name = "OUT" } } }, BCD_I = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, I_BCD = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } }, -- Spec parameter signatures (extracted from instructions.md) ATH = { inputs = { { name = "IN", type = "Variant" }, { name = "N", type = "INT" } }, outputs = { { name = "OUT", type = "Variant" } } }, BCDCPL = { inputs = { { name = "Operand", type = "Bit String" } } }, BITSUM = { inputs = { { name = "Operand", type = "DWORD" } } }, BLKMOV = { inputs = { { name = "SRCBLK", type = "Variant" } }, outputs = { { name = "DSTBLK", type = "Variant" } } }, Chars_TO_Strg = { inputs = { { name = "CHARS", type = "Variant" }, { name = "PCHARS", type = "DINT" }, { name = "CNT", type = "UINT" } }, outputs = { { name = "STRG", type = "STRING" } } }, DB_ANY_TO_Variant = { inputs = { { name = "IN", type = "DB_ANY" } }, outputs = { { name = "ERR", type = "INT" } } }, DCAT = { inputs = { { name = "CMD", type = "BOOL" }, { name = "O_FB", type = "BOOL" }, { name = "C_FB", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "OA", type = "BOOL" }, { name = "CA", type = "BOOL" } } }, DEMUX = { inputs = { { name = "K", type = "integer" }, { name = "IN", type = "Variant" } }, outputs = { { name = "OUT0", type = "Variant" }, { name = "OUT1", type = "Variant" }, { name = "OUTn", type = "Variant" }, { name = "OUTELSE", type = "Variant" } } }, DRUM = { inputs = { { name = "RESET", type = "BOOL" }, { name = "JOG", type = "BOOL" }, { name = "DRUM_EN", type = "BOOL" }, { name = "LST_STEP", type = "BYTE" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "OUT_WORD", type = "WORD" }, { name = "ERR_CODE", type = "WORD" } } }, ENDIS_PW = { inputs = { { name = "REQ", type = "BOOL" }, { name = "FULL_PWD", type = "BOOL" }, { name = "R_PWD", type = "BOOL" }, { name = "HMI_PWD", type = "BOOL" } }, outputs = { { name = "F_PWD_ON", type = "BOOL" }, { name = "FULL_PWD_ON", type = "BOOL" }, { name = "R_PWD_ON", type = "BOOL" }, { name = "HMI_PWD_ON", type = "BOOL" }, { name = "RET_VAL", type = "WORD" } } }, FILL = { inputs = { { name = "BVAL", type = "Variant" } }, outputs = { { name = "BLK", type = "Variant" } } }, FIND = { inputs = { { name = "IN1", type = "STRING" }, { name = "IN2", type = "STRING" } } }, GetBlockName = { inputs = { { name = "SIZE", type = "DINT" } }, outputs = { { name = "RET_VAL", type = "WSTRING" } } }, GetInstanceName = { inputs = { { name = "SIZE", type = "DINT" } }, outputs = { { name = "OUT", type = "WSTRING" } } }, GetInstancePath = { inputs = { { name = "SIZE", type = "DINT" } }, outputs = { { name = "OUT", type = "WSTRING" } } }, GetSymbolForReference = { inputs = { { name = "execute", type = "Bool" }, { name = "objectRef", type = "Reference" }, { name = "size", type = "DInt" } }, outputs = { { name = "done", type = "Bool" }, { name = "busy", type = "Bool" }, { name = "error", type = "Bool" }, { name = "status", type = "Int" } } }, GetSymbolPath = { inputs = { { name = "VARIABLE", type = "PARAMETER" }, { name = "SIZE", type = "DINT" } }, outputs = { { name = "OUT", type = "WSTRING" } } }, HTA = { inputs = { { name = "IN", type = "Variant" }, { name = "N", type = "UINT" } }, outputs = { { name = "OUT", type = "Variant" } } }, INIT_RD = { inputs = { { name = "Operand", type = "BOOL" } }, outputs = { { name = "RET_VAL", type = "INT" } } }, JOIN = { inputs = { { name = "Mode", type = "DWORD" }, { name = "RecSeparator", type = "Variant" }, { name = "EndSeparator", type = "Variant" }, { name = "SrcStruct", type = "Variant" }, { name = "Count", type = "UDINT" } } }, LEAD_LAG = { inputs = { { name = "IN", type = "REAL" }, { name = "SAMPLE_T", type = "INT" } }, outputs = { { name = "OUT", type = "REAL" }, { name = "ERR_CODE", type = "WORD" } } }, LOWER_BOUND = { inputs = { { name = "ARR", type = "ARRAY" }, { name = "DIM", type = "UDINT" } } }, MAX_LEN = { inputs = { { name = "IN", type = "STRING" } } }, MCAT = { inputs = { { name = "O_CMD", type = "BOOL" }, { name = "C_CMD", type = "BOOL" }, { name = "S_CMD", type = "BOOL" }, { name = "O_FB", type = "BOOL" }, { name = "C_FB", type = "BOOL" } }, outputs = { { name = "OO", type = "BOOL" }, { name = "CO", type = "BOOL" }, { name = "OA", type = "BOOL" }, { name = "CA", type = "BOOL" }, { name = "Q", type = "BOOL" } } }, MOVE_BLK = { inputs = { { name = "IN", type = "Variant" }, { name = "COUNT", type = "UInt" } }, outputs = { { name = "OUT", type = "Variant" } } }, MOVE_BLK_Variant = { inputs = { { name = "SRC", type = "Variant" }, { name = "COUNT", type = "UDINT" }, { name = "SRC_INDEX", type = "DINT" }, { name = "DEST_INDEX", type = "DINT" } }, outputs = { { name = "DEST", type = "Variant" } } }, MUX = { inputs = { { name = "K", type = "integer" }, { name = "IN0", type = "Variant" }, { name = "IN1", type = "Variant" }, { name = "INn", type = "Variant" }, { name = "INELSE", type = "Variant" } } }, NORM_X = { inputs = { { name = "EN", type = "BOOL" }, { name = "MIN", type = "Variant" }, { name = "VALUE", type = "Variant" }, { name = "MAX", type = "Variant" } }, outputs = { { name = "ENO", type = "BOOL" } } }, RD_LOC_T = { outputs = { { name = "OUT", type = "DTL" } } }, RD_SYS_T = { outputs = { { name = "OUT", type = "DTL" } } }, REF = { inputs = { { name = "Expression", type = "Variant" } } }, RE_TRIGR = { inputs = { { name = "MODE", type = "UINT" }, { name = "COMMENT", type = "STRING" } } }, ROL = { inputs = { { name = "IN", type = "Variant" }, { name = "N", type = "USINT" } } }, ROR = { inputs = { { name = "IN", type = "Variant" }, { name = "N", type = "USINT" } } }, RTM = { inputs = { { name = "NR", type = "RTM" }, { name = "MODE", type = "BYTE" }, { name = "PV", type = "DINT" } }, outputs = { { name = "CQ", type = "BOOL" }, { name = "CV", type = "DINT" } } }, SCALE = { inputs = { { name = "IN", type = "INT" }, { name = "HI_LIM", type = "REAL" }, { name = "LO_LIM", type = "REAL" }, { name = "BIPOLAR", type = "BOOL" } }, outputs = { { name = "OUT", type = "REAL" } } }, SCALE_X = { inputs = { { name = "EN", type = "BOOL" }, { name = "MIN", type = "Variant" }, { name = "VALUE", type = "Float" }, { name = "MAX", type = "Variant" } }, outputs = { { name = "ENO", type = "BOOL" } } }, SEG = { inputs = { { name = "IN", type = "WORD" } }, outputs = { { name = "OUT", type = "DWORD" } } }, SEL = { inputs = { { name = "G", type = "BOOL" }, { name = "IN0", type = "Variant" }, { name = "IN1", type = "Variant" } } }, SET_TIMEZONE = { inputs = { { name = "REQ", type = "BOOL" }, { name = "TimeZone", type = "TimeTransformationRule" } }, outputs = { { name = "DONE", type = "BOOL" }, { name = "BUSY", type = "BOOL" }, { name = "ERROR", type = "BOOL" }, { name = "STATUS", type = "WORD" } } }, SHL = { inputs = { { name = "IN", type = "Variant" }, { name = "N", type = "USINT" } } }, SHR = { inputs = { { name = "IN", type = "Variant" }, { name = "N", type = "USINT" } } }, SMC = { outputs = { { name = "OUT", type = "BOOL" }, { name = "OUT_STEP", type = "BYTE" }, { name = "ERR_CODE", type = "WORD" } } }, SPLIT = { inputs = { { name = "Mode", type = "DWord" }, { name = "RecSeparator", type = "Variant" }, { name = "EndSeparator", type = "Variant" }, { name = "SrcArray", type = "Variant" } }, outputs = { { name = "Count", type = "UDInt" } } }, STRG_VAL = { inputs = { { name = "IN", type = "STRING" }, { name = "FORMAT", type = "WORD" }, { name = "P", type = "UINT" } }, outputs = { { name = "OUT", type = "Variant" } } }, S_CD = { inputs = { { name = "C_NO", type = "COUNTER" }, { name = "CD", type = "BOOL" }, { name = "S", type = "BOOL" }, { name = "PV", type = "WORD" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "CV", type = "WORD" } } }, S_COMP = { inputs = { { name = "IN1", type = "STRING" }, { name = "IN2", type = "STRING" } }, outputs = { { name = "OUT", type = "BOOL" } } }, S_CONV = { inputs = { { name = "IN", type = "CHAR" } }, outputs = { { name = "OUT", type = "CHAR" } } }, S_CU = { inputs = { { name = "C_NO", type = "COUNTER" }, { name = "CU", type = "BOOL" }, { name = "S", type = "BOOL" }, { name = "PV", type = "WORD" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "CV", type = "WORD" } } }, S_CUD = { inputs = { { name = "C_NO", type = "COUNTER" }, { name = "CU", type = "BOOL" }, { name = "CD", type = "BOOL" }, { name = "S", type = "BOOL" }, { name = "PV", type = "WORD" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "CV", type = "WORD" } } }, S_MOVE = { inputs = { { name = "IN", type = "STRING" } }, outputs = { { name = "OUT", type = "STRING" } } }, S_ODT = { inputs = { { name = "T_NO", type = "TIMER" }, { name = "S", type = "BOOL" }, { name = "TV", type = "S5TIME" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "BI", type = "WORD" } } }, S_ODTS = { inputs = { { name = "T_NO", type = "TIMER" }, { name = "S", type = "BOOL" }, { name = "TV", type = "S5TIME" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "BI", type = "WORD" } } }, S_OFFDT = { inputs = { { name = "T_NO", type = "TIMER" }, { name = "S", type = "BOOL" }, { name = "TV", type = "S5TIME" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "BI", type = "WORD" } } }, S_PEXT = { inputs = { { name = "T_NO", type = "TIMER" }, { name = "S", type = "BOOL" }, { name = "TV", type = "S5TIME" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "BI", type = "WORD" } } }, S_PULSE = { inputs = { { name = "T_NO", type = "TIMER" }, { name = "S", type = "BOOL" }, { name = "TV", type = "S5TIME" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "BI", type = "WORD" } } }, Strg_TO_Chars = { inputs = { { name = "STRG", type = "STRING" }, { name = "PCHARS", type = "DINT" } }, outputs = { { name = "CNT", type = "UINT" } } }, T_ADD = { inputs = { { name = "IN1", type = "TIME" }, { name = "IN2", type = "TIME" } } }, T_COMBINE = { inputs = { { name = "IN1", type = "DATE" }, { name = "IN2", type = "TOD" } } }, T_COMP = { inputs = { { name = "IN1", type = "DATE" }, { name = "IN2", type = "DATE" } }, outputs = { { name = "OUT", type = "BOOL" } } }, T_CONV = { inputs = { { name = "IN", type = "Variant" } } }, T_DIFF = { inputs = { { name = "IN1", type = "DTL" }, { name = "IN2", type = "DTL" } } }, T_SUB = { inputs = { { name = "IN1", type = "TIME" }, { name = "IN2", type = "TIME" } } }, UBLKMOV = { inputs = { { name = "SRCBLK", type = "Variant" } }, outputs = { { name = "DSTBLK", type = "Variant" } } }, UNSCALE = { inputs = { { name = "IN", type = "REAL" }, { name = "HI_LIM", type = "REAL" }, { name = "LO_LIM", type = "REAL" }, { name = "BIPOLAR", type = "BOOL" } }, outputs = { { name = "OUT", type = "INT" } } }, UPPER_BOUND = { inputs = { { name = "ARR", type = "ARRAY" }, { name = "DIM", type = "UDINT" } } }, VAL_STRG = { inputs = { { name = "IN", type = "Variant" }, { name = "SIZE", type = "USINT" }, { name = "PREC", type = "USINT" }, { name = "FORMAT", type = "WORD" } }, outputs = { { name = "OUT", type = "STRING" } } }, VariantGet = { inputs = { { name = "SRC", type = "Variant" }, { name = "DST", type = "Variant" } } }, VariantPut = { inputs = { { name = "SRC", type = "Variant" }, { name = "DST", type = "Variant" } } }, Variant_TO_DB_ANY = { inputs = { { name = "IN", type = "Variant" } }, outputs = { { name = "ERR", type = "INT" } } }, WAIT = { inputs = { { name = "WT", type = "INT" } } }, WR_LOC_T = { inputs = { { name = "LOCTIME", type = "DTL" }, { name = "DST", type = "BOOL" } } }, WR_SYS_T = { inputs = { { name = "IN", type = "DTL" } } }, } -- Get parameter info for a built-in instruction -- @param name string The instruction name -- @return table|nil Parameter definition with inputs and outputs arrays function M.get_parameters(name) return M.PARAMETERS[name:upper()] or M.PARAMETERS[name] or nil end function M.is_known_function_block(name) return M.FUNCTION_BLOCKS[name:upper()] or M.FUNCTION_BLOCKS[name] or false end function M.is_known_function(name) return M.FUNCTIONS[name:upper()] or M.FUNCTIONS[name] or false end -- Check if name is a known data type -- @param name string The name to check -- @return boolean True if known data type function M.is_known_data_type(name) return M.DATA_TYPES[name:upper()] or false end -- Check if name is a known instruction (function or function block) -- @param name string The name to check -- @return boolean True if known instruction function M.is_known_instruction(name) return M.is_known_function(name) or M.is_known_function_block(name) or false end -- Check if name is a known type or instruction -- @param name string The name to check -- @return boolean True if known type or instruction function M.is_known_type_or_instruction(name) return M.is_known_data_type(name) or M.is_known_instruction(name) or false end return M