plcopen/definitions.py
changeset 1390 0f4d32a033e0
child 1411 805d13d216c0
--- /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 _