diff -r fb19c6226ff5 -r 0f4d32a033e0 plcopen/definitions.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plcopen/definitions.py Tue Jan 28 16:24:40 2014 +0100 @@ -0,0 +1,164 @@ +from os.path import join, split, realpath +sd = split(realpath(__file__))[0] + +# Override gettext _ in this module +# since we just want string to be added to dictionnary +# but translation should happen here +_ = lambda x:x + +LANGUAGES = ["IL","ST","FBD","LD","SFC"] + +LOCATIONDATATYPES = {"X" : ["BOOL"], + "B" : ["SINT", "USINT", "BYTE", "STRING"], + "W" : ["INT", "UINT", "WORD", "WSTRING"], + "D" : ["DINT", "UDINT", "REAL", "DWORD"], + "L" : ["LINT", "ULINT", "LREAL", "LWORD"]} + +#------------------------------------------------------------------------------- +# Function Block Types definitions +#------------------------------------------------------------------------------- + +StdTC6Libs = [(_("Standard function blocks"), join(sd, "Standard_Function_Blocks.xml")), + (_("Additional function blocks"),join(sd, "Additional_Function_Blocks.xml"))] + +StdFuncsCSV = join(sd,"iec_std.csv") + +# FIXME : since std fb now loaded from TC6 file, is that still necessary ? +StdBlockComments = { + "SR": _("SR bistable\nThe SR bistable is a latch where the Set dominates."), + "RS": _("RS bistable\nThe RS bistable is a latch where the Reset dominates."), + "SEMA": _("Semaphore\nThe semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources."), + "R_TRIG": _("Rising edge detector\nThe output produces a single pulse when a rising edge is detected."), + "F_TRIG": _("Falling edge detector\nThe output produces a single pulse when a falling edge is detected."), + "CTU": _("Up-counter\nThe up-counter can be used to signal when a count has reached a maximum value."), + "CTD": _("Down-counter\nThe down-counter can be used to signal when a count has reached zero, on counting down from a preset value."), + "CTUD": _("Up-down counter\nThe up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other."), + "TP": _("Pulse timer\nThe pulse timer can be used to generate output pulses of a given time duration."), + "TON": _("On-delay timer\nThe on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true."), + "TOF": _("Off-delay timer\nThe off-delay timer can be used to delay setting an output false, for fixed period after input goes false."), + "RTC": _("Real time clock\nThe real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on."), + "INTEGRAL": _("Integral\nThe integral function block integrates the value of input XIN over time."), + "DERIVATIVE": _("Derivative\nThe derivative function block produces an output XOUT proportional to the rate of change of the input XIN."), + "PID": _("PID\nThe PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control."), + "RAMP": _("Ramp\nThe RAMP function block is modelled on example given in the standard."), + "HYSTERESIS": _("Hysteresis\nThe hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2."), +} + +for block_type in ["CTU", "CTD", "CTUD"]: + for return_type in ["DINT", "LINT", "UDINT", "ULINT"]: + StdBlockComments["%s_%s" % (block_type, return_type)] = StdBlockComments[block_type] + +def GetBlockInfos(pou): + infos = pou.getblockInfos() + # FIXME : as well + infos["comment"] = StdBlockComments[infos["name"]] + infos["inputs"] = [ + (var_name, var_type, "rising") + if var_name in ["CU", "CD"] + else (var_name, var_type, var_modifier) + for var_name, var_type, var_modifier in infos["inputs"]] + return infos + +#------------------------------------------------------------------------------- +# Data Types definitions +#------------------------------------------------------------------------------- + +""" +Ordored list of common data types defined in the IEC 61131-3 +Each type is associated to his direct parent type. It defines then a hierarchy +between type that permits to make a comparison of two types +""" +TypeHierarchy_list = [ + ("ANY", None), + ("ANY_DERIVED", "ANY"), + ("ANY_ELEMENTARY", "ANY"), + ("ANY_MAGNITUDE", "ANY_ELEMENTARY"), + ("ANY_BIT", "ANY_ELEMENTARY"), + ("ANY_NBIT", "ANY_BIT"), + ("ANY_STRING", "ANY_ELEMENTARY"), + ("ANY_DATE", "ANY_ELEMENTARY"), + ("ANY_NUM", "ANY_MAGNITUDE"), + ("ANY_REAL", "ANY_NUM"), + ("ANY_INT", "ANY_NUM"), + ("ANY_SINT", "ANY_INT"), + ("ANY_UINT", "ANY_INT"), + ("BOOL", "ANY_BIT"), + ("SINT", "ANY_SINT"), + ("INT", "ANY_SINT"), + ("DINT", "ANY_SINT"), + ("LINT", "ANY_SINT"), + ("USINT", "ANY_UINT"), + ("UINT", "ANY_UINT"), + ("UDINT", "ANY_UINT"), + ("ULINT", "ANY_UINT"), + ("REAL", "ANY_REAL"), + ("LREAL", "ANY_REAL"), + ("TIME", "ANY_MAGNITUDE"), + ("DATE", "ANY_DATE"), + ("TOD", "ANY_DATE"), + ("DT", "ANY_DATE"), + ("STRING", "ANY_STRING"), + ("BYTE", "ANY_NBIT"), + ("WORD", "ANY_NBIT"), + ("DWORD", "ANY_NBIT"), + ("LWORD", "ANY_NBIT") + #("WSTRING", "ANY_STRING") # TODO +] + +DataTypeRange_list = [ + ("SINT", (-2**7, 2**7 - 1)), + ("INT", (-2**15, 2**15 - 1)), + ("DINT", (-2**31, 2**31 - 1)), + ("LINT", (-2**31, 2**31 - 1)), + ("USINT", (0, 2**8 - 1)), + ("UINT", (0, 2**16 - 1)), + ("UDINT", (0, 2**31 - 1)), + ("ULINT", (0, 2**31 - 1)) +] + +ANY_TO_ANY_FILTERS = { + "ANY_TO_ANY":[ + # simple type conv are let as C cast + (("ANY_INT","ANY_BIT"),("ANY_NUM","ANY_BIT")), + (("ANY_REAL",),("ANY_REAL",)), + # REAL_TO_INT + (("ANY_REAL",),("ANY_SINT",)), + (("ANY_REAL",),("ANY_UINT",)), + (("ANY_REAL",),("ANY_BIT",)), + # TO_TIME + (("ANY_INT","ANY_BIT"),("ANY_DATE","TIME")), + (("ANY_REAL",),("ANY_DATE","TIME")), + (("ANY_STRING",), ("ANY_DATE","TIME")), + # FROM_TIME + (("ANY_DATE","TIME"), ("ANY_REAL",)), + (("ANY_DATE","TIME"), ("ANY_INT","ANY_NBIT")), + (("TIME",), ("ANY_STRING",)), + (("DATE",), ("ANY_STRING",)), + (("TOD",), ("ANY_STRING",)), + (("DT",), ("ANY_STRING",)), + # TO_STRING + (("BOOL",), ("ANY_STRING",)), + (("ANY_BIT",), ("ANY_STRING",)), + (("ANY_REAL",), ("ANY_STRING",)), + (("ANY_SINT",), ("ANY_STRING",)), + (("ANY_UINT",), ("ANY_STRING",)), + # FROM_STRING + (("ANY_STRING",), ("BOOL",)), + (("ANY_STRING",), ("ANY_BIT",)), + (("ANY_STRING",), ("ANY_SINT",)), + (("ANY_STRING",), ("ANY_UINT",)), + (("ANY_STRING",), ("ANY_REAL",))], + "BCD_TO_ANY":[ + (("BYTE",),("USINT",)), + (("WORD",),("UINT",)), + (("DWORD",),("UDINT",)), + (("LWORD",),("ULINT",))], + "ANY_TO_BCD":[ + (("USINT",),("BYTE",)), + (("UINT",),("WORD",)), + (("UDINT",),("DWORD",)), + (("ULINT",),("LWORD",))] +} + +# remove gettext override +del _