diff -r 0c06f7874a3f -r 9c6fdf60ad2e plugger.py --- a/plugger.py Mon Feb 04 15:11:48 2008 +0100 +++ b/plugger.py Mon Feb 04 18:55:40 2008 +0100 @@ -135,7 +135,7 @@ elif path == "BaseParams.Name": res = self.FindNewName(value,logger) self.PlugRequestSave() - return res, True + return res, False parts = path.split(".", 1) if self.MandatoryParams and parts[0] == self.MandatoryParams[0]: @@ -302,6 +302,13 @@ def GetPlugRoot(self): return self.PlugParent.GetPlugRoot() + def GetFullIEC_Channel(self): + return ".".join([str(i) for i in self.GetCurrentLocation()]) + ".x" + + def GetLocations(self): + location = self.GetCurrentLocation() + return [loc for loc in self.PlugParent.GetLocations() if loc["LOC"][0:len(location)] == location] + def GetPlugInfos(self): childs = [] # reorder childs by IEC_channels @@ -759,6 +766,31 @@ # define name for IEC raw code file return os.path.join(self._getBuildPath(), "raw_plc.st") + def GetLocations(self): + locations = [] + filepath = os.path.join(self._getBuildPath(),"LOCATED_VARIABLES.h") + if os.path.isfile(filepath): + # IEC2C compiler generate a list of located variables : LOCATED_VARIABLES.h + location_file = open(os.path.join(self._getBuildPath(),"LOCATED_VARIABLES.h")) + # each line of LOCATED_VARIABLES.h declares a located variable + lines = [line.strip() for line in location_file.readlines()] + # This regular expression parses the lines genereated by IEC2C + LOCATED_MODEL = re.compile("__LOCATED_VAR\((?P[A-Z]*),(?P[_A-Za-z0-9]*),(?P[QMI])(?:,(?P[XBWD]))?,(?P[,0-9]*)\)") + for line in lines: + # If line match RE, + result = LOCATED_MODEL.match(line) + if result: + # Get the resulting dict + resdict = result.groupdict() + # rewrite string for variadic location as a tuple of integers + resdict['LOC'] = tuple(map(int,resdict['LOC'].split(','))) + # set located size to 'X' if not given + if not resdict['SIZE']: + resdict['SIZE'] = 'X' + # finally store into located variable list + locations.append(resdict) + return locations + def _Generate_SoftPLC(self, logger): """ Generate SoftPLC ST/IL/SFC code out of PLCOpenEditor controller, and compile it with IEC2C @@ -799,30 +831,10 @@ # transform those base names to full names with path C_files = map(lambda filename:os.path.join(buildpath, filename), C_files) logger.write("Extracting Located Variables...\n") - # IEC2C compiler generate a list of located variables : LOCATED_VARIABLES.h - location_file = open(os.path.join(buildpath,"LOCATED_VARIABLES.h")) - locations = [] - # each line of LOCATED_VARIABLES.h declares a located variable - lines = [line.strip() for line in location_file.readlines()] - # This regular expression parses the lines genereated by IEC2C - LOCATED_MODEL = re.compile("__LOCATED_VAR\((?P[A-Z]*),(?P[_A-Za-z0-9]*),(?P[QMI])(?:,(?P[XBWD]))?,(?P[,0-9]*)\)") - for line in lines: - # If line match RE, - result = LOCATED_MODEL.match(line) - if result: - # Get the resulting dict - resdict = result.groupdict() - # rewrite string for variadic location as a tuple of integers - resdict['LOC'] = tuple(map(int,resdict['LOC'].split(','))) - # set located size to 'X' if not given - if not resdict['SIZE']: - resdict['SIZE'] = 'X' - # finally store into located variable list - locations.append(resdict) + # Keep track of generated located variables for later use by self._Generate_C + self.PLCGeneratedLocatedVars = self.GetLocations() # Keep track of generated C files for later use by self.PlugGenerate_C self.PLCGeneratedCFiles = C_files - # Keep track of generated located variables for later use by self._Generate_C - self.PLCGeneratedLocatedVars = locations # compute CFLAGS for plc self.CFLAGS = "\"-I"+ieclib_path+"\"" return True