-- TIA Portal built-in instructions for SCL Neovim plugin -- Defines functions, function blocks, and their parameters for completion local M = {} -- Built-in functions (return values, no state) M.FUNCTIONS = { ADD = true, SUB = true, MUL = true, DIV = true, MIN = true, MAX = true, LIMIT = true, MOVE = true, CONVERT = true, ROUND = true, TRUNC = true, CEIL = true, FLOOR = true, SQR = true, SQRT = true, SIN = true, COS = true, TAN = true, ASIN = true, ACOS = true, ATAN = true, LEN = true, CONCAT = true, LEFT = true, RIGHT = true, MID = true, AND = true, OR = true, XOR = true, SHL = true, SHR = true, ROL = true, ROR = true, BCD_I = true, I_BCD = 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, } -- 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" } } }, } --- 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()] end --- Check if name is a known function block --- @param name string The name to check --- @return boolean True if known function block function M.is_known_function_block(name) return M.FUNCTION_BLOCKS[name:upper()] or false end --- Check if name is a known function --- @param name string The name to check --- @return boolean True if known function function M.is_known_function(name) return M.FUNCTIONS[name:upper()] or false end return M